diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00dev.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 49 |
1 files changed, 23 insertions, 26 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index d341764e1b24..69e233610c94 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -415,7 +415,6 @@ static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac, | |||
415 | struct rt2x00_dev *rt2x00dev = data; | 415 | struct rt2x00_dev *rt2x00dev = data; |
416 | struct rt2x00_intf *intf = vif_to_intf(vif); | 416 | struct rt2x00_intf *intf = vif_to_intf(vif); |
417 | struct sk_buff *skb; | 417 | struct sk_buff *skb; |
418 | struct ieee80211_tx_control control; | ||
419 | struct ieee80211_bss_conf conf; | 418 | struct ieee80211_bss_conf conf; |
420 | int delayed_flags; | 419 | int delayed_flags; |
421 | 420 | ||
@@ -433,9 +432,9 @@ static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac, | |||
433 | spin_unlock(&intf->lock); | 432 | spin_unlock(&intf->lock); |
434 | 433 | ||
435 | if (delayed_flags & DELAYED_UPDATE_BEACON) { | 434 | if (delayed_flags & DELAYED_UPDATE_BEACON) { |
436 | skb = ieee80211_beacon_get(rt2x00dev->hw, vif, &control); | 435 | skb = ieee80211_beacon_get(rt2x00dev->hw, vif); |
437 | if (skb && rt2x00dev->ops->hw->beacon_update(rt2x00dev->hw, | 436 | if (skb && |
438 | skb, &control)) | 437 | rt2x00dev->ops->hw->beacon_update(rt2x00dev->hw, skb)) |
439 | dev_kfree_skb(skb); | 438 | dev_kfree_skb(skb); |
440 | } | 439 | } |
441 | 440 | ||
@@ -494,8 +493,13 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
494 | struct txdone_entry_desc *txdesc) | 493 | struct txdone_entry_desc *txdesc) |
495 | { | 494 | { |
496 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | 495 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
497 | struct skb_frame_desc *skbdesc; | 496 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb); |
498 | struct ieee80211_tx_status tx_status; | 497 | |
498 | /* | ||
499 | * Send frame to debugfs immediately, after this call is completed | ||
500 | * we are going to overwrite the skb->cb array. | ||
501 | */ | ||
502 | rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry->skb); | ||
499 | 503 | ||
500 | /* | 504 | /* |
501 | * Update TX statistics. | 505 | * Update TX statistics. |
@@ -508,21 +512,20 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
508 | /* | 512 | /* |
509 | * Initialize TX status | 513 | * Initialize TX status |
510 | */ | 514 | */ |
511 | tx_status.flags = 0; | 515 | memset(&tx_info->status, 0, sizeof(tx_info->status)); |
512 | tx_status.ack_signal = 0; | 516 | tx_info->status.ack_signal = 0; |
513 | tx_status.excessive_retries = | 517 | tx_info->status.excessive_retries = |
514 | test_bit(TXDONE_EXCESSIVE_RETRY, &txdesc->flags); | 518 | test_bit(TXDONE_EXCESSIVE_RETRY, &txdesc->flags); |
515 | tx_status.retry_count = txdesc->retry; | 519 | tx_info->status.retry_count = txdesc->retry; |
516 | memcpy(&tx_status.control, txdesc->control, sizeof(*txdesc->control)); | ||
517 | 520 | ||
518 | if (!(tx_status.control.flags & IEEE80211_TXCTL_NO_ACK)) { | 521 | if (!(tx_info->flags & IEEE80211_TX_CTL_NO_ACK)) { |
519 | if (test_bit(TXDONE_SUCCESS, &txdesc->flags)) | 522 | if (test_bit(TXDONE_SUCCESS, &txdesc->flags)) |
520 | tx_status.flags |= IEEE80211_TX_STATUS_ACK; | 523 | tx_info->flags |= IEEE80211_TX_STAT_ACK; |
521 | else if (test_bit(TXDONE_FAILURE, &txdesc->flags)) | 524 | else if (test_bit(TXDONE_FAILURE, &txdesc->flags)) |
522 | rt2x00dev->low_level_stats.dot11ACKFailureCount++; | 525 | rt2x00dev->low_level_stats.dot11ACKFailureCount++; |
523 | } | 526 | } |
524 | 527 | ||
525 | if (tx_status.control.flags & IEEE80211_TXCTL_USE_RTS_CTS) { | 528 | if (tx_info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) { |
526 | if (test_bit(TXDONE_SUCCESS, &txdesc->flags)) | 529 | if (test_bit(TXDONE_SUCCESS, &txdesc->flags)) |
527 | rt2x00dev->low_level_stats.dot11RTSSuccessCount++; | 530 | rt2x00dev->low_level_stats.dot11RTSSuccessCount++; |
528 | else if (test_bit(TXDONE_FAILURE, &txdesc->flags)) | 531 | else if (test_bit(TXDONE_FAILURE, &txdesc->flags)) |
@@ -530,19 +533,13 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
530 | } | 533 | } |
531 | 534 | ||
532 | /* | 535 | /* |
533 | * Send the tx_status to debugfs. Only send the status report | 536 | * Only send the status report to mac80211 when TX status was |
534 | * to mac80211 when the frame originated from there. If this was | 537 | * requested by it. If this was a extra frame coming through |
535 | * a extra frame coming through a mac80211 library call (RTS/CTS) | 538 | * a mac80211 library call (RTS/CTS) then we should not send the |
536 | * then we should not send the status report back. | 539 | * status report back. |
537 | * If send to mac80211, mac80211 will clean up the skb structure, | ||
538 | * otherwise we have to do it ourself. | ||
539 | */ | 540 | */ |
540 | rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry->skb); | 541 | if (tx_info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) |
541 | 542 | ieee80211_tx_status_irqsafe(rt2x00dev->hw, entry->skb); | |
542 | skbdesc = get_skb_frame_desc(entry->skb); | ||
543 | if (!(skbdesc->flags & FRAME_DESC_DRIVER_GENERATED)) | ||
544 | ieee80211_tx_status_irqsafe(rt2x00dev->hw, | ||
545 | entry->skb, &tx_status); | ||
546 | else | 543 | else |
547 | dev_kfree_skb_irq(entry->skb); | 544 | dev_kfree_skb_irq(entry->skb); |
548 | entry->skb = NULL; | 545 | entry->skb = NULL; |