diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00queue.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 47 |
1 files changed, 20 insertions, 27 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index a0bd36fc4d2e..20dbdd6fb904 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -334,12 +334,10 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry, | |||
334 | txdesc->aifs = entry->queue->aifs; | 334 | txdesc->aifs = entry->queue->aifs; |
335 | 335 | ||
336 | /* | 336 | /* |
337 | * Header and alignment information. | 337 | * Header and frame information. |
338 | */ | 338 | */ |
339 | txdesc->length = entry->skb->len; | ||
339 | txdesc->header_length = ieee80211_get_hdrlen_from_skb(entry->skb); | 340 | txdesc->header_length = ieee80211_get_hdrlen_from_skb(entry->skb); |
340 | if (test_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags) && | ||
341 | (entry->skb->len > txdesc->header_length)) | ||
342 | txdesc->l2pad = L2PAD_SIZE(txdesc->header_length); | ||
343 | 341 | ||
344 | /* | 342 | /* |
345 | * Check whether this frame is to be acked. | 343 | * Check whether this frame is to be acked. |
@@ -423,6 +421,7 @@ static void rt2x00queue_write_tx_descriptor(struct queue_entry *entry, | |||
423 | { | 421 | { |
424 | struct data_queue *queue = entry->queue; | 422 | struct data_queue *queue = entry->queue; |
425 | struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; | 423 | struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; |
424 | enum rt2x00_dump_type dump_type; | ||
426 | 425 | ||
427 | rt2x00dev->ops->lib->write_tx_desc(rt2x00dev, entry->skb, txdesc); | 426 | rt2x00dev->ops->lib->write_tx_desc(rt2x00dev, entry->skb, txdesc); |
428 | 427 | ||
@@ -430,21 +429,26 @@ static void rt2x00queue_write_tx_descriptor(struct queue_entry *entry, | |||
430 | * All processing on the frame has been completed, this means | 429 | * All processing on the frame has been completed, this means |
431 | * it is now ready to be dumped to userspace through debugfs. | 430 | * it is now ready to be dumped to userspace through debugfs. |
432 | */ | 431 | */ |
433 | rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TX, entry->skb); | 432 | dump_type = (txdesc->queue == QID_BEACON) ? |
433 | DUMP_FRAME_BEACON : DUMP_FRAME_TX; | ||
434 | rt2x00debug_dump_frame(rt2x00dev, dump_type, entry->skb); | ||
435 | } | ||
436 | |||
437 | static void rt2x00queue_kick_tx_queue(struct queue_entry *entry, | ||
438 | struct txentry_desc *txdesc) | ||
439 | { | ||
440 | struct data_queue *queue = entry->queue; | ||
441 | struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; | ||
434 | 442 | ||
435 | /* | 443 | /* |
436 | * Check if we need to kick the queue, there are however a few rules | 444 | * Check if we need to kick the queue, there are however a few rules |
437 | * 1) Don't kick beacon queue | 445 | * 1) Don't kick unless this is the last in frame in a burst. |
438 | * 2) Don't kick unless this is the last in frame in a burst. | ||
439 | * When the burst flag is set, this frame is always followed | 446 | * When the burst flag is set, this frame is always followed |
440 | * by another frame which in some way are related to eachother. | 447 | * by another frame which in some way are related to eachother. |
441 | * This is true for fragments, RTS or CTS-to-self frames. | 448 | * This is true for fragments, RTS or CTS-to-self frames. |
442 | * 3) Rule 2 can be broken when the available entries | 449 | * 2) Rule 1 can be broken when the available entries |
443 | * in the queue are less then a certain threshold. | 450 | * in the queue are less then a certain threshold. |
444 | */ | 451 | */ |
445 | if (entry->queue->qid == QID_BEACON) | ||
446 | return; | ||
447 | |||
448 | if (rt2x00queue_threshold(queue) || | 452 | if (rt2x00queue_threshold(queue) || |
449 | !test_bit(ENTRY_TXD_BURST, &txdesc->flags)) | 453 | !test_bit(ENTRY_TXD_BURST, &txdesc->flags)) |
450 | rt2x00dev->ops->lib->kick_tx_queue(rt2x00dev, queue->qid); | 454 | rt2x00dev->ops->lib->kick_tx_queue(rt2x00dev, queue->qid); |
@@ -526,7 +530,8 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | |||
526 | * call failed. Since we always return NETDEV_TX_OK to mac80211, | 530 | * call failed. Since we always return NETDEV_TX_OK to mac80211, |
527 | * this frame will simply be dropped. | 531 | * this frame will simply be dropped. |
528 | */ | 532 | */ |
529 | if (unlikely(queue->rt2x00dev->ops->lib->write_tx_data(entry))) { | 533 | if (unlikely(queue->rt2x00dev->ops->lib->write_tx_data(entry, |
534 | &txdesc))) { | ||
530 | clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); | 535 | clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); |
531 | entry->skb = NULL; | 536 | entry->skb = NULL; |
532 | return -EIO; | 537 | return -EIO; |
@@ -539,6 +544,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | |||
539 | 544 | ||
540 | rt2x00queue_index_inc(queue, Q_INDEX); | 545 | rt2x00queue_index_inc(queue, Q_INDEX); |
541 | rt2x00queue_write_tx_descriptor(entry, &txdesc); | 546 | rt2x00queue_write_tx_descriptor(entry, &txdesc); |
547 | rt2x00queue_kick_tx_queue(entry, &txdesc); | ||
542 | 548 | ||
543 | return 0; | 549 | return 0; |
544 | } | 550 | } |
@@ -550,7 +556,6 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, | |||
550 | struct rt2x00_intf *intf = vif_to_intf(vif); | 556 | struct rt2x00_intf *intf = vif_to_intf(vif); |
551 | struct skb_frame_desc *skbdesc; | 557 | struct skb_frame_desc *skbdesc; |
552 | struct txentry_desc txdesc; | 558 | struct txentry_desc txdesc; |
553 | __le32 desc[16]; | ||
554 | 559 | ||
555 | if (unlikely(!intf->beacon)) | 560 | if (unlikely(!intf->beacon)) |
556 | return -ENOBUFS; | 561 | return -ENOBUFS; |
@@ -583,19 +588,10 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, | |||
583 | rt2x00queue_create_tx_descriptor(intf->beacon, &txdesc); | 588 | rt2x00queue_create_tx_descriptor(intf->beacon, &txdesc); |
584 | 589 | ||
585 | /* | 590 | /* |
586 | * For the descriptor we use a local array from where the | ||
587 | * driver can move it to the correct location required for | ||
588 | * the hardware. | ||
589 | */ | ||
590 | memset(desc, 0, sizeof(desc)); | ||
591 | |||
592 | /* | ||
593 | * Fill in skb descriptor | 591 | * Fill in skb descriptor |
594 | */ | 592 | */ |
595 | skbdesc = get_skb_frame_desc(intf->beacon->skb); | 593 | skbdesc = get_skb_frame_desc(intf->beacon->skb); |
596 | memset(skbdesc, 0, sizeof(*skbdesc)); | 594 | memset(skbdesc, 0, sizeof(*skbdesc)); |
597 | skbdesc->desc = desc; | ||
598 | skbdesc->desc_len = intf->beacon->queue->desc_size; | ||
599 | skbdesc->entry = intf->beacon; | 595 | skbdesc->entry = intf->beacon; |
600 | 596 | ||
601 | /* | 597 | /* |
@@ -604,12 +600,9 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, | |||
604 | rt2x00queue_write_tx_descriptor(intf->beacon, &txdesc); | 600 | rt2x00queue_write_tx_descriptor(intf->beacon, &txdesc); |
605 | 601 | ||
606 | /* | 602 | /* |
607 | * Send beacon to hardware. | 603 | * Send beacon to hardware and enable beacon genaration.. |
608 | * Also enable beacon generation, which might have been disabled | ||
609 | * by the driver during the config_beacon() callback function. | ||
610 | */ | 604 | */ |
611 | rt2x00dev->ops->lib->write_beacon(intf->beacon); | 605 | rt2x00dev->ops->lib->write_beacon(intf->beacon, &txdesc); |
612 | rt2x00dev->ops->lib->kick_tx_queue(rt2x00dev, QID_BEACON); | ||
613 | 606 | ||
614 | mutex_unlock(&intf->beacon_skb_mutex); | 607 | mutex_unlock(&intf->beacon_skb_mutex); |
615 | 608 | ||