Commit 61448a93 authored by Kalle Valo's avatar Kalle Valo

ath6kl: merge ath6kl_init() to ath6kl_core_init()

In preparation for splitting module initialisation and hardware boot
code from each other.
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 4e3d54c7
...@@ -1421,20 +1421,62 @@ static int ath6kl_init_hw_params(struct ath6kl *ar) ...@@ -1421,20 +1421,62 @@ static int ath6kl_init_hw_params(struct ath6kl *ar)
return 0; 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; s32 timeleft;
struct net_device *ndev; struct net_device *ndev;
int i; int i, ret = 0;
if (!ar) ar->ath6kl_wq = create_singlethread_workqueue("ath6kl");
return -EIO; 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 */ /* Do we need to finish the BMI phase */
if (ath6kl_bmi_done(ar)) { if (ath6kl_bmi_done(ar)) {
status = -EIO; ret = -EIO;
goto ath6kl_init_done; goto err_htc_cleanup;
} }
/* Indicate that WMI is enabled (although not ready yet) */ /* Indicate that WMI is enabled (although not ready yet) */
...@@ -1442,18 +1484,18 @@ static int ath6kl_init(struct ath6kl *ar) ...@@ -1442,18 +1484,18 @@ static int ath6kl_init(struct ath6kl *ar)
ar->wmi = ath6kl_wmi_init(ar); ar->wmi = ath6kl_wmi_init(ar);
if (!ar->wmi) { if (!ar->wmi) {
ath6kl_err("failed to initialize wmi\n"); ath6kl_err("failed to initialize wmi\n");
status = -EIO; ret = -EIO;
goto ath6kl_init_done; goto err_htc_cleanup;
} }
ath6kl_dbg(ATH6KL_DBG_TRC, "%s: got wmi @ 0x%p.\n", __func__, ar->wmi); ath6kl_dbg(ATH6KL_DBG_TRC, "%s: got wmi @ 0x%p.\n", __func__, ar->wmi);
status = ath6kl_register_ieee80211_hw(ar); ret = ath6kl_register_ieee80211_hw(ar);
if (status) if (ret)
goto err_node_cleanup; goto err_node_cleanup;
status = ath6kl_debug_init(ar); ret = ath6kl_debug_init(ar);
if (status) { if (ret) {
wiphy_unregister(ar->wiphy); wiphy_unregister(ar->wiphy);
goto err_node_cleanup; goto err_node_cleanup;
} }
...@@ -1471,7 +1513,7 @@ static int ath6kl_init(struct ath6kl *ar) ...@@ -1471,7 +1513,7 @@ static int ath6kl_init(struct ath6kl *ar)
if (!ndev) { if (!ndev) {
ath6kl_err("Failed to instantiate a network device\n"); ath6kl_err("Failed to instantiate a network device\n");
status = -ENOMEM; ret = -ENOMEM;
wiphy_unregister(ar->wiphy); wiphy_unregister(ar->wiphy);
goto err_debug_init; goto err_debug_init;
} }
...@@ -1486,12 +1528,12 @@ static int ath6kl_init(struct ath6kl *ar) ...@@ -1486,12 +1528,12 @@ static int ath6kl_init(struct ath6kl *ar)
* size. * size.
*/ */
if (ath6kl_htc_wait_target(ar->htc_target)) { if (ath6kl_htc_wait_target(ar->htc_target)) {
status = -EIO; ret = -EIO;
goto err_if_deinit; goto err_if_deinit;
} }
if (ath6kl_init_service_ep(ar)) { if (ath6kl_init_service_ep(ar)) {
status = -EIO; ret = -EIO;
goto err_cleanup_scatter; goto err_cleanup_scatter;
} }
...@@ -1514,9 +1556,8 @@ static int ath6kl_init(struct ath6kl *ar) ...@@ -1514,9 +1556,8 @@ static int ath6kl_init(struct ath6kl *ar)
ath6kl_cookie_init(ar); ath6kl_cookie_init(ar);
/* start HTC */ /* start HTC */
status = ath6kl_htc_start(ar->htc_target); ret = ath6kl_htc_start(ar->htc_target);
if (ret) {
if (status) {
ath6kl_cookie_cleanup(ar); ath6kl_cookie_cleanup(ar);
goto err_rxbuf_cleanup; goto err_rxbuf_cleanup;
} }
...@@ -1532,13 +1573,13 @@ static int ath6kl_init(struct ath6kl *ar) ...@@ -1532,13 +1573,13 @@ static int ath6kl_init(struct ath6kl *ar)
if (ar->version.abi_ver != ATH6KL_ABI_VERSION) { if (ar->version.abi_ver != ATH6KL_ABI_VERSION) {
ath6kl_err("abi version mismatch: host(0x%x), target(0x%x)\n", ath6kl_err("abi version mismatch: host(0x%x), target(0x%x)\n",
ATH6KL_ABI_VERSION, ar->version.abi_ver); ATH6KL_ABI_VERSION, ar->version.abi_ver);
status = -EIO; ret = -EIO;
goto err_htc_stop; goto err_htc_stop;
} }
if (!timeleft || signal_pending(current)) { if (!timeleft || signal_pending(current)) {
ath6kl_err("wmi is not ready or wait was interrupted\n"); ath6kl_err("wmi is not ready or wait was interrupted\n");
status = -EIO; ret = -EIO;
goto err_htc_stop; goto err_htc_stop;
} }
...@@ -1555,8 +1596,8 @@ static int ath6kl_init(struct ath6kl *ar) ...@@ -1555,8 +1596,8 @@ static int ath6kl_init(struct ath6kl *ar)
WIPHY_FLAG_HAVE_AP_SME; WIPHY_FLAG_HAVE_AP_SME;
for (i = 0; i < MAX_NUM_VIF; i++) { for (i = 0; i < MAX_NUM_VIF; i++) {
status = ath6kl_target_config_wlan_params(ar, i); ret = ath6kl_target_config_wlan_params(ar, i);
if (status) if (ret)
goto err_htc_stop; goto err_htc_stop;
} }
...@@ -1566,7 +1607,7 @@ static int ath6kl_init(struct ath6kl *ar) ...@@ -1566,7 +1607,7 @@ static int ath6kl_init(struct ath6kl *ar)
*/ */
memcpy(ndev->dev_addr, ar->mac_addr, ETH_ALEN); memcpy(ndev->dev_addr, ar->mac_addr, ETH_ALEN);
return status; return ret;
err_htc_stop: err_htc_stop:
ath6kl_htc_stop(ar->htc_target); ath6kl_htc_stop(ar->htc_target);
...@@ -1586,65 +1627,6 @@ static int ath6kl_init(struct ath6kl *ar) ...@@ -1586,65 +1627,6 @@ static int ath6kl_init(struct ath6kl *ar)
ath6kl_wmi_shutdown(ar->wmi); ath6kl_wmi_shutdown(ar->wmi);
clear_bit(WMI_ENABLED, &ar->flag); clear_bit(WMI_ENABLED, &ar->flag);
ar->wmi = NULL; 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: err_htc_cleanup:
ath6kl_htc_cleanup(ar->htc_target); ath6kl_htc_cleanup(ar->htc_target);
err_power_off: err_power_off:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment