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