Lines Matching refs:bus

112 #include "bus.h"
147 * sdio bus power cycle to clear (rev 9) */
389 /* dongle SDIO bus specific header info */
436 /* Private data for SDIO bus interaction */
494 s32 idleclock; /* How to set bus driver when idle */
504 spinlock_t txq_lock; /* protect bus->txq */
523 u8 tx_hdrlen; /* sdio bus header length for tx packet */
677 static bool data_ok(struct brcmf_sdio *bus)
682 if (bus->ctrl_frame_stat)
685 return (bus->tx_max - bus->tx_seq - tx_rsv) != 0 &&
686 ((bus->tx_max - bus->tx_seq - tx_rsv) & 0x80) == 0;
691 static bool txctl_ok(struct brcmf_sdio *bus)
693 return (bus->tx_max - bus->tx_seq) != 0 &&
694 ((bus->tx_max - bus->tx_seq) & 0x80) == 0;
698 brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool on)
707 sdio_retune_crc_disable(bus->sdiodev->func1);
711 sdio_retune_hold_now(bus->sdiodev->func1);
715 brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, wr_val, &err);
722 if (!on && bus->ci->chip == CY_CC_43012_CHIP_ID)
749 rd_val = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
761 brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, wr_val,
774 sdio_retune_release(bus->sdiodev->func1);
776 sdio_retune_crc_enable(bus->sdiodev->func1);
784 static int brcmf_sdio_htclk(struct brcmf_sdio *bus, bool on, bool pendok)
794 if (bus->sr_enabled) {
795 bus->clkstate = (on ? CLK_AVAIL : CLK_SDONLY);
802 bus->alp_only ? SBSDIO_ALP_AVAIL_REQ : SBSDIO_HT_AVAIL_REQ;
804 brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
812 clkctl = brcmf_sdiod_readb(bus->sdiodev,
820 if (!SBSDIO_CLKAV(clkctl, bus->alp_only) && pendok) {
822 devctl = brcmf_sdiod_readb(bus->sdiodev,
830 brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_DEVICE_CTL,
833 bus->clkstate = CLK_PENDING;
836 } else if (bus->clkstate == CLK_PENDING) {
838 devctl = brcmf_sdiod_readb(bus->sdiodev,
841 brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_DEVICE_CTL,
848 while (!SBSDIO_CLKAV(clkctl, bus->alp_only)) {
849 clkctl = brcmf_sdiod_readb(bus->sdiodev,
861 if (!SBSDIO_CLKAV(clkctl, bus->alp_only)) {
868 bus->clkstate = CLK_AVAIL;
872 if (!bus->alp_only) {
881 if (bus->clkstate == CLK_PENDING) {
883 devctl = brcmf_sdiod_readb(bus->sdiodev,
886 brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_DEVICE_CTL,
890 bus->clkstate = CLK_SDONLY;
891 brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
904 static int brcmf_sdio_sdclk(struct brcmf_sdio *bus, bool on)
909 bus->clkstate = CLK_SDONLY;
911 bus->clkstate = CLK_NONE;
917 static int brcmf_sdio_clkctl(struct brcmf_sdio *bus, uint target, bool pendok)
920 uint oldstate = bus->clkstate;
926 if (bus->clkstate == target)
932 if (bus->clkstate == CLK_NONE)
933 brcmf_sdio_sdclk(bus, true);
935 brcmf_sdio_htclk(bus, true, pendok);
940 if (bus->clkstate == CLK_NONE)
941 brcmf_sdio_sdclk(bus, true);
942 else if (bus->clkstate == CLK_AVAIL)
943 brcmf_sdio_htclk(bus, false, false);
946 bus->clkstate, target);
951 if (bus->clkstate == CLK_AVAIL)
952 brcmf_sdio_htclk(bus, false, false);
954 brcmf_sdio_sdclk(bus, false);
958 brcmf_dbg(SDIO, "%d -> %d\n", oldstate, bus->clkstate);
965 brcmf_sdio_bus_sleep(struct brcmf_sdio *bus, bool sleep, bool pendok)
972 (bus->sleeping ? "SLEEP" : "WAKE"));
974 /* If SR is enabled control bus state with KSO */
975 if (bus->sr_enabled) {
977 if (sleep == bus->sleeping)
982 clkcsr = brcmf_sdiod_readb(bus->sdiodev,
987 brcmf_sdiod_writeb(bus->sdiodev,
991 err = brcmf_sdio_kso_control(bus, false);
993 err = brcmf_sdio_kso_control(bus, true);
996 brcmf_err("error while changing bus sleep state %d\n",
1005 if (!bus->sr_enabled)
1006 brcmf_sdio_clkctl(bus, CLK_NONE, pendok);
1008 brcmf_sdio_clkctl(bus, CLK_AVAIL, pendok);
1009 brcmf_sdio_wd_timer(bus, true);
1011 bus->sleeping = sleep;
1026 static int brcmf_sdio_readshared(struct brcmf_sdio *bus,
1035 sdio_claim_host(bus->sdiodev->func1);
1036 brcmf_sdio_bus_sleep(bus, false, false);
1042 shaddr = bus->ci->rambase + bus->ci->ramsize - 4;
1043 if (!bus->ci->rambase && brcmf_chip_sr_capable(bus->ci))
1044 shaddr -= bus->ci->srsize;
1045 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, shaddr,
1064 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (u8 *)&sh_le,
1069 sdio_release_host(bus->sdiodev->func1);
1091 sdio_release_host(bus->sdiodev->func1);
1095 static void brcmf_sdio_get_console_addr(struct brcmf_sdio *bus)
1099 if (brcmf_sdio_readshared(bus, &sh) == 0)
1100 bus->console_addr = sh.console_addr;
1103 static void brcmf_sdio_get_console_addr(struct brcmf_sdio *bus)
1108 static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus)
1110 struct brcmf_sdio_dev *sdiod = bus->sdiodev;
1111 struct brcmf_core *core = bus->sdio_core;
1128 bus->sdcnt.f1regdata += 2;
1139 bus->rx_seq);
1140 if (!bus->rxskip)
1143 bus->rxskip = false;
1151 bus->sdpcm_ver =
1154 if (bus->sdpcm_ver != SDPCM_PROT_VERSION)
1157 bus->sdpcm_ver, SDPCM_PROT_VERSION);
1160 bus->sdpcm_ver);
1166 brcmf_sdio_get_console_addr(bus);
1178 if (fcbits & ~bus->flowcontrol)
1179 bus->sdcnt.fc_xoff++;
1181 if (bus->flowcontrol & ~fcbits)
1182 bus->sdcnt.fc_xon++;
1184 bus->sdcnt.fc_rcvd++;
1185 bus->flowcontrol = fcbits;
1201 static void brcmf_sdio_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx)
1203 struct brcmf_sdio_dev *sdiod = bus->sdiodev;
1204 struct brcmf_core *core = bus->sdio_core;
1215 brcmf_sdiod_abort(bus->sdiodev, bus->sdiodev->func2);
1217 brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, SFC_RF_TERM,
1219 bus->sdcnt.f1regdata++;
1223 hi = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_RFRAMEBCHI,
1225 lo = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_RFRAMEBCLO,
1227 bus->sdcnt.f1regdata += 2;
1245 bus->sdcnt.rxrtx++;
1249 bus->sdcnt.f1regdata++;
1251 bus->rxskip = true;
1255 bus->cur_read.len = 0;
1258 static void brcmf_sdio_txfail(struct brcmf_sdio *bus)
1260 struct brcmf_sdio_dev *sdiodev = bus->sdiodev;
1265 bus->sdcnt.tx_sderrs++;
1269 bus->sdcnt.f1regdata++;
1274 bus->sdcnt.f1regdata += 2;
1281 static uint brcmf_sdio_glom_len(struct brcmf_sdio *bus)
1287 skb_queue_walk(&bus->glom, p)
1292 static void brcmf_sdio_free_glom(struct brcmf_sdio *bus)
1296 skb_queue_walk_safe(&bus->glom, cur, next) {
1297 skb_unlink(cur, &bus->glom);
1303 * brcmfmac sdio bus specific header
1370 static int brcmf_sdio_hdparse(struct brcmf_sdio *bus, u8 *header,
1385 bus->rxpending = false;
1390 bus->sdcnt.rx_badhdr++;
1391 brcmf_sdio_rxfail(bus, false, false);
1399 (roundup(len, bus->blocksize) != rd->len)) {
1422 bus->sdcnt.rx_toolong++;
1423 brcmf_sdio_rxfail(bus, false, false);
1441 bus->sdcnt.rx_badhdr++;
1442 brcmf_sdio_rxfail(bus, false, false);
1448 bus->sdcnt.rx_badseq++;
1463 if (bus->flowcontrol != fc) {
1464 if (~bus->flowcontrol & fc)
1465 bus->sdcnt.fc_xoff++;
1466 if (bus->flowcontrol & ~fc)
1467 bus->sdcnt.fc_xon++;
1468 bus->sdcnt.fc_rcvd++;
1469 bus->flowcontrol = fc;
1472 if ((u8)(tx_seq_max - bus->tx_seq) > 0x40) {
1474 tx_seq_max = bus->tx_seq + 2;
1476 bus->tx_max = tx_seq_max;
1487 static void brcmf_sdio_hdpack(struct brcmf_sdio *bus, u8 *header,
1496 if (bus->txglom) {
1511 trace_brcmf_sdpcm_hdr(SDPCM_TX + !!(bus->txglom), header);
1514 static u8 brcmf_sdio_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1530 bus->glomd, skb_peek(&bus->glom));
1533 if (bus->glomd) {
1535 dlen = (u16) (bus->glomd->len);
1536 dptr = bus->glomd->data;
1555 if (sublen % bus->sgentry_align) {
1557 sublen, bus->sgentry_align);
1565 (roundup(totlen, bus->blocksize) - totlen);
1566 totlen = roundup(totlen, bus->blocksize);
1570 pnext = brcmu_pkt_buf_get_skb(sublen + bus->sgentry_align);
1576 skb_queue_tail(&bus->glom, pnext);
1579 pkt_align(pnext, sublen, bus->sgentry_align);
1583 in bus structure */
1587 if (BRCMF_GLOM_ON() && bus->cur_read.len &&
1588 totlen != bus->cur_read.len) {
1590 bus->cur_read.len, totlen, rxseq);
1594 brcmf_sdio_free_glom(bus);
1599 brcmu_pkt_buf_free_skb(bus->glomd);
1600 bus->glomd = NULL;
1601 bus->cur_read.len = 0;
1606 if (!skb_queue_empty(&bus->glom)) {
1609 skb_queue_walk(&bus->glom, pnext) {
1616 pfirst = skb_peek(&bus->glom);
1617 dlen = (u16) brcmf_sdio_glom_len(bus);
1623 sdio_claim_host(bus->sdiodev->func1);
1624 errcode = brcmf_sdiod_recv_chain(bus->sdiodev,
1625 &bus->glom, dlen);
1626 sdio_release_host(bus->sdiodev->func1);
1627 bus->sdcnt.f2rxdata++;
1634 sdio_claim_host(bus->sdiodev->func1);
1635 brcmf_sdio_rxfail(bus, true, false);
1636 bus->sdcnt.rxglomfail++;
1637 brcmf_sdio_free_glom(bus);
1638 sdio_release_host(bus->sdiodev->func1);
1648 sdio_claim_host(bus->sdiodev->func1);
1649 errcode = brcmf_sdio_hdparse(bus, pfirst->data, &rd_new,
1651 sdio_release_host(bus->sdiodev->func1);
1652 bus->cur_read.len = rd_new.len_nxtfrm << 4;
1659 skb_queue_walk(&bus->glom, pnext) {
1666 sdio_claim_host(bus->sdiodev->func1);
1667 errcode = brcmf_sdio_hdparse(bus, pnext->data, &rd_new,
1669 sdio_release_host(bus->sdiodev->func1);
1678 sdio_claim_host(bus->sdiodev->func1);
1679 brcmf_sdio_rxfail(bus, true, false);
1680 bus->sdcnt.rxglomfail++;
1681 brcmf_sdio_free_glom(bus);
1682 sdio_release_host(bus->sdiodev->func1);
1683 bus->cur_read.len = 0;
1689 skb_queue_walk_safe(&bus->glom, pfirst, pnext) {
1702 skb_unlink(pfirst, &bus->glom);
1711 bus->glom.qlen, pfirst, pfirst->data,
1714 skb_unlink(pfirst, &bus->glom);
1716 brcmf_rx_event(bus->sdiodev->dev, pfirst);
1718 brcmf_rx_frame(bus->sdiodev->dev, pfirst,
1720 bus->sdcnt.rxglompkts++;
1723 bus->sdcnt.rxglomframes++;
1728 static int brcmf_sdio_dcmd_resp_wait(struct brcmf_sdio *bus, uint *condition,
1735 add_wait_queue(&bus->dcmd_resp_wait, &wait);
1745 remove_wait_queue(&bus->dcmd_resp_wait, &wait);
1750 static int brcmf_sdio_dcmd_resp_wake(struct brcmf_sdio *bus)
1752 wake_up_interruptible(&bus->dcmd_resp_wait);
1757 brcmf_sdio_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff)
1764 if (bus->rxblen)
1765 buf = vzalloc(bus->rxblen);
1769 rbuf = bus->rxbuf;
1770 pad = ((unsigned long)rbuf % bus->head_align);
1772 rbuf += (bus->head_align - pad);
1781 if (bus->roundup && bus->blocksize && (rdlen > bus->blocksize)) {
1782 pad = bus->blocksize - (rdlen % bus->blocksize);
1783 if ((pad <= bus->roundup) && (pad < bus->blocksize) &&
1784 ((len + pad) < bus->sdiodev->bus_if->maxctl))
1786 } else if (rdlen % bus->head_align) {
1787 rdlen += bus->head_align - (rdlen % bus->head_align);
1791 if ((rdlen + BRCMF_FIRSTREAD) > bus->sdiodev->bus_if->maxctl) {
1793 rdlen, bus->sdiodev->bus_if->maxctl);
1794 brcmf_sdio_rxfail(bus, false, false);
1798 if ((len - doff) > bus->sdiodev->bus_if->maxctl) {
1800 len, len - doff, bus->sdiodev->bus_if->maxctl);
1801 bus->sdcnt.rx_toolong++;
1802 brcmf_sdio_rxfail(bus, false, false);
1807 sdret = brcmf_sdiod_recv_buf(bus->sdiodev, rbuf, rdlen);
1808 bus->sdcnt.f2rxdata++;
1814 bus->sdcnt.rxc_errors++;
1815 brcmf_sdio_rxfail(bus, true, true);
1826 spin_lock_bh(&bus->rxctl_lock);
1827 if (bus->rxctl) {
1829 spin_unlock_bh(&bus->rxctl_lock);
1833 bus->rxctl = buf + doff;
1834 bus->rxctl_orig = buf;
1835 bus->rxlen = len - doff;
1836 spin_unlock_bh(&bus->rxctl_lock);
1840 brcmf_sdio_dcmd_resp_wake(bus);
1844 static void brcmf_sdio_pad(struct brcmf_sdio *bus, u16 *pad, u16 *rdlen)
1846 if (bus->roundup && bus->blocksize && *rdlen > bus->blocksize) {
1847 *pad = bus->blocksize - (*rdlen % bus->blocksize);
1848 if (*pad <= bus->roundup && *pad < bus->blocksize &&
1851 } else if (*rdlen % bus->head_align) {
1852 *rdlen += bus->head_align - (*rdlen % bus->head_align);
1856 static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1863 struct brcmf_sdio_hdrinfo *rd = &bus->cur_read, rd_new;
1869 bus->rxpending = true;
1871 for (rd->seq_num = bus->rx_seq, rxleft = maxframes;
1872 !bus->rxskip && rxleft && bus->sdiodev->state == BRCMF_SDIOD_DATA;
1876 if (bus->glomd || !skb_queue_empty(&bus->glom)) {
1879 bus->glomd, skb_peek(&bus->glom));
1880 cnt = brcmf_sdio_rxglom(bus, rd->seq_num);
1889 sdio_claim_host(bus->sdiodev->func1);
1891 ret = brcmf_sdiod_recv_buf(bus->sdiodev,
1892 bus->rxhdr, BRCMF_FIRSTREAD);
1893 bus->sdcnt.f2rxhdrs++;
1897 bus->sdcnt.rx_hdrfail++;
1898 brcmf_sdio_rxfail(bus, true, true);
1899 sdio_release_host(bus->sdiodev->func1);
1904 bus->rxhdr, SDPCM_HDRLEN,
1907 if (brcmf_sdio_hdparse(bus, bus->rxhdr, rd,
1909 sdio_release_host(bus->sdiodev->func1);
1910 if (!bus->rxpending)
1917 brcmf_sdio_read_control(bus, bus->rxhdr,
1925 sdio_release_host(bus->sdiodev->func1);
1933 brcmf_sdio_pad(bus, &pad, &rd->len_left);
1936 bus->head_align);
1940 brcmf_sdio_rxfail(bus, false,
1942 sdio_release_host(bus->sdiodev->func1);
1946 pkt_align(pkt, rd->len_left, bus->head_align);
1948 ret = brcmf_sdiod_recv_pkt(bus->sdiodev, pkt);
1949 bus->sdcnt.f2rxdata++;
1950 sdio_release_host(bus->sdiodev->func1);
1956 sdio_claim_host(bus->sdiodev->func1);
1957 brcmf_sdio_rxfail(bus, true,
1959 sdio_release_host(bus->sdiodev->func1);
1965 memcpy(pkt->data, bus->rxhdr, head_read);
1968 memcpy(bus->rxhdr, pkt->data, SDPCM_HDRLEN);
1970 sdio_claim_host(bus->sdiodev->func1);
1971 if (brcmf_sdio_hdparse(bus, bus->rxhdr, &rd_new,
1974 brcmf_sdio_rxfail(bus, true, true);
1975 sdio_release_host(bus->sdiodev->func1);
1979 bus->sdcnt.rx_readahead_cnt++;
1985 brcmf_sdio_rxfail(bus, true, true);
1986 sdio_release_host(bus->sdiodev->func1);
1990 sdio_release_host(bus->sdiodev->func1);
1998 bus->rxhdr, SDPCM_HDRLEN,
2006 sdio_claim_host(bus->sdiodev->func1);
2007 brcmf_sdio_rxfail(bus, false, true);
2008 sdio_release_host(bus->sdiodev->func1);
2019 if (SDPCM_GLOMDESC(&bus->rxhdr[SDPCM_HWHDR_LEN])) {
2027 bus->glomd = pkt;
2031 sdio_claim_host(bus->sdiodev->func1);
2032 brcmf_sdio_rxfail(bus, false, false);
2033 sdio_release_host(bus->sdiodev->func1);
2050 brcmf_rx_event(bus->sdiodev->dev, pkt);
2052 brcmf_rx_frame(bus->sdiodev->dev, pkt,
2069 if (bus->rxskip)
2071 bus->rx_seq = rd->seq_num;
2077 brcmf_sdio_wait_event_wakeup(struct brcmf_sdio *bus)
2079 wake_up_interruptible(&bus->ctrl_wait);
2083 static int brcmf_sdio_txpkt_hdalign(struct brcmf_sdio *bus, struct sk_buff *pkt)
2092 head_pad = ((unsigned long)dat_buf % bus->head_align);
2095 stats = &bus->sdiodev->bus_if->stats;
2106 memset(dat_buf, 0, head_pad + bus->tx_hdrlen);
2112 * bus layer usage.
2119 static int brcmf_sdio_txpkt_prep_sg(struct brcmf_sdio *bus,
2130 sdiodev = bus->sdiodev;
2133 WARN_ON(blksize % bus->sgentry_align);
2138 tail_chop = pkt->len % bus->sgentry_align;
2140 tail_pad = bus->sgentry_align - tail_chop;
2146 bus->head_align);
2149 ret = brcmf_sdio_txpkt_hdalign(bus, pkt_pad);
2177 * @bus: brcmf_sdio structure pointer
2188 brcmf_sdio_txpkt_prep(struct brcmf_sdio *bus, struct sk_buff_head *pktq,
2197 txseq = bus->tx_seq;
2209 ret = brcmf_sdio_txpkt_hdalign(bus, pkt_next);
2214 memset(pkt_next->data + bus->tx_hdrlen, 0, head_pad);
2220 if (bus->txglom && pktq->qlen > 1) {
2221 ret = brcmf_sdio_txpkt_prep_sg(bus, pktq,
2230 hd_info.dat_offset = head_pad + bus->tx_hdrlen;
2234 brcmf_sdio_hdpack(bus, pkt_next->data, &hd_info);
2243 head_pad + bus->tx_hdrlen,
2249 if (bus->txglom)
2256 * @bus: brcmf_sdio structure pointer
2264 brcmf_sdio_txpkt_postp(struct brcmf_sdio *bus, struct sk_buff_head *pktq)
2283 hdr = pkt_next->data + bus->tx_hdrlen - SDPCM_SWHDR_LEN;
2288 if (bus->txglom) {
2298 static int brcmf_sdio_txpkt(struct brcmf_sdio *bus, struct sk_buff_head *pktq,
2306 ret = brcmf_sdio_txpkt_prep(bus, pktq, chan);
2310 sdio_claim_host(bus->sdiodev->func1);
2311 ret = brcmf_sdiod_send_pkt(bus->sdiodev, pktq);
2312 bus->sdcnt.f2txdata++;
2315 brcmf_sdio_txfail(bus);
2317 sdio_release_host(bus->sdiodev->func1);
2320 brcmf_sdio_txpkt_postp(bus, pktq);
2322 bus->tx_seq = (bus->tx_seq + pktq->qlen) % SDPCM_SEQ_WRAP;
2325 brcmf_proto_bcdc_txcomplete(bus->sdiodev->dev, pkt_next,
2331 static uint brcmf_sdio_sendfromq(struct brcmf_sdio *bus, uint maxframes)
2335 u32 intstat_addr = bus->sdio_core->base + SD_REG(intstatus);
2343 tx_prec_map = ~bus->flowcontrol;
2346 for (cnt = 0; (cnt < maxframes) && data_ok(bus);) {
2348 if (bus->txglom)
2349 pkt_num = min_t(u8, bus->tx_max - bus->tx_seq,
2350 bus->sdiodev->txglomsz);
2352 brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol));
2354 spin_lock_bh(&bus->txq_lock);
2356 pkt = brcmu_pktq_mdeq(&bus->txq, tx_prec_map,
2362 spin_unlock_bh(&bus->txq_lock);
2366 ret = brcmf_sdio_txpkt(bus, &pktq, SDPCM_DATA_CHANNEL);
2371 if (!bus->intr) {
2373 sdio_claim_host(bus->sdiodev->func1);
2374 intstatus = brcmf_sdiod_readl(bus->sdiodev,
2376 sdio_release_host(bus->sdiodev->func1);
2378 bus->sdcnt.f2txdata++;
2381 if (intstatus & bus->hostintmask)
2382 atomic_set(&bus->ipend, 1);
2387 if ((bus->sdiodev->state == BRCMF_SDIOD_DATA) &&
2388 bus->txoff && (pktq_len(&bus->txq) < TXLOW)) {
2389 bus->txoff = false;
2390 brcmf_proto_bcdc_txflowblock(bus->sdiodev->dev, false);
2396 static int brcmf_sdio_tx_ctrlframe(struct brcmf_sdio *bus, u8 *frame, u16 len)
2406 /* Back the pointer to make room for bus header */
2407 frame -= bus->tx_hdrlen;
2408 len += bus->tx_hdrlen;
2411 doff = ((unsigned long)frame % bus->head_align);
2415 memset(frame + bus->tx_hdrlen, 0, doff);
2420 if (bus->roundup && bus->blocksize && (len > bus->blocksize)) {
2421 pad = bus->blocksize - (len % bus->blocksize);
2422 if ((pad > bus->roundup) || (pad >= bus->blocksize))
2424 } else if (len % bus->head_align) {
2425 pad = bus->head_align - (len % bus->head_align);
2431 hd_info.dat_offset = doff + bus->tx_hdrlen;
2432 hd_info.seq_num = bus->tx_seq;
2435 brcmf_sdio_hdpack(bus, frame, &hd_info);
2437 if (bus->txglom)
2447 ret = brcmf_sdiod_send_buf(bus->sdiodev, frame, len);
2450 brcmf_sdio_txfail(bus);
2452 bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQ_WRAP;
2470 struct brcmf_sdio *bus = sdiodev->bus;
2471 struct brcmf_core *core = bus->sdio_core;
2478 if (bus->watchdog_tsk) {
2479 send_sig(SIGTERM, bus->watchdog_tsk, 1);
2480 kthread_stop(bus->watchdog_tsk);
2481 bus->watchdog_tsk = NULL;
2488 brcmf_sdio_bus_sleep(bus, false, false);
2494 local_hostintmask = bus->hostintmask;
2495 bus->hostintmask = 0;
2502 bpreq |= brcmf_chip_is_ulp(bus->ci) ?
2512 /* Turn off the bus (F2), free any pending packets */
2523 brcmu_pktq_flush(&bus->txq, true, NULL, NULL);
2526 brcmu_pkt_buf_free_skb(bus->glomd);
2527 brcmf_sdio_free_glom(bus);
2530 spin_lock_bh(&bus->rxctl_lock);
2531 bus->rxlen = 0;
2532 spin_unlock_bh(&bus->rxctl_lock);
2533 brcmf_sdio_dcmd_resp_wake(bus);
2536 bus->rxskip = false;
2537 bus->tx_seq = bus->rx_seq = 0;
2540 static inline void brcmf_sdio_clrintr(struct brcmf_sdio *bus)
2545 sdiodev = bus->sdiodev;
2548 if (!sdiodev->irq_en && !atomic_read(&bus->ipend)) {
2549 enable_irq(sdiodev->settings->bus.sdio.oob_irq_nr);
2556 static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus)
2558 struct brcmf_core *core = bus->sdio_core;
2565 val = brcmf_sdiod_readl(bus->sdiodev, addr, &ret);
2566 bus->sdcnt.f1regdata++;
2570 val &= bus->hostintmask;
2571 atomic_set(&bus->fcstate, !!(val & I_HMB_FC_STATE));
2575 brcmf_sdiod_writel(bus->sdiodev, addr, val, &ret);
2576 bus->sdcnt.f1regdata++;
2577 atomic_or(val, &bus->intstatus);
2583 static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
2585 struct brcmf_sdio_dev *sdiod = bus->sdiodev;
2587 u32 intstat_addr = bus->sdio_core->base + SD_REG(intstatus);
2589 uint txlimit = bus->txbound; /* Tx frames to send before resched */
2595 sdio_claim_host(bus->sdiodev->func1);
2598 if (!bus->sr_enabled && bus->clkstate == CLK_PENDING) {
2603 devctl = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_DEVICE_CTL,
2608 clkctl = brcmf_sdiod_readb(bus->sdiodev,
2615 devctl = brcmf_sdiod_readb(bus->sdiodev,
2618 brcmf_sdiod_writeb(bus->sdiodev,
2620 bus->clkstate = CLK_AVAIL;
2625 brcmf_sdio_bus_sleep(bus, false, true);
2628 if (atomic_read(&bus->ipend) > 0) {
2629 atomic_set(&bus->ipend, 0);
2630 err = brcmf_sdio_intr_rstatus(bus);
2634 intstatus = atomic_xchg(&bus->intstatus, 0);
2646 bus->sdcnt.f1regdata += 2;
2647 atomic_set(&bus->fcstate,
2649 intstatus |= (newstatus & bus->hostintmask);
2655 intstatus |= brcmf_sdio_hostmail(bus);
2658 sdio_release_host(bus->sdiodev->func1);
2683 if (bus->rxskip)
2687 if ((intstatus & I_HMB_FRAME_IND) && (bus->clkstate == CLK_AVAIL)) {
2688 brcmf_sdio_readframes(bus, bus->rxbound);
2689 if (!bus->rxpending)
2695 atomic_or(intstatus, &bus->intstatus);
2697 brcmf_sdio_clrintr(bus);
2699 if (bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL) &&
2700 txctl_ok(bus)) {
2701 sdio_claim_host(bus->sdiodev->func1);
2702 if (bus->ctrl_frame_stat) {
2703 err = brcmf_sdio_tx_ctrlframe(bus, bus->ctrl_frame_buf,
2704 bus->ctrl_frame_len);
2705 bus->ctrl_frame_err = err;
2707 bus->ctrl_frame_stat = false;
2712 sdio_release_host(bus->sdiodev->func1);
2713 brcmf_sdio_wait_event_wakeup(bus);
2716 if ((bus->clkstate == CLK_AVAIL) && !atomic_read(&bus->fcstate) &&
2717 brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) && txlimit &&
2718 data_ok(bus)) {
2719 framecnt = bus->rxpending ? min(txlimit, bus->txminmax) :
2721 brcmf_sdio_sendfromq(bus, framecnt);
2724 if ((bus->sdiodev->state != BRCMF_SDIOD_DATA) || (err != 0)) {
2726 atomic_set(&bus->intstatus, 0);
2727 if (bus->ctrl_frame_stat) {
2728 sdio_claim_host(bus->sdiodev->func1);
2729 if (bus->ctrl_frame_stat) {
2730 bus->ctrl_frame_err = -ENODEV;
2732 bus->ctrl_frame_stat = false;
2733 brcmf_sdio_wait_event_wakeup(bus);
2735 sdio_release_host(bus->sdiodev->func1);
2737 } else if (atomic_read(&bus->intstatus) ||
2738 atomic_read(&bus->ipend) > 0 ||
2739 (!atomic_read(&bus->fcstate) &&
2740 brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) &&
2741 data_ok(bus))) {
2742 bus->dpc_triggered = true;
2750 struct brcmf_sdio *bus = sdiodev->bus;
2752 return &bus->txq;
2803 struct brcmf_sdio *bus = sdiodev->bus;
2810 skb_push(pkt, bus->tx_hdrlen);
2823 brcmf_dbg(TRACE, "deferring pktq len %d\n", pktq_len(&bus->txq));
2824 bus->sdcnt.fcqueued++;
2827 spin_lock_bh(&bus->txq_lock);
2830 if (!brcmf_sdio_prec_enq(&bus->txq, pkt, prec)) {
2831 skb_pull(pkt, bus->tx_hdrlen);
2832 brcmf_err("out of bus->txq !!!\n");
2838 if (pktq_len(&bus->txq) >= TXHI) {
2839 bus->txoff = true;
2842 spin_unlock_bh(&bus->txq_lock);
2845 if (pktq_plen(&bus->txq, prec) > qcount[prec])
2846 qcount[prec] = pktq_plen(&bus->txq, prec);
2849 brcmf_sdio_trigger_dpc(bus);
2856 static int brcmf_sdio_readconsole(struct brcmf_sdio *bus)
2858 struct brcmf_console *c = &bus->console;
2864 if (bus->console_addr == 0)
2868 addr = bus->console_addr + offsetof(struct rte_console, log_le);
2869 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (u8 *)&c->log_le,
2895 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, c->buf, c->bufsize);
2938 struct brcmf_sdio *bus = sdiodev->bus;
2946 bus->ctrl_frame_buf = msg;
2947 bus->ctrl_frame_len = msglen;
2949 bus->ctrl_frame_stat = true;
2951 brcmf_sdio_trigger_dpc(bus);
2952 wait_event_interruptible_timeout(bus->ctrl_wait, !bus->ctrl_frame_stat,
2955 if (bus->ctrl_frame_stat) {
2956 sdio_claim_host(bus->sdiodev->func1);
2957 if (bus->ctrl_frame_stat) {
2959 bus->ctrl_frame_stat = false;
2962 sdio_release_host(bus->sdiodev->func1);
2966 bus->ctrl_frame_err);
2968 ret = bus->ctrl_frame_err;
2972 bus->sdcnt.tx_ctlerrs++;
2974 bus->sdcnt.tx_ctlpkts++;
2980 static int brcmf_sdio_dump_console(struct seq_file *seq, struct brcmf_sdio *bus,
2990 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr,
2997 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr,
3004 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr,
3019 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, console_ptr, (u8 *)conbuf,
3037 static int brcmf_sdio_trap_info(struct seq_file *seq, struct brcmf_sdio *bus,
3048 error = brcmf_sdiod_ramrw(bus->sdiodev, false, sh->trap_addr, (u8 *)&tr,
3085 static int brcmf_sdio_assert_info(struct seq_file *seq, struct brcmf_sdio *bus,
3100 sdio_claim_host(bus->sdiodev->func1);
3102 error = brcmf_sdiod_ramrw(bus->sdiodev, false,
3108 error = brcmf_sdiod_ramrw(bus->sdiodev, false,
3113 sdio_release_host(bus->sdiodev->func1);
3120 static int brcmf_sdio_checkdied(struct brcmf_sdio *bus)
3125 error = brcmf_sdio_readshared(bus, &sh);
3137 brcmf_sdio_trap_info(NULL, bus, &sh);
3143 static int brcmf_sdio_died_dump(struct seq_file *seq, struct brcmf_sdio *bus)
3148 error = brcmf_sdio_readshared(bus, &sh);
3152 error = brcmf_sdio_assert_info(seq, bus, &sh);
3156 error = brcmf_sdio_trap_info(seq, bus, &sh);
3160 error = brcmf_sdio_dump_console(seq, bus, &sh);
3169 struct brcmf_sdio *bus = bus_if->bus_priv.sdio->bus;
3171 return brcmf_sdio_died_dump(seq, bus);
3178 struct brcmf_sdio_count *sdcnt = &sdiodev->bus->sdcnt;
3218 struct brcmf_sdio *bus = sdiodev->bus;
3224 bus->console_interval = BRCMF_CONSOLE;
3230 &bus->console_interval);
3233 static int brcmf_sdio_checkdied(struct brcmf_sdio *bus)
3252 struct brcmf_sdio *bus = sdiodev->bus;
3259 timeleft = brcmf_sdio_dcmd_resp_wait(bus, &bus->rxlen, &pending);
3261 spin_lock_bh(&bus->rxctl_lock);
3262 rxlen = bus->rxlen;
3263 memcpy(msg, bus->rxctl, min(msglen, rxlen));
3264 bus->rxctl = NULL;
3265 buf = bus->rxctl_orig;
3266 bus->rxctl_orig = NULL;
3267 bus->rxlen = 0;
3268 spin_unlock_bh(&bus->rxctl_lock);
3276 brcmf_sdio_checkdied(bus);
3282 brcmf_sdio_checkdied(bus);
3286 bus->sdcnt.rx_ctlpkts++;
3288 bus->sdcnt.rx_ctlerrs++;
3347 static int brcmf_sdio_download_code_file(struct brcmf_sdio *bus,
3354 err = brcmf_sdiod_ramrw(bus->sdiodev, true, bus->ci->rambase,
3358 err, (int)fw->size, bus->ci->rambase);
3359 else if (!brcmf_sdio_verifymemory(bus->sdiodev, bus->ci->rambase,
3366 static int brcmf_sdio_download_nvram(struct brcmf_sdio *bus,
3374 address = bus->ci->ramsize - varsz + bus->ci->rambase;
3375 err = brcmf_sdiod_ramrw(bus->sdiodev, true, address, vars, varsz);
3379 else if (!brcmf_sdio_verifymemory(bus->sdiodev, address, vars, varsz))
3385 static int brcmf_sdio_download_firmware(struct brcmf_sdio *bus,
3392 sdio_claim_host(bus->sdiodev->func1);
3393 brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
3398 bcmerror = brcmf_sdio_download_code_file(bus, fw);
3406 bcmerror = brcmf_sdio_download_nvram(bus, nvram, nvlen);
3414 if (!brcmf_chip_set_active(bus->ci, rstvec)) {
3421 brcmf_sdio_clkctl(bus, CLK_SDONLY, false);
3422 sdio_release_host(bus->sdiodev->func1);
3426 static bool brcmf_sdio_aos_no_decode(struct brcmf_sdio *bus)
3428 if (bus->ci->chip == BRCM_CC_43751_CHIP_ID ||
3429 bus->ci->chip == CY_CC_43012_CHIP_ID ||
3430 bus->ci->chip == CY_CC_43752_CHIP_ID)
3436 static void brcmf_sdio_sr_init(struct brcmf_sdio *bus)
3446 if (brcmf_chip_is_ulp(bus->ci)) {
3454 if (brcmf_sdio_aos_no_decode(bus)) {
3461 val = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, &err);
3467 brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, val, &err);
3474 brcmf_sdiod_func0_wb(bus->sdiodev, SDIO_CCCR_BRCM_CARDCAP,
3482 brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
3490 bus->sr_enabled = true;
3495 static int brcmf_sdio_kso_init(struct brcmf_sdio *bus)
3497 struct brcmf_core *core = bus->sdio_core;
3507 val = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, &err);
3516 brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
3532 struct brcmf_sdio *bus = sdiodev->bus;
3533 struct brcmf_core *core = bus->sdio_core;
3543 bus_if->maxctl += bus->roundup;
3545 value += bus->head_align;
3546 bus->rxbuf = kmalloc(value, GFP_ATOMIC);
3547 if (bus->rxbuf)
3548 bus->rxblen = value;
3551 * a device perspective, ie. bus:txglom affects the
3552 * bus transfers from device to host.
3557 err = brcmf_iovar_data_set(dev, "bus:txglom", &iovar,
3561 value = sdiodev->settings->bus.sdio.sd_sgentry_align;
3564 err = brcmf_iovar_data_set(dev, "bus:txglomalign", &iovar,
3571 bus->tx_hdrlen = SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN;
3573 bus->txglom = false;
3575 err = brcmf_iovar_data_set(bus->sdiodev->dev, "bus:rxglom",
3578 /* bus:rxglom is allowed to fail */
3581 bus->txglom = true;
3582 bus->tx_hdrlen += SDPCM_HWEXT_LEN;
3585 brcmf_bus_add_txhdrlen(bus->sdiodev->dev, bus->tx_hdrlen);
3595 struct brcmf_sdio *bus = sdiodev->bus;
3597 return bus->ci->ramsize - bus->ci->srsize;
3605 struct brcmf_sdio *bus = sdiodev->bus;
3611 brcmf_dbg(INFO, "dump at 0x%08x: size=%zu\n", bus->ci->rambase,
3614 address = bus->ci->rambase;
3636 void brcmf_sdio_trigger_dpc(struct brcmf_sdio *bus)
3638 if (!bus->dpc_triggered) {
3639 bus->dpc_triggered = true;
3640 queue_work(bus->brcmf_wq, &bus->datawork);
3644 void brcmf_sdio_isr(struct brcmf_sdio *bus, bool in_isr)
3648 if (!bus) {
3649 brcmf_err("bus is null pointer, exiting\n");
3654 bus->sdcnt.intrcount++;
3656 atomic_set(&bus->ipend, 1);
3658 if (brcmf_sdio_intr_rstatus(bus)) {
3663 if (!bus->intr)
3666 bus->dpc_triggered = true;
3667 queue_work(bus->brcmf_wq, &bus->datawork);
3670 static void brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
3675 if (!bus->sr_enabled &&
3676 bus->poll && (++bus->polltick >= bus->pollrate)) {
3680 bus->polltick = 0;
3683 if (!bus->intr ||
3684 (bus->sdcnt.intrcount == bus->sdcnt.lastintrs)) {
3686 if (!bus->dpc_triggered) {
3689 sdio_claim_host(bus->sdiodev->func1);
3690 devpend = brcmf_sdiod_func0_rb(bus->sdiodev,
3692 sdio_release_host(bus->sdiodev->func1);
3700 bus->sdcnt.pollcnt++;
3701 atomic_set(&bus->ipend, 1);
3703 bus->dpc_triggered = true;
3704 queue_work(bus->brcmf_wq, &bus->datawork);
3709 bus->sdcnt.lastintrs = bus->sdcnt.intrcount;
3713 if (bus->sdiodev->state == BRCMF_SDIOD_DATA && BRCMF_FWCON_ON() &&
3714 bus->console_interval != 0) {
3715 bus->console.count += jiffies_to_msecs(BRCMF_WD_POLL);
3716 if (bus->console.count >= bus->console_interval) {
3717 bus->console.count -= bus->console_interval;
3718 sdio_claim_host(bus->sdiodev->func1);
3720 brcmf_sdio_bus_sleep(bus, false, false);
3721 if (brcmf_sdio_readconsole(bus) < 0)
3723 bus->console_interval = 0;
3724 sdio_release_host(bus->sdiodev->func1);
3730 if (!bus->dpc_triggered) {
3732 if ((!bus->dpc_running) && (bus->idletime > 0) &&
3733 (bus->clkstate == CLK_AVAIL)) {
3734 bus->idlecount++;
3735 if (bus->idlecount > bus->idletime) {
3737 sdio_claim_host(bus->sdiodev->func1);
3740 bus->console_interval == 0)
3742 brcmf_sdio_wd_timer(bus, false);
3743 bus->idlecount = 0;
3744 brcmf_sdio_bus_sleep(bus, true, false);
3745 sdio_release_host(bus->sdiodev->func1);
3748 bus->idlecount = 0;
3751 bus->idlecount = 0;
3757 struct brcmf_sdio *bus = container_of(work, struct brcmf_sdio,
3760 bus->dpc_running = true;
3762 while (READ_ONCE(bus->dpc_triggered)) {
3763 bus->dpc_triggered = false;
3764 brcmf_sdio_dpc(bus);
3765 bus->idlecount = 0;
3767 bus->dpc_running = false;
3768 if (brcmf_sdiod_freezing(bus->sdiodev)) {
3769 brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DOWN);
3770 brcmf_sdiod_try_freeze(bus->sdiodev);
3771 brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA);
3894 struct brcmf_core *core = sdiodev->bus->sdio_core;
3949 brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
3960 sdiodev = bus->sdiodev;
3985 bus->ci = brcmf_chip_attach(sdiodev, sdiodev->func1->device,
3987 if (IS_ERR(bus->ci)) {
3989 bus->ci = NULL;
3994 bus->sdio_core = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV);
3995 if (!bus->sdio_core)
3999 sdiodev->cc_core = brcmf_chip_get_core(bus->ci, BCMA_CORE_CHIPCOMMON);
4005 bus->ci->chip,
4006 bus->ci->chiprev);
4015 bus->head_align = ALIGNMENT;
4016 bus->sgentry_align = ALIGNMENT;
4017 if (sdiodev->settings->bus.sdio.sd_head_align > ALIGNMENT)
4018 bus->head_align = sdiodev->settings->bus.sdio.sd_head_align;
4019 if (sdiodev->settings->bus.sdio.sd_sgentry_align > ALIGNMENT)
4020 bus->sgentry_align =
4021 sdiodev->settings->bus.sdio.sd_sgentry_align;
4034 (sdiodev->settings->bus.sdio.oob_irq_supported)))
4037 if (brcmf_sdio_kso_init(bus)) {
4042 if (sdiodev->settings->bus.sdio.drive_strength)
4043 drivestrength = sdiodev->settings->bus.sdio.drive_strength;
4046 brcmf_sdio_drivestrengthinit(sdiodev, bus->ci, drivestrength);
4060 reg_addr = CORE_CC_REG(brcmf_chip_get_pmu(bus->ci)->base, pmucontrol);
4073 brcmu_pktq_init(&bus->txq, (PRIOMASK + 1), TXQLEN);
4076 bus->hdrbuf = kzalloc(MAX_HDR_READ + bus->head_align, GFP_KERNEL);
4077 if (!bus->hdrbuf)
4080 bus->rxhdr = (u8 *) roundup((unsigned long)&bus->hdrbuf[0],
4081 bus->head_align);
4084 bus->intr = true;
4085 bus->poll = false;
4086 if (bus->poll)
4087 bus->pollrate = 1;
4099 struct brcmf_sdio *bus = (struct brcmf_sdio *)data;
4104 brcmf_sdiod_freezer_count(bus->sdiodev);
4108 brcmf_sdiod_freezer_uncount(bus->sdiodev);
4109 wait = wait_for_completion_interruptible(&bus->watchdog_wait);
4110 brcmf_sdiod_freezer_count(bus->sdiodev);
4111 brcmf_sdiod_try_freeze(bus->sdiodev);
4113 brcmf_sdio_bus_watchdog(bus);
4115 bus->sdcnt.tickcnt++;
4116 reinit_completion(&bus->watchdog_wait);
4126 struct brcmf_sdio *bus = timer_container_of(bus, t, timer);
4128 if (bus->watchdog_tsk) {
4129 complete(&bus->watchdog_wait);
4131 if (bus->wd_active)
4132 mod_timer(&bus->timer,
4213 struct brcmf_sdio *bus = sdiod->bus;
4214 struct brcmf_core *core = bus->sdio_core;
4233 bus->alp_only = true;
4234 err = brcmf_sdio_download_firmware(bus, code, nvram, nvram_len);
4237 bus->alp_only = false;
4240 bus->sdcnt.tickcnt = 0;
4241 brcmf_sdio_wd_timer(bus, true);
4246 brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
4247 if (bus->clkstate != CLK_AVAIL)
4254 bpreq |= brcmf_chip_is_ulp(bus->ci) ?
4275 bus->hostintmask = HOSTINTMASK;
4277 bus->hostintmask, NULL);
4361 if (brcmf_chip_sr_capable(bus->ci)) {
4362 brcmf_sdio_sr_init(bus);
4370 /* Assign bus interface call back */
4373 sdiod->bus_if->chip = bus->ci->chip;
4374 sdiod->bus_if->chiprev = bus->ci->chiprev;
4377 brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA);
4386 brcmf_sdio_clkctl(bus, CLK_NONE, false);
4413 brcmf_sdio_checkdied(bus);
4423 brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus)
4427 { ".bin", bus->sdiodev->fw_name },
4428 { ".txt", bus->sdiodev->nvram_name },
4429 { ".clm_blob", bus->sdiodev->clm_name },
4432 fwreq = brcmf_fw_alloc_request(bus->ci->chip, bus->ci->chiprev,
4443 fwreq->board_types[0] = bus->sdiodev->settings->board_type;
4451 struct brcmf_sdio *bus;
4457 /* Allocate private bus interface state */
4458 bus = kzalloc(sizeof(*bus), GFP_ATOMIC);
4459 if (!bus) {
4464 bus->sdiodev = sdiodev;
4465 sdiodev->bus = bus;
4466 skb_queue_head_init(&bus->glom);
4467 bus->txbound = BRCMF_TXBOUND;
4468 bus->rxbound = BRCMF_RXBOUND;
4469 bus->txminmax = BRCMF_TXMINMAX;
4470 bus->tx_seq = SDPCM_SEQ_WRAP - 1;
4481 INIT_WORK(&bus->datawork, brcmf_sdio_dataworker);
4482 bus->brcmf_wq = wq;
4485 ret = brcmf_sdio_probe_attach(bus);
4491 spin_lock_init(&bus->rxctl_lock);
4492 spin_lock_init(&bus->txq_lock);
4493 init_waitqueue_head(&bus->ctrl_wait);
4494 init_waitqueue_head(&bus->dcmd_resp_wait);
4497 timer_setup(&bus->timer, brcmf_sdio_watchdog, 0);
4499 init_completion(&bus->watchdog_wait);
4500 bus->watchdog_tsk = kthread_run(brcmf_sdio_watchdog_thread,
4501 bus, "brcmf_wdog/%s",
4503 if (IS_ERR(bus->watchdog_tsk)) {
4505 bus->watchdog_tsk = NULL;
4508 bus->dpc_triggered = false;
4509 bus->dpc_running = false;
4511 /* default sdio bus header length for tx packet */
4512 bus->tx_hdrlen = SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN;
4515 bus->blocksize = bus->sdiodev->func2->cur_blksize;
4516 bus->roundup = min(max_roundup, bus->blocksize);
4518 sdio_claim_host(bus->sdiodev->func1);
4521 sdio_disable_func(bus->sdiodev->func2);
4523 bus->rxflow = false;
4526 brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL);
4528 sdio_release_host(bus->sdiodev->func1);
4531 bus->clkstate = CLK_SDONLY;
4532 bus->idletime = BRCMF_IDLE_INTERVAL;
4533 bus->idleclock = BRCMF_IDLE_ACTIVE;
4536 bus->sr_enabled = false;
4540 fwreq = brcmf_sdio_prepare_fw_request(bus);
4554 return bus;
4557 brcmf_sdio_remove(bus);
4562 void brcmf_sdio_remove(struct brcmf_sdio *bus)
4566 if (bus) {
4568 if (bus->watchdog_tsk) {
4569 send_sig(SIGTERM, bus->watchdog_tsk, 1);
4570 kthread_stop(bus->watchdog_tsk);
4571 bus->watchdog_tsk = NULL;
4575 brcmf_sdiod_intr_unregister(bus->sdiodev);
4577 brcmf_detach(bus->sdiodev->dev);
4578 brcmf_free(bus->sdiodev->dev);
4580 cancel_work_sync(&bus->datawork);
4581 if (bus->brcmf_wq)
4582 destroy_workqueue(bus->brcmf_wq);
4584 if (bus->ci) {
4585 if (bus->sdiodev->state != BRCMF_SDIOD_NOMEDIUM) {
4586 sdio_claim_host(bus->sdiodev->func1);
4587 brcmf_sdio_wd_timer(bus, false);
4588 brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
4594 brcmf_chip_set_passive(bus->ci);
4595 brcmf_sdio_clkctl(bus, CLK_NONE, false);
4596 sdio_release_host(bus->sdiodev->func1);
4598 brcmf_chip_detach(bus->ci);
4600 if (bus->sdiodev->settings)
4601 brcmf_release_module_param(bus->sdiodev->settings);
4603 release_firmware(bus->sdiodev->clm_fw);
4604 bus->sdiodev->clm_fw = NULL;
4605 kfree(bus->rxbuf);
4606 kfree(bus->hdrbuf);
4607 kfree(bus);
4613 void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, bool active)
4616 if (!active && bus->wd_active) {
4617 timer_delete_sync(&bus->timer);
4618 bus->wd_active = false;
4623 if (bus->sdiodev->state != BRCMF_SDIOD_DATA)
4627 if (!bus->wd_active) {
4631 bus->timer.expires = jiffies + BRCMF_WD_POLL;
4632 add_timer(&bus->timer);
4633 bus->wd_active = true;
4636 mod_timer(&bus->timer, jiffies + BRCMF_WD_POLL);
4641 int brcmf_sdio_sleep(struct brcmf_sdio *bus, bool sleep)
4645 sdio_claim_host(bus->sdiodev->func1);
4646 ret = brcmf_sdio_bus_sleep(bus, sleep, false);
4647 sdio_release_host(bus->sdiodev->func1);