aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
diff options
context:
space:
mode:
authorFranky Lin <frankyl@broadcom.com>2012-11-05 19:22:23 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-11-14 14:55:55 -0500
commit7cdf57d34c017e5c4c48069ae46e7cb87979435a (patch)
treee40996930aefca64834b9b7481d7353fc17430ad /drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
parentdd43a01c5cdb811adeb09e6a2d2788f8aa0d0969 (diff)
brcmfmac: decrease the range of SDIO access lock
Semaphore sdsem which protects consecutive SDIO bus access is used to lock down unnecessary wide range. Decrease the locking range provides the capability of parallel processing. Signed-off-by: Franky Lin <frankyl@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c62
1 files changed, 34 insertions, 28 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index 1d7a3404696..e3288527aea 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -1274,6 +1274,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1274 * read directly into the chained packet, or allocate a large 1274 * read directly into the chained packet, or allocate a large
1275 * packet and and copy into the chain. 1275 * packet and and copy into the chain.
1276 */ 1276 */
1277 down(&bus->sdsem);
1277 if (usechain) { 1278 if (usechain) {
1278 errcode = brcmf_sdcard_recv_chain(bus->sdiodev, 1279 errcode = brcmf_sdcard_recv_chain(bus->sdiodev,
1279 bus->sdiodev->sbwad, 1280 bus->sdiodev->sbwad,
@@ -1295,6 +1296,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1295 dlen); 1296 dlen);
1296 errcode = -1; 1297 errcode = -1;
1297 } 1298 }
1299 up(&bus->sdsem);
1298 bus->sdcnt.f2rxdata++; 1300 bus->sdcnt.f2rxdata++;
1299 1301
1300 /* On failure, kill the superframe, allow a couple retries */ 1302 /* On failure, kill the superframe, allow a couple retries */
@@ -1399,11 +1401,8 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1399 pfirst->prev); 1401 pfirst->prev);
1400 } 1402 }
1401 /* sent any remaining packets up */ 1403 /* sent any remaining packets up */
1402 if (bus->glom.qlen) { 1404 if (bus->glom.qlen)
1403 up(&bus->sdsem);
1404 brcmf_rx_frame(bus->sdiodev->dev, ifidx, &bus->glom); 1405 brcmf_rx_frame(bus->sdiodev->dev, ifidx, &bus->glom);
1405 down(&bus->sdsem);
1406 }
1407 1406
1408 bus->sdcnt.rxglomframes++; 1407 bus->sdcnt.rxglomframes++;
1409 bus->sdcnt.rxglompkts += bus->glom.qlen; 1408 bus->sdcnt.rxglompkts += bus->glom.qlen;
@@ -1586,6 +1585,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1586 1585
1587 rd->len_left = rd->len; 1586 rd->len_left = rd->len;
1588 /* read header first for unknow frame length */ 1587 /* read header first for unknow frame length */
1588 down(&bus->sdsem);
1589 if (!rd->len) { 1589 if (!rd->len) {
1590 sdret = brcmf_sdcard_recv_buf(bus->sdiodev, 1590 sdret = brcmf_sdcard_recv_buf(bus->sdiodev,
1591 bus->sdiodev->sbwad, 1591 bus->sdiodev->sbwad,
@@ -1598,6 +1598,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1598 sdret); 1598 sdret);
1599 bus->sdcnt.rx_hdrfail++; 1599 bus->sdcnt.rx_hdrfail++;
1600 brcmf_sdbrcm_rxfail(bus, true, true); 1600 brcmf_sdbrcm_rxfail(bus, true, true);
1601 up(&bus->sdsem);
1601 continue; 1602 continue;
1602 } 1603 }
1603 1604
@@ -1607,6 +1608,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1607 1608
1608 if (!brcmf_sdio_hdparser(bus, bus->rxhdr, rd, 1609 if (!brcmf_sdio_hdparser(bus, bus->rxhdr, rd,
1609 BRCMF_SDIO_FT_NORMAL)) { 1610 BRCMF_SDIO_FT_NORMAL)) {
1611 up(&bus->sdsem);
1610 if (!bus->rxpending) 1612 if (!bus->rxpending)
1611 break; 1613 break;
1612 else 1614 else
@@ -1622,6 +1624,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1622 rd->len_nxtfrm = 0; 1624 rd->len_nxtfrm = 0;
1623 /* treat all packet as event if we don't know */ 1625 /* treat all packet as event if we don't know */
1624 rd->channel = SDPCM_EVENT_CHANNEL; 1626 rd->channel = SDPCM_EVENT_CHANNEL;
1627 up(&bus->sdsem);
1625 continue; 1628 continue;
1626 } 1629 }
1627 rd->len_left = rd->len > BRCMF_FIRSTREAD ? 1630 rd->len_left = rd->len > BRCMF_FIRSTREAD ?
@@ -1639,6 +1642,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1639 bus->sdiodev->bus_if->dstats.rx_dropped++; 1642 bus->sdiodev->bus_if->dstats.rx_dropped++;
1640 brcmf_sdbrcm_rxfail(bus, false, 1643 brcmf_sdbrcm_rxfail(bus, false,
1641 RETRYCHAN(rd->channel)); 1644 RETRYCHAN(rd->channel));
1645 up(&bus->sdsem);
1642 continue; 1646 continue;
1643 } 1647 }
1644 skb_pull(pkt, head_read); 1648 skb_pull(pkt, head_read);
@@ -1647,6 +1651,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1647 sdret = brcmf_sdcard_recv_pkt(bus->sdiodev, bus->sdiodev->sbwad, 1651 sdret = brcmf_sdcard_recv_pkt(bus->sdiodev, bus->sdiodev->sbwad,
1648 SDIO_FUNC_2, F2SYNC, pkt); 1652 SDIO_FUNC_2, F2SYNC, pkt);
1649 bus->sdcnt.f2rxdata++; 1653 bus->sdcnt.f2rxdata++;
1654 up(&bus->sdsem);
1650 1655
1651 if (sdret < 0) { 1656 if (sdret < 0) {
1652 brcmf_dbg(ERROR, "read %d bytes from channel %d failed: %d\n", 1657 brcmf_dbg(ERROR, "read %d bytes from channel %d failed: %d\n",
@@ -1749,10 +1754,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1749 continue; 1754 continue;
1750 } 1755 }
1751 1756
1752 /* Unlock during rx call */
1753 up(&bus->sdsem);
1754 brcmf_rx_packet(bus->sdiodev->dev, ifidx, pkt); 1757 brcmf_rx_packet(bus->sdiodev->dev, ifidx, pkt);
1755 down(&bus->sdsem);
1756 } 1758 }
1757 1759
1758 rxcount = maxframes - rxleft; 1760 rxcount = maxframes - rxleft;
@@ -1772,9 +1774,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1772static void 1774static void
1773brcmf_sdbrcm_wait_for_event(struct brcmf_sdio *bus, bool *lockvar) 1775brcmf_sdbrcm_wait_for_event(struct brcmf_sdio *bus, bool *lockvar)
1774{ 1776{
1775 up(&bus->sdsem);
1776 wait_event_interruptible_timeout(bus->ctrl_wait, !*lockvar, HZ * 2); 1777 wait_event_interruptible_timeout(bus->ctrl_wait, !*lockvar, HZ * 2);
1777 down(&bus->sdsem);
1778 return; 1778 return;
1779} 1779}
1780 1780
@@ -1879,6 +1879,7 @@ static int brcmf_sdbrcm_txpkt(struct brcmf_sdio *bus, struct sk_buff *pkt,
1879 if (len & (ALIGNMENT - 1)) 1879 if (len & (ALIGNMENT - 1))
1880 len = roundup(len, ALIGNMENT); 1880 len = roundup(len, ALIGNMENT);
1881 1881
1882 down(&bus->sdsem);
1882 ret = brcmf_sdcard_send_pkt(bus->sdiodev, bus->sdiodev->sbwad, 1883 ret = brcmf_sdcard_send_pkt(bus->sdiodev, bus->sdiodev->sbwad,
1883 SDIO_FUNC_2, F2SYNC, pkt); 1884 SDIO_FUNC_2, F2SYNC, pkt);
1884 bus->sdcnt.f2txdata++; 1885 bus->sdcnt.f2txdata++;
@@ -1906,15 +1907,14 @@ static int brcmf_sdbrcm_txpkt(struct brcmf_sdio *bus, struct sk_buff *pkt,
1906 } 1907 }
1907 1908
1908 } 1909 }
1910 up(&bus->sdsem);
1909 if (ret == 0) 1911 if (ret == 0)
1910 bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP; 1912 bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP;
1911 1913
1912done: 1914done:
1913 /* restore pkt buffer pointer before calling tx complete routine */ 1915 /* restore pkt buffer pointer before calling tx complete routine */
1914 skb_pull(pkt, SDPCM_HDRLEN + pad); 1916 skb_pull(pkt, SDPCM_HDRLEN + pad);
1915 up(&bus->sdsem);
1916 brcmf_txcomplete(bus->sdiodev->dev, pkt, ret != 0); 1917 brcmf_txcomplete(bus->sdiodev->dev, pkt, ret != 0);
1917 down(&bus->sdsem);
1918 1918
1919 if (free_pkt) 1919 if (free_pkt)
1920 brcmu_pkt_buf_free_skb(pkt); 1920 brcmu_pkt_buf_free_skb(pkt);
@@ -1955,9 +1955,11 @@ static uint brcmf_sdbrcm_sendfromq(struct brcmf_sdio *bus, uint maxframes)
1955 /* In poll mode, need to check for other events */ 1955 /* In poll mode, need to check for other events */
1956 if (!bus->intr && cnt) { 1956 if (!bus->intr && cnt) {
1957 /* Check device status, signal pending interrupt */ 1957 /* Check device status, signal pending interrupt */
1958 down(&bus->sdsem);
1958 ret = r_sdreg32(bus, &intstatus, 1959 ret = r_sdreg32(bus, &intstatus,
1959 offsetof(struct sdpcmd_regs, 1960 offsetof(struct sdpcmd_regs,
1960 intstatus)); 1961 intstatus));
1962 up(&bus->sdsem);
1961 bus->sdcnt.f2txdata++; 1963 bus->sdcnt.f2txdata++;
1962 if (ret != 0) 1964 if (ret != 0)
1963 break; 1965 break;
@@ -2028,6 +2030,7 @@ static void brcmf_sdbrcm_bus_stop(struct device *dev)
2028 2030
2029 /* Turn off the backplane clock (only) */ 2031 /* Turn off the backplane clock (only) */
2030 brcmf_sdbrcm_clkctl(bus, CLK_SDONLY, false); 2032 brcmf_sdbrcm_clkctl(bus, CLK_SDONLY, false);
2033 up(&bus->sdsem);
2031 2034
2032 /* Clear the data packet queues */ 2035 /* Clear the data packet queues */
2033 brcmu_pktq_flush(&bus->txq, true, NULL, NULL); 2036 brcmu_pktq_flush(&bus->txq, true, NULL, NULL);
@@ -2046,8 +2049,6 @@ static void brcmf_sdbrcm_bus_stop(struct device *dev)
2046 /* Reset some F2 state stuff */ 2049 /* Reset some F2 state stuff */
2047 bus->rxskip = false; 2050 bus->rxskip = false;
2048 bus->tx_seq = bus->rx_seq = 0; 2051 bus->tx_seq = bus->rx_seq = 0;
2049
2050 up(&bus->sdsem);
2051} 2052}
2052 2053
2053#ifdef CONFIG_BRCMFMAC_SDIO_OOB 2054#ifdef CONFIG_BRCMFMAC_SDIO_OOB
@@ -2216,6 +2217,8 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
2216 intstatus |= brcmf_sdbrcm_hostmail(bus); 2217 intstatus |= brcmf_sdbrcm_hostmail(bus);
2217 } 2218 }
2218 2219
2220 up(&bus->sdsem);
2221
2219 /* Generally don't ask for these, can get CRC errors... */ 2222 /* Generally don't ask for these, can get CRC errors... */
2220 if (intstatus & I_WR_OOSYNC) { 2223 if (intstatus & I_WR_OOSYNC) {
2221 brcmf_dbg(ERROR, "Dongle reports WR_OOSYNC\n"); 2224 brcmf_dbg(ERROR, "Dongle reports WR_OOSYNC\n");
@@ -2262,6 +2265,7 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
2262 (bus->clkstate == CLK_AVAIL)) { 2265 (bus->clkstate == CLK_AVAIL)) {
2263 int i; 2266 int i;
2264 2267
2268 down(&bus->sdsem);
2265 err = brcmf_sdcard_send_buf(bus->sdiodev, bus->sdiodev->sbwad, 2269 err = brcmf_sdcard_send_buf(bus->sdiodev, bus->sdiodev->sbwad,
2266 SDIO_FUNC_2, F2SYNC, bus->ctrl_frame_buf, 2270 SDIO_FUNC_2, F2SYNC, bus->ctrl_frame_buf,
2267 (u32) bus->ctrl_frame_len); 2271 (u32) bus->ctrl_frame_len);
@@ -2295,6 +2299,7 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
2295 } else { 2299 } else {
2296 bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP; 2300 bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP;
2297 } 2301 }
2302 up(&bus->sdsem);
2298 bus->ctrl_frame_stat = false; 2303 bus->ctrl_frame_stat = false;
2299 brcmf_sdbrcm_wait_event_wakeup(bus); 2304 brcmf_sdbrcm_wait_event_wakeup(bus);
2300 } 2305 }
@@ -2326,8 +2331,6 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
2326 bus->activity = false; 2331 bus->activity = false;
2327 brcmf_sdbrcm_clkctl(bus, CLK_NONE, false); 2332 brcmf_sdbrcm_clkctl(bus, CLK_NONE, false);
2328 } 2333 }
2329
2330 up(&bus->sdsem);
2331} 2334}
2332 2335
2333static int brcmf_sdbrcm_bus_txdata(struct device *dev, struct sk_buff *pkt) 2336static int brcmf_sdbrcm_bus_txdata(struct device *dev, struct sk_buff *pkt)
@@ -2618,11 +2621,10 @@ brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
2618 2621
2619 /* precondition: IS_ALIGNED((unsigned long)frame, 2) */ 2622 /* precondition: IS_ALIGNED((unsigned long)frame, 2) */
2620 2623
2621 /* Need to lock here to protect txseq and SDIO tx calls */
2622 down(&bus->sdsem);
2623
2624 /* Make sure backplane clock is on */ 2624 /* Make sure backplane clock is on */
2625 down(&bus->sdsem);
2625 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); 2626 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false);
2627 up(&bus->sdsem);
2626 2628
2627 /* Hardware tag: 2 byte len followed by 2 byte ~len check (all LE) */ 2629 /* Hardware tag: 2 byte len followed by 2 byte ~len check (all LE) */
2628 *(__le16 *) frame = cpu_to_le16((u16) msglen); 2630 *(__le16 *) frame = cpu_to_le16((u16) msglen);
@@ -2664,7 +2666,9 @@ brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
2664 frame, min_t(u16, len, 16), "TxHdr:\n"); 2666 frame, min_t(u16, len, 16), "TxHdr:\n");
2665 2667
2666 do { 2668 do {
2669 down(&bus->sdsem);
2667 ret = brcmf_tx_frame(bus, frame, len); 2670 ret = brcmf_tx_frame(bus, frame, len);
2671 up(&bus->sdsem);
2668 } while (ret < 0 && retries++ < TXRETRIES); 2672 } while (ret < 0 && retries++ < TXRETRIES);
2669 } 2673 }
2670 2674
@@ -2674,13 +2678,13 @@ brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
2674 spin_unlock_irqrestore(&bus->dpc_tl_lock, flags); 2678 spin_unlock_irqrestore(&bus->dpc_tl_lock, flags);
2675 2679
2676 bus->activity = false; 2680 bus->activity = false;
2681 down(&bus->sdsem);
2677 brcmf_sdbrcm_clkctl(bus, CLK_NONE, true); 2682 brcmf_sdbrcm_clkctl(bus, CLK_NONE, true);
2683 up(&bus->sdsem);
2678 } else { 2684 } else {
2679 spin_unlock_irqrestore(&bus->dpc_tl_lock, flags); 2685 spin_unlock_irqrestore(&bus->dpc_tl_lock, flags);
2680 } 2686 }
2681 2687
2682 up(&bus->sdsem);
2683
2684 if (ret) 2688 if (ret)
2685 bus->sdcnt.tx_ctlerrs++; 2689 bus->sdcnt.tx_ctlerrs++;
2686 else 2690 else
@@ -2710,8 +2714,10 @@ static int brcmf_sdio_readshared(struct brcmf_sdio *bus,
2710 * Read last word in socram to determine 2714 * Read last word in socram to determine
2711 * address of sdpcm_shared structure 2715 * address of sdpcm_shared structure
2712 */ 2716 */
2717 down(&bus->sdsem);
2713 rv = brcmf_sdbrcm_membytes(bus, false, shaddr, 2718 rv = brcmf_sdbrcm_membytes(bus, false, shaddr,
2714 (u8 *)&addr_le, 4); 2719 (u8 *)&addr_le, 4);
2720 up(&bus->sdsem);
2715 if (rv < 0) 2721 if (rv < 0)
2716 return rv; 2722 return rv;
2717 2723
@@ -2834,12 +2840,14 @@ static int brcmf_sdio_trap_info(struct brcmf_sdio *bus, struct sdpcm_shared *sh,
2834 if ((sh->flags & SDPCM_SHARED_TRAP) == 0) 2840 if ((sh->flags & SDPCM_SHARED_TRAP) == 0)
2835 return 0; 2841 return 0;
2836 2842
2843 down(&bus->sdsem);
2837 error = brcmf_sdbrcm_membytes(bus, false, sh->trap_addr, (u8 *)&tr, 2844 error = brcmf_sdbrcm_membytes(bus, false, sh->trap_addr, (u8 *)&tr,
2838 sizeof(struct brcmf_trap_info)); 2845 sizeof(struct brcmf_trap_info));
2839 if (error < 0) 2846 if (error < 0)
2840 return error; 2847 return error;
2841 2848
2842 nbytes = brcmf_sdio_dump_console(bus, sh, data, count); 2849 nbytes = brcmf_sdio_dump_console(bus, sh, data, count);
2850 up(&bus->sdsem);
2843 if (nbytes < 0) 2851 if (nbytes < 0)
2844 return nbytes; 2852 return nbytes;
2845 2853
@@ -2885,6 +2893,7 @@ static int brcmf_sdio_assert_info(struct brcmf_sdio *bus,
2885 return 0; 2893 return 0;
2886 } 2894 }
2887 2895
2896 down(&bus->sdsem);
2888 if (sh->assert_file_addr != 0) { 2897 if (sh->assert_file_addr != 0) {
2889 error = brcmf_sdbrcm_membytes(bus, false, sh->assert_file_addr, 2898 error = brcmf_sdbrcm_membytes(bus, false, sh->assert_file_addr,
2890 (u8 *)file, 80); 2899 (u8 *)file, 80);
@@ -2897,6 +2906,7 @@ static int brcmf_sdio_assert_info(struct brcmf_sdio *bus,
2897 if (error < 0) 2906 if (error < 0)
2898 return error; 2907 return error;
2899 } 2908 }
2909 up(&bus->sdsem);
2900 2910
2901 res = scnprintf(buf, sizeof(buf), 2911 res = scnprintf(buf, sizeof(buf),
2902 "dongle assert: %s:%d: assert(%s)\n", 2912 "dongle assert: %s:%d: assert(%s)\n",
@@ -2909,9 +2919,7 @@ static int brcmf_sdbrcm_checkdied(struct brcmf_sdio *bus)
2909 int error; 2919 int error;
2910 struct sdpcm_shared sh; 2920 struct sdpcm_shared sh;
2911 2921
2912 down(&bus->sdsem);
2913 error = brcmf_sdio_readshared(bus, &sh); 2922 error = brcmf_sdio_readshared(bus, &sh);
2914 up(&bus->sdsem);
2915 2923
2916 if (error < 0) 2924 if (error < 0)
2917 return error; 2925 return error;
@@ -2938,7 +2946,6 @@ static int brcmf_sdbrcm_died_dump(struct brcmf_sdio *bus, char __user *data,
2938 if (pos != 0) 2946 if (pos != 0)
2939 return 0; 2947 return 0;
2940 2948
2941 down(&bus->sdsem);
2942 error = brcmf_sdio_readshared(bus, &sh); 2949 error = brcmf_sdio_readshared(bus, &sh);
2943 if (error < 0) 2950 if (error < 0)
2944 goto done; 2951 goto done;
@@ -2955,7 +2962,6 @@ static int brcmf_sdbrcm_died_dump(struct brcmf_sdio *bus, char __user *data,
2955 error += nbytes; 2962 error += nbytes;
2956 *ppos += error; 2963 *ppos += error;
2957done: 2964done:
2958 up(&bus->sdsem);
2959 return error; 2965 return error;
2960} 2966}
2961 2967
@@ -3511,8 +3517,6 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus)
3511 3517
3512 brcmf_dbg(TIMER, "Enter\n"); 3518 brcmf_dbg(TIMER, "Enter\n");
3513 3519
3514 down(&bus->sdsem);
3515
3516 /* Poll period: check device if appropriate. */ 3520 /* Poll period: check device if appropriate. */
3517 if (bus->poll && (++bus->polltick >= bus->pollrate)) { 3521 if (bus->poll && (++bus->polltick >= bus->pollrate)) {
3518 u32 intstatus = 0; 3522 u32 intstatus = 0;
@@ -3561,11 +3565,13 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus)
3561 bus->console.count += BRCMF_WD_POLL_MS; 3565 bus->console.count += BRCMF_WD_POLL_MS;
3562 if (bus->console.count >= bus->console_interval) { 3566 if (bus->console.count >= bus->console_interval) {
3563 bus->console.count -= bus->console_interval; 3567 bus->console.count -= bus->console_interval;
3568 down(&bus->sdsem);
3564 /* Make sure backplane clock is on */ 3569 /* Make sure backplane clock is on */
3565 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); 3570 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false);
3566 if (brcmf_sdbrcm_readconsole(bus) < 0) 3571 if (brcmf_sdbrcm_readconsole(bus) < 0)
3567 /* stop on error */ 3572 /* stop on error */
3568 bus->console_interval = 0; 3573 bus->console_interval = 0;
3574 up(&bus->sdsem);
3569 } 3575 }
3570 } 3576 }
3571#endif /* DEBUG */ 3577#endif /* DEBUG */
@@ -3578,13 +3584,13 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus)
3578 bus->activity = false; 3584 bus->activity = false;
3579 brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS); 3585 brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS);
3580 } else { 3586 } else {
3587 down(&bus->sdsem);
3581 brcmf_sdbrcm_clkctl(bus, CLK_NONE, false); 3588 brcmf_sdbrcm_clkctl(bus, CLK_NONE, false);
3589 up(&bus->sdsem);
3582 } 3590 }
3583 } 3591 }
3584 } 3592 }
3585 3593
3586 up(&bus->sdsem);
3587
3588 return (atomic_read(&bus->ipend) > 0); 3594 return (atomic_read(&bus->ipend) > 0);
3589} 3595}
3590 3596