wl12xx: add set_rate_mgmt_params acx
authorEliad Peller <eliad@wizery.com>
Sun, 14 Aug 2011 10:17:14 +0000 (13:17 +0300)
committerLuciano Coelho <coelho@ti.com>
Mon, 22 Aug 2011 09:35:25 +0000 (12:35 +0300)
Configure rate management parameters on hw init

Signed-off-by: Eliad Peller <eliad@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/conf.h
drivers/net/wireless/wl12xx/init.c
drivers/net/wireless/wl12xx/main.c

index 968d2197ac8117cf0d0056c0279e5e5bdde2cc0c..a784ba6a8ef61f9a9e538ae47d76e804f690eba8 100644 (file)
@@ -1699,3 +1699,45 @@ out:
        kfree(acx);
        return ret;
 }
+
+int wl12xx_acx_set_rate_mgmt_params(struct wl1271 *wl)
+{
+       struct wl12xx_acx_set_rate_mgmt_params *acx = NULL;
+       struct conf_rate_policy_settings *conf = &wl->conf.rate;
+       int ret;
+
+       wl1271_debug(DEBUG_ACX, "acx set rate mgmt params");
+
+       acx = kzalloc(sizeof(*acx), GFP_KERNEL);
+       if (!acx)
+               return -ENOMEM;
+
+       acx->index = ACX_RATE_MGMT_ALL_PARAMS;
+       acx->rate_retry_score = cpu_to_le16(conf->rate_retry_score);
+       acx->per_add = cpu_to_le16(conf->per_add);
+       acx->per_th1 = cpu_to_le16(conf->per_th1);
+       acx->per_th2 = cpu_to_le16(conf->per_th2);
+       acx->max_per = cpu_to_le16(conf->max_per);
+       acx->inverse_curiosity_factor = conf->inverse_curiosity_factor;
+       acx->tx_fail_low_th = conf->tx_fail_low_th;
+       acx->tx_fail_high_th = conf->tx_fail_high_th;
+       acx->per_alpha_shift = conf->per_alpha_shift;
+       acx->per_add_shift = conf->per_add_shift;
+       acx->per_beta1_shift = conf->per_beta1_shift;
+       acx->per_beta2_shift = conf->per_beta2_shift;
+       acx->rate_check_up = conf->rate_check_up;
+       acx->rate_check_down = conf->rate_check_down;
+       memcpy(acx->rate_retry_policy, conf->rate_retry_policy,
+              sizeof(acx->rate_retry_policy));
+
+       ret = wl1271_cmd_configure(wl, ACX_SET_RATE_MGMT_PARAMS,
+                                  acx, sizeof(*acx));
+       if (ret < 0) {
+               wl1271_warning("acx set rate mgmt params failed: %d", ret);
+               goto out;
+       }
+
+out:
+       kfree(acx);
+       return ret;
+}
index 3aec410634e799741fbe5b93f2ce9bb19998208a..6909bc535a5d79e0f41300957a64cf0f36db1b29 100644 (file)
@@ -1155,6 +1155,30 @@ struct wl1271_acx_fm_coex {
        u8 swallow_clk_diff;
 } __packed;
 
+#define ACX_RATE_MGMT_ALL_PARAMS 0xff
+struct wl12xx_acx_set_rate_mgmt_params {
+       struct acx_header header;
+
+       u8 index; /* 0xff to configure all params */
+       u8 padding1;
+       __le16 rate_retry_score;
+       __le16 per_add;
+       __le16 per_th1;
+       __le16 per_th2;
+       __le16 max_per;
+       u8 inverse_curiosity_factor;
+       u8 tx_fail_low_th;
+       u8 tx_fail_high_th;
+       u8 per_alpha_shift;
+       u8 per_add_shift;
+       u8 per_beta1_shift;
+       u8 per_beta2_shift;
+       u8 rate_check_up;
+       u8 rate_check_down;
+       u8 rate_retry_policy[ACX_RATE_MGMT_NUM_OF_RATES];
+       u8 padding2[2];
+} __packed;
+
 enum {
        ACX_WAKE_UP_CONDITIONS      = 0x0002,
        ACX_MEM_CFG                 = 0x0003,
@@ -1294,5 +1318,6 @@ int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl);
 int wl1271_acx_config_ps(struct wl1271 *wl);
 int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr);
 int wl1271_acx_fm_coex(struct wl1271 *wl);
+int wl12xx_acx_set_rate_mgmt_params(struct wl1271 *wl);
 
 #endif /* __WL1271_ACX_H__ */
index 6080e01d92c6e84a272ea2beaad5033caf5bd3bf..30ee7d304bcc5043588d3625e9a80788556c266c 100644 (file)
@@ -1309,6 +1309,25 @@ struct conf_fwlog {
        u8 threshold;
 };
 
+#define ACX_RATE_MGMT_NUM_OF_RATES 13
+struct conf_rate_policy_settings {
+       u16 rate_retry_score;
+       u16 per_add;
+       u16 per_th1;
+       u16 per_th2;
+       u16 max_per;
+       u8 inverse_curiosity_factor;
+       u8 tx_fail_low_th;
+       u8 tx_fail_high_th;
+       u8 per_alpha_shift;
+       u8 per_add_shift;
+       u8 per_beta1_shift;
+       u8 per_beta2_shift;
+       u8 rate_check_up;
+       u8 rate_check_down;
+       u8 rate_retry_policy[ACX_RATE_MGMT_NUM_OF_RATES];
+};
+
 struct conf_drv_settings {
        struct conf_sg_settings sg;
        struct conf_rx_settings rx;
@@ -1326,6 +1345,7 @@ struct conf_drv_settings {
        struct conf_fm_coex fm_coex;
        struct conf_rx_streaming_settings rx_streaming;
        struct conf_fwlog fwlog;
+       struct conf_rate_policy_settings rate;
        u8 hci_io_ds;
 };
 
index 3a6660901c3381028a44bd70b3d984eb39a8075d..1bc246f42a65ae890254758a725e0c2cf9799061 100644 (file)
@@ -715,6 +715,10 @@ int wl1271_hw_init(struct wl1271 *wl)
        if (ret < 0)
                goto out_free_memmap;
 
+       ret = wl12xx_acx_set_rate_mgmt_params(wl);
+       if (ret < 0)
+               goto out_free_memmap;
+
        /* Configure initiator BA sessions policies */
        ret = wl1271_set_ba_policies(wl);
        if (ret < 0)
index d683bca9b30846b57c869b43f4ee553562361ca7..3db191de3f51c2ace2ac007ea582bef51162dd3c 100644 (file)
@@ -379,6 +379,27 @@ static struct conf_drv_settings default_conf = {
                .threshold                    = 0,
        },
        .hci_io_ds = HCI_IO_DS_6MA,
+       .rate = {
+               .rate_retry_score = 32000,
+               .per_add = 8192,
+               .per_th1 = 2048,
+               .per_th2 = 4096,
+               .max_per = 8100,
+               .inverse_curiosity_factor = 5,
+               .tx_fail_low_th = 4,
+               .tx_fail_high_th = 10,
+               .per_alpha_shift = 4,
+               .per_add_shift = 13,
+               .per_beta1_shift = 10,
+               .per_beta2_shift = 8,
+               .rate_check_up = 2,
+               .rate_check_down = 12,
+               .rate_retry_policy = {
+                       0x00, 0x00, 0x00, 0x00, 0x00,
+                       0x00, 0x00, 0x00, 0x00, 0x00,
+                       0x00, 0x00, 0x00,
+               },
+       },
 };
 
 static char *fwlog_param;