|
@@ -197,6 +197,30 @@ int brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev,
|
|
|
+ enum brcmf_sdiod_state state)
|
|
|
+{
|
|
|
+ if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM ||
|
|
|
+ state == sdiodev->state)
|
|
|
+ return;
|
|
|
+
|
|
|
+ brcmf_dbg(TRACE, "%d -> %d\n", sdiodev->state, state);
|
|
|
+ switch (sdiodev->state) {
|
|
|
+ case BRCMF_SDIOD_DATA:
|
|
|
+ /* any other state means bus interface is down */
|
|
|
+ brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_DOWN);
|
|
|
+ break;
|
|
|
+ case BRCMF_SDIOD_DOWN:
|
|
|
+ /* transition from DOWN to DATA means bus interface is up */
|
|
|
+ if (state == BRCMF_SDIOD_DATA)
|
|
|
+ brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_UP);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ sdiodev->state = state;
|
|
|
+}
|
|
|
+
|
|
|
static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func,
|
|
|
uint regaddr, u8 byte)
|
|
|
{
|
|
@@ -269,12 +293,6 @@ static int brcmf_sdiod_request_data(struct brcmf_sdio_dev *sdiodev, u8 fn,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static void brcmf_sdiod_nomedium_state(struct brcmf_sdio_dev *sdiodev)
|
|
|
-{
|
|
|
- sdiodev->state = BRCMF_STATE_NOMEDIUM;
|
|
|
- brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_DOWN);
|
|
|
-}
|
|
|
-
|
|
|
static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
|
|
|
u8 regsz, void *data, bool write)
|
|
|
{
|
|
@@ -282,7 +300,7 @@ static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
|
|
|
s32 retry = 0;
|
|
|
int ret;
|
|
|
|
|
|
- if (sdiodev->state == BRCMF_STATE_NOMEDIUM)
|
|
|
+ if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
|
|
|
return -ENOMEDIUM;
|
|
|
|
|
|
/*
|
|
@@ -308,7 +326,7 @@ static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
|
|
|
retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
|
|
|
|
|
|
if (ret == -ENOMEDIUM)
|
|
|
- brcmf_sdiod_nomedium_state(sdiodev);
|
|
|
+ brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
|
|
|
else if (ret != 0) {
|
|
|
/*
|
|
|
* SleepCSR register access can fail when
|
|
@@ -331,7 +349,7 @@ brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address)
|
|
|
int err = 0, i;
|
|
|
u8 addr[3];
|
|
|
|
|
|
- if (sdiodev->state == BRCMF_STATE_NOMEDIUM)
|
|
|
+ if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
|
|
|
return -ENOMEDIUM;
|
|
|
|
|
|
addr[0] = (address >> 8) & SBSDIO_SBADDRLOW_MASK;
|
|
@@ -460,7 +478,7 @@ static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn,
|
|
|
err = sdio_readsb(sdiodev->func[fn], ((u8 *)(pkt->data)), addr,
|
|
|
req_sz);
|
|
|
if (err == -ENOMEDIUM)
|
|
|
- brcmf_sdiod_nomedium_state(sdiodev);
|
|
|
+ brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
|
|
|
return err;
|
|
|
}
|
|
|
|
|
@@ -595,7 +613,7 @@ static int brcmf_sdiod_sglist_rw(struct brcmf_sdio_dev *sdiodev, uint fn,
|
|
|
|
|
|
ret = mmc_cmd.error ? mmc_cmd.error : mmc_dat.error;
|
|
|
if (ret == -ENOMEDIUM) {
|
|
|
- brcmf_sdiod_nomedium_state(sdiodev);
|
|
|
+ brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
|
|
|
break;
|
|
|
} else if (ret != 0) {
|
|
|
brcmf_err("CMD53 sg block %s failed %d\n",
|
|
@@ -1050,6 +1068,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
|
|
|
bus_if->wowl_supported = true;
|
|
|
#endif
|
|
|
|
|
|
+ brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_DOWN);
|
|
|
sdiodev->sleeping = false;
|
|
|
atomic_set(&sdiodev->suspend, false);
|
|
|
init_waitqueue_head(&sdiodev->idle_wait);
|