12f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo/* 280301cdcfe44e3533175be23d7d52a9fc8c3fdb0Kalle Valo * This file is part of wl1251 32f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 42f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * Copyright (c) 1998-2007 Texas Instruments Incorporated 52f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * Copyright (C) 2008 Nokia Corporation 62f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 72f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * This program is free software; you can redistribute it and/or 82f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * modify it under the terms of the GNU General Public License 92f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * version 2 as published by the Free Software Foundation. 102f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 112f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * This program is distributed in the hope that it will be useful, but 122f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * WITHOUT ANY WARRANTY; without even the implied warranty of 132f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 142f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * General Public License for more details. 152f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 162f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * You should have received a copy of the GNU General Public License 172f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * along with this program; if not, write to the Free Software 182f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 192f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 02110-1301 USA 202f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 212f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo */ 222f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 2380301cdcfe44e3533175be23d7d52a9fc8c3fdb0Kalle Valo#ifndef __WL1251_RX_H__ 2480301cdcfe44e3533175be23d7d52a9fc8c3fdb0Kalle Valo#define __WL1251_RX_H__ 252f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 262f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#include <linux/bitops.h> 272f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 281367411858d5fc60b632a3f488f2b4adc73d12d7Kalle Valo#include "wl1251.h" 291367411858d5fc60b632a3f488f2b4adc73d12d7Kalle Valo 302f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo/* 312f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * RX PATH 322f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 332f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * The Rx path uses a double buffer and an rx_contro structure, each located 342f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * at a fixed address in the device memory. The host keeps track of which 352f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * buffer is available and alternates between them on a per packet basis. 362f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * The size of each of the two buffers is large enough to hold the longest 372f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 802.3 packet. 382f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * The RX path goes like that: 392f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 1) The target generates an interrupt each time a new packet is received. 402f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * There are 2 RX interrupts, one for each buffer. 412f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 2) The host reads the received packet from one of the double buffers. 422f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 3) The host triggers a target interrupt. 432f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 4) The target prepares the next RX packet. 442f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo */ 452f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 4680301cdcfe44e3533175be23d7d52a9fc8c3fdb0Kalle Valo#define WL1251_RX_MAX_RSSI -30 4780301cdcfe44e3533175be23d7d52a9fc8c3fdb0Kalle Valo#define WL1251_RX_MIN_RSSI -95 482f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 4980301cdcfe44e3533175be23d7d52a9fc8c3fdb0Kalle Valo#define WL1251_RX_ALIGN_TO 4 5080301cdcfe44e3533175be23d7d52a9fc8c3fdb0Kalle Valo#define WL1251_RX_ALIGN(len) (((len) + WL1251_RX_ALIGN_TO - 1) & \ 5180301cdcfe44e3533175be23d7d52a9fc8c3fdb0Kalle Valo ~(WL1251_RX_ALIGN_TO - 1)) 522f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 532f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define SHORT_PREAMBLE_BIT BIT(0) 542f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define OFDM_RATE_BIT BIT(6) 552f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define PBCC_RATE_BIT BIT(7) 562f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 572f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define PLCP_HEADER_LENGTH 8 582f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_PACKETID_SHIFT 11 592f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_MAX_PACKET_ID 3 602f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 612f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_VALID_FCS 0x0001 622f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_MATCH_RXADDR1 0x0002 632f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_MCAST 0x0004 642f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_STAINTIM 0x0008 652f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_VIRTUAL_BM 0x0010 662f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_BCAST 0x0020 672f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_MATCH_SSID 0x0040 682f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_MATCH_BSSID 0x0080 692f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_ENCRYPTION_MASK 0x0300 702f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_MEASURMENT 0x0400 712f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_SEQNUM_MASK 0x1800 722f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_MIC_FAIL 0x2000 732f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#define RX_DESC_DECRYPT_FAIL 0x4000 742f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 7580301cdcfe44e3533175be23d7d52a9fc8c3fdb0Kalle Valostruct wl1251_rx_descriptor { 762f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo u32 timestamp; /* In microseconds */ 772f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo u16 length; /* Paylod length, including headers */ 782f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo u16 flags; 792f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 802f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo /* 812f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0 - 802.11 822f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 1 - 802.3 832f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 2 - IP 842f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 3 - Raw Codec 852f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo */ 862f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo u8 type; 872f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 882f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo /* 89da3c821f549419e09b4b64f07d99f52174daae6dStefan Weil * Received Rate: 902f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0x0A - 1MBPS 912f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0x14 - 2MBPS 922f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0x37 - 5_5MBPS 932f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0x0B - 6MBPS 942f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0x0F - 9MBPS 952f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0x6E - 11MBPS 962f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0x0A - 12MBPS 972f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0x0E - 18MBPS 982f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0xDC - 22MBPS 992f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0x09 - 24MBPS 1002f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0x0D - 36MBPS 1012f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0x08 - 48MBPS 1022f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0x0C - 54MBPS 1032f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo */ 1042f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo u8 rate; 1052f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 1062f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo u8 mod_pre; /* Modulation and preamble */ 1072f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo u8 channel; 1082f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 1092f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo /* 1102f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 0 - 2.4 Ghz 1112f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo * 1 - 5 Ghz 1122f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo */ 1132f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo u8 band; 1142f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 1152f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo s8 rssi; /* in dB */ 1162f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo u8 rcpi; /* in dB */ 1172f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo u8 snr; /* in dB */ 118ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet} __packed; 1192f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 12080301cdcfe44e3533175be23d7d52a9fc8c3fdb0Kalle Valovoid wl1251_rx(struct wl1251 *wl); 1212f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo 1222f01a1f58889fbfeb68b1bc1b52e4197f3333490Kalle Valo#endif 123