diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00dev.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index f42283ad7b02..182952249a19 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -508,6 +508,15 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
508 | rt2x00queue_unmap_skb(rt2x00dev, entry->skb); | 508 | rt2x00queue_unmap_skb(rt2x00dev, entry->skb); |
509 | 509 | ||
510 | /* | 510 | /* |
511 | * If the IV/EIV data was stripped from the frame before it was | ||
512 | * passed to the hardware, we should now reinsert it again because | ||
513 | * mac80211 will expect the the same data to be present it the | ||
514 | * frame as it was passed to us. | ||
515 | */ | ||
516 | if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags)) | ||
517 | rt2x00crypto_tx_insert_iv(entry->skb); | ||
518 | |||
519 | /* | ||
511 | * Send frame to debugfs immediately, after this call is completed | 520 | * Send frame to debugfs immediately, after this call is completed |
512 | * we are going to overwrite the skb->cb array. | 521 | * we are going to overwrite the skb->cb array. |
513 | */ | 522 | */ |
@@ -585,7 +594,7 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev, | |||
585 | struct ieee80211_supported_band *sband; | 594 | struct ieee80211_supported_band *sband; |
586 | struct ieee80211_hdr *hdr; | 595 | struct ieee80211_hdr *hdr; |
587 | const struct rt2x00_rate *rate; | 596 | const struct rt2x00_rate *rate; |
588 | unsigned int header_size; | 597 | unsigned int header_length; |
589 | unsigned int align; | 598 | unsigned int align; |
590 | unsigned int i; | 599 | unsigned int i; |
591 | int idx = -1; | 600 | int idx = -1; |
@@ -613,10 +622,19 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev, | |||
613 | * The data behind the ieee80211 header must be | 622 | * The data behind the ieee80211 header must be |
614 | * aligned on a 4 byte boundary. | 623 | * aligned on a 4 byte boundary. |
615 | */ | 624 | */ |
616 | header_size = ieee80211_get_hdrlen_from_skb(entry->skb); | 625 | header_length = ieee80211_get_hdrlen_from_skb(entry->skb); |
617 | align = ((unsigned long)(entry->skb->data + header_size)) & 3; | 626 | align = ((unsigned long)(entry->skb->data + header_length)) & 3; |
618 | 627 | ||
619 | if (align) { | 628 | /* |
629 | * Hardware might have stripped the IV/EIV/ICV data, | ||
630 | * in that case it is possible that the data was | ||
631 | * provided seperately (through hardware descriptor) | ||
632 | * in which case we should reinsert the data into the frame. | ||
633 | */ | ||
634 | if ((rxdesc.flags & RX_FLAG_IV_STRIPPED)) { | ||
635 | rt2x00crypto_rx_insert_iv(entry->skb, align, | ||
636 | header_length, &rxdesc); | ||
637 | } else if (align) { | ||
620 | skb_push(entry->skb, align); | 638 | skb_push(entry->skb, align); |
621 | /* Move entire frame in 1 command */ | 639 | /* Move entire frame in 1 command */ |
622 | memmove(entry->skb->data, entry->skb->data + align, | 640 | memmove(entry->skb->data, entry->skb->data + align, |
@@ -657,6 +675,10 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev, | |||
657 | (rxdesc.dev_flags & RXDONE_MY_BSS)) | 675 | (rxdesc.dev_flags & RXDONE_MY_BSS)) |
658 | rt2x00lib_update_link_stats(&rt2x00dev->link, rxdesc.rssi); | 676 | rt2x00lib_update_link_stats(&rt2x00dev->link, rxdesc.rssi); |
659 | 677 | ||
678 | rt2x00debug_update_crypto(rt2x00dev, | ||
679 | rxdesc.cipher, | ||
680 | rxdesc.cipher_status); | ||
681 | |||
660 | rt2x00dev->link.qual.rx_success++; | 682 | rt2x00dev->link.qual.rx_success++; |
661 | 683 | ||
662 | rx_status->mactime = rxdesc.timestamp; | 684 | rx_status->mactime = rxdesc.timestamp; |