iwlwifi: Add fw_name_pre_rf_next_step to support different rf steps
authorHaim Dreyfuss <haim.dreyfuss@intel.com>
Thu, 9 Mar 2017 13:18:58 +0000 (15:18 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 2 Jun 2017 11:10:41 +0000 (14:10 +0300)
Integrated chip may have different HW and RF steps.
Currently, the driver supports only different HW steps.
Add logic to support different RF steps enables combining different
HW and RF steps.

Signed-off-by: Haim Dreyfuss <haim.dreyfuss@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/iwl-9000.c
drivers/net/wireless/intel/iwlwifi/iwl-config.h
drivers/net/wireless/intel/iwlwifi/iwl-csr.h
drivers/net/wireless/intel/iwlwifi/iwl-drv.c

index 110ceefccc15387e0fa068a46fedf69ab6ab9a14..a2ee6aad3ce31dd45bb079a47824750e4be46914 100644 (file)
 #define IWL9000_SMEM_LEN               0x68000
 
 #define  IWL9000_FW_PRE "iwlwifi-9000-pu-a0-jf-a0-"
+#define  IWL9000RFB_FW_PRE "iwlwifi-9000-pu-a0-jf-b0-"
 #define  IWL9260A_FW_PRE "iwlwifi-9260-th-a0-jf-a0-"
 #define  IWL9260B_FW_PRE "iwlwifi-9260-th-b0-jf-b0-"
 #define IWL9000_MODULE_FIRMWARE(api) \
        IWL9000_FW_PRE "-" __stringify(api) ".ucode"
+#define IWL9000RFB_MODULE_FIRMWARE(api) \
+       IWL9000RFB_FW_PRE "-" __stringify(api) ".ucode"
 #define IWL9260A_MODULE_FIRMWARE(api) \
        IWL9260A_FW_PRE "-" __stringify(api) ".ucode"
 #define IWL9260B_MODULE_FIRMWARE(api) \
@@ -182,6 +185,7 @@ const struct iwl_cfg iwl9270_2ac_cfg = {
 const struct iwl_cfg iwl9460_2ac_cfg = {
        .name = "Intel(R) Dual Band Wireless AC 9460",
        .fw_name_pre = IWL9000_FW_PRE,
+       .fw_name_pre_rf_next_step = IWL9000RFB_FW_PRE,
        IWL_DEVICE_9000,
        .ht_params = &iwl9000_ht_params,
        .nvm_ver = IWL9000_NVM_VERSION,
@@ -193,6 +197,7 @@ const struct iwl_cfg iwl9460_2ac_cfg = {
 const struct iwl_cfg iwl9560_2ac_cfg = {
        .name = "Intel(R) Dual Band Wireless AC 9560",
        .fw_name_pre = IWL9000_FW_PRE,
+       .fw_name_pre_rf_next_step = IWL9000RFB_FW_PRE,
        IWL_DEVICE_9000,
        .ht_params = &iwl9000_ht_params,
        .nvm_ver = IWL9000_NVM_VERSION,
@@ -202,5 +207,6 @@ const struct iwl_cfg iwl9560_2ac_cfg = {
 };
 
 MODULE_FIRMWARE(IWL9000_MODULE_FIRMWARE(IWL9000_UCODE_API_MAX));
+MODULE_FIRMWARE(IWL9000RFB_MODULE_FIRMWARE(IWL9000_UCODE_API_MAX));
 MODULE_FIRMWARE(IWL9260A_MODULE_FIRMWARE(IWL9000_UCODE_API_MAX));
 MODULE_FIRMWARE(IWL9260B_MODULE_FIRMWARE(IWL9000_UCODE_API_MAX));
index a12197e3ce7837fe8aeadc71719d8837e93bb9f0..8b3ebd1d4a3d59269abbe0d715241e6fb12e792c 100644 (file)
@@ -275,6 +275,8 @@ struct iwl_pwr_tx_backoff {
  *     filename is constructed as fw_name_pre<api>.ucode.
  * @fw_name_pre_next_step: same as @fw_name_pre, only for next step
  *     (if supported)
+ * @fw_name_pre_rf_next_step: same as @fw_name_pre_next_step, only for rf next
+ *     step. Supported only in integrated solutions.
  * @ucode_api_max: Highest version of uCode API supported by driver.
  * @ucode_api_min: Lowest version of uCode API supported by driver.
  * @max_inst_size: The maximal length of the fw inst section
@@ -325,6 +327,7 @@ struct iwl_cfg {
        const char *name;
        const char *fw_name_pre;
        const char *fw_name_pre_next_step;
+       const char *fw_name_pre_rf_next_step;
        /* params not likely to change within a device family */
        const struct iwl_base_params *base_params;
        /* params likely to change within a device family */
index c9481b23b1a779f7a545bdb5472e6a44a4349a0c..36fb201685986065d31c5a9289821d7aa8798f42 100644 (file)
 #define CSR_HW_REV_DASH(_val)          (((_val) & 0x0000003) >> 0)
 #define CSR_HW_REV_STEP(_val)          (((_val) & 0x000000C) >> 2)
 
+/* HW RFID */
+#define CSR_HW_RFID_FLAVOR(_val)       (((_val) & 0x000000F) >> 0)
+#define CSR_HW_RFID_DASH(_val)         (((_val) & 0x00000F0) >> 4)
+#define CSR_HW_RFID_STEP(_val)         (((_val) & 0x0000F00) >> 8)
+#define CSR_HW_RFID_TYPE(_val)         (((_val) & 0x0FFF000) >> 12)
 
 /**
  *  hw_rev values
index 5cfacb0bca84df8fa603aafa44ad281af5e04fd3..806933377c58f92acce1e280b56f6d6f6a56ac8a 100644 (file)
@@ -218,6 +218,10 @@ static int iwl_request_firmware(struct iwl_drv *drv, bool first)
        if (drv->trans->cfg->device_family == IWL_DEVICE_FAMILY_8000 &&
            CSR_HW_REV_STEP(drv->trans->hw_rev) == SILICON_B_STEP)
                fw_pre_name = cfg->fw_name_pre_next_step;
+       else if (drv->trans->cfg->integrated &&
+                CSR_HW_RFID_STEP(drv->trans->hw_rf_id) == SILICON_B_STEP &&
+                cfg->fw_name_pre_rf_next_step)
+               fw_pre_name = cfg->fw_name_pre_rf_next_step;
        else
                fw_pre_name = cfg->fw_name_pre;