aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2008-02-10 10:49:38 -0500
committerJohn W. Linville <linville@tuxdriver.com>2008-02-29 15:37:07 -0500
commit3330d7be7008fa8e213648750fc13613eecc54bb (patch)
tree89f8ce89b984819144d6643e7c4a5e7e2d67e7cc
parentbb1eeff12d4cd6c706ef9fae340a9c93bb41ad05 (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.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl4965-base.c2
-rw-r--r--drivers/net/wireless/p54common.c21
-rw-r--r--include/net/mac80211.h12
-rw-r--r--net/mac80211/ieee80211_sta.c11
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) \
763do { \ 763do { \
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
771static void p54_init_vdcf(struct ieee80211_hw *dev) 770static 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
792static void p54_set_vdcf(struct ieee80211_hw *dev) 797static 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 */
100struct ieee80211_tx_queue_params { 100struct 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, &params)) { 309 if (local->ops->conf_tx(local_to_hw(local), queue, &params)) {
@@ -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),