brcm80211: fmac: update bus state in common driver part
authorArend van Spriel <arend@broadcom.com>
Thu, 9 Feb 2012 20:09:05 +0000 (21:09 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 22 Feb 2012 19:48:52 +0000 (14:48 -0500)
The bus state is updated in the sdio bus init function, but it is
better to do it when the brcmf_bus_start() function is completed
successfully. The brcmf_netdev_open() function will return -EAGAIN
until the state is updated instead of calling brcmf_bus_start() to
avoid reentering that function.

Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c

index ff7fc0e..68da756 100644 (file)
@@ -796,18 +796,19 @@ static int brcmf_netdev_open(struct net_device *ndev)
 {
        struct brcmf_if *ifp = netdev_priv(ndev);
        struct brcmf_pub *drvr = ifp->drvr;
+       struct brcmf_bus *bus_if = drvr->bus_if;
        u32 toe_ol;
        s32 ret = 0;
 
        brcmf_dbg(TRACE, "ifidx %d\n", ifp->idx);
 
        if (ifp->idx == 0) {    /* do it only for primary eth0 */
-               /* try to bring up bus */
-               ret = brcmf_bus_start(drvr->dev);
-               if (ret != 0) {
-                       brcmf_dbg(ERROR, "failed with code %d\n", ret);
-                       return -1;
+               /* If bus is not ready, can't continue */
+               if (bus_if->state != BRCMF_BUS_DATA) {
+                       brcmf_dbg(ERROR, "failed bus is not ready\n");
+                       return -EAGAIN;
                }
+
                atomic_set(&drvr->pend_8021x_cnt, 0);
 
                memcpy(ndev->dev_addr, drvr->mac, ETH_ALEN);
@@ -979,12 +980,6 @@ int brcmf_bus_start(struct device *dev)
                return ret;
        }
 
-       /* If bus is not ready, can't come up */
-       if (bus_if->state != BRCMF_BUS_DATA) {
-               brcmf_dbg(ERROR, "failed bus is not ready\n");
-               return -ENODEV;
-       }
-
        brcmf_c_mkiovar("event_msgs", drvr->eventmask, BRCMF_EVENTING_MASK_LEN,
                      iovbuf, sizeof(iovbuf));
        brcmf_proto_cdc_query_dcmd(drvr, 0, BRCMF_C_GET_VAR, iovbuf,
@@ -1021,6 +1016,8 @@ int brcmf_bus_start(struct device *dev)
        if (ret < 0)
                return ret;
 
+       /* signal bus ready */
+       bus_if->state = BRCMF_BUS_DATA;
        return 0;
 }
 
index 47a192d..253fc20 100644 (file)
@@ -3464,9 +3464,6 @@ static int brcmf_sdbrcm_bus_init(struct device *dev)
 
                brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1,
                                       SBSDIO_WATERMARK, 8, &err);
-
-               /* Set bus state according to enable result */
-               bus_if->state = BRCMF_BUS_DATA;
        } else {
                /* Disable F2 again */
                enable = SDIO_FUNC_ENABLE_1;