wl1271: Configure rates for templates
authorJuuso Oikarinen <juuso.oikarinen@nokia.com>
Thu, 1 Apr 2010 08:38:21 +0000 (11:38 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 6 Apr 2010 20:55:13 +0000 (16:55 -0400)
Configure meaningful rates to be used with the templates. For control frames,
use the determined basic rates (currently the lowest rate for the band) and
for data-frames (null-funcs) let the firmware use the current rate policy to
determine the rate.

Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: Teemu Paasikivi <ext-teemu.3.paasikivi@nokia.com>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/wl12xx/wl1271_cmd.c
drivers/net/wireless/wl12xx/wl1271_cmd.h
drivers/net/wireless/wl12xx/wl1271_init.c
drivers/net/wireless/wl12xx/wl1271_main.c

index 5cee59fb8c5e0695033ba444e5a1aed68c0fce1c..b19090334bc00bd68691b7a40a7c4bae6f0b2e8e 100644 (file)
@@ -700,7 +700,7 @@ out:
 }
 
 int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id,
-                           void *buf, size_t buf_len, int index)
+                           void *buf, size_t buf_len, int index, u32 rates)
 {
        struct wl1271_cmd_template_set *cmd;
        int ret = 0;
@@ -718,7 +718,7 @@ int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id,
 
        cmd->len = cpu_to_le16(buf_len);
        cmd->template_type = template_id;
-       cmd->enabled_rates = cpu_to_le32(wl->conf.tx.rc_conf.enabled_rates);
+       cmd->enabled_rates = cpu_to_le32(rates);
        cmd->short_retry_limit = wl->conf.tx.rc_conf.short_retry_limit;
        cmd->long_retry_limit = wl->conf.tx.rc_conf.long_retry_limit;
        cmd->index = index;
@@ -758,7 +758,8 @@ int wl1271_cmd_build_null_data(struct wl1271 *wl)
                ptr = skb->data;
        }
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, ptr, size, 0);
+       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, ptr, size, 0,
+                                     WL1271_RATE_AUTOMATIC);
 
 out:
        dev_kfree_skb(skb);
@@ -780,7 +781,8 @@ int wl1271_cmd_build_klv_null_data(struct wl1271 *wl)
 
        ret = wl1271_cmd_template_set(wl, CMD_TEMPL_KLV,
                                      skb->data, skb->len,
-                                     CMD_TEMPL_KLV_IDX_NULL_DATA);
+                                     CMD_TEMPL_KLV_IDX_NULL_DATA,
+                                     WL1271_RATE_AUTOMATIC);
 
 out:
        dev_kfree_skb(skb);
@@ -801,7 +803,7 @@ int wl1271_cmd_build_ps_poll(struct wl1271 *wl, u16 aid)
                goto out;
 
        ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PS_POLL, skb->data,
-                                     skb->len, 0);
+                                     skb->len, 0, wl->basic_rate);
 
 out:
        dev_kfree_skb(skb);
@@ -826,10 +828,12 @@ int wl1271_cmd_build_probe_req(struct wl1271 *wl,
 
        if (band == IEEE80211_BAND_2GHZ)
                ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_2_4,
-                                             skb->data, skb->len, 0);
+                                             skb->data, skb->len, 0,
+                                             wl->conf.tx.basic_rate);
        else
                ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_5,
-                                             skb->data, skb->len, 0);
+                                             skb->data, skb->len, 0,
+                                             wl->conf.tx.basic_rate_5);
 
 out:
        dev_kfree_skb(skb);
@@ -854,7 +858,8 @@ int wl1271_build_qos_null_data(struct wl1271 *wl)
        template.qos_ctrl = cpu_to_le16(0);
 
        return wl1271_cmd_template_set(wl, CMD_TEMPL_QOS_NULL_DATA, &template,
-                                      sizeof(template), 0);
+                                      sizeof(template), 0,
+                                      WL1271_RATE_AUTOMATIC);
 }
 
 int wl1271_cmd_set_default_wep_key(struct wl1271 *wl, u8 id)
