diff options
-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), |