Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.7-rc6 1289 lines 36 kB view raw
1/* 2 Copyright (C) 2010 Willow Garage <http://www.willowgarage.com> 3 Copyright (C) 2009 - 2010 Ivo van Doorn <IvDoorn@gmail.com> 4 Copyright (C) 2009 Mattias Nissler <mattias.nissler@gmx.de> 5 Copyright (C) 2009 Felix Fietkau <nbd@openwrt.org> 6 Copyright (C) 2009 Xose Vazquez Perez <xose.vazquez@gmail.com> 7 Copyright (C) 2009 Axel Kollhofer <rain_maker@root-forum.org> 8 <http://rt2x00.serialmonkey.com> 9 10 This program is free software; you can redistribute it and/or modify 11 it under the terms of the GNU General Public License as published by 12 the Free Software Foundation; either version 2 of the License, or 13 (at your option) any later version. 14 15 This program is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 GNU General Public License for more details. 19 20 You should have received a copy of the GNU General Public License 21 along with this program; if not, write to the 22 Free Software Foundation, Inc., 23 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 24 */ 25 26/* 27 Module: rt2800usb 28 Abstract: rt2800usb device specific routines. 29 Supported chipsets: RT2800U. 30 */ 31 32#include <linux/delay.h> 33#include <linux/etherdevice.h> 34#include <linux/init.h> 35#include <linux/kernel.h> 36#include <linux/module.h> 37#include <linux/usb.h> 38 39#include "rt2x00.h" 40#include "rt2x00usb.h" 41#include "rt2800lib.h" 42#include "rt2800.h" 43#include "rt2800usb.h" 44 45/* 46 * Allow hardware encryption to be disabled. 47 */ 48static bool modparam_nohwcrypt; 49module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO); 50MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); 51 52static bool rt2800usb_hwcrypt_disabled(struct rt2x00_dev *rt2x00dev) 53{ 54 return modparam_nohwcrypt; 55} 56 57/* 58 * Queue handlers. 59 */ 60static void rt2800usb_start_queue(struct data_queue *queue) 61{ 62 struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; 63 u32 reg; 64 65 switch (queue->qid) { 66 case QID_RX: 67 rt2x00usb_register_read(rt2x00dev, MAC_SYS_CTRL, &reg); 68 rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 1); 69 rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, reg); 70 break; 71 case QID_BEACON: 72 rt2x00usb_register_read(rt2x00dev, BCN_TIME_CFG, &reg); 73 rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 1); 74 rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 1); 75 rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 1); 76 rt2x00usb_register_write(rt2x00dev, BCN_TIME_CFG, reg); 77 break; 78 default: 79 break; 80 } 81} 82 83static void rt2800usb_stop_queue(struct data_queue *queue) 84{ 85 struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; 86 u32 reg; 87 88 switch (queue->qid) { 89 case QID_RX: 90 rt2x00usb_register_read(rt2x00dev, MAC_SYS_CTRL, &reg); 91 rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 0); 92 rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, reg); 93 break; 94 case QID_BEACON: 95 rt2x00usb_register_read(rt2x00dev, BCN_TIME_CFG, &reg); 96 rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0); 97 rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0); 98 rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0); 99 rt2x00usb_register_write(rt2x00dev, BCN_TIME_CFG, reg); 100 break; 101 default: 102 break; 103 } 104} 105 106/* 107 * test if there is an entry in any TX queue for which DMA is done 108 * but the TX status has not been returned yet 109 */ 110static bool rt2800usb_txstatus_pending(struct rt2x00_dev *rt2x00dev) 111{ 112 struct data_queue *queue; 113 114 tx_queue_for_each(rt2x00dev, queue) { 115 if (rt2x00queue_get_entry(queue, Q_INDEX_DMA_DONE) != 116 rt2x00queue_get_entry(queue, Q_INDEX_DONE)) 117 return true; 118 } 119 return false; 120} 121 122static inline bool rt2800usb_entry_txstatus_timeout(struct queue_entry *entry) 123{ 124 bool tout; 125 126 if (!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) 127 return false; 128 129 tout = time_after(jiffies, entry->last_action + msecs_to_jiffies(100)); 130 if (unlikely(tout)) 131 WARNING(entry->queue->rt2x00dev, 132 "TX status timeout for entry %d in queue %d\n", 133 entry->entry_idx, entry->queue->qid); 134 return tout; 135 136} 137 138static bool rt2800usb_txstatus_timeout(struct rt2x00_dev *rt2x00dev) 139{ 140 struct data_queue *queue; 141 struct queue_entry *entry; 142 143 tx_queue_for_each(rt2x00dev, queue) { 144 entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); 145 if (rt2800usb_entry_txstatus_timeout(entry)) 146 return true; 147 } 148 return false; 149} 150 151static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, 152 int urb_status, u32 tx_status) 153{ 154 bool valid; 155 156 if (urb_status) { 157 WARNING(rt2x00dev, "TX status read failed %d\n", urb_status); 158 159 goto stop_reading; 160 } 161 162 valid = rt2x00_get_field32(tx_status, TX_STA_FIFO_VALID); 163 if (valid) { 164 if (!kfifo_put(&rt2x00dev->txstatus_fifo, &tx_status)) 165 WARNING(rt2x00dev, "TX status FIFO overrun\n"); 166 167 queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); 168 169 /* Reschedule urb to read TX status again instantly */ 170 return true; 171 } 172 173 /* Check if there is any entry that timedout waiting on TX status */ 174 if (rt2800usb_txstatus_timeout(rt2x00dev)) 175 queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); 176 177 if (rt2800usb_txstatus_pending(rt2x00dev)) { 178 /* Read register after 250 us */ 179 hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 250000), 180 HRTIMER_MODE_REL); 181 return false; 182 } 183 184stop_reading: 185 clear_bit(TX_STATUS_READING, &rt2x00dev->flags); 186 /* 187 * There is small race window above, between txstatus pending check and 188 * clear_bit someone could do rt2x00usb_interrupt_txdone, so recheck 189 * here again if status reading is needed. 190 */ 191 if (rt2800usb_txstatus_pending(rt2x00dev) && 192 !test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags)) 193 return true; 194 else 195 return false; 196} 197 198static void rt2800usb_async_read_tx_status(struct rt2x00_dev *rt2x00dev) 199{ 200 201 if (test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags)) 202 return; 203 204 /* Read TX_STA_FIFO register after 500 us */ 205 hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 500000), 206 HRTIMER_MODE_REL); 207} 208 209static void rt2800usb_tx_dma_done(struct queue_entry *entry) 210{ 211 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 212 213 rt2800usb_async_read_tx_status(rt2x00dev); 214} 215 216static enum hrtimer_restart rt2800usb_tx_sta_fifo_timeout(struct hrtimer *timer) 217{ 218 struct rt2x00_dev *rt2x00dev = 219 container_of(timer, struct rt2x00_dev, txstatus_timer); 220 221 rt2x00usb_register_read_async(rt2x00dev, TX_STA_FIFO, 222 rt2800usb_tx_sta_fifo_read_completed); 223 224 return HRTIMER_NORESTART; 225} 226 227/* 228 * Firmware functions 229 */ 230static char *rt2800usb_get_firmware_name(struct rt2x00_dev *rt2x00dev) 231{ 232 return FIRMWARE_RT2870; 233} 234 235static int rt2800usb_write_firmware(struct rt2x00_dev *rt2x00dev, 236 const u8 *data, const size_t len) 237{ 238 int status; 239 u32 offset; 240 u32 length; 241 242 /* 243 * Check which section of the firmware we need. 244 */ 245 if (rt2x00_rt(rt2x00dev, RT2860) || 246 rt2x00_rt(rt2x00dev, RT2872) || 247 rt2x00_rt(rt2x00dev, RT3070)) { 248 offset = 0; 249 length = 4096; 250 } else { 251 offset = 4096; 252 length = 4096; 253 } 254 255 /* 256 * Write firmware to device. 257 */ 258 rt2x00usb_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE, 259 data + offset, length); 260 261 rt2x00usb_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0); 262 rt2x00usb_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0); 263 264 /* 265 * Send firmware request to device to load firmware, 266 * we need to specify a long timeout time. 267 */ 268 status = rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 269 0, USB_MODE_FIRMWARE, 270 REGISTER_TIMEOUT_FIRMWARE); 271 if (status < 0) { 272 ERROR(rt2x00dev, "Failed to write Firmware to device.\n"); 273 return status; 274 } 275 276 msleep(10); 277 rt2x00usb_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0); 278 279 return 0; 280} 281 282/* 283 * Device state switch handlers. 284 */ 285static int rt2800usb_init_registers(struct rt2x00_dev *rt2x00dev) 286{ 287 u32 reg; 288 289 /* 290 * Wait until BBP and RF are ready. 291 */ 292 if (rt2800_wait_csr_ready(rt2x00dev)) 293 return -EBUSY; 294 295 rt2x00usb_register_read(rt2x00dev, PBF_SYS_CTRL, &reg); 296 rt2x00usb_register_write(rt2x00dev, PBF_SYS_CTRL, reg & ~0x00002000); 297 298 reg = 0; 299 rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_CSR, 1); 300 rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_BBP, 1); 301 rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, reg); 302 303 rt2x00usb_register_write(rt2x00dev, USB_DMA_CFG, 0x00000000); 304 305 rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0, 306 USB_MODE_RESET, REGISTER_TIMEOUT); 307 308 rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000); 309 310 return 0; 311} 312 313static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev) 314{ 315 u32 reg; 316 317 if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev))) 318 return -EIO; 319 320 rt2x00usb_register_read(rt2x00dev, USB_DMA_CFG, &reg); 321 rt2x00_set_field32(&reg, USB_DMA_CFG_PHY_CLEAR, 0); 322 rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_AGG_EN, 0); 323 rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_AGG_TIMEOUT, 128); 324 /* 325 * Total room for RX frames in kilobytes, PBF might still exceed 326 * this limit so reduce the number to prevent errors. 327 */ 328 rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_AGG_LIMIT, 329 ((rt2x00dev->ops->rx->entry_num * DATA_FRAME_SIZE) 330 / 1024) - 3); 331 rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_EN, 1); 332 rt2x00_set_field32(&reg, USB_DMA_CFG_TX_BULK_EN, 1); 333 rt2x00usb_register_write(rt2x00dev, USB_DMA_CFG, reg); 334 335 return rt2800_enable_radio(rt2x00dev); 336} 337 338static void rt2800usb_disable_radio(struct rt2x00_dev *rt2x00dev) 339{ 340 rt2800_disable_radio(rt2x00dev); 341 rt2x00usb_disable_radio(rt2x00dev); 342} 343 344static int rt2800usb_set_state(struct rt2x00_dev *rt2x00dev, 345 enum dev_state state) 346{ 347 if (state == STATE_AWAKE) 348 rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, 0xff, 0, 2); 349 else 350 rt2800_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0xff, 2); 351 352 return 0; 353} 354 355static int rt2800usb_set_device_state(struct rt2x00_dev *rt2x00dev, 356 enum dev_state state) 357{ 358 int retval = 0; 359 360 switch (state) { 361 case STATE_RADIO_ON: 362 /* 363 * Before the radio can be enabled, the device first has 364 * to be woken up. After that it needs a bit of time 365 * to be fully awake and then the radio can be enabled. 366 */ 367 rt2800usb_set_state(rt2x00dev, STATE_AWAKE); 368 msleep(1); 369 retval = rt2800usb_enable_radio(rt2x00dev); 370 break; 371 case STATE_RADIO_OFF: 372 /* 373 * After the radio has been disabled, the device should 374 * be put to sleep for powersaving. 375 */ 376 rt2800usb_disable_radio(rt2x00dev); 377 rt2800usb_set_state(rt2x00dev, STATE_SLEEP); 378 break; 379 case STATE_RADIO_IRQ_ON: 380 case STATE_RADIO_IRQ_OFF: 381 /* No support, but no error either */ 382 break; 383 case STATE_DEEP_SLEEP: 384 case STATE_SLEEP: 385 case STATE_STANDBY: 386 case STATE_AWAKE: 387 retval = rt2800usb_set_state(rt2x00dev, state); 388 break; 389 default: 390 retval = -ENOTSUPP; 391 break; 392 } 393 394 if (unlikely(retval)) 395 ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n", 396 state, retval); 397 398 return retval; 399} 400 401/* 402 * Watchdog handlers 403 */ 404static void rt2800usb_watchdog(struct rt2x00_dev *rt2x00dev) 405{ 406 unsigned int i; 407 u32 reg; 408 409 rt2x00usb_register_read(rt2x00dev, TXRXQ_PCNT, &reg); 410 if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q)) { 411 WARNING(rt2x00dev, "TX HW queue 0 timed out," 412 " invoke forced kick\n"); 413 414 rt2x00usb_register_write(rt2x00dev, PBF_CFG, 0xf40012); 415 416 for (i = 0; i < 10; i++) { 417 udelay(10); 418 if (!rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q)) 419 break; 420 } 421 422 rt2x00usb_register_write(rt2x00dev, PBF_CFG, 0xf40006); 423 } 424 425 rt2x00usb_register_read(rt2x00dev, TXRXQ_PCNT, &reg); 426 if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q)) { 427 WARNING(rt2x00dev, "TX HW queue 1 timed out," 428 " invoke forced kick\n"); 429 430 rt2x00usb_register_write(rt2x00dev, PBF_CFG, 0xf4000a); 431 432 for (i = 0; i < 10; i++) { 433 udelay(10); 434 if (!rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q)) 435 break; 436 } 437 438 rt2x00usb_register_write(rt2x00dev, PBF_CFG, 0xf40006); 439 } 440 441 rt2x00usb_watchdog(rt2x00dev); 442} 443 444/* 445 * TX descriptor initialization 446 */ 447static __le32 *rt2800usb_get_txwi(struct queue_entry *entry) 448{ 449 if (entry->queue->qid == QID_BEACON) 450 return (__le32 *) (entry->skb->data); 451 else 452 return (__le32 *) (entry->skb->data + TXINFO_DESC_SIZE); 453} 454 455static void rt2800usb_write_tx_desc(struct queue_entry *entry, 456 struct txentry_desc *txdesc) 457{ 458 struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); 459 __le32 *txi = (__le32 *) entry->skb->data; 460 u32 word; 461 462 /* 463 * Initialize TXINFO descriptor 464 */ 465 rt2x00_desc_read(txi, 0, &word); 466 467 /* 468 * The size of TXINFO_W0_USB_DMA_TX_PKT_LEN is 469 * TXWI + 802.11 header + L2 pad + payload + pad, 470 * so need to decrease size of TXINFO. 471 */ 472 rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_TX_PKT_LEN, 473 roundup(entry->skb->len, 4) - TXINFO_DESC_SIZE); 474 rt2x00_set_field32(&word, TXINFO_W0_WIV, 475 !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags)); 476 rt2x00_set_field32(&word, TXINFO_W0_QSEL, 2); 477 rt2x00_set_field32(&word, TXINFO_W0_SW_USE_LAST_ROUND, 0); 478 rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_NEXT_VALID, 0); 479 rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_TX_BURST, 480 test_bit(ENTRY_TXD_BURST, &txdesc->flags)); 481 rt2x00_desc_write(txi, 0, word); 482 483 /* 484 * Register descriptor details in skb frame descriptor. 485 */ 486 skbdesc->flags |= SKBDESC_DESC_IN_SKB; 487 skbdesc->desc = txi; 488 skbdesc->desc_len = TXINFO_DESC_SIZE + TXWI_DESC_SIZE; 489} 490 491/* 492 * TX data initialization 493 */ 494static int rt2800usb_get_tx_data_len(struct queue_entry *entry) 495{ 496 /* 497 * pad(1~3 bytes) is needed after each 802.11 payload. 498 * USB end pad(4 bytes) is needed at each USB bulk out packet end. 499 * TX frame format is : 500 * | TXINFO | TXWI | 802.11 header | L2 pad | payload | pad | USB end pad | 501 * |<------------- tx_pkt_len ------------->| 502 */ 503 504 return roundup(entry->skb->len, 4) + 4; 505} 506 507/* 508 * TX control handlers 509 */ 510static enum txdone_entry_desc_flags 511rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg) 512{ 513 __le32 *txwi; 514 u32 word; 515 int wcid, ack, pid; 516 int tx_wcid, tx_ack, tx_pid, is_agg; 517 518 /* 519 * This frames has returned with an IO error, 520 * so the status report is not intended for this 521 * frame. 522 */ 523 if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) 524 return TXDONE_FAILURE; 525 526 wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID); 527 ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED); 528 pid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE); 529 is_agg = rt2x00_get_field32(reg, TX_STA_FIFO_TX_AGGRE); 530 531 /* 532 * Validate if this TX status report is intended for 533 * this entry by comparing the WCID/ACK/PID fields. 534 */ 535 txwi = rt2800usb_get_txwi(entry); 536 537 rt2x00_desc_read(txwi, 1, &word); 538 tx_wcid = rt2x00_get_field32(word, TXWI_W1_WIRELESS_CLI_ID); 539 tx_ack = rt2x00_get_field32(word, TXWI_W1_ACK); 540 tx_pid = rt2x00_get_field32(word, TXWI_W1_PACKETID); 541 542 if (wcid != tx_wcid || ack != tx_ack || (!is_agg && pid != tx_pid)) { 543 WARNING(entry->queue->rt2x00dev, 544 "TX status report missed for queue %d entry %d\n", 545 entry->queue->qid, entry->entry_idx); 546 return TXDONE_UNKNOWN; 547 } 548 549 return TXDONE_SUCCESS; 550} 551 552static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev) 553{ 554 struct data_queue *queue; 555 struct queue_entry *entry; 556 u32 reg; 557 u8 qid; 558 enum txdone_entry_desc_flags done_status; 559 560 while (kfifo_get(&rt2x00dev->txstatus_fifo, &reg)) { 561 /* 562 * TX_STA_FIFO_PID_QUEUE is a 2-bit field, thus qid is 563 * guaranteed to be one of the TX QIDs . 564 */ 565 qid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_QUEUE); 566 queue = rt2x00queue_get_tx_queue(rt2x00dev, qid); 567 568 if (unlikely(rt2x00queue_empty(queue))) { 569 WARNING(rt2x00dev, "Got TX status for an empty " 570 "queue %u, dropping\n", qid); 571 break; 572 } 573 574 entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); 575 576 if (unlikely(test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || 577 !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))) { 578 WARNING(rt2x00dev, "Data pending for entry %u " 579 "in queue %u\n", entry->entry_idx, qid); 580 break; 581 } 582 583 done_status = rt2800usb_txdone_entry_check(entry, reg); 584 if (likely(done_status == TXDONE_SUCCESS)) 585 rt2800_txdone_entry(entry, reg, rt2800usb_get_txwi(entry)); 586 else 587 rt2x00lib_txdone_noinfo(entry, done_status); 588 } 589} 590 591static void rt2800usb_txdone_nostatus(struct rt2x00_dev *rt2x00dev) 592{ 593 struct data_queue *queue; 594 struct queue_entry *entry; 595 596 /* 597 * Process any trailing TX status reports for IO failures, 598 * we loop until we find the first non-IO error entry. This 599 * can either be a frame which is free, is being uploaded, 600 * or has completed the upload but didn't have an entry 601 * in the TX_STAT_FIFO register yet. 602 */ 603 tx_queue_for_each(rt2x00dev, queue) { 604 while (!rt2x00queue_empty(queue)) { 605 entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); 606 607 if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || 608 !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) 609 break; 610 611 if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) 612 rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE); 613 else if (rt2800usb_entry_txstatus_timeout(entry)) 614 rt2x00lib_txdone_noinfo(entry, TXDONE_UNKNOWN); 615 else 616 break; 617 } 618 } 619} 620 621static void rt2800usb_work_txdone(struct work_struct *work) 622{ 623 struct rt2x00_dev *rt2x00dev = 624 container_of(work, struct rt2x00_dev, txdone_work); 625 626 while (!kfifo_is_empty(&rt2x00dev->txstatus_fifo) || 627 rt2800usb_txstatus_timeout(rt2x00dev)) { 628 629 rt2800usb_txdone(rt2x00dev); 630 631 rt2800usb_txdone_nostatus(rt2x00dev); 632 633 /* 634 * The hw may delay sending the packet after DMA complete 635 * if the medium is busy, thus the TX_STA_FIFO entry is 636 * also delayed -> use a timer to retrieve it. 637 */ 638 if (rt2800usb_txstatus_pending(rt2x00dev)) 639 rt2800usb_async_read_tx_status(rt2x00dev); 640 } 641} 642 643/* 644 * RX control handlers 645 */ 646static void rt2800usb_fill_rxdone(struct queue_entry *entry, 647 struct rxdone_entry_desc *rxdesc) 648{ 649 struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); 650 __le32 *rxi = (__le32 *)entry->skb->data; 651 __le32 *rxd; 652 u32 word; 653 int rx_pkt_len; 654 655 /* 656 * Copy descriptor to the skbdesc->desc buffer, making it safe from 657 * moving of frame data in rt2x00usb. 658 */ 659 memcpy(skbdesc->desc, rxi, skbdesc->desc_len); 660 661 /* 662 * RX frame format is : 663 * | RXINFO | RXWI | header | L2 pad | payload | pad | RXD | USB pad | 664 * |<------------ rx_pkt_len -------------->| 665 */ 666 rt2x00_desc_read(rxi, 0, &word); 667 rx_pkt_len = rt2x00_get_field32(word, RXINFO_W0_USB_DMA_RX_PKT_LEN); 668 669 /* 670 * Remove the RXINFO structure from the sbk. 671 */ 672 skb_pull(entry->skb, RXINFO_DESC_SIZE); 673 674 /* 675 * Check for rx_pkt_len validity. Return if invalid, leaving 676 * rxdesc->size zeroed out by the upper level. 677 */ 678 if (unlikely(rx_pkt_len == 0 || 679 rx_pkt_len > entry->queue->data_size)) { 680 ERROR(entry->queue->rt2x00dev, 681 "Bad frame size %d, forcing to 0\n", rx_pkt_len); 682 return; 683 } 684 685 rxd = (__le32 *)(entry->skb->data + rx_pkt_len); 686 687 /* 688 * It is now safe to read the descriptor on all architectures. 689 */ 690 rt2x00_desc_read(rxd, 0, &word); 691 692 if (rt2x00_get_field32(word, RXD_W0_CRC_ERROR)) 693 rxdesc->flags |= RX_FLAG_FAILED_FCS_CRC; 694 695 rxdesc->cipher_status = rt2x00_get_field32(word, RXD_W0_CIPHER_ERROR); 696 697 if (rt2x00_get_field32(word, RXD_W0_DECRYPTED)) { 698 /* 699 * Hardware has stripped IV/EIV data from 802.11 frame during 700 * decryption. Unfortunately the descriptor doesn't contain 701 * any fields with the EIV/IV data either, so they can't 702 * be restored by rt2x00lib. 703 */ 704 rxdesc->flags |= RX_FLAG_IV_STRIPPED; 705 706 /* 707 * The hardware has already checked the Michael Mic and has 708 * stripped it from the frame. Signal this to mac80211. 709 */ 710 rxdesc->flags |= RX_FLAG_MMIC_STRIPPED; 711 712 if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS) 713 rxdesc->flags |= RX_FLAG_DECRYPTED; 714 else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC) 715 rxdesc->flags |= RX_FLAG_MMIC_ERROR; 716 } 717 718 if (rt2x00_get_field32(word, RXD_W0_MY_BSS)) 719 rxdesc->dev_flags |= RXDONE_MY_BSS; 720 721 if (rt2x00_get_field32(word, RXD_W0_L2PAD)) 722 rxdesc->dev_flags |= RXDONE_L2PAD; 723 724 /* 725 * Remove RXD descriptor from end of buffer. 726 */ 727 skb_trim(entry->skb, rx_pkt_len); 728 729 /* 730 * Process the RXWI structure. 731 */ 732 rt2800_process_rxwi(entry, rxdesc); 733} 734 735/* 736 * Device probe functions. 737 */ 738static void rt2800usb_read_eeprom(struct rt2x00_dev *rt2x00dev) 739{ 740 if (rt2800_efuse_detect(rt2x00dev)) 741 rt2800_read_eeprom_efuse(rt2x00dev); 742 else 743 rt2x00usb_eeprom_read(rt2x00dev, rt2x00dev->eeprom, 744 EEPROM_SIZE); 745} 746 747static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev) 748{ 749 int retval; 750 751 retval = rt2800_probe_hw(rt2x00dev); 752 if (retval) 753 return retval; 754 755 /* 756 * Set txstatus timer function. 757 */ 758 rt2x00dev->txstatus_timer.function = rt2800usb_tx_sta_fifo_timeout; 759 760 /* 761 * Overwrite TX done handler 762 */ 763 PREPARE_WORK(&rt2x00dev->txdone_work, rt2800usb_work_txdone); 764 765 return 0; 766} 767 768static const struct ieee80211_ops rt2800usb_mac80211_ops = { 769 .tx = rt2x00mac_tx, 770 .start = rt2x00mac_start, 771 .stop = rt2x00mac_stop, 772 .add_interface = rt2x00mac_add_interface, 773 .remove_interface = rt2x00mac_remove_interface, 774 .config = rt2x00mac_config, 775 .configure_filter = rt2x00mac_configure_filter, 776 .set_tim = rt2x00mac_set_tim, 777 .set_key = rt2x00mac_set_key, 778 .sw_scan_start = rt2x00mac_sw_scan_start, 779 .sw_scan_complete = rt2x00mac_sw_scan_complete, 780 .get_stats = rt2x00mac_get_stats, 781 .get_tkip_seq = rt2800_get_tkip_seq, 782 .set_rts_threshold = rt2800_set_rts_threshold, 783 .sta_add = rt2x00mac_sta_add, 784 .sta_remove = rt2x00mac_sta_remove, 785 .bss_info_changed = rt2x00mac_bss_info_changed, 786 .conf_tx = rt2800_conf_tx, 787 .get_tsf = rt2800_get_tsf, 788 .rfkill_poll = rt2x00mac_rfkill_poll, 789 .ampdu_action = rt2800_ampdu_action, 790 .flush = rt2x00mac_flush, 791 .get_survey = rt2800_get_survey, 792 .get_ringparam = rt2x00mac_get_ringparam, 793 .tx_frames_pending = rt2x00mac_tx_frames_pending, 794}; 795 796static const struct rt2800_ops rt2800usb_rt2800_ops = { 797 .register_read = rt2x00usb_register_read, 798 .register_read_lock = rt2x00usb_register_read_lock, 799 .register_write = rt2x00usb_register_write, 800 .register_write_lock = rt2x00usb_register_write_lock, 801 .register_multiread = rt2x00usb_register_multiread, 802 .register_multiwrite = rt2x00usb_register_multiwrite, 803 .regbusy_read = rt2x00usb_regbusy_read, 804 .read_eeprom = rt2800usb_read_eeprom, 805 .hwcrypt_disabled = rt2800usb_hwcrypt_disabled, 806 .drv_write_firmware = rt2800usb_write_firmware, 807 .drv_init_registers = rt2800usb_init_registers, 808 .drv_get_txwi = rt2800usb_get_txwi, 809}; 810 811static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = { 812 .probe_hw = rt2800usb_probe_hw, 813 .get_firmware_name = rt2800usb_get_firmware_name, 814 .check_firmware = rt2800_check_firmware, 815 .load_firmware = rt2800_load_firmware, 816 .initialize = rt2x00usb_initialize, 817 .uninitialize = rt2x00usb_uninitialize, 818 .clear_entry = rt2x00usb_clear_entry, 819 .set_device_state = rt2800usb_set_device_state, 820 .rfkill_poll = rt2800_rfkill_poll, 821 .link_stats = rt2800_link_stats, 822 .reset_tuner = rt2800_reset_tuner, 823 .link_tuner = rt2800_link_tuner, 824 .gain_calibration = rt2800_gain_calibration, 825 .vco_calibration = rt2800_vco_calibration, 826 .watchdog = rt2800usb_watchdog, 827 .start_queue = rt2800usb_start_queue, 828 .kick_queue = rt2x00usb_kick_queue, 829 .stop_queue = rt2800usb_stop_queue, 830 .flush_queue = rt2x00usb_flush_queue, 831 .tx_dma_done = rt2800usb_tx_dma_done, 832 .write_tx_desc = rt2800usb_write_tx_desc, 833 .write_tx_data = rt2800_write_tx_data, 834 .write_beacon = rt2800_write_beacon, 835 .clear_beacon = rt2800_clear_beacon, 836 .get_tx_data_len = rt2800usb_get_tx_data_len, 837 .fill_rxdone = rt2800usb_fill_rxdone, 838 .config_shared_key = rt2800_config_shared_key, 839 .config_pairwise_key = rt2800_config_pairwise_key, 840 .config_filter = rt2800_config_filter, 841 .config_intf = rt2800_config_intf, 842 .config_erp = rt2800_config_erp, 843 .config_ant = rt2800_config_ant, 844 .config = rt2800_config, 845 .sta_add = rt2800_sta_add, 846 .sta_remove = rt2800_sta_remove, 847}; 848 849static const struct data_queue_desc rt2800usb_queue_rx = { 850 .entry_num = 128, 851 .data_size = AGGREGATION_SIZE, 852 .desc_size = RXINFO_DESC_SIZE + RXWI_DESC_SIZE, 853 .priv_size = sizeof(struct queue_entry_priv_usb), 854}; 855 856static const struct data_queue_desc rt2800usb_queue_tx = { 857 .entry_num = 16, 858 .data_size = AGGREGATION_SIZE, 859 .desc_size = TXINFO_DESC_SIZE + TXWI_DESC_SIZE, 860 .priv_size = sizeof(struct queue_entry_priv_usb), 861}; 862 863static const struct data_queue_desc rt2800usb_queue_bcn = { 864 .entry_num = 8, 865 .data_size = MGMT_FRAME_SIZE, 866 .desc_size = TXINFO_DESC_SIZE + TXWI_DESC_SIZE, 867 .priv_size = sizeof(struct queue_entry_priv_usb), 868}; 869 870static const struct rt2x00_ops rt2800usb_ops = { 871 .name = KBUILD_MODNAME, 872 .drv_data_size = sizeof(struct rt2800_drv_data), 873 .max_ap_intf = 8, 874 .eeprom_size = EEPROM_SIZE, 875 .rf_size = RF_SIZE, 876 .tx_queues = NUM_TX_QUEUES, 877 .extra_tx_headroom = TXINFO_DESC_SIZE + TXWI_DESC_SIZE, 878 .rx = &rt2800usb_queue_rx, 879 .tx = &rt2800usb_queue_tx, 880 .bcn = &rt2800usb_queue_bcn, 881 .lib = &rt2800usb_rt2x00_ops, 882 .drv = &rt2800usb_rt2800_ops, 883 .hw = &rt2800usb_mac80211_ops, 884#ifdef CONFIG_RT2X00_LIB_DEBUGFS 885 .debugfs = &rt2800_rt2x00debug, 886#endif /* CONFIG_RT2X00_LIB_DEBUGFS */ 887}; 888 889/* 890 * rt2800usb module information. 891 */ 892static struct usb_device_id rt2800usb_device_table[] = { 893 /* Abocom */ 894 { USB_DEVICE(0x07b8, 0x2870) }, 895 { USB_DEVICE(0x07b8, 0x2770) }, 896 { USB_DEVICE(0x07b8, 0x3070) }, 897 { USB_DEVICE(0x07b8, 0x3071) }, 898 { USB_DEVICE(0x07b8, 0x3072) }, 899 { USB_DEVICE(0x1482, 0x3c09) }, 900 /* AirTies */ 901 { USB_DEVICE(0x1eda, 0x2012) }, 902 { USB_DEVICE(0x1eda, 0x2210) }, 903 { USB_DEVICE(0x1eda, 0x2310) }, 904 /* Allwin */ 905 { USB_DEVICE(0x8516, 0x2070) }, 906 { USB_DEVICE(0x8516, 0x2770) }, 907 { USB_DEVICE(0x8516, 0x2870) }, 908 { USB_DEVICE(0x8516, 0x3070) }, 909 { USB_DEVICE(0x8516, 0x3071) }, 910 { USB_DEVICE(0x8516, 0x3072) }, 911 /* Alpha Networks */ 912 { USB_DEVICE(0x14b2, 0x3c06) }, 913 { USB_DEVICE(0x14b2, 0x3c07) }, 914 { USB_DEVICE(0x14b2, 0x3c09) }, 915 { USB_DEVICE(0x14b2, 0x3c12) }, 916 { USB_DEVICE(0x14b2, 0x3c23) }, 917 { USB_DEVICE(0x14b2, 0x3c25) }, 918 { USB_DEVICE(0x14b2, 0x3c27) }, 919 { USB_DEVICE(0x14b2, 0x3c28) }, 920 { USB_DEVICE(0x14b2, 0x3c2c) }, 921 /* Amit */ 922 { USB_DEVICE(0x15c5, 0x0008) }, 923 /* Askey */ 924 { USB_DEVICE(0x1690, 0x0740) }, 925 /* ASUS */ 926 { USB_DEVICE(0x0b05, 0x1731) }, 927 { USB_DEVICE(0x0b05, 0x1732) }, 928 { USB_DEVICE(0x0b05, 0x1742) }, 929 { USB_DEVICE(0x0b05, 0x1784) }, 930 { USB_DEVICE(0x1761, 0x0b05) }, 931 /* AzureWave */ 932 { USB_DEVICE(0x13d3, 0x3247) }, 933 { USB_DEVICE(0x13d3, 0x3273) }, 934 { USB_DEVICE(0x13d3, 0x3305) }, 935 { USB_DEVICE(0x13d3, 0x3307) }, 936 { USB_DEVICE(0x13d3, 0x3321) }, 937 /* Belkin */ 938 { USB_DEVICE(0x050d, 0x8053) }, 939 { USB_DEVICE(0x050d, 0x805c) }, 940 { USB_DEVICE(0x050d, 0x815c) }, 941 { USB_DEVICE(0x050d, 0x825a) }, 942 { USB_DEVICE(0x050d, 0x825b) }, 943 { USB_DEVICE(0x050d, 0x935a) }, 944 { USB_DEVICE(0x050d, 0x935b) }, 945 /* Buffalo */ 946 { USB_DEVICE(0x0411, 0x00e8) }, 947 { USB_DEVICE(0x0411, 0x0158) }, 948 { USB_DEVICE(0x0411, 0x015d) }, 949 { USB_DEVICE(0x0411, 0x016f) }, 950 { USB_DEVICE(0x0411, 0x01a2) }, 951 { USB_DEVICE(0x0411, 0x01ee) }, 952 /* Corega */ 953 { USB_DEVICE(0x07aa, 0x002f) }, 954 { USB_DEVICE(0x07aa, 0x003c) }, 955 { USB_DEVICE(0x07aa, 0x003f) }, 956 { USB_DEVICE(0x18c5, 0x0012) }, 957 /* D-Link */ 958 { USB_DEVICE(0x07d1, 0x3c09) }, 959 { USB_DEVICE(0x07d1, 0x3c0a) }, 960 { USB_DEVICE(0x07d1, 0x3c0d) }, 961 { USB_DEVICE(0x07d1, 0x3c0e) }, 962 { USB_DEVICE(0x07d1, 0x3c0f) }, 963 { USB_DEVICE(0x07d1, 0x3c11) }, 964 { USB_DEVICE(0x07d1, 0x3c13) }, 965 { USB_DEVICE(0x07d1, 0x3c15) }, 966 { USB_DEVICE(0x07d1, 0x3c16) }, 967 { USB_DEVICE(0x2001, 0x3c1b) }, 968 /* Draytek */ 969 { USB_DEVICE(0x07fa, 0x7712) }, 970 /* DVICO */ 971 { USB_DEVICE(0x0fe9, 0xb307) }, 972 /* Edimax */ 973 { USB_DEVICE(0x7392, 0x4085) }, 974 { USB_DEVICE(0x7392, 0x7711) }, 975 { USB_DEVICE(0x7392, 0x7717) }, 976 { USB_DEVICE(0x7392, 0x7718) }, 977 { USB_DEVICE(0x7392, 0x7722) }, 978 /* Encore */ 979 { USB_DEVICE(0x203d, 0x1480) }, 980 { USB_DEVICE(0x203d, 0x14a9) }, 981 /* EnGenius */ 982 { USB_DEVICE(0x1740, 0x9701) }, 983 { USB_DEVICE(0x1740, 0x9702) }, 984 { USB_DEVICE(0x1740, 0x9703) }, 985 { USB_DEVICE(0x1740, 0x9705) }, 986 { USB_DEVICE(0x1740, 0x9706) }, 987 { USB_DEVICE(0x1740, 0x9707) }, 988 { USB_DEVICE(0x1740, 0x9708) }, 989 { USB_DEVICE(0x1740, 0x9709) }, 990 /* Gemtek */ 991 { USB_DEVICE(0x15a9, 0x0012) }, 992 /* Gigabyte */ 993 { USB_DEVICE(0x1044, 0x800b) }, 994 { USB_DEVICE(0x1044, 0x800d) }, 995 /* Hawking */ 996 { USB_DEVICE(0x0e66, 0x0001) }, 997 { USB_DEVICE(0x0e66, 0x0003) }, 998 { USB_DEVICE(0x0e66, 0x0009) }, 999 { USB_DEVICE(0x0e66, 0x000b) }, 1000 { USB_DEVICE(0x0e66, 0x0013) }, 1001 { USB_DEVICE(0x0e66, 0x0017) }, 1002 { USB_DEVICE(0x0e66, 0x0018) }, 1003 /* I-O DATA */ 1004 { USB_DEVICE(0x04bb, 0x0945) }, 1005 { USB_DEVICE(0x04bb, 0x0947) }, 1006 { USB_DEVICE(0x04bb, 0x0948) }, 1007 /* Linksys */ 1008 { USB_DEVICE(0x13b1, 0x0031) }, 1009 { USB_DEVICE(0x1737, 0x0070) }, 1010 { USB_DEVICE(0x1737, 0x0071) }, 1011 { USB_DEVICE(0x1737, 0x0077) }, 1012 { USB_DEVICE(0x1737, 0x0078) }, 1013 /* Logitec */ 1014 { USB_DEVICE(0x0789, 0x0162) }, 1015 { USB_DEVICE(0x0789, 0x0163) }, 1016 { USB_DEVICE(0x0789, 0x0164) }, 1017 { USB_DEVICE(0x0789, 0x0166) }, 1018 /* Motorola */ 1019 { USB_DEVICE(0x100d, 0x9031) }, 1020 /* MSI */ 1021 { USB_DEVICE(0x0db0, 0x3820) }, 1022 { USB_DEVICE(0x0db0, 0x3821) }, 1023 { USB_DEVICE(0x0db0, 0x3822) }, 1024 { USB_DEVICE(0x0db0, 0x3870) }, 1025 { USB_DEVICE(0x0db0, 0x3871) }, 1026 { USB_DEVICE(0x0db0, 0x6899) }, 1027 { USB_DEVICE(0x0db0, 0x821a) }, 1028 { USB_DEVICE(0x0db0, 0x822a) }, 1029 { USB_DEVICE(0x0db0, 0x822b) }, 1030 { USB_DEVICE(0x0db0, 0x822c) }, 1031 { USB_DEVICE(0x0db0, 0x870a) }, 1032 { USB_DEVICE(0x0db0, 0x871a) }, 1033 { USB_DEVICE(0x0db0, 0x871b) }, 1034 { USB_DEVICE(0x0db0, 0x871c) }, 1035 { USB_DEVICE(0x0db0, 0x899a) }, 1036 /* Ovislink */ 1037 { USB_DEVICE(0x1b75, 0x3071) }, 1038 { USB_DEVICE(0x1b75, 0x3072) }, 1039 /* Para */ 1040 { USB_DEVICE(0x20b8, 0x8888) }, 1041 /* Pegatron */ 1042 { USB_DEVICE(0x1d4d, 0x0002) }, 1043 { USB_DEVICE(0x1d4d, 0x000c) }, 1044 { USB_DEVICE(0x1d4d, 0x000e) }, 1045 { USB_DEVICE(0x1d4d, 0x0011) }, 1046 /* Philips */ 1047 { USB_DEVICE(0x0471, 0x200f) }, 1048 /* Planex */ 1049 { USB_DEVICE(0x2019, 0x5201) }, 1050 { USB_DEVICE(0x2019, 0xab25) }, 1051 { USB_DEVICE(0x2019, 0xed06) }, 1052 /* Quanta */ 1053 { USB_DEVICE(0x1a32, 0x0304) }, 1054 /* Ralink */ 1055 { USB_DEVICE(0x148f, 0x2070) }, 1056 { USB_DEVICE(0x148f, 0x2770) }, 1057 { USB_DEVICE(0x148f, 0x2870) }, 1058 { USB_DEVICE(0x148f, 0x3070) }, 1059 { USB_DEVICE(0x148f, 0x3071) }, 1060 { USB_DEVICE(0x148f, 0x3072) }, 1061 /* Samsung */ 1062 { USB_DEVICE(0x04e8, 0x2018) }, 1063 /* Siemens */ 1064 { USB_DEVICE(0x129b, 0x1828) }, 1065 /* Sitecom */ 1066 { USB_DEVICE(0x0df6, 0x0017) }, 1067 { USB_DEVICE(0x0df6, 0x002b) }, 1068 { USB_DEVICE(0x0df6, 0x002c) }, 1069 { USB_DEVICE(0x0df6, 0x002d) }, 1070 { USB_DEVICE(0x0df6, 0x0039) }, 1071 { USB_DEVICE(0x0df6, 0x003b) }, 1072 { USB_DEVICE(0x0df6, 0x003d) }, 1073 { USB_DEVICE(0x0df6, 0x003e) }, 1074 { USB_DEVICE(0x0df6, 0x003f) }, 1075 { USB_DEVICE(0x0df6, 0x0040) }, 1076 { USB_DEVICE(0x0df6, 0x0042) }, 1077 { USB_DEVICE(0x0df6, 0x0047) }, 1078 { USB_DEVICE(0x0df6, 0x0048) }, 1079 { USB_DEVICE(0x0df6, 0x0051) }, 1080 { USB_DEVICE(0x0df6, 0x005f) }, 1081 { USB_DEVICE(0x0df6, 0x0060) }, 1082 /* SMC */ 1083 { USB_DEVICE(0x083a, 0x6618) }, 1084 { USB_DEVICE(0x083a, 0x7511) }, 1085 { USB_DEVICE(0x083a, 0x7512) }, 1086 { USB_DEVICE(0x083a, 0x7522) }, 1087 { USB_DEVICE(0x083a, 0x8522) }, 1088 { USB_DEVICE(0x083a, 0xa618) }, 1089 { USB_DEVICE(0x083a, 0xa701) }, 1090 { USB_DEVICE(0x083a, 0xa702) }, 1091 { USB_DEVICE(0x083a, 0xa703) }, 1092 { USB_DEVICE(0x083a, 0xb522) }, 1093 /* Sparklan */ 1094 { USB_DEVICE(0x15a9, 0x0006) }, 1095 /* Sweex */ 1096 { USB_DEVICE(0x177f, 0x0153) }, 1097 { USB_DEVICE(0x177f, 0x0302) }, 1098 { USB_DEVICE(0x177f, 0x0313) }, 1099 /* U-Media */ 1100 { USB_DEVICE(0x157e, 0x300e) }, 1101 { USB_DEVICE(0x157e, 0x3013) }, 1102 /* ZCOM */ 1103 { USB_DEVICE(0x0cde, 0x0022) }, 1104 { USB_DEVICE(0x0cde, 0x0025) }, 1105 /* Zinwell */ 1106 { USB_DEVICE(0x5a57, 0x0280) }, 1107 { USB_DEVICE(0x5a57, 0x0282) }, 1108 { USB_DEVICE(0x5a57, 0x0283) }, 1109 { USB_DEVICE(0x5a57, 0x5257) }, 1110 /* Zyxel */ 1111 { USB_DEVICE(0x0586, 0x3416) }, 1112 { USB_DEVICE(0x0586, 0x3418) }, 1113 { USB_DEVICE(0x0586, 0x341e) }, 1114 { USB_DEVICE(0x0586, 0x343e) }, 1115#ifdef CONFIG_RT2800USB_RT33XX 1116 /* Belkin */ 1117 { USB_DEVICE(0x050d, 0x945b) }, 1118 /* D-Link */ 1119 { USB_DEVICE(0x2001, 0x3c17) }, 1120 /* Panasonic */ 1121 { USB_DEVICE(0x083a, 0xb511) }, 1122 /* Philips */ 1123 { USB_DEVICE(0x0471, 0x20dd) }, 1124 /* Ralink */ 1125 { USB_DEVICE(0x148f, 0x3370) }, 1126 { USB_DEVICE(0x148f, 0x8070) }, 1127 /* Sitecom */ 1128 { USB_DEVICE(0x0df6, 0x0050) }, 1129#endif 1130#ifdef CONFIG_RT2800USB_RT35XX 1131 /* Allwin */ 1132 { USB_DEVICE(0x8516, 0x3572) }, 1133 /* Askey */ 1134 { USB_DEVICE(0x1690, 0x0744) }, 1135 { USB_DEVICE(0x1690, 0x0761) }, 1136 { USB_DEVICE(0x1690, 0x0764) }, 1137 /* ASUS */ 1138 { USB_DEVICE(0x0b05, 0x179d) }, 1139 /* Cisco */ 1140 { USB_DEVICE(0x167b, 0x4001) }, 1141 /* EnGenius */ 1142 { USB_DEVICE(0x1740, 0x9801) }, 1143 /* I-O DATA */ 1144 { USB_DEVICE(0x04bb, 0x0944) }, 1145 /* Linksys */ 1146 { USB_DEVICE(0x13b1, 0x002f) }, 1147 { USB_DEVICE(0x1737, 0x0079) }, 1148 /* Ralink */ 1149 { USB_DEVICE(0x148f, 0x3572) }, 1150 /* Sitecom */ 1151 { USB_DEVICE(0x0df6, 0x0041) }, 1152 { USB_DEVICE(0x0df6, 0x0062) }, 1153 { USB_DEVICE(0x0df6, 0x0065) }, 1154 { USB_DEVICE(0x0df6, 0x0066) }, 1155 { USB_DEVICE(0x0df6, 0x0068) }, 1156 /* Toshiba */ 1157 { USB_DEVICE(0x0930, 0x0a07) }, 1158 /* Zinwell */ 1159 { USB_DEVICE(0x5a57, 0x0284) }, 1160#endif 1161#ifdef CONFIG_RT2800USB_RT53XX 1162 /* Arcadyan */ 1163 { USB_DEVICE(0x043e, 0x7a12) }, 1164 /* Azurewave */ 1165 { USB_DEVICE(0x13d3, 0x3329) }, 1166 { USB_DEVICE(0x13d3, 0x3365) }, 1167 /* D-Link */ 1168 { USB_DEVICE(0x2001, 0x3c15) }, 1169 { USB_DEVICE(0x2001, 0x3c19) }, 1170 { USB_DEVICE(0x2001, 0x3c1c) }, 1171 { USB_DEVICE(0x2001, 0x3c1d) }, 1172 /* LG innotek */ 1173 { USB_DEVICE(0x043e, 0x7a22) }, 1174 /* Panasonic */ 1175 { USB_DEVICE(0x04da, 0x1801) }, 1176 { USB_DEVICE(0x04da, 0x1800) }, 1177 /* Philips */ 1178 { USB_DEVICE(0x0471, 0x2104) }, 1179 /* Ralink */ 1180 { USB_DEVICE(0x148f, 0x5370) }, 1181 { USB_DEVICE(0x148f, 0x5372) }, 1182 /* Unknown */ 1183 { USB_DEVICE(0x04da, 0x23f6) }, 1184#endif 1185#ifdef CONFIG_RT2800USB_UNKNOWN 1186 /* 1187 * Unclear what kind of devices these are (they aren't supported by the 1188 * vendor linux driver). 1189 */ 1190 /* Abocom */ 1191 { USB_DEVICE(0x07b8, 0x3073) }, 1192 { USB_DEVICE(0x07b8, 0x3074) }, 1193 /* Alpha Networks */ 1194 { USB_DEVICE(0x14b2, 0x3c08) }, 1195 { USB_DEVICE(0x14b2, 0x3c11) }, 1196 /* Amigo */ 1197 { USB_DEVICE(0x0e0b, 0x9031) }, 1198 { USB_DEVICE(0x0e0b, 0x9041) }, 1199 /* ASUS */ 1200 { USB_DEVICE(0x0b05, 0x166a) }, 1201 { USB_DEVICE(0x0b05, 0x1760) }, 1202 { USB_DEVICE(0x0b05, 0x1761) }, 1203 { USB_DEVICE(0x0b05, 0x1790) }, 1204 /* AzureWave */ 1205 { USB_DEVICE(0x13d3, 0x3262) }, 1206 { USB_DEVICE(0x13d3, 0x3284) }, 1207 { USB_DEVICE(0x13d3, 0x3322) }, 1208 /* Belkin */ 1209 { USB_DEVICE(0x050d, 0x1003) }, 1210 /* Buffalo */ 1211 { USB_DEVICE(0x0411, 0x012e) }, 1212 { USB_DEVICE(0x0411, 0x0148) }, 1213 { USB_DEVICE(0x0411, 0x0150) }, 1214 /* Corega */ 1215 { USB_DEVICE(0x07aa, 0x0041) }, 1216 { USB_DEVICE(0x07aa, 0x0042) }, 1217 { USB_DEVICE(0x18c5, 0x0008) }, 1218 /* D-Link */ 1219 { USB_DEVICE(0x07d1, 0x3c0b) }, 1220 { USB_DEVICE(0x07d1, 0x3c17) }, 1221 /* Encore */ 1222 { USB_DEVICE(0x203d, 0x14a1) }, 1223 /* Gemtek */ 1224 { USB_DEVICE(0x15a9, 0x0010) }, 1225 /* Gigabyte */ 1226 { USB_DEVICE(0x1044, 0x800c) }, 1227 /* Huawei */ 1228 { USB_DEVICE(0x148f, 0xf101) }, 1229 /* I-O DATA */ 1230 { USB_DEVICE(0x04bb, 0x094b) }, 1231 /* LevelOne */ 1232 { USB_DEVICE(0x1740, 0x0605) }, 1233 { USB_DEVICE(0x1740, 0x0615) }, 1234 /* Logitec */ 1235 { USB_DEVICE(0x0789, 0x0168) }, 1236 { USB_DEVICE(0x0789, 0x0169) }, 1237 /* Motorola */ 1238 { USB_DEVICE(0x100d, 0x9032) }, 1239 /* Pegatron */ 1240 { USB_DEVICE(0x05a6, 0x0101) }, 1241 { USB_DEVICE(0x1d4d, 0x0010) }, 1242 /* Planex */ 1243 { USB_DEVICE(0x2019, 0xab24) }, 1244 /* Qcom */ 1245 { USB_DEVICE(0x18e8, 0x6259) }, 1246 /* RadioShack */ 1247 { USB_DEVICE(0x08b9, 0x1197) }, 1248 /* Sitecom */ 1249 { USB_DEVICE(0x0df6, 0x003c) }, 1250 { USB_DEVICE(0x0df6, 0x004a) }, 1251 { USB_DEVICE(0x0df6, 0x004d) }, 1252 { USB_DEVICE(0x0df6, 0x0053) }, 1253 /* SMC */ 1254 { USB_DEVICE(0x083a, 0xa512) }, 1255 { USB_DEVICE(0x083a, 0xc522) }, 1256 { USB_DEVICE(0x083a, 0xd522) }, 1257 { USB_DEVICE(0x083a, 0xf511) }, 1258 /* Zyxel */ 1259 { USB_DEVICE(0x0586, 0x341a) }, 1260#endif 1261 { 0, } 1262}; 1263 1264MODULE_AUTHOR(DRV_PROJECT); 1265MODULE_VERSION(DRV_VERSION); 1266MODULE_DESCRIPTION("Ralink RT2800 USB Wireless LAN driver."); 1267MODULE_SUPPORTED_DEVICE("Ralink RT2870 USB chipset based cards"); 1268MODULE_DEVICE_TABLE(usb, rt2800usb_device_table); 1269MODULE_FIRMWARE(FIRMWARE_RT2870); 1270MODULE_LICENSE("GPL"); 1271 1272static int rt2800usb_probe(struct usb_interface *usb_intf, 1273 const struct usb_device_id *id) 1274{ 1275 return rt2x00usb_probe(usb_intf, &rt2800usb_ops); 1276} 1277 1278static struct usb_driver rt2800usb_driver = { 1279 .name = KBUILD_MODNAME, 1280 .id_table = rt2800usb_device_table, 1281 .probe = rt2800usb_probe, 1282 .disconnect = rt2x00usb_disconnect, 1283 .suspend = rt2x00usb_suspend, 1284 .resume = rt2x00usb_resume, 1285 .reset_resume = rt2x00usb_resume, 1286 .disable_hub_initiated_lpm = 1, 1287}; 1288 1289module_usb_driver(rt2800usb_driver);