12b27bdccSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 290921014SLuciano Coelho /* 390921014SLuciano Coelho * This file is part of wl1251 490921014SLuciano Coelho * 590921014SLuciano Coelho * Copyright (c) 1998-2007 Texas Instruments Incorporated 690921014SLuciano Coelho * Copyright (C) 2008 Nokia Corporation 790921014SLuciano Coelho */ 890921014SLuciano Coelho 990921014SLuciano Coelho #ifndef __WL1251_RX_H__ 1090921014SLuciano Coelho #define __WL1251_RX_H__ 1190921014SLuciano Coelho 1290921014SLuciano Coelho #include <linux/bitops.h> 1390921014SLuciano Coelho 1490921014SLuciano Coelho #include "wl1251.h" 1590921014SLuciano Coelho 1690921014SLuciano Coelho /* 1790921014SLuciano Coelho * RX PATH 1890921014SLuciano Coelho * 1990921014SLuciano Coelho * The Rx path uses a double buffer and an rx_contro structure, each located 2090921014SLuciano Coelho * at a fixed address in the device memory. The host keeps track of which 2190921014SLuciano Coelho * buffer is available and alternates between them on a per packet basis. 2290921014SLuciano Coelho * The size of each of the two buffers is large enough to hold the longest 2390921014SLuciano Coelho * 802.3 packet. 2490921014SLuciano Coelho * The RX path goes like that: 2590921014SLuciano Coelho * 1) The target generates an interrupt each time a new packet is received. 2690921014SLuciano Coelho * There are 2 RX interrupts, one for each buffer. 2790921014SLuciano Coelho * 2) The host reads the received packet from one of the double buffers. 2890921014SLuciano Coelho * 3) The host triggers a target interrupt. 2990921014SLuciano Coelho * 4) The target prepares the next RX packet. 3090921014SLuciano Coelho */ 3190921014SLuciano Coelho 3290921014SLuciano Coelho #define WL1251_RX_MAX_RSSI -30 3390921014SLuciano Coelho #define WL1251_RX_MIN_RSSI -95 3490921014SLuciano Coelho 3590921014SLuciano Coelho #define WL1251_RX_ALIGN_TO 4 3690921014SLuciano Coelho #define WL1251_RX_ALIGN(len) (((len) + WL1251_RX_ALIGN_TO - 1) & \ 3790921014SLuciano Coelho ~(WL1251_RX_ALIGN_TO - 1)) 3890921014SLuciano Coelho 3990921014SLuciano Coelho #define SHORT_PREAMBLE_BIT BIT(0) 4090921014SLuciano Coelho #define OFDM_RATE_BIT BIT(6) 4190921014SLuciano Coelho #define PBCC_RATE_BIT BIT(7) 4290921014SLuciano Coelho 4390921014SLuciano Coelho #define PLCP_HEADER_LENGTH 8 4490921014SLuciano Coelho #define RX_DESC_PACKETID_SHIFT 11 4590921014SLuciano Coelho #define RX_MAX_PACKET_ID 3 4690921014SLuciano Coelho 4790921014SLuciano Coelho #define RX_DESC_VALID_FCS 0x0001 4890921014SLuciano Coelho #define RX_DESC_MATCH_RXADDR1 0x0002 4990921014SLuciano Coelho #define RX_DESC_MCAST 0x0004 5090921014SLuciano Coelho #define RX_DESC_STAINTIM 0x0008 5190921014SLuciano Coelho #define RX_DESC_VIRTUAL_BM 0x0010 5290921014SLuciano Coelho #define RX_DESC_BCAST 0x0020 5390921014SLuciano Coelho #define RX_DESC_MATCH_SSID 0x0040 5490921014SLuciano Coelho #define RX_DESC_MATCH_BSSID 0x0080 5590921014SLuciano Coelho #define RX_DESC_ENCRYPTION_MASK 0x0300 5690921014SLuciano Coelho #define RX_DESC_MEASURMENT 0x0400 5790921014SLuciano Coelho #define RX_DESC_SEQNUM_MASK 0x1800 5890921014SLuciano Coelho #define RX_DESC_MIC_FAIL 0x2000 5990921014SLuciano Coelho #define RX_DESC_DECRYPT_FAIL 0x4000 6090921014SLuciano Coelho 6190921014SLuciano Coelho struct wl1251_rx_descriptor { 6290921014SLuciano Coelho u32 timestamp; /* In microseconds */ 6390921014SLuciano Coelho u16 length; /* Paylod length, including headers */ 6490921014SLuciano Coelho u16 flags; 6590921014SLuciano Coelho 6690921014SLuciano Coelho /* 6790921014SLuciano Coelho * 0 - 802.11 6890921014SLuciano Coelho * 1 - 802.3 6990921014SLuciano Coelho * 2 - IP 7090921014SLuciano Coelho * 3 - Raw Codec 7190921014SLuciano Coelho */ 7290921014SLuciano Coelho u8 type; 7390921014SLuciano Coelho 7490921014SLuciano Coelho /* 7590921014SLuciano Coelho * Received Rate: 7690921014SLuciano Coelho * 0x0A - 1MBPS 7790921014SLuciano Coelho * 0x14 - 2MBPS 7890921014SLuciano Coelho * 0x37 - 5_5MBPS 7990921014SLuciano Coelho * 0x0B - 6MBPS 8090921014SLuciano Coelho * 0x0F - 9MBPS 8190921014SLuciano Coelho * 0x6E - 11MBPS 8290921014SLuciano Coelho * 0x0A - 12MBPS 8390921014SLuciano Coelho * 0x0E - 18MBPS 8490921014SLuciano Coelho * 0xDC - 22MBPS 8590921014SLuciano Coelho * 0x09 - 24MBPS 8690921014SLuciano Coelho * 0x0D - 36MBPS 8790921014SLuciano Coelho * 0x08 - 48MBPS 8890921014SLuciano Coelho * 0x0C - 54MBPS 8990921014SLuciano Coelho */ 9090921014SLuciano Coelho u8 rate; 9190921014SLuciano Coelho 9290921014SLuciano Coelho u8 mod_pre; /* Modulation and preamble */ 9390921014SLuciano Coelho u8 channel; 9490921014SLuciano Coelho 9590921014SLuciano Coelho /* 9690921014SLuciano Coelho * 0 - 2.4 Ghz 9790921014SLuciano Coelho * 1 - 5 Ghz 9890921014SLuciano Coelho */ 9990921014SLuciano Coelho u8 band; 10090921014SLuciano Coelho 10190921014SLuciano Coelho s8 rssi; /* in dB */ 10290921014SLuciano Coelho u8 rcpi; /* in dB */ 10390921014SLuciano Coelho u8 snr; /* in dB */ 10490921014SLuciano Coelho } __packed; 10590921014SLuciano Coelho 10690921014SLuciano Coelho void wl1251_rx(struct wl1251 *wl); 10790921014SLuciano Coelho 10890921014SLuciano Coelho #endif 109