diff options
author | Franky Lin <frankyl@broadcom.com> | 2012-09-13 15:12:01 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-09-24 14:59:08 -0400 |
commit | 03d5c360dcbcb62cfc45caaca163cce8e10f00d6 (patch) | |
tree | 010b9c600c9bb7cebabaa07274ef4bf5428f41a3 /drivers/net/wireless/brcm80211 | |
parent | f1e68c2e0a7af39907355e300dbbc76fcebc7fc8 (diff) |
brcmfmac: streamline SDIO dpc
Streamline SDIO dpc by removing some unnecessary code path.
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211')
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 27 |
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 | ||
2425 | clkwait: | ||
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()) { |