12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2dd3f92deSKalle Valo /* 3dd3f92deSKalle Valo * Copyright (C) 2008, cozybit Inc. 4dd3f92deSKalle Valo * Copyright (C) 2007, Red Hat, Inc. 5dd3f92deSKalle Valo * Copyright (C) 2003-2006, Marvell International Ltd. 6dd3f92deSKalle Valo */ 7dd3f92deSKalle Valo #include <linux/spinlock.h> 8dd3f92deSKalle Valo #include <linux/device.h> 9dd3f92deSKalle Valo #include <linux/kthread.h> 10dd3f92deSKalle Valo #include <net/mac80211.h> 11dd3f92deSKalle Valo 12dd3f92deSKalle Valo #include "deb_defs.h" 13dd3f92deSKalle Valo 14dd3f92deSKalle Valo #ifndef DRV_NAME 15dd3f92deSKalle Valo #define DRV_NAME "libertas_tf" 16dd3f92deSKalle Valo #endif 17dd3f92deSKalle Valo 18dd3f92deSKalle Valo #define MRVL_DEFAULT_RETRIES 9 19dd3f92deSKalle Valo #define MRVL_PER_PACKET_RATE 0x10 20dd3f92deSKalle Valo #define MRVL_MAX_BCN_SIZE 440 21dd3f92deSKalle Valo #define CMD_OPTION_WAITFORRSP 0x0002 22dd3f92deSKalle Valo 23dd3f92deSKalle Valo /* Return command are almost always the same as the host command, but with 24dd3f92deSKalle Valo * bit 15 set high. There are a few exceptions, though... 25dd3f92deSKalle Valo */ 26dd3f92deSKalle Valo #define CMD_RET(cmd) (0x8000 | cmd) 27dd3f92deSKalle Valo 28dd3f92deSKalle Valo /* Command codes */ 29dd3f92deSKalle Valo #define CMD_GET_HW_SPEC 0x0003 30dd3f92deSKalle Valo #define CMD_802_11_RESET 0x0005 31dd3f92deSKalle Valo #define CMD_MAC_MULTICAST_ADR 0x0010 32dd3f92deSKalle Valo #define CMD_802_11_RADIO_CONTROL 0x001c 33dd3f92deSKalle Valo #define CMD_802_11_RF_CHANNEL 0x001d 34dd3f92deSKalle Valo #define CMD_802_11_RF_TX_POWER 0x001e 35dd3f92deSKalle Valo #define CMD_MAC_CONTROL 0x0028 36dd3f92deSKalle Valo #define CMD_802_11_MAC_ADDRESS 0x004d 37dd3f92deSKalle Valo #define CMD_SET_BOOT2_VER 0x00a5 38dd3f92deSKalle Valo #define CMD_802_11_BEACON_CTRL 0x00b0 39dd3f92deSKalle Valo #define CMD_802_11_BEACON_SET 0x00cb 40dd3f92deSKalle Valo #define CMD_802_11_SET_MODE 0x00cc 41dd3f92deSKalle Valo #define CMD_802_11_SET_BSSID 0x00cd 42dd3f92deSKalle Valo 43dd3f92deSKalle Valo #define CMD_ACT_GET 0x0000 44dd3f92deSKalle Valo #define CMD_ACT_SET 0x0001 45dd3f92deSKalle Valo 46dd3f92deSKalle Valo /* Define action or option for CMD_802_11_RESET */ 47dd3f92deSKalle Valo #define CMD_ACT_HALT 0x0003 48dd3f92deSKalle Valo 49dd3f92deSKalle Valo /* Define action or option for CMD_MAC_CONTROL */ 50dd3f92deSKalle Valo #define CMD_ACT_MAC_RX_ON 0x0001 51dd3f92deSKalle Valo #define CMD_ACT_MAC_TX_ON 0x0002 52dd3f92deSKalle Valo #define CMD_ACT_MAC_MULTICAST_ENABLE 0x0020 53dd3f92deSKalle Valo #define CMD_ACT_MAC_BROADCAST_ENABLE 0x0040 54dd3f92deSKalle Valo #define CMD_ACT_MAC_PROMISCUOUS_ENABLE 0x0080 55dd3f92deSKalle Valo #define CMD_ACT_MAC_ALL_MULTICAST_ENABLE 0x0100 56dd3f92deSKalle Valo 57dd3f92deSKalle Valo /* Define action or option for CMD_802_11_RADIO_CONTROL */ 58dd3f92deSKalle Valo #define CMD_TYPE_AUTO_PREAMBLE 0x0001 59dd3f92deSKalle Valo #define CMD_TYPE_SHORT_PREAMBLE 0x0002 60dd3f92deSKalle Valo #define CMD_TYPE_LONG_PREAMBLE 0x0003 61dd3f92deSKalle Valo 62dd3f92deSKalle Valo #define TURN_ON_RF 0x01 63dd3f92deSKalle Valo #define RADIO_ON 0x01 64dd3f92deSKalle Valo #define RADIO_OFF 0x00 65dd3f92deSKalle Valo 66dd3f92deSKalle Valo #define SET_AUTO_PREAMBLE 0x05 67dd3f92deSKalle Valo #define SET_SHORT_PREAMBLE 0x03 68dd3f92deSKalle Valo #define SET_LONG_PREAMBLE 0x01 69dd3f92deSKalle Valo 70dd3f92deSKalle Valo /* Define action or option for CMD_802_11_RF_CHANNEL */ 71dd3f92deSKalle Valo #define CMD_OPT_802_11_RF_CHANNEL_GET 0x00 72dd3f92deSKalle Valo #define CMD_OPT_802_11_RF_CHANNEL_SET 0x01 73dd3f92deSKalle Valo 74dd3f92deSKalle Valo /* Codes for CMD_802_11_SET_MODE */ 75dd3f92deSKalle Valo enum lbtf_mode { 76dd3f92deSKalle Valo LBTF_PASSIVE_MODE, 77dd3f92deSKalle Valo LBTF_STA_MODE, 78dd3f92deSKalle Valo LBTF_AP_MODE, 79dd3f92deSKalle Valo }; 80dd3f92deSKalle Valo 81dd3f92deSKalle Valo /** Card Event definition */ 82dd3f92deSKalle Valo #define MACREG_INT_CODE_FIRMWARE_READY 48 83dd3f92deSKalle Valo /** Buffer Constants */ 84dd3f92deSKalle Valo 85dd3f92deSKalle Valo /* The size of SQ memory PPA, DPA are 8 DWORDs, that keep the physical 86dd3f92deSKalle Valo * addresses of TxPD buffers. Station has only 8 TxPD available, Whereas 87dd3f92deSKalle Valo * driver has more local TxPDs. Each TxPD on the host memory is associated 88dd3f92deSKalle Valo * with a Tx control node. The driver maintains 8 RxPD descriptors for 89dd3f92deSKalle Valo * station firmware to store Rx packet information. 90dd3f92deSKalle Valo * 91dd3f92deSKalle Valo * Current version of MAC has a 32x6 multicast address buffer. 92dd3f92deSKalle Valo * 93dd3f92deSKalle Valo * 802.11b can have up to 14 channels, the driver keeps the 94dd3f92deSKalle Valo * BSSID(MAC address) of each APs or Ad hoc stations it has sensed. 95dd3f92deSKalle Valo */ 96dd3f92deSKalle Valo 97dd3f92deSKalle Valo #define MRVDRV_MAX_MULTICAST_LIST_SIZE 32 98dd3f92deSKalle Valo #define LBS_NUM_CMD_BUFFERS 10 99dd3f92deSKalle Valo #define LBS_CMD_BUFFER_SIZE (2 * 1024) 100dd3f92deSKalle Valo #define MRVDRV_MAX_CHANNEL_SIZE 14 101dd3f92deSKalle Valo #define MRVDRV_SNAP_HEADER_LEN 8 102dd3f92deSKalle Valo 103dd3f92deSKalle Valo #define LBS_UPLD_SIZE 2312 104dd3f92deSKalle Valo #define DEV_NAME_LEN 32 105dd3f92deSKalle Valo 106dd3f92deSKalle Valo /** Misc constants */ 107dd3f92deSKalle Valo /* This section defines 802.11 specific contants */ 108dd3f92deSKalle Valo 109dd3f92deSKalle Valo #define MRVDRV_MAX_REGION_CODE 6 110dd3f92deSKalle Valo /** 111dd3f92deSKalle Valo * the table to keep region code 112dd3f92deSKalle Valo */ 113dd3f92deSKalle Valo #define LBTF_REGDOMAIN_US 0x10 114dd3f92deSKalle Valo #define LBTF_REGDOMAIN_CA 0x20 115dd3f92deSKalle Valo #define LBTF_REGDOMAIN_EU 0x30 116dd3f92deSKalle Valo #define LBTF_REGDOMAIN_SP 0x31 117dd3f92deSKalle Valo #define LBTF_REGDOMAIN_FR 0x32 118dd3f92deSKalle Valo #define LBTF_REGDOMAIN_JP 0x40 119dd3f92deSKalle Valo 120dd3f92deSKalle Valo #define SBI_EVENT_CAUSE_SHIFT 3 121dd3f92deSKalle Valo 122dd3f92deSKalle Valo /** RxPD status */ 123dd3f92deSKalle Valo 124dd3f92deSKalle Valo #define MRVDRV_RXPD_STATUS_OK 0x0001 125dd3f92deSKalle Valo 126dd3f92deSKalle Valo 127dd3f92deSKalle Valo /* This is for firmware specific length */ 128dd3f92deSKalle Valo #define EXTRA_LEN 36 129dd3f92deSKalle Valo 130dd3f92deSKalle Valo #define MRVDRV_ETH_TX_PACKET_BUFFER_SIZE \ 131dd3f92deSKalle Valo (ETH_FRAME_LEN + sizeof(struct txpd) + EXTRA_LEN) 132dd3f92deSKalle Valo 133dd3f92deSKalle Valo #define MRVDRV_ETH_RX_PACKET_BUFFER_SIZE \ 134dd3f92deSKalle Valo (ETH_FRAME_LEN + sizeof(struct rxpd) \ 135dd3f92deSKalle Valo + MRVDRV_SNAP_HEADER_LEN + EXTRA_LEN) 136dd3f92deSKalle Valo 137dd3f92deSKalle Valo #define CMD_F_HOSTCMD (1 << 0) 138dd3f92deSKalle Valo #define FW_CAPINFO_WPA (1 << 0) 139dd3f92deSKalle Valo 140dd3f92deSKalle Valo #define RF_ANTENNA_1 0x1 141dd3f92deSKalle Valo #define RF_ANTENNA_2 0x2 142dd3f92deSKalle Valo #define RF_ANTENNA_AUTO 0xFFFF 143dd3f92deSKalle Valo 144dd3f92deSKalle Valo #define LBTF_EVENT_BCN_SENT 55 145dd3f92deSKalle Valo 146dd3f92deSKalle Valo /** Global Variable Declaration */ 147dd3f92deSKalle Valo /** mv_ms_type */ 148dd3f92deSKalle Valo enum mv_ms_type { 149dd3f92deSKalle Valo MVMS_DAT = 0, 150dd3f92deSKalle Valo MVMS_CMD = 1, 151dd3f92deSKalle Valo MVMS_TXDONE = 2, 152dd3f92deSKalle Valo MVMS_EVENT 153dd3f92deSKalle Valo }; 154dd3f92deSKalle Valo 155dd3f92deSKalle Valo extern struct workqueue_struct *lbtf_wq; 156dd3f92deSKalle Valo 157dd3f92deSKalle Valo struct lbtf_private; 158dd3f92deSKalle Valo 159dd3f92deSKalle Valo struct lbtf_offset_value { 160dd3f92deSKalle Valo u32 offset; 161dd3f92deSKalle Valo u32 value; 162dd3f92deSKalle Valo }; 163dd3f92deSKalle Valo 164dd3f92deSKalle Valo struct channel_range { 165dd3f92deSKalle Valo u8 regdomain; 166dd3f92deSKalle Valo u8 start; 167dd3f92deSKalle Valo u8 end; /* exclusive (channel must be less than end) */ 168dd3f92deSKalle Valo }; 169dd3f92deSKalle Valo 170dd3f92deSKalle Valo struct if_usb_card; 171dd3f92deSKalle Valo 172be9d0d3fSLubomir Rintel struct lbtf_ops { 173be9d0d3fSLubomir Rintel /** Hardware access */ 174be9d0d3fSLubomir Rintel int (*hw_host_to_card)(struct lbtf_private *priv, u8 type, 175be9d0d3fSLubomir Rintel u8 *payload, u16 nb); 176baa0280fSLubomir Rintel int (*hw_prog_firmware)(struct lbtf_private *priv); 177baa0280fSLubomir Rintel int (*hw_reset_device)(struct lbtf_private *priv); 178be9d0d3fSLubomir Rintel }; 179be9d0d3fSLubomir Rintel 180dd3f92deSKalle Valo /** Private structure for the MV device */ 181dd3f92deSKalle Valo struct lbtf_private { 182dd3f92deSKalle Valo void *card; 183dd3f92deSKalle Valo struct ieee80211_hw *hw; 184be9d0d3fSLubomir Rintel const struct lbtf_ops *ops; 185dd3f92deSKalle Valo 186dd3f92deSKalle Valo /* Command response buffer */ 187dd3f92deSKalle Valo u8 cmd_resp_buff[LBS_UPLD_SIZE]; 188dd3f92deSKalle Valo /* Download sent: 189dd3f92deSKalle Valo bit0 1/0=data_sent/data_tx_done, 190dd3f92deSKalle Valo bit1 1/0=cmd_sent/cmd_tx_done, 191dd3f92deSKalle Valo all other bits reserved 0 */ 192dd3f92deSKalle Valo struct ieee80211_vif *vif; 193dd3f92deSKalle Valo 194dd3f92deSKalle Valo struct work_struct cmd_work; 195dd3f92deSKalle Valo struct work_struct tx_work; 196dd3f92deSKalle Valo 197dd3f92deSKalle Valo /** Wlan adapter data structure*/ 198dd3f92deSKalle Valo /** STATUS variables */ 199dd3f92deSKalle Valo u32 fwrelease; 200dd3f92deSKalle Valo u32 fwcapinfo; 201dd3f92deSKalle Valo /* protected with big lock */ 202dd3f92deSKalle Valo 203dd3f92deSKalle Valo struct mutex lock; 204dd3f92deSKalle Valo 205dd3f92deSKalle Valo /** command-related variables */ 206dd3f92deSKalle Valo u16 seqnum; 207dd3f92deSKalle Valo /* protected by big lock */ 208dd3f92deSKalle Valo 209dd3f92deSKalle Valo struct cmd_ctrl_node *cmd_array; 210dd3f92deSKalle Valo /** Current command */ 211dd3f92deSKalle Valo struct cmd_ctrl_node *cur_cmd; 212dd3f92deSKalle Valo /** command Queues */ 213dd3f92deSKalle Valo /** Free command buffers */ 214dd3f92deSKalle Valo struct list_head cmdfreeq; 215dd3f92deSKalle Valo /** Pending command buffers */ 216dd3f92deSKalle Valo struct list_head cmdpendingq; 217dd3f92deSKalle Valo 218dd3f92deSKalle Valo /** spin locks */ 219dd3f92deSKalle Valo spinlock_t driver_lock; 220dd3f92deSKalle Valo 221dd3f92deSKalle Valo /** Timers */ 222dd3f92deSKalle Valo struct timer_list command_timer; 223dd3f92deSKalle Valo int nr_retries; 224dd3f92deSKalle Valo int cmd_timed_out; 225dd3f92deSKalle Valo 226dd3f92deSKalle Valo u8 cmd_response_rxed; 227dd3f92deSKalle Valo 228dd3f92deSKalle Valo /** capability Info used in Association, start, join */ 229dd3f92deSKalle Valo u16 capability; 230dd3f92deSKalle Valo 231dd3f92deSKalle Valo /** MAC address information */ 232dd3f92deSKalle Valo u8 current_addr[ETH_ALEN]; 233dd3f92deSKalle Valo u8 multicastlist[MRVDRV_MAX_MULTICAST_LIST_SIZE][ETH_ALEN]; 234dd3f92deSKalle Valo u32 nr_of_multicastmacaddr; 235dd3f92deSKalle Valo int cur_freq; 236dd3f92deSKalle Valo 237dd3f92deSKalle Valo struct sk_buff *skb_to_tx; 238dd3f92deSKalle Valo struct sk_buff *tx_skb; 239dd3f92deSKalle Valo 240dd3f92deSKalle Valo /** NIC Operation characteristics */ 241dd3f92deSKalle Valo u16 mac_control; 242dd3f92deSKalle Valo u16 regioncode; 243dd3f92deSKalle Valo struct channel_range range; 244dd3f92deSKalle Valo 245dd3f92deSKalle Valo u8 radioon; 246dd3f92deSKalle Valo u32 preamble; 247dd3f92deSKalle Valo 248dd3f92deSKalle Valo struct ieee80211_channel channels[14]; 249dd3f92deSKalle Valo struct ieee80211_rate rates[12]; 250dd3f92deSKalle Valo struct ieee80211_supported_band band; 251dd3f92deSKalle Valo struct lbtf_offset_value offsetvalue; 252dd3f92deSKalle Valo 253dd3f92deSKalle Valo u8 surpriseremoved; 254dd3f92deSKalle Valo struct sk_buff_head bc_ps_buf; 255dd3f92deSKalle Valo 256dd3f92deSKalle Valo /* Most recently reported noise in dBm */ 257dd3f92deSKalle Valo s8 noise; 258dd3f92deSKalle Valo }; 259dd3f92deSKalle Valo 260dd3f92deSKalle Valo /* 802.11-related definitions */ 261dd3f92deSKalle Valo 262dd3f92deSKalle Valo /* TxPD descriptor */ 263dd3f92deSKalle Valo struct txpd { 264dd3f92deSKalle Valo /* Current Tx packet status */ 265dd3f92deSKalle Valo __le32 tx_status; 266dd3f92deSKalle Valo /* Tx control */ 267dd3f92deSKalle Valo __le32 tx_control; 268dd3f92deSKalle Valo __le32 tx_packet_location; 269dd3f92deSKalle Valo /* Tx packet length */ 270dd3f92deSKalle Valo __le16 tx_packet_length; 271*05db148eSKees Cook struct_group_attr(tx_dest_addr, __packed, 272dd3f92deSKalle Valo /* First 2 byte of destination MAC address */ 273dd3f92deSKalle Valo u8 tx_dest_addr_high[2]; 274dd3f92deSKalle Valo /* Last 4 byte of destination MAC address */ 275dd3f92deSKalle Valo u8 tx_dest_addr_low[4]; 276642a5747SKees Cook ); 277dd3f92deSKalle Valo /* Pkt Priority */ 278dd3f92deSKalle Valo u8 priority; 279dd3f92deSKalle Valo /* Pkt Trasnit Power control */ 280dd3f92deSKalle Valo u8 powermgmt; 281dd3f92deSKalle Valo /* Time the packet has been queued in the driver (units = 2ms) */ 282dd3f92deSKalle Valo u8 pktdelay_2ms; 283dd3f92deSKalle Valo /* reserved */ 284dd3f92deSKalle Valo u8 reserved1; 285*05db148eSKees Cook } __packed; 286dd3f92deSKalle Valo 287dd3f92deSKalle Valo /* RxPD Descriptor */ 288dd3f92deSKalle Valo struct rxpd { 289dd3f92deSKalle Valo /* Current Rx packet status */ 290dd3f92deSKalle Valo __le16 status; 291dd3f92deSKalle Valo 292dd3f92deSKalle Valo /* SNR */ 293dd3f92deSKalle Valo u8 snr; 294dd3f92deSKalle Valo 295dd3f92deSKalle Valo /* Tx control */ 296dd3f92deSKalle Valo u8 rx_control; 297dd3f92deSKalle Valo 298dd3f92deSKalle Valo /* Pkt length */ 299dd3f92deSKalle Valo __le16 pkt_len; 300dd3f92deSKalle Valo 301dd3f92deSKalle Valo /* Noise Floor */ 302dd3f92deSKalle Valo u8 nf; 303dd3f92deSKalle Valo 304dd3f92deSKalle Valo /* Rx Packet Rate */ 305dd3f92deSKalle Valo u8 rx_rate; 306dd3f92deSKalle Valo 307dd3f92deSKalle Valo /* Pkt addr */ 308dd3f92deSKalle Valo __le32 pkt_ptr; 309dd3f92deSKalle Valo 310dd3f92deSKalle Valo /* Next Rx RxPD addr */ 311dd3f92deSKalle Valo __le32 next_rxpd_ptr; 312dd3f92deSKalle Valo 313dd3f92deSKalle Valo /* Pkt Priority */ 314dd3f92deSKalle Valo u8 priority; 315dd3f92deSKalle Valo u8 reserved[3]; 316*05db148eSKees Cook } __packed; 317dd3f92deSKalle Valo 318dd3f92deSKalle Valo struct cmd_header { 319dd3f92deSKalle Valo __le16 command; 320dd3f92deSKalle Valo __le16 size; 321dd3f92deSKalle Valo __le16 seqnum; 322dd3f92deSKalle Valo __le16 result; 323dd3f92deSKalle Valo } __packed; 324dd3f92deSKalle Valo 325dd3f92deSKalle Valo struct cmd_ctrl_node { 326dd3f92deSKalle Valo struct list_head list; 327dd3f92deSKalle Valo int result; 328dd3f92deSKalle Valo /* command response */ 329dd3f92deSKalle Valo int (*callback)(struct lbtf_private *, 330dd3f92deSKalle Valo unsigned long, struct cmd_header *); 331dd3f92deSKalle Valo unsigned long callback_arg; 332dd3f92deSKalle Valo /* command data */ 333dd3f92deSKalle Valo struct cmd_header *cmdbuf; 334dd3f92deSKalle Valo /* wait queue */ 335dd3f92deSKalle Valo u16 cmdwaitqwoken; 336dd3f92deSKalle Valo wait_queue_head_t cmdwait_q; 337dd3f92deSKalle Valo }; 338dd3f92deSKalle Valo 339dd3f92deSKalle Valo /* 340dd3f92deSKalle Valo * Define data structure for CMD_GET_HW_SPEC 341dd3f92deSKalle Valo * This structure defines the response for the GET_HW_SPEC command 342dd3f92deSKalle Valo */ 343dd3f92deSKalle Valo struct cmd_ds_get_hw_spec { 344dd3f92deSKalle Valo struct cmd_header hdr; 345dd3f92deSKalle Valo 346dd3f92deSKalle Valo /* HW Interface version number */ 347dd3f92deSKalle Valo __le16 hwifversion; 348dd3f92deSKalle Valo /* HW version number */ 349dd3f92deSKalle Valo __le16 version; 350dd3f92deSKalle Valo /* Max number of TxPD FW can handle */ 351dd3f92deSKalle Valo __le16 nr_txpd; 352dd3f92deSKalle Valo /* Max no of Multicast address */ 353dd3f92deSKalle Valo __le16 nr_mcast_adr; 354dd3f92deSKalle Valo /* MAC address */ 355dd3f92deSKalle Valo u8 permanentaddr[6]; 356dd3f92deSKalle Valo 357dd3f92deSKalle Valo /* region Code */ 358dd3f92deSKalle Valo __le16 regioncode; 359dd3f92deSKalle Valo 360dd3f92deSKalle Valo /* Number of antenna used */ 361dd3f92deSKalle Valo __le16 nr_antenna; 362dd3f92deSKalle Valo 363dd3f92deSKalle Valo /* FW release number, example 0x01030304 = 2.3.4p1 */ 364dd3f92deSKalle Valo __le32 fwrelease; 365dd3f92deSKalle Valo 366dd3f92deSKalle Valo /* Base Address of TxPD queue */ 367dd3f92deSKalle Valo __le32 wcb_base; 368dd3f92deSKalle Valo /* Read Pointer of RxPd queue */ 369dd3f92deSKalle Valo __le32 rxpd_rdptr; 370dd3f92deSKalle Valo 371dd3f92deSKalle Valo /* Write Pointer of RxPd queue */ 372dd3f92deSKalle Valo __le32 rxpd_wrptr; 373dd3f92deSKalle Valo 374dd3f92deSKalle Valo /*FW/HW capability */ 375dd3f92deSKalle Valo __le32 fwcapinfo; 376dd3f92deSKalle Valo } __packed; 377dd3f92deSKalle Valo 378dd3f92deSKalle Valo struct cmd_ds_mac_control { 379dd3f92deSKalle Valo struct cmd_header hdr; 380dd3f92deSKalle Valo __le16 action; 381dd3f92deSKalle Valo u16 reserved; 382*05db148eSKees Cook } __packed; 383dd3f92deSKalle Valo 384dd3f92deSKalle Valo struct cmd_ds_802_11_mac_address { 385dd3f92deSKalle Valo struct cmd_header hdr; 386dd3f92deSKalle Valo 387dd3f92deSKalle Valo __le16 action; 388dd3f92deSKalle Valo uint8_t macadd[ETH_ALEN]; 389*05db148eSKees Cook } __packed; 390dd3f92deSKalle Valo 391dd3f92deSKalle Valo struct cmd_ds_mac_multicast_addr { 392dd3f92deSKalle Valo struct cmd_header hdr; 393dd3f92deSKalle Valo 394dd3f92deSKalle Valo __le16 action; 395dd3f92deSKalle Valo __le16 nr_of_adrs; 396dd3f92deSKalle Valo u8 maclist[ETH_ALEN * MRVDRV_MAX_MULTICAST_LIST_SIZE]; 397*05db148eSKees Cook } __packed; 398dd3f92deSKalle Valo 399dd3f92deSKalle Valo struct cmd_ds_set_mode { 400dd3f92deSKalle Valo struct cmd_header hdr; 401dd3f92deSKalle Valo 402dd3f92deSKalle Valo __le16 mode; 403*05db148eSKees Cook } __packed; 404dd3f92deSKalle Valo 405dd3f92deSKalle Valo struct cmd_ds_set_bssid { 406dd3f92deSKalle Valo struct cmd_header hdr; 407dd3f92deSKalle Valo 408dd3f92deSKalle Valo u8 bssid[6]; 409dd3f92deSKalle Valo u8 activate; 410*05db148eSKees Cook } __packed; 411dd3f92deSKalle Valo 412dd3f92deSKalle Valo struct cmd_ds_802_11_radio_control { 413dd3f92deSKalle Valo struct cmd_header hdr; 414dd3f92deSKalle Valo 415dd3f92deSKalle Valo __le16 action; 416dd3f92deSKalle Valo __le16 control; 417*05db148eSKees Cook } __packed; 418dd3f92deSKalle Valo 419dd3f92deSKalle Valo 420dd3f92deSKalle Valo struct cmd_ds_802_11_rf_channel { 421dd3f92deSKalle Valo struct cmd_header hdr; 422dd3f92deSKalle Valo 423dd3f92deSKalle Valo __le16 action; 424dd3f92deSKalle Valo __le16 channel; 425dd3f92deSKalle Valo __le16 rftype; /* unused */ 426dd3f92deSKalle Valo __le16 reserved; /* unused */ 427dd3f92deSKalle Valo u8 channellist[32]; /* unused */ 428*05db148eSKees Cook } __packed; 429dd3f92deSKalle Valo 430dd3f92deSKalle Valo struct cmd_ds_set_boot2_ver { 431dd3f92deSKalle Valo struct cmd_header hdr; 432dd3f92deSKalle Valo 433dd3f92deSKalle Valo __le16 action; 434dd3f92deSKalle Valo __le16 version; 435*05db148eSKees Cook } __packed; 436dd3f92deSKalle Valo 437dd3f92deSKalle Valo struct cmd_ds_802_11_reset { 438dd3f92deSKalle Valo struct cmd_header hdr; 439dd3f92deSKalle Valo 440dd3f92deSKalle Valo __le16 action; 441*05db148eSKees Cook } __packed; 442dd3f92deSKalle Valo 443dd3f92deSKalle Valo struct cmd_ds_802_11_beacon_control { 444dd3f92deSKalle Valo struct cmd_header hdr; 445dd3f92deSKalle Valo 446dd3f92deSKalle Valo __le16 action; 447dd3f92deSKalle Valo __le16 beacon_enable; 448dd3f92deSKalle Valo __le16 beacon_period; 449*05db148eSKees Cook } __packed; 450dd3f92deSKalle Valo 451dd3f92deSKalle Valo struct cmd_ds_802_11_beacon_set { 452dd3f92deSKalle Valo struct cmd_header hdr; 453dd3f92deSKalle Valo 454dd3f92deSKalle Valo __le16 len; 455dd3f92deSKalle Valo u8 beacon[MRVL_MAX_BCN_SIZE]; 456*05db148eSKees Cook } __packed; 457dd3f92deSKalle Valo 458dd3f92deSKalle Valo struct cmd_ctrl_node; 459dd3f92deSKalle Valo 460dd3f92deSKalle Valo /** Function Prototype Declaration */ 461dd3f92deSKalle Valo void lbtf_set_mac_control(struct lbtf_private *priv); 462dd3f92deSKalle Valo 463dd3f92deSKalle Valo int lbtf_free_cmd_buffer(struct lbtf_private *priv); 464dd3f92deSKalle Valo 465dd3f92deSKalle Valo int lbtf_allocate_cmd_buffer(struct lbtf_private *priv); 466dd3f92deSKalle Valo int lbtf_execute_next_command(struct lbtf_private *priv); 467dd3f92deSKalle Valo int lbtf_set_radio_control(struct lbtf_private *priv); 468dd3f92deSKalle Valo int lbtf_update_hw_spec(struct lbtf_private *priv); 469dd3f92deSKalle Valo int lbtf_cmd_set_mac_multicast_addr(struct lbtf_private *priv); 470dd3f92deSKalle Valo void lbtf_set_mode(struct lbtf_private *priv, enum lbtf_mode mode); 471dd3f92deSKalle Valo void lbtf_set_bssid(struct lbtf_private *priv, bool activate, const u8 *bssid); 472dd3f92deSKalle Valo int lbtf_set_mac_address(struct lbtf_private *priv, uint8_t *mac_addr); 473dd3f92deSKalle Valo 474dd3f92deSKalle Valo int lbtf_set_channel(struct lbtf_private *priv, u8 channel); 475dd3f92deSKalle Valo 476dd3f92deSKalle Valo int lbtf_beacon_set(struct lbtf_private *priv, struct sk_buff *beacon); 477dd3f92deSKalle Valo int lbtf_beacon_ctrl(struct lbtf_private *priv, bool beacon_enable, 478dd3f92deSKalle Valo int beacon_int); 479dd3f92deSKalle Valo 480dd3f92deSKalle Valo 481dd3f92deSKalle Valo int lbtf_process_rx_command(struct lbtf_private *priv); 482dd3f92deSKalle Valo void lbtf_complete_command(struct lbtf_private *priv, struct cmd_ctrl_node *cmd, 483dd3f92deSKalle Valo int result); 484dd3f92deSKalle Valo void lbtf_cmd_response_rx(struct lbtf_private *priv); 485dd3f92deSKalle Valo 486dd3f92deSKalle Valo /* main.c */ 487dd3f92deSKalle Valo struct chan_freq_power *lbtf_get_region_cfp_table(u8 region, 488dd3f92deSKalle Valo int *cfp_no); 489be9d0d3fSLubomir Rintel struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev, 490be9d0d3fSLubomir Rintel const struct lbtf_ops *ops); 491dd3f92deSKalle Valo int lbtf_remove_card(struct lbtf_private *priv); 492dd3f92deSKalle Valo int lbtf_start_card(struct lbtf_private *priv); 493dd3f92deSKalle Valo int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb); 494dd3f92deSKalle Valo void lbtf_send_tx_feedback(struct lbtf_private *priv, u8 retrycnt, u8 fail); 495dd3f92deSKalle Valo void lbtf_bcn_sent(struct lbtf_private *priv); 496dd3f92deSKalle Valo 497dd3f92deSKalle Valo /* support functions for cmd.c */ 498dd3f92deSKalle Valo /* lbtf_cmd() infers the size of the buffer to copy data back into, from 499dd3f92deSKalle Valo the size of the target of the pointer. Since the command to be sent 500dd3f92deSKalle Valo may often be smaller, that size is set in cmd->size by the caller.*/ 501dd3f92deSKalle Valo #define lbtf_cmd(priv, cmdnr, cmd, cb, cb_arg) ({ \ 502dd3f92deSKalle Valo uint16_t __sz = le16_to_cpu((cmd)->hdr.size); \ 503dd3f92deSKalle Valo (cmd)->hdr.size = cpu_to_le16(sizeof(*(cmd))); \ 504dd3f92deSKalle Valo __lbtf_cmd(priv, cmdnr, &(cmd)->hdr, __sz, cb, cb_arg); \ 505dd3f92deSKalle Valo }) 506dd3f92deSKalle Valo 507dd3f92deSKalle Valo #define lbtf_cmd_with_response(priv, cmdnr, cmd) \ 508dd3f92deSKalle Valo lbtf_cmd(priv, cmdnr, cmd, lbtf_cmd_copyback, (unsigned long) (cmd)) 509dd3f92deSKalle Valo 510dd3f92deSKalle Valo void lbtf_cmd_async(struct lbtf_private *priv, uint16_t command, 511dd3f92deSKalle Valo struct cmd_header *in_cmd, int in_cmd_size); 512dd3f92deSKalle Valo 513dd3f92deSKalle Valo int __lbtf_cmd(struct lbtf_private *priv, uint16_t command, 514dd3f92deSKalle Valo struct cmd_header *in_cmd, int in_cmd_size, 515dd3f92deSKalle Valo int (*callback)(struct lbtf_private *, unsigned long, 516dd3f92deSKalle Valo struct cmd_header *), 517dd3f92deSKalle Valo unsigned long callback_arg); 518dd3f92deSKalle Valo 519dd3f92deSKalle Valo int lbtf_cmd_copyback(struct lbtf_private *priv, unsigned long extra, 520dd3f92deSKalle Valo struct cmd_header *resp); 521