diff options
-rw-r--r-- | drivers/net/wireless/ath9k/core.h | 8 | ||||
-rw-r--r-- | drivers/net/wireless/ath9k/mac.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/ath9k/rc.c | 82 | ||||
-rw-r--r-- | drivers/net/wireless/ath9k/xmit.c | 135 |
4 files changed, 111 insertions, 117 deletions
diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h index 9a7bb1b5cd51..8683fc8ddb3c 100644 --- a/drivers/net/wireless/ath9k/core.h +++ b/drivers/net/wireless/ath9k/core.h | |||
@@ -233,7 +233,6 @@ struct ath_buf_state { | |||
233 | #define bf_isht(bf) (bf->bf_state.bf_type & BUF_HT) | 233 | #define bf_isht(bf) (bf->bf_state.bf_type & BUF_HT) |
234 | #define bf_isretried(bf) (bf->bf_state.bf_type & BUF_RETRY) | 234 | #define bf_isretried(bf) (bf->bf_state.bf_type & BUF_RETRY) |
235 | #define bf_isxretried(bf) (bf->bf_state.bf_type & BUF_XRETRY) | 235 | #define bf_isxretried(bf) (bf->bf_state.bf_type & BUF_XRETRY) |
236 | #define bf_isshpreamble(bf) (bf->bf_state.bf_type & BUF_SHORT_PREAMBLE) | ||
237 | #define bf_isbar(bf) (bf->bf_state.bf_type & BUF_BAR) | 236 | #define bf_isbar(bf) (bf->bf_state.bf_type & BUF_BAR) |
238 | #define bf_ispspoll(bf) (bf->bf_state.bf_type & BUF_PSPOLL) | 237 | #define bf_ispspoll(bf) (bf->bf_state.bf_type & BUF_PSPOLL) |
239 | #define bf_isaggrburst(bf) (bf->bf_state.bf_type & BUF_AGGR_BURST) | 238 | #define bf_isaggrburst(bf) (bf->bf_state.bf_type & BUF_AGGR_BURST) |
@@ -658,12 +657,6 @@ struct ath_rfkill { | |||
658 | #define ATH_RSSI_DUMMY_MARKER 0x127 | 657 | #define ATH_RSSI_DUMMY_MARKER 0x127 |
659 | #define ATH_RATE_DUMMY_MARKER 0 | 658 | #define ATH_RATE_DUMMY_MARKER 0 |
660 | 659 | ||
661 | enum PROT_MODE { | ||
662 | PROT_M_NONE = 0, | ||
663 | PROT_M_RTSCTS, | ||
664 | PROT_M_CTSONLY | ||
665 | }; | ||
666 | |||
667 | #define SC_OP_INVALID BIT(0) | 660 | #define SC_OP_INVALID BIT(0) |
668 | #define SC_OP_BEACONS BIT(1) | 661 | #define SC_OP_BEACONS BIT(1) |
669 | #define SC_OP_RXAGGR BIT(2) | 662 | #define SC_OP_RXAGGR BIT(2) |
@@ -715,7 +708,6 @@ struct ath_softc { | |||
715 | u8 sc_splitmic; | 708 | u8 sc_splitmic; |
716 | atomic_t ps_usecount; | 709 | atomic_t ps_usecount; |
717 | enum ath9k_int sc_imask; | 710 | enum ath9k_int sc_imask; |
718 | enum PROT_MODE sc_protmode; | ||
719 | enum ath9k_ht_extprotspacing sc_ht_extprotspacing; | 711 | enum ath9k_ht_extprotspacing sc_ht_extprotspacing; |
720 | enum ath9k_ht_macmode tx_chan_width; | 712 | enum ath9k_ht_macmode tx_chan_width; |
721 | 713 | ||
diff --git a/drivers/net/wireless/ath9k/mac.c b/drivers/net/wireless/ath9k/mac.c index ef832a5ebbd8..2427c44a8c35 100644 --- a/drivers/net/wireless/ath9k/mac.c +++ b/drivers/net/wireless/ath9k/mac.c | |||
@@ -344,9 +344,6 @@ void ath9k_hw_set11n_ratescenario(struct ath_hal *ah, struct ath_desc *ds, | |||
344 | struct ar5416_desc *last_ads = AR5416DESC(lastds); | 344 | struct ar5416_desc *last_ads = AR5416DESC(lastds); |
345 | u32 ds_ctl0; | 345 | u32 ds_ctl0; |
346 | 346 | ||
347 | (void) nseries; | ||
348 | (void) rtsctsDuration; | ||
349 | |||
350 | if (flags & (ATH9K_TXDESC_RTSENA | ATH9K_TXDESC_CTSENA)) { | 347 | if (flags & (ATH9K_TXDESC_RTSENA | ATH9K_TXDESC_CTSENA)) { |
351 | ds_ctl0 = ads->ds_ctl0; | 348 | ds_ctl0 = ads->ds_ctl0; |
352 | 349 | ||
diff --git a/drivers/net/wireless/ath9k/rc.c b/drivers/net/wireless/ath9k/rc.c index 8bc7bb50c7fc..a8c4f9757eb1 100644 --- a/drivers/net/wireless/ath9k/rc.c +++ b/drivers/net/wireless/ath9k/rc.c | |||
@@ -747,14 +747,17 @@ static u8 ath_rc_ratefind_ht(struct ath_softc *sc, | |||
747 | return rate; | 747 | return rate; |
748 | } | 748 | } |
749 | 749 | ||
750 | static void ath_rc_rate_set_series(struct ath_rate_table *rate_table , | 750 | static void ath_rc_rate_set_series(struct ath_rate_table *rate_table, |
751 | struct ieee80211_tx_rate *rate, | 751 | struct ieee80211_tx_rate *rate, |
752 | struct ieee80211_tx_rate_control *txrc, | ||
752 | u8 tries, u8 rix, int rtsctsenable) | 753 | u8 tries, u8 rix, int rtsctsenable) |
753 | { | 754 | { |
754 | rate->count = tries; | 755 | rate->count = tries; |
755 | rate->idx = rix; | 756 | rate->idx = rix; |
756 | 757 | ||
757 | if (rtsctsenable) | 758 | if (txrc->short_preamble) |
759 | rate->flags |= IEEE80211_TX_RC_USE_SHORT_PREAMBLE; | ||
760 | if (txrc->rts || rtsctsenable) | ||
758 | rate->flags |= IEEE80211_TX_RC_USE_RTS_CTS; | 761 | rate->flags |= IEEE80211_TX_RC_USE_RTS_CTS; |
759 | if (WLAN_RC_PHY_40(rate_table->info[rix].phy)) | 762 | if (WLAN_RC_PHY_40(rate_table->info[rix].phy)) |
760 | rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; | 763 | rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; |
@@ -764,6 +767,43 @@ static void ath_rc_rate_set_series(struct ath_rate_table *rate_table , | |||
764 | rate->flags |= IEEE80211_TX_RC_MCS; | 767 | rate->flags |= IEEE80211_TX_RC_MCS; |
765 | } | 768 | } |
766 | 769 | ||
770 | static void ath_rc_rate_set_rtscts(struct ath_softc *sc, | ||
771 | struct ath_rate_table *rate_table, | ||
772 | struct ieee80211_tx_info *tx_info) | ||
773 | { | ||
774 | struct ieee80211_tx_rate *rates = tx_info->control.rates; | ||
775 | int i = 0, rix = 0, cix, enable_g_protection = 0; | ||
776 | |||
777 | /* get the cix for the lowest valid rix */ | ||
778 | for (i = 3; i >= 0; i--) { | ||
779 | if (rates[i].count && (rates[i].idx >= 0)) { | ||
780 | rix = rates[i].idx; | ||
781 | break; | ||
782 | } | ||
783 | } | ||
784 | cix = rate_table->info[rix].ctrl_rate; | ||
785 | |||
786 | /* All protection frames are transmited at 2Mb/s for 802.11g, | ||
787 | * otherwise we transmit them at 1Mb/s */ | ||
788 | if (sc->hw->conf.channel->band == IEEE80211_BAND_2GHZ && | ||
789 | !conf_is_ht(&sc->hw->conf)) | ||
790 | enable_g_protection = 1; | ||
791 | |||
792 | /* | ||
793 | * If 802.11g protection is enabled, determine whether to use RTS/CTS or | ||
794 | * just CTS. Note that this is only done for OFDM/HT unicast frames. | ||
795 | */ | ||
796 | if ((sc->sc_flags & SC_OP_PROTECT_ENABLE) && | ||
797 | !(tx_info->flags & IEEE80211_TX_CTL_NO_ACK) && | ||
798 | (rate_table->info[rix].phy == WLAN_RC_PHY_OFDM || | ||
799 | WLAN_RC_PHY_HT(rate_table->info[rix].phy))) { | ||
800 | rates[0].flags |= IEEE80211_TX_RC_USE_CTS_PROTECT; | ||
801 | cix = rate_table->info[enable_g_protection].ctrl_rate; | ||
802 | } | ||
803 | |||
804 | tx_info->control.rts_cts_rate_idx = cix; | ||
805 | } | ||
806 | |||
767 | static u8 ath_rc_rate_getidx(struct ath_softc *sc, | 807 | static u8 ath_rc_rate_getidx(struct ath_softc *sc, |
768 | struct ath_rate_priv *ath_rc_priv, | 808 | struct ath_rate_priv *ath_rc_priv, |
769 | struct ath_rate_table *rate_table, | 809 | struct ath_rate_table *rate_table, |
@@ -801,6 +841,8 @@ static void ath_rc_ratefind(struct ath_softc *sc, | |||
801 | struct sk_buff *skb = txrc->skb; | 841 | struct sk_buff *skb = txrc->skb; |
802 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); | 842 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); |
803 | struct ieee80211_tx_rate *rates = tx_info->control.rates; | 843 | struct ieee80211_tx_rate *rates = tx_info->control.rates; |
844 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | ||
845 | __le16 fc = hdr->frame_control; | ||
804 | u8 try_per_rate = 0, i = 0, rix, nrix; | 846 | u8 try_per_rate = 0, i = 0, rix, nrix; |
805 | int is_probe = 0; | 847 | int is_probe = 0; |
806 | 848 | ||
@@ -811,7 +853,7 @@ static void ath_rc_ratefind(struct ath_softc *sc, | |||
811 | if (is_probe) { | 853 | if (is_probe) { |
812 | /* set one try for probe rates. For the | 854 | /* set one try for probe rates. For the |
813 | * probes don't enable rts */ | 855 | * probes don't enable rts */ |
814 | ath_rc_rate_set_series(rate_table, &rates[i++], | 856 | ath_rc_rate_set_series(rate_table, &rates[i++], txrc, |
815 | 1, nrix, 0); | 857 | 1, nrix, 0); |
816 | 858 | ||
817 | try_per_rate = (ATH_11N_TXMAXTRY/4); | 859 | try_per_rate = (ATH_11N_TXMAXTRY/4); |
@@ -820,12 +862,12 @@ static void ath_rc_ratefind(struct ath_softc *sc, | |||
820 | */ | 862 | */ |
821 | nrix = ath_rc_rate_getidx(sc, ath_rc_priv, | 863 | nrix = ath_rc_rate_getidx(sc, ath_rc_priv, |
822 | rate_table, nrix, 1, 0); | 864 | rate_table, nrix, 1, 0); |
823 | ath_rc_rate_set_series(rate_table, &rates[i++], | 865 | ath_rc_rate_set_series(rate_table, &rates[i++], txrc, |
824 | try_per_rate, nrix, 0); | 866 | try_per_rate, nrix, 0); |
825 | } else { | 867 | } else { |
826 | try_per_rate = (ATH_11N_TXMAXTRY/4); | 868 | try_per_rate = (ATH_11N_TXMAXTRY/4); |
827 | /* Set the choosen rate. No RTS for first series entry. */ | 869 | /* Set the choosen rate. No RTS for first series entry. */ |
828 | ath_rc_rate_set_series(rate_table, &rates[i++], | 870 | ath_rc_rate_set_series(rate_table, &rates[i++], txrc, |
829 | try_per_rate, nrix, 0); | 871 | try_per_rate, nrix, 0); |
830 | } | 872 | } |
831 | 873 | ||
@@ -841,7 +883,7 @@ static void ath_rc_ratefind(struct ath_softc *sc, | |||
841 | nrix = ath_rc_rate_getidx(sc, ath_rc_priv, | 883 | nrix = ath_rc_rate_getidx(sc, ath_rc_priv, |
842 | rate_table, nrix, 1, min_rate); | 884 | rate_table, nrix, 1, min_rate); |
843 | /* All other rates in the series have RTS enabled */ | 885 | /* All other rates in the series have RTS enabled */ |
844 | ath_rc_rate_set_series(rate_table, &rates[i], | 886 | ath_rc_rate_set_series(rate_table, &rates[i], txrc, |
845 | try_num, nrix, 1); | 887 | try_num, nrix, 1); |
846 | } | 888 | } |
847 | 889 | ||
@@ -871,6 +913,24 @@ static void ath_rc_ratefind(struct ath_softc *sc, | |||
871 | rates[3].flags = rates[2].flags; | 913 | rates[3].flags = rates[2].flags; |
872 | } | 914 | } |
873 | } | 915 | } |
916 | |||
917 | /* | ||
918 | * Force hardware to use computed duration for next | ||
919 | * fragment by disabling multi-rate retry, which | ||
920 | * updates duration based on the multi-rate duration table. | ||
921 | * | ||
922 | * FIXME: Fix duration | ||
923 | */ | ||
924 | if (!(tx_info->flags & IEEE80211_TX_CTL_NO_ACK) && | ||
925 | (ieee80211_has_morefrags(fc) || | ||
926 | (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG))) { | ||
927 | rates[1].count = rates[2].count = rates[3].count = 0; | ||
928 | rates[1].idx = rates[2].idx = rates[3].idx = 0; | ||
929 | rates[0].count = ATH_TXMAXTRY; | ||
930 | } | ||
931 | |||
932 | /* Setup RTS/CTS */ | ||
933 | ath_rc_rate_set_rtscts(sc, rate_table, tx_info); | ||
874 | } | 934 | } |
875 | 935 | ||
876 | static bool ath_rc_update_per(struct ath_softc *sc, | 936 | static bool ath_rc_update_per(struct ath_softc *sc, |
@@ -1385,16 +1445,16 @@ static void ath_rc_init(struct ath_softc *sc, | |||
1385 | if (!rateset->rs_nrates) { | 1445 | if (!rateset->rs_nrates) { |
1386 | /* No working rate, just initialize valid rates */ | 1446 | /* No working rate, just initialize valid rates */ |
1387 | hi = ath_rc_init_validrates(ath_rc_priv, rate_table, | 1447 | hi = ath_rc_init_validrates(ath_rc_priv, rate_table, |
1388 | ath_rc_priv->ht_cap); | 1448 | ath_rc_priv->ht_cap); |
1389 | } else { | 1449 | } else { |
1390 | /* Use intersection of working rates and valid rates */ | 1450 | /* Use intersection of working rates and valid rates */ |
1391 | hi = ath_rc_setvalid_rates(ath_rc_priv, rate_table, | 1451 | hi = ath_rc_setvalid_rates(ath_rc_priv, rate_table, |
1392 | rateset, ath_rc_priv->ht_cap); | 1452 | rateset, ath_rc_priv->ht_cap); |
1393 | if (ath_rc_priv->ht_cap & WLAN_RC_HT_FLAG) { | 1453 | if (ath_rc_priv->ht_cap & WLAN_RC_HT_FLAG) { |
1394 | hthi = ath_rc_setvalid_htrates(ath_rc_priv, | 1454 | hthi = ath_rc_setvalid_htrates(ath_rc_priv, |
1395 | rate_table, | 1455 | rate_table, |
1396 | ht_mcs, | 1456 | ht_mcs, |
1397 | ath_rc_priv->ht_cap); | 1457 | ath_rc_priv->ht_cap); |
1398 | } | 1458 | } |
1399 | hi = A_MAX(hi, hthi); | 1459 | hi = A_MAX(hi, hthi); |
1400 | } | 1460 | } |
diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c index d483f3c13501..e14bceaef125 100644 --- a/drivers/net/wireless/ath9k/xmit.c +++ b/drivers/net/wireless/ath9k/xmit.c | |||
@@ -1386,8 +1386,6 @@ static int setup_tx_flags(struct ath_softc *sc, struct sk_buff *skb, | |||
1386 | 1386 | ||
1387 | if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) | 1387 | if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) |
1388 | flags |= ATH9K_TXDESC_NOACK; | 1388 | flags |= ATH9K_TXDESC_NOACK; |
1389 | if (tx_info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) | ||
1390 | flags |= ATH9K_TXDESC_RTSENA; | ||
1391 | 1389 | ||
1392 | return flags; | 1390 | return flags; |
1393 | } | 1391 | } |
@@ -1433,137 +1431,86 @@ static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, struct ath_buf *bf, | |||
1433 | 1431 | ||
1434 | static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf) | 1432 | static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf) |
1435 | { | 1433 | { |
1436 | struct ath_hal *ah = sc->sc_ah; | 1434 | struct ath_rate_table *rt = sc->cur_rate_table; |
1437 | struct ath_rate_table *rt; | ||
1438 | struct ath_desc *ds = bf->bf_desc; | ||
1439 | struct ath_desc *lastds = bf->bf_lastbf->bf_desc; | ||
1440 | struct ath9k_11n_rate_series series[4]; | 1435 | struct ath9k_11n_rate_series series[4]; |
1441 | struct sk_buff *skb; | 1436 | struct sk_buff *skb; |
1442 | struct ieee80211_tx_info *tx_info; | 1437 | struct ieee80211_tx_info *tx_info; |
1443 | struct ieee80211_tx_rate *rates; | 1438 | struct ieee80211_tx_rate *rates; |
1444 | struct ieee80211_hdr *hdr; | 1439 | int i, flags = 0; |
1445 | struct ieee80211_hw *hw = sc->hw; | 1440 | u8 rix = 0, ctsrate = 0; |
1446 | int i, flags, rtsctsena = 0, enable_g_protection = 0; | ||
1447 | u32 ctsduration = 0; | ||
1448 | u8 rix = 0, cix, ctsrate = 0; | ||
1449 | __le16 fc; | ||
1450 | 1441 | ||
1451 | memset(series, 0, sizeof(struct ath9k_11n_rate_series) * 4); | 1442 | memset(series, 0, sizeof(struct ath9k_11n_rate_series) * 4); |
1452 | 1443 | ||
1453 | skb = (struct sk_buff *)bf->bf_mpdu; | 1444 | skb = (struct sk_buff *)bf->bf_mpdu; |
1454 | hdr = (struct ieee80211_hdr *)skb->data; | ||
1455 | fc = hdr->frame_control; | ||
1456 | tx_info = IEEE80211_SKB_CB(skb); | 1445 | tx_info = IEEE80211_SKB_CB(skb); |
1457 | rates = tx_info->control.rates; | 1446 | rates = tx_info->control.rates; |
1458 | 1447 | ||
1459 | if (ieee80211_has_morefrags(fc) || | ||
1460 | (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG)) { | ||
1461 | rates[1].count = rates[2].count = rates[3].count = 0; | ||
1462 | rates[1].idx = rates[2].idx = rates[3].idx = 0; | ||
1463 | rates[0].count = ATH_TXMAXTRY; | ||
1464 | } | ||
1465 | |||
1466 | /* get the cix for the lowest valid rix */ | ||
1467 | rt = sc->cur_rate_table; | ||
1468 | for (i = 3; i >= 0; i--) { | ||
1469 | if (rates[i].count && (rates[i].idx >= 0)) { | ||
1470 | rix = rates[i].idx; | ||
1471 | break; | ||
1472 | } | ||
1473 | } | ||
1474 | |||
1475 | flags = (bf->bf_flags & (ATH9K_TXDESC_RTSENA | ATH9K_TXDESC_CTSENA)); | ||
1476 | cix = rt->info[rix].ctrl_rate; | ||
1477 | |||
1478 | /* All protection frames are transmited at 2Mb/s for 802.11g, | ||
1479 | * otherwise we transmit them at 1Mb/s */ | ||
1480 | if (hw->conf.channel->band == IEEE80211_BAND_2GHZ && | ||
1481 | !conf_is_ht(&hw->conf)) | ||
1482 | enable_g_protection = 1; | ||
1483 | |||
1484 | /* | 1448 | /* |
1485 | * If 802.11g protection is enabled, determine whether to use RTS/CTS or | 1449 | * We check if Short Preamble is needed for the CTS rate by |
1486 | * just CTS. Note that this is only done for OFDM/HT unicast frames. | 1450 | * checking the BSS's global flag. |
1451 | * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used. | ||
1487 | */ | 1452 | */ |
1488 | if (sc->sc_protmode != PROT_M_NONE && !(bf->bf_flags & ATH9K_TXDESC_NOACK) | 1453 | if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) |
1489 | && (rt->info[rix].phy == WLAN_RC_PHY_OFDM || | 1454 | ctsrate = rt->info[tx_info->control.rts_cts_rate_idx].ratecode | |
1490 | WLAN_RC_PHY_HT(rt->info[rix].phy))) { | 1455 | rt->info[tx_info->control.rts_cts_rate_idx].short_preamble; |
1491 | if (sc->sc_protmode == PROT_M_RTSCTS) | 1456 | else |
1492 | flags = ATH9K_TXDESC_RTSENA; | 1457 | ctsrate = rt->info[tx_info->control.rts_cts_rate_idx].ratecode; |
1493 | else if (sc->sc_protmode == PROT_M_CTSONLY) | ||
1494 | flags = ATH9K_TXDESC_CTSENA; | ||
1495 | |||
1496 | cix = rt->info[enable_g_protection].ctrl_rate; | ||
1497 | rtsctsena = 1; | ||
1498 | } | ||
1499 | 1458 | ||
1500 | /* For 11n, the default behavior is to enable RTS for hw retried frames. | 1459 | /* |
1501 | * We enable the global flag here and let rate series flags determine | 1460 | * ATH9K_TXDESC_RTSENA and ATH9K_TXDESC_CTSENA are mutually exclusive. |
1502 | * which rates will actually use RTS. | 1461 | * Check the first rate in the series to decide whether RTS/CTS |
1462 | * or CTS-to-self has to be used. | ||
1503 | */ | 1463 | */ |
1504 | if ((ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) && bf_isdata(bf)) { | 1464 | if (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) |
1505 | /* 802.11g protection not needed, use our default behavior */ | 1465 | flags = ATH9K_TXDESC_CTSENA; |
1506 | if (!rtsctsena) | 1466 | else if (rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) |
1507 | flags = ATH9K_TXDESC_RTSENA; | 1467 | flags = ATH9K_TXDESC_RTSENA; |
1508 | } | ||
1509 | 1468 | ||
1510 | /* Set protection if aggregate protection on */ | 1469 | /* FIXME: Handle aggregation protection */ |
1511 | if (sc->sc_config.ath_aggr_prot && | 1470 | if (sc->sc_config.ath_aggr_prot && |
1512 | (!bf_isaggr(bf) || (bf_isaggr(bf) && bf->bf_al < 8192))) { | 1471 | (!bf_isaggr(bf) || (bf_isaggr(bf) && bf->bf_al < 8192))) { |
1513 | flags = ATH9K_TXDESC_RTSENA; | 1472 | flags = ATH9K_TXDESC_RTSENA; |
1514 | cix = rt->info[enable_g_protection].ctrl_rate; | ||
1515 | rtsctsena = 1; | ||
1516 | } | 1473 | } |
1517 | 1474 | ||
1518 | /* For AR5416 - RTS cannot be followed by a frame larger than 8K */ | 1475 | /* For AR5416 - RTS cannot be followed by a frame larger than 8K */ |
1519 | if (bf_isaggr(bf) && (bf->bf_al > ah->ah_caps.rts_aggr_limit)) | 1476 | if (bf_isaggr(bf) && (bf->bf_al > sc->sc_ah->ah_caps.rts_aggr_limit)) |
1520 | flags &= ~(ATH9K_TXDESC_RTSENA); | 1477 | flags &= ~(ATH9K_TXDESC_RTSENA); |
1521 | 1478 | ||
1522 | /* | ||
1523 | * CTS transmit rate is derived from the transmit rate by looking in the | ||
1524 | * h/w rate table. We must also factor in whether or not a short | ||
1525 | * preamble is to be used. NB: cix is set above where RTS/CTS is enabled | ||
1526 | */ | ||
1527 | ctsrate = rt->info[cix].ratecode | | ||
1528 | (bf_isshpreamble(bf) ? rt->info[cix].short_preamble : 0); | ||
1529 | |||
1530 | for (i = 0; i < 4; i++) { | 1479 | for (i = 0; i < 4; i++) { |
1531 | if (!rates[i].count || (rates[i].idx < 0)) | 1480 | if (!rates[i].count || (rates[i].idx < 0)) |
1532 | continue; | 1481 | continue; |
1533 | 1482 | ||
1534 | rix = rates[i].idx; | 1483 | rix = rates[i].idx; |
1535 | |||
1536 | series[i].Rate = rt->info[rix].ratecode | | ||
1537 | (bf_isshpreamble(bf) ? rt->info[rix].short_preamble : 0); | ||
1538 | |||
1539 | series[i].Tries = rates[i].count; | 1484 | series[i].Tries = rates[i].count; |
1485 | series[i].ChSel = sc->sc_tx_chainmask; | ||
1540 | 1486 | ||
1541 | series[i].RateFlags = ( | 1487 | if (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE) |
1542 | (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS) ? | 1488 | series[i].Rate = rt->info[rix].ratecode | |
1543 | ATH9K_RATESERIES_RTS_CTS : 0) | | 1489 | rt->info[rix].short_preamble; |
1544 | ((rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) ? | 1490 | else |
1545 | ATH9K_RATESERIES_2040 : 0) | | 1491 | series[i].Rate = rt->info[rix].ratecode; |
1546 | ((rates[i].flags & IEEE80211_TX_RC_SHORT_GI) ? | 1492 | |
1547 | ATH9K_RATESERIES_HALFGI : 0); | 1493 | if (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS) |
1494 | series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; | ||
1495 | if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) | ||
1496 | series[i].RateFlags |= ATH9K_RATESERIES_2040; | ||
1497 | if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI) | ||
1498 | series[i].RateFlags |= ATH9K_RATESERIES_HALFGI; | ||
1548 | 1499 | ||
1549 | series[i].PktDuration = ath_pkt_duration(sc, rix, bf, | 1500 | series[i].PktDuration = ath_pkt_duration(sc, rix, bf, |
1550 | (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) != 0, | 1501 | (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) != 0, |
1551 | (rates[i].flags & IEEE80211_TX_RC_SHORT_GI), | 1502 | (rates[i].flags & IEEE80211_TX_RC_SHORT_GI), |
1552 | bf_isshpreamble(bf)); | 1503 | (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)); |
1553 | |||
1554 | series[i].ChSel = sc->sc_tx_chainmask; | ||
1555 | |||
1556 | if (rtsctsena) | ||
1557 | series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; | ||
1558 | } | 1504 | } |
1559 | 1505 | ||
1560 | /* set dur_update_en for l-sig computation except for PS-Poll frames */ | 1506 | /* set dur_update_en for l-sig computation except for PS-Poll frames */ |
1561 | ath9k_hw_set11n_ratescenario(ah, ds, lastds, !bf_ispspoll(bf), | 1507 | ath9k_hw_set11n_ratescenario(sc->sc_ah, bf->bf_desc, |
1562 | ctsrate, ctsduration, | 1508 | bf->bf_lastbf->bf_desc, |
1563 | series, 4, flags); | 1509 | !bf_ispspoll(bf), ctsrate, |
1510 | 0, series, 4, flags); | ||
1564 | 1511 | ||
1565 | if (sc->sc_config.ath_aggr_prot && flags) | 1512 | if (sc->sc_config.ath_aggr_prot && flags) |
1566 | ath9k_hw_set11n_burstduration(ah, ds, 8192); | 1513 | ath9k_hw_set11n_burstduration(sc->sc_ah, bf->bf_desc, 8192); |
1567 | } | 1514 | } |
1568 | 1515 | ||
1569 | static int ath_tx_setup_buffer(struct ath_softc *sc, struct ath_buf *bf, | 1516 | static int ath_tx_setup_buffer(struct ath_softc *sc, struct ath_buf *bf, |
@@ -1593,8 +1540,6 @@ static int ath_tx_setup_buffer(struct ath_softc *sc, struct ath_buf *bf, | |||
1593 | bf->bf_state.bf_type |= BUF_BAR; | 1540 | bf->bf_state.bf_type |= BUF_BAR; |
1594 | if (ieee80211_is_pspoll(fc)) | 1541 | if (ieee80211_is_pspoll(fc)) |
1595 | bf->bf_state.bf_type |= BUF_PSPOLL; | 1542 | bf->bf_state.bf_type |= BUF_PSPOLL; |
1596 | if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) | ||
1597 | bf->bf_state.bf_type |= BUF_SHORT_PREAMBLE; | ||
1598 | if ((conf_is_ht(&sc->hw->conf) && !is_pae(skb) && | 1543 | if ((conf_is_ht(&sc->hw->conf) && !is_pae(skb) && |
1599 | (tx_info->flags & IEEE80211_TX_CTL_AMPDU))) | 1544 | (tx_info->flags & IEEE80211_TX_CTL_AMPDU))) |
1600 | bf->bf_state.bf_type |= BUF_HT; | 1545 | bf->bf_state.bf_type |= BUF_HT; |