diff options
| author | Jeff Johnson <jjohnson@codeaurora.org> | 2017-02-02 08:54:48 -0800 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2017-02-03 13:50:41 -0800 |
| commit | d55dcbadccbe60463df24b82152c5317d06c08c2 (patch) | |
| tree | 4ea766cfa8f270a0431cd133deb9943121bffb5f | |
| parent | d1ae706c831e95331b64a256c1107d2c18c56f80 (diff) | |
qcacld-3.0: Change hdd_open_interfaces() to return errno
Desk review of hdd_wlan_startup() revealed improper use of the adapter
returned by hdd_open_interfaces() since in the failure case multiple
calls will be made to hdd_debugfs_exit() for that returned adapter.
Further review revealed the fact that having hdd_open_interfaces()
return an adapter is illogical since hdd_open_interfaces() can
legitimately open multiple interfaces, and hence the return value
should simply indicate whether all required interfaces were opened or
not. So update hdd_open_interfaces() to return errno instead of an
adapter.
Change-Id: I71117c32f053dad97a5c4bcaef33af27a903f511
CRs-Fixed: 2001662
| -rw-r--r-- | core/hdd/src/wlan_hdd_main.c | 91 |
1 files changed, 43 insertions, 48 deletions
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index e8ef3c6b27c7..8c459d976c39 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -6794,6 +6794,22 @@ static inline int hdd_open_p2p_interface(hdd_context_t *hdd_ctx, } #endif +static int hdd_open_ocb_interface(hdd_context_t *hdd_ctx, bool rtnl_held) +{ + hdd_adapter_t *adapter; + int ret = 0; + + adapter = hdd_open_adapter(hdd_ctx, QDF_OCB_MODE, "wlanocb%d", + wlan_hdd_get_intf_addr(hdd_ctx), + NET_NAME_UNKNOWN, rtnl_held); + if (adapter == NULL) { + hdd_err("Failed to open 802.11p interface"); + ret = -ENOSPC; + } + + return ret; +} + /** * hdd_start_station_adapter()- Start the Station Adapter * @adapter: HDD adapter @@ -6884,56 +6900,43 @@ int hdd_start_ftm_adapter(hdd_adapter_t *adapter) * * Open all the interfaces like STA, P2P and OCB based on the configuration. * - * Return: Primary adapter on success and PTR_ERR on failure + * Return: 0 if all interfaces were created, otherwise negative errno */ -static hdd_adapter_t *hdd_open_interfaces(hdd_context_t *hdd_ctx, - bool rtnl_held) +static int hdd_open_interfaces(hdd_context_t *hdd_ctx, bool rtnl_held) { - hdd_adapter_t *adapter = NULL; - hdd_adapter_t *adapter_11p = NULL; + hdd_adapter_t *adapter; int ret; - if (hdd_ctx->config->dot11p_mode == WLAN_HDD_11P_STANDALONE) { + if (hdd_ctx->config->dot11p_mode == WLAN_HDD_11P_STANDALONE) /* Create only 802.11p interface */ - adapter = hdd_open_adapter(hdd_ctx, QDF_OCB_MODE, "wlanocb%d", - wlan_hdd_get_intf_addr(hdd_ctx), - NET_NAME_UNKNOWN, rtnl_held); + return hdd_open_ocb_interface(hdd_ctx, rtnl_held); - if (adapter == NULL) - return ERR_PTR(-ENOSPC); - - return adapter; - } adapter = hdd_open_adapter(hdd_ctx, QDF_STA_MODE, "wlan%d", wlan_hdd_get_intf_addr(hdd_ctx), NET_NAME_UNKNOWN, rtnl_held); if (adapter == NULL) - return ERR_PTR(-ENOSPC); + return -ENOSPC; + /* fast roaming is allowed only on first STA, i.e. wlan adapter */ adapter->fast_roaming_allowed = true; ret = hdd_open_p2p_interface(hdd_ctx, rtnl_held); if (ret) - goto err_close_adapter; + goto err_close_adapters; /* Open 802.11p Interface */ if (hdd_ctx->config->dot11p_mode == WLAN_HDD_11P_CONCURRENT) { - adapter_11p = hdd_open_adapter(hdd_ctx, QDF_OCB_MODE, - "wlanocb%d", - wlan_hdd_get_intf_addr(hdd_ctx), - NET_NAME_UNKNOWN, rtnl_held); - if (adapter_11p == NULL) { - hdd_err("Failed to open 802.11p interface"); - goto err_close_adapter; - } + ret = hdd_open_ocb_interface(hdd_ctx, rtnl_held); + if (ret) + goto err_close_adapters; } - return adapter; + return 0; -err_close_adapter: +err_close_adapters: hdd_close_all_adapters(hdd_ctx, rtnl_held); - return ERR_PTR(ret); + return ret; } /** @@ -8208,8 +8211,7 @@ static void hdd_register_debug_callback(void) int hdd_wlan_startup(struct device *dev) { QDF_STATUS status; - hdd_adapter_t *adapter = NULL; - hdd_context_t *hdd_ctx = NULL; + hdd_context_t *hdd_ctx; int ret; void *hif_sc; bool rtnl_held; @@ -8233,7 +8235,7 @@ int hdd_wlan_startup(struct device *dev) hdd_green_ap_init(hdd_ctx); - ret = hdd_wlan_start_modules(hdd_ctx, adapter, false); + ret = hdd_wlan_start_modules(hdd_ctx, NULL, false); if (ret) { hdd_alert("Failed to start modules: %d", ret); goto err_exit_nl_srv; @@ -8267,22 +8269,20 @@ int hdd_wlan_startup(struct device *dev) rtnl_held = hdd_hold_rtnl_lock(); - adapter = hdd_open_interfaces(hdd_ctx, rtnl_held); - - if (IS_ERR(adapter)) { - hdd_alert("Failed to open interface, adapter is NULL"); - ret = PTR_ERR(adapter); + ret = hdd_open_interfaces(hdd_ctx, rtnl_held); + if (ret) { + hdd_alert("Failed to open interfaces: %d", ret); goto err_release_rtnl_lock; } hif_sc = cds_get_context(QDF_MODULE_ID_HIF); if (!hif_sc) { hdd_err("HIF context is NULL"); - goto err_close_adapter; + goto err_close_adapters; } /* * target hw version/revision would only be retrieved after firmware - * donwload + * download */ hif_get_hw_info(hif_sc, &hdd_ctx->target_hw_version, &hdd_ctx->target_hw_revision, @@ -8327,11 +8327,11 @@ int hdd_wlan_startup(struct device *dev) ret = hdd_register_notifiers(hdd_ctx); if (ret) - goto err_debugfs_exit; + goto err_close_adapters; status = wlansap_global_init(); if (QDF_IS_STATUS_ERROR(status)) - goto err_debugfs_exit; + goto err_close_adapters; hdd_runtime_suspend_context_init(hdd_ctx); memdump_init(); @@ -8364,10 +8364,7 @@ int hdd_wlan_startup(struct device *dev) complete(&wlan_start_comp); goto success; -err_debugfs_exit: - hdd_debugfs_exit(adapter); - -err_close_adapter: +err_close_adapters: hdd_close_all_adapters(hdd_ctx, rtnl_held); err_release_rtnl_lock: @@ -9703,11 +9700,9 @@ static int hdd_register_req_mode(hdd_context_t *hdd_ctx, rtnl_held = hdd_hold_rtnl_lock(); switch (mode) { case QDF_GLOBAL_MISSION_MODE: - adapter = hdd_open_interfaces(hdd_ctx, rtnl_held); - if (IS_ERR(adapter)) { - hdd_alert("Failed to open interface, adapter is NULL"); - ret = -EINVAL; - } + ret = hdd_open_interfaces(hdd_ctx, rtnl_held); + if (ret) + hdd_alert("Failed to open interfaces: %d", ret); break; case QDF_GLOBAL_FTM_MODE: adapter = hdd_open_adapter(hdd_ctx, QDF_FTM_MODE, "wlan%d", |
