18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * LMAC Interface specific definitions for mac80211 Prism54 drivers 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net> 68c2ecf20Sopenharmony_ci * Copyright (c) 2007 - 2009, Christian Lamparter <chunkeey@web.de> 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Based on: 98c2ecf20Sopenharmony_ci * - the islsm (softmac prism54) driver, which is: 108c2ecf20Sopenharmony_ci * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al. 118c2ecf20Sopenharmony_ci * 128c2ecf20Sopenharmony_ci * - LMAC API interface header file for STLC4560 (lmac_longbow.h) 138c2ecf20Sopenharmony_ci * Copyright (C) 2007 Conexant Systems, Inc. 148c2ecf20Sopenharmony_ci */ 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#ifndef LMAC_H 178c2ecf20Sopenharmony_ci#define LMAC_H 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cienum p54_control_frame_types { 208c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_SETUP = 0, 218c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_SCAN, 228c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_TRAP, 238c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_DCFINIT, 248c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_RX_KEYCACHE, 258c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_TIM, 268c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_PSM, 278c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_TXCANCEL, 288c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_TXDONE, 298c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_BURST, 308c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_STAT_READBACK, 318c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_BBP, 328c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_EEPROM_READBACK, 338c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_LED, 348c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_GPIO, 358c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_TIMER, 368c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_MODULATION, 378c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_SYNTH_CONFIG, 388c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_DETECTOR_VALUE, 398c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_XBOW_SYNTH_CFG, 408c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_CCE_QUIET, 418c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_PSM_STA_UNLOCK, 428c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_PCS, 438c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_BT_BALANCER = 28, 448c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_GROUP_ADDRESS_TABLE = 30, 458c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_ARPTABLE = 31, 468c2ecf20Sopenharmony_ci P54_CONTROL_TYPE_BT_OPTIONS = 35, 478c2ecf20Sopenharmony_ci}; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_CONTROL BIT(15) 508c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_CONTROL_OPSET (BIT(15) + BIT(0)) 518c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_ALIGN BIT(14) 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_OUT_PROMISC BIT(0) 548c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_OUT_TIMESTAMP BIT(1) 558c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_OUT_SEQNR BIT(2) 568c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_OUT_BIT3 BIT(3) 578c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_OUT_BURST BIT(4) 588c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_OUT_NOCANCEL BIT(5) 598c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_OUT_CLEARTIM BIT(6) 608c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_OUT_HITCHHIKE BIT(7) 618c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_OUT_COMPRESS BIT(8) 628c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_OUT_CONCAT BIT(9) 638c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_OUT_PCS_ACCEPT BIT(10) 648c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_OUT_WAITEOSP BIT(11) 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_IN_FCS_GOOD BIT(0) 678c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_IN_MATCH_MAC BIT(1) 688c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_IN_MCBC BIT(2) 698c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_IN_BEACON BIT(3) 708c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_IN_MATCH_BSS BIT(4) 718c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_IN_BCAST_BSS BIT(5) 728c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_IN_DATA BIT(6) 738c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_IN_TRUNCATED BIT(7) 748c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_IN_BIT8 BIT(8) 758c2ecf20Sopenharmony_ci#define P54_HDR_FLAG_DATA_IN_TRANSPARENT BIT(9) 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_cistruct p54_hdr { 788c2ecf20Sopenharmony_ci __le16 flags; 798c2ecf20Sopenharmony_ci __le16 len; 808c2ecf20Sopenharmony_ci __le32 req_id; 818c2ecf20Sopenharmony_ci __le16 type; /* enum p54_control_frame_types */ 828c2ecf20Sopenharmony_ci u8 rts_tries; 838c2ecf20Sopenharmony_ci u8 tries; 848c2ecf20Sopenharmony_ci u8 data[]; 858c2ecf20Sopenharmony_ci} __packed; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci#define GET_REQ_ID(skb) \ 888c2ecf20Sopenharmony_ci (((struct p54_hdr *) ((struct sk_buff *) skb)->data)->req_id) \ 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci#define FREE_AFTER_TX(skb) \ 918c2ecf20Sopenharmony_ci ((((struct p54_hdr *) ((struct sk_buff *) skb)->data)-> \ 928c2ecf20Sopenharmony_ci flags) == cpu_to_le16(P54_HDR_FLAG_CONTROL_OPSET)) 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci#define IS_DATA_FRAME(skb) \ 958c2ecf20Sopenharmony_ci (!((((struct p54_hdr *) ((struct sk_buff *) skb)->data)-> \ 968c2ecf20Sopenharmony_ci flags) & cpu_to_le16(P54_HDR_FLAG_CONTROL))) 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci#define GET_HW_QUEUE(skb) \ 998c2ecf20Sopenharmony_ci (((struct p54_tx_data *)((struct p54_hdr *) \ 1008c2ecf20Sopenharmony_ci skb->data)->data)->hw_queue) 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci/* 1038c2ecf20Sopenharmony_ci * shared interface ID definitions 1048c2ecf20Sopenharmony_ci * The interface ID is a unique identification of a specific interface. 1058c2ecf20Sopenharmony_ci * The following values are reserved: 0x0000, 0x0002, 0x0012, 0x0014, 0x0015 1068c2ecf20Sopenharmony_ci */ 1078c2ecf20Sopenharmony_ci#define IF_ID_ISL36356A 0x0001 /* ISL36356A <-> Firmware */ 1088c2ecf20Sopenharmony_ci#define IF_ID_MVC 0x0003 /* MAC Virtual Coprocessor */ 1098c2ecf20Sopenharmony_ci#define IF_ID_DEBUG 0x0008 /* PolDebug Interface */ 1108c2ecf20Sopenharmony_ci#define IF_ID_PRODUCT 0x0009 1118c2ecf20Sopenharmony_ci#define IF_ID_OEM 0x000a 1128c2ecf20Sopenharmony_ci#define IF_ID_PCI3877 0x000b /* 3877 <-> Host PCI */ 1138c2ecf20Sopenharmony_ci#define IF_ID_ISL37704C 0x000c /* ISL37704C <-> Fw */ 1148c2ecf20Sopenharmony_ci#define IF_ID_ISL39000 0x000f /* ISL39000 <-> Fw */ 1158c2ecf20Sopenharmony_ci#define IF_ID_ISL39300A 0x0010 /* ISL39300A <-> Fw */ 1168c2ecf20Sopenharmony_ci#define IF_ID_ISL37700_UAP 0x0016 /* ISL37700 uAP Fw <-> Fw */ 1178c2ecf20Sopenharmony_ci#define IF_ID_ISL39000_UAP 0x0017 /* ISL39000 uAP Fw <-> Fw */ 1188c2ecf20Sopenharmony_ci#define IF_ID_LMAC 0x001a /* Interface exposed by LMAC */ 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_cistruct exp_if { 1218c2ecf20Sopenharmony_ci __le16 role; 1228c2ecf20Sopenharmony_ci __le16 if_id; 1238c2ecf20Sopenharmony_ci __le16 variant; 1248c2ecf20Sopenharmony_ci __le16 btm_compat; 1258c2ecf20Sopenharmony_ci __le16 top_compat; 1268c2ecf20Sopenharmony_ci} __packed; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_cistruct dep_if { 1298c2ecf20Sopenharmony_ci __le16 role; 1308c2ecf20Sopenharmony_ci __le16 if_id; 1318c2ecf20Sopenharmony_ci __le16 variant; 1328c2ecf20Sopenharmony_ci} __packed; 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci/* driver <-> lmac definitions */ 1358c2ecf20Sopenharmony_cistruct p54_eeprom_lm86 { 1368c2ecf20Sopenharmony_ci union { 1378c2ecf20Sopenharmony_ci struct { 1388c2ecf20Sopenharmony_ci __le16 offset; 1398c2ecf20Sopenharmony_ci __le16 len; 1408c2ecf20Sopenharmony_ci u8 data[0]; 1418c2ecf20Sopenharmony_ci } __packed v1; 1428c2ecf20Sopenharmony_ci struct { 1438c2ecf20Sopenharmony_ci __le32 offset; 1448c2ecf20Sopenharmony_ci __le16 len; 1458c2ecf20Sopenharmony_ci u8 magic2; 1468c2ecf20Sopenharmony_ci u8 pad; 1478c2ecf20Sopenharmony_ci u8 magic[4]; 1488c2ecf20Sopenharmony_ci u8 data[0]; 1498c2ecf20Sopenharmony_ci } __packed v2; 1508c2ecf20Sopenharmony_ci } __packed; 1518c2ecf20Sopenharmony_ci} __packed; 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_cienum p54_rx_decrypt_status { 1548c2ecf20Sopenharmony_ci P54_DECRYPT_NONE = 0, 1558c2ecf20Sopenharmony_ci P54_DECRYPT_OK, 1568c2ecf20Sopenharmony_ci P54_DECRYPT_NOKEY, 1578c2ecf20Sopenharmony_ci P54_DECRYPT_NOMICHAEL, 1588c2ecf20Sopenharmony_ci P54_DECRYPT_NOCKIPMIC, 1598c2ecf20Sopenharmony_ci P54_DECRYPT_FAIL_WEP, 1608c2ecf20Sopenharmony_ci P54_DECRYPT_FAIL_TKIP, 1618c2ecf20Sopenharmony_ci P54_DECRYPT_FAIL_MICHAEL, 1628c2ecf20Sopenharmony_ci P54_DECRYPT_FAIL_CKIPKP, 1638c2ecf20Sopenharmony_ci P54_DECRYPT_FAIL_CKIPMIC, 1648c2ecf20Sopenharmony_ci P54_DECRYPT_FAIL_AESCCMP 1658c2ecf20Sopenharmony_ci}; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_cistruct p54_rx_data { 1688c2ecf20Sopenharmony_ci __le16 flags; 1698c2ecf20Sopenharmony_ci __le16 len; 1708c2ecf20Sopenharmony_ci __le16 freq; 1718c2ecf20Sopenharmony_ci u8 antenna; 1728c2ecf20Sopenharmony_ci u8 rate; 1738c2ecf20Sopenharmony_ci u8 rssi; 1748c2ecf20Sopenharmony_ci u8 quality; 1758c2ecf20Sopenharmony_ci u8 decrypt_status; 1768c2ecf20Sopenharmony_ci u8 rssi_raw; 1778c2ecf20Sopenharmony_ci __le32 tsf32; 1788c2ecf20Sopenharmony_ci __le32 unalloc0; 1798c2ecf20Sopenharmony_ci u8 align[]; 1808c2ecf20Sopenharmony_ci} __packed; 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_cienum p54_trap_type { 1838c2ecf20Sopenharmony_ci P54_TRAP_SCAN = 0, 1848c2ecf20Sopenharmony_ci P54_TRAP_TIMER, 1858c2ecf20Sopenharmony_ci P54_TRAP_BEACON_TX, 1868c2ecf20Sopenharmony_ci P54_TRAP_FAA_RADIO_ON, 1878c2ecf20Sopenharmony_ci P54_TRAP_FAA_RADIO_OFF, 1888c2ecf20Sopenharmony_ci P54_TRAP_RADAR, 1898c2ecf20Sopenharmony_ci P54_TRAP_NO_BEACON, 1908c2ecf20Sopenharmony_ci P54_TRAP_TBTT, 1918c2ecf20Sopenharmony_ci P54_TRAP_SCO_ENTER, 1928c2ecf20Sopenharmony_ci P54_TRAP_SCO_EXIT 1938c2ecf20Sopenharmony_ci}; 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_cistruct p54_trap { 1968c2ecf20Sopenharmony_ci __le16 event; 1978c2ecf20Sopenharmony_ci __le16 frequency; 1988c2ecf20Sopenharmony_ci} __packed; 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_cienum p54_frame_sent_status { 2018c2ecf20Sopenharmony_ci P54_TX_OK = 0, 2028c2ecf20Sopenharmony_ci P54_TX_FAILED, 2038c2ecf20Sopenharmony_ci P54_TX_PSM, 2048c2ecf20Sopenharmony_ci P54_TX_PSM_CANCELLED = 4 2058c2ecf20Sopenharmony_ci}; 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_cistruct p54_frame_sent { 2088c2ecf20Sopenharmony_ci u8 status; 2098c2ecf20Sopenharmony_ci u8 tries; 2108c2ecf20Sopenharmony_ci u8 ack_rssi; 2118c2ecf20Sopenharmony_ci u8 quality; 2128c2ecf20Sopenharmony_ci __le16 seq; 2138c2ecf20Sopenharmony_ci u8 antenna; 2148c2ecf20Sopenharmony_ci u8 padding; 2158c2ecf20Sopenharmony_ci} __packed; 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_cienum p54_tx_data_crypt { 2188c2ecf20Sopenharmony_ci P54_CRYPTO_NONE = 0, 2198c2ecf20Sopenharmony_ci P54_CRYPTO_WEP, 2208c2ecf20Sopenharmony_ci P54_CRYPTO_TKIP, 2218c2ecf20Sopenharmony_ci P54_CRYPTO_TKIPMICHAEL, 2228c2ecf20Sopenharmony_ci P54_CRYPTO_CCX_WEPMIC, 2238c2ecf20Sopenharmony_ci P54_CRYPTO_CCX_KPMIC, 2248c2ecf20Sopenharmony_ci P54_CRYPTO_CCX_KP, 2258c2ecf20Sopenharmony_ci P54_CRYPTO_AESCCMP 2268c2ecf20Sopenharmony_ci}; 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_cienum p54_tx_data_queue { 2298c2ecf20Sopenharmony_ci P54_QUEUE_BEACON = 0, 2308c2ecf20Sopenharmony_ci P54_QUEUE_FWSCAN = 1, 2318c2ecf20Sopenharmony_ci P54_QUEUE_MGMT = 2, 2328c2ecf20Sopenharmony_ci P54_QUEUE_CAB = 3, 2338c2ecf20Sopenharmony_ci P54_QUEUE_DATA = 4, 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci P54_QUEUE_AC_NUM = 4, 2368c2ecf20Sopenharmony_ci P54_QUEUE_AC_VO = 4, 2378c2ecf20Sopenharmony_ci P54_QUEUE_AC_VI = 5, 2388c2ecf20Sopenharmony_ci P54_QUEUE_AC_BE = 6, 2398c2ecf20Sopenharmony_ci P54_QUEUE_AC_BK = 7, 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci /* keep last */ 2428c2ecf20Sopenharmony_ci P54_QUEUE_NUM = 8, 2438c2ecf20Sopenharmony_ci}; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci#define IS_QOS_QUEUE(n) (n >= P54_QUEUE_DATA) 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_cistruct p54_tx_data { 2488c2ecf20Sopenharmony_ci u8 rateset[8]; 2498c2ecf20Sopenharmony_ci u8 rts_rate_idx; 2508c2ecf20Sopenharmony_ci u8 crypt_offset; 2518c2ecf20Sopenharmony_ci u8 key_type; 2528c2ecf20Sopenharmony_ci u8 key_len; 2538c2ecf20Sopenharmony_ci u8 key[16]; 2548c2ecf20Sopenharmony_ci u8 hw_queue; 2558c2ecf20Sopenharmony_ci u8 backlog; 2568c2ecf20Sopenharmony_ci __le16 durations[4]; 2578c2ecf20Sopenharmony_ci u8 tx_antenna; 2588c2ecf20Sopenharmony_ci union { 2598c2ecf20Sopenharmony_ci struct { 2608c2ecf20Sopenharmony_ci u8 cts_rate; 2618c2ecf20Sopenharmony_ci __le16 output_power; 2628c2ecf20Sopenharmony_ci } __packed longbow; 2638c2ecf20Sopenharmony_ci struct { 2648c2ecf20Sopenharmony_ci u8 output_power; 2658c2ecf20Sopenharmony_ci u8 cts_rate; 2668c2ecf20Sopenharmony_ci u8 unalloc; 2678c2ecf20Sopenharmony_ci } __packed normal; 2688c2ecf20Sopenharmony_ci } __packed; 2698c2ecf20Sopenharmony_ci u8 unalloc2[2]; 2708c2ecf20Sopenharmony_ci u8 align[]; 2718c2ecf20Sopenharmony_ci} __packed; 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ci/* unit is ms */ 2748c2ecf20Sopenharmony_ci#define P54_TX_FRAME_LIFETIME 2000 2758c2ecf20Sopenharmony_ci#define P54_TX_TIMEOUT 4000 2768c2ecf20Sopenharmony_ci#define P54_STATISTICS_UPDATE 5000 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ci#define P54_FILTER_TYPE_NONE 0 2798c2ecf20Sopenharmony_ci#define P54_FILTER_TYPE_STATION BIT(0) 2808c2ecf20Sopenharmony_ci#define P54_FILTER_TYPE_IBSS BIT(1) 2818c2ecf20Sopenharmony_ci#define P54_FILTER_TYPE_AP BIT(2) 2828c2ecf20Sopenharmony_ci#define P54_FILTER_TYPE_TRANSPARENT BIT(3) 2838c2ecf20Sopenharmony_ci#define P54_FILTER_TYPE_PROMISCUOUS BIT(4) 2848c2ecf20Sopenharmony_ci#define P54_FILTER_TYPE_HIBERNATE BIT(5) 2858c2ecf20Sopenharmony_ci#define P54_FILTER_TYPE_NOACK BIT(6) 2868c2ecf20Sopenharmony_ci#define P54_FILTER_TYPE_RX_DISABLED BIT(7) 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_cistruct p54_setup_mac { 2898c2ecf20Sopenharmony_ci __le16 mac_mode; 2908c2ecf20Sopenharmony_ci u8 mac_addr[ETH_ALEN]; 2918c2ecf20Sopenharmony_ci u8 bssid[ETH_ALEN]; 2928c2ecf20Sopenharmony_ci u8 rx_antenna; 2938c2ecf20Sopenharmony_ci u8 rx_align; 2948c2ecf20Sopenharmony_ci union { 2958c2ecf20Sopenharmony_ci struct { 2968c2ecf20Sopenharmony_ci __le32 basic_rate_mask; 2978c2ecf20Sopenharmony_ci u8 rts_rates[8]; 2988c2ecf20Sopenharmony_ci __le32 rx_addr; 2998c2ecf20Sopenharmony_ci __le16 max_rx; 3008c2ecf20Sopenharmony_ci __le16 rxhw; 3018c2ecf20Sopenharmony_ci __le16 wakeup_timer; 3028c2ecf20Sopenharmony_ci __le16 unalloc0; 3038c2ecf20Sopenharmony_ci } __packed v1; 3048c2ecf20Sopenharmony_ci struct { 3058c2ecf20Sopenharmony_ci __le32 rx_addr; 3068c2ecf20Sopenharmony_ci __le16 max_rx; 3078c2ecf20Sopenharmony_ci __le16 rxhw; 3088c2ecf20Sopenharmony_ci __le16 timer; 3098c2ecf20Sopenharmony_ci __le16 truncate; 3108c2ecf20Sopenharmony_ci __le32 basic_rate_mask; 3118c2ecf20Sopenharmony_ci u8 sbss_offset; 3128c2ecf20Sopenharmony_ci u8 mcast_window; 3138c2ecf20Sopenharmony_ci u8 rx_rssi_threshold; 3148c2ecf20Sopenharmony_ci u8 rx_ed_threshold; 3158c2ecf20Sopenharmony_ci __le32 ref_clock; 3168c2ecf20Sopenharmony_ci __le16 lpf_bandwidth; 3178c2ecf20Sopenharmony_ci __le16 osc_start_delay; 3188c2ecf20Sopenharmony_ci } __packed v2; 3198c2ecf20Sopenharmony_ci } __packed; 3208c2ecf20Sopenharmony_ci} __packed; 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ci#define P54_SETUP_V1_LEN 40 3238c2ecf20Sopenharmony_ci#define P54_SETUP_V2_LEN (sizeof(struct p54_setup_mac)) 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci#define P54_SCAN_EXIT BIT(0) 3268c2ecf20Sopenharmony_ci#define P54_SCAN_TRAP BIT(1) 3278c2ecf20Sopenharmony_ci#define P54_SCAN_ACTIVE BIT(2) 3288c2ecf20Sopenharmony_ci#define P54_SCAN_FILTER BIT(3) 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_cistruct p54_scan_head { 3318c2ecf20Sopenharmony_ci __le16 mode; 3328c2ecf20Sopenharmony_ci __le16 dwell; 3338c2ecf20Sopenharmony_ci u8 scan_params[20]; 3348c2ecf20Sopenharmony_ci __le16 freq; 3358c2ecf20Sopenharmony_ci} __packed; 3368c2ecf20Sopenharmony_ci 3378c2ecf20Sopenharmony_cistruct p54_pa_curve_data_sample { 3388c2ecf20Sopenharmony_ci u8 rf_power; 3398c2ecf20Sopenharmony_ci u8 pa_detector; 3408c2ecf20Sopenharmony_ci u8 data_barker; 3418c2ecf20Sopenharmony_ci u8 data_bpsk; 3428c2ecf20Sopenharmony_ci u8 data_qpsk; 3438c2ecf20Sopenharmony_ci u8 data_16qam; 3448c2ecf20Sopenharmony_ci u8 data_64qam; 3458c2ecf20Sopenharmony_ci u8 padding; 3468c2ecf20Sopenharmony_ci} __packed; 3478c2ecf20Sopenharmony_ci 3488c2ecf20Sopenharmony_cistruct p54_scan_body { 3498c2ecf20Sopenharmony_ci u8 pa_points_per_curve; 3508c2ecf20Sopenharmony_ci u8 val_barker; 3518c2ecf20Sopenharmony_ci u8 val_bpsk; 3528c2ecf20Sopenharmony_ci u8 val_qpsk; 3538c2ecf20Sopenharmony_ci u8 val_16qam; 3548c2ecf20Sopenharmony_ci u8 val_64qam; 3558c2ecf20Sopenharmony_ci struct p54_pa_curve_data_sample curve_data[8]; 3568c2ecf20Sopenharmony_ci u8 dup_bpsk; 3578c2ecf20Sopenharmony_ci u8 dup_qpsk; 3588c2ecf20Sopenharmony_ci u8 dup_16qam; 3598c2ecf20Sopenharmony_ci u8 dup_64qam; 3608c2ecf20Sopenharmony_ci} __packed; 3618c2ecf20Sopenharmony_ci 3628c2ecf20Sopenharmony_ci/* 3638c2ecf20Sopenharmony_ci * Warning: Longbow's structures are bogus. 3648c2ecf20Sopenharmony_ci */ 3658c2ecf20Sopenharmony_cistruct p54_channel_output_limit_longbow { 3668c2ecf20Sopenharmony_ci __le16 rf_power_points[12]; 3678c2ecf20Sopenharmony_ci} __packed; 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_cistruct p54_pa_curve_data_sample_longbow { 3708c2ecf20Sopenharmony_ci __le16 rf_power; 3718c2ecf20Sopenharmony_ci __le16 pa_detector; 3728c2ecf20Sopenharmony_ci struct { 3738c2ecf20Sopenharmony_ci __le16 data[4]; 3748c2ecf20Sopenharmony_ci } points[3] __packed; 3758c2ecf20Sopenharmony_ci} __packed; 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_cistruct p54_scan_body_longbow { 3788c2ecf20Sopenharmony_ci struct p54_channel_output_limit_longbow power_limits; 3798c2ecf20Sopenharmony_ci struct p54_pa_curve_data_sample_longbow curve_data[8]; 3808c2ecf20Sopenharmony_ci __le16 unkn[6]; /* maybe more power_limits or rate_mask */ 3818c2ecf20Sopenharmony_ci} __packed; 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_ciunion p54_scan_body_union { 3848c2ecf20Sopenharmony_ci struct p54_scan_body normal; 3858c2ecf20Sopenharmony_ci struct p54_scan_body_longbow longbow; 3868c2ecf20Sopenharmony_ci} __packed; 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_cistruct p54_scan_tail_rate { 3898c2ecf20Sopenharmony_ci __le32 basic_rate_mask; 3908c2ecf20Sopenharmony_ci u8 rts_rates[8]; 3918c2ecf20Sopenharmony_ci} __packed; 3928c2ecf20Sopenharmony_ci 3938c2ecf20Sopenharmony_cistruct p54_led { 3948c2ecf20Sopenharmony_ci __le16 flags; 3958c2ecf20Sopenharmony_ci __le16 mask[2]; 3968c2ecf20Sopenharmony_ci __le16 delay[2]; 3978c2ecf20Sopenharmony_ci} __packed; 3988c2ecf20Sopenharmony_ci 3998c2ecf20Sopenharmony_cistruct p54_edcf { 4008c2ecf20Sopenharmony_ci u8 flags; 4018c2ecf20Sopenharmony_ci u8 slottime; 4028c2ecf20Sopenharmony_ci u8 sifs; 4038c2ecf20Sopenharmony_ci u8 eofpad; 4048c2ecf20Sopenharmony_ci struct p54_edcf_queue_param queue[8]; 4058c2ecf20Sopenharmony_ci u8 mapping[4]; 4068c2ecf20Sopenharmony_ci __le16 frameburst; 4078c2ecf20Sopenharmony_ci __le16 round_trip_delay; 4088c2ecf20Sopenharmony_ci} __packed; 4098c2ecf20Sopenharmony_ci 4108c2ecf20Sopenharmony_cistruct p54_statistics { 4118c2ecf20Sopenharmony_ci __le32 rx_success; 4128c2ecf20Sopenharmony_ci __le32 rx_bad_fcs; 4138c2ecf20Sopenharmony_ci __le32 rx_abort; 4148c2ecf20Sopenharmony_ci __le32 rx_abort_phy; 4158c2ecf20Sopenharmony_ci __le32 rts_success; 4168c2ecf20Sopenharmony_ci __le32 rts_fail; 4178c2ecf20Sopenharmony_ci __le32 tsf32; 4188c2ecf20Sopenharmony_ci __le32 airtime; 4198c2ecf20Sopenharmony_ci __le32 noise; 4208c2ecf20Sopenharmony_ci __le32 sample_noise[8]; 4218c2ecf20Sopenharmony_ci __le32 sample_cca; 4228c2ecf20Sopenharmony_ci __le32 sample_tx; 4238c2ecf20Sopenharmony_ci} __packed; 4248c2ecf20Sopenharmony_ci 4258c2ecf20Sopenharmony_cistruct p54_xbow_synth { 4268c2ecf20Sopenharmony_ci __le16 magic1; 4278c2ecf20Sopenharmony_ci __le16 magic2; 4288c2ecf20Sopenharmony_ci __le16 freq; 4298c2ecf20Sopenharmony_ci u32 padding[5]; 4308c2ecf20Sopenharmony_ci} __packed; 4318c2ecf20Sopenharmony_ci 4328c2ecf20Sopenharmony_cistruct p54_timer { 4338c2ecf20Sopenharmony_ci __le32 interval; 4348c2ecf20Sopenharmony_ci} __packed; 4358c2ecf20Sopenharmony_ci 4368c2ecf20Sopenharmony_cistruct p54_keycache { 4378c2ecf20Sopenharmony_ci u8 entry; 4388c2ecf20Sopenharmony_ci u8 key_id; 4398c2ecf20Sopenharmony_ci u8 mac[ETH_ALEN]; 4408c2ecf20Sopenharmony_ci u8 padding[2]; 4418c2ecf20Sopenharmony_ci u8 key_type; 4428c2ecf20Sopenharmony_ci u8 key_len; 4438c2ecf20Sopenharmony_ci u8 key[24]; 4448c2ecf20Sopenharmony_ci} __packed; 4458c2ecf20Sopenharmony_ci 4468c2ecf20Sopenharmony_cistruct p54_burst { 4478c2ecf20Sopenharmony_ci u8 flags; 4488c2ecf20Sopenharmony_ci u8 queue; 4498c2ecf20Sopenharmony_ci u8 backlog; 4508c2ecf20Sopenharmony_ci u8 pad; 4518c2ecf20Sopenharmony_ci __le16 durations[32]; 4528c2ecf20Sopenharmony_ci} __packed; 4538c2ecf20Sopenharmony_ci 4548c2ecf20Sopenharmony_cistruct p54_psm_interval { 4558c2ecf20Sopenharmony_ci __le16 interval; 4568c2ecf20Sopenharmony_ci __le16 periods; 4578c2ecf20Sopenharmony_ci} __packed; 4588c2ecf20Sopenharmony_ci 4598c2ecf20Sopenharmony_ci#define P54_PSM_CAM 0 4608c2ecf20Sopenharmony_ci#define P54_PSM BIT(0) 4618c2ecf20Sopenharmony_ci#define P54_PSM_DTIM BIT(1) 4628c2ecf20Sopenharmony_ci#define P54_PSM_MCBC BIT(2) 4638c2ecf20Sopenharmony_ci#define P54_PSM_CHECKSUM BIT(3) 4648c2ecf20Sopenharmony_ci#define P54_PSM_SKIP_MORE_DATA BIT(4) 4658c2ecf20Sopenharmony_ci#define P54_PSM_BEACON_TIMEOUT BIT(5) 4668c2ecf20Sopenharmony_ci#define P54_PSM_HFOSLEEP BIT(6) 4678c2ecf20Sopenharmony_ci#define P54_PSM_AUTOSWITCH_SLEEP BIT(7) 4688c2ecf20Sopenharmony_ci#define P54_PSM_LPIT BIT(8) 4698c2ecf20Sopenharmony_ci#define P54_PSM_BF_UCAST_SKIP BIT(9) 4708c2ecf20Sopenharmony_ci#define P54_PSM_BF_MCAST_SKIP BIT(10) 4718c2ecf20Sopenharmony_ci 4728c2ecf20Sopenharmony_cistruct p54_psm { 4738c2ecf20Sopenharmony_ci __le16 mode; 4748c2ecf20Sopenharmony_ci __le16 aid; 4758c2ecf20Sopenharmony_ci struct p54_psm_interval intervals[4]; 4768c2ecf20Sopenharmony_ci u8 beacon_rssi_skip_max; 4778c2ecf20Sopenharmony_ci u8 rssi_delta_threshold; 4788c2ecf20Sopenharmony_ci u8 nr; 4798c2ecf20Sopenharmony_ci u8 exclude[1]; 4808c2ecf20Sopenharmony_ci} __packed; 4818c2ecf20Sopenharmony_ci 4828c2ecf20Sopenharmony_ci#define MC_FILTER_ADDRESS_NUM 4 4838c2ecf20Sopenharmony_ci 4848c2ecf20Sopenharmony_cistruct p54_group_address_table { 4858c2ecf20Sopenharmony_ci __le16 filter_enable; 4868c2ecf20Sopenharmony_ci __le16 num_address; 4878c2ecf20Sopenharmony_ci u8 mac_list[MC_FILTER_ADDRESS_NUM][ETH_ALEN]; 4888c2ecf20Sopenharmony_ci} __packed; 4898c2ecf20Sopenharmony_ci 4908c2ecf20Sopenharmony_cistruct p54_txcancel { 4918c2ecf20Sopenharmony_ci __le32 req_id; 4928c2ecf20Sopenharmony_ci} __packed; 4938c2ecf20Sopenharmony_ci 4948c2ecf20Sopenharmony_cistruct p54_sta_unlock { 4958c2ecf20Sopenharmony_ci u8 addr[ETH_ALEN]; 4968c2ecf20Sopenharmony_ci u16 padding; 4978c2ecf20Sopenharmony_ci} __packed; 4988c2ecf20Sopenharmony_ci 4998c2ecf20Sopenharmony_ci#define P54_TIM_CLEAR BIT(15) 5008c2ecf20Sopenharmony_cistruct p54_tim { 5018c2ecf20Sopenharmony_ci u8 count; 5028c2ecf20Sopenharmony_ci u8 padding[3]; 5038c2ecf20Sopenharmony_ci __le16 entry[8]; 5048c2ecf20Sopenharmony_ci} __packed; 5058c2ecf20Sopenharmony_ci 5068c2ecf20Sopenharmony_cistruct p54_cce_quiet { 5078c2ecf20Sopenharmony_ci __le32 period; 5088c2ecf20Sopenharmony_ci} __packed; 5098c2ecf20Sopenharmony_ci 5108c2ecf20Sopenharmony_cistruct p54_bt_balancer { 5118c2ecf20Sopenharmony_ci __le16 prio_thresh; 5128c2ecf20Sopenharmony_ci __le16 acl_thresh; 5138c2ecf20Sopenharmony_ci} __packed; 5148c2ecf20Sopenharmony_ci 5158c2ecf20Sopenharmony_cistruct p54_arp_table { 5168c2ecf20Sopenharmony_ci __le16 filter_enable; 5178c2ecf20Sopenharmony_ci u8 ipv4_addr[4]; 5188c2ecf20Sopenharmony_ci} __packed; 5198c2ecf20Sopenharmony_ci 5208c2ecf20Sopenharmony_ci/* LED control */ 5218c2ecf20Sopenharmony_ciint p54_set_leds(struct p54_common *priv); 5228c2ecf20Sopenharmony_ciint p54_init_leds(struct p54_common *priv); 5238c2ecf20Sopenharmony_civoid p54_unregister_leds(struct p54_common *priv); 5248c2ecf20Sopenharmony_ci 5258c2ecf20Sopenharmony_ci/* xmit functions */ 5268c2ecf20Sopenharmony_civoid p54_tx_80211(struct ieee80211_hw *dev, 5278c2ecf20Sopenharmony_ci struct ieee80211_tx_control *control, 5288c2ecf20Sopenharmony_ci struct sk_buff *skb); 5298c2ecf20Sopenharmony_ciint p54_tx_cancel(struct p54_common *priv, __le32 req_id); 5308c2ecf20Sopenharmony_civoid p54_tx(struct p54_common *priv, struct sk_buff *skb); 5318c2ecf20Sopenharmony_ci 5328c2ecf20Sopenharmony_ci/* synth/phy configuration */ 5338c2ecf20Sopenharmony_ciint p54_init_xbow_synth(struct p54_common *priv); 5348c2ecf20Sopenharmony_ciint p54_scan(struct p54_common *priv, u16 mode, u16 dwell); 5358c2ecf20Sopenharmony_ci 5368c2ecf20Sopenharmony_ci/* MAC */ 5378c2ecf20Sopenharmony_ciint p54_sta_unlock(struct p54_common *priv, u8 *addr); 5388c2ecf20Sopenharmony_ciint p54_update_beacon_tim(struct p54_common *priv, u16 aid, bool set); 5398c2ecf20Sopenharmony_ciint p54_setup_mac(struct p54_common *priv); 5408c2ecf20Sopenharmony_ciint p54_set_ps(struct p54_common *priv); 5418c2ecf20Sopenharmony_ciint p54_fetch_statistics(struct p54_common *priv); 5428c2ecf20Sopenharmony_ciint p54_set_groupfilter(struct p54_common *priv); 5438c2ecf20Sopenharmony_ci 5448c2ecf20Sopenharmony_ci/* e/v DCF setup */ 5458c2ecf20Sopenharmony_ciint p54_set_edcf(struct p54_common *priv); 5468c2ecf20Sopenharmony_ci 5478c2ecf20Sopenharmony_ci/* cryptographic engine */ 5488c2ecf20Sopenharmony_ciint p54_upload_key(struct p54_common *priv, u8 algo, int slot, 5498c2ecf20Sopenharmony_ci u8 idx, u8 len, u8 *addr, u8* key); 5508c2ecf20Sopenharmony_ci 5518c2ecf20Sopenharmony_ci/* eeprom */ 5528c2ecf20Sopenharmony_ciint p54_download_eeprom(struct p54_common *priv, void *buf, 5538c2ecf20Sopenharmony_ci u16 offset, u16 len); 5548c2ecf20Sopenharmony_cistruct p54_rssi_db_entry *p54_rssi_find(struct p54_common *p, const u16 freq); 5558c2ecf20Sopenharmony_ci 5568c2ecf20Sopenharmony_ci/* utility */ 5578c2ecf20Sopenharmony_ciu8 *p54_find_ie(struct sk_buff *skb, u8 ie); 5588c2ecf20Sopenharmony_ci 5598c2ecf20Sopenharmony_ci#endif /* LMAC_H */ 560