#endif
}
-int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops,
- struct iwl_cfg *cfg)
+int iwl_op_mode_dvm_start(struct iwl_bus *bus,
+ const struct iwl_trans_ops *trans_ops,
+ struct iwl_cfg *cfg)
{
+ struct iwl_fw *fw = &nic(bus)->fw;
int err = 0;
struct iwl_priv *priv;
struct ieee80211_hw *hw;
iwl_debug_config(priv);
IWL_DEBUG_INFO(priv, "*** LOAD DRIVER ***\n");
- cfg(priv) = cfg;
/* is antenna coupling more than 35dB ? */
priv->bt_ant_couple_ok =
iwl_power_initialize(priv);
iwl_tt_initialize(priv);
- init_completion(&nic(priv)->request_firmware_complete);
+ snprintf(priv->hw->wiphy->fw_version,
+ sizeof(priv->hw->wiphy->fw_version),
+ "%s", fw->fw_version);
+
+ priv->new_scan_threshold_behaviour =
+ !!(fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_NEWSCAN);
- err = iwl_request_firmware(nic(priv), true);
+ if (fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_PAN) {
+ priv->sta_key_max_num = STA_KEY_MAX_NUM_PAN;
+ priv->shrd->cmd_queue = IWL_IPAN_CMD_QUEUE_NUM;
+ } else {
+ priv->sta_key_max_num = STA_KEY_MAX_NUM;
+ priv->shrd->cmd_queue = IWL_DEFAULT_CMD_QUEUE_NUM;
+ }
+
+ priv->phy_calib_chain_noise_reset_cmd =
+ fw->ucode_capa.standard_phy_calibration_size;
+ priv->phy_calib_chain_noise_gain_cmd =
+ fw->ucode_capa.standard_phy_calibration_size + 1;
+
+ /* initialize all valid contexts */
+ iwl_init_context(priv, fw->ucode_capa.flags);
+
+ /**************************************************
+ * This is still part of probe() in a sense...
+ *
+ * 9. Setup and register with mac80211 and debugfs
+ **************************************************/
+ err = iwlagn_mac_setup_register(priv, &fw->ucode_capa);
if (err)
goto out_destroy_workqueue;
+ err = iwl_dbgfs_register(priv, DRV_NAME);
+ if (err)
+ IWL_ERR(priv,
+ "failed to create debugfs files. Ignoring error: %d\n",
+ err);
+
return 0;
out_destroy_workqueue:
return err;
}
+int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops,
+ struct iwl_cfg *cfg)
+{
+ bus->shrd->cfg = cfg;
+
+ init_completion(&nic(bus)->request_firmware_complete);
+
+ return iwl_request_firmware(nic(bus), true);
+}
+
void __devexit iwl_remove(struct iwl_priv * priv)
{
wait_for_completion(&nic(priv)->request_firmware_complete);
static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context);
-#define UCODE_EXPERIMENTAL_INDEX 100
#define UCODE_EXPERIMENTAL_TAG "exp"
int __must_check iwl_request_firmware(struct iwl_nic *nic, bool first)
struct iwl_nic *nic = context;
struct iwl_cfg *cfg = cfg(nic);
struct iwl_fw *fw = &nic->fw;
- struct iwl_priv *priv = priv(nic); /* temporary */
struct iwl_ucode_header *ucode;
int err;
struct iwlagn_firmware_pieces pieces;
IWL_INFO(nic, "loaded firmware version %s", nic->fw.fw_version);
- snprintf(priv->hw->wiphy->fw_version,
- sizeof(priv->hw->wiphy->fw_version),
- "%s", nic->fw.fw_version);
-
/*
* For any of the failures below (before allocating pci memory)
* we will try to load a version with a smaller API -- maybe the
#ifndef CONFIG_IWLWIFI_P2P
fw->ucode_capa.flags &= ~IWL_UCODE_TLV_FLAGS_PAN;
#endif
-
- priv->new_scan_threshold_behaviour =
- !!(fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_NEWSCAN);
-
- if (!(cfg->sku & EEPROM_SKU_CAP_IPAN_ENABLE))
- fw->ucode_capa.flags &= ~IWL_UCODE_TLV_FLAGS_PAN;
-
- /*
- * if not PAN, then don't support P2P -- might be a uCode
- * packaging bug or due to the eeprom check above
- */
- if (!(fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_PAN))
- fw->ucode_capa.flags &= ~IWL_UCODE_TLV_FLAGS_P2P;
-
- if (fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_PAN) {
- priv->sta_key_max_num = STA_KEY_MAX_NUM_PAN;
- nic->shrd->cmd_queue = IWL_IPAN_CMD_QUEUE_NUM;
- } else {
- priv->sta_key_max_num = STA_KEY_MAX_NUM;
- nic->shrd->cmd_queue = IWL_DEFAULT_CMD_QUEUE_NUM;
- }
/*
* figure out the offset of chain noise reset and gain commands
* base on the size of standard phy calibration commands table size
fw->ucode_capa.standard_phy_calibration_size =
IWL_MAX_STANDARD_PHY_CALIBRATE_TBL_SIZE;
- priv->phy_calib_chain_noise_reset_cmd =
- fw->ucode_capa.standard_phy_calibration_size;
- priv->phy_calib_chain_noise_gain_cmd =
- fw->ucode_capa.standard_phy_calibration_size + 1;
-
- /* initialize all valid contexts */
- iwl_init_context(priv, fw->ucode_capa.flags);
-
- /**************************************************
- * This is still part of probe() in a sense...
- *
- * 9. Setup and register with mac80211 and debugfs
- **************************************************/
- err = iwlagn_mac_setup_register(priv, &fw->ucode_capa);
- if (err)
- goto out_unbind;
+ if (!(cfg->sku & EEPROM_SKU_CAP_IPAN_ENABLE))
+ fw->ucode_capa.flags &= ~IWL_UCODE_TLV_FLAGS_PAN;
- err = iwl_dbgfs_register(priv, DRV_NAME);
- if (err)
- IWL_ERR(nic,
- "failed to create debugfs files. Ignoring error: %d\n",
- err);
+ /*
+ * if not PAN, then don't support P2P -- might be a uCode
+ * packaging bug or due to the eeprom check above
+ */
+ if (!(fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_PAN))
+ fw->ucode_capa.flags &= ~IWL_UCODE_TLV_FLAGS_P2P;
/* We have our copies now, allow OS release its copies */
release_firmware(ucode_raw);
complete(&nic->request_firmware_complete);
+
+ if (iwl_op_mode_dvm_start(bus(nic), trans(nic)->ops, cfg))
+ goto out_unbind;
+
return;
try_again:
/* try next, if any */
+ release_firmware(ucode_raw);
if (iwl_request_firmware(nic, false))
goto out_unbind;
- release_firmware(ucode_raw);
return;
err_pci_alloc:
IWL_ERR(nic, "failed to allocate pci memory\n");
iwl_dealloc_ucode(nic);
+ release_firmware(ucode_raw);
out_unbind:
complete(&nic->request_firmware_complete);
device_release_driver(trans(nic)->dev);
- release_firmware(ucode_raw);
}