From e932bbad533efaf6b3ff1af116efffb64fd39565 Mon Sep 17 00:00:00 2001 From: jow Date: Wed, 11 Jul 2012 09:59:08 +0000 Subject: [package] mac80211: fix patch order (#11839, #11842) git-svn-id: svn://svn.openwrt.org/openwrt/trunk@32664 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../mac80211/patches/569-ath9k_config_qlen.patch | 59 ++++++++++ .../patches/569-ath9k_fix_max_aggr_duration.patch | 125 --------------------- .../mac80211/patches/570-ath9k_config_qlen.patch | 59 ---------- .../patches/570-ath9k_fix_max_aggr_duration.patch | 125 +++++++++++++++++++++ 4 files changed, 184 insertions(+), 184 deletions(-) create mode 100644 package/mac80211/patches/569-ath9k_config_qlen.patch delete mode 100644 package/mac80211/patches/569-ath9k_fix_max_aggr_duration.patch delete mode 100644 package/mac80211/patches/570-ath9k_config_qlen.patch create mode 100644 package/mac80211/patches/570-ath9k_fix_max_aggr_duration.patch diff --git a/package/mac80211/patches/569-ath9k_config_qlen.patch b/package/mac80211/patches/569-ath9k_config_qlen.patch new file mode 100644 index 000000000..fcdcec665 --- /dev/null +++ b/package/mac80211/patches/569-ath9k_config_qlen.patch @@ -0,0 +1,59 @@ +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h +@@ -297,6 +297,7 @@ struct ath_tx { + struct ath_txq txq[ATH9K_NUM_TX_QUEUES]; + struct ath_descdma txdma; + struct ath_txq *txq_map[WME_NUM_AC]; ++ u32 txq_max_pending[WME_NUM_AC]; + }; + + struct ath_rx_edma { +--- a/drivers/net/wireless/ath/ath9k/init.c ++++ b/drivers/net/wireless/ath/ath9k/init.c +@@ -436,6 +436,7 @@ static int ath9k_init_queues(struct ath_ + for (i = 0; i < WME_NUM_AC; i++) { + sc->tx.txq_map[i] = ath_txq_setup(sc, ATH9K_TX_QUEUE_DATA, i); + sc->tx.txq_map[i]->mac80211_qnum = i; ++ sc->tx.txq_max_pending[i] = ATH_MAX_QDEPTH; + } + return 0; + } +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -1987,7 +1987,8 @@ int ath_tx_start(struct ieee80211_hw *hw + + ath_txq_lock(sc, txq); + if (txq == sc->tx.txq_map[q] && +- ++txq->pending_frames > ATH_MAX_QDEPTH && !txq->stopped) { ++ ++txq->pending_frames > sc->tx.txq_max_pending[q] && ++ !txq->stopped) { + ieee80211_stop_queue(sc->hw, q); + txq->stopped = true; + } +@@ -2046,7 +2047,8 @@ static void ath_tx_complete(struct ath_s + if (WARN_ON(--txq->pending_frames < 0)) + txq->pending_frames = 0; + +- if (txq->stopped && txq->pending_frames < ATH_MAX_QDEPTH) { ++ if (txq->stopped && ++ txq->pending_frames < sc->tx.txq_max_pending[q]) { + ieee80211_wake_queue(sc->hw, q); + txq->stopped = false; + } +--- a/drivers/net/wireless/ath/ath9k/debug.c ++++ b/drivers/net/wireless/ath/ath9k/debug.c +@@ -1701,6 +1701,14 @@ int ath9k_init_debug(struct ath_hw *ah) + &fops_interrupt); + debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc, + &fops_xmit); ++ debugfs_create_u32("qlen_bk", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, ++ &sc->tx.txq_max_pending[WME_AC_BK]); ++ debugfs_create_u32("qlen_be", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, ++ &sc->tx.txq_max_pending[WME_AC_BE]); ++ debugfs_create_u32("qlen_vi", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, ++ &sc->tx.txq_max_pending[WME_AC_VI]); ++ debugfs_create_u32("qlen_vo", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, ++ &sc->tx.txq_max_pending[WME_AC_VO]); + debugfs_create_file("stations", S_IRUSR, sc->debug.debugfs_phy, sc, + &fops_stations); + debugfs_create_file("misc", S_IRUSR, sc->debug.debugfs_phy, sc, diff --git a/package/mac80211/patches/569-ath9k_fix_max_aggr_duration.patch b/package/mac80211/patches/569-ath9k_fix_max_aggr_duration.patch deleted file mode 100644 index b2fbf59f3..000000000 --- a/package/mac80211/patches/569-ath9k_fix_max_aggr_duration.patch +++ /dev/null @@ -1,125 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/ath9k.h -+++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -298,6 +298,7 @@ struct ath_tx { - struct ath_descdma txdma; - struct ath_txq *txq_map[WME_NUM_AC]; - u32 txq_max_pending[WME_NUM_AC]; -+ u16 max_aggr_framelen[WME_NUM_AC][4][32]; - }; - - struct ath_rx_edma { -@@ -342,6 +343,7 @@ int ath_tx_init(struct ath_softc *sc, in - void ath_tx_cleanup(struct ath_softc *sc); - int ath_txq_update(struct ath_softc *sc, int qnum, - struct ath9k_tx_queue_info *q); -+void ath_update_max_aggr_framelen(struct ath_softc *sc, int queue, int txop); - int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, - struct ath_tx_control *txctl); - void ath_tx_tasklet(struct ath_softc *sc); ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -29,6 +29,8 @@ - #define HT_LTF(_ns) (4 * (_ns)) - #define SYMBOL_TIME(_ns) ((_ns) << 2) /* ns * 4 us */ - #define SYMBOL_TIME_HALFGI(_ns) (((_ns) * 18 + 4) / 5) /* ns * 3.6 us */ -+#define TIME_SYMBOLS(t) ((t) >> 2) -+#define TIME_SYMBOLS_HALFGI(t) (((t) * 5 - 4) / 18) - #define NUM_SYMBOLS_PER_USEC(_usec) (_usec >> 2) - #define NUM_SYMBOLS_PER_USEC_HALFGI(_usec) (((_usec*5)-4)/18) - -@@ -74,33 +76,6 @@ enum { - MCS_HT40_SGI, - }; - --static int ath_max_4ms_framelen[4][32] = { -- [MCS_HT20] = { -- 3212, 6432, 9648, 12864, 19300, 25736, 28952, 32172, -- 6424, 12852, 19280, 25708, 38568, 51424, 57852, 64280, -- 9628, 19260, 28896, 38528, 57792, 65532, 65532, 65532, -- 12828, 25656, 38488, 51320, 65532, 65532, 65532, 65532, -- }, -- [MCS_HT20_SGI] = { -- 3572, 7144, 10720, 14296, 21444, 28596, 32172, 35744, -- 7140, 14284, 21428, 28568, 42856, 57144, 64288, 65532, -- 10700, 21408, 32112, 42816, 64228, 65532, 65532, 65532, -- 14256, 28516, 42780, 57040, 65532, 65532, 65532, 65532, -- }, -- [MCS_HT40] = { -- 6680, 13360, 20044, 26724, 40092, 53456, 60140, 65532, -- 13348, 26700, 40052, 53400, 65532, 65532, 65532, 65532, -- 20004, 40008, 60016, 65532, 65532, 65532, 65532, 65532, -- 26644, 53292, 65532, 65532, 65532, 65532, 65532, 65532, -- }, -- [MCS_HT40_SGI] = { -- 7420, 14844, 22272, 29696, 44544, 59396, 65532, 65532, -- 14832, 29668, 44504, 59340, 65532, 65532, 65532, 65532, -- 22232, 44464, 65532, 65532, 65532, 65532, 65532, 65532, -- 29616, 59232, 65532, 65532, 65532, 65532, 65532, 65532, -- } --}; -- - /*********************/ - /* Aggregation logic */ - /*********************/ -@@ -648,6 +623,7 @@ static u32 ath_lookup_rate(struct ath_so - struct ieee80211_tx_rate *rates; - u32 max_4ms_framelen, frmlen; - u16 aggr_limit, bt_aggr_limit, legacy = 0; -+ int q = tid->ac->txq->mac80211_qnum; - int i; - - skb = bf->bf_mpdu; -@@ -680,7 +656,7 @@ static u32 ath_lookup_rate(struct ath_so - if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI) - modeidx++; - -- frmlen = ath_max_4ms_framelen[modeidx][rates[i].idx]; -+ frmlen = sc->tx.max_aggr_framelen[q][modeidx][rates[i].idx]; - max_4ms_framelen = min(max_4ms_framelen, frmlen); - } - -@@ -927,6 +903,44 @@ static u32 ath_pkt_duration(struct ath_s - return duration; - } - -+static int ath_max_framelen(int usec, int mcs, bool ht40, bool sgi) -+{ -+ int streams = HT_RC_2_STREAMS(mcs); -+ int symbols, bits; -+ int bytes = 0; -+ -+ symbols = sgi ? TIME_SYMBOLS_HALFGI(usec) : TIME_SYMBOLS(usec); -+ bits = symbols * bits_per_symbol[mcs % 8][ht40] * streams; -+ bits -= OFDM_PLCP_BITS; -+ bytes = bits / 8; -+ bytes -= L_STF + L_LTF + L_SIG + HT_SIG + HT_STF + HT_LTF(streams); -+ if (bytes > 65532) -+ bytes = 65532; -+ -+ return bytes; -+} -+ -+void ath_update_max_aggr_framelen(struct ath_softc *sc, int queue, int txop) -+{ -+ u16 *cur_ht20, *cur_ht20_sgi, *cur_ht40, *cur_ht40_sgi; -+ int mcs; -+ -+ /* 4ms is the default (and maximum) duration */ -+ if (!txop || txop > 4096) -+ txop = 4096; -+ -+ cur_ht20 = sc->tx.max_aggr_framelen[queue][MCS_HT20]; -+ cur_ht20_sgi = sc->tx.max_aggr_framelen[queue][MCS_HT20_SGI]; -+ cur_ht40 = sc->tx.max_aggr_framelen[queue][MCS_HT40]; -+ cur_ht40_sgi = sc->tx.max_aggr_framelen[queue][MCS_HT40_SGI]; -+ for (mcs = 0; mcs < 32; mcs++) { -+ cur_ht20[mcs] = ath_max_framelen(txop, mcs, false, false); -+ cur_ht20_sgi[mcs] = ath_max_framelen(txop, mcs, false, true); -+ cur_ht40[mcs] = ath_max_framelen(txop, mcs, true, false); -+ cur_ht40_sgi[mcs] = ath_max_framelen(txop, mcs, true, true); -+ } -+} -+ - static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, - struct ath_tx_info *info, int len) - { diff --git a/package/mac80211/patches/570-ath9k_config_qlen.patch b/package/mac80211/patches/570-ath9k_config_qlen.patch deleted file mode 100644 index fcdcec665..000000000 --- a/package/mac80211/patches/570-ath9k_config_qlen.patch +++ /dev/null @@ -1,59 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/ath9k.h -+++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -297,6 +297,7 @@ struct ath_tx { - struct ath_txq txq[ATH9K_NUM_TX_QUEUES]; - struct ath_descdma txdma; - struct ath_txq *txq_map[WME_NUM_AC]; -+ u32 txq_max_pending[WME_NUM_AC]; - }; - - struct ath_rx_edma { ---- a/drivers/net/wireless/ath/ath9k/init.c -+++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -436,6 +436,7 @@ static int ath9k_init_queues(struct ath_ - for (i = 0; i < WME_NUM_AC; i++) { - sc->tx.txq_map[i] = ath_txq_setup(sc, ATH9K_TX_QUEUE_DATA, i); - sc->tx.txq_map[i]->mac80211_qnum = i; -+ sc->tx.txq_max_pending[i] = ATH_MAX_QDEPTH; - } - return 0; - } ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1987,7 +1987,8 @@ int ath_tx_start(struct ieee80211_hw *hw - - ath_txq_lock(sc, txq); - if (txq == sc->tx.txq_map[q] && -- ++txq->pending_frames > ATH_MAX_QDEPTH && !txq->stopped) { -+ ++txq->pending_frames > sc->tx.txq_max_pending[q] && -+ !txq->stopped) { - ieee80211_stop_queue(sc->hw, q); - txq->stopped = true; - } -@@ -2046,7 +2047,8 @@ static void ath_tx_complete(struct ath_s - if (WARN_ON(--txq->pending_frames < 0)) - txq->pending_frames = 0; - -- if (txq->stopped && txq->pending_frames < ATH_MAX_QDEPTH) { -+ if (txq->stopped && -+ txq->pending_frames < sc->tx.txq_max_pending[q]) { - ieee80211_wake_queue(sc->hw, q); - txq->stopped = false; - } ---- a/drivers/net/wireless/ath/ath9k/debug.c -+++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1701,6 +1701,14 @@ int ath9k_init_debug(struct ath_hw *ah) - &fops_interrupt); - debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc, - &fops_xmit); -+ debugfs_create_u32("qlen_bk", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, -+ &sc->tx.txq_max_pending[WME_AC_BK]); -+ debugfs_create_u32("qlen_be", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, -+ &sc->tx.txq_max_pending[WME_AC_BE]); -+ debugfs_create_u32("qlen_vi", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, -+ &sc->tx.txq_max_pending[WME_AC_VI]); -+ debugfs_create_u32("qlen_vo", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, -+ &sc->tx.txq_max_pending[WME_AC_VO]); - debugfs_create_file("stations", S_IRUSR, sc->debug.debugfs_phy, sc, - &fops_stations); - debugfs_create_file("misc", S_IRUSR, sc->debug.debugfs_phy, sc, diff --git a/package/mac80211/patches/570-ath9k_fix_max_aggr_duration.patch b/package/mac80211/patches/570-ath9k_fix_max_aggr_duration.patch new file mode 100644 index 000000000..b2fbf59f3 --- /dev/null +++ b/package/mac80211/patches/570-ath9k_fix_max_aggr_duration.patch @@ -0,0 +1,125 @@ +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h +@@ -298,6 +298,7 @@ struct ath_tx { + struct ath_descdma txdma; + struct ath_txq *txq_map[WME_NUM_AC]; + u32 txq_max_pending[WME_NUM_AC]; ++ u16 max_aggr_framelen[WME_NUM_AC][4][32]; + }; + + struct ath_rx_edma { +@@ -342,6 +343,7 @@ int ath_tx_init(struct ath_softc *sc, in + void ath_tx_cleanup(struct ath_softc *sc); + int ath_txq_update(struct ath_softc *sc, int qnum, + struct ath9k_tx_queue_info *q); ++void ath_update_max_aggr_framelen(struct ath_softc *sc, int queue, int txop); + int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, + struct ath_tx_control *txctl); + void ath_tx_tasklet(struct ath_softc *sc); +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -29,6 +29,8 @@ + #define HT_LTF(_ns) (4 * (_ns)) + #define SYMBOL_TIME(_ns) ((_ns) << 2) /* ns * 4 us */ + #define SYMBOL_TIME_HALFGI(_ns) (((_ns) * 18 + 4) / 5) /* ns * 3.6 us */ ++#define TIME_SYMBOLS(t) ((t) >> 2) ++#define TIME_SYMBOLS_HALFGI(t) (((t) * 5 - 4) / 18) + #define NUM_SYMBOLS_PER_USEC(_usec) (_usec >> 2) + #define NUM_SYMBOLS_PER_USEC_HALFGI(_usec) (((_usec*5)-4)/18) + +@@ -74,33 +76,6 @@ enum { + MCS_HT40_SGI, + }; + +-static int ath_max_4ms_framelen[4][32] = { +- [MCS_HT20] = { +- 3212, 6432, 9648, 12864, 19300, 25736, 28952, 32172, +- 6424, 12852, 19280, 25708, 38568, 51424, 57852, 64280, +- 9628, 19260, 28896, 38528, 57792, 65532, 65532, 65532, +- 12828, 25656, 38488, 51320, 65532, 65532, 65532, 65532, +- }, +- [MCS_HT20_SGI] = { +- 3572, 7144, 10720, 14296, 21444, 28596, 32172, 35744, +- 7140, 14284, 21428, 28568, 42856, 57144, 64288, 65532, +- 10700, 21408, 32112, 42816, 64228, 65532, 65532, 65532, +- 14256, 28516, 42780, 57040, 65532, 65532, 65532, 65532, +- }, +- [MCS_HT40] = { +- 6680, 13360, 20044, 26724, 40092, 53456, 60140, 65532, +- 13348, 26700, 40052, 53400, 65532, 65532, 65532, 65532, +- 20004, 40008, 60016, 65532, 65532, 65532, 65532, 65532, +- 26644, 53292, 65532, 65532, 65532, 65532, 65532, 65532, +- }, +- [MCS_HT40_SGI] = { +- 7420, 14844, 22272, 29696, 44544, 59396, 65532, 65532, +- 14832, 29668, 44504, 59340, 65532, 65532, 65532, 65532, +- 22232, 44464, 65532, 65532, 65532, 65532, 65532, 65532, +- 29616, 59232, 65532, 65532, 65532, 65532, 65532, 65532, +- } +-}; +- + /*********************/ + /* Aggregation logic */ + /*********************/ +@@ -648,6 +623,7 @@ static u32 ath_lookup_rate(struct ath_so + struct ieee80211_tx_rate *rates; + u32 max_4ms_framelen, frmlen; + u16 aggr_limit, bt_aggr_limit, legacy = 0; ++ int q = tid->ac->txq->mac80211_qnum; + int i; + + skb = bf->bf_mpdu; +@@ -680,7 +656,7 @@ static u32 ath_lookup_rate(struct ath_so + if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI) + modeidx++; + +- frmlen = ath_max_4ms_framelen[modeidx][rates[i].idx]; ++ frmlen = sc->tx.max_aggr_framelen[q][modeidx][rates[i].idx]; + max_4ms_framelen = min(max_4ms_framelen, frmlen); + } + +@@ -927,6 +903,44 @@ static u32 ath_pkt_duration(struct ath_s + return duration; + } + ++static int ath_max_framelen(int usec, int mcs, bool ht40, bool sgi) ++{ ++ int streams = HT_RC_2_STREAMS(mcs); ++ int symbols, bits; ++ int bytes = 0; ++ ++ symbols = sgi ? TIME_SYMBOLS_HALFGI(usec) : TIME_SYMBOLS(usec); ++ bits = symbols * bits_per_symbol[mcs % 8][ht40] * streams; ++ bits -= OFDM_PLCP_BITS; ++ bytes = bits / 8; ++ bytes -= L_STF + L_LTF + L_SIG + HT_SIG + HT_STF + HT_LTF(streams); ++ if (bytes > 65532) ++ bytes = 65532; ++ ++ return bytes; ++} ++ ++void ath_update_max_aggr_framelen(struct ath_softc *sc, int queue, int txop) ++{ ++ u16 *cur_ht20, *cur_ht20_sgi, *cur_ht40, *cur_ht40_sgi; ++ int mcs; ++ ++ /* 4ms is the default (and maximum) duration */ ++ if (!txop || txop > 4096) ++ txop = 4096; ++ ++ cur_ht20 = sc->tx.max_aggr_framelen[queue][MCS_HT20]; ++ cur_ht20_sgi = sc->tx.max_aggr_framelen[queue][MCS_HT20_SGI]; ++ cur_ht40 = sc->tx.max_aggr_framelen[queue][MCS_HT40]; ++ cur_ht40_sgi = sc->tx.max_aggr_framelen[queue][MCS_HT40_SGI]; ++ for (mcs = 0; mcs < 32; mcs++) { ++ cur_ht20[mcs] = ath_max_framelen(txop, mcs, false, false); ++ cur_ht20_sgi[mcs] = ath_max_framelen(txop, mcs, false, true); ++ cur_ht40[mcs] = ath_max_framelen(txop, mcs, true, false); ++ cur_ht40_sgi[mcs] = ath_max_framelen(txop, mcs, true, true); ++ } ++} ++ + static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, + struct ath_tx_info *info, int len) + { -- cgit v1.2.3