aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/brcm80211')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c27
1 files changed, 7 insertions, 20 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index 1d80e055b5f8..90a3849b41fe 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -2330,15 +2330,11 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
2330 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; 2330 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2331 } 2331 }
2332 bus->clkstate = CLK_AVAIL; 2332 bus->clkstate = CLK_AVAIL;
2333 } else {
2334 goto clkwait;
2335 } 2333 }
2336 } 2334 }
2337 2335
2338 /* Make sure backplane clock is on */ 2336 /* Make sure backplane clock is on */
2339 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, true); 2337 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, true);
2340 if (bus->clkstate == CLK_PENDING)
2341 goto clkwait;
2342 2338
2343 /* Pending interrupt indicates new device status */ 2339 /* Pending interrupt indicates new device status */
2344 if (atomic_read(&bus->ipend) > 0) { 2340 if (atomic_read(&bus->ipend) > 0) {
@@ -2412,7 +2408,7 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
2412 intstatus &= ~I_HMB_FRAME_IND; 2408 intstatus &= ~I_HMB_FRAME_IND;
2413 2409
2414 /* On frame indication, read available frames */ 2410 /* On frame indication, read available frames */
2415 if (PKT_AVAILABLE()) { 2411 if (PKT_AVAILABLE() && bus->clkstate == CLK_AVAIL) {
2416 framecnt = brcmf_sdbrcm_readframes(bus, rxlimit, &rxdone); 2412 framecnt = brcmf_sdbrcm_readframes(bus, rxlimit, &rxdone);
2417 if (rxdone || bus->rxskip) 2413 if (rxdone || bus->rxskip)
2418 intstatus &= ~I_HMB_FRAME_IND; 2414 intstatus &= ~I_HMB_FRAME_IND;
@@ -2422,22 +2418,21 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
2422 /* Keep still-pending events for next scheduling */ 2418 /* Keep still-pending events for next scheduling */
2423 bus->intstatus = intstatus; 2419 bus->intstatus = intstatus;
2424 2420
2425clkwait:
2426 brcmf_sdbrcm_clrintr(bus); 2421 brcmf_sdbrcm_clrintr(bus);
2427 2422
2428 if (data_ok(bus) && bus->ctrl_frame_stat && 2423 if (data_ok(bus) && bus->ctrl_frame_stat &&
2429 (bus->clkstate == CLK_AVAIL)) { 2424 (bus->clkstate == CLK_AVAIL)) {
2430 int ret, i; 2425 int i;
2431 2426
2432 ret = brcmf_sdcard_send_buf(bus->sdiodev, bus->sdiodev->sbwad, 2427 err = brcmf_sdcard_send_buf(bus->sdiodev, bus->sdiodev->sbwad,
2433 SDIO_FUNC_2, F2SYNC, bus->ctrl_frame_buf, 2428 SDIO_FUNC_2, F2SYNC, bus->ctrl_frame_buf,
2434 (u32) bus->ctrl_frame_len); 2429 (u32) bus->ctrl_frame_len);
2435 2430
2436 if (ret < 0) { 2431 if (err < 0) {
2437 /* On failure, abort the command and 2432 /* On failure, abort the command and
2438 terminate the frame */ 2433 terminate the frame */
2439 brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n", 2434 brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n",
2440 ret); 2435 err);
2441 bus->sdcnt.tx_sderrs++; 2436 bus->sdcnt.tx_sderrs++;
2442 2437
2443 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2); 2438 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2);
@@ -2459,10 +2454,9 @@ clkwait:
2459 break; 2454 break;
2460 } 2455 }
2461 2456
2462 } 2457 } else {
2463 if (ret == 0)
2464 bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP; 2458 bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP;
2465 2459 }
2466 bus->ctrl_frame_stat = false; 2460 bus->ctrl_frame_stat = false;
2467 brcmf_sdbrcm_wait_event_wakeup(bus); 2461 brcmf_sdbrcm_wait_event_wakeup(bus);
2468 } 2462 }
@@ -2475,17 +2469,10 @@ clkwait:
2475 txlimit -= framecnt; 2469 txlimit -= framecnt;
2476 } 2470 }
2477 2471
2478 /* Resched if events or tx frames are pending,
2479 else await next interrupt */
2480 /* On failed register access, all bets are off:
2481 no resched or interrupts */
2482 if ((bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN) || (err != 0)) { 2472 if ((bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN) || (err != 0)) {
2483 brcmf_dbg(ERROR, "failed backplane access over SDIO, halting operation\n"); 2473 brcmf_dbg(ERROR, "failed backplane access over SDIO, halting operation\n");
2484 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; 2474 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2485 bus->intstatus = 0; 2475 bus->intstatus = 0;
2486 } else if (bus->clkstate == CLK_PENDING) {
2487 brcmf_dbg(INFO, "rescheduled due to CLK_PENDING awaiting I_CHIPACTIVE interrupt\n");
2488 brcmf_sdbrcm_adddpctsk(bus);
2489 } else if (bus->intstatus || atomic_read(&bus->ipend) > 0 || 2476 } else if (bus->intstatus || atomic_read(&bus->ipend) > 0 ||
2490 (!bus->fcstate && brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) 2477 (!bus->fcstate && brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol)
2491 && data_ok(bus)) || PKT_AVAILABLE()) { 2478 && data_ok(bus)) || PKT_AVAILABLE()) {