summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKalle Valo <kvalo@qca.qualcomm.com>2011-10-27 18:48:29 +0300
committerKalle Valo <kvalo@qca.qualcomm.com>2011-11-11 12:58:56 +0200
commit61448a93efc26dc00e9684a9421394ca78142479 (patch)
treedda31a127de80224e7b918d4f8ebc5dd9d5fa697
parent4e3d54c7abcaad35062540432ba5b72bf27876aa (diff)
ath6kl: merge ath6kl_init() to ath6kl_core_init()
In preparation for splitting module initialisation and hardware boot code from each other. Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
-rw-r--r--drivers/net/wireless/ath/ath6kl/init.c148
1 files changed, 65 insertions, 83 deletions
diff --git a/drivers/net/wireless/ath/ath6kl/init.c b/drivers/net/wireless/ath/ath6kl/init.c
index e89c9a6d8e36..62e0f22afefa 100644
--- a/drivers/net/wireless/ath/ath6kl/init.c
+++ b/drivers/net/wireless/ath/ath6kl/init.c
@@ -1421,20 +1421,62 @@ static int ath6kl_init_hw_params(struct ath6kl *ar)
return 0;
}
-static int ath6kl_init(struct ath6kl *ar)
+int ath6kl_core_init(struct ath6kl *ar)
{
- int status = 0;
+ struct ath6kl_bmi_target_info targ_info;
s32 timeleft;
struct net_device *ndev;
- int i;
+ int i, ret = 0;
- if (!ar)
- return -EIO;
+ ar->ath6kl_wq = create_singlethread_workqueue("ath6kl");
+ if (!ar->ath6kl_wq)
+ return -ENOMEM;
+
+ ret = ath6kl_bmi_init(ar);
+ if (ret)
+ goto err_wq;
+
+ ret = ath6kl_hif_power_on(ar);
+ if (ret)
+ goto err_bmi_cleanup;
+
+ ret = ath6kl_bmi_get_target_info(ar, &targ_info);
+ if (ret)
+ goto err_power_off;
+
+ ar->version.target_ver = le32_to_cpu(targ_info.version);
+ ar->target_type = le32_to_cpu(targ_info.type);
+ ar->wiphy->hw_version = le32_to_cpu(targ_info.version);
+
+ ret = ath6kl_init_hw_params(ar);
+ if (ret)
+ goto err_power_off;
+
+ ret = ath6kl_configure_target(ar);
+ if (ret)
+ goto err_power_off;
+
+ ar->htc_target = ath6kl_htc_create(ar);
+
+ if (!ar->htc_target) {
+ ret = -ENOMEM;
+ goto err_power_off;
+ }
+
+ ret = ath6kl_fetch_firmwares(ar);
+ if (ret)
+ goto err_htc_cleanup;
+
+ /* FIXME: we should free all firmwares in the error cases below */
+
+ ret = ath6kl_init_upload(ar);
+ if (ret)
+ goto err_htc_cleanup;
/* Do we need to finish the BMI phase */
if (ath6kl_bmi_done(ar)) {
- status = -EIO;
- goto ath6kl_init_done;
+ ret = -EIO;
+ goto err_htc_cleanup;
}
/* Indicate that WMI is enabled (although not ready yet) */
@@ -1442,18 +1484,18 @@ static int ath6kl_init(struct ath6kl *ar)
ar->wmi = ath6kl_wmi_init(ar);
if (!ar->wmi) {
ath6kl_err("failed to initialize wmi\n");
- status = -EIO;
- goto ath6kl_init_done;
+ ret = -EIO;
+ goto err_htc_cleanup;
}
ath6kl_dbg(ATH6KL_DBG_TRC, "%s: got wmi @ 0x%p.\n", __func__, ar->wmi);
- status = ath6kl_register_ieee80211_hw(ar);
- if (status)
+ ret = ath6kl_register_ieee80211_hw(ar);
+ if (ret)
goto err_node_cleanup;
- status = ath6kl_debug_init(ar);
- if (status) {
+ ret = ath6kl_debug_init(ar);
+ if (ret) {
wiphy_unregister(ar->wiphy);
goto err_node_cleanup;
}
@@ -1471,7 +1513,7 @@ static int ath6kl_init(struct ath6kl *ar)
if (!ndev) {
ath6kl_err("Failed to instantiate a network device\n");
- status = -ENOMEM;
+ ret = -ENOMEM;
wiphy_unregister(ar->wiphy);
goto err_debug_init;
}
@@ -1486,12 +1528,12 @@ static int ath6kl_init(struct ath6kl *ar)
* size.
*/
if (ath6kl_htc_wait_target(ar->htc_target)) {
- status = -EIO;
+ ret = -EIO;
goto err_if_deinit;
}
if (ath6kl_init_service_ep(ar)) {
- status = -EIO;
+ ret = -EIO;
goto err_cleanup_scatter;
}
@@ -1514,9 +1556,8 @@ static int ath6kl_init(struct ath6kl *ar)
ath6kl_cookie_init(ar);
/* start HTC */
- status = ath6kl_htc_start(ar->htc_target);
-
- if (status) {
+ ret = ath6kl_htc_start(ar->htc_target);
+ if (ret) {
ath6kl_cookie_cleanup(ar);
goto err_rxbuf_cleanup;
}
@@ -1532,13 +1573,13 @@ static int ath6kl_init(struct ath6kl *ar)
if (ar->version.abi_ver != ATH6KL_ABI_VERSION) {
ath6kl_err("abi version mismatch: host(0x%x), target(0x%x)\n",
ATH6KL_ABI_VERSION, ar->version.abi_ver);
- status = -EIO;
+ ret = -EIO;
goto err_htc_stop;
}
if (!timeleft || signal_pending(current)) {
ath6kl_err("wmi is not ready or wait was interrupted\n");
- status = -EIO;
+ ret = -EIO;
goto err_htc_stop;
}
@@ -1555,8 +1596,8 @@ static int ath6kl_init(struct ath6kl *ar)
WIPHY_FLAG_HAVE_AP_SME;
for (i = 0; i < MAX_NUM_VIF; i++) {
- status = ath6kl_target_config_wlan_params(ar, i);
- if (status)
+ ret = ath6kl_target_config_wlan_params(ar, i);
+ if (ret)
goto err_htc_stop;
}
@@ -1566,7 +1607,7 @@ static int ath6kl_init(struct ath6kl *ar)
*/
memcpy(ndev->dev_addr, ar->mac_addr, ETH_ALEN);
- return status;
+ return ret;
err_htc_stop:
ath6kl_htc_stop(ar->htc_target);
@@ -1586,65 +1627,6 @@ err_node_cleanup:
ath6kl_wmi_shutdown(ar->wmi);
clear_bit(WMI_ENABLED, &ar->flag);
ar->wmi = NULL;
-
-ath6kl_init_done:
- return status;
-}
-
-int ath6kl_core_init(struct ath6kl *ar)
-{
- int ret = 0;
- struct ath6kl_bmi_target_info targ_info;
-
- ar->ath6kl_wq = create_singlethread_workqueue("ath6kl");
- if (!ar->ath6kl_wq)
- return -ENOMEM;
-
- ret = ath6kl_bmi_init(ar);
- if (ret)
- goto err_wq;
-
- ret = ath6kl_hif_power_on(ar);
- if (ret)
- goto err_bmi_cleanup;
-
- ret = ath6kl_bmi_get_target_info(ar, &targ_info);
- if (ret)
- goto err_power_off;
-
- ar->version.target_ver = le32_to_cpu(targ_info.version);
- ar->target_type = le32_to_cpu(targ_info.type);
- ar->wiphy->hw_version = le32_to_cpu(targ_info.version);
-
- ret = ath6kl_init_hw_params(ar);
- if (ret)
- goto err_power_off;
-
- ret = ath6kl_configure_target(ar);
- if (ret)
- goto err_power_off;
-
- ar->htc_target = ath6kl_htc_create(ar);
-
- if (!ar->htc_target) {
- ret = -ENOMEM;
- goto err_power_off;
- }
-
- ret = ath6kl_fetch_firmwares(ar);
- if (ret)
- goto err_htc_cleanup;
-
- ret = ath6kl_init_upload(ar);
- if (ret)
- goto err_htc_cleanup;
-
- ret = ath6kl_init(ar);
- if (ret)
- goto err_htc_cleanup;
-
- return ret;
-
err_htc_cleanup:
ath6kl_htc_cleanup(ar->htc_target);
err_power_off: