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