aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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),