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