Lines Matching full:bus
125 * sdio bus power cycle to clear (rev 9) */
170 #define I_BUSPWR (1 << 17) /* SDIO Bus Power Change (rev 9) */
455 /* Private data for SDIO bus interaction */
498 u8 sdpcm_ver; /* Bus protocol reported by dongle */
522 s32 idleclock; /* How to set bus driver when idle */
525 bool sleeping; /* Is SDIO bus sleeping? */
618 static bool data_ok(struct brcmf_sdio *bus) in data_ok() argument
620 return (u8)(bus->tx_max - bus->tx_seq) != 0 && in data_ok()
621 ((u8)(bus->tx_max - bus->tx_seq) & 0x80) == 0; in data_ok()
626 * adresses on the 32 bit backplane bus.
629 r_sdreg32(struct brcmf_sdio *bus, u32 *regvar, u32 reg_offset, u32 *retryvar) in r_sdreg32() argument
631 u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); in r_sdreg32()
634 *regvar = brcmf_sdcard_reg_read(bus->sdiodev, in r_sdreg32()
635 bus->ci->c_inf[idx].base + reg_offset, in r_sdreg32()
637 } while (brcmf_sdcard_regfail(bus->sdiodev) && in r_sdreg32()
640 bus->regfails += (*retryvar-1); in r_sdreg32()
649 w_sdreg32(struct brcmf_sdio *bus, u32 regval, u32 reg_offset, u32 *retryvar) in w_sdreg32() argument
651 u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); in w_sdreg32()
654 brcmf_sdcard_reg_write(bus->sdiodev, in w_sdreg32()
655 bus->ci->c_inf[idx].base + reg_offset, in w_sdreg32()
657 } while (brcmf_sdcard_regfail(bus->sdiodev) && in w_sdreg32()
660 bus->regfails += (*retryvar-1); in w_sdreg32()
672 * Conditional if bufpool was present for gspi bus.
674 static void brcmf_sdbrcm_pktfree2(struct brcmf_sdio *bus, struct sk_buff *pkt) in brcmf_sdbrcm_pktfree2() argument
676 if (bus->usebufpool) in brcmf_sdbrcm_pktfree2()
681 static int brcmf_sdbrcm_htclk(struct brcmf_sdio *bus, bool on, bool pendok) in brcmf_sdbrcm_htclk() argument
694 bus->alp_only ? SBSDIO_ALP_AVAIL_REQ : SBSDIO_HT_AVAIL_REQ; in brcmf_sdbrcm_htclk()
696 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_htclk()
704 clkctl = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_htclk()
712 if (!SBSDIO_CLKAV(clkctl, bus->alp_only) && pendok) { in brcmf_sdbrcm_htclk()
714 devctl = brcmf_sdcard_cfg_read(bus->sdiodev, in brcmf_sdbrcm_htclk()
724 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_htclk()
727 bus->clkstate = CLK_PENDING; in brcmf_sdbrcm_htclk()
730 } else if (bus->clkstate == CLK_PENDING) { in brcmf_sdbrcm_htclk()
733 brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_htclk()
736 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_htclk()
743 while (!SBSDIO_CLKAV(clkctl, bus->alp_only)) { in brcmf_sdbrcm_htclk()
744 clkctl = brcmf_sdcard_cfg_read(bus->sdiodev, in brcmf_sdbrcm_htclk()
757 if (!SBSDIO_CLKAV(clkctl, bus->alp_only)) { in brcmf_sdbrcm_htclk()
764 bus->clkstate = CLK_AVAIL; in brcmf_sdbrcm_htclk()
768 if (bus->alp_only != true) { in brcmf_sdbrcm_htclk()
774 bus->activity = true; in brcmf_sdbrcm_htclk()
778 if (bus->clkstate == CLK_PENDING) { in brcmf_sdbrcm_htclk()
780 devctl = brcmf_sdcard_cfg_read(bus->sdiodev, in brcmf_sdbrcm_htclk()
784 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_htclk()
788 bus->clkstate = CLK_SDONLY; in brcmf_sdbrcm_htclk()
789 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_htclk()
802 static int brcmf_sdbrcm_sdclk(struct brcmf_sdio *bus, bool on) in brcmf_sdbrcm_sdclk() argument
807 bus->clkstate = CLK_SDONLY; in brcmf_sdbrcm_sdclk()
809 bus->clkstate = CLK_NONE; in brcmf_sdbrcm_sdclk()
815 static int brcmf_sdbrcm_clkctl(struct brcmf_sdio *bus, uint target, bool pendok) in brcmf_sdbrcm_clkctl() argument
818 uint oldstate = bus->clkstate; in brcmf_sdbrcm_clkctl()
824 if (bus->clkstate == target) { in brcmf_sdbrcm_clkctl()
826 brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS); in brcmf_sdbrcm_clkctl()
827 bus->activity = true; in brcmf_sdbrcm_clkctl()
835 if (bus->clkstate == CLK_NONE) in brcmf_sdbrcm_clkctl()
836 brcmf_sdbrcm_sdclk(bus, true); in brcmf_sdbrcm_clkctl()
838 brcmf_sdbrcm_htclk(bus, true, pendok); in brcmf_sdbrcm_clkctl()
839 brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS); in brcmf_sdbrcm_clkctl()
840 bus->activity = true; in brcmf_sdbrcm_clkctl()
845 if (bus->clkstate == CLK_NONE) in brcmf_sdbrcm_clkctl()
846 brcmf_sdbrcm_sdclk(bus, true); in brcmf_sdbrcm_clkctl()
847 else if (bus->clkstate == CLK_AVAIL) in brcmf_sdbrcm_clkctl()
848 brcmf_sdbrcm_htclk(bus, false, false); in brcmf_sdbrcm_clkctl()
851 bus->clkstate, target); in brcmf_sdbrcm_clkctl()
852 brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS); in brcmf_sdbrcm_clkctl()
857 if (bus->clkstate == CLK_AVAIL) in brcmf_sdbrcm_clkctl()
858 brcmf_sdbrcm_htclk(bus, false, false); in brcmf_sdbrcm_clkctl()
860 brcmf_sdbrcm_sdclk(bus, false); in brcmf_sdbrcm_clkctl()
861 brcmf_sdbrcm_wd_timer(bus, 0); in brcmf_sdbrcm_clkctl()
865 brcmf_dbg(INFO, "%d -> %d\n", oldstate, bus->clkstate); in brcmf_sdbrcm_clkctl()
871 static int brcmf_sdbrcm_bussleep(struct brcmf_sdio *bus, bool sleep) in brcmf_sdbrcm_bussleep() argument
877 bus->sleeping ? "SLEEP" : "WAKE"); in brcmf_sdbrcm_bussleep()
880 if (sleep == bus->sleeping) in brcmf_sdbrcm_bussleep()
886 if (bus->dpc_sched || bus->rxskip || pktq_len(&bus->txq)) in brcmf_sdbrcm_bussleep()
889 /* Make sure the controller has the bus up */ in brcmf_sdbrcm_bussleep()
890 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); in brcmf_sdbrcm_bussleep()
893 w_sdreg32(bus, SMB_USE_OOB, in brcmf_sdbrcm_bussleep()
899 brcmf_sdbrcm_clkctl(bus, CLK_SDONLY, false); in brcmf_sdbrcm_bussleep()
901 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_bussleep()
905 /* Isolate the bus */ in brcmf_sdbrcm_bussleep()
906 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_bussleep()
911 bus->sleeping = true; in brcmf_sdbrcm_bussleep()
914 /* Waking up: bus power up is ok, set local state */ in brcmf_sdbrcm_bussleep()
916 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_bussleep()
919 /* Make sure the controller has the bus up */ in brcmf_sdbrcm_bussleep()
920 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); in brcmf_sdbrcm_bussleep()
923 w_sdreg32(bus, 0, offsetof(struct sdpcmd_regs, tosbmailboxdata), in brcmf_sdbrcm_bussleep()
926 w_sdreg32(bus, SMB_DEV_INT, in brcmf_sdbrcm_bussleep()
933 /* Make sure we have SD bus access */ in brcmf_sdbrcm_bussleep()
934 brcmf_sdbrcm_clkctl(bus, CLK_SDONLY, false); in brcmf_sdbrcm_bussleep()
937 bus->sleeping = false; in brcmf_sdbrcm_bussleep()
943 static void bus_wake(struct brcmf_sdio *bus) in bus_wake() argument
945 if (bus->sleeping) in bus_wake()
946 brcmf_sdbrcm_bussleep(bus, false); in bus_wake()
949 static u32 brcmf_sdbrcm_hostmail(struct brcmf_sdio *bus) in brcmf_sdbrcm_hostmail() argument
959 r_sdreg32(bus, &hmb_data, in brcmf_sdbrcm_hostmail()
963 w_sdreg32(bus, SMB_INT_ACK, in brcmf_sdbrcm_hostmail()
965 bus->f1regdata += 2; in brcmf_sdbrcm_hostmail()
970 bus->rx_seq); in brcmf_sdbrcm_hostmail()
971 if (!bus->rxskip) in brcmf_sdbrcm_hostmail()
974 bus->rxskip = false; in brcmf_sdbrcm_hostmail()
982 bus->sdpcm_ver = in brcmf_sdbrcm_hostmail()
985 if (bus->sdpcm_ver != SDPCM_PROT_VERSION) in brcmf_sdbrcm_hostmail()
988 bus->sdpcm_ver, SDPCM_PROT_VERSION); in brcmf_sdbrcm_hostmail()
991 bus->sdpcm_ver); in brcmf_sdbrcm_hostmail()
1003 if (fcbits & ~bus->flowcontrol) in brcmf_sdbrcm_hostmail()
1004 bus->fc_xoff++; in brcmf_sdbrcm_hostmail()
1006 if (bus->flowcontrol & ~fcbits) in brcmf_sdbrcm_hostmail()
1007 bus->fc_xon++; in brcmf_sdbrcm_hostmail()
1009 bus->fc_rcvd++; in brcmf_sdbrcm_hostmail()
1010 bus->flowcontrol = fcbits; in brcmf_sdbrcm_hostmail()
1025 static void brcmf_sdbrcm_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx) in brcmf_sdbrcm_rxfail() argument
1037 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2); in brcmf_sdbrcm_rxfail()
1039 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_rxfail()
1042 bus->f1regdata++; in brcmf_sdbrcm_rxfail()
1046 hi = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_rxfail()
1048 lo = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_rxfail()
1050 bus->f1regdata += 2; in brcmf_sdbrcm_rxfail()
1068 bus->rxrtx++; in brcmf_sdbrcm_rxfail()
1069 w_sdreg32(bus, SMB_NAK, in brcmf_sdbrcm_rxfail()
1072 bus->f1regdata++; in brcmf_sdbrcm_rxfail()
1074 bus->rxskip = true; in brcmf_sdbrcm_rxfail()
1078 bus->nextlen = 0; in brcmf_sdbrcm_rxfail()
1081 if (err || brcmf_sdcard_regfail(bus->sdiodev)) in brcmf_sdbrcm_rxfail()
1082 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; in brcmf_sdbrcm_rxfail()
1086 static uint brcmf_sdbrcm_glom_from_buf(struct brcmf_sdio *bus, uint len) in brcmf_sdbrcm_glom_from_buf() argument
1092 buf = bus->dataptr; in brcmf_sdbrcm_glom_from_buf()
1095 skb_queue_walk(&bus->glom, p) { in brcmf_sdbrcm_glom_from_buf()
1109 static uint brcmf_sdbrcm_glom_len(struct brcmf_sdio *bus) in brcmf_sdbrcm_glom_len() argument
1115 skb_queue_walk(&bus->glom, p) in brcmf_sdbrcm_glom_len()
1120 static void brcmf_sdbrcm_free_glom(struct brcmf_sdio *bus) in brcmf_sdbrcm_free_glom() argument
1124 skb_queue_walk_safe(&bus->glom, cur, next) { in brcmf_sdbrcm_free_glom()
1125 skb_unlink(cur, &bus->glom); in brcmf_sdbrcm_free_glom()
1130 static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq) in brcmf_sdbrcm_rxglom() argument
1143 bool usechain = bus->use_rxchain; in brcmf_sdbrcm_rxglom()
1149 bus->glomd, skb_peek(&bus->glom)); in brcmf_sdbrcm_rxglom()
1152 if (bus->glomd) { in brcmf_sdbrcm_rxglom()
1154 dlen = (u16) (bus->glomd->len); in brcmf_sdbrcm_rxglom()
1155 dptr = bus->glomd->data; in brcmf_sdbrcm_rxglom()
1185 (roundup(totlen, bus->blocksize) - totlen); in brcmf_sdbrcm_rxglom()
1186 totlen = roundup(totlen, bus->blocksize); in brcmf_sdbrcm_rxglom()
1196 skb_queue_tail(&bus->glom, pnext); in brcmf_sdbrcm_rxglom()
1203 in bus structure */ in brcmf_sdbrcm_rxglom()
1207 if (BRCMF_GLOM_ON() && bus->nextlen && in brcmf_sdbrcm_rxglom()
1208 totlen != bus->nextlen) { in brcmf_sdbrcm_rxglom()
1210 bus->nextlen, totlen, rxseq); in brcmf_sdbrcm_rxglom()
1214 brcmf_sdbrcm_free_glom(bus); in brcmf_sdbrcm_rxglom()
1219 brcmu_pkt_buf_free_skb(bus->glomd); in brcmf_sdbrcm_rxglom()
1220 bus->glomd = NULL; in brcmf_sdbrcm_rxglom()
1221 bus->nextlen = 0; in brcmf_sdbrcm_rxglom()
1226 if (!skb_queue_empty(&bus->glom)) { in brcmf_sdbrcm_rxglom()
1229 skb_queue_walk(&bus->glom, pnext) { in brcmf_sdbrcm_rxglom()
1236 pfirst = skb_peek(&bus->glom); in brcmf_sdbrcm_rxglom()
1237 dlen = (u16) brcmf_sdbrcm_glom_len(bus); in brcmf_sdbrcm_rxglom()
1244 errcode = brcmf_sdcard_recv_chain(bus->sdiodev, in brcmf_sdbrcm_rxglom()
1245 bus->sdiodev->sbwad, in brcmf_sdbrcm_rxglom()
1246 SDIO_FUNC_2, F2SYNC, &bus->glom); in brcmf_sdbrcm_rxglom()
1247 } else if (bus->dataptr) { in brcmf_sdbrcm_rxglom()
1248 errcode = brcmf_sdcard_recv_buf(bus->sdiodev, in brcmf_sdbrcm_rxglom()
1249 bus->sdiodev->sbwad, in brcmf_sdbrcm_rxglom()
1251 bus->dataptr, dlen); in brcmf_sdbrcm_rxglom()
1252 sublen = (u16) brcmf_sdbrcm_glom_from_buf(bus, dlen); in brcmf_sdbrcm_rxglom()
1264 bus->f2rxdata++; in brcmf_sdbrcm_rxglom()
1270 bus->sdiodev->bus_if->dstats.rx_errors++; in brcmf_sdbrcm_rxglom()
1272 if (bus->glomerr++ < 3) { in brcmf_sdbrcm_rxglom()
1273 brcmf_sdbrcm_rxfail(bus, true, true); in brcmf_sdbrcm_rxglom()
1275 bus->glomerr = 0; in brcmf_sdbrcm_rxglom()
1276 brcmf_sdbrcm_rxfail(bus, true, false); in brcmf_sdbrcm_rxglom()
1277 bus->rxglomfail++; in brcmf_sdbrcm_rxglom()
1278 brcmf_sdbrcm_free_glom(bus); in brcmf_sdbrcm_rxglom()
1297 bus->nextlen = dptr[SDPCM_FRAMETAG_LEN + SDPCM_NEXTLEN_OFFSET]; in brcmf_sdbrcm_rxglom()
1298 if ((bus->nextlen << 4) > MAX_RX_DATASZ) { in brcmf_sdbrcm_rxglom()
1300 bus->nextlen, seq); in brcmf_sdbrcm_rxglom()
1301 bus->nextlen = 0; in brcmf_sdbrcm_rxglom()
1311 } else if (roundup(sublen, bus->blocksize) != dlen) { in brcmf_sdbrcm_rxglom()
1313 sublen, roundup(sublen, bus->blocksize), in brcmf_sdbrcm_rxglom()
1336 bus->rx_badseq++; in brcmf_sdbrcm_rxglom()
1341 if ((u8) (txmax - bus->tx_seq) > 0x40) { in brcmf_sdbrcm_rxglom()
1343 txmax, bus->tx_seq); in brcmf_sdbrcm_rxglom()
1344 txmax = bus->tx_seq + 2; in brcmf_sdbrcm_rxglom()
1346 bus->tx_max = txmax; in brcmf_sdbrcm_rxglom()
1354 skb_queue_walk(&bus->glom, pnext) { in brcmf_sdbrcm_rxglom()
1398 if (bus->glomerr++ < 3) { in brcmf_sdbrcm_rxglom()
1401 brcmf_sdbrcm_rxfail(bus, true, true); in brcmf_sdbrcm_rxglom()
1403 bus->glomerr = 0; in brcmf_sdbrcm_rxglom()
1404 brcmf_sdbrcm_rxfail(bus, true, false); in brcmf_sdbrcm_rxglom()
1405 bus->rxglomfail++; in brcmf_sdbrcm_rxglom()
1406 brcmf_sdbrcm_free_glom(bus); in brcmf_sdbrcm_rxglom()
1408 bus->nextlen = 0; in brcmf_sdbrcm_rxglom()
1414 skb_queue_walk_safe(&bus->glom, pfirst, pnext) { in brcmf_sdbrcm_rxglom()
1431 bus->rx_badseq++; in brcmf_sdbrcm_rxglom()
1448 skb_unlink(pfirst, &bus->glom); in brcmf_sdbrcm_rxglom()
1451 } else if (brcmf_proto_hdrpull(bus->sdiodev->dev, in brcmf_sdbrcm_rxglom()
1454 bus->sdiodev->bus_if->dstats.rx_errors++; in brcmf_sdbrcm_rxglom()
1455 skb_unlink(pfirst, &bus->glom); in brcmf_sdbrcm_rxglom()
1463 bus->glom.qlen, pfirst, pfirst->data, in brcmf_sdbrcm_rxglom()
1473 if (bus->glom.qlen) { in brcmf_sdbrcm_rxglom()
1474 up(&bus->sdsem); in brcmf_sdbrcm_rxglom()
1475 brcmf_rx_frame(bus->sdiodev->dev, ifidx, &bus->glom); in brcmf_sdbrcm_rxglom()
1476 down(&bus->sdsem); in brcmf_sdbrcm_rxglom()
1479 bus->rxglomframes++; in brcmf_sdbrcm_rxglom()
1480 bus->rxglompkts += bus->glom.qlen; in brcmf_sdbrcm_rxglom()
1485 static int brcmf_sdbrcm_dcmd_resp_wait(struct brcmf_sdio *bus, uint *condition, in brcmf_sdbrcm_dcmd_resp_wait() argument
1492 add_wait_queue(&bus->dcmd_resp_wait, &wait); in brcmf_sdbrcm_dcmd_resp_wait()
1502 remove_wait_queue(&bus->dcmd_resp_wait, &wait); in brcmf_sdbrcm_dcmd_resp_wait()
1507 static int brcmf_sdbrcm_dcmd_resp_wake(struct brcmf_sdio *bus) in brcmf_sdbrcm_dcmd_resp_wake() argument
1509 if (waitqueue_active(&bus->dcmd_resp_wait)) in brcmf_sdbrcm_dcmd_resp_wake()
1510 wake_up_interruptible(&bus->dcmd_resp_wait); in brcmf_sdbrcm_dcmd_resp_wake()
1515 brcmf_sdbrcm_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff) in brcmf_sdbrcm_read_control() argument
1524 bus->rxctl = bus->rxbuf; in brcmf_sdbrcm_read_control()
1525 bus->rxctl += BRCMF_FIRSTREAD; in brcmf_sdbrcm_read_control()
1526 pad = ((unsigned long)bus->rxctl % BRCMF_SDALIGN); in brcmf_sdbrcm_read_control()
1528 bus->rxctl += (BRCMF_SDALIGN - pad); in brcmf_sdbrcm_read_control()
1529 bus->rxctl -= BRCMF_FIRSTREAD; in brcmf_sdbrcm_read_control()
1532 memcpy(bus->rxctl, hdr, BRCMF_FIRSTREAD); in brcmf_sdbrcm_read_control()
1538 if (bus->roundup && bus->blocksize && (rdlen > bus->blocksize)) { in brcmf_sdbrcm_read_control()
1539 pad = bus->blocksize - (rdlen % bus->blocksize); in brcmf_sdbrcm_read_control()
1540 if ((pad <= bus->roundup) && (pad < bus->blocksize) && in brcmf_sdbrcm_read_control()
1541 ((len + pad) < bus->sdiodev->bus_if->maxctl)) in brcmf_sdbrcm_read_control()
1552 if ((rdlen + BRCMF_FIRSTREAD) > bus->sdiodev->bus_if->maxctl) { in brcmf_sdbrcm_read_control()
1554 rdlen, bus->sdiodev->bus_if->maxctl); in brcmf_sdbrcm_read_control()
1555 bus->sdiodev->bus_if->dstats.rx_errors++; in brcmf_sdbrcm_read_control()
1556 brcmf_sdbrcm_rxfail(bus, false, false); in brcmf_sdbrcm_read_control()
1560 if ((len - doff) > bus->sdiodev->bus_if->maxctl) { in brcmf_sdbrcm_read_control()
1562 len, len - doff, bus->sdiodev->bus_if->maxctl); in brcmf_sdbrcm_read_control()
1563 bus->sdiodev->bus_if->dstats.rx_errors++; in brcmf_sdbrcm_read_control()
1564 bus->rx_toolong++; in brcmf_sdbrcm_read_control()
1565 brcmf_sdbrcm_rxfail(bus, false, false); in brcmf_sdbrcm_read_control()
1570 sdret = brcmf_sdcard_recv_buf(bus->sdiodev, in brcmf_sdbrcm_read_control()
1571 bus->sdiodev->sbwad, in brcmf_sdbrcm_read_control()
1573 F2SYNC, (bus->rxctl + BRCMF_FIRSTREAD), rdlen); in brcmf_sdbrcm_read_control()
1574 bus->f2rxdata++; in brcmf_sdbrcm_read_control()
1580 bus->rxc_errors++; in brcmf_sdbrcm_read_control()
1581 brcmf_sdbrcm_rxfail(bus, true, true); in brcmf_sdbrcm_read_control()
1590 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, bus->rxctl, len); in brcmf_sdbrcm_read_control()
1595 bus->rxctl += doff; in brcmf_sdbrcm_read_control()
1596 bus->rxlen = len - doff; in brcmf_sdbrcm_read_control()
1600 brcmf_sdbrcm_dcmd_resp_wake(bus); in brcmf_sdbrcm_read_control()
1604 static void brcmf_pad(struct brcmf_sdio *bus, u16 *pad, u16 *rdlen) in brcmf_pad() argument
1606 if (bus->roundup && bus->blocksize && *rdlen > bus->blocksize) { in brcmf_pad()
1607 *pad = bus->blocksize - (*rdlen % bus->blocksize); in brcmf_pad()
1608 if (*pad <= bus->roundup && *pad < bus->blocksize && in brcmf_pad()
1617 brcmf_alloc_pkt_and_read(struct brcmf_sdio *bus, u16 rdlen, in brcmf_alloc_pkt_and_read() argument
1629 sdret = brcmf_sdcard_recv_pkt(bus->sdiodev, bus->sdiodev->sbwad, in brcmf_alloc_pkt_and_read()
1631 bus->f2rxdata++; in brcmf_alloc_pkt_and_read()
1637 bus->sdiodev->bus_if->dstats.rx_errors++; in brcmf_alloc_pkt_and_read()
1642 brcmf_sdbrcm_rxfail(bus, true, true); in brcmf_alloc_pkt_and_read()
1649 brcmf_check_rxbuf(struct brcmf_sdio *bus, struct sk_buff *pkt, u8 *rxbuf, in brcmf_check_rxbuf() argument
1656 memcpy(bus->rxhdr, rxbuf, SDPCM_HDRLEN); in brcmf_check_rxbuf()
1659 *len = get_unaligned_le16(bus->rxhdr); in brcmf_check_rxbuf()
1660 check = get_unaligned_le16(bus->rxhdr + sizeof(u16)); in brcmf_check_rxbuf()
1672 bus->rx_badhdr++; in brcmf_check_rxbuf()
1673 brcmf_sdbrcm_rxfail(bus, false, false); in brcmf_check_rxbuf()
1692 brcmf_sdbrcm_rxfail(bus, true, true); in brcmf_check_rxbuf()
1699 brcmf_sdbrcm_pktfree2(bus, pkt); in brcmf_check_rxbuf()
1705 brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished) in brcmf_sdbrcm_readframes() argument
1727 for (rxseq = bus->rx_seq, rxleft = maxframes; in brcmf_sdbrcm_readframes()
1728 !bus->rxskip && rxleft && in brcmf_sdbrcm_readframes()
1729 bus->sdiodev->bus_if->state != BRCMF_BUS_DOWN; in brcmf_sdbrcm_readframes()
1733 if (bus->glomd || !skb_queue_empty(&bus->glom)) { in brcmf_sdbrcm_readframes()
1736 bus->glomd, skb_peek(&bus->glom)); in brcmf_sdbrcm_readframes()
1737 cnt = brcmf_sdbrcm_rxglom(bus, rxseq); in brcmf_sdbrcm_readframes()
1745 if (bus->nextlen) { in brcmf_sdbrcm_readframes()
1746 u16 nextlen = bus->nextlen; in brcmf_sdbrcm_readframes()
1747 bus->nextlen = 0; in brcmf_sdbrcm_readframes()
1750 brcmf_pad(bus, &pad, &rdlen); in brcmf_sdbrcm_readframes()
1757 brcmf_alloc_pkt_and_read(bus, rdlen, &pkt, &rxbuf); in brcmf_sdbrcm_readframes()
1765 if (brcmf_check_rxbuf(bus, pkt, rxbuf, rxseq, nextlen, in brcmf_sdbrcm_readframes()
1771 &bus->rxhdr[SDPCM_FRAMETAG_LEN]); in brcmf_sdbrcm_readframes()
1773 &bus->rxhdr[SDPCM_FRAMETAG_LEN]); in brcmf_sdbrcm_readframes()
1775 &bus->rxhdr[SDPCM_FRAMETAG_LEN]); in brcmf_sdbrcm_readframes()
1777 &bus->rxhdr[SDPCM_FRAMETAG_LEN]); in brcmf_sdbrcm_readframes()
1779 bus->nextlen = in brcmf_sdbrcm_readframes()
1780 bus->rxhdr[SDPCM_FRAMETAG_LEN + in brcmf_sdbrcm_readframes()
1782 if ((bus->nextlen << 4) > MAX_RX_DATASZ) { in brcmf_sdbrcm_readframes()
1784 bus->nextlen, seq); in brcmf_sdbrcm_readframes()
1785 bus->nextlen = 0; in brcmf_sdbrcm_readframes()
1788 bus->rx_readahead_cnt++; in brcmf_sdbrcm_readframes()
1792 &bus->rxhdr[SDPCM_FRAMETAG_LEN]); in brcmf_sdbrcm_readframes()
1794 if (bus->flowcontrol != fcbits) { in brcmf_sdbrcm_readframes()
1795 if (~bus->flowcontrol & fcbits) in brcmf_sdbrcm_readframes()
1796 bus->fc_xoff++; in brcmf_sdbrcm_readframes()
1798 if (bus->flowcontrol & ~fcbits) in brcmf_sdbrcm_readframes()
1799 bus->fc_xon++; in brcmf_sdbrcm_readframes()
1801 bus->fc_rcvd++; in brcmf_sdbrcm_readframes()
1802 bus->flowcontrol = fcbits; in brcmf_sdbrcm_readframes()
1809 bus->rx_badseq++; in brcmf_sdbrcm_readframes()
1814 if ((u8) (txmax - bus->tx_seq) > 0x40) { in brcmf_sdbrcm_readframes()
1816 txmax, bus->tx_seq); in brcmf_sdbrcm_readframes()
1817 txmax = bus->tx_seq + 2; in brcmf_sdbrcm_readframes()
1819 bus->tx_max = txmax; in brcmf_sdbrcm_readframes()
1829 bus->rxhdr, SDPCM_HDRLEN); in brcmf_sdbrcm_readframes()
1837 bus->nextlen = 0; in brcmf_sdbrcm_readframes()
1838 brcmf_sdbrcm_rxfail(bus, false, true); in brcmf_sdbrcm_readframes()
1839 brcmf_sdbrcm_pktfree2(bus, pkt); in brcmf_sdbrcm_readframes()
1847 brcmf_sdbrcm_rxfail(bus, false, false); in brcmf_sdbrcm_readframes()
1848 brcmf_sdbrcm_pktfree2(bus, pkt); in brcmf_sdbrcm_readframes()
1857 sdret = brcmf_sdcard_recv_buf(bus->sdiodev, bus->sdiodev->sbwad, in brcmf_sdbrcm_readframes()
1858 SDIO_FUNC_2, F2SYNC, bus->rxhdr, in brcmf_sdbrcm_readframes()
1860 bus->f2rxhdrs++; in brcmf_sdbrcm_readframes()
1864 bus->rx_hdrfail++; in brcmf_sdbrcm_readframes()
1865 brcmf_sdbrcm_rxfail(bus, true, true); in brcmf_sdbrcm_readframes()
1872 bus->rxhdr, SDPCM_HDRLEN); in brcmf_sdbrcm_readframes()
1877 len = get_unaligned_le16(bus->rxhdr); in brcmf_sdbrcm_readframes()
1878 check = get_unaligned_le16(bus->rxhdr + sizeof(u16)); in brcmf_sdbrcm_readframes()
1890 bus->rx_badhdr++; in brcmf_sdbrcm_readframes()
1891 brcmf_sdbrcm_rxfail(bus, false, false); in brcmf_sdbrcm_readframes()
1902 chan = SDPCM_PACKET_CHANNEL(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); in brcmf_sdbrcm_readframes()
1903 seq = SDPCM_PACKET_SEQUENCE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); in brcmf_sdbrcm_readframes()
1904 doff = SDPCM_DOFFSET_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); in brcmf_sdbrcm_readframes()
1905 txmax = SDPCM_WINDOW_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); in brcmf_sdbrcm_readframes()
1911 bus->rx_badhdr++; in brcmf_sdbrcm_readframes()
1912 brcmf_sdbrcm_rxfail(bus, false, false); in brcmf_sdbrcm_readframes()
1917 bus->nextlen = in brcmf_sdbrcm_readframes()
1918 bus->rxhdr[SDPCM_FRAMETAG_LEN + SDPCM_NEXTLEN_OFFSET]; in brcmf_sdbrcm_readframes()
1919 if ((bus->nextlen << 4) > MAX_RX_DATASZ) { in brcmf_sdbrcm_readframes()
1921 bus->nextlen, seq); in brcmf_sdbrcm_readframes()
1922 bus->nextlen = 0; in brcmf_sdbrcm_readframes()
1926 fcbits = SDPCM_FCMASK_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); in brcmf_sdbrcm_readframes()
1928 if (bus->flowcontrol != fcbits) { in brcmf_sdbrcm_readframes()
1929 if (~bus->flowcontrol & fcbits) in brcmf_sdbrcm_readframes()
1930 bus->fc_xoff++; in brcmf_sdbrcm_readframes()
1932 if (bus->flowcontrol & ~fcbits) in brcmf_sdbrcm_readframes()
1933 bus->fc_xon++; in brcmf_sdbrcm_readframes()
1935 bus->fc_rcvd++; in brcmf_sdbrcm_readframes()
1936 bus->flowcontrol = fcbits; in brcmf_sdbrcm_readframes()
1942 bus->rx_badseq++; in brcmf_sdbrcm_readframes()
1947 if ((u8) (txmax - bus->tx_seq) > 0x40) { in brcmf_sdbrcm_readframes()
1949 txmax, bus->tx_seq); in brcmf_sdbrcm_readframes()
1950 txmax = bus->tx_seq + 2; in brcmf_sdbrcm_readframes()
1952 bus->tx_max = txmax; in brcmf_sdbrcm_readframes()
1956 brcmf_sdbrcm_read_control(bus, bus->rxhdr, len, doff); in brcmf_sdbrcm_readframes()
1968 if (bus->roundup && bus->blocksize && in brcmf_sdbrcm_readframes()
1969 (rdlen > bus->blocksize)) { in brcmf_sdbrcm_readframes()
1970 pad = bus->blocksize - (rdlen % bus->blocksize); in brcmf_sdbrcm_readframes()
1971 if ((pad <= bus->roundup) && (pad < bus->blocksize) && in brcmf_sdbrcm_readframes()
1986 bus->sdiodev->bus_if->dstats.rx_errors++; in brcmf_sdbrcm_readframes()
1987 bus->rx_toolong++; in brcmf_sdbrcm_readframes()
1988 brcmf_sdbrcm_rxfail(bus, false, false); in brcmf_sdbrcm_readframes()
1998 bus->sdiodev->bus_if->dstats.rx_dropped++; in brcmf_sdbrcm_readframes()
1999 brcmf_sdbrcm_rxfail(bus, false, RETRYCHAN(chan)); in brcmf_sdbrcm_readframes()
2008 sdret = brcmf_sdcard_recv_pkt(bus->sdiodev, bus->sdiodev->sbwad, in brcmf_sdbrcm_readframes()
2010 bus->f2rxdata++; in brcmf_sdbrcm_readframes()
2018 bus->sdiodev->bus_if->dstats.rx_errors++; in brcmf_sdbrcm_readframes()
2019 brcmf_sdbrcm_rxfail(bus, true, RETRYCHAN(chan)); in brcmf_sdbrcm_readframes()
2025 memcpy(pkt->data, bus->rxhdr, BRCMF_FIRSTREAD); in brcmf_sdbrcm_readframes()
2038 if (SDPCM_GLOMDESC(&bus->rxhdr[SDPCM_FRAMETAG_LEN])) { in brcmf_sdbrcm_readframes()
2051 bus->glomd = pkt; in brcmf_sdbrcm_readframes()
2055 brcmf_sdbrcm_rxfail(bus, false, false); in brcmf_sdbrcm_readframes()
2067 } else if (brcmf_proto_hdrpull(bus->sdiodev->dev, &ifidx, in brcmf_sdbrcm_readframes()
2071 bus->sdiodev->bus_if->dstats.rx_errors++; in brcmf_sdbrcm_readframes()
2076 up(&bus->sdsem); in brcmf_sdbrcm_readframes()
2077 brcmf_rx_packet(bus->sdiodev->dev, ifidx, pkt); in brcmf_sdbrcm_readframes()
2078 down(&bus->sdsem); in brcmf_sdbrcm_readframes()
2090 if (bus->rxskip) in brcmf_sdbrcm_readframes()
2092 bus->rx_seq = rxseq; in brcmf_sdbrcm_readframes()
2098 brcmf_sdbrcm_wait_for_event(struct brcmf_sdio *bus, bool *lockvar) in brcmf_sdbrcm_wait_for_event() argument
2100 up(&bus->sdsem); in brcmf_sdbrcm_wait_for_event()
2101 wait_event_interruptible_timeout(bus->ctrl_wait, in brcmf_sdbrcm_wait_for_event()
2103 down(&bus->sdsem); in brcmf_sdbrcm_wait_for_event()
2108 brcmf_sdbrcm_wait_event_wakeup(struct brcmf_sdio *bus) in brcmf_sdbrcm_wait_event_wakeup() argument
2110 if (waitqueue_active(&bus->ctrl_wait)) in brcmf_sdbrcm_wait_event_wakeup()
2111 wake_up_interruptible(&bus->ctrl_wait); in brcmf_sdbrcm_wait_event_wakeup()
2117 static int brcmf_sdbrcm_txpkt(struct brcmf_sdio *bus, struct sk_buff *pkt, in brcmf_sdbrcm_txpkt() argument
2137 bus->sdiodev->bus_if->tx_realloc++; in brcmf_sdbrcm_txpkt()
2172 ((chan << SDPCM_CHANNEL_SHIFT) & SDPCM_CHANNEL_MASK) | bus->tx_seq | in brcmf_sdbrcm_txpkt()
2194 if (bus->roundup && bus->blocksize && (len > bus->blocksize)) { in brcmf_sdbrcm_txpkt()
2195 u16 pad = bus->blocksize - (len % bus->blocksize); in brcmf_sdbrcm_txpkt()
2196 if ((pad <= bus->roundup) && (pad < bus->blocksize)) in brcmf_sdbrcm_txpkt()
2206 ret = brcmf_sdcard_send_pkt(bus->sdiodev, bus->sdiodev->sbwad, in brcmf_sdbrcm_txpkt()
2208 bus->f2txdata++; in brcmf_sdbrcm_txpkt()
2214 bus->tx_sderrs++; in brcmf_sdbrcm_txpkt()
2216 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2); in brcmf_sdbrcm_txpkt()
2217 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_txpkt()
2220 bus->f1regdata++; in brcmf_sdbrcm_txpkt()
2224 hi = brcmf_sdcard_cfg_read(bus->sdiodev, in brcmf_sdbrcm_txpkt()
2228 lo = brcmf_sdcard_cfg_read(bus->sdiodev, in brcmf_sdbrcm_txpkt()
2232 bus->f1regdata += 2; in brcmf_sdbrcm_txpkt()
2239 bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP; in brcmf_sdbrcm_txpkt()
2244 up(&bus->sdsem); in brcmf_sdbrcm_txpkt()
2245 brcmf_txcomplete(bus->sdiodev->dev, pkt, ret != 0); in brcmf_sdbrcm_txpkt()
2246 down(&bus->sdsem); in brcmf_sdbrcm_txpkt()
2254 static uint brcmf_sdbrcm_sendfromq(struct brcmf_sdio *bus, uint maxframes) in brcmf_sdbrcm_sendfromq() argument
2266 tx_prec_map = ~bus->flowcontrol; in brcmf_sdbrcm_sendfromq()
2269 for (cnt = 0; (cnt < maxframes) && data_ok(bus); cnt++) { in brcmf_sdbrcm_sendfromq()
2270 spin_lock_bh(&bus->txqlock); in brcmf_sdbrcm_sendfromq()
2271 pkt = brcmu_pktq_mdeq(&bus->txq, tx_prec_map, &prec_out); in brcmf_sdbrcm_sendfromq()
2273 spin_unlock_bh(&bus->txqlock); in brcmf_sdbrcm_sendfromq()
2276 spin_unlock_bh(&bus->txqlock); in brcmf_sdbrcm_sendfromq()
2279 ret = brcmf_sdbrcm_txpkt(bus, pkt, SDPCM_DATA_CHANNEL, true); in brcmf_sdbrcm_sendfromq()
2281 bus->sdiodev->bus_if->dstats.tx_errors++; in brcmf_sdbrcm_sendfromq()
2283 bus->sdiodev->bus_if->dstats.tx_bytes += datalen; in brcmf_sdbrcm_sendfromq()
2286 if (!bus->intr && cnt) { in brcmf_sdbrcm_sendfromq()
2288 r_sdreg32(bus, &intstatus, in brcmf_sdbrcm_sendfromq()
2291 bus->f2txdata++; in brcmf_sdbrcm_sendfromq()
2292 if (brcmf_sdcard_regfail(bus->sdiodev)) in brcmf_sdbrcm_sendfromq()
2294 if (intstatus & bus->hostintmask) in brcmf_sdbrcm_sendfromq()
2295 bus->ipend = true; in brcmf_sdbrcm_sendfromq()
2300 if (bus->sdiodev->bus_if->drvr_up && in brcmf_sdbrcm_sendfromq()
2301 (bus->sdiodev->bus_if->state == BRCMF_BUS_DATA) && in brcmf_sdbrcm_sendfromq()
2302 bus->txoff && (pktq_len(&bus->txq) < TXLOW)) { in brcmf_sdbrcm_sendfromq()
2303 bus->txoff = OFF; in brcmf_sdbrcm_sendfromq()
2304 brcmf_txflowcontrol(bus->sdiodev->dev, 0, OFF); in brcmf_sdbrcm_sendfromq()
2318 struct brcmf_sdio *bus = sdiodev->bus; in brcmf_sdbrcm_bus_stop() local
2322 if (bus->watchdog_tsk) { in brcmf_sdbrcm_bus_stop()
2323 send_sig(SIGTERM, bus->watchdog_tsk, 1); in brcmf_sdbrcm_bus_stop()
2324 kthread_stop(bus->watchdog_tsk); in brcmf_sdbrcm_bus_stop()
2325 bus->watchdog_tsk = NULL; in brcmf_sdbrcm_bus_stop()
2328 if (bus->dpc_tsk && bus->dpc_tsk != current) { in brcmf_sdbrcm_bus_stop()
2329 send_sig(SIGTERM, bus->dpc_tsk, 1); in brcmf_sdbrcm_bus_stop()
2330 kthread_stop(bus->dpc_tsk); in brcmf_sdbrcm_bus_stop()
2331 bus->dpc_tsk = NULL; in brcmf_sdbrcm_bus_stop()
2334 down(&bus->sdsem); in brcmf_sdbrcm_bus_stop()
2336 bus_wake(bus); in brcmf_sdbrcm_bus_stop()
2339 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); in brcmf_sdbrcm_bus_stop()
2342 w_sdreg32(bus, 0, offsetof(struct sdpcmd_regs, hostintmask), &retries); in brcmf_sdbrcm_bus_stop()
2343 local_hostintmask = bus->hostintmask; in brcmf_sdbrcm_bus_stop()
2344 bus->hostintmask = 0; in brcmf_sdbrcm_bus_stop()
2346 /* Change our idea of bus state */ in brcmf_sdbrcm_bus_stop()
2347 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; in brcmf_sdbrcm_bus_stop()
2350 saveclk = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_bus_stop()
2353 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_bus_stop()
2360 /* Turn off the bus (F2), free any pending packets */ in brcmf_sdbrcm_bus_stop()
2362 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_0, SDIO_CCCR_IOEx, in brcmf_sdbrcm_bus_stop()
2366 w_sdreg32(bus, local_hostintmask, in brcmf_sdbrcm_bus_stop()
2370 brcmf_sdbrcm_clkctl(bus, CLK_SDONLY, false); in brcmf_sdbrcm_bus_stop()
2373 brcmu_pktq_flush(&bus->txq, true, NULL, NULL); in brcmf_sdbrcm_bus_stop()
2376 if (bus->glomd) in brcmf_sdbrcm_bus_stop()
2377 brcmu_pkt_buf_free_skb(bus->glomd); in brcmf_sdbrcm_bus_stop()
2378 brcmf_sdbrcm_free_glom(bus); in brcmf_sdbrcm_bus_stop()
2381 bus->rxlen = 0; in brcmf_sdbrcm_bus_stop()
2382 brcmf_sdbrcm_dcmd_resp_wake(bus); in brcmf_sdbrcm_bus_stop()
2385 bus->rxskip = false; in brcmf_sdbrcm_bus_stop()
2386 bus->tx_seq = bus->rx_seq = 0; in brcmf_sdbrcm_bus_stop()
2388 up(&bus->sdsem); in brcmf_sdbrcm_bus_stop()
2391 static bool brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) in brcmf_sdbrcm_dpc() argument
2395 uint rxlimit = bus->rxbound; /* Rx frames to read before resched */ in brcmf_sdbrcm_dpc()
2396 uint txlimit = bus->txbound; /* Tx frames to send before resched */ in brcmf_sdbrcm_dpc()
2404 intstatus = bus->intstatus; in brcmf_sdbrcm_dpc()
2406 down(&bus->sdsem); in brcmf_sdbrcm_dpc()
2409 if (bus->clkstate == CLK_PENDING) { in brcmf_sdbrcm_dpc()
2415 devctl = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_dpc()
2419 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; in brcmf_sdbrcm_dpc()
2424 clkctl = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_dpc()
2429 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; in brcmf_sdbrcm_dpc()
2436 devctl = brcmf_sdcard_cfg_read(bus->sdiodev, in brcmf_sdbrcm_dpc()
2442 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; in brcmf_sdbrcm_dpc()
2445 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_dpc()
2450 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; in brcmf_sdbrcm_dpc()
2452 bus->clkstate = CLK_AVAIL; in brcmf_sdbrcm_dpc()
2458 bus_wake(bus); in brcmf_sdbrcm_dpc()
2461 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, true); in brcmf_sdbrcm_dpc()
2462 if (bus->clkstate == CLK_PENDING) in brcmf_sdbrcm_dpc()
2466 if (bus->ipend) { in brcmf_sdbrcm_dpc()
2467 bus->ipend = false; in brcmf_sdbrcm_dpc()
2468 r_sdreg32(bus, &newstatus, in brcmf_sdbrcm_dpc()
2470 bus->f1regdata++; in brcmf_sdbrcm_dpc()
2471 if (brcmf_sdcard_regfail(bus->sdiodev)) in brcmf_sdbrcm_dpc()
2473 newstatus &= bus->hostintmask; in brcmf_sdbrcm_dpc()
2474 bus->fcstate = !!(newstatus & I_HMB_FC_STATE); in brcmf_sdbrcm_dpc()
2476 w_sdreg32(bus, newstatus, in brcmf_sdbrcm_dpc()
2479 bus->f1regdata++; in brcmf_sdbrcm_dpc()
2485 bus->intstatus = 0; in brcmf_sdbrcm_dpc()
2493 w_sdreg32(bus, I_HMB_FC_CHANGE, in brcmf_sdbrcm_dpc()
2496 r_sdreg32(bus, &newstatus, in brcmf_sdbrcm_dpc()
2498 bus->f1regdata += 2; in brcmf_sdbrcm_dpc()
2499 bus->fcstate = in brcmf_sdbrcm_dpc()
2501 intstatus |= (newstatus & bus->hostintmask); in brcmf_sdbrcm_dpc()
2507 intstatus |= brcmf_sdbrcm_hostmail(bus); in brcmf_sdbrcm_dpc()
2533 if (bus->rxskip) in brcmf_sdbrcm_dpc()
2538 framecnt = brcmf_sdbrcm_readframes(bus, rxlimit, &rxdone); in brcmf_sdbrcm_dpc()
2539 if (rxdone || bus->rxskip) in brcmf_sdbrcm_dpc()
2545 bus->intstatus = intstatus; in brcmf_sdbrcm_dpc()
2548 if (data_ok(bus) && bus->ctrl_frame_stat && in brcmf_sdbrcm_dpc()
2549 (bus->clkstate == CLK_AVAIL)) { in brcmf_sdbrcm_dpc()
2552 ret = brcmf_sdcard_send_buf(bus->sdiodev, bus->sdiodev->sbwad, in brcmf_sdbrcm_dpc()
2553 SDIO_FUNC_2, F2SYNC, (u8 *) bus->ctrl_frame_buf, in brcmf_sdbrcm_dpc()
2554 (u32) bus->ctrl_frame_len); in brcmf_sdbrcm_dpc()
2561 bus->tx_sderrs++; in brcmf_sdbrcm_dpc()
2563 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2); in brcmf_sdbrcm_dpc()
2565 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_dpc()
2568 bus->f1regdata++; in brcmf_sdbrcm_dpc()
2572 hi = brcmf_sdcard_cfg_read(bus->sdiodev, in brcmf_sdbrcm_dpc()
2576 lo = brcmf_sdcard_cfg_read(bus->sdiodev, in brcmf_sdbrcm_dpc()
2580 bus->f1regdata += 2; in brcmf_sdbrcm_dpc()
2587 bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP; in brcmf_sdbrcm_dpc()
2590 bus->ctrl_frame_stat = false; in brcmf_sdbrcm_dpc()
2591 brcmf_sdbrcm_wait_event_wakeup(bus); in brcmf_sdbrcm_dpc()
2594 else if ((bus->clkstate == CLK_AVAIL) && !bus->fcstate && in brcmf_sdbrcm_dpc()
2595 brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) && txlimit in brcmf_sdbrcm_dpc()
2596 && data_ok(bus)) { in brcmf_sdbrcm_dpc()
2597 framecnt = rxdone ? txlimit : min(txlimit, bus->txminmax); in brcmf_sdbrcm_dpc()
2598 framecnt = brcmf_sdbrcm_sendfromq(bus, framecnt); in brcmf_sdbrcm_dpc()
2606 if ((bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN) || in brcmf_sdbrcm_dpc()
2607 brcmf_sdcard_regfail(bus->sdiodev)) { in brcmf_sdbrcm_dpc()
2609 brcmf_sdcard_regfail(bus->sdiodev)); in brcmf_sdbrcm_dpc()
2610 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; in brcmf_sdbrcm_dpc()
2611 bus->intstatus = 0; in brcmf_sdbrcm_dpc()
2612 } else if (bus->clkstate == CLK_PENDING) { in brcmf_sdbrcm_dpc()
2615 } else if (bus->intstatus || bus->ipend || in brcmf_sdbrcm_dpc()
2616 (!bus->fcstate && brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) in brcmf_sdbrcm_dpc()
2617 && data_ok(bus)) || PKT_AVAILABLE()) { in brcmf_sdbrcm_dpc()
2621 bus->dpc_sched = resched; in brcmf_sdbrcm_dpc()
2624 if ((bus->clkstate != CLK_PENDING) in brcmf_sdbrcm_dpc()
2625 && bus->idletime == BRCMF_IDLE_IMMEDIATE) { in brcmf_sdbrcm_dpc()
2626 bus->activity = false; in brcmf_sdbrcm_dpc()
2627 brcmf_sdbrcm_clkctl(bus, CLK_NONE, false); in brcmf_sdbrcm_dpc()
2630 up(&bus->sdsem); in brcmf_sdbrcm_dpc()
2637 struct brcmf_sdio *bus = (struct brcmf_sdio *) data; in brcmf_sdbrcm_dpc_thread() local
2644 if (!wait_for_completion_interruptible(&bus->dpc_wait)) { in brcmf_sdbrcm_dpc_thread()
2645 /* Call bus dpc unless it indicated down in brcmf_sdbrcm_dpc_thread()
2647 if (bus->sdiodev->bus_if->state != BRCMF_BUS_DOWN) { in brcmf_sdbrcm_dpc_thread()
2648 if (brcmf_sdbrcm_dpc(bus)) in brcmf_sdbrcm_dpc_thread()
2649 complete(&bus->dpc_wait); in brcmf_sdbrcm_dpc_thread()
2651 /* after stopping the bus, exit thread */ in brcmf_sdbrcm_dpc_thread()
2652 brcmf_sdbrcm_bus_stop(bus->sdiodev->dev); in brcmf_sdbrcm_dpc_thread()
2653 bus->dpc_tsk = NULL; in brcmf_sdbrcm_dpc_thread()
2668 struct brcmf_sdio *bus = sdiodev->bus; in brcmf_sdbrcm_bus_txdata() local
2682 brcmf_dbg(TRACE, "deferring pktq len %d\n", pktq_len(&bus->txq)); in brcmf_sdbrcm_bus_txdata()
2683 bus->fcqueued++; in brcmf_sdbrcm_bus_txdata()
2686 spin_lock_bh(&bus->txqlock); in brcmf_sdbrcm_bus_txdata()
2687 if (brcmf_c_prec_enq(bus->sdiodev->dev, &bus->txq, pkt, prec) == in brcmf_sdbrcm_bus_txdata()
2690 brcmf_txcomplete(bus->sdiodev->dev, pkt, false); in brcmf_sdbrcm_bus_txdata()
2692 brcmf_dbg(ERROR, "out of bus->txq !!!\n"); in brcmf_sdbrcm_bus_txdata()
2697 spin_unlock_bh(&bus->txqlock); in brcmf_sdbrcm_bus_txdata()
2699 if (pktq_len(&bus->txq) >= TXHI) { in brcmf_sdbrcm_bus_txdata()
2700 bus->txoff = ON; in brcmf_sdbrcm_bus_txdata()
2701 brcmf_txflowcontrol(bus->sdiodev->dev, 0, ON); in brcmf_sdbrcm_bus_txdata()
2705 if (pktq_plen(&bus->txq, prec) > qcount[prec]) in brcmf_sdbrcm_bus_txdata()
2706 qcount[prec] = pktq_plen(&bus->txq, prec); in brcmf_sdbrcm_bus_txdata()
2709 if (!bus->dpc_sched) { in brcmf_sdbrcm_bus_txdata()
2710 bus->dpc_sched = true; in brcmf_sdbrcm_bus_txdata()
2711 if (bus->dpc_tsk) in brcmf_sdbrcm_bus_txdata()
2712 complete(&bus->dpc_wait); in brcmf_sdbrcm_bus_txdata()
2719 brcmf_sdbrcm_membytes(struct brcmf_sdio *bus, bool write, u32 address, u8 *data, in brcmf_sdbrcm_membytes() argument
2734 bcmerror = brcmf_sdcard_set_sbaddr_window(bus->sdiodev, address); in brcmf_sdbrcm_membytes()
2745 bcmerror = brcmf_sdcard_rwdata(bus->sdiodev, write, in brcmf_sdbrcm_membytes()
2757 bcmerror = brcmf_sdcard_set_sbaddr_window(bus->sdiodev, in brcmf_sdbrcm_membytes()
2770 if (brcmf_sdcard_set_sbaddr_window(bus->sdiodev, bus->sdiodev->sbwad)) in brcmf_sdbrcm_membytes()
2772 bus->sdiodev->sbwad); in brcmf_sdbrcm_membytes()
2780 static int brcmf_sdbrcm_readconsole(struct brcmf_sdio *bus) in brcmf_sdbrcm_readconsole() argument
2782 struct brcmf_console *c = &bus->console; in brcmf_sdbrcm_readconsole()
2788 if (bus->console_addr == 0) in brcmf_sdbrcm_readconsole()
2792 addr = bus->console_addr + offsetof(struct rte_console, log_le); in brcmf_sdbrcm_readconsole()
2793 rv = brcmf_sdbrcm_membytes(bus, false, addr, (u8 *)&c->log_le, in brcmf_sdbrcm_readconsole()
2819 rv = brcmf_sdbrcm_membytes(bus, false, addr, c->buf, c->bufsize); in brcmf_sdbrcm_readconsole()
2857 static int brcmf_tx_frame(struct brcmf_sdio *bus, u8 *frame, u16 len) in brcmf_tx_frame() argument
2862 bus->ctrl_frame_stat = false; in brcmf_tx_frame()
2863 ret = brcmf_sdcard_send_buf(bus->sdiodev, bus->sdiodev->sbwad, in brcmf_tx_frame()
2870 bus->tx_sderrs++; in brcmf_tx_frame()
2872 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2); in brcmf_tx_frame()
2874 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_tx_frame()
2877 bus->f1regdata++; in brcmf_tx_frame()
2881 hi = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, in brcmf_tx_frame()
2884 lo = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, in brcmf_tx_frame()
2887 bus->f1regdata += 2; in brcmf_tx_frame()
2894 bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP; in brcmf_tx_frame()
2910 struct brcmf_sdio *bus = sdiodev->bus; in brcmf_sdbrcm_bus_txctl() local
2914 /* Back the pointer to make a room for bus header */ in brcmf_sdbrcm_bus_txctl()
2930 if (bus->roundup && bus->blocksize && (len > bus->blocksize)) { in brcmf_sdbrcm_bus_txctl()
2931 u16 pad = bus->blocksize - (len % bus->blocksize); in brcmf_sdbrcm_bus_txctl()
2932 if ((pad <= bus->roundup) && (pad < bus->blocksize)) in brcmf_sdbrcm_bus_txctl()
2945 down(&bus->sdsem); in brcmf_sdbrcm_bus_txctl()
2947 bus_wake(bus); in brcmf_sdbrcm_bus_txctl()
2950 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); in brcmf_sdbrcm_bus_txctl()
2960 | bus->tx_seq | ((doff << SDPCM_DOFFSET_SHIFT) & in brcmf_sdbrcm_bus_txctl()
2965 if (!data_ok(bus)) { in brcmf_sdbrcm_bus_txctl()
2966 brcmf_dbg(INFO, "No bus credit bus->tx_max %d, bus->tx_seq %d\n", in brcmf_sdbrcm_bus_txctl()
2967 bus->tx_max, bus->tx_seq); in brcmf_sdbrcm_bus_txctl()
2968 bus->ctrl_frame_stat = true; in brcmf_sdbrcm_bus_txctl()
2970 bus->ctrl_frame_buf = frame; in brcmf_sdbrcm_bus_txctl()
2971 bus->ctrl_frame_len = len; in brcmf_sdbrcm_bus_txctl()
2973 brcmf_sdbrcm_wait_for_event(bus, &bus->ctrl_frame_stat); in brcmf_sdbrcm_bus_txctl()
2975 if (bus->ctrl_frame_stat == false) { in brcmf_sdbrcm_bus_txctl()
2998 ret = brcmf_tx_frame(bus, frame, len); in brcmf_sdbrcm_bus_txctl()
3002 if ((bus->idletime == BRCMF_IDLE_IMMEDIATE) && !bus->dpc_sched) { in brcmf_sdbrcm_bus_txctl()
3003 bus->activity = false; in brcmf_sdbrcm_bus_txctl()
3004 brcmf_sdbrcm_clkctl(bus, CLK_NONE, true); in brcmf_sdbrcm_bus_txctl()
3007 up(&bus->sdsem); in brcmf_sdbrcm_bus_txctl()
3010 bus->tx_ctlerrs++; in brcmf_sdbrcm_bus_txctl()
3012 bus->tx_ctlpkts++; in brcmf_sdbrcm_bus_txctl()
3025 struct brcmf_sdio *bus = sdiodev->bus; in brcmf_sdbrcm_bus_rxctl() local
3030 timeleft = brcmf_sdbrcm_dcmd_resp_wait(bus, &bus->rxlen, &pending); in brcmf_sdbrcm_bus_rxctl()
3032 down(&bus->sdsem); in brcmf_sdbrcm_bus_rxctl()
3033 rxlen = bus->rxlen; in brcmf_sdbrcm_bus_rxctl()
3034 memcpy(msg, bus->rxctl, min(msglen, rxlen)); in brcmf_sdbrcm_bus_rxctl()
3035 bus->rxlen = 0; in brcmf_sdbrcm_bus_rxctl()
3036 up(&bus->sdsem); in brcmf_sdbrcm_bus_rxctl()
3051 bus->rx_ctlpkts++; in brcmf_sdbrcm_bus_rxctl()
3053 bus->rx_ctlerrs++; in brcmf_sdbrcm_bus_rxctl()
3058 static int brcmf_sdbrcm_downloadvars(struct brcmf_sdio *bus, void *arg, int len) in brcmf_sdbrcm_downloadvars() argument
3065 if (bus->sdiodev->bus_if->drvr_up) { in brcmf_sdbrcm_downloadvars()
3075 kfree(bus->vars); in brcmf_sdbrcm_downloadvars()
3077 bus->vars = kmalloc(len, GFP_ATOMIC); in brcmf_sdbrcm_downloadvars()
3078 bus->varsz = bus->vars ? len : 0; in brcmf_sdbrcm_downloadvars()
3079 if (bus->vars == NULL) { in brcmf_sdbrcm_downloadvars()
3086 memcpy(bus->vars, arg, bus->varsz); in brcmf_sdbrcm_downloadvars()
3091 static int brcmf_sdbrcm_write_vars(struct brcmf_sdio *bus) in brcmf_sdbrcm_write_vars() argument
3105 varsize = bus->varsz ? roundup(bus->varsz, 4) : 0; in brcmf_sdbrcm_write_vars()
3106 varaddr = (bus->ramsize - 4) - varsize; in brcmf_sdbrcm_write_vars()
3108 if (bus->vars) { in brcmf_sdbrcm_write_vars()
3113 memcpy(vbuffer, bus->vars, bus->varsz); in brcmf_sdbrcm_write_vars()
3117 brcmf_sdbrcm_membytes(bus, true, varaddr, vbuffer, varsize); in brcmf_sdbrcm_write_vars()
3132 brcmf_sdbrcm_membytes(bus, false, varaddr, nvram_ularray, in brcmf_sdbrcm_write_vars()
3151 brcmf_dbg(INFO, "Physical memory size: %d\n", bus->ramsize); in brcmf_sdbrcm_write_vars()
3154 varsize = ((bus->ramsize - 4) - varaddr); in brcmf_sdbrcm_write_vars()
3174 bcmerror = brcmf_sdbrcm_membytes(bus, true, (bus->ramsize - 4), in brcmf_sdbrcm_write_vars()
3180 static int brcmf_sdbrcm_download_state(struct brcmf_sdio *bus, bool enter) in brcmf_sdbrcm_download_state() argument
3184 struct chip_info *ci = bus->ci; in brcmf_sdbrcm_download_state()
3190 bus->alp_only = true; in brcmf_sdbrcm_download_state()
3192 ci->coredisable(bus->sdiodev, ci, BCMA_CORE_ARM_CM3); in brcmf_sdbrcm_download_state()
3194 ci->resetcore(bus->sdiodev, ci, BCMA_CORE_INTERNAL_MEM); in brcmf_sdbrcm_download_state()
3197 if (bus->ramsize) { in brcmf_sdbrcm_download_state()
3199 brcmf_sdbrcm_membytes(bus, true, bus->ramsize - 4, in brcmf_sdbrcm_download_state()
3203 if (!ci->iscoreup(bus->sdiodev, ci, BCMA_CORE_INTERNAL_MEM)) { in brcmf_sdbrcm_download_state()
3209 bcmerror = brcmf_sdbrcm_write_vars(bus); in brcmf_sdbrcm_download_state()
3215 w_sdreg32(bus, 0xFFFFFFFF, in brcmf_sdbrcm_download_state()
3218 ci->resetcore(bus->sdiodev, ci, BCMA_CORE_ARM_CM3); in brcmf_sdbrcm_download_state()
3221 bus->alp_only = false; in brcmf_sdbrcm_download_state()
3223 bus->sdiodev->bus_if->state = BRCMF_BUS_LOAD; in brcmf_sdbrcm_download_state()
3229 static int brcmf_sdbrcm_get_image(char *buf, int len, struct brcmf_sdio *bus) in brcmf_sdbrcm_get_image() argument
3231 if (bus->firmware->size < bus->fw_ptr + len) in brcmf_sdbrcm_get_image()
3232 len = bus->firmware->size - bus->fw_ptr; in brcmf_sdbrcm_get_image()
3234 memcpy(buf, &bus->firmware->data[bus->fw_ptr], len); in brcmf_sdbrcm_get_image()
3235 bus->fw_ptr += len; in brcmf_sdbrcm_get_image()
3239 static int brcmf_sdbrcm_download_code_file(struct brcmf_sdio *bus) in brcmf_sdbrcm_download_code_file() argument
3248 ret = request_firmware(&bus->firmware, BRCMFMAC_FW_NAME, in brcmf_sdbrcm_download_code_file()
3249 &bus->sdiodev->func[2]->dev); in brcmf_sdbrcm_download_code_file()
3254 bus->fw_ptr = 0; in brcmf_sdbrcm_download_code_file()
3267 brcmf_sdbrcm_get_image((char *)memptr, MEMBLOCK, bus))) { in brcmf_sdbrcm_download_code_file()
3268 ret = brcmf_sdbrcm_membytes(bus, true, offset, memptr, len); in brcmf_sdbrcm_download_code_file()
3281 release_firmware(bus->firmware); in brcmf_sdbrcm_download_code_file()
3282 bus->fw_ptr = 0; in brcmf_sdbrcm_download_code_file()
3338 static int brcmf_sdbrcm_download_nvram(struct brcmf_sdio *bus) in brcmf_sdbrcm_download_nvram() argument
3345 ret = request_firmware(&bus->firmware, BRCMFMAC_NV_NAME, in brcmf_sdbrcm_download_nvram()
3346 &bus->sdiodev->func[2]->dev); in brcmf_sdbrcm_download_nvram()
3351 bus->fw_ptr = 0; in brcmf_sdbrcm_download_nvram()
3359 len = brcmf_sdbrcm_get_image(memblock, MEMBLOCK, bus); in brcmf_sdbrcm_download_nvram()
3368 ret = brcmf_sdbrcm_downloadvars(bus, memblock, len + 1); in brcmf_sdbrcm_download_nvram()
3379 release_firmware(bus->firmware); in brcmf_sdbrcm_download_nvram()
3380 bus->fw_ptr = 0; in brcmf_sdbrcm_download_nvram()
3385 static int _brcmf_sdbrcm_download_firmware(struct brcmf_sdio *bus) in _brcmf_sdbrcm_download_firmware() argument
3390 if (brcmf_sdbrcm_download_state(bus, true)) { in _brcmf_sdbrcm_download_firmware()
3396 if (brcmf_sdbrcm_download_code_file(bus)) { in _brcmf_sdbrcm_download_firmware()
3402 if (brcmf_sdbrcm_download_nvram(bus)) in _brcmf_sdbrcm_download_firmware()
3406 if (brcmf_sdbrcm_download_state(bus, false)) { in _brcmf_sdbrcm_download_firmware()
3418 brcmf_sdbrcm_download_firmware(struct brcmf_sdio *bus) in brcmf_sdbrcm_download_firmware() argument
3423 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); in brcmf_sdbrcm_download_firmware()
3425 ret = _brcmf_sdbrcm_download_firmware(bus) == 0; in brcmf_sdbrcm_download_firmware()
3427 brcmf_sdbrcm_clkctl(bus, CLK_SDONLY, false); in brcmf_sdbrcm_download_firmware()
3436 struct brcmf_sdio *bus = sdiodev->bus; in brcmf_sdbrcm_bus_init() local
3447 if (!(brcmf_sdbrcm_download_firmware(bus))) in brcmf_sdbrcm_bus_init()
3451 if (!bus->sdiodev->bus_if->drvr) in brcmf_sdbrcm_bus_init()
3455 bus->tickcnt = 0; in brcmf_sdbrcm_bus_init()
3456 brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS); in brcmf_sdbrcm_bus_init()
3458 down(&bus->sdsem); in brcmf_sdbrcm_bus_init()
3461 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); in brcmf_sdbrcm_bus_init()
3462 if (bus->clkstate != CLK_AVAIL) in brcmf_sdbrcm_bus_init()
3467 brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_bus_init()
3470 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_bus_init()
3480 w_sdreg32(bus, SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT, in brcmf_sdbrcm_bus_init()
3484 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_0, SDIO_CCCR_IOEx, in brcmf_sdbrcm_bus_init()
3490 ready = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_0, in brcmf_sdbrcm_bus_init()
3504 bus->hostintmask = HOSTINTMASK; in brcmf_sdbrcm_bus_init()
3505 w_sdreg32(bus, bus->hostintmask, in brcmf_sdbrcm_bus_init()
3508 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_bus_init()
3511 /* Set bus state according to enable result */ in brcmf_sdbrcm_bus_init()
3518 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_0, in brcmf_sdbrcm_bus_init()
3523 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_bus_init()
3528 brcmf_sdbrcm_clkctl(bus, CLK_NONE, false); in brcmf_sdbrcm_bus_init()
3531 up(&bus->sdsem); in brcmf_sdbrcm_bus_init()
3538 struct brcmf_sdio *bus = (struct brcmf_sdio *) arg; in brcmf_sdbrcm_isr() local
3542 if (!bus) { in brcmf_sdbrcm_isr()
3543 brcmf_dbg(ERROR, "bus is null pointer, exiting\n"); in brcmf_sdbrcm_isr()
3547 if (bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN) { in brcmf_sdbrcm_isr()
3548 brcmf_dbg(ERROR, "bus is down. we have nothing to do\n"); in brcmf_sdbrcm_isr()
3552 bus->intrcount++; in brcmf_sdbrcm_isr()
3553 bus->ipend = true; in brcmf_sdbrcm_isr()
3556 if (bus->sleeping) { in brcmf_sdbrcm_isr()
3562 if (!bus->intr) in brcmf_sdbrcm_isr()
3565 bus->dpc_sched = true; in brcmf_sdbrcm_isr()
3566 if (bus->dpc_tsk) in brcmf_sdbrcm_isr()
3567 complete(&bus->dpc_wait); in brcmf_sdbrcm_isr()
3570 static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus) in brcmf_sdbrcm_bus_watchdog() argument
3573 struct brcmf_bus *bus_if = dev_get_drvdata(bus->sdiodev->dev); in brcmf_sdbrcm_bus_watchdog()
3578 /* Ignore the timer if simulating bus down */ in brcmf_sdbrcm_bus_watchdog()
3579 if (bus->sleeping) in brcmf_sdbrcm_bus_watchdog()
3582 down(&bus->sdsem); in brcmf_sdbrcm_bus_watchdog()
3585 if (bus->poll && (++bus->polltick >= bus->pollrate)) { in brcmf_sdbrcm_bus_watchdog()
3589 bus->polltick = 0; in brcmf_sdbrcm_bus_watchdog()
3592 if (!bus->intr || (bus->intrcount == bus->lastintrs)) { in brcmf_sdbrcm_bus_watchdog()
3594 if (!bus->dpc_sched) { in brcmf_sdbrcm_bus_watchdog()
3596 devpend = brcmf_sdcard_cfg_read(bus->sdiodev, in brcmf_sdbrcm_bus_watchdog()
3607 bus->pollcnt++; in brcmf_sdbrcm_bus_watchdog()
3608 bus->ipend = true; in brcmf_sdbrcm_bus_watchdog()
3610 bus->dpc_sched = true; in brcmf_sdbrcm_bus_watchdog()
3611 if (bus->dpc_tsk) in brcmf_sdbrcm_bus_watchdog()
3612 complete(&bus->dpc_wait); in brcmf_sdbrcm_bus_watchdog()
3617 bus->lastintrs = bus->intrcount; in brcmf_sdbrcm_bus_watchdog()
3622 bus->console_interval != 0) { in brcmf_sdbrcm_bus_watchdog()
3623 bus->console.count += BRCMF_WD_POLL_MS; in brcmf_sdbrcm_bus_watchdog()
3624 if (bus->console.count >= bus->console_interval) { in brcmf_sdbrcm_bus_watchdog()
3625 bus->console.count -= bus->console_interval; in brcmf_sdbrcm_bus_watchdog()
3627 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); in brcmf_sdbrcm_bus_watchdog()
3628 if (brcmf_sdbrcm_readconsole(bus) < 0) in brcmf_sdbrcm_bus_watchdog()
3630 bus->console_interval = 0; in brcmf_sdbrcm_bus_watchdog()
3636 if ((bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) { in brcmf_sdbrcm_bus_watchdog()
3637 if (++bus->idlecount >= bus->idletime) { in brcmf_sdbrcm_bus_watchdog()
3638 bus->idlecount = 0; in brcmf_sdbrcm_bus_watchdog()
3639 if (bus->activity) { in brcmf_sdbrcm_bus_watchdog()
3640 bus->activity = false; in brcmf_sdbrcm_bus_watchdog()
3641 brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS); in brcmf_sdbrcm_bus_watchdog()
3643 brcmf_sdbrcm_clkctl(bus, CLK_NONE, false); in brcmf_sdbrcm_bus_watchdog()
3648 up(&bus->sdsem); in brcmf_sdbrcm_bus_watchdog()
3650 return bus->ipend; in brcmf_sdbrcm_bus_watchdog()
3662 static void brcmf_sdbrcm_release_malloc(struct brcmf_sdio *bus) in brcmf_sdbrcm_release_malloc() argument
3666 kfree(bus->rxbuf); in brcmf_sdbrcm_release_malloc()
3667 bus->rxctl = bus->rxbuf = NULL; in brcmf_sdbrcm_release_malloc()
3668 bus->rxlen = 0; in brcmf_sdbrcm_release_malloc()
3670 kfree(bus->databuf); in brcmf_sdbrcm_release_malloc()
3671 bus->databuf = NULL; in brcmf_sdbrcm_release_malloc()
3674 static bool brcmf_sdbrcm_probe_malloc(struct brcmf_sdio *bus) in brcmf_sdbrcm_probe_malloc() argument
3678 if (bus->sdiodev->bus_if->maxctl) { in brcmf_sdbrcm_probe_malloc()
3679 bus->rxblen = in brcmf_sdbrcm_probe_malloc()
3680 roundup((bus->sdiodev->bus_if->maxctl + SDPCM_HDRLEN), in brcmf_sdbrcm_probe_malloc()
3682 bus->rxbuf = kmalloc(bus->rxblen, GFP_ATOMIC); in brcmf_sdbrcm_probe_malloc()
3683 if (!(bus->rxbuf)) in brcmf_sdbrcm_probe_malloc()
3688 bus->databuf = kmalloc(MAX_DATA_BUF, GFP_ATOMIC); in brcmf_sdbrcm_probe_malloc()
3689 if (!(bus->databuf)) { in brcmf_sdbrcm_probe_malloc()
3691 if (!bus->rxblen) in brcmf_sdbrcm_probe_malloc()
3692 kfree(bus->rxbuf); in brcmf_sdbrcm_probe_malloc()
3697 if ((unsigned long)bus->databuf % BRCMF_SDALIGN) in brcmf_sdbrcm_probe_malloc()
3698 bus->dataptr = bus->databuf + (BRCMF_SDALIGN - in brcmf_sdbrcm_probe_malloc()
3699 ((unsigned long)bus->databuf % BRCMF_SDALIGN)); in brcmf_sdbrcm_probe_malloc()
3701 bus->dataptr = bus->databuf; in brcmf_sdbrcm_probe_malloc()
3710 brcmf_sdbrcm_probe_attach(struct brcmf_sdio *bus, u32 regsva) in brcmf_sdbrcm_probe_attach() argument
3718 bus->alp_only = true; in brcmf_sdbrcm_probe_attach()
3721 if (brcmf_sdcard_set_sbaddr_window(bus->sdiodev, SI_ENUM_BASE)) in brcmf_sdbrcm_probe_attach()
3726 brcmf_sdcard_reg_read(bus->sdiodev, SI_ENUM_BASE, 4)); in brcmf_sdbrcm_probe_attach()
3735 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_probe_attach()
3740 brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_probe_attach()
3749 if (brcmf_sdio_chip_attach(bus->sdiodev, &bus->ci, regsva)) { in brcmf_sdbrcm_probe_attach()
3754 if (!brcmf_sdbrcm_chipmatch((u16) bus->ci->chip)) { in brcmf_sdbrcm_probe_attach()
3755 brcmf_dbg(ERROR, "unsupported chip: 0x%04x\n", bus->ci->chip); in brcmf_sdbrcm_probe_attach()
3759 brcmf_sdio_chip_drivestrengthinit(bus->sdiodev, bus->ci, in brcmf_sdbrcm_probe_attach()
3763 bus->ramsize = bus->ci->ramsize; in brcmf_sdbrcm_probe_attach()
3764 if (!(bus->ramsize)) { in brcmf_sdbrcm_probe_attach()
3770 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); in brcmf_sdbrcm_probe_attach()
3771 reg_addr = bus->ci->c_inf[idx].base + in brcmf_sdbrcm_probe_attach()
3773 reg_val = brcmf_sdcard_reg_read(bus->sdiodev, reg_addr, sizeof(u32)); in brcmf_sdbrcm_probe_attach()
3774 brcmf_sdcard_reg_write(bus->sdiodev, reg_addr, sizeof(u32), in brcmf_sdbrcm_probe_attach()
3777 brcmu_pktq_init(&bus->txq, (PRIOMASK + 1), TXQLEN); in brcmf_sdbrcm_probe_attach()
3780 bus->rxhdr = (u8 *) roundup((unsigned long)&bus->hdrbuf[0], in brcmf_sdbrcm_probe_attach()
3784 bus->intr = true; in brcmf_sdbrcm_probe_attach()
3785 bus->poll = false; in brcmf_sdbrcm_probe_attach()
3786 if (bus->poll) in brcmf_sdbrcm_probe_attach()
3787 bus->pollrate = 1; in brcmf_sdbrcm_probe_attach()
3795 static bool brcmf_sdbrcm_probe_init(struct brcmf_sdio *bus) in brcmf_sdbrcm_probe_init() argument
3800 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_0, SDIO_CCCR_IOEx, in brcmf_sdbrcm_probe_init()
3803 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; in brcmf_sdbrcm_probe_init()
3804 bus->sleeping = false; in brcmf_sdbrcm_probe_init()
3805 bus->rxflow = false; in brcmf_sdbrcm_probe_init()
3808 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, in brcmf_sdbrcm_probe_init()
3812 bus->clkstate = CLK_SDONLY; in brcmf_sdbrcm_probe_init()
3813 bus->idletime = BRCMF_IDLE_INTERVAL; in brcmf_sdbrcm_probe_init()
3814 bus->idleclock = BRCMF_IDLE_ACTIVE; in brcmf_sdbrcm_probe_init()
3817 bus->blocksize = bus->sdiodev->func[2]->cur_blksize; in brcmf_sdbrcm_probe_init()
3818 bus->roundup = min(max_roundup, bus->blocksize); in brcmf_sdbrcm_probe_init()
3820 /* bus module does not support packet chaining */ in brcmf_sdbrcm_probe_init()
3821 bus->use_rxchain = false; in brcmf_sdbrcm_probe_init()
3822 bus->sd_rxchain = false; in brcmf_sdbrcm_probe_init()
3830 struct brcmf_sdio *bus = (struct brcmf_sdio *)data; in brcmf_sdbrcm_watchdog_thread() local
3837 if (!wait_for_completion_interruptible(&bus->watchdog_wait)) { in brcmf_sdbrcm_watchdog_thread()
3838 brcmf_sdbrcm_bus_watchdog(bus); in brcmf_sdbrcm_watchdog_thread()
3840 bus->tickcnt++; in brcmf_sdbrcm_watchdog_thread()
3850 struct brcmf_sdio *bus = (struct brcmf_sdio *)data; in brcmf_sdbrcm_watchdog() local
3852 if (bus->watchdog_tsk) { in brcmf_sdbrcm_watchdog()
3853 complete(&bus->watchdog_wait); in brcmf_sdbrcm_watchdog()
3855 if (bus->wd_timer_valid) in brcmf_sdbrcm_watchdog()
3856 mod_timer(&bus->timer, in brcmf_sdbrcm_watchdog()
3861 static void brcmf_sdbrcm_release_dongle(struct brcmf_sdio *bus) in brcmf_sdbrcm_release_dongle() argument
3865 if (bus->ci) { in brcmf_sdbrcm_release_dongle()
3866 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); in brcmf_sdbrcm_release_dongle()
3867 brcmf_sdbrcm_clkctl(bus, CLK_NONE, false); in brcmf_sdbrcm_release_dongle()
3868 brcmf_sdio_chip_detach(&bus->ci); in brcmf_sdbrcm_release_dongle()
3869 if (bus->vars && bus->varsz) in brcmf_sdbrcm_release_dongle()
3870 kfree(bus->vars); in brcmf_sdbrcm_release_dongle()
3871 bus->vars = NULL; in brcmf_sdbrcm_release_dongle()
3878 static void brcmf_sdbrcm_release(struct brcmf_sdio *bus) in brcmf_sdbrcm_release() argument
3882 if (bus) { in brcmf_sdbrcm_release()
3884 brcmf_sdcard_intr_dereg(bus->sdiodev); in brcmf_sdbrcm_release()
3886 if (bus->sdiodev->bus_if->drvr) { in brcmf_sdbrcm_release()
3887 brcmf_detach(bus->sdiodev->dev); in brcmf_sdbrcm_release()
3888 brcmf_sdbrcm_release_dongle(bus); in brcmf_sdbrcm_release()
3891 brcmf_sdbrcm_release_malloc(bus); in brcmf_sdbrcm_release()
3893 kfree(bus); in brcmf_sdbrcm_release()
3902 struct brcmf_sdio *bus; in brcmf_sdbrcm_probe() local
3909 /* Allocate private bus interface state */ in brcmf_sdbrcm_probe()
3910 bus = kzalloc(sizeof(struct brcmf_sdio), GFP_ATOMIC); in brcmf_sdbrcm_probe()
3911 if (!bus) in brcmf_sdbrcm_probe()
3914 bus->sdiodev = sdiodev; in brcmf_sdbrcm_probe()
3915 sdiodev->bus = bus; in brcmf_sdbrcm_probe()
3916 skb_queue_head_init(&bus->glom); in brcmf_sdbrcm_probe()
3917 bus->txbound = BRCMF_TXBOUND; in brcmf_sdbrcm_probe()
3918 bus->rxbound = BRCMF_RXBOUND; in brcmf_sdbrcm_probe()
3919 bus->txminmax = BRCMF_TXMINMAX; in brcmf_sdbrcm_probe()
3920 bus->tx_seq = SDPCM_SEQUENCE_WRAP - 1; in brcmf_sdbrcm_probe()
3921 bus->usebufpool = false; /* Use bufpool if allocated, in brcmf_sdbrcm_probe()
3925 if (!(brcmf_sdbrcm_probe_attach(bus, regsva))) { in brcmf_sdbrcm_probe()
3930 spin_lock_init(&bus->txqlock); in brcmf_sdbrcm_probe()
3931 init_waitqueue_head(&bus->ctrl_wait); in brcmf_sdbrcm_probe()
3932 init_waitqueue_head(&bus->dcmd_resp_wait); in brcmf_sdbrcm_probe()
3935 init_timer(&bus->timer); in brcmf_sdbrcm_probe()
3936 bus->timer.data = (unsigned long)bus; in brcmf_sdbrcm_probe()
3937 bus->timer.function = brcmf_sdbrcm_watchdog; in brcmf_sdbrcm_probe()
3940 sema_init(&bus->sdsem, 1); in brcmf_sdbrcm_probe()
3943 init_completion(&bus->watchdog_wait); in brcmf_sdbrcm_probe()
3944 bus->watchdog_tsk = kthread_run(brcmf_sdbrcm_watchdog_thread, in brcmf_sdbrcm_probe()
3945 bus, "brcmf_watchdog"); in brcmf_sdbrcm_probe()
3946 if (IS_ERR(bus->watchdog_tsk)) { in brcmf_sdbrcm_probe()
3949 bus->watchdog_tsk = NULL; in brcmf_sdbrcm_probe()
3952 init_completion(&bus->dpc_wait); in brcmf_sdbrcm_probe()
3953 bus->dpc_tsk = kthread_run(brcmf_sdbrcm_dpc_thread, in brcmf_sdbrcm_probe()
3954 bus, "brcmf_dpc"); in brcmf_sdbrcm_probe()
3955 if (IS_ERR(bus->dpc_tsk)) { in brcmf_sdbrcm_probe()
3958 bus->dpc_tsk = NULL; in brcmf_sdbrcm_probe()
3961 /* Assign bus interface call back */ in brcmf_sdbrcm_probe()
3962 bus->sdiodev->bus_if->brcmf_bus_stop = brcmf_sdbrcm_bus_stop; in brcmf_sdbrcm_probe()
3963 bus->sdiodev->bus_if->brcmf_bus_init = brcmf_sdbrcm_bus_init; in brcmf_sdbrcm_probe()
3964 bus->sdiodev->bus_if->brcmf_bus_txdata = brcmf_sdbrcm_bus_txdata; in brcmf_sdbrcm_probe()
3965 bus->sdiodev->bus_if->brcmf_bus_txctl = brcmf_sdbrcm_bus_txctl; in brcmf_sdbrcm_probe()
3966 bus->sdiodev->bus_if->brcmf_bus_rxctl = brcmf_sdbrcm_bus_rxctl; in brcmf_sdbrcm_probe()
3968 ret = brcmf_attach(SDPCM_RESERVE, bus->sdiodev->dev); in brcmf_sdbrcm_probe()
3975 if (!(brcmf_sdbrcm_probe_malloc(bus))) { in brcmf_sdbrcm_probe()
3980 if (!(brcmf_sdbrcm_probe_init(bus))) { in brcmf_sdbrcm_probe()
3987 ret = brcmf_sdcard_intr_reg(bus->sdiodev); in brcmf_sdbrcm_probe()
3996 /* if firmware path present try to download and bring up bus */ in brcmf_sdbrcm_probe()
3997 ret = brcmf_bus_start(bus->sdiodev->dev); in brcmf_sdbrcm_probe()
4006 if (brcmf_add_if(bus->sdiodev->dev, 0, "wlan%d", NULL)) { in brcmf_sdbrcm_probe()
4011 return bus; in brcmf_sdbrcm_probe()
4014 brcmf_sdbrcm_release(bus); in brcmf_sdbrcm_probe()
4020 struct brcmf_sdio *bus = (struct brcmf_sdio *)ptr; in brcmf_sdbrcm_disconnect() local
4024 if (bus) in brcmf_sdbrcm_disconnect()
4025 brcmf_sdbrcm_release(bus); in brcmf_sdbrcm_disconnect()
4031 brcmf_sdbrcm_wd_timer(struct brcmf_sdio *bus, uint wdtick) in brcmf_sdbrcm_wd_timer() argument
4034 if (!wdtick && bus->wd_timer_valid == true) { in brcmf_sdbrcm_wd_timer()
4035 del_timer_sync(&bus->timer); in brcmf_sdbrcm_wd_timer()
4036 bus->wd_timer_valid = false; in brcmf_sdbrcm_wd_timer()
4037 bus->save_ms = wdtick; in brcmf_sdbrcm_wd_timer()
4042 if (bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN) in brcmf_sdbrcm_wd_timer()
4046 if (bus->save_ms != BRCMF_WD_POLL_MS) { in brcmf_sdbrcm_wd_timer()
4047 if (bus->wd_timer_valid == true) in brcmf_sdbrcm_wd_timer()
4049 del_timer_sync(&bus->timer); in brcmf_sdbrcm_wd_timer()
4054 bus->timer.expires = in brcmf_sdbrcm_wd_timer()
4056 add_timer(&bus->timer); in brcmf_sdbrcm_wd_timer()
4060 mod_timer(&bus->timer, in brcmf_sdbrcm_wd_timer()
4064 bus->wd_timer_valid = true; in brcmf_sdbrcm_wd_timer()
4065 bus->save_ms = wdtick; in brcmf_sdbrcm_wd_timer()