diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2008-02-10 10:49:38 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-02-29 15:37:07 -0500 |
commit | 3330d7be7008fa8e213648750fc13613eecc54bb (patch) | |
tree | 89f8ce89b984819144d6643e7c4a5e7e2d67e7cc | |
parent | bb1eeff12d4cd6c706ef9fae340a9c93bb41ad05 (diff) |
mac80211: give burst time in txop rather than 0.1msec units
This changes mac80211 to pass the burst time to conf_tx in txop
units rather than 0.1msec units. 0.1msec units are only required
by atheros hardware (according to current driver support), all
other drivers do other calculations or require the txop value.
Therefore, it results in fewer calculations and more precision
if we just pass the txop value through to the driver.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Acked-by: Michael Buesch <mb@bu3sch.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl4965-base.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/p54common.c | 21 | ||||
-rw-r--r-- | include/net/mac80211.h | 12 | ||||
-rw-r--r-- | net/mac80211/ieee80211_sta.c | 11 |
5 files changed, 27 insertions, 21 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 4ad26f7613c5..bb3a5f633227 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -7442,7 +7442,7 @@ static int iwl3945_mac_conf_tx(struct ieee80211_hw *hw, int queue, | |||
7442 | priv->qos_data.def_qos_parm.ac[q].cw_max = cpu_to_le16(params->cw_max); | 7442 | priv->qos_data.def_qos_parm.ac[q].cw_max = cpu_to_le16(params->cw_max); |
7443 | priv->qos_data.def_qos_parm.ac[q].aifsn = params->aifs; | 7443 | priv->qos_data.def_qos_parm.ac[q].aifsn = params->aifs; |
7444 | priv->qos_data.def_qos_parm.ac[q].edca_txop = | 7444 | priv->qos_data.def_qos_parm.ac[q].edca_txop = |
7445 | cpu_to_le16((params->burst_time * 100)); | 7445 | cpu_to_le16((params->txop * 32)); |
7446 | 7446 | ||
7447 | priv->qos_data.def_qos_parm.ac[q].reserved1 = 0; | 7447 | priv->qos_data.def_qos_parm.ac[q].reserved1 = 0; |
7448 | priv->qos_data.qos_active = 1; | 7448 | priv->qos_data.qos_active = 1; |
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index f8931993ab70..fb4c84e31932 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
@@ -7916,7 +7916,7 @@ static int iwl4965_mac_conf_tx(struct ieee80211_hw *hw, int queue, | |||
7916 | priv->qos_data.def_qos_parm.ac[q].cw_max = cpu_to_le16(params->cw_max); | 7916 | priv->qos_data.def_qos_parm.ac[q].cw_max = cpu_to_le16(params->cw_max); |
7917 | priv->qos_data.def_qos_parm.ac[q].aifsn = params->aifs; | 7917 | priv->qos_data.def_qos_parm.ac[q].aifsn = params->aifs; |
7918 | priv->qos_data.def_qos_parm.ac[q].edca_txop = | 7918 | priv->qos_data.def_qos_parm.ac[q].edca_txop = |
7919 | cpu_to_le16((params->burst_time * 100)); | 7919 | cpu_to_le16((params->txop * 32)); |
7920 | 7920 | ||
7921 | priv->qos_data.def_qos_parm.ac[q].reserved1 = 0; | 7921 | priv->qos_data.def_qos_parm.ac[q].reserved1 = 0; |
7922 | priv->qos_data.qos_active = 1; | 7922 | priv->qos_data.qos_active = 1; |
diff --git a/drivers/net/wireless/p54common.c b/drivers/net/wireless/p54common.c index 218ff7770ef6..0e9f887178ce 100644 --- a/drivers/net/wireless/p54common.c +++ b/drivers/net/wireless/p54common.c | |||
@@ -759,13 +759,12 @@ static int p54_set_leds(struct ieee80211_hw *dev, int mode, int link, int act) | |||
759 | return 0; | 759 | return 0; |
760 | } | 760 | } |
761 | 761 | ||
762 | #define P54_SET_QUEUE(queue, ai_fs, cw_min, cw_max, burst) \ | 762 | #define P54_SET_QUEUE(queue, ai_fs, cw_min, cw_max, _txop) \ |
763 | do { \ | 763 | do { \ |
764 | queue.aifs = cpu_to_le16(ai_fs); \ | 764 | queue.aifs = cpu_to_le16(ai_fs); \ |
765 | queue.cwmin = cpu_to_le16(cw_min); \ | 765 | queue.cwmin = cpu_to_le16(cw_min); \ |
766 | queue.cwmax = cpu_to_le16(cw_max); \ | 766 | queue.cwmax = cpu_to_le16(cw_max); \ |
767 | queue.txop = (burst == 0) ? \ | 767 | queue.txop = cpu_to_le16(_txop); \ |
768 | 0 : cpu_to_le16((burst * 100) / 32 + 1); \ | ||
769 | } while(0) | 768 | } while(0) |
770 | 769 | ||
771 | static void p54_init_vdcf(struct ieee80211_hw *dev) | 770 | static void p54_init_vdcf(struct ieee80211_hw *dev) |
@@ -783,10 +782,16 @@ static void p54_init_vdcf(struct ieee80211_hw *dev) | |||
783 | 782 | ||
784 | vdcf = (struct p54_tx_control_vdcf *) hdr->data; | 783 | vdcf = (struct p54_tx_control_vdcf *) hdr->data; |
785 | 784 | ||
786 | P54_SET_QUEUE(vdcf->queue[0], 0x0002, 0x0003, 0x0007, 0x000f); | 785 | /* |
787 | P54_SET_QUEUE(vdcf->queue[1], 0x0002, 0x0007, 0x000f, 0x001e); | 786 | * FIXME: The default values in the spec (IEEE 802.11 |
788 | P54_SET_QUEUE(vdcf->queue[2], 0x0002, 0x000f, 0x03ff, 0x0014); | 787 | * 7.3.2.19 Table 37) are 47, 94, 0, 0, why use |
789 | P54_SET_QUEUE(vdcf->queue[3], 0x0007, 0x000f, 0x03ff, 0x0000); | 788 | * 47, 94, 63, 0 here? Also, the default AIFS |
789 | * values (second parameter) are 2, 2, 3, 7... | ||
790 | */ | ||
791 | P54_SET_QUEUE(vdcf->queue[0], 0x0002, 0x0003, 0x0007, 47); | ||
792 | P54_SET_QUEUE(vdcf->queue[1], 0x0002, 0x0007, 0x000f, 94); | ||
793 | P54_SET_QUEUE(vdcf->queue[2], 0x0002, 0x000f, 0x03ff, 63); | ||
794 | P54_SET_QUEUE(vdcf->queue[3], 0x0007, 0x000f, 0x03ff, 0); | ||
790 | } | 795 | } |
791 | 796 | ||
792 | static void p54_set_vdcf(struct ieee80211_hw *dev) | 797 | static void p54_set_vdcf(struct ieee80211_hw *dev) |
@@ -939,7 +944,7 @@ static int p54_conf_tx(struct ieee80211_hw *dev, int queue, | |||
939 | 944 | ||
940 | if ((params) && !((queue < 0) || (queue > 4))) { | 945 | if ((params) && !((queue < 0) || (queue > 4))) { |
941 | P54_SET_QUEUE(vdcf->queue[queue], params->aifs, | 946 | P54_SET_QUEUE(vdcf->queue[queue], params->aifs, |
942 | params->cw_min, params->cw_max, params->burst_time); | 947 | params->cw_min, params->cw_max, params->txop); |
943 | } else | 948 | } else |
944 | return -EINVAL; | 949 | return -EINVAL; |
945 | 950 | ||
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 460da54a0019..5ecf3cc8d977 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -89,19 +89,19 @@ struct ieee80211_ht_bss_info { | |||
89 | * struct ieee80211_tx_queue_params - transmit queue configuration | 89 | * struct ieee80211_tx_queue_params - transmit queue configuration |
90 | * | 90 | * |
91 | * The information provided in this structure is required for QoS | 91 | * The information provided in this structure is required for QoS |
92 | * transmit queue configuration. | 92 | * transmit queue configuration. Cf. IEEE 802.11 7.3.2.29. |
93 | * | 93 | * |
94 | * @aifs: arbitration interface space [0..255, -1: use default] | 94 | * @aifs: arbitration interface space [0..255, -1: use default] |
95 | * @cw_min: minimum contention window [will be a value of the form | 95 | * @cw_min: minimum contention window [will be a value of the form |
96 | * 2^n-1 in the range 1..1023; 0: use default] | 96 | * 2^n-1 in the range 1..1023; 0: use default] |
97 | * @cw_max: maximum contention window [like @cw_min] | 97 | * @cw_max: maximum contention window [like @cw_min] |
98 | * @burst_time: maximum burst time in units of 0.1ms, 0 meaning disabled | 98 | * @txop: maximum burst time in units of 32 usecs, 0 meaning disabled |
99 | */ | 99 | */ |
100 | struct ieee80211_tx_queue_params { | 100 | struct ieee80211_tx_queue_params { |
101 | int aifs; | 101 | s16 aifs; |
102 | int cw_min; | 102 | u16 cw_min; |
103 | int cw_max; | 103 | u16 cw_max; |
104 | int burst_time; | 104 | u16 txop; |
105 | }; | 105 | }; |
106 | 106 | ||
107 | /** | 107 | /** |
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c index a8251a23917b..11f2ee6b2269 100644 --- a/net/mac80211/ieee80211_sta.c +++ b/net/mac80211/ieee80211_sta.c | |||
@@ -297,12 +297,13 @@ static void ieee80211_sta_wmm_params(struct net_device *dev, | |||
297 | params.aifs = pos[0] & 0x0f; | 297 | params.aifs = pos[0] & 0x0f; |
298 | params.cw_max = ecw2cw((pos[1] & 0xf0) >> 4); | 298 | params.cw_max = ecw2cw((pos[1] & 0xf0) >> 4); |
299 | params.cw_min = ecw2cw(pos[1] & 0x0f); | 299 | params.cw_min = ecw2cw(pos[1] & 0x0f); |
300 | /* TXOP is in units of 32 usec; burst_time in 0.1 ms */ | 300 | params.txop = pos[2] | (pos[3] << 8); |
301 | params.burst_time = (pos[2] | (pos[3] << 8)) * 32 / 100; | 301 | #ifdef CONFIG_MAC80211_DEBUG |
302 | printk(KERN_DEBUG "%s: WMM queue=%d aci=%d acm=%d aifs=%d " | 302 | printk(KERN_DEBUG "%s: WMM queue=%d aci=%d acm=%d aifs=%d " |
303 | "cWmin=%d cWmax=%d burst=%d\n", | 303 | "cWmin=%d cWmax=%d txop=%d\n", |
304 | dev->name, queue, aci, acm, params.aifs, params.cw_min, | 304 | dev->name, queue, aci, acm, params.aifs, params.cw_min, |
305 | params.cw_max, params.burst_time); | 305 | params.cw_max, params.txop); |
306 | #endif | ||
306 | /* TODO: handle ACM (block TX, fallback to next lowest allowed | 307 | /* TODO: handle ACM (block TX, fallback to next lowest allowed |
307 | * AC for now) */ | 308 | * AC for now) */ |
308 | if (local->ops->conf_tx(local_to_hw(local), queue, ¶ms)) { | 309 | if (local->ops->conf_tx(local_to_hw(local), queue, ¶ms)) { |
@@ -3230,7 +3231,7 @@ int ieee80211_sta_set_ssid(struct net_device *dev, char *ssid, size_t len) | |||
3230 | qparam.cw_min = 15; | 3231 | qparam.cw_min = 15; |
3231 | 3232 | ||
3232 | qparam.cw_max = 1023; | 3233 | qparam.cw_max = 1023; |
3233 | qparam.burst_time = 0; | 3234 | qparam.txop = 0; |
3234 | 3235 | ||
3235 | for (i = IEEE80211_TX_QUEUE_DATA0; i < NUM_TX_DATA_QUEUES; i++) | 3236 | for (i = IEEE80211_TX_QUEUE_DATA0; i < NUM_TX_DATA_QUEUES; i++) |
3236 | local->ops->conf_tx(local_to_hw(local), | 3237 | local->ops->conf_tx(local_to_hw(local), |