OSDN Git Service

rsi: new bootup parameters for 9116
authorSiva Rebbagondla <siva8118@gmail.com>
Wed, 3 Apr 2019 04:13:06 +0000 (09:43 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 25 Apr 2019 16:44:27 +0000 (19:44 +0300)
Bootup parameters are different for 9116 device. Check added for device
model where-ever bootup parameters are being send.

Signed-off-by: Siva Rebbagondla <siva8118@gmail.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/rsi/rsi_91x_mgmt.c
drivers/net/wireless/rsi/rsi_boot_params.h
drivers/net/wireless/rsi/rsi_mgmt.h

index 9eb60a5..d4d833c 100644 (file)
@@ -209,6 +209,59 @@ static struct bootup_params boot_params_40 = {
        .beacon_resedue_alg_en = 0,
 };
 
+static struct bootup_params_9116 boot_params_9116_20 = {
+       .magic_number = cpu_to_le16(LOADED_TOKEN),
+       .valid = cpu_to_le32(VALID_20),
+       .device_clk_info_9116 = {{
+               .pll_config_9116_g = {
+                       .pll_ctrl_set_reg = cpu_to_le16(0xd518),
+                       .pll_ctrl_clr_reg = cpu_to_le16(0x2ae7),
+                       .pll_modem_conig_reg = cpu_to_le16(0x2000),
+                       .soc_clk_config_reg = cpu_to_le16(0x0c18),
+                       .adc_dac_strm1_config_reg = cpu_to_le16(0x1100),
+                       .adc_dac_strm2_config_reg = cpu_to_le16(0x6600),
+               },
+               .switch_clk_9116_g = {
+                       .switch_clk_info =
+                               cpu_to_le32((RSI_SWITCH_TASS_CLK |
+                                           RSI_SWITCH_WLAN_BBP_LMAC_CLK_REG |
+                                           RSI_SWITCH_BBP_LMAC_CLK_REG)),
+                       .tass_clock_reg = cpu_to_le32(0x083C0503),
+                       .wlan_bbp_lmac_clk_reg_val = cpu_to_le32(0x01042001),
+                       .zbbt_bbp_lmac_clk_reg_val = cpu_to_le32(0x02010001),
+                       .bbp_lmac_clk_en_val = cpu_to_le32(0x0000003b),
+               }
+       },
+       },
+};
+
+static struct bootup_params_9116 boot_params_9116_40 = {
+       .magic_number = cpu_to_le16(LOADED_TOKEN),
+       .valid = cpu_to_le32(VALID_40),
+       .device_clk_info_9116 = {{
+               .pll_config_9116_g = {
+                       .pll_ctrl_set_reg = cpu_to_le16(0xd518),
+                       .pll_ctrl_clr_reg = cpu_to_le16(0x2ae7),
+                       .pll_modem_conig_reg = cpu_to_le16(0x3000),
+                       .soc_clk_config_reg = cpu_to_le16(0x0c18),
+                       .adc_dac_strm1_config_reg = cpu_to_le16(0x0000),
+                       .adc_dac_strm2_config_reg = cpu_to_le16(0x6600),
+               },
+               .switch_clk_9116_g = {
+                       .switch_clk_info =
+                               cpu_to_le32((RSI_SWITCH_TASS_CLK |
+                                           RSI_SWITCH_WLAN_BBP_LMAC_CLK_REG |
+                                           RSI_SWITCH_BBP_LMAC_CLK_REG |
+                                           RSI_MODEM_CLK_160MHZ)),
+                       .tass_clock_reg = cpu_to_le32(0x083C0503),
+                       .wlan_bbp_lmac_clk_reg_val = cpu_to_le32(0x01042002),
+                       .zbbt_bbp_lmac_clk_reg_val = cpu_to_le32(0x04010002),
+                       .bbp_lmac_clk_en_val = cpu_to_le32(0x0000003b),
+               }
+       },
+       },
+};
+
 static u16 mcs[] = {13, 26, 39, 52, 78, 104, 117, 130};
 
 /**
@@ -893,6 +946,50 @@ static int rsi_load_bootup_params(struct rsi_common *common)
        return rsi_send_internal_mgmt_frame(common, skb);
 }
 
+static int rsi_load_9116_bootup_params(struct rsi_common *common)
+{
+       struct sk_buff *skb;
+       struct rsi_boot_params_9116 *boot_params;
+
+       rsi_dbg(MGMT_TX_ZONE, "%s: Sending boot params frame\n", __func__);
+
+       skb = dev_alloc_skb(sizeof(struct rsi_boot_params_9116));
+       if (!skb)
+               return -ENOMEM;
+       memset(skb->data, 0, sizeof(struct rsi_boot_params));
+       boot_params = (struct rsi_boot_params_9116 *)skb->data;
+
+       if (common->channel_width == BW_40MHZ) {
+               memcpy(&boot_params->bootup_params,
+                      &boot_params_9116_40,
+                      sizeof(struct bootup_params_9116));
+               rsi_dbg(MGMT_TX_ZONE, "%s: Packet 40MHZ <=== %d\n", __func__,
+                       UMAC_CLK_40BW);
+               boot_params->umac_clk = cpu_to_le16(UMAC_CLK_40BW);
+       } else {
+               memcpy(&boot_params->bootup_params,
+                      &boot_params_9116_20,
+                      sizeof(struct bootup_params_9116));
+               if (boot_params_20.valid != cpu_to_le32(VALID_20)) {
+                       boot_params->umac_clk = cpu_to_le16(UMAC_CLK_20BW);
+                       rsi_dbg(MGMT_TX_ZONE,
+                               "%s: Packet 20MHZ <=== %d\n", __func__,
+                               UMAC_CLK_20BW);
+               } else {
+                       boot_params->umac_clk = cpu_to_le16(UMAC_CLK_40MHZ);
+                       rsi_dbg(MGMT_TX_ZONE,
+                               "%s: Packet 20MHZ <=== %d\n", __func__,
+                               UMAC_CLK_40MHZ);
+               }
+       }
+       rsi_set_len_qno(&boot_params->desc_dword0.len_qno,
+                       sizeof(struct bootup_params_9116), RSI_WIFI_MGMT_Q);
+       boot_params->desc_dword0.frame_type = BOOTUP_PARAMS_REQUEST;
+       skb_put(skb, sizeof(struct rsi_boot_params_9116));
+
+       return rsi_send_internal_mgmt_frame(common, skb);
+}
+
 /**
  * rsi_send_reset_mac() - This function prepares reset MAC request and sends an
  *                       internal management frame to indicate it to firmware.
@@ -971,7 +1068,10 @@ int rsi_band_check(struct rsi_common *common,
        }
 
        if (common->channel_width != prev_bw) {
-               status = rsi_load_bootup_params(common);
+               if (adapter->device_model == RSI_DEV_9116)
+                       status = rsi_load_9116_bootup_params(common);
+               else
+                       status = rsi_load_bootup_params(common);
                if (status)
                        return status;
 
@@ -1936,6 +2036,8 @@ out:
 
 int rsi_handle_card_ready(struct rsi_common *common, u8 *msg)
 {
+       int status;
+
        switch (common->fsm_state) {
        case FSM_CARD_NOT_READY:
                rsi_dbg(INIT_ZONE, "Card ready indication from Common HAL\n");
@@ -1963,9 +2065,13 @@ int rsi_handle_card_ready(struct rsi_common *common, u8 *msg)
                rsi_dbg(INFO_ZONE, "USB buffer status register = %x\n",
                        common->priv->usb_buffer_status_reg);
 
-               if (rsi_load_bootup_params(common)) {
+               if (common->priv->device_model == RSI_DEV_9116)
+                       status = rsi_load_9116_bootup_params(common);
+               else
+                       status = rsi_load_bootup_params(common);
+               if (status < 0) {
                        common->fsm_state = FSM_CARD_NOT_READY;
-                       return -EINVAL;
+                       return status;
                }
                common->fsm_state = FSM_BOOT_PARAMS_SENT;
                break;
index ad903b2..c1cf19d 100644 (file)
@@ -80,6 +80,15 @@ struct pll_config {
        struct afepll_info afepll_info_g;
 } __packed;
 
+struct pll_config_9116 {
+       __le16 pll_ctrl_set_reg;
+       __le16 pll_ctrl_clr_reg;
+       __le16 pll_modem_conig_reg;
+       __le16 soc_clk_config_reg;
+       __le16 adc_dac_strm1_config_reg;
+       __le16 adc_dac_strm2_config_reg;
+} __packed;
+
 /* structure to store configs related to UMAC clk programming */
 struct switch_clk {
        __le16 switch_clk_info;
@@ -93,11 +102,32 @@ struct switch_clk {
        __le16 qspi_uart_clock_reg_config;
 } __packed;
 
+#define RSI_SWITCH_TASS_CLK                    BIT(0)
+#define RSI_SWITCH_QSPI_CLK                    BIT(1)
+#define RSI_SWITCH_SLP_CLK_2_32                        BIT(2)
+#define RSI_SWITCH_WLAN_BBP_LMAC_CLK_REG       BIT(3)
+#define RSI_SWITCH_ZBBT_BBP_LMAC_CLK_REG       BIT(4)
+#define RSI_SWITCH_BBP_LMAC_CLK_REG            BIT(5)
+#define RSI_MODEM_CLK_160MHZ                   BIT(6)
+
+struct switch_clk_9116 {
+       __le32 switch_clk_info;
+       __le32 tass_clock_reg;
+       __le32 wlan_bbp_lmac_clk_reg_val;
+       __le32 zbbt_bbp_lmac_clk_reg_val;
+       __le32 bbp_lmac_clk_en_val;
+} __packed;
+
 struct device_clk_info {
        struct pll_config pll_config_g;
        struct switch_clk switch_clk_g;
 } __packed;
 
+struct device_clk_info_9116 {
+       struct pll_config_9116 pll_config_9116_g;
+       struct switch_clk_9116 switch_clk_9116_g;
+} __packed;
+
 struct bootup_params {
        __le16 magic_number;
        __le16 crystal_good_time;
@@ -127,4 +157,37 @@ struct bootup_params {
        __le32 max_threshold_to_avoid_sleep;
        u8 beacon_resedue_alg_en;
 } __packed;
+
+struct bootup_params_9116 {
+       __le16 magic_number;
+#define LOADED_TOKEN  0x5AA5   /* Bootup params are installed by host
+                               * or OTP/FLASH (Bootloader)
+                               */
+#define ROM_TOKEN     0x55AA   /* Bootup params are taken from ROM
+                               * itself in MCU mode.
+                               */
+       __le16 crystal_good_time;
+       __le32 valid;
+       __le32 reserved_for_valids;
+       __le16 bootup_mode_info;
+#define BT_COEXIST             BIT(0)
+#define BOOTUP_MODE            (BIT(2) | BIT(1))
+#define CUR_DEV_MODE_9116      (bootup_params_9116.bootup_mode_info >> 1)
+       __le16 digital_loop_back_params;
+       __le16 rtls_timestamp_en;
+       __le16 host_spi_intr_cfg;
+       struct device_clk_info_9116 device_clk_info_9116[1];
+       __le32 buckboost_wakeup_cnt;
+       __le16 pmu_wakeup_wait;
+       u8 shutdown_wait_time;
+       u8 pmu_slp_clkout_sel;
+       __le32 wdt_prog_value;
+       __le32 wdt_soc_rst_delay;
+       __le32 dcdc_operation_mode;
+       __le32 soc_reset_wait_cnt;
+       __le32 waiting_time_at_fresh_sleep;
+       __le32 max_threshold_to_avoid_sleep;
+       u8 beacon_resedue_alg_en;
+} __packed;
+
 #endif
index ea83faa..6b9248d 100644 (file)
@@ -351,6 +351,15 @@ struct rsi_boot_params {
        struct bootup_params bootup_params;
 } __packed;
 
+struct rsi_boot_params_9116 {
+       struct rsi_cmd_desc_dword0 desc_dword0;
+       struct rsi_cmd_desc_dword1 desc_dword1;
+       struct rsi_cmd_desc_dword2 desc_dword2;
+       __le16 reserved;
+       __le16 umac_clk;
+       struct bootup_params_9116 bootup_params;
+} __packed;
+
 struct rsi_peer_notify {
        struct rsi_cmd_desc desc;
        u8 mac_addr[6];