[PATCH 2/2] Move nv loading to driver init
Eugene Krasnikov
k.eugene.e at gmail.com
Fri Jun 7 05:22:59 EDT 2013
Cool! Looks good to me. Will use wifi over the weekend.
2013/6/7 Pontus Fuchs <pontus.fuchs at gmail.com>:
> The start op is called on resume but firmware loading cannot be
> done on resume. Move it to driver init instead.
>
> Signed-off-by: Pontus Fuchs <pontus.fuchs at gmail.com>
> ---
> main.c | 27 +++++++++++++--------------
> 1 file changed, 13 insertions(+), 14 deletions(-)
>
> diff --git a/main.c b/main.c
> index 70c7a23..259255f 100644
> --- a/main.c
> +++ b/main.c
> @@ -66,19 +66,12 @@ static int wcn36xx_start(struct ieee80211_hw *hw)
>
> INIT_WORK(&wcn->rx_ready_work, wcn36xx_rx_ready_work);
>
> - ret = request_firmware(&wcn->nv, WLAN_NV_FILE, wcn->dev);
> - if (ret) {
> - wcn36xx_error("Failed to load nv file %s: %d", WLAN_NV_FILE,
> - ret);
> - goto out_free_dxe_ctl;
> - }
> -
> /* Maximum SMD message size is 4k */
> wcn->smd_buf = kmalloc(4096, GFP_KERNEL);
> if (!wcn->smd_buf) {
> wcn36xx_error("Failed to allocate smd buf");
> ret = -ENOMEM;
> - goto out_free_nv;
> + goto out_free_dxe_ctl;
> }
>
> /* TODO pass configuration to FW */
> @@ -91,7 +84,7 @@ static int wcn36xx_start(struct ieee80211_hw *hw)
> ret = wcn36xx_smd_start(wcn);
> if (ret) {
> wcn36xx_error("Failed to start chip");
> - goto out_free_nv;
> + goto out_free_smd_buf;
> }
> /* DMA chanel initialization */
> ret = wcn36xx_dxe_init(wcn);
> @@ -105,8 +98,6 @@ out_smd_stop:
> wcn36xx_smd_stop(wcn);
> out_free_smd_buf:
> kfree(wcn->smd_buf);
> -out_free_nv:
> - release_firmware(wcn->nv);
> out_free_dxe_pool:
> wcn36xx_dxe_free_mem_pools(wcn);
> out_free_dxe_ctl:
> @@ -129,8 +120,6 @@ static void wcn36xx_stop(struct ieee80211_hw *hw)
> wcn36xx_dxe_free_mem_pools(wcn);
> wcn36xx_dxe_free_ctl_blks(wcn);
>
> - release_firmware(wcn->nv);
> -
> kfree(wcn->smd_buf);
> }
>
> @@ -828,15 +817,24 @@ static int __init wcn36xx_init(void)
> private_hw = hw;
> wcn->beacon_enable = false;
>
> + ret = request_firmware(&wcn->nv, WLAN_NV_FILE, wcn->dev);
> + if (ret) {
> + wcn36xx_error("Failed to load nv file %s: %d", WLAN_NV_FILE,
> + ret);
> + goto out_unmap;
> + }
> +
> wcn36xx_read_mac_addresses(wcn);
> SET_IEEE80211_PERM_ADDR(wcn->hw, wcn->addresses[0].addr);
>
> ret = ieee80211_register_hw(wcn->hw);
> if (ret)
> - goto out_unmap;
> + goto out_free_nv;
>
> return 0;
>
> +out_free_nv:
> + release_firmware(wcn->nv);
> out_unmap:
> iounmap(wcn->mmio);
> out_wq_ctl:
> @@ -858,6 +856,7 @@ static void __exit wcn36xx_exit(void)
> destroy_workqueue(wcn->ctl_wq);
> destroy_workqueue(wcn->wq);
> iounmap(wcn->mmio);
> + release_firmware(wcn->nv);
> ieee80211_free_hw(hw);
> }
> module_exit(wcn36xx_exit);
> --
> 1.8.1.2
>
>
> _______________________________________________
> wcn36xx mailing list
> wcn36xx at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/wcn36xx
--
Best regards,
Eugene
More information about the wcn36xx
mailing list