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 v2.6.39-rc4 1018 lines 35 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 int modparam_nohwcrypt; 49module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO); 50MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); 51 52/* 53 * Queue handlers. 54 */ 55static void rt2800usb_start_queue(struct data_queue *queue) 56{ 57 struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; 58 u32 reg; 59 60 switch (queue->qid) { 61 case QID_RX: 62 rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &reg); 63 rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 1); 64 rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); 65 break; 66 case QID_BEACON: 67 rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg); 68 rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 1); 69 rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 1); 70 rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 1); 71 rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg); 72 break; 73 default: 74 break; 75 } 76} 77 78static void rt2800usb_stop_queue(struct data_queue *queue) 79{ 80 struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; 81 u32 reg; 82 83 switch (queue->qid) { 84 case QID_RX: 85 rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &reg); 86 rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 0); 87 rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); 88 break; 89 case QID_BEACON: 90 rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg); 91 rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0); 92 rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0); 93 rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0); 94 rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg); 95 break; 96 default: 97 break; 98 } 99} 100 101/* 102 * Firmware functions 103 */ 104static char *rt2800usb_get_firmware_name(struct rt2x00_dev *rt2x00dev) 105{ 106 return FIRMWARE_RT2870; 107} 108 109static int rt2800usb_write_firmware(struct rt2x00_dev *rt2x00dev, 110 const u8 *data, const size_t len) 111{ 112 int status; 113 u32 offset; 114 u32 length; 115 116 /* 117 * Check which section of the firmware we need. 118 */ 119 if (rt2x00_rt(rt2x00dev, RT2860) || 120 rt2x00_rt(rt2x00dev, RT2872) || 121 rt2x00_rt(rt2x00dev, RT3070)) { 122 offset = 0; 123 length = 4096; 124 } else { 125 offset = 4096; 126 length = 4096; 127 } 128 129 /* 130 * Write firmware to device. 131 */ 132 rt2800_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE, 133 data + offset, length); 134 135 rt2800_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0); 136 rt2800_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0); 137 138 /* 139 * Send firmware request to device to load firmware, 140 * we need to specify a long timeout time. 141 */ 142 status = rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 143 0, USB_MODE_FIRMWARE, 144 REGISTER_TIMEOUT_FIRMWARE); 145 if (status < 0) { 146 ERROR(rt2x00dev, "Failed to write Firmware to device.\n"); 147 return status; 148 } 149 150 msleep(10); 151 rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0); 152 153 return 0; 154} 155 156/* 157 * Device state switch handlers. 158 */ 159static int rt2800usb_init_registers(struct rt2x00_dev *rt2x00dev) 160{ 161 u32 reg; 162 163 /* 164 * Wait until BBP and RF are ready. 165 */ 166 if (rt2800_wait_csr_ready(rt2x00dev)) 167 return -EBUSY; 168 169 rt2800_register_read(rt2x00dev, PBF_SYS_CTRL, &reg); 170 rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, reg & ~0x00002000); 171 172 rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003); 173 174 rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &reg); 175 rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_CSR, 1); 176 rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_BBP, 1); 177 rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); 178 179 rt2800_register_write(rt2x00dev, USB_DMA_CFG, 0x00000000); 180 181 rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0, 182 USB_MODE_RESET, REGISTER_TIMEOUT); 183 184 rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000); 185 186 return 0; 187} 188 189static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev) 190{ 191 u32 reg; 192 193 if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev))) 194 return -EIO; 195 196 rt2800_register_read(rt2x00dev, USB_DMA_CFG, &reg); 197 rt2x00_set_field32(&reg, USB_DMA_CFG_PHY_CLEAR, 0); 198 rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_AGG_EN, 0); 199 rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_AGG_TIMEOUT, 128); 200 /* 201 * Total room for RX frames in kilobytes, PBF might still exceed 202 * this limit so reduce the number to prevent errors. 203 */ 204 rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_AGG_LIMIT, 205 ((rt2x00dev->ops->rx->entry_num * DATA_FRAME_SIZE) 206 / 1024) - 3); 207 rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_EN, 1); 208 rt2x00_set_field32(&reg, USB_DMA_CFG_TX_BULK_EN, 1); 209 rt2800_register_write(rt2x00dev, USB_DMA_CFG, reg); 210 211 return rt2800_enable_radio(rt2x00dev); 212} 213 214static void rt2800usb_disable_radio(struct rt2x00_dev *rt2x00dev) 215{ 216 rt2800_disable_radio(rt2x00dev); 217 rt2x00usb_disable_radio(rt2x00dev); 218} 219 220static int rt2800usb_set_state(struct rt2x00_dev *rt2x00dev, 221 enum dev_state state) 222{ 223 if (state == STATE_AWAKE) 224 rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, 0xff, 0, 2); 225 else 226 rt2800_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0xff, 2); 227 228 return 0; 229} 230 231static int rt2800usb_set_device_state(struct rt2x00_dev *rt2x00dev, 232 enum dev_state state) 233{ 234 int retval = 0; 235 236 switch (state) { 237 case STATE_RADIO_ON: 238 /* 239 * Before the radio can be enabled, the device first has 240 * to be woken up. After that it needs a bit of time 241 * to be fully awake and then the radio can be enabled. 242 */ 243 rt2800usb_set_state(rt2x00dev, STATE_AWAKE); 244 msleep(1); 245 retval = rt2800usb_enable_radio(rt2x00dev); 246 break; 247 case STATE_RADIO_OFF: 248 /* 249 * After the radio has been disabled, the device should 250 * be put to sleep for powersaving. 251 */ 252 rt2800usb_disable_radio(rt2x00dev); 253 rt2800usb_set_state(rt2x00dev, STATE_SLEEP); 254 break; 255 case STATE_RADIO_IRQ_ON: 256 case STATE_RADIO_IRQ_OFF: 257 /* No support, but no error either */ 258 break; 259 case STATE_DEEP_SLEEP: 260 case STATE_SLEEP: 261 case STATE_STANDBY: 262 case STATE_AWAKE: 263 retval = rt2800usb_set_state(rt2x00dev, state); 264 break; 265 default: 266 retval = -ENOTSUPP; 267 break; 268 } 269 270 if (unlikely(retval)) 271 ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n", 272 state, retval); 273 274 return retval; 275} 276 277/* 278 * Watchdog handlers 279 */ 280static void rt2800usb_watchdog(struct rt2x00_dev *rt2x00dev) 281{ 282 unsigned int i; 283 u32 reg; 284 285 rt2800_register_read(rt2x00dev, TXRXQ_PCNT, &reg); 286 if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q)) { 287 WARNING(rt2x00dev, "TX HW queue 0 timed out," 288 " invoke forced kick\n"); 289 290 rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40012); 291 292 for (i = 0; i < 10; i++) { 293 udelay(10); 294 if (!rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q)) 295 break; 296 } 297 298 rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006); 299 } 300 301 rt2800_register_read(rt2x00dev, TXRXQ_PCNT, &reg); 302 if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q)) { 303 WARNING(rt2x00dev, "TX HW queue 1 timed out," 304 " invoke forced kick\n"); 305 306 rt2800_register_write(rt2x00dev, PBF_CFG, 0xf4000a); 307 308 for (i = 0; i < 10; i++) { 309 udelay(10); 310 if (!rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q)) 311 break; 312 } 313 314 rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006); 315 } 316 317 rt2x00usb_watchdog(rt2x00dev); 318} 319 320/* 321 * TX descriptor initialization 322 */ 323static __le32 *rt2800usb_get_txwi(struct queue_entry *entry) 324{ 325 if (entry->queue->qid == QID_BEACON) 326 return (__le32 *) (entry->skb->data); 327 else 328 return (__le32 *) (entry->skb->data + TXINFO_DESC_SIZE); 329} 330 331static void rt2800usb_write_tx_desc(struct queue_entry *entry, 332 struct txentry_desc *txdesc) 333{ 334 struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); 335 __le32 *txi = (__le32 *) entry->skb->data; 336 u32 word; 337 338 /* 339 * Initialize TXINFO descriptor 340 */ 341 rt2x00_desc_read(txi, 0, &word); 342 343 /* 344 * The size of TXINFO_W0_USB_DMA_TX_PKT_LEN is 345 * TXWI + 802.11 header + L2 pad + payload + pad, 346 * so need to decrease size of TXINFO and USB end pad. 347 */ 348 rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_TX_PKT_LEN, 349 entry->skb->len - TXINFO_DESC_SIZE - 4); 350 rt2x00_set_field32(&word, TXINFO_W0_WIV, 351 !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags)); 352 rt2x00_set_field32(&word, TXINFO_W0_QSEL, 2); 353 rt2x00_set_field32(&word, TXINFO_W0_SW_USE_LAST_ROUND, 0); 354 rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_NEXT_VALID, 0); 355 rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_TX_BURST, 356 test_bit(ENTRY_TXD_BURST, &txdesc->flags)); 357 rt2x00_desc_write(txi, 0, word); 358 359 /* 360 * Register descriptor details in skb frame descriptor. 361 */ 362 skbdesc->flags |= SKBDESC_DESC_IN_SKB; 363 skbdesc->desc = txi; 364 skbdesc->desc_len = TXINFO_DESC_SIZE + TXWI_DESC_SIZE; 365} 366 367static void rt2800usb_write_tx_data(struct queue_entry *entry, 368 struct txentry_desc *txdesc) 369{ 370 unsigned int len; 371 int err; 372 373 rt2800_write_tx_data(entry, txdesc); 374 375 /* 376 * pad(1~3 bytes) is added after each 802.11 payload. 377 * USB end pad(4 bytes) is added at each USB bulk out packet end. 378 * TX frame format is : 379 * | TXINFO | TXWI | 802.11 header | L2 pad | payload | pad | USB end pad | 380 * |<------------- tx_pkt_len ------------->| 381 */ 382 len = roundup(entry->skb->len, 4) + 4; 383 err = skb_padto(entry->skb, len); 384 if (unlikely(err)) { 385 WARNING(entry->queue->rt2x00dev, "TX SKB padding error, out of memory\n"); 386 return; 387 } 388 389 entry->skb->len = len; 390} 391 392/* 393 * TX data initialization 394 */ 395static int rt2800usb_get_tx_data_len(struct queue_entry *entry) 396{ 397 return entry->skb->len; 398} 399 400/* 401 * TX control handlers 402 */ 403static void rt2800usb_work_txdone(struct work_struct *work) 404{ 405 struct rt2x00_dev *rt2x00dev = 406 container_of(work, struct rt2x00_dev, txdone_work); 407 struct data_queue *queue; 408 struct queue_entry *entry; 409 410 rt2800_txdone(rt2x00dev); 411 412 /* 413 * Process any trailing TX status reports for IO failures, 414 * we loop until we find the first non-IO error entry. This 415 * can either be a frame which is free, is being uploaded, 416 * or has completed the upload but didn't have an entry 417 * in the TX_STAT_FIFO register yet. 418 */ 419 tx_queue_for_each(rt2x00dev, queue) { 420 while (!rt2x00queue_empty(queue)) { 421 entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); 422 423 if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || 424 !test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) 425 break; 426 427 rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE); 428 } 429 } 430} 431 432/* 433 * RX control handlers 434 */ 435static void rt2800usb_fill_rxdone(struct queue_entry *entry, 436 struct rxdone_entry_desc *rxdesc) 437{ 438 struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); 439 __le32 *rxi = (__le32 *)entry->skb->data; 440 __le32 *rxd; 441 u32 word; 442 int rx_pkt_len; 443 444 /* 445 * Copy descriptor to the skbdesc->desc buffer, making it safe from 446 * moving of frame data in rt2x00usb. 447 */ 448 memcpy(skbdesc->desc, rxi, skbdesc->desc_len); 449 450 /* 451 * RX frame format is : 452 * | RXINFO | RXWI | header | L2 pad | payload | pad | RXD | USB pad | 453 * |<------------ rx_pkt_len -------------->| 454 */ 455 rt2x00_desc_read(rxi, 0, &word); 456 rx_pkt_len = rt2x00_get_field32(word, RXINFO_W0_USB_DMA_RX_PKT_LEN); 457 458 /* 459 * Remove the RXINFO structure from the sbk. 460 */ 461 skb_pull(entry->skb, RXINFO_DESC_SIZE); 462 463 /* 464 * FIXME: we need to check for rx_pkt_len validity 465 */ 466 rxd = (__le32 *)(entry->skb->data + rx_pkt_len); 467 468 /* 469 * It is now safe to read the descriptor on all architectures. 470 */ 471 rt2x00_desc_read(rxd, 0, &word); 472 473 if (rt2x00_get_field32(word, RXD_W0_CRC_ERROR)) 474 rxdesc->flags |= RX_FLAG_FAILED_FCS_CRC; 475 476 rxdesc->cipher_status = rt2x00_get_field32(word, RXD_W0_CIPHER_ERROR); 477 478 if (rt2x00_get_field32(word, RXD_W0_DECRYPTED)) { 479 /* 480 * Hardware has stripped IV/EIV data from 802.11 frame during 481 * decryption. Unfortunately the descriptor doesn't contain 482 * any fields with the EIV/IV data either, so they can't 483 * be restored by rt2x00lib. 484 */ 485 rxdesc->flags |= RX_FLAG_IV_STRIPPED; 486 487 /* 488 * The hardware has already checked the Michael Mic and has 489 * stripped it from the frame. Signal this to mac80211. 490 */ 491 rxdesc->flags |= RX_FLAG_MMIC_STRIPPED; 492 493 if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS) 494 rxdesc->flags |= RX_FLAG_DECRYPTED; 495 else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC) 496 rxdesc->flags |= RX_FLAG_MMIC_ERROR; 497 } 498 499 if (rt2x00_get_field32(word, RXD_W0_MY_BSS)) 500 rxdesc->dev_flags |= RXDONE_MY_BSS; 501 502 if (rt2x00_get_field32(word, RXD_W0_L2PAD)) 503 rxdesc->dev_flags |= RXDONE_L2PAD; 504 505 /* 506 * Remove RXD descriptor from end of buffer. 507 */ 508 skb_trim(entry->skb, rx_pkt_len); 509 510 /* 511 * Process the RXWI structure. 512 */ 513 rt2800_process_rxwi(entry, rxdesc); 514} 515 516/* 517 * Device probe functions. 518 */ 519static int rt2800usb_validate_eeprom(struct rt2x00_dev *rt2x00dev) 520{ 521 if (rt2800_efuse_detect(rt2x00dev)) 522 rt2800_read_eeprom_efuse(rt2x00dev); 523 else 524 rt2x00usb_eeprom_read(rt2x00dev, rt2x00dev->eeprom, 525 EEPROM_SIZE); 526 527 return rt2800_validate_eeprom(rt2x00dev); 528} 529 530static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev) 531{ 532 int retval; 533 534 /* 535 * Allocate eeprom data. 536 */ 537 retval = rt2800usb_validate_eeprom(rt2x00dev); 538 if (retval) 539 return retval; 540 541 retval = rt2800_init_eeprom(rt2x00dev); 542 if (retval) 543 return retval; 544 545 /* 546 * Initialize hw specifications. 547 */ 548 retval = rt2800_probe_hw_mode(rt2x00dev); 549 if (retval) 550 return retval; 551 552 /* 553 * This device has multiple filters for control frames 554 * and has a separate filter for PS Poll frames. 555 */ 556 __set_bit(DRIVER_SUPPORT_CONTROL_FILTERS, &rt2x00dev->flags); 557 __set_bit(DRIVER_SUPPORT_CONTROL_FILTER_PSPOLL, &rt2x00dev->flags); 558 559 /* 560 * This device requires firmware. 561 */ 562 __set_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags); 563 __set_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags); 564 if (!modparam_nohwcrypt) 565 __set_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags); 566 __set_bit(DRIVER_SUPPORT_LINK_TUNING, &rt2x00dev->flags); 567 __set_bit(DRIVER_SUPPORT_WATCHDOG, &rt2x00dev->flags); 568 __set_bit(DRIVER_REQUIRE_HT_TX_DESC, &rt2x00dev->flags); 569 570 /* 571 * Set the rssi offset. 572 */ 573 rt2x00dev->rssi_offset = DEFAULT_RSSI_OFFSET; 574 575 /* 576 * Overwrite TX done handler 577 */ 578 PREPARE_WORK(&rt2x00dev->txdone_work, rt2800usb_work_txdone); 579 580 return 0; 581} 582 583static const struct ieee80211_ops rt2800usb_mac80211_ops = { 584 .tx = rt2x00mac_tx, 585 .start = rt2x00mac_start, 586 .stop = rt2x00mac_stop, 587 .add_interface = rt2x00mac_add_interface, 588 .remove_interface = rt2x00mac_remove_interface, 589 .config = rt2x00mac_config, 590 .configure_filter = rt2x00mac_configure_filter, 591 .set_tim = rt2x00mac_set_tim, 592 .set_key = rt2x00mac_set_key, 593 .sw_scan_start = rt2x00mac_sw_scan_start, 594 .sw_scan_complete = rt2x00mac_sw_scan_complete, 595 .get_stats = rt2x00mac_get_stats, 596 .get_tkip_seq = rt2800_get_tkip_seq, 597 .set_rts_threshold = rt2800_set_rts_threshold, 598 .bss_info_changed = rt2x00mac_bss_info_changed, 599 .conf_tx = rt2800_conf_tx, 600 .get_tsf = rt2800_get_tsf, 601 .rfkill_poll = rt2x00mac_rfkill_poll, 602 .ampdu_action = rt2800_ampdu_action, 603 .flush = rt2x00mac_flush, 604 .get_survey = rt2800_get_survey, 605}; 606 607static const struct rt2800_ops rt2800usb_rt2800_ops = { 608 .register_read = rt2x00usb_register_read, 609 .register_read_lock = rt2x00usb_register_read_lock, 610 .register_write = rt2x00usb_register_write, 611 .register_write_lock = rt2x00usb_register_write_lock, 612 .register_multiread = rt2x00usb_register_multiread, 613 .register_multiwrite = rt2x00usb_register_multiwrite, 614 .regbusy_read = rt2x00usb_regbusy_read, 615 .drv_write_firmware = rt2800usb_write_firmware, 616 .drv_init_registers = rt2800usb_init_registers, 617 .drv_get_txwi = rt2800usb_get_txwi, 618}; 619 620static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = { 621 .probe_hw = rt2800usb_probe_hw, 622 .get_firmware_name = rt2800usb_get_firmware_name, 623 .check_firmware = rt2800_check_firmware, 624 .load_firmware = rt2800_load_firmware, 625 .initialize = rt2x00usb_initialize, 626 .uninitialize = rt2x00usb_uninitialize, 627 .clear_entry = rt2x00usb_clear_entry, 628 .set_device_state = rt2800usb_set_device_state, 629 .rfkill_poll = rt2800_rfkill_poll, 630 .link_stats = rt2800_link_stats, 631 .reset_tuner = rt2800_reset_tuner, 632 .link_tuner = rt2800_link_tuner, 633 .watchdog = rt2800usb_watchdog, 634 .start_queue = rt2800usb_start_queue, 635 .kick_queue = rt2x00usb_kick_queue, 636 .stop_queue = rt2800usb_stop_queue, 637 .flush_queue = rt2x00usb_flush_queue, 638 .write_tx_desc = rt2800usb_write_tx_desc, 639 .write_tx_data = rt2800usb_write_tx_data, 640 .write_beacon = rt2800_write_beacon, 641 .clear_beacon = rt2800_clear_beacon, 642 .get_tx_data_len = rt2800usb_get_tx_data_len, 643 .fill_rxdone = rt2800usb_fill_rxdone, 644 .config_shared_key = rt2800_config_shared_key, 645 .config_pairwise_key = rt2800_config_pairwise_key, 646 .config_filter = rt2800_config_filter, 647 .config_intf = rt2800_config_intf, 648 .config_erp = rt2800_config_erp, 649 .config_ant = rt2800_config_ant, 650 .config = rt2800_config, 651}; 652 653static const struct data_queue_desc rt2800usb_queue_rx = { 654 .entry_num = 128, 655 .data_size = AGGREGATION_SIZE, 656 .desc_size = RXINFO_DESC_SIZE + RXWI_DESC_SIZE, 657 .priv_size = sizeof(struct queue_entry_priv_usb), 658}; 659 660static const struct data_queue_desc rt2800usb_queue_tx = { 661 .entry_num = 64, 662 .data_size = AGGREGATION_SIZE, 663 .desc_size = TXINFO_DESC_SIZE + TXWI_DESC_SIZE, 664 .priv_size = sizeof(struct queue_entry_priv_usb), 665}; 666 667static const struct data_queue_desc rt2800usb_queue_bcn = { 668 .entry_num = 8, 669 .data_size = MGMT_FRAME_SIZE, 670 .desc_size = TXINFO_DESC_SIZE + TXWI_DESC_SIZE, 671 .priv_size = sizeof(struct queue_entry_priv_usb), 672}; 673 674static const struct rt2x00_ops rt2800usb_ops = { 675 .name = KBUILD_MODNAME, 676 .max_sta_intf = 1, 677 .max_ap_intf = 8, 678 .eeprom_size = EEPROM_SIZE, 679 .rf_size = RF_SIZE, 680 .tx_queues = NUM_TX_QUEUES, 681 .extra_tx_headroom = TXINFO_DESC_SIZE + TXWI_DESC_SIZE, 682 .rx = &rt2800usb_queue_rx, 683 .tx = &rt2800usb_queue_tx, 684 .bcn = &rt2800usb_queue_bcn, 685 .lib = &rt2800usb_rt2x00_ops, 686 .drv = &rt2800usb_rt2800_ops, 687 .hw = &rt2800usb_mac80211_ops, 688#ifdef CONFIG_RT2X00_LIB_DEBUGFS 689 .debugfs = &rt2800_rt2x00debug, 690#endif /* CONFIG_RT2X00_LIB_DEBUGFS */ 691}; 692 693/* 694 * rt2800usb module information. 695 */ 696static struct usb_device_id rt2800usb_device_table[] = { 697 /* Abocom */ 698 { USB_DEVICE(0x07b8, 0x2870), USB_DEVICE_DATA(&rt2800usb_ops) }, 699 { USB_DEVICE(0x07b8, 0x2770), USB_DEVICE_DATA(&rt2800usb_ops) }, 700 { USB_DEVICE(0x07b8, 0x3070), USB_DEVICE_DATA(&rt2800usb_ops) }, 701 { USB_DEVICE(0x07b8, 0x3071), USB_DEVICE_DATA(&rt2800usb_ops) }, 702 { USB_DEVICE(0x07b8, 0x3072), USB_DEVICE_DATA(&rt2800usb_ops) }, 703 { USB_DEVICE(0x1482, 0x3c09), USB_DEVICE_DATA(&rt2800usb_ops) }, 704 /* AirTies */ 705 { USB_DEVICE(0x1eda, 0x2310), USB_DEVICE_DATA(&rt2800usb_ops) }, 706 /* Allwin */ 707 { USB_DEVICE(0x8516, 0x2070), USB_DEVICE_DATA(&rt2800usb_ops) }, 708 { USB_DEVICE(0x8516, 0x2770), USB_DEVICE_DATA(&rt2800usb_ops) }, 709 { USB_DEVICE(0x8516, 0x2870), USB_DEVICE_DATA(&rt2800usb_ops) }, 710 { USB_DEVICE(0x8516, 0x3070), USB_DEVICE_DATA(&rt2800usb_ops) }, 711 { USB_DEVICE(0x8516, 0x3071), USB_DEVICE_DATA(&rt2800usb_ops) }, 712 { USB_DEVICE(0x8516, 0x3072), USB_DEVICE_DATA(&rt2800usb_ops) }, 713 /* Amit */ 714 { USB_DEVICE(0x15c5, 0x0008), USB_DEVICE_DATA(&rt2800usb_ops) }, 715 /* Askey */ 716 { USB_DEVICE(0x1690, 0x0740), USB_DEVICE_DATA(&rt2800usb_ops) }, 717 /* ASUS */ 718 { USB_DEVICE(0x0b05, 0x1731), USB_DEVICE_DATA(&rt2800usb_ops) }, 719 { USB_DEVICE(0x0b05, 0x1732), USB_DEVICE_DATA(&rt2800usb_ops) }, 720 { USB_DEVICE(0x0b05, 0x1742), USB_DEVICE_DATA(&rt2800usb_ops) }, 721 { USB_DEVICE(0x0b05, 0x1784), USB_DEVICE_DATA(&rt2800usb_ops) }, 722 { USB_DEVICE(0x1761, 0x0b05), USB_DEVICE_DATA(&rt2800usb_ops) }, 723 /* AzureWave */ 724 { USB_DEVICE(0x13d3, 0x3247), USB_DEVICE_DATA(&rt2800usb_ops) }, 725 { USB_DEVICE(0x13d3, 0x3273), USB_DEVICE_DATA(&rt2800usb_ops) }, 726 { USB_DEVICE(0x13d3, 0x3305), USB_DEVICE_DATA(&rt2800usb_ops) }, 727 { USB_DEVICE(0x13d3, 0x3307), USB_DEVICE_DATA(&rt2800usb_ops) }, 728 { USB_DEVICE(0x13d3, 0x3321), USB_DEVICE_DATA(&rt2800usb_ops) }, 729 /* Belkin */ 730 { USB_DEVICE(0x050d, 0x8053), USB_DEVICE_DATA(&rt2800usb_ops) }, 731 { USB_DEVICE(0x050d, 0x805c), USB_DEVICE_DATA(&rt2800usb_ops) }, 732 { USB_DEVICE(0x050d, 0x815c), USB_DEVICE_DATA(&rt2800usb_ops) }, 733 { USB_DEVICE(0x050d, 0x825b), USB_DEVICE_DATA(&rt2800usb_ops) }, 734 { USB_DEVICE(0x050d, 0x935a), USB_DEVICE_DATA(&rt2800usb_ops) }, 735 { USB_DEVICE(0x050d, 0x935b), USB_DEVICE_DATA(&rt2800usb_ops) }, 736 /* Buffalo */ 737 { USB_DEVICE(0x0411, 0x00e8), USB_DEVICE_DATA(&rt2800usb_ops) }, 738 { USB_DEVICE(0x0411, 0x016f), USB_DEVICE_DATA(&rt2800usb_ops) }, 739 /* Conceptronic */ 740 { USB_DEVICE(0x14b2, 0x3c06), USB_DEVICE_DATA(&rt2800usb_ops) }, 741 { USB_DEVICE(0x14b2, 0x3c07), USB_DEVICE_DATA(&rt2800usb_ops) }, 742 { USB_DEVICE(0x14b2, 0x3c09), USB_DEVICE_DATA(&rt2800usb_ops) }, 743 { USB_DEVICE(0x14b2, 0x3c12), USB_DEVICE_DATA(&rt2800usb_ops) }, 744 { USB_DEVICE(0x14b2, 0x3c23), USB_DEVICE_DATA(&rt2800usb_ops) }, 745 { USB_DEVICE(0x14b2, 0x3c25), USB_DEVICE_DATA(&rt2800usb_ops) }, 746 { USB_DEVICE(0x14b2, 0x3c27), USB_DEVICE_DATA(&rt2800usb_ops) }, 747 { USB_DEVICE(0x14b2, 0x3c28), USB_DEVICE_DATA(&rt2800usb_ops) }, 748 /* Corega */ 749 { USB_DEVICE(0x07aa, 0x002f), USB_DEVICE_DATA(&rt2800usb_ops) }, 750 { USB_DEVICE(0x07aa, 0x003c), USB_DEVICE_DATA(&rt2800usb_ops) }, 751 { USB_DEVICE(0x07aa, 0x003f), USB_DEVICE_DATA(&rt2800usb_ops) }, 752 { USB_DEVICE(0x18c5, 0x0012), USB_DEVICE_DATA(&rt2800usb_ops) }, 753 /* D-Link */ 754 { USB_DEVICE(0x07d1, 0x3c09), USB_DEVICE_DATA(&rt2800usb_ops) }, 755 { USB_DEVICE(0x07d1, 0x3c0a), USB_DEVICE_DATA(&rt2800usb_ops) }, 756 { USB_DEVICE(0x07d1, 0x3c0d), USB_DEVICE_DATA(&rt2800usb_ops) }, 757 { USB_DEVICE(0x07d1, 0x3c0e), USB_DEVICE_DATA(&rt2800usb_ops) }, 758 { USB_DEVICE(0x07d1, 0x3c0f), USB_DEVICE_DATA(&rt2800usb_ops) }, 759 { USB_DEVICE(0x07d1, 0x3c11), USB_DEVICE_DATA(&rt2800usb_ops) }, 760 { USB_DEVICE(0x07d1, 0x3c16), USB_DEVICE_DATA(&rt2800usb_ops) }, 761 /* Draytek */ 762 { USB_DEVICE(0x07fa, 0x7712), USB_DEVICE_DATA(&rt2800usb_ops) }, 763 /* Edimax */ 764 { USB_DEVICE(0x7392, 0x7711), USB_DEVICE_DATA(&rt2800usb_ops) }, 765 { USB_DEVICE(0x7392, 0x7717), USB_DEVICE_DATA(&rt2800usb_ops) }, 766 { USB_DEVICE(0x7392, 0x7718), USB_DEVICE_DATA(&rt2800usb_ops) }, 767 /* Encore */ 768 { USB_DEVICE(0x203d, 0x1480), USB_DEVICE_DATA(&rt2800usb_ops) }, 769 { USB_DEVICE(0x203d, 0x14a9), USB_DEVICE_DATA(&rt2800usb_ops) }, 770 /* EnGenius */ 771 { USB_DEVICE(0x1740, 0x9701), USB_DEVICE_DATA(&rt2800usb_ops) }, 772 { USB_DEVICE(0x1740, 0x9702), USB_DEVICE_DATA(&rt2800usb_ops) }, 773 { USB_DEVICE(0x1740, 0x9703), USB_DEVICE_DATA(&rt2800usb_ops) }, 774 { USB_DEVICE(0x1740, 0x9705), USB_DEVICE_DATA(&rt2800usb_ops) }, 775 { USB_DEVICE(0x1740, 0x9706), USB_DEVICE_DATA(&rt2800usb_ops) }, 776 { USB_DEVICE(0x1740, 0x9707), USB_DEVICE_DATA(&rt2800usb_ops) }, 777 { USB_DEVICE(0x1740, 0x9708), USB_DEVICE_DATA(&rt2800usb_ops) }, 778 { USB_DEVICE(0x1740, 0x9709), USB_DEVICE_DATA(&rt2800usb_ops) }, 779 /* Gigabyte */ 780 { USB_DEVICE(0x1044, 0x800b), USB_DEVICE_DATA(&rt2800usb_ops) }, 781 { USB_DEVICE(0x1044, 0x800d), USB_DEVICE_DATA(&rt2800usb_ops) }, 782 /* Hawking */ 783 { USB_DEVICE(0x0e66, 0x0001), USB_DEVICE_DATA(&rt2800usb_ops) }, 784 { USB_DEVICE(0x0e66, 0x0003), USB_DEVICE_DATA(&rt2800usb_ops) }, 785 { USB_DEVICE(0x0e66, 0x0009), USB_DEVICE_DATA(&rt2800usb_ops) }, 786 { USB_DEVICE(0x0e66, 0x000b), USB_DEVICE_DATA(&rt2800usb_ops) }, 787 { USB_DEVICE(0x0e66, 0x0013), USB_DEVICE_DATA(&rt2800usb_ops) }, 788 { USB_DEVICE(0x0e66, 0x0017), USB_DEVICE_DATA(&rt2800usb_ops) }, 789 { USB_DEVICE(0x0e66, 0x0018), USB_DEVICE_DATA(&rt2800usb_ops) }, 790 /* I-O DATA */ 791 { USB_DEVICE(0x04bb, 0x0945), USB_DEVICE_DATA(&rt2800usb_ops) }, 792 { USB_DEVICE(0x04bb, 0x0947), USB_DEVICE_DATA(&rt2800usb_ops) }, 793 { USB_DEVICE(0x04bb, 0x0948), USB_DEVICE_DATA(&rt2800usb_ops) }, 794 /* Linksys */ 795 { USB_DEVICE(0x1737, 0x0070), USB_DEVICE_DATA(&rt2800usb_ops) }, 796 { USB_DEVICE(0x1737, 0x0071), USB_DEVICE_DATA(&rt2800usb_ops) }, 797 /* Logitec */ 798 { USB_DEVICE(0x0789, 0x0162), USB_DEVICE_DATA(&rt2800usb_ops) }, 799 { USB_DEVICE(0x0789, 0x0163), USB_DEVICE_DATA(&rt2800usb_ops) }, 800 { USB_DEVICE(0x0789, 0x0164), USB_DEVICE_DATA(&rt2800usb_ops) }, 801 { USB_DEVICE(0x0789, 0x0166), USB_DEVICE_DATA(&rt2800usb_ops) }, 802 /* Motorola */ 803 { USB_DEVICE(0x100d, 0x9031), USB_DEVICE_DATA(&rt2800usb_ops) }, 804 /* MSI */ 805 { USB_DEVICE(0x0db0, 0x3820), USB_DEVICE_DATA(&rt2800usb_ops) }, 806 { USB_DEVICE(0x0db0, 0x3821), USB_DEVICE_DATA(&rt2800usb_ops) }, 807 { USB_DEVICE(0x0db0, 0x3822), USB_DEVICE_DATA(&rt2800usb_ops) }, 808 { USB_DEVICE(0x0db0, 0x3870), USB_DEVICE_DATA(&rt2800usb_ops) }, 809 { USB_DEVICE(0x0db0, 0x3871), USB_DEVICE_DATA(&rt2800usb_ops) }, 810 { USB_DEVICE(0x0db0, 0x6899), USB_DEVICE_DATA(&rt2800usb_ops) }, 811 { USB_DEVICE(0x0db0, 0x821a), USB_DEVICE_DATA(&rt2800usb_ops) }, 812 { USB_DEVICE(0x0db0, 0x822a), USB_DEVICE_DATA(&rt2800usb_ops) }, 813 { USB_DEVICE(0x0db0, 0x822b), USB_DEVICE_DATA(&rt2800usb_ops) }, 814 { USB_DEVICE(0x0db0, 0x822c), USB_DEVICE_DATA(&rt2800usb_ops) }, 815 { USB_DEVICE(0x0db0, 0x870a), USB_DEVICE_DATA(&rt2800usb_ops) }, 816 { USB_DEVICE(0x0db0, 0x871a), USB_DEVICE_DATA(&rt2800usb_ops) }, 817 { USB_DEVICE(0x0db0, 0x871b), USB_DEVICE_DATA(&rt2800usb_ops) }, 818 { USB_DEVICE(0x0db0, 0x871c), USB_DEVICE_DATA(&rt2800usb_ops) }, 819 { USB_DEVICE(0x0db0, 0x899a), USB_DEVICE_DATA(&rt2800usb_ops) }, 820 /* Para */ 821 { USB_DEVICE(0x20b8, 0x8888), USB_DEVICE_DATA(&rt2800usb_ops) }, 822 /* Pegatron */ 823 { USB_DEVICE(0x1d4d, 0x000c), USB_DEVICE_DATA(&rt2800usb_ops) }, 824 { USB_DEVICE(0x1d4d, 0x000e), USB_DEVICE_DATA(&rt2800usb_ops) }, 825 { USB_DEVICE(0x1d4d, 0x0011), USB_DEVICE_DATA(&rt2800usb_ops) }, 826 /* Philips */ 827 { USB_DEVICE(0x0471, 0x200f), USB_DEVICE_DATA(&rt2800usb_ops) }, 828 /* Planex */ 829 { USB_DEVICE(0x2019, 0xab25), USB_DEVICE_DATA(&rt2800usb_ops) }, 830 { USB_DEVICE(0x2019, 0xed06), USB_DEVICE_DATA(&rt2800usb_ops) }, 831 /* Quanta */ 832 { USB_DEVICE(0x1a32, 0x0304), USB_DEVICE_DATA(&rt2800usb_ops) }, 833 /* Ralink */ 834 { USB_DEVICE(0x148f, 0x2070), USB_DEVICE_DATA(&rt2800usb_ops) }, 835 { USB_DEVICE(0x148f, 0x2770), USB_DEVICE_DATA(&rt2800usb_ops) }, 836 { USB_DEVICE(0x148f, 0x2870), USB_DEVICE_DATA(&rt2800usb_ops) }, 837 { USB_DEVICE(0x148f, 0x3070), USB_DEVICE_DATA(&rt2800usb_ops) }, 838 { USB_DEVICE(0x148f, 0x3071), USB_DEVICE_DATA(&rt2800usb_ops) }, 839 { USB_DEVICE(0x148f, 0x3072), USB_DEVICE_DATA(&rt2800usb_ops) }, 840 /* Samsung */ 841 { USB_DEVICE(0x04e8, 0x2018), USB_DEVICE_DATA(&rt2800usb_ops) }, 842 /* Siemens */ 843 { USB_DEVICE(0x129b, 0x1828), USB_DEVICE_DATA(&rt2800usb_ops) }, 844 /* Sitecom */ 845 { USB_DEVICE(0x0df6, 0x0017), USB_DEVICE_DATA(&rt2800usb_ops) }, 846 { USB_DEVICE(0x0df6, 0x002b), USB_DEVICE_DATA(&rt2800usb_ops) }, 847 { USB_DEVICE(0x0df6, 0x002c), USB_DEVICE_DATA(&rt2800usb_ops) }, 848 { USB_DEVICE(0x0df6, 0x002d), USB_DEVICE_DATA(&rt2800usb_ops) }, 849 { USB_DEVICE(0x0df6, 0x0039), USB_DEVICE_DATA(&rt2800usb_ops) }, 850 { USB_DEVICE(0x0df6, 0x003b), USB_DEVICE_DATA(&rt2800usb_ops) }, 851 { USB_DEVICE(0x0df6, 0x003d), USB_DEVICE_DATA(&rt2800usb_ops) }, 852 { USB_DEVICE(0x0df6, 0x003e), USB_DEVICE_DATA(&rt2800usb_ops) }, 853 { USB_DEVICE(0x0df6, 0x003f), USB_DEVICE_DATA(&rt2800usb_ops) }, 854 { USB_DEVICE(0x0df6, 0x0040), USB_DEVICE_DATA(&rt2800usb_ops) }, 855 { USB_DEVICE(0x0df6, 0x0042), USB_DEVICE_DATA(&rt2800usb_ops) }, 856 { USB_DEVICE(0x0df6, 0x0047), USB_DEVICE_DATA(&rt2800usb_ops) }, 857 { USB_DEVICE(0x0df6, 0x0048), USB_DEVICE_DATA(&rt2800usb_ops) }, 858 /* SMC */ 859 { USB_DEVICE(0x083a, 0x6618), USB_DEVICE_DATA(&rt2800usb_ops) }, 860 { USB_DEVICE(0x083a, 0x7511), USB_DEVICE_DATA(&rt2800usb_ops) }, 861 { USB_DEVICE(0x083a, 0x7512), USB_DEVICE_DATA(&rt2800usb_ops) }, 862 { USB_DEVICE(0x083a, 0x7522), USB_DEVICE_DATA(&rt2800usb_ops) }, 863 { USB_DEVICE(0x083a, 0x8522), USB_DEVICE_DATA(&rt2800usb_ops) }, 864 { USB_DEVICE(0x083a, 0xa618), USB_DEVICE_DATA(&rt2800usb_ops) }, 865 { USB_DEVICE(0x083a, 0xa701), USB_DEVICE_DATA(&rt2800usb_ops) }, 866 { USB_DEVICE(0x083a, 0xa702), USB_DEVICE_DATA(&rt2800usb_ops) }, 867 { USB_DEVICE(0x083a, 0xa703), USB_DEVICE_DATA(&rt2800usb_ops) }, 868 { USB_DEVICE(0x083a, 0xb522), USB_DEVICE_DATA(&rt2800usb_ops) }, 869 /* Sparklan */ 870 { USB_DEVICE(0x15a9, 0x0006), USB_DEVICE_DATA(&rt2800usb_ops) }, 871 /* Sweex */ 872 { USB_DEVICE(0x177f, 0x0302), USB_DEVICE_DATA(&rt2800usb_ops) }, 873 /* U-Media*/ 874 { USB_DEVICE(0x157e, 0x300e), USB_DEVICE_DATA(&rt2800usb_ops) }, 875 /* ZCOM */ 876 { USB_DEVICE(0x0cde, 0x0022), USB_DEVICE_DATA(&rt2800usb_ops) }, 877 { USB_DEVICE(0x0cde, 0x0025), USB_DEVICE_DATA(&rt2800usb_ops) }, 878 /* Zinwell */ 879 { USB_DEVICE(0x5a57, 0x0280), USB_DEVICE_DATA(&rt2800usb_ops) }, 880 { USB_DEVICE(0x5a57, 0x0282), USB_DEVICE_DATA(&rt2800usb_ops) }, 881 { USB_DEVICE(0x5a57, 0x0283), USB_DEVICE_DATA(&rt2800usb_ops) }, 882 { USB_DEVICE(0x5a57, 0x5257), USB_DEVICE_DATA(&rt2800usb_ops) }, 883 /* Zyxel */ 884 { USB_DEVICE(0x0586, 0x3416), USB_DEVICE_DATA(&rt2800usb_ops) }, 885#ifdef CONFIG_RT2800USB_RT33XX 886 /* Ralink */ 887 { USB_DEVICE(0x148f, 0x3370), USB_DEVICE_DATA(&rt2800usb_ops) }, 888 { USB_DEVICE(0x148f, 0x8070), USB_DEVICE_DATA(&rt2800usb_ops) }, 889 /* Sitecom */ 890 { USB_DEVICE(0x0df6, 0x0050), USB_DEVICE_DATA(&rt2800usb_ops) }, 891#endif 892#ifdef CONFIG_RT2800USB_RT35XX 893 /* Allwin */ 894 { USB_DEVICE(0x8516, 0x3572), USB_DEVICE_DATA(&rt2800usb_ops) }, 895 /* Askey */ 896 { USB_DEVICE(0x1690, 0x0744), USB_DEVICE_DATA(&rt2800usb_ops) }, 897 /* Cisco */ 898 { USB_DEVICE(0x167b, 0x4001), USB_DEVICE_DATA(&rt2800usb_ops) }, 899 /* EnGenius */ 900 { USB_DEVICE(0x1740, 0x9801), USB_DEVICE_DATA(&rt2800usb_ops) }, 901 /* I-O DATA */ 902 { USB_DEVICE(0x04bb, 0x0944), USB_DEVICE_DATA(&rt2800usb_ops) }, 903 /* Ralink */ 904 { USB_DEVICE(0x148f, 0x3572), USB_DEVICE_DATA(&rt2800usb_ops) }, 905 /* Sitecom */ 906 { USB_DEVICE(0x0df6, 0x0041), USB_DEVICE_DATA(&rt2800usb_ops) }, 907 /* Toshiba */ 908 { USB_DEVICE(0x0930, 0x0a07), USB_DEVICE_DATA(&rt2800usb_ops) }, 909 /* Zinwell */ 910 { USB_DEVICE(0x5a57, 0x0284), USB_DEVICE_DATA(&rt2800usb_ops) }, 911#endif 912#ifdef CONFIG_RT2800USB_UNKNOWN 913 /* 914 * Unclear what kind of devices these are (they aren't supported by the 915 * vendor linux driver). 916 */ 917 /* Amigo */ 918 { USB_DEVICE(0x0e0b, 0x9031), USB_DEVICE_DATA(&rt2800usb_ops) }, 919 { USB_DEVICE(0x0e0b, 0x9041), USB_DEVICE_DATA(&rt2800usb_ops) }, 920 /* ASUS */ 921 { USB_DEVICE(0x0b05, 0x1760), USB_DEVICE_DATA(&rt2800usb_ops) }, 922 { USB_DEVICE(0x0b05, 0x1761), USB_DEVICE_DATA(&rt2800usb_ops) }, 923 { USB_DEVICE(0x0b05, 0x1790), USB_DEVICE_DATA(&rt2800usb_ops) }, 924 /* AzureWave */ 925 { USB_DEVICE(0x13d3, 0x3262), USB_DEVICE_DATA(&rt2800usb_ops) }, 926 { USB_DEVICE(0x13d3, 0x3284), USB_DEVICE_DATA(&rt2800usb_ops) }, 927 { USB_DEVICE(0x13d3, 0x3322), USB_DEVICE_DATA(&rt2800usb_ops) }, 928 /* Belkin */ 929 { USB_DEVICE(0x050d, 0x825a), USB_DEVICE_DATA(&rt2800usb_ops) }, 930 /* Buffalo */ 931 { USB_DEVICE(0x0411, 0x012e), USB_DEVICE_DATA(&rt2800usb_ops) }, 932 { USB_DEVICE(0x0411, 0x0148), USB_DEVICE_DATA(&rt2800usb_ops) }, 933 { USB_DEVICE(0x0411, 0x0150), USB_DEVICE_DATA(&rt2800usb_ops) }, 934 { USB_DEVICE(0x0411, 0x015d), USB_DEVICE_DATA(&rt2800usb_ops) }, 935 /* Conceptronic */ 936 { USB_DEVICE(0x14b2, 0x3c08), USB_DEVICE_DATA(&rt2800usb_ops) }, 937 { USB_DEVICE(0x14b2, 0x3c11), USB_DEVICE_DATA(&rt2800usb_ops) }, 938 /* Corega */ 939 { USB_DEVICE(0x07aa, 0x0041), USB_DEVICE_DATA(&rt2800usb_ops) }, 940 { USB_DEVICE(0x07aa, 0x0042), USB_DEVICE_DATA(&rt2800usb_ops) }, 941 { USB_DEVICE(0x18c5, 0x0008), USB_DEVICE_DATA(&rt2800usb_ops) }, 942 /* D-Link */ 943 { USB_DEVICE(0x07d1, 0x3c0b), USB_DEVICE_DATA(&rt2800usb_ops) }, 944 { USB_DEVICE(0x07d1, 0x3c13), USB_DEVICE_DATA(&rt2800usb_ops) }, 945 { USB_DEVICE(0x07d1, 0x3c15), USB_DEVICE_DATA(&rt2800usb_ops) }, 946 { USB_DEVICE(0x07d1, 0x3c17), USB_DEVICE_DATA(&rt2800usb_ops) }, 947 /* Edimax */ 948 { USB_DEVICE(0x7392, 0x4085), USB_DEVICE_DATA(&rt2800usb_ops) }, 949 /* Encore */ 950 { USB_DEVICE(0x203d, 0x14a1), USB_DEVICE_DATA(&rt2800usb_ops) }, 951 /* Gemtek */ 952 { USB_DEVICE(0x15a9, 0x0010), USB_DEVICE_DATA(&rt2800usb_ops) }, 953 /* Gigabyte */ 954 { USB_DEVICE(0x1044, 0x800c), USB_DEVICE_DATA(&rt2800usb_ops) }, 955 /* LevelOne */ 956 { USB_DEVICE(0x1740, 0x0605), USB_DEVICE_DATA(&rt2800usb_ops) }, 957 { USB_DEVICE(0x1740, 0x0615), USB_DEVICE_DATA(&rt2800usb_ops) }, 958 /* Linksys */ 959 { USB_DEVICE(0x1737, 0x0077), USB_DEVICE_DATA(&rt2800usb_ops) }, 960 { USB_DEVICE(0x1737, 0x0078), USB_DEVICE_DATA(&rt2800usb_ops) }, 961 { USB_DEVICE(0x1737, 0x0079), USB_DEVICE_DATA(&rt2800usb_ops) }, 962 /* Motorola */ 963 { USB_DEVICE(0x100d, 0x9032), USB_DEVICE_DATA(&rt2800usb_ops) }, 964 /* Ovislink */ 965 { USB_DEVICE(0x1b75, 0x3071), USB_DEVICE_DATA(&rt2800usb_ops) }, 966 { USB_DEVICE(0x1b75, 0x3072), USB_DEVICE_DATA(&rt2800usb_ops) }, 967 /* Pegatron */ 968 { USB_DEVICE(0x05a6, 0x0101), USB_DEVICE_DATA(&rt2800usb_ops) }, 969 { USB_DEVICE(0x1d4d, 0x0002), USB_DEVICE_DATA(&rt2800usb_ops) }, 970 { USB_DEVICE(0x1d4d, 0x0010), USB_DEVICE_DATA(&rt2800usb_ops) }, 971 /* Planex */ 972 { USB_DEVICE(0x2019, 0x5201), USB_DEVICE_DATA(&rt2800usb_ops) }, 973 { USB_DEVICE(0x2019, 0xab24), USB_DEVICE_DATA(&rt2800usb_ops) }, 974 /* Qcom */ 975 { USB_DEVICE(0x18e8, 0x6259), USB_DEVICE_DATA(&rt2800usb_ops) }, 976 /* SMC */ 977 { USB_DEVICE(0x083a, 0xa512), USB_DEVICE_DATA(&rt2800usb_ops) }, 978 { USB_DEVICE(0x083a, 0xc522), USB_DEVICE_DATA(&rt2800usb_ops) }, 979 { USB_DEVICE(0x083a, 0xd522), USB_DEVICE_DATA(&rt2800usb_ops) }, 980 { USB_DEVICE(0x083a, 0xf511), USB_DEVICE_DATA(&rt2800usb_ops) }, 981 /* Sweex */ 982 { USB_DEVICE(0x177f, 0x0153), USB_DEVICE_DATA(&rt2800usb_ops) }, 983 { USB_DEVICE(0x177f, 0x0313), USB_DEVICE_DATA(&rt2800usb_ops) }, 984 /* Zyxel */ 985 { USB_DEVICE(0x0586, 0x341a), USB_DEVICE_DATA(&rt2800usb_ops) }, 986#endif 987 { 0, } 988}; 989 990MODULE_AUTHOR(DRV_PROJECT); 991MODULE_VERSION(DRV_VERSION); 992MODULE_DESCRIPTION("Ralink RT2800 USB Wireless LAN driver."); 993MODULE_SUPPORTED_DEVICE("Ralink RT2870 USB chipset based cards"); 994MODULE_DEVICE_TABLE(usb, rt2800usb_device_table); 995MODULE_FIRMWARE(FIRMWARE_RT2870); 996MODULE_LICENSE("GPL"); 997 998static struct usb_driver rt2800usb_driver = { 999 .name = KBUILD_MODNAME, 1000 .id_table = rt2800usb_device_table, 1001 .probe = rt2x00usb_probe, 1002 .disconnect = rt2x00usb_disconnect, 1003 .suspend = rt2x00usb_suspend, 1004 .resume = rt2x00usb_resume, 1005}; 1006 1007static int __init rt2800usb_init(void) 1008{ 1009 return usb_register(&rt2800usb_driver); 1010} 1011 1012static void __exit rt2800usb_exit(void) 1013{ 1014 usb_deregister(&rt2800usb_driver); 1015} 1016 1017module_init(rt2800usb_init); 1018module_exit(rt2800usb_exit);