wl12xx: use wiphy values for setting rts, frag thresholds on init
Arik Nemtsov [Mon, 18 Apr 2011 11:15:21 +0000 (14:15 +0300)]
Use the wiphy RTS and fragmentation thresholds for initializing the FW
when possible. This mitigates a bug where previously set values are
forgotten after interface down/up.

Add checks before settings these values to ensure they are valid. Use
default values when invalid thresholds are configured.

Update the default RTS threshold to the maximum value given by the
specification.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>

drivers/net/wireless/wl12xx/acx.c
drivers/net/wireless/wl12xx/acx.h
drivers/net/wireless/wl12xx/init.c
drivers/net/wireless/wl12xx/main.c

index 2b5fb3d..729f72a 100644 (file)
@@ -325,12 +325,19 @@ out:
        return ret;
 }
 
-int wl1271_acx_rts_threshold(struct wl1271 *wl, u16 rts_threshold)
+int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold)
 {
        struct acx_rts_threshold *rts;
        int ret;
 
-       wl1271_debug(DEBUG_ACX, "acx rts threshold");
+       /*
+        * If the RTS threshold is not configured or out of range, use the
+        * default value.
+        */
+       if (rts_threshold > IEEE80211_MAX_RTS_THRESHOLD)
+               rts_threshold = wl->conf.rx.rts_threshold;
+
+       wl1271_debug(DEBUG_ACX, "acx rts threshold: %d", rts_threshold);
 
        rts = kzalloc(sizeof(*rts), GFP_KERNEL);
        if (!rts) {
@@ -338,7 +345,7 @@ int wl1271_acx_rts_threshold(struct wl1271 *wl, u16 rts_threshold)
                goto out;
        }
 
-       rts->threshold = cpu_to_le16(rts_threshold);
+       rts->threshold = cpu_to_le16((u16)rts_threshold);
 
        ret = wl1271_cmd_configure(wl, DOT11_RTS_THRESHOLD, rts, sizeof(*rts));
        if (ret < 0) {
@@ -928,12 +935,19 @@ out:
        return ret;
 }
 
-int wl1271_acx_frag_threshold(struct wl1271 *wl, u16 frag_threshold)
+int wl1271_acx_frag_threshold(struct wl1271 *wl, u32 frag_threshold)
 {
        struct acx_frag_threshold *acx;
        int ret = 0;
 
-       wl1271_debug(DEBUG_ACX, "acx frag threshold");
+       /*
+        * If the fragmentation is not configured or out of range, use the
+        * default value.
+        */
+       if (frag_threshold > IEEE80211_MAX_FRAG_THRESHOLD)
+               frag_threshold = wl->conf.tx.frag_threshold;
+
+       wl1271_debug(DEBUG_ACX, "acx frag threshold: %d", frag_threshold);
 
        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
 
@@ -942,7 +956,7 @@ int wl1271_acx_frag_threshold(struct wl1271 *wl, u16 frag_threshold)
                goto out;
        }
 
-       acx->frag_threshold = cpu_to_le16(frag_threshold);
+       acx->frag_threshold = cpu_to_le16((u16)frag_threshold);
        ret = wl1271_cmd_configure(wl, ACX_FRAG_CFG, acx, sizeof(*acx));
        if (ret < 0) {
                wl1271_warning("Setting of frag threshold failed: %d", ret);
index cd7548d..828367d 100644 (file)
@@ -1333,7 +1333,7 @@ int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time);
 int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable,
                                 void *mc_list, u32 mc_list_len);
 int wl1271_acx_service_period_timeout(struct wl1271 *wl);
-int wl1271_acx_rts_threshold(struct wl1271 *wl, u16 rts_threshold);
+int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold);
 int wl1271_acx_dco_itrim_params(struct wl1271 *wl);
 int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter);
 int wl1271_acx_beacon_filter_table(struct wl1271 *wl);
@@ -1357,7 +1357,7 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max,
 int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type,
                       u8 tsid, u8 ps_scheme, u8 ack_policy,
                       u32 apsd_conf0, u32 apsd_conf1);
-int wl1271_acx_frag_threshold(struct wl1271 *wl, u16 frag_threshold);
+int wl1271_acx_frag_threshold(struct wl1271 *wl, u32 frag_threshold);
 int wl1271_acx_tx_config_options(struct wl1271 *wl);
 int wl1271_acx_ap_mem_cfg(struct wl1271 *wl);
 int wl1271_acx_sta_mem_cfg(struct wl1271 *wl);
index 1be6569..060ca31 100644 (file)
@@ -258,7 +258,7 @@ int wl1271_init_phy_config(struct wl1271 *wl)
        if (ret < 0)
                return ret;
 
-       ret = wl1271_acx_rts_threshold(wl, wl->conf.rx.rts_threshold);
+       ret = wl1271_acx_rts_threshold(wl, wl->hw->wiphy->rts_threshold);
        if (ret < 0)
                return ret;
 
@@ -614,7 +614,7 @@ int wl1271_hw_init(struct wl1271 *wl)
                goto out_free_memmap;
 
        /* Default fragmentation threshold */
-       ret = wl1271_acx_frag_threshold(wl, wl->conf.tx.frag_threshold);
+       ret = wl1271_acx_frag_threshold(wl, wl->hw->wiphy->frag_threshold);
        if (ret < 0)
                goto out_free_memmap;
 
index 5f8bb35..81a0c8e 100644 (file)
@@ -163,7 +163,7 @@ static struct conf_drv_settings default_conf = {
                .packet_detection_threshold  = 0,
                .ps_poll_timeout             = 15,
                .upsd_timeout                = 15,
-               .rts_threshold               = 2347,
+               .rts_threshold               = IEEE80211_MAX_RTS_THRESHOLD,
                .rx_cca_threshold            = 0,
                .irq_blk_threshold           = 0xFFFF,
                .irq_pkt_threshold           = 0,
@@ -2360,7 +2360,7 @@ static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
        if (ret < 0)
                goto out;
 
-       ret = wl1271_acx_frag_threshold(wl, (u16)value);
+       ret = wl1271_acx_frag_threshold(wl, value);
        if (ret < 0)
                wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
 
@@ -2388,7 +2388,7 @@ static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
        if (ret < 0)
                goto out;
 
-       ret = wl1271_acx_rts_threshold(wl, (u16) value);
+       ret = wl1271_acx_rts_threshold(wl, value);
        if (ret < 0)
                wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);