index d61f3394253f9e84b58ad99cded1d3fdbb0baeb3..00f78b7aa384f810d2b4c29454bf5310db1ae321 100644 (file)
@@ -45,7 +45,7 @@ int wl1271_cmd_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len,
                    const u8 *ie, size_t ie_len, u8 active_scan,
                    u8 high_prio, u8 band, u8 probe_requests);
 int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id,
-                           void *buf, size_t buf_len, int index);
+                           void *buf, size_t buf_len, int index, u32 rates);
 int wl1271_cmd_build_null_data(struct wl1271 *wl);
 int wl1271_cmd_build_ps_poll(struct wl1271 *wl, u16 aid);
 int wl1271_cmd_build_probe_req(struct wl1271 *wl,
@@ -252,6 +252,8 @@ struct cmd_enabledisable_path {
        u8 padding[3];
 } __attribute__ ((packed));
 
+#define WL1271_RATE_AUTOMATIC  0
+
 struct wl1271_cmd_template_set {
        struct wl1271_cmd_header header;
 
index 8ec94ac840934a75a42443c5788a743709fa9d01..9ab3368290440f558b0d7ac32612c5e3f76b5168 100644 (file)
@@ -56,54 +56,56 @@ int wl1271_init_templates_config(struct wl1271 *wl)
        /* send empty templates for fw memory reservation */
        ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_2_4, NULL,
                                      sizeof(struct wl12xx_probe_req_template),
-                                     0);
+                                     0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
        if (wl1271_11a_enabled()) {
                size_t size = sizeof(struct wl12xx_probe_req_template);
                ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_5,
-                                             NULL, size, 0);
+                                             NULL, size, 0,
+                                             WL1271_RATE_AUTOMATIC);
                if (ret < 0)
                        return ret;
        }
 
        ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, NULL,
                                      sizeof(struct wl12xx_null_data_template),
-                                     0);
+                                     0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
        ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PS_POLL, NULL,
                                      sizeof(struct wl12xx_ps_poll_template),
-                                     0);
+                                     0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
        ret = wl1271_cmd_template_set(wl, CMD_TEMPL_QOS_NULL_DATA, NULL,
                                      sizeof
                                      (struct wl12xx_qos_null_data_template),
-                                     0);
+                                     0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
        ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PROBE_RESPONSE, NULL,
                                      sizeof
                                      (struct wl12xx_probe_resp_template),
-                                     0);
+                                     0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
        ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON, NULL,
                                      sizeof
                                      (struct wl12xx_beacon_template),
-                                     0);
+                                     0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
        for (i = 0; i < CMD_TEMPL_KLV_IDX_MAX; i++) {
                ret = wl1271_cmd_template_set(wl, CMD_TEMPL_KLV, NULL,
-                                             WL1271_CMD_TEMPL_MAX_SIZE, i);
+                                             WL1271_CMD_TEMPL_MAX_SIZE, i,
+                                             WL1271_RATE_AUTOMATIC);
                if (ret < 0)
                        return ret;
        }
index ca5cd325fac74bd25c6c211dd7c165e96af754ba..247f4079832e3e971b107d446f0713c436b7d9c5 100644 (file)
@@ -1642,7 +1642,8 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
                        wl1271_ssid_set(wl, beacon);
                        ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON,
                                                      beacon->data,
-                                                     beacon->len, 0);
+                                                     beacon->len, 0,
+                                                     wl1271_min_rate_get(wl));
 
                        if (ret < 0) {
                                dev_kfree_skb(beacon);
@@ -1657,7 +1658,8 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
                        ret = wl1271_cmd_template_set(wl,
                                                      CMD_TEMPL_PROBE_RESPONSE,
                                                      beacon->data,
-                                                     beacon->len, 0);
+                                                     beacon->len, 0,
+                                                     wl1271_min_rate_get(wl));
                        dev_kfree_skb(beacon);
                        if (ret < 0)
                                goto out_sleep;