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