]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
brcmfmac: Handle mmc exceptions during init correct.
[mirror_ubuntu-bionic-kernel.git] / drivers / net / wireless / brcm80211 / brcmfmac / bcmsdh_sdmmc.c
index c3247d5b3c222bfcc6ab8a05236515be073f55b6..854573386f236fbf665bc7c27a8a35a847db85a9 100644 (file)
@@ -372,9 +372,7 @@ static int brcmf_sdioh_enablefuncs(struct brcmf_sdio_dev *sdiodev)
        }
 
        /* Enable Function 1 */
-       sdio_claim_host(sdiodev->func[1]);
        err_ret = sdio_enable_func(sdiodev->func[1]);
-       sdio_release_host(sdiodev->func[1]);
        if (err_ret)
                brcmf_dbg(ERROR, "Failed to enable F1 Err: 0x%08x\n", err_ret);
 
@@ -393,16 +391,14 @@ int brcmf_sdioh_attach(struct brcmf_sdio_dev *sdiodev)
        sdiodev->num_funcs = 2;
 
        sdio_claim_host(sdiodev->func[1]);
+
        err_ret = sdio_set_block_size(sdiodev->func[1], SDIO_FUNC1_BLOCKSIZE);
-       sdio_release_host(sdiodev->func[1]);
        if (err_ret) {
                brcmf_dbg(ERROR, "Failed to set F1 blocksize\n");
                goto out;
        }
 
-       sdio_claim_host(sdiodev->func[2]);
        err_ret = sdio_set_block_size(sdiodev->func[2], SDIO_FUNC2_BLOCKSIZE);
-       sdio_release_host(sdiodev->func[2]);
        if (err_ret) {
                brcmf_dbg(ERROR, "Failed to set F2 blocksize\n");
                goto out;
@@ -411,6 +407,7 @@ int brcmf_sdioh_attach(struct brcmf_sdio_dev *sdiodev)
        brcmf_sdioh_enablefuncs(sdiodev);
 
 out:
+       sdio_release_host(sdiodev->func[1]);
        brcmf_dbg(TRACE, "Done\n");
        return err_ret;
 }
@@ -515,6 +512,8 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
 
                brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_probe...\n");
                ret = brcmf_sdio_probe(sdiodev);
+               if (ret)
+                       dev_set_drvdata(&func->dev, NULL);
        }
 
        return ret;
@@ -535,8 +534,12 @@ static void brcmf_ops_sdio_remove(struct sdio_func *func)
                sdiodev = bus_if->bus_priv.sdio;
                brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_remove...\n");
                brcmf_sdio_remove(sdiodev);
-               dev_set_drvdata(&func->card->dev, NULL);
                dev_set_drvdata(&func->dev, NULL);
+       }
+       if (func->num == 1) {
+               sdiodev = dev_get_drvdata(&func->card->dev);
+               bus_if = sdiodev->bus_if;
+               dev_set_drvdata(&func->card->dev, NULL);
                kfree(bus_if);
                kfree(sdiodev);
        }