aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2x00usb.c
diff options
context:
space:
mode:
authorIvo van Doorn <ivdoorn@gmail.com>2008-05-10 07:46:03 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-05-21 21:47:35 -0400
commitb8be63ffa5dc44324e7f507997870fa3e4b17619 (patch)
treead9ef1c3e4e09111ad93b003baaec325bd5e40e0 /drivers/net/wireless/rt2x00/rt2x00usb.c
parentdec13b6bda600c7e7da993e634562873112af50b (diff)
rt2x00: Merge RX and TX entry private data
With the pending removal of the tx_control structure we can merge the RX and TX entry private data structure in advance. This will temporarily increase the required memory for the queue, but that overhead will only be limited. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00usb.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00usb.c144
1 files changed, 59 insertions, 85 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c
index df6621025f4b..dcee1b4f152b 100644
--- a/drivers/net/wireless/rt2x00/rt2x00usb.c
+++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
@@ -129,7 +129,7 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb)
129{ 129{
130 struct queue_entry *entry = (struct queue_entry *)urb->context; 130 struct queue_entry *entry = (struct queue_entry *)urb->context;
131 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 131 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
132 struct queue_entry_priv_usb_tx *priv_tx = entry->priv_data; 132 struct queue_entry_priv_usb *entry_priv = entry->priv_data;
133 struct txdone_entry_desc txdesc; 133 struct txdone_entry_desc txdesc;
134 __le32 *txd = (__le32 *)entry->skb->data; 134 __le32 *txd = (__le32 *)entry->skb->data;
135 u32 word; 135 u32 word;
@@ -159,7 +159,7 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb)
159 else 159 else
160 __set_bit(TXDONE_FAILURE, &txdesc.flags); 160 __set_bit(TXDONE_FAILURE, &txdesc.flags);
161 txdesc.retry = 0; 161 txdesc.retry = 0;
162 txdesc.control = &priv_tx->control; 162 txdesc.control = &entry_priv->control;
163 163
164 rt2x00lib_txdone(entry, &txdesc); 164 rt2x00lib_txdone(entry, &txdesc);
165 165
@@ -175,7 +175,7 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb)
175 * is reenabled when the txdone handler has finished. 175 * is reenabled when the txdone handler has finished.
176 */ 176 */
177 if (!rt2x00queue_full(entry->queue)) 177 if (!rt2x00queue_full(entry->queue))
178 ieee80211_wake_queue(rt2x00dev->hw, priv_tx->control.queue); 178 ieee80211_wake_queue(rt2x00dev->hw, entry_priv->control.queue);
179} 179}
180 180
181int rt2x00usb_write_tx_data(struct rt2x00_dev *rt2x00dev, 181int rt2x00usb_write_tx_data(struct rt2x00_dev *rt2x00dev,
@@ -184,7 +184,7 @@ int rt2x00usb_write_tx_data(struct rt2x00_dev *rt2x00dev,
184{ 184{
185 struct usb_device *usb_dev = rt2x00dev_usb_dev(rt2x00dev); 185 struct usb_device *usb_dev = rt2x00dev_usb_dev(rt2x00dev);
186 struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX); 186 struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX);
187 struct queue_entry_priv_usb_tx *priv_tx = entry->priv_data; 187 struct queue_entry_priv_usb *entry_priv = entry->priv_data;
188 struct skb_frame_desc *skbdesc; 188 struct skb_frame_desc *skbdesc;
189 struct txentry_desc txdesc; 189 struct txentry_desc txdesc;
190 u32 length; 190 u32 length;
@@ -224,7 +224,7 @@ int rt2x00usb_write_tx_data(struct rt2x00_dev *rt2x00dev,
224 skbdesc->desc_len = queue->desc_size; 224 skbdesc->desc_len = queue->desc_size;
225 skbdesc->entry = entry; 225 skbdesc->entry = entry;
226 226
227 memcpy(&priv_tx->control, control, sizeof(priv_tx->control)); 227 memcpy(&entry_priv->control, control, sizeof(entry_priv->control));
228 rt2x00queue_write_tx_descriptor(entry, &txdesc); 228 rt2x00queue_write_tx_descriptor(entry, &txdesc);
229 229
230 /* 230 /*
@@ -238,9 +238,9 @@ int rt2x00usb_write_tx_data(struct rt2x00_dev *rt2x00dev,
238 * Initialize URB and send the frame to the device. 238 * Initialize URB and send the frame to the device.
239 */ 239 */
240 __set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); 240 __set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
241 usb_fill_bulk_urb(priv_tx->urb, usb_dev, usb_sndbulkpipe(usb_dev, 1), 241 usb_fill_bulk_urb(entry_priv->urb, usb_dev, usb_sndbulkpipe(usb_dev, 1),
242 skb->data, length, rt2x00usb_interrupt_txdone, entry); 242 skb->data, length, rt2x00usb_interrupt_txdone, entry);
243 usb_submit_urb(priv_tx->urb, GFP_ATOMIC); 243 usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
244 244
245 rt2x00queue_index_inc(queue, Q_INDEX); 245 rt2x00queue_index_inc(queue, Q_INDEX);
246 246
@@ -380,10 +380,8 @@ skip_entry:
380 */ 380 */
381void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev) 381void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev)
382{ 382{
383 struct queue_entry_priv_usb_rx *priv_rx; 383 struct queue_entry_priv_usb *entry_priv;
384 struct queue_entry_priv_usb_tx *priv_tx; 384 struct queue_entry_priv_usb_bcn *bcn_priv;
385 struct queue_entry_priv_usb_bcn *priv_bcn;
386 struct data_queue *queue;
387 unsigned int i; 385 unsigned int i;
388 386
389 rt2x00usb_vendor_request_sw(rt2x00dev, USB_RX_CONTROL, 0, 0, 387 rt2x00usb_vendor_request_sw(rt2x00dev, USB_RX_CONTROL, 0, 0,
@@ -393,31 +391,17 @@ void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev)
393 * Cancel all queues. 391 * Cancel all queues.
394 */ 392 */
395 for (i = 0; i < rt2x00dev->rx->limit; i++) { 393 for (i = 0; i < rt2x00dev->rx->limit; i++) {
396 priv_rx = rt2x00dev->rx->entries[i].priv_data; 394 entry_priv = rt2x00dev->rx->entries[i].priv_data;
397 usb_kill_urb(priv_rx->urb); 395 usb_kill_urb(entry_priv->urb);
398 }
399
400 tx_queue_for_each(rt2x00dev, queue) {
401 for (i = 0; i < queue->limit; i++) {
402 priv_tx = queue->entries[i].priv_data;
403 usb_kill_urb(priv_tx->urb);
404 }
405 } 396 }
406 397
398 /*
399 * Kill guardian urb.
400 */
407 for (i = 0; i < rt2x00dev->bcn->limit; i++) { 401 for (i = 0; i < rt2x00dev->bcn->limit; i++) {
408 priv_bcn = rt2x00dev->bcn->entries[i].priv_data; 402 bcn_priv = rt2x00dev->bcn->entries[i].priv_data;
409 usb_kill_urb(priv_bcn->urb); 403 if (bcn_priv->guardian_urb)
410 404 usb_kill_urb(bcn_priv->guardian_urb);
411 if (priv_bcn->guardian_urb)
412 usb_kill_urb(priv_bcn->guardian_urb);
413 }
414
415 if (!test_bit(DRIVER_REQUIRE_ATIM_QUEUE, &rt2x00dev->flags))
416 return;
417
418 for (i = 0; i < rt2x00dev->bcn[1].limit; i++) {
419 priv_tx = rt2x00dev->bcn[1].entries[i].priv_data;
420 usb_kill_urb(priv_tx->urb);
421 } 405 }
422} 406}
423EXPORT_SYMBOL_GPL(rt2x00usb_disable_radio); 407EXPORT_SYMBOL_GPL(rt2x00usb_disable_radio);
@@ -429,15 +413,15 @@ void rt2x00usb_init_rxentry(struct rt2x00_dev *rt2x00dev,
429 struct queue_entry *entry) 413 struct queue_entry *entry)
430{ 414{
431 struct usb_device *usb_dev = rt2x00dev_usb_dev(rt2x00dev); 415 struct usb_device *usb_dev = rt2x00dev_usb_dev(rt2x00dev);
432 struct queue_entry_priv_usb_rx *priv_rx = entry->priv_data; 416 struct queue_entry_priv_usb *entry_priv = entry->priv_data;
433 417
434 usb_fill_bulk_urb(priv_rx->urb, usb_dev, 418 usb_fill_bulk_urb(entry_priv->urb, usb_dev,
435 usb_rcvbulkpipe(usb_dev, 1), 419 usb_rcvbulkpipe(usb_dev, 1),
436 entry->skb->data, entry->skb->len, 420 entry->skb->data, entry->skb->len,
437 rt2x00usb_interrupt_rxdone, entry); 421 rt2x00usb_interrupt_rxdone, entry);
438 422
439 __set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); 423 __set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
440 usb_submit_urb(priv_rx->urb, GFP_ATOMIC); 424 usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
441} 425}
442EXPORT_SYMBOL_GPL(rt2x00usb_init_rxentry); 426EXPORT_SYMBOL_GPL(rt2x00usb_init_rxentry);
443 427
@@ -451,38 +435,31 @@ EXPORT_SYMBOL_GPL(rt2x00usb_init_txentry);
451static int rt2x00usb_alloc_urb(struct rt2x00_dev *rt2x00dev, 435static int rt2x00usb_alloc_urb(struct rt2x00_dev *rt2x00dev,
452 struct data_queue *queue) 436 struct data_queue *queue)
453{ 437{
454 struct queue_entry_priv_usb_rx *priv_rx; 438 struct queue_entry_priv_usb *entry_priv;
455 struct queue_entry_priv_usb_tx *priv_tx; 439 struct queue_entry_priv_usb_bcn *bcn_priv;
456 struct queue_entry_priv_usb_bcn *priv_bcn;
457 struct urb *urb;
458 unsigned int guardian =
459 test_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags);
460 unsigned int i; 440 unsigned int i;
461 441
442 for (i = 0; i < queue->limit; i++) {
443 entry_priv = queue->entries[i].priv_data;
444 entry_priv->urb = usb_alloc_urb(0, GFP_KERNEL);
445 if (!entry_priv->urb)
446 return -ENOMEM;
447 }
448
462 /* 449 /*
463 * Allocate the URB's 450 * If this is not the beacon queue or
451 * no guardian byte was required for the beacon,
452 * then we are done.
464 */ 453 */
454 if (rt2x00dev->bcn != queue ||
455 !test_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags))
456 return 0;
457
465 for (i = 0; i < queue->limit; i++) { 458 for (i = 0; i < queue->limit; i++) {
466 urb = usb_alloc_urb(0, GFP_KERNEL); 459 bcn_priv = queue->entries[i].priv_data;
467 if (!urb) 460 bcn_priv->guardian_urb = usb_alloc_urb(0, GFP_KERNEL);
461 if (!bcn_priv->guardian_urb)
468 return -ENOMEM; 462 return -ENOMEM;
469
470 if (queue->qid == QID_RX) {
471 priv_rx = queue->entries[i].priv_data;
472 priv_rx->urb = urb;
473 } else if (queue->qid == QID_MGMT && guardian) {
474 priv_bcn = queue->entries[i].priv_data;
475 priv_bcn->urb = urb;
476
477 urb = usb_alloc_urb(0, GFP_KERNEL);
478 if (!urb)
479 return -ENOMEM;
480
481 priv_bcn->guardian_urb = urb;
482 } else {
483 priv_tx = queue->entries[i].priv_data;
484 priv_tx->urb = urb;
485 }
486 } 463 }
487 464
488 return 0; 465 return 0;
@@ -491,38 +468,35 @@ static int rt2x00usb_alloc_urb(struct rt2x00_dev *rt2x00dev,
491static void rt2x00usb_free_urb(struct rt2x00_dev *rt2x00dev, 468static void rt2x00usb_free_urb(struct rt2x00_dev *rt2x00dev,
492 struct data_queue *queue) 469 struct data_queue *queue)
493{ 470{
494 struct queue_entry_priv_usb_rx *priv_rx; 471 struct queue_entry_priv_usb *entry_priv;
495 struct queue_entry_priv_usb_tx *priv_tx; 472 struct queue_entry_priv_usb_bcn *bcn_priv;
496 struct queue_entry_priv_usb_bcn *priv_bcn;
497 struct urb *urb;
498 unsigned int guardian =
499 test_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags);
500 unsigned int i; 473 unsigned int i;
501 474
502 if (!queue->entries) 475 if (!queue->entries)
503 return; 476 return;
504 477
505 for (i = 0; i < queue->limit; i++) { 478 for (i = 0; i < queue->limit; i++) {
506 if (queue->qid == QID_RX) { 479 entry_priv = queue->entries[i].priv_data;
507 priv_rx = queue->entries[i].priv_data; 480 usb_kill_urb(entry_priv->urb);
508 urb = priv_rx->urb; 481 usb_free_urb(entry_priv->urb);
509 } else if (queue->qid == QID_MGMT && guardian) {
510 priv_bcn = queue->entries[i].priv_data;
511
512 usb_kill_urb(priv_bcn->guardian_urb);
513 usb_free_urb(priv_bcn->guardian_urb);
514
515 urb = priv_bcn->urb;
516 } else {
517 priv_tx = queue->entries[i].priv_data;
518 urb = priv_tx->urb;
519 }
520
521 usb_kill_urb(urb);
522 usb_free_urb(urb);
523 if (queue->entries[i].skb) 482 if (queue->entries[i].skb)
524 kfree_skb(queue->entries[i].skb); 483 kfree_skb(queue->entries[i].skb);
525 } 484 }
485
486 /*
487 * If this is not the beacon queue or
488 * no guardian byte was required for the beacon,
489 * then we are done.
490 */
491 if (rt2x00dev->bcn != queue ||
492 !test_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags))
493 return;
494
495 for (i = 0; i < queue->limit; i++) {
496 bcn_priv = queue->entries[i].priv_data;
497 usb_kill_urb(bcn_priv->guardian_urb);
498 usb_free_urb(bcn_priv->guardian_urb);
499 }
526} 500}
527 501
528int rt2x00usb_initialize(struct rt2x00_dev *rt2x00dev) 502int rt2x00usb_initialize(struct rt2x00_dev *rt2x00dev)