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.4-rc2 888 lines 22 kB view raw
1/* 2 Copyright (C) 2010 Willow Garage <http://www.willowgarage.com> 3 Copyright (C) 2004 - 2010 Ivo van Doorn <IvDoorn@gmail.com> 4 <http://rt2x00.serialmonkey.com> 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 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the 18 Free Software Foundation, Inc., 19 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 20 */ 21 22/* 23 Module: rt2x00usb 24 Abstract: rt2x00 generic usb device routines. 25 */ 26 27#include <linux/kernel.h> 28#include <linux/module.h> 29#include <linux/slab.h> 30#include <linux/usb.h> 31#include <linux/bug.h> 32 33#include "rt2x00.h" 34#include "rt2x00usb.h" 35 36/* 37 * Interfacing with the HW. 38 */ 39int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev, 40 const u8 request, const u8 requesttype, 41 const u16 offset, const u16 value, 42 void *buffer, const u16 buffer_length, 43 const int timeout) 44{ 45 struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); 46 int status; 47 unsigned int i; 48 unsigned int pipe = 49 (requesttype == USB_VENDOR_REQUEST_IN) ? 50 usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0); 51 52 if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) 53 return -ENODEV; 54 55 for (i = 0; i < REGISTER_BUSY_COUNT; i++) { 56 status = usb_control_msg(usb_dev, pipe, request, requesttype, 57 value, offset, buffer, buffer_length, 58 timeout); 59 if (status >= 0) 60 return 0; 61 62 /* 63 * Check for errors 64 * -ENODEV: Device has disappeared, no point continuing. 65 * All other errors: Try again. 66 */ 67 else if (status == -ENODEV) { 68 clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); 69 break; 70 } 71 } 72 73 ERROR(rt2x00dev, 74 "Vendor Request 0x%02x failed for offset 0x%04x with error %d.\n", 75 request, offset, status); 76 77 return status; 78} 79EXPORT_SYMBOL_GPL(rt2x00usb_vendor_request); 80 81int rt2x00usb_vendor_req_buff_lock(struct rt2x00_dev *rt2x00dev, 82 const u8 request, const u8 requesttype, 83 const u16 offset, void *buffer, 84 const u16 buffer_length, const int timeout) 85{ 86 int status; 87 88 BUG_ON(!mutex_is_locked(&rt2x00dev->csr_mutex)); 89 90 /* 91 * Check for Cache availability. 92 */ 93 if (unlikely(!rt2x00dev->csr.cache || buffer_length > CSR_CACHE_SIZE)) { 94 ERROR(rt2x00dev, "CSR cache not available.\n"); 95 return -ENOMEM; 96 } 97 98 if (requesttype == USB_VENDOR_REQUEST_OUT) 99 memcpy(rt2x00dev->csr.cache, buffer, buffer_length); 100 101 status = rt2x00usb_vendor_request(rt2x00dev, request, requesttype, 102 offset, 0, rt2x00dev->csr.cache, 103 buffer_length, timeout); 104 105 if (!status && requesttype == USB_VENDOR_REQUEST_IN) 106 memcpy(buffer, rt2x00dev->csr.cache, buffer_length); 107 108 return status; 109} 110EXPORT_SYMBOL_GPL(rt2x00usb_vendor_req_buff_lock); 111 112int rt2x00usb_vendor_request_buff(struct rt2x00_dev *rt2x00dev, 113 const u8 request, const u8 requesttype, 114 const u16 offset, void *buffer, 115 const u16 buffer_length, const int timeout) 116{ 117 int status = 0; 118 unsigned char *tb; 119 u16 off, len, bsize; 120 121 mutex_lock(&rt2x00dev->csr_mutex); 122 123 tb = (char *)buffer; 124 off = offset; 125 len = buffer_length; 126 while (len && !status) { 127 bsize = min_t(u16, CSR_CACHE_SIZE, len); 128 status = rt2x00usb_vendor_req_buff_lock(rt2x00dev, request, 129 requesttype, off, tb, 130 bsize, timeout); 131 132 tb += bsize; 133 len -= bsize; 134 off += bsize; 135 } 136 137 mutex_unlock(&rt2x00dev->csr_mutex); 138 139 return status; 140} 141EXPORT_SYMBOL_GPL(rt2x00usb_vendor_request_buff); 142 143int rt2x00usb_regbusy_read(struct rt2x00_dev *rt2x00dev, 144 const unsigned int offset, 145 const struct rt2x00_field32 field, 146 u32 *reg) 147{ 148 unsigned int i; 149 150 if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) 151 return -ENODEV; 152 153 for (i = 0; i < REGISTER_BUSY_COUNT; i++) { 154 rt2x00usb_register_read_lock(rt2x00dev, offset, reg); 155 if (!rt2x00_get_field32(*reg, field)) 156 return 1; 157 udelay(REGISTER_BUSY_DELAY); 158 } 159 160 ERROR(rt2x00dev, "Indirect register access failed: " 161 "offset=0x%.08x, value=0x%.08x\n", offset, *reg); 162 *reg = ~0; 163 164 return 0; 165} 166EXPORT_SYMBOL_GPL(rt2x00usb_regbusy_read); 167 168 169struct rt2x00_async_read_data { 170 __le32 reg; 171 struct usb_ctrlrequest cr; 172 struct rt2x00_dev *rt2x00dev; 173 bool (*callback)(struct rt2x00_dev *, int, u32); 174}; 175 176static void rt2x00usb_register_read_async_cb(struct urb *urb) 177{ 178 struct rt2x00_async_read_data *rd = urb->context; 179 if (rd->callback(rd->rt2x00dev, urb->status, le32_to_cpu(rd->reg))) { 180 if (usb_submit_urb(urb, GFP_ATOMIC) < 0) 181 kfree(rd); 182 } else 183 kfree(rd); 184} 185 186void rt2x00usb_register_read_async(struct rt2x00_dev *rt2x00dev, 187 const unsigned int offset, 188 bool (*callback)(struct rt2x00_dev*, int, u32)) 189{ 190 struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); 191 struct urb *urb; 192 struct rt2x00_async_read_data *rd; 193 194 rd = kmalloc(sizeof(*rd), GFP_ATOMIC); 195 if (!rd) 196 return; 197 198 urb = usb_alloc_urb(0, GFP_ATOMIC); 199 if (!urb) { 200 kfree(rd); 201 return; 202 } 203 204 rd->rt2x00dev = rt2x00dev; 205 rd->callback = callback; 206 rd->cr.bRequestType = USB_VENDOR_REQUEST_IN; 207 rd->cr.bRequest = USB_MULTI_READ; 208 rd->cr.wValue = 0; 209 rd->cr.wIndex = cpu_to_le16(offset); 210 rd->cr.wLength = cpu_to_le16(sizeof(u32)); 211 212 usb_fill_control_urb(urb, usb_dev, usb_rcvctrlpipe(usb_dev, 0), 213 (unsigned char *)(&rd->cr), &rd->reg, sizeof(rd->reg), 214 rt2x00usb_register_read_async_cb, rd); 215 if (usb_submit_urb(urb, GFP_ATOMIC) < 0) 216 kfree(rd); 217 usb_free_urb(urb); 218} 219EXPORT_SYMBOL_GPL(rt2x00usb_register_read_async); 220 221/* 222 * TX data handlers. 223 */ 224static void rt2x00usb_work_txdone_entry(struct queue_entry *entry) 225{ 226 /* 227 * If the transfer to hardware succeeded, it does not mean the 228 * frame was send out correctly. It only means the frame 229 * was successfully pushed to the hardware, we have no 230 * way to determine the transmission status right now. 231 * (Only indirectly by looking at the failed TX counters 232 * in the register). 233 */ 234 if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) 235 rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE); 236 else 237 rt2x00lib_txdone_noinfo(entry, TXDONE_UNKNOWN); 238} 239 240static void rt2x00usb_work_txdone(struct work_struct *work) 241{ 242 struct rt2x00_dev *rt2x00dev = 243 container_of(work, struct rt2x00_dev, txdone_work); 244 struct data_queue *queue; 245 struct queue_entry *entry; 246 247 tx_queue_for_each(rt2x00dev, queue) { 248 while (!rt2x00queue_empty(queue)) { 249 entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); 250 251 if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || 252 !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) 253 break; 254 255 rt2x00usb_work_txdone_entry(entry); 256 } 257 } 258} 259 260static void rt2x00usb_interrupt_txdone(struct urb *urb) 261{ 262 struct queue_entry *entry = (struct queue_entry *)urb->context; 263 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 264 265 if (!test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) 266 return; 267 /* 268 * Check if the frame was correctly uploaded 269 */ 270 if (urb->status) 271 set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); 272 /* 273 * Report the frame as DMA done 274 */ 275 rt2x00lib_dmadone(entry); 276 277 if (rt2x00dev->ops->lib->tx_dma_done) 278 rt2x00dev->ops->lib->tx_dma_done(entry); 279 /* 280 * Schedule the delayed work for reading the TX status 281 * from the device. 282 */ 283 if (!test_bit(REQUIRE_TXSTATUS_FIFO, &rt2x00dev->cap_flags) || 284 !kfifo_is_empty(&rt2x00dev->txstatus_fifo)) 285 queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); 286} 287 288static bool rt2x00usb_kick_tx_entry(struct queue_entry *entry, void* data) 289{ 290 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 291 struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); 292 struct queue_entry_priv_usb *entry_priv = entry->priv_data; 293 u32 length; 294 int status; 295 296 if (!test_and_clear_bit(ENTRY_DATA_PENDING, &entry->flags) || 297 test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) 298 return false; 299 300 /* 301 * USB devices require certain padding at the end of each frame 302 * and urb. Those paddings are not included in skbs. Pass entry 303 * to the driver to determine what the overall length should be. 304 */ 305 length = rt2x00dev->ops->lib->get_tx_data_len(entry); 306 307 status = skb_padto(entry->skb, length); 308 if (unlikely(status)) { 309 /* TODO: report something more appropriate than IO_FAILED. */ 310 WARNING(rt2x00dev, "TX SKB padding error, out of memory\n"); 311 set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); 312 rt2x00lib_dmadone(entry); 313 314 return false; 315 } 316 317 usb_fill_bulk_urb(entry_priv->urb, usb_dev, 318 usb_sndbulkpipe(usb_dev, entry->queue->usb_endpoint), 319 entry->skb->data, length, 320 rt2x00usb_interrupt_txdone, entry); 321 322 status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC); 323 if (status) { 324 if (status == -ENODEV) 325 clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); 326 set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); 327 rt2x00lib_dmadone(entry); 328 } 329 330 return false; 331} 332 333/* 334 * RX data handlers. 335 */ 336static void rt2x00usb_work_rxdone(struct work_struct *work) 337{ 338 struct rt2x00_dev *rt2x00dev = 339 container_of(work, struct rt2x00_dev, rxdone_work); 340 struct queue_entry *entry; 341 struct skb_frame_desc *skbdesc; 342 u8 rxd[32]; 343 344 while (!rt2x00queue_empty(rt2x00dev->rx)) { 345 entry = rt2x00queue_get_entry(rt2x00dev->rx, Q_INDEX_DONE); 346 347 if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || 348 !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) 349 break; 350 351 /* 352 * Fill in desc fields of the skb descriptor 353 */ 354 skbdesc = get_skb_frame_desc(entry->skb); 355 skbdesc->desc = rxd; 356 skbdesc->desc_len = entry->queue->desc_size; 357 358 /* 359 * Send the frame to rt2x00lib for further processing. 360 */ 361 rt2x00lib_rxdone(entry); 362 } 363} 364 365static void rt2x00usb_interrupt_rxdone(struct urb *urb) 366{ 367 struct queue_entry *entry = (struct queue_entry *)urb->context; 368 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 369 370 if (!test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) 371 return; 372 373 /* 374 * Report the frame as DMA done 375 */ 376 rt2x00lib_dmadone(entry); 377 378 /* 379 * Check if the received data is simply too small 380 * to be actually valid, or if the urb is signaling 381 * a problem. 382 */ 383 if (urb->actual_length < entry->queue->desc_size || urb->status) 384 set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); 385 386 /* 387 * Schedule the delayed work for reading the RX status 388 * from the device. 389 */ 390 queue_work(rt2x00dev->workqueue, &rt2x00dev->rxdone_work); 391} 392 393static bool rt2x00usb_kick_rx_entry(struct queue_entry *entry, void* data) 394{ 395 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 396 struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); 397 struct queue_entry_priv_usb *entry_priv = entry->priv_data; 398 int status; 399 400 if (test_and_set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || 401 test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) 402 return false; 403 404 rt2x00lib_dmastart(entry); 405 406 usb_fill_bulk_urb(entry_priv->urb, usb_dev, 407 usb_rcvbulkpipe(usb_dev, entry->queue->usb_endpoint), 408 entry->skb->data, entry->skb->len, 409 rt2x00usb_interrupt_rxdone, entry); 410 411 status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC); 412 if (status) { 413 if (status == -ENODEV) 414 clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); 415 set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); 416 rt2x00lib_dmadone(entry); 417 } 418 419 return false; 420} 421 422void rt2x00usb_kick_queue(struct data_queue *queue) 423{ 424 switch (queue->qid) { 425 case QID_AC_VO: 426 case QID_AC_VI: 427 case QID_AC_BE: 428 case QID_AC_BK: 429 if (!rt2x00queue_empty(queue)) 430 rt2x00queue_for_each_entry(queue, 431 Q_INDEX_DONE, 432 Q_INDEX, 433 NULL, 434 rt2x00usb_kick_tx_entry); 435 break; 436 case QID_RX: 437 if (!rt2x00queue_full(queue)) 438 rt2x00queue_for_each_entry(queue, 439 Q_INDEX_DONE, 440 Q_INDEX, 441 NULL, 442 rt2x00usb_kick_rx_entry); 443 break; 444 default: 445 break; 446 } 447} 448EXPORT_SYMBOL_GPL(rt2x00usb_kick_queue); 449 450static bool rt2x00usb_flush_entry(struct queue_entry *entry, void* data) 451{ 452 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 453 struct queue_entry_priv_usb *entry_priv = entry->priv_data; 454 struct queue_entry_priv_usb_bcn *bcn_priv = entry->priv_data; 455 456 if (!test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) 457 return false; 458 459 usb_kill_urb(entry_priv->urb); 460 461 /* 462 * Kill guardian urb (if required by driver). 463 */ 464 if ((entry->queue->qid == QID_BEACON) && 465 (test_bit(REQUIRE_BEACON_GUARD, &rt2x00dev->cap_flags))) 466 usb_kill_urb(bcn_priv->guardian_urb); 467 468 return false; 469} 470 471void rt2x00usb_flush_queue(struct data_queue *queue, bool drop) 472{ 473 struct work_struct *completion; 474 unsigned int i; 475 476 if (drop) 477 rt2x00queue_for_each_entry(queue, Q_INDEX_DONE, Q_INDEX, NULL, 478 rt2x00usb_flush_entry); 479 480 /* 481 * Obtain the queue completion handler 482 */ 483 switch (queue->qid) { 484 case QID_AC_VO: 485 case QID_AC_VI: 486 case QID_AC_BE: 487 case QID_AC_BK: 488 completion = &queue->rt2x00dev->txdone_work; 489 break; 490 case QID_RX: 491 completion = &queue->rt2x00dev->rxdone_work; 492 break; 493 default: 494 return; 495 } 496 497 for (i = 0; i < 10; i++) { 498 /* 499 * Check if the driver is already done, otherwise we 500 * have to sleep a little while to give the driver/hw 501 * the oppurtunity to complete interrupt process itself. 502 */ 503 if (rt2x00queue_empty(queue)) 504 break; 505 506 /* 507 * Schedule the completion handler manually, when this 508 * worker function runs, it should cleanup the queue. 509 */ 510 queue_work(queue->rt2x00dev->workqueue, completion); 511 512 /* 513 * Wait for a little while to give the driver 514 * the oppurtunity to recover itself. 515 */ 516 msleep(10); 517 } 518} 519EXPORT_SYMBOL_GPL(rt2x00usb_flush_queue); 520 521static void rt2x00usb_watchdog_tx_dma(struct data_queue *queue) 522{ 523 WARNING(queue->rt2x00dev, "TX queue %d DMA timed out," 524 " invoke forced forced reset\n", queue->qid); 525 526 rt2x00queue_flush_queue(queue, true); 527} 528 529static int rt2x00usb_dma_timeout(struct data_queue *queue) 530{ 531 struct queue_entry *entry; 532 533 entry = rt2x00queue_get_entry(queue, Q_INDEX_DMA_DONE); 534 return rt2x00queue_dma_timeout(entry); 535} 536 537void rt2x00usb_watchdog(struct rt2x00_dev *rt2x00dev) 538{ 539 struct data_queue *queue; 540 541 tx_queue_for_each(rt2x00dev, queue) { 542 if (!rt2x00queue_empty(queue)) { 543 if (rt2x00usb_dma_timeout(queue)) 544 rt2x00usb_watchdog_tx_dma(queue); 545 } 546 } 547} 548EXPORT_SYMBOL_GPL(rt2x00usb_watchdog); 549 550/* 551 * Radio handlers 552 */ 553void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev) 554{ 555 rt2x00usb_vendor_request_sw(rt2x00dev, USB_RX_CONTROL, 0, 0, 556 REGISTER_TIMEOUT); 557} 558EXPORT_SYMBOL_GPL(rt2x00usb_disable_radio); 559 560/* 561 * Device initialization handlers. 562 */ 563void rt2x00usb_clear_entry(struct queue_entry *entry) 564{ 565 entry->flags = 0; 566 567 if (entry->queue->qid == QID_RX) 568 rt2x00usb_kick_rx_entry(entry, NULL); 569} 570EXPORT_SYMBOL_GPL(rt2x00usb_clear_entry); 571 572static void rt2x00usb_assign_endpoint(struct data_queue *queue, 573 struct usb_endpoint_descriptor *ep_desc) 574{ 575 struct usb_device *usb_dev = to_usb_device_intf(queue->rt2x00dev->dev); 576 int pipe; 577 578 queue->usb_endpoint = usb_endpoint_num(ep_desc); 579 580 if (queue->qid == QID_RX) { 581 pipe = usb_rcvbulkpipe(usb_dev, queue->usb_endpoint); 582 queue->usb_maxpacket = usb_maxpacket(usb_dev, pipe, 0); 583 } else { 584 pipe = usb_sndbulkpipe(usb_dev, queue->usb_endpoint); 585 queue->usb_maxpacket = usb_maxpacket(usb_dev, pipe, 1); 586 } 587 588 if (!queue->usb_maxpacket) 589 queue->usb_maxpacket = 1; 590} 591 592static int rt2x00usb_find_endpoints(struct rt2x00_dev *rt2x00dev) 593{ 594 struct usb_interface *intf = to_usb_interface(rt2x00dev->dev); 595 struct usb_host_interface *intf_desc = intf->cur_altsetting; 596 struct usb_endpoint_descriptor *ep_desc; 597 struct data_queue *queue = rt2x00dev->tx; 598 struct usb_endpoint_descriptor *tx_ep_desc = NULL; 599 unsigned int i; 600 601 /* 602 * Walk through all available endpoints to search for "bulk in" 603 * and "bulk out" endpoints. When we find such endpoints collect 604 * the information we need from the descriptor and assign it 605 * to the queue. 606 */ 607 for (i = 0; i < intf_desc->desc.bNumEndpoints; i++) { 608 ep_desc = &intf_desc->endpoint[i].desc; 609 610 if (usb_endpoint_is_bulk_in(ep_desc)) { 611 rt2x00usb_assign_endpoint(rt2x00dev->rx, ep_desc); 612 } else if (usb_endpoint_is_bulk_out(ep_desc) && 613 (queue != queue_end(rt2x00dev))) { 614 rt2x00usb_assign_endpoint(queue, ep_desc); 615 queue = queue_next(queue); 616 617 tx_ep_desc = ep_desc; 618 } 619 } 620 621 /* 622 * At least 1 endpoint for RX and 1 endpoint for TX must be available. 623 */ 624 if (!rt2x00dev->rx->usb_endpoint || !rt2x00dev->tx->usb_endpoint) { 625 ERROR(rt2x00dev, "Bulk-in/Bulk-out endpoints not found\n"); 626 return -EPIPE; 627 } 628 629 /* 630 * It might be possible not all queues have a dedicated endpoint. 631 * Loop through all TX queues and copy the endpoint information 632 * which we have gathered from already assigned endpoints. 633 */ 634 txall_queue_for_each(rt2x00dev, queue) { 635 if (!queue->usb_endpoint) 636 rt2x00usb_assign_endpoint(queue, tx_ep_desc); 637 } 638 639 return 0; 640} 641 642static int rt2x00usb_alloc_entries(struct data_queue *queue) 643{ 644 struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; 645 struct queue_entry_priv_usb *entry_priv; 646 struct queue_entry_priv_usb_bcn *bcn_priv; 647 unsigned int i; 648 649 for (i = 0; i < queue->limit; i++) { 650 entry_priv = queue->entries[i].priv_data; 651 entry_priv->urb = usb_alloc_urb(0, GFP_KERNEL); 652 if (!entry_priv->urb) 653 return -ENOMEM; 654 } 655 656 /* 657 * If this is not the beacon queue or 658 * no guardian byte was required for the beacon, 659 * then we are done. 660 */ 661 if (queue->qid != QID_BEACON || 662 !test_bit(REQUIRE_BEACON_GUARD, &rt2x00dev->cap_flags)) 663 return 0; 664 665 for (i = 0; i < queue->limit; i++) { 666 bcn_priv = queue->entries[i].priv_data; 667 bcn_priv->guardian_urb = usb_alloc_urb(0, GFP_KERNEL); 668 if (!bcn_priv->guardian_urb) 669 return -ENOMEM; 670 } 671 672 return 0; 673} 674 675static void rt2x00usb_free_entries(struct data_queue *queue) 676{ 677 struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; 678 struct queue_entry_priv_usb *entry_priv; 679 struct queue_entry_priv_usb_bcn *bcn_priv; 680 unsigned int i; 681 682 if (!queue->entries) 683 return; 684 685 for (i = 0; i < queue->limit; i++) { 686 entry_priv = queue->entries[i].priv_data; 687 usb_kill_urb(entry_priv->urb); 688 usb_free_urb(entry_priv->urb); 689 } 690 691 /* 692 * If this is not the beacon queue or 693 * no guardian byte was required for the beacon, 694 * then we are done. 695 */ 696 if (queue->qid != QID_BEACON || 697 !test_bit(REQUIRE_BEACON_GUARD, &rt2x00dev->cap_flags)) 698 return; 699 700 for (i = 0; i < queue->limit; i++) { 701 bcn_priv = queue->entries[i].priv_data; 702 usb_kill_urb(bcn_priv->guardian_urb); 703 usb_free_urb(bcn_priv->guardian_urb); 704 } 705} 706 707int rt2x00usb_initialize(struct rt2x00_dev *rt2x00dev) 708{ 709 struct data_queue *queue; 710 int status; 711 712 /* 713 * Find endpoints for each queue 714 */ 715 status = rt2x00usb_find_endpoints(rt2x00dev); 716 if (status) 717 goto exit; 718 719 /* 720 * Allocate DMA 721 */ 722 queue_for_each(rt2x00dev, queue) { 723 status = rt2x00usb_alloc_entries(queue); 724 if (status) 725 goto exit; 726 } 727 728 return 0; 729 730exit: 731 rt2x00usb_uninitialize(rt2x00dev); 732 733 return status; 734} 735EXPORT_SYMBOL_GPL(rt2x00usb_initialize); 736 737void rt2x00usb_uninitialize(struct rt2x00_dev *rt2x00dev) 738{ 739 struct data_queue *queue; 740 741 queue_for_each(rt2x00dev, queue) 742 rt2x00usb_free_entries(queue); 743} 744EXPORT_SYMBOL_GPL(rt2x00usb_uninitialize); 745 746/* 747 * USB driver handlers. 748 */ 749static void rt2x00usb_free_reg(struct rt2x00_dev *rt2x00dev) 750{ 751 kfree(rt2x00dev->rf); 752 rt2x00dev->rf = NULL; 753 754 kfree(rt2x00dev->eeprom); 755 rt2x00dev->eeprom = NULL; 756 757 kfree(rt2x00dev->csr.cache); 758 rt2x00dev->csr.cache = NULL; 759} 760 761static int rt2x00usb_alloc_reg(struct rt2x00_dev *rt2x00dev) 762{ 763 rt2x00dev->csr.cache = kzalloc(CSR_CACHE_SIZE, GFP_KERNEL); 764 if (!rt2x00dev->csr.cache) 765 goto exit; 766 767 rt2x00dev->eeprom = kzalloc(rt2x00dev->ops->eeprom_size, GFP_KERNEL); 768 if (!rt2x00dev->eeprom) 769 goto exit; 770 771 rt2x00dev->rf = kzalloc(rt2x00dev->ops->rf_size, GFP_KERNEL); 772 if (!rt2x00dev->rf) 773 goto exit; 774 775 return 0; 776 777exit: 778 ERROR_PROBE("Failed to allocate registers.\n"); 779 780 rt2x00usb_free_reg(rt2x00dev); 781 782 return -ENOMEM; 783} 784 785int rt2x00usb_probe(struct usb_interface *usb_intf, 786 const struct rt2x00_ops *ops) 787{ 788 struct usb_device *usb_dev = interface_to_usbdev(usb_intf); 789 struct ieee80211_hw *hw; 790 struct rt2x00_dev *rt2x00dev; 791 int retval; 792 793 usb_dev = usb_get_dev(usb_dev); 794 usb_reset_device(usb_dev); 795 796 hw = ieee80211_alloc_hw(sizeof(struct rt2x00_dev), ops->hw); 797 if (!hw) { 798 ERROR_PROBE("Failed to allocate hardware.\n"); 799 retval = -ENOMEM; 800 goto exit_put_device; 801 } 802 803 usb_set_intfdata(usb_intf, hw); 804 805 rt2x00dev = hw->priv; 806 rt2x00dev->dev = &usb_intf->dev; 807 rt2x00dev->ops = ops; 808 rt2x00dev->hw = hw; 809 810 rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_USB); 811 812 INIT_WORK(&rt2x00dev->rxdone_work, rt2x00usb_work_rxdone); 813 INIT_WORK(&rt2x00dev->txdone_work, rt2x00usb_work_txdone); 814 hrtimer_init(&rt2x00dev->txstatus_timer, CLOCK_MONOTONIC, 815 HRTIMER_MODE_REL); 816 817 retval = rt2x00usb_alloc_reg(rt2x00dev); 818 if (retval) 819 goto exit_free_device; 820 821 retval = rt2x00lib_probe_dev(rt2x00dev); 822 if (retval) 823 goto exit_free_reg; 824 825 return 0; 826 827exit_free_reg: 828 rt2x00usb_free_reg(rt2x00dev); 829 830exit_free_device: 831 ieee80211_free_hw(hw); 832 833exit_put_device: 834 usb_put_dev(usb_dev); 835 836 usb_set_intfdata(usb_intf, NULL); 837 838 return retval; 839} 840EXPORT_SYMBOL_GPL(rt2x00usb_probe); 841 842void rt2x00usb_disconnect(struct usb_interface *usb_intf) 843{ 844 struct ieee80211_hw *hw = usb_get_intfdata(usb_intf); 845 struct rt2x00_dev *rt2x00dev = hw->priv; 846 847 /* 848 * Free all allocated data. 849 */ 850 rt2x00lib_remove_dev(rt2x00dev); 851 rt2x00usb_free_reg(rt2x00dev); 852 ieee80211_free_hw(hw); 853 854 /* 855 * Free the USB device data. 856 */ 857 usb_set_intfdata(usb_intf, NULL); 858 usb_put_dev(interface_to_usbdev(usb_intf)); 859} 860EXPORT_SYMBOL_GPL(rt2x00usb_disconnect); 861 862#ifdef CONFIG_PM 863int rt2x00usb_suspend(struct usb_interface *usb_intf, pm_message_t state) 864{ 865 struct ieee80211_hw *hw = usb_get_intfdata(usb_intf); 866 struct rt2x00_dev *rt2x00dev = hw->priv; 867 868 return rt2x00lib_suspend(rt2x00dev, state); 869} 870EXPORT_SYMBOL_GPL(rt2x00usb_suspend); 871 872int rt2x00usb_resume(struct usb_interface *usb_intf) 873{ 874 struct ieee80211_hw *hw = usb_get_intfdata(usb_intf); 875 struct rt2x00_dev *rt2x00dev = hw->priv; 876 877 return rt2x00lib_resume(rt2x00dev); 878} 879EXPORT_SYMBOL_GPL(rt2x00usb_resume); 880#endif /* CONFIG_PM */ 881 882/* 883 * rt2x00usb module information. 884 */ 885MODULE_AUTHOR(DRV_PROJECT); 886MODULE_VERSION(DRV_VERSION); 887MODULE_DESCRIPTION("rt2x00 usb library"); 888MODULE_LICENSE("GPL");