[PATCH 1/5] wcn36xx: initialize device defaults on start

Eugene Krasnikov k.eugene.e at gmail.com
Tue Mar 4 04:05:08 EST 2014


I think we should have done this a long time ago! My only concern is
that we set something that is not used like:
+       WCN36XX_CFG_VAL(INFRA_STA_KEEP_ALIVE_PERIOD, 0),

But since we do not have access to firmware then we expect that this
flag must be set.

2014-03-03 20:45 GMT+00:00 Bob Copeland <me at bobcopeland.com>:
> Set up default configuration for the device when we call start.
> The defaults come from dumps from the prima driver for the same
> hardware.
>
> This fixes transmit A-MPDU; previously only one MPDU would be
> sent per A-MPDU due to missing MAX_MPDUS_IN_AMPDU setting.
>
> Signed-off-by: Bob Copeland <bob at cozybit.com>
> ---
>  smd.c |  103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 101 insertions(+), 2 deletions(-)
>
> diff --git a/smd.c b/smd.c
> index 1301f4c..88aa84b 100644
> --- a/smd.c
> +++ b/smd.c
> @@ -22,6 +22,91 @@
>  #include <linux/bitops.h>
>  #include "smd.h"
>
> +struct wcn36xx_cfg_val {
> +       u32 cfg_id;
> +       u32 value;
> +};
> +
> +#define WCN36XX_CFG_VAL(id, val) \
> +{ \
> +       .cfg_id = WCN36XX_HAL_CFG_ ## id, \
> +       .value = val \
> +}
> +
> +static struct wcn36xx_cfg_val wcn36xx_cfg_vals[] = {
> +       WCN36XX_CFG_VAL(CURRENT_TX_ANTENNA, 1),
> +       WCN36XX_CFG_VAL(CURRENT_RX_ANTENNA, 1),
> +       WCN36XX_CFG_VAL(LOW_GAIN_OVERRIDE, 0),
> +       WCN36XX_CFG_VAL(POWER_STATE_PER_CHAIN, 785),
> +       WCN36XX_CFG_VAL(CAL_PERIOD, 5),
> +       WCN36XX_CFG_VAL(CAL_CONTROL, 1),
> +       WCN36XX_CFG_VAL(PROXIMITY, 0),
> +       WCN36XX_CFG_VAL(NETWORK_DENSITY, 3),
> +       WCN36XX_CFG_VAL(MAX_MEDIUM_TIME, 6000),
> +       WCN36XX_CFG_VAL(MAX_MPDUS_IN_AMPDU, 64),
> +       WCN36XX_CFG_VAL(RTS_THRESHOLD, 2347),
> +       WCN36XX_CFG_VAL(SHORT_RETRY_LIMIT, 6),
> +       WCN36XX_CFG_VAL(LONG_RETRY_LIMIT, 6),
> +       WCN36XX_CFG_VAL(FRAGMENTATION_THRESHOLD, 8000),
> +       WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_ZERO, 5),
> +       WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_ONE, 10),
> +       WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_TWO, 15),
> +       WCN36XX_CFG_VAL(FIXED_RATE, 0),
> +       WCN36XX_CFG_VAL(RETRYRATE_POLICY, 4),
> +       WCN36XX_CFG_VAL(RETRYRATE_SECONDARY, 0),
> +       WCN36XX_CFG_VAL(RETRYRATE_TERTIARY, 0),
> +       WCN36XX_CFG_VAL(FORCE_POLICY_PROTECTION, 5),
> +       WCN36XX_CFG_VAL(FIXED_RATE_MULTICAST_24GHZ, 1),
> +       WCN36XX_CFG_VAL(FIXED_RATE_MULTICAST_5GHZ, 5),
> +       WCN36XX_CFG_VAL(DEFAULT_RATE_INDEX_5GHZ, 5),
> +       WCN36XX_CFG_VAL(MAX_BA_SESSIONS, 40),
> +       WCN36XX_CFG_VAL(PS_DATA_INACTIVITY_TIMEOUT, 200),
> +       WCN36XX_CFG_VAL(PS_ENABLE_BCN_FILTER, 1),
> +       WCN36XX_CFG_VAL(PS_ENABLE_RSSI_MONITOR, 1),
> +       WCN36XX_CFG_VAL(NUM_BEACON_PER_RSSI_AVERAGE, 20),
> +       WCN36XX_CFG_VAL(STATS_PERIOD, 10),
> +       WCN36XX_CFG_VAL(CFP_MAX_DURATION, 30000),
> +       WCN36XX_CFG_VAL(FRAME_TRANS_ENABLED, 0),
> +       WCN36XX_CFG_VAL(DTIM_PERIOD, 1),
> +       WCN36XX_CFG_VAL(BA_THRESHOLD_HIGH, 128),
> +       WCN36XX_CFG_VAL(MAX_BA_BUFFERS, 2560),
> +       WCN36XX_CFG_VAL(DYNAMIC_PS_POLL_VALUE, 0),
> +       WCN36XX_CFG_VAL(TELE_BCN_TRANS_LI, 3),
> +       WCN36XX_CFG_VAL(TELE_BCN_TRANS_LI_IDLE_BCNS, 10),
> +       WCN36XX_CFG_VAL(TELE_BCN_MAX_LI, 5),
> +       WCN36XX_CFG_VAL(TELE_BCN_MAX_LI_IDLE_BCNS, 15),
> +       WCN36XX_CFG_VAL(TELE_BCN_WAKEUP_EN, 0),
> +       WCN36XX_CFG_VAL(INFRA_STA_KEEP_ALIVE_PERIOD, 0),
> +       WCN36XX_CFG_VAL(TX_PWR_CTRL_ENABLE, 1),
> +       WCN36XX_CFG_VAL(ENABLE_CLOSE_LOOP, 1),
> +       WCN36XX_CFG_VAL(BTC_EXECUTION_MODE, 0),
> +       WCN36XX_CFG_VAL(BTC_DHCP_BT_SLOTS_TO_BLOCK, 0),
> +       WCN36XX_CFG_VAL(BTC_A2DP_DHCP_BT_SUB_INTERVALS, 7),
> +       WCN36XX_CFG_VAL(BTC_STATIC_LEN_INQ_BT, 120000),
> +       WCN36XX_CFG_VAL(BTC_STATIC_LEN_PAGE_BT, 10000),
> +       WCN36XX_CFG_VAL(BTC_STATIC_LEN_CONN_BT, 10000),
> +       WCN36XX_CFG_VAL(BTC_STATIC_LEN_LE_BT, 10000),
> +       WCN36XX_CFG_VAL(BTC_STATIC_LEN_INQ_WLAN, 30000),
> +       WCN36XX_CFG_VAL(BTC_STATIC_LEN_PAGE_WLAN, 0),
> +       WCN36XX_CFG_VAL(BTC_STATIC_LEN_CONN_WLAN, 0),
> +       WCN36XX_CFG_VAL(BTC_STATIC_LEN_LE_WLAN, 0),
> +       WCN36XX_CFG_VAL(BTC_DYN_MAX_LEN_BT, 250000),
> +       WCN36XX_CFG_VAL(BTC_DYN_MAX_LEN_WLAN, 45000),
> +       WCN36XX_CFG_VAL(BTC_MAX_SCO_BLOCK_PERC, 1),
> +       WCN36XX_CFG_VAL(BTC_DHCP_PROT_ON_A2DP, 1),
> +       WCN36XX_CFG_VAL(BTC_DHCP_PROT_ON_SCO, 0),
> +       WCN36XX_CFG_VAL(WCNSS_API_VERSION, 17039618),
> +       WCN36XX_CFG_VAL(AP_KEEPALIVE_TIMEOUT, 20),
> +       WCN36XX_CFG_VAL(GO_KEEPALIVE_TIMEOUT, 20),
> +       WCN36XX_CFG_VAL(ENABLE_MC_ADDR_LIST, 0),
> +       WCN36XX_CFG_VAL(ENABLE_LPWR_IMG_TRANSITION, 0),
> +       WCN36XX_CFG_VAL(MAX_ASSOC_LIMIT, 10),
> +       WCN36XX_CFG_VAL(ENABLE_MCC_ADAPTIVE_SCHEDULER, 0),
> +       WCN36XX_CFG_VAL(AP_LINK_MONITOR_TIMEOUT, 3),
> +       WCN36XX_CFG_VAL(BTC_DWELL_TIME_MULTIPLIER, 60000),
> +       WCN36XX_CFG_VAL(ENABLE_TDLS_OXYGEN_MODE, 90000),
> +};
> +
>  static int put_cfg_tlv_u32(struct wcn36xx *wcn, size_t *len, u32 id, u32 value)
>  {
>         struct wcn36xx_hal_cfg *entry;
> @@ -358,8 +443,10 @@ static int wcn36xx_smd_start_rsp(struct wcn36xx *wcn, void *buf, size_t len)
>
>  int wcn36xx_smd_start(struct wcn36xx *wcn)
>  {
> -       struct wcn36xx_hal_mac_start_req_msg msg_body;
> +       struct wcn36xx_hal_mac_start_req_msg msg_body, *body;
>         int ret = 0;
> +       int i;
> +       size_t len;
>
>         mutex_lock(&wcn->hal_mutex);
>         INIT_HAL_MSG(msg_body, WCN36XX_HAL_START_REQ);
> @@ -369,10 +456,22 @@ int wcn36xx_smd_start(struct wcn36xx *wcn)
>
>         PREPARE_HAL_BUF(wcn->hal_buf, msg_body);
>
> +       body = (struct wcn36xx_hal_mac_start_req_msg *) wcn->hal_buf;
> +       len = body->header.len;
> +
> +       for (i = 0; i < ARRAY_SIZE(wcn36xx_cfg_vals); i++) {
> +               ret = put_cfg_tlv_u32(wcn, &len, wcn36xx_cfg_vals[i].cfg_id,
> +                                     wcn36xx_cfg_vals[i].value);
> +               if (ret)
> +                       goto out;
> +       }
> +       body->header.len = len;
> +       body->params.len = len - sizeof(*body);
> +
>         wcn36xx_dbg(WCN36XX_DBG_HAL, "hal start type %d\n",
>                     msg_body.params.type);
>
> -       ret = wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
> +       ret = wcn36xx_smd_send_and_wait(wcn, body->header.len);
>         if (ret) {
>                 wcn36xx_err("Sending hal_start failed\n");
>                 goto out;
> --
> 1.7.10.4
>
>
> _______________________________________________
> wcn36xx mailing list
> wcn36xx at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/wcn36xx



-- 
Best regards,
Eugene



More information about the wcn36xx mailing list