diff options
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_mac.c | 28 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 16 |
2 files changed, 15 insertions, 29 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c index 1aadc4757e67..81ccce1faff5 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c | |||
@@ -415,36 +415,12 @@ static void ar9003_hw_set11n_ratescenario(struct ath_hw *ah, void *ds, | |||
415 | static void ar9003_hw_set11n_aggr_first(struct ath_hw *ah, void *ds, | 415 | static void ar9003_hw_set11n_aggr_first(struct ath_hw *ah, void *ds, |
416 | u32 aggrLen) | 416 | u32 aggrLen) |
417 | { | 417 | { |
418 | #define FIRST_DESC_NDELIMS 60 | ||
419 | struct ar9003_txc *ads = (struct ar9003_txc *) ds; | 418 | struct ar9003_txc *ads = (struct ar9003_txc *) ds; |
420 | 419 | ||
421 | ads->ctl12 |= (AR_IsAggr | AR_MoreAggr); | 420 | ads->ctl12 |= (AR_IsAggr | AR_MoreAggr); |
422 | 421 | ||
423 | if (ah->ent_mode & AR_ENT_OTP_MPSD) { | 422 | ads->ctl17 &= ~AR_AggrLen; |
424 | u32 ctl17, ndelim; | 423 | ads->ctl17 |= SM(aggrLen, AR_AggrLen); |
425 | /* | ||
426 | * Add delimiter when using RTS/CTS with aggregation | ||
427 | * and non enterprise AR9003 card | ||
428 | */ | ||
429 | ctl17 = ads->ctl17; | ||
430 | ndelim = MS(ctl17, AR_PadDelim); | ||
431 | |||
432 | if (ndelim < FIRST_DESC_NDELIMS) { | ||
433 | aggrLen += (FIRST_DESC_NDELIMS - ndelim) * 4; | ||
434 | ndelim = FIRST_DESC_NDELIMS; | ||
435 | } | ||
436 | |||
437 | ctl17 &= ~AR_AggrLen; | ||
438 | ctl17 |= SM(aggrLen, AR_AggrLen); | ||
439 | |||
440 | ctl17 &= ~AR_PadDelim; | ||
441 | ctl17 |= SM(ndelim, AR_PadDelim); | ||
442 | |||
443 | ads->ctl17 = ctl17; | ||
444 | } else { | ||
445 | ads->ctl17 &= ~AR_AggrLen; | ||
446 | ads->ctl17 |= SM(aggrLen, AR_AggrLen); | ||
447 | } | ||
448 | } | 424 | } |
449 | 425 | ||
450 | static void ar9003_hw_set11n_aggr_middle(struct ath_hw *ah, void *ds, | 426 | static void ar9003_hw_set11n_aggr_middle(struct ath_hw *ah, void *ds, |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index e1d1e903229b..feef0135515c 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -644,8 +644,10 @@ static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf, | |||
644 | * meet the minimum required mpdudensity. | 644 | * meet the minimum required mpdudensity. |
645 | */ | 645 | */ |
646 | static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid, | 646 | static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid, |
647 | struct ath_buf *bf, u16 frmlen) | 647 | struct ath_buf *bf, u16 frmlen, |
648 | bool first_subfrm) | ||
648 | { | 649 | { |
650 | #define FIRST_DESC_NDELIMS 60 | ||
649 | struct sk_buff *skb = bf->bf_mpdu; | 651 | struct sk_buff *skb = bf->bf_mpdu; |
650 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); | 652 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); |
651 | u32 nsymbits, nsymbols; | 653 | u32 nsymbits, nsymbols; |
@@ -668,6 +670,13 @@ static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid, | |||
668 | ndelim += ATH_AGGR_ENCRYPTDELIM; | 670 | ndelim += ATH_AGGR_ENCRYPTDELIM; |
669 | 671 | ||
670 | /* | 672 | /* |
673 | * Add delimiter when using RTS/CTS with aggregation | ||
674 | * and non enterprise AR9003 card | ||
675 | */ | ||
676 | if (first_subfrm) | ||
677 | ndelim = max(ndelim, FIRST_DESC_NDELIMS); | ||
678 | |||
679 | /* | ||
671 | * Convert desired mpdu density from microeconds to bytes based | 680 | * Convert desired mpdu density from microeconds to bytes based |
672 | * on highest rate in rate series (i.e. first rate) to determine | 681 | * on highest rate in rate series (i.e. first rate) to determine |
673 | * required minimum length for subframe. Take into account | 682 | * required minimum length for subframe. Take into account |
@@ -756,7 +765,6 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc, | |||
756 | status = ATH_AGGR_LIMITED; | 765 | status = ATH_AGGR_LIMITED; |
757 | break; | 766 | break; |
758 | } | 767 | } |
759 | nframes++; | ||
760 | 768 | ||
761 | /* add padding for previous frame to aggregation length */ | 769 | /* add padding for previous frame to aggregation length */ |
762 | al += bpad + al_delta; | 770 | al += bpad + al_delta; |
@@ -765,9 +773,11 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc, | |||
765 | * Get the delimiters needed to meet the MPDU | 773 | * Get the delimiters needed to meet the MPDU |
766 | * density for this node. | 774 | * density for this node. |
767 | */ | 775 | */ |
768 | ndelim = ath_compute_num_delims(sc, tid, bf_first, fi->framelen); | 776 | ndelim = ath_compute_num_delims(sc, tid, bf_first, fi->framelen, |
777 | !nframes); | ||
769 | bpad = PADBYTES(al_delta) + (ndelim << 2); | 778 | bpad = PADBYTES(al_delta) + (ndelim << 2); |
770 | 779 | ||
780 | nframes++; | ||
771 | bf->bf_next = NULL; | 781 | bf->bf_next = NULL; |
772 | ath9k_hw_set_desc_link(sc->sc_ah, bf->bf_desc, 0); | 782 | ath9k_hw_set_desc_link(sc->sc_ah, bf->bf_desc, 0); |
773 | 783 | ||