diff options
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c')
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 322 |
1 files changed, 148 insertions, 174 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c index 22913af26db8..43ba0dd48354 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | |||
@@ -91,7 +91,6 @@ struct rte_console { | |||
91 | #include "dhd_bus.h" | 91 | #include "dhd_bus.h" |
92 | #include "dhd_proto.h" | 92 | #include "dhd_proto.h" |
93 | #include "dhd_dbg.h" | 93 | #include "dhd_dbg.h" |
94 | #include <bcmchip.h> | ||
95 | 94 | ||
96 | #define TXQLEN 2048 /* bulk tx queue length */ | 95 | #define TXQLEN 2048 /* bulk tx queue length */ |
97 | #define TXHI (TXQLEN - 256) /* turn on flow control above TXHI */ | 96 | #define TXHI (TXQLEN - 256) /* turn on flow control above TXHI */ |
@@ -310,6 +309,11 @@ struct rte_console { | |||
310 | /* Flags for SDH calls */ | 309 | /* Flags for SDH calls */ |
311 | #define F2SYNC (SDIO_REQ_4BYTE | SDIO_REQ_FIXED) | 310 | #define F2SYNC (SDIO_REQ_4BYTE | SDIO_REQ_FIXED) |
312 | 311 | ||
312 | #define BRCMFMAC_FW_NAME "brcm/brcmfmac.bin" | ||
313 | #define BRCMFMAC_NV_NAME "brcm/brcmfmac.txt" | ||
314 | MODULE_FIRMWARE(BRCMFMAC_FW_NAME); | ||
315 | MODULE_FIRMWARE(BRCMFMAC_NV_NAME); | ||
316 | |||
313 | /* | 317 | /* |
314 | * Conversion of 802.1D priority to precedence level | 318 | * Conversion of 802.1D priority to precedence level |
315 | */ | 319 | */ |
@@ -445,7 +449,7 @@ struct sdpcm_shared_le { | |||
445 | 449 | ||
446 | /* misc chip info needed by some of the routines */ | 450 | /* misc chip info needed by some of the routines */ |
447 | /* Private data for SDIO bus interaction */ | 451 | /* Private data for SDIO bus interaction */ |
448 | struct brcmf_bus { | 452 | struct brcmf_sdio { |
449 | struct brcmf_pub *drvr; | 453 | struct brcmf_pub *drvr; |
450 | 454 | ||
451 | struct brcmf_sdio_dev *sdiodev; /* sdio device handler */ | 455 | struct brcmf_sdio_dev *sdiodev; /* sdio device handler */ |
@@ -562,9 +566,7 @@ struct brcmf_bus { | |||
562 | 566 | ||
563 | struct semaphore sdsem; | 567 | struct semaphore sdsem; |
564 | 568 | ||
565 | const char *fw_name; | ||
566 | const struct firmware *firmware; | 569 | const struct firmware *firmware; |
567 | const char *nv_name; | ||
568 | u32 fw_ptr; | 570 | u32 fw_ptr; |
569 | }; | 571 | }; |
570 | 572 | ||
@@ -602,7 +604,7 @@ static void pkt_align(struct sk_buff *p, int len, int align) | |||
602 | } | 604 | } |
603 | 605 | ||
604 | /* To check if there's window offered */ | 606 | /* To check if there's window offered */ |
605 | static bool data_ok(struct brcmf_bus *bus) | 607 | static bool data_ok(struct brcmf_sdio *bus) |
606 | { | 608 | { |
607 | return (u8)(bus->tx_max - bus->tx_seq) != 0 && | 609 | return (u8)(bus->tx_max - bus->tx_seq) != 0 && |
608 | ((u8)(bus->tx_max - bus->tx_seq) & 0x80) == 0; | 610 | ((u8)(bus->tx_max - bus->tx_seq) & 0x80) == 0; |
@@ -613,7 +615,7 @@ static bool data_ok(struct brcmf_bus *bus) | |||
613 | * adresses on the 32 bit backplane bus. | 615 | * adresses on the 32 bit backplane bus. |
614 | */ | 616 | */ |
615 | static void | 617 | static void |
616 | r_sdreg32(struct brcmf_bus *bus, u32 *regvar, u32 reg_offset, u32 *retryvar) | 618 | r_sdreg32(struct brcmf_sdio *bus, u32 *regvar, u32 reg_offset, u32 *retryvar) |
617 | { | 619 | { |
618 | u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); | 620 | u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); |
619 | *retryvar = 0; | 621 | *retryvar = 0; |
@@ -633,7 +635,7 @@ r_sdreg32(struct brcmf_bus *bus, u32 *regvar, u32 reg_offset, u32 *retryvar) | |||
633 | } | 635 | } |
634 | 636 | ||
635 | static void | 637 | static void |
636 | w_sdreg32(struct brcmf_bus *bus, u32 regval, u32 reg_offset, u32 *retryvar) | 638 | w_sdreg32(struct brcmf_sdio *bus, u32 regval, u32 reg_offset, u32 *retryvar) |
637 | { | 639 | { |
638 | u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); | 640 | u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); |
639 | *retryvar = 0; | 641 | *retryvar = 0; |
@@ -658,14 +660,14 @@ w_sdreg32(struct brcmf_bus *bus, u32 regval, u32 reg_offset, u32 *retryvar) | |||
658 | /* Packet free applicable unconditionally for sdio and sdspi. | 660 | /* Packet free applicable unconditionally for sdio and sdspi. |
659 | * Conditional if bufpool was present for gspi bus. | 661 | * Conditional if bufpool was present for gspi bus. |
660 | */ | 662 | */ |
661 | static void brcmf_sdbrcm_pktfree2(struct brcmf_bus *bus, struct sk_buff *pkt) | 663 | static void brcmf_sdbrcm_pktfree2(struct brcmf_sdio *bus, struct sk_buff *pkt) |
662 | { | 664 | { |
663 | if (bus->usebufpool) | 665 | if (bus->usebufpool) |
664 | brcmu_pkt_buf_free_skb(pkt); | 666 | brcmu_pkt_buf_free_skb(pkt); |
665 | } | 667 | } |
666 | 668 | ||
667 | /* Turn backplane clock on or off */ | 669 | /* Turn backplane clock on or off */ |
668 | static int brcmf_sdbrcm_htclk(struct brcmf_bus *bus, bool on, bool pendok) | 670 | static int brcmf_sdbrcm_htclk(struct brcmf_sdio *bus, bool on, bool pendok) |
669 | { | 671 | { |
670 | int err; | 672 | int err; |
671 | u8 clkctl, clkreq, devctl; | 673 | u8 clkctl, clkreq, devctl; |
@@ -786,7 +788,7 @@ static int brcmf_sdbrcm_htclk(struct brcmf_bus *bus, bool on, bool pendok) | |||
786 | } | 788 | } |
787 | 789 | ||
788 | /* Change idle/active SD state */ | 790 | /* Change idle/active SD state */ |
789 | static int brcmf_sdbrcm_sdclk(struct brcmf_bus *bus, bool on) | 791 | static int brcmf_sdbrcm_sdclk(struct brcmf_sdio *bus, bool on) |
790 | { | 792 | { |
791 | brcmf_dbg(TRACE, "Enter\n"); | 793 | brcmf_dbg(TRACE, "Enter\n"); |
792 | 794 | ||
@@ -799,7 +801,7 @@ static int brcmf_sdbrcm_sdclk(struct brcmf_bus *bus, bool on) | |||
799 | } | 801 | } |
800 | 802 | ||
801 | /* Transition SD and backplane clock readiness */ | 803 | /* Transition SD and backplane clock readiness */ |
802 | static int brcmf_sdbrcm_clkctl(struct brcmf_bus *bus, uint target, bool pendok) | 804 | static int brcmf_sdbrcm_clkctl(struct brcmf_sdio *bus, uint target, bool pendok) |
803 | { | 805 | { |
804 | #ifdef BCMDBG | 806 | #ifdef BCMDBG |
805 | uint oldstate = bus->clkstate; | 807 | uint oldstate = bus->clkstate; |
@@ -855,7 +857,7 @@ static int brcmf_sdbrcm_clkctl(struct brcmf_bus *bus, uint target, bool pendok) | |||
855 | return 0; | 857 | return 0; |
856 | } | 858 | } |
857 | 859 | ||
858 | static int brcmf_sdbrcm_bussleep(struct brcmf_bus *bus, bool sleep) | 860 | static int brcmf_sdbrcm_bussleep(struct brcmf_sdio *bus, bool sleep) |
859 | { | 861 | { |
860 | uint retries = 0; | 862 | uint retries = 0; |
861 | 863 | ||
@@ -927,13 +929,13 @@ static int brcmf_sdbrcm_bussleep(struct brcmf_bus *bus, bool sleep) | |||
927 | return 0; | 929 | return 0; |
928 | } | 930 | } |
929 | 931 | ||
930 | static void bus_wake(struct brcmf_bus *bus) | 932 | static void bus_wake(struct brcmf_sdio *bus) |
931 | { | 933 | { |
932 | if (bus->sleeping) | 934 | if (bus->sleeping) |
933 | brcmf_sdbrcm_bussleep(bus, false); | 935 | brcmf_sdbrcm_bussleep(bus, false); |
934 | } | 936 | } |
935 | 937 | ||
936 | static u32 brcmf_sdbrcm_hostmail(struct brcmf_bus *bus) | 938 | static u32 brcmf_sdbrcm_hostmail(struct brcmf_sdio *bus) |
937 | { | 939 | { |
938 | u32 intstatus = 0; | 940 | u32 intstatus = 0; |
939 | u32 hmb_data; | 941 | u32 hmb_data; |
@@ -1009,7 +1011,7 @@ static u32 brcmf_sdbrcm_hostmail(struct brcmf_bus *bus) | |||
1009 | return intstatus; | 1011 | return intstatus; |
1010 | } | 1012 | } |
1011 | 1013 | ||
1012 | static void brcmf_sdbrcm_rxfail(struct brcmf_bus *bus, bool abort, bool rtx) | 1014 | static void brcmf_sdbrcm_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx) |
1013 | { | 1015 | { |
1014 | uint retries = 0; | 1016 | uint retries = 0; |
1015 | u16 lastrbc; | 1017 | u16 lastrbc; |
@@ -1066,11 +1068,11 @@ static void brcmf_sdbrcm_rxfail(struct brcmf_bus *bus, bool abort, bool rtx) | |||
1066 | 1068 | ||
1067 | /* If we can't reach the device, signal failure */ | 1069 | /* If we can't reach the device, signal failure */ |
1068 | if (err || brcmf_sdcard_regfail(bus->sdiodev)) | 1070 | if (err || brcmf_sdcard_regfail(bus->sdiodev)) |
1069 | bus->drvr->busstate = BRCMF_BUS_DOWN; | 1071 | bus->drvr->bus_if->state = BRCMF_BUS_DOWN; |
1070 | } | 1072 | } |
1071 | 1073 | ||
1072 | /* copy a buffer into a pkt buffer chain */ | 1074 | /* copy a buffer into a pkt buffer chain */ |
1073 | static uint brcmf_sdbrcm_glom_from_buf(struct brcmf_bus *bus, uint len) | 1075 | static uint brcmf_sdbrcm_glom_from_buf(struct brcmf_sdio *bus, uint len) |
1074 | { | 1076 | { |
1075 | uint n, ret = 0; | 1077 | uint n, ret = 0; |
1076 | struct sk_buff *p; | 1078 | struct sk_buff *p; |
@@ -1093,7 +1095,7 @@ static uint brcmf_sdbrcm_glom_from_buf(struct brcmf_bus *bus, uint len) | |||
1093 | } | 1095 | } |
1094 | 1096 | ||
1095 | /* return total length of buffer chain */ | 1097 | /* return total length of buffer chain */ |
1096 | static uint brcmf_sdbrcm_glom_len(struct brcmf_bus *bus) | 1098 | static uint brcmf_sdbrcm_glom_len(struct brcmf_sdio *bus) |
1097 | { | 1099 | { |
1098 | struct sk_buff *p; | 1100 | struct sk_buff *p; |
1099 | uint total; | 1101 | uint total; |
@@ -1104,7 +1106,7 @@ static uint brcmf_sdbrcm_glom_len(struct brcmf_bus *bus) | |||
1104 | return total; | 1106 | return total; |
1105 | } | 1107 | } |
1106 | 1108 | ||
1107 | static void brcmf_sdbrcm_free_glom(struct brcmf_bus *bus) | 1109 | static void brcmf_sdbrcm_free_glom(struct brcmf_sdio *bus) |
1108 | { | 1110 | { |
1109 | struct sk_buff *cur, *next; | 1111 | struct sk_buff *cur, *next; |
1110 | 1112 | ||
@@ -1114,13 +1116,13 @@ static void brcmf_sdbrcm_free_glom(struct brcmf_bus *bus) | |||
1114 | } | 1116 | } |
1115 | } | 1117 | } |
1116 | 1118 | ||
1117 | static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq) | 1119 | static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq) |
1118 | { | 1120 | { |
1119 | u16 dlen, totlen; | 1121 | u16 dlen, totlen; |
1120 | u8 *dptr, num = 0; | 1122 | u8 *dptr, num = 0; |
1121 | 1123 | ||
1122 | u16 sublen, check; | 1124 | u16 sublen, check; |
1123 | struct sk_buff *pfirst, *plast, *pnext, *save_pfirst; | 1125 | struct sk_buff *pfirst, *pnext; |
1124 | 1126 | ||
1125 | int errcode; | 1127 | int errcode; |
1126 | u8 chan, seq, doff, sfdoff; | 1128 | u8 chan, seq, doff, sfdoff; |
@@ -1137,7 +1139,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq) | |||
1137 | 1139 | ||
1138 | /* If there's a descriptor, generate the packet chain */ | 1140 | /* If there's a descriptor, generate the packet chain */ |
1139 | if (bus->glomd) { | 1141 | if (bus->glomd) { |
1140 | pfirst = plast = pnext = NULL; | 1142 | pfirst = pnext = NULL; |
1141 | dlen = (u16) (bus->glomd->len); | 1143 | dlen = (u16) (bus->glomd->len); |
1142 | dptr = bus->glomd->data; | 1144 | dptr = bus->glomd->data; |
1143 | if (!dlen || (dlen & 1)) { | 1145 | if (!dlen || (dlen & 1)) { |
@@ -1228,17 +1230,14 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq) | |||
1228 | * packet and and copy into the chain. | 1230 | * packet and and copy into the chain. |
1229 | */ | 1231 | */ |
1230 | if (usechain) { | 1232 | if (usechain) { |
1231 | errcode = brcmf_sdcard_recv_buf(bus->sdiodev, | 1233 | errcode = brcmf_sdcard_recv_chain(bus->sdiodev, |
1232 | bus->sdiodev->sbwad, | 1234 | bus->sdiodev->sbwad, |
1233 | SDIO_FUNC_2, | 1235 | SDIO_FUNC_2, F2SYNC, &bus->glom); |
1234 | F2SYNC, (u8 *) pfirst->data, dlen, | ||
1235 | pfirst); | ||
1236 | } else if (bus->dataptr) { | 1236 | } else if (bus->dataptr) { |
1237 | errcode = brcmf_sdcard_recv_buf(bus->sdiodev, | 1237 | errcode = brcmf_sdcard_recv_buf(bus->sdiodev, |
1238 | bus->sdiodev->sbwad, | 1238 | bus->sdiodev->sbwad, |
1239 | SDIO_FUNC_2, | 1239 | SDIO_FUNC_2, F2SYNC, |
1240 | F2SYNC, bus->dataptr, dlen, | 1240 | bus->dataptr, dlen); |
1241 | NULL); | ||
1242 | sublen = (u16) brcmf_sdbrcm_glom_from_buf(bus, dlen); | 1241 | sublen = (u16) brcmf_sdbrcm_glom_from_buf(bus, dlen); |
1243 | if (sublen != dlen) { | 1242 | if (sublen != dlen) { |
1244 | brcmf_dbg(ERROR, "FAILED TO COPY, dlen %d sublen %d\n", | 1243 | brcmf_dbg(ERROR, "FAILED TO COPY, dlen %d sublen %d\n", |
@@ -1338,10 +1337,14 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq) | |||
1338 | /* Remove superframe header, remember offset */ | 1337 | /* Remove superframe header, remember offset */ |
1339 | skb_pull(pfirst, doff); | 1338 | skb_pull(pfirst, doff); |
1340 | sfdoff = doff; | 1339 | sfdoff = doff; |
1340 | num = 0; | ||
1341 | 1341 | ||
1342 | /* Validate all the subframe headers */ | 1342 | /* Validate all the subframe headers */ |
1343 | for (num = 0, pnext = pfirst; pnext && !errcode; | 1343 | skb_queue_walk(&bus->glom, pnext) { |
1344 | num++, pnext = pnext->next) { | 1344 | /* leave when invalid subframe is found */ |
1345 | if (errcode) | ||
1346 | break; | ||
1347 | |||
1345 | dptr = (u8 *) (pnext->data); | 1348 | dptr = (u8 *) (pnext->data); |
1346 | dlen = (u16) (pnext->len); | 1349 | dlen = (u16) (pnext->len); |
1347 | sublen = get_unaligned_le16(dptr); | 1350 | sublen = get_unaligned_le16(dptr); |
@@ -1374,6 +1377,8 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq) | |||
1374 | num, doff, sublen, SDPCM_HDRLEN); | 1377 | num, doff, sublen, SDPCM_HDRLEN); |
1375 | errcode = -1; | 1378 | errcode = -1; |
1376 | } | 1379 | } |
1380 | /* increase the subframe count */ | ||
1381 | num++; | ||
1377 | } | 1382 | } |
1378 | 1383 | ||
1379 | if (errcode) { | 1384 | if (errcode) { |
@@ -1394,13 +1399,8 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq) | |||
1394 | } | 1399 | } |
1395 | 1400 | ||
1396 | /* Basic SD framing looks ok - process each packet (header) */ | 1401 | /* Basic SD framing looks ok - process each packet (header) */ |
1397 | save_pfirst = pfirst; | ||
1398 | plast = NULL; | ||
1399 | |||
1400 | for (num = 0; pfirst; rxseq++, pfirst = pnext) { | ||
1401 | pnext = pfirst->next; | ||
1402 | pfirst->next = NULL; | ||
1403 | 1402 | ||
1403 | skb_queue_walk_safe(&bus->glom, pfirst, pnext) { | ||
1404 | dptr = (u8 *) (pfirst->data); | 1404 | dptr = (u8 *) (pfirst->data); |
1405 | sublen = get_unaligned_le16(dptr); | 1405 | sublen = get_unaligned_le16(dptr); |
1406 | chan = SDPCM_PACKET_CHANNEL(&dptr[SDPCM_FRAMETAG_LEN]); | 1406 | chan = SDPCM_PACKET_CHANNEL(&dptr[SDPCM_FRAMETAG_LEN]); |
@@ -1420,6 +1420,8 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq) | |||
1420 | bus->rx_badseq++; | 1420 | bus->rx_badseq++; |
1421 | rxseq = seq; | 1421 | rxseq = seq; |
1422 | } | 1422 | } |
1423 | rxseq++; | ||
1424 | |||
1423 | #ifdef BCMDBG | 1425 | #ifdef BCMDBG |
1424 | if (BRCMF_BYTES_ON() && BRCMF_DATA_ON()) { | 1426 | if (BRCMF_BYTES_ON() && BRCMF_DATA_ON()) { |
1425 | printk(KERN_DEBUG "Rx Subframe Data:\n"); | 1427 | printk(KERN_DEBUG "Rx Subframe Data:\n"); |
@@ -1432,36 +1434,22 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq) | |||
1432 | skb_pull(pfirst, doff); | 1434 | skb_pull(pfirst, doff); |
1433 | 1435 | ||
1434 | if (pfirst->len == 0) { | 1436 | if (pfirst->len == 0) { |
1437 | skb_unlink(pfirst, &bus->glom); | ||
1435 | brcmu_pkt_buf_free_skb(pfirst); | 1438 | brcmu_pkt_buf_free_skb(pfirst); |
1436 | if (plast) | ||
1437 | plast->next = pnext; | ||
1438 | else | ||
1439 | save_pfirst = pnext; | ||
1440 | |||
1441 | continue; | 1439 | continue; |
1442 | } else if (brcmf_proto_hdrpull(bus->drvr, &ifidx, | 1440 | } else if (brcmf_proto_hdrpull(bus->drvr, &ifidx, |
1443 | pfirst) != 0) { | 1441 | pfirst) != 0) { |
1444 | brcmf_dbg(ERROR, "rx protocol error\n"); | 1442 | brcmf_dbg(ERROR, "rx protocol error\n"); |
1445 | bus->drvr->rx_errors++; | 1443 | bus->drvr->rx_errors++; |
1444 | skb_unlink(pfirst, &bus->glom); | ||
1446 | brcmu_pkt_buf_free_skb(pfirst); | 1445 | brcmu_pkt_buf_free_skb(pfirst); |
1447 | if (plast) | ||
1448 | plast->next = pnext; | ||
1449 | else | ||
1450 | save_pfirst = pnext; | ||
1451 | |||
1452 | continue; | 1446 | continue; |
1453 | } | 1447 | } |
1454 | 1448 | ||
1455 | /* this packet will go up, link back into | ||
1456 | chain and count it */ | ||
1457 | pfirst->next = pnext; | ||
1458 | plast = pfirst; | ||
1459 | num++; | ||
1460 | |||
1461 | #ifdef BCMDBG | 1449 | #ifdef BCMDBG |
1462 | if (BRCMF_GLOM_ON()) { | 1450 | if (BRCMF_GLOM_ON()) { |
1463 | brcmf_dbg(GLOM, "subframe %d to stack, %p (%p/%d) nxt/lnk %p/%p\n", | 1451 | brcmf_dbg(GLOM, "subframe %d to stack, %p (%p/%d) nxt/lnk %p/%p\n", |
1464 | num, pfirst, pfirst->data, | 1452 | bus->glom.qlen, pfirst, pfirst->data, |
1465 | pfirst->len, pfirst->next, | 1453 | pfirst->len, pfirst->next, |
1466 | pfirst->prev); | 1454 | pfirst->prev); |
1467 | print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, | 1455 | print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, |
@@ -1470,19 +1458,20 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq) | |||
1470 | } | 1458 | } |
1471 | #endif /* BCMDBG */ | 1459 | #endif /* BCMDBG */ |
1472 | } | 1460 | } |
1473 | if (num) { | 1461 | /* sent any remaining packets up */ |
1462 | if (bus->glom.qlen) { | ||
1474 | up(&bus->sdsem); | 1463 | up(&bus->sdsem); |
1475 | brcmf_rx_frame(bus->drvr, ifidx, save_pfirst, num); | 1464 | brcmf_rx_frame(bus->drvr, ifidx, &bus->glom); |
1476 | down(&bus->sdsem); | 1465 | down(&bus->sdsem); |
1477 | } | 1466 | } |
1478 | 1467 | ||
1479 | bus->rxglomframes++; | 1468 | bus->rxglomframes++; |
1480 | bus->rxglompkts += num; | 1469 | bus->rxglompkts += bus->glom.qlen; |
1481 | } | 1470 | } |
1482 | return num; | 1471 | return num; |
1483 | } | 1472 | } |
1484 | 1473 | ||
1485 | static int brcmf_sdbrcm_dcmd_resp_wait(struct brcmf_bus *bus, uint *condition, | 1474 | static int brcmf_sdbrcm_dcmd_resp_wait(struct brcmf_sdio *bus, uint *condition, |
1486 | bool *pending) | 1475 | bool *pending) |
1487 | { | 1476 | { |
1488 | DECLARE_WAITQUEUE(wait, current); | 1477 | DECLARE_WAITQUEUE(wait, current); |
@@ -1504,7 +1493,7 @@ static int brcmf_sdbrcm_dcmd_resp_wait(struct brcmf_bus *bus, uint *condition, | |||
1504 | return timeout; | 1493 | return timeout; |
1505 | } | 1494 | } |
1506 | 1495 | ||
1507 | static int brcmf_sdbrcm_dcmd_resp_wake(struct brcmf_bus *bus) | 1496 | static int brcmf_sdbrcm_dcmd_resp_wake(struct brcmf_sdio *bus) |
1508 | { | 1497 | { |
1509 | if (waitqueue_active(&bus->dcmd_resp_wait)) | 1498 | if (waitqueue_active(&bus->dcmd_resp_wait)) |
1510 | wake_up_interruptible(&bus->dcmd_resp_wait); | 1499 | wake_up_interruptible(&bus->dcmd_resp_wait); |
@@ -1512,7 +1501,7 @@ static int brcmf_sdbrcm_dcmd_resp_wake(struct brcmf_bus *bus) | |||
1512 | return 0; | 1501 | return 0; |
1513 | } | 1502 | } |
1514 | static void | 1503 | static void |
1515 | brcmf_sdbrcm_read_control(struct brcmf_bus *bus, u8 *hdr, uint len, uint doff) | 1504 | brcmf_sdbrcm_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff) |
1516 | { | 1505 | { |
1517 | uint rdlen, pad; | 1506 | uint rdlen, pad; |
1518 | 1507 | ||
@@ -1570,8 +1559,7 @@ brcmf_sdbrcm_read_control(struct brcmf_bus *bus, u8 *hdr, uint len, uint doff) | |||
1570 | sdret = brcmf_sdcard_recv_buf(bus->sdiodev, | 1559 | sdret = brcmf_sdcard_recv_buf(bus->sdiodev, |
1571 | bus->sdiodev->sbwad, | 1560 | bus->sdiodev->sbwad, |
1572 | SDIO_FUNC_2, | 1561 | SDIO_FUNC_2, |
1573 | F2SYNC, (bus->rxctl + BRCMF_FIRSTREAD), rdlen, | 1562 | F2SYNC, (bus->rxctl + BRCMF_FIRSTREAD), rdlen); |
1574 | NULL); | ||
1575 | bus->f2rxdata++; | 1563 | bus->f2rxdata++; |
1576 | 1564 | ||
1577 | /* Control frame failures need retransmission */ | 1565 | /* Control frame failures need retransmission */ |
@@ -1602,7 +1590,7 @@ done: | |||
1602 | } | 1590 | } |
1603 | 1591 | ||
1604 | /* Pad read to blocksize for efficiency */ | 1592 | /* Pad read to blocksize for efficiency */ |
1605 | static void brcmf_pad(struct brcmf_bus *bus, u16 *pad, u16 *rdlen) | 1593 | static void brcmf_pad(struct brcmf_sdio *bus, u16 *pad, u16 *rdlen) |
1606 | { | 1594 | { |
1607 | if (bus->roundup && bus->blocksize && *rdlen > bus->blocksize) { | 1595 | if (bus->roundup && bus->blocksize && *rdlen > bus->blocksize) { |
1608 | *pad = bus->blocksize - (*rdlen % bus->blocksize); | 1596 | *pad = bus->blocksize - (*rdlen % bus->blocksize); |
@@ -1615,7 +1603,7 @@ static void brcmf_pad(struct brcmf_bus *bus, u16 *pad, u16 *rdlen) | |||
1615 | } | 1603 | } |
1616 | 1604 | ||
1617 | static void | 1605 | static void |
1618 | brcmf_alloc_pkt_and_read(struct brcmf_bus *bus, u16 rdlen, | 1606 | brcmf_alloc_pkt_and_read(struct brcmf_sdio *bus, u16 rdlen, |
1619 | struct sk_buff **pkt, u8 **rxbuf) | 1607 | struct sk_buff **pkt, u8 **rxbuf) |
1620 | { | 1608 | { |
1621 | int sdret; /* Return code from calls */ | 1609 | int sdret; /* Return code from calls */ |
@@ -1627,9 +1615,8 @@ brcmf_alloc_pkt_and_read(struct brcmf_bus *bus, u16 rdlen, | |||
1627 | pkt_align(*pkt, rdlen, BRCMF_SDALIGN); | 1615 | pkt_align(*pkt, rdlen, BRCMF_SDALIGN); |
1628 | *rxbuf = (u8 *) ((*pkt)->data); | 1616 | *rxbuf = (u8 *) ((*pkt)->data); |
1629 | /* Read the entire frame */ | 1617 | /* Read the entire frame */ |
1630 | sdret = brcmf_sdcard_recv_buf(bus->sdiodev, bus->sdiodev->sbwad, | 1618 | sdret = brcmf_sdcard_recv_pkt(bus->sdiodev, bus->sdiodev->sbwad, |
1631 | SDIO_FUNC_2, F2SYNC, | 1619 | SDIO_FUNC_2, F2SYNC, *pkt); |
1632 | *rxbuf, rdlen, *pkt); | ||
1633 | bus->f2rxdata++; | 1620 | bus->f2rxdata++; |
1634 | 1621 | ||
1635 | if (sdret < 0) { | 1622 | if (sdret < 0) { |
@@ -1648,7 +1635,7 @@ brcmf_alloc_pkt_and_read(struct brcmf_bus *bus, u16 rdlen, | |||
1648 | 1635 | ||
1649 | /* Checks the header */ | 1636 | /* Checks the header */ |
1650 | static int | 1637 | static int |
1651 | brcmf_check_rxbuf(struct brcmf_bus *bus, struct sk_buff *pkt, u8 *rxbuf, | 1638 | brcmf_check_rxbuf(struct brcmf_sdio *bus, struct sk_buff *pkt, u8 *rxbuf, |
1652 | u8 rxseq, u16 nextlen, u16 *len) | 1639 | u8 rxseq, u16 nextlen, u16 *len) |
1653 | { | 1640 | { |
1654 | u16 check; | 1641 | u16 check; |
@@ -1704,7 +1691,7 @@ fail: | |||
1704 | 1691 | ||
1705 | /* Return true if there may be more frames to read */ | 1692 | /* Return true if there may be more frames to read */ |
1706 | static uint | 1693 | static uint |
1707 | brcmf_sdbrcm_readframes(struct brcmf_bus *bus, uint maxframes, bool *finished) | 1694 | brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished) |
1708 | { | 1695 | { |
1709 | u16 len, check; /* Extracted hardware header fields */ | 1696 | u16 len, check; /* Extracted hardware header fields */ |
1710 | u8 chan, seq, doff; /* Extracted software header fields */ | 1697 | u8 chan, seq, doff; /* Extracted software header fields */ |
@@ -1727,7 +1714,8 @@ brcmf_sdbrcm_readframes(struct brcmf_bus *bus, uint maxframes, bool *finished) | |||
1727 | *finished = false; | 1714 | *finished = false; |
1728 | 1715 | ||
1729 | for (rxseq = bus->rx_seq, rxleft = maxframes; | 1716 | for (rxseq = bus->rx_seq, rxleft = maxframes; |
1730 | !bus->rxskip && rxleft && bus->drvr->busstate != BRCMF_BUS_DOWN; | 1717 | !bus->rxskip && rxleft && |
1718 | bus->drvr->bus_if->state != BRCMF_BUS_DOWN; | ||
1731 | rxseq++, rxleft--) { | 1719 | rxseq++, rxleft--) { |
1732 | 1720 | ||
1733 | /* Handle glomming separately */ | 1721 | /* Handle glomming separately */ |
@@ -1857,7 +1845,7 @@ brcmf_sdbrcm_readframes(struct brcmf_bus *bus, uint maxframes, bool *finished) | |||
1857 | /* Read frame header (hardware and software) */ | 1845 | /* Read frame header (hardware and software) */ |
1858 | sdret = brcmf_sdcard_recv_buf(bus->sdiodev, bus->sdiodev->sbwad, | 1846 | sdret = brcmf_sdcard_recv_buf(bus->sdiodev, bus->sdiodev->sbwad, |
1859 | SDIO_FUNC_2, F2SYNC, bus->rxhdr, | 1847 | SDIO_FUNC_2, F2SYNC, bus->rxhdr, |
1860 | BRCMF_FIRSTREAD, NULL); | 1848 | BRCMF_FIRSTREAD); |
1861 | bus->f2rxhdrs++; | 1849 | bus->f2rxhdrs++; |
1862 | 1850 | ||
1863 | if (sdret < 0) { | 1851 | if (sdret < 0) { |
@@ -2006,9 +1994,8 @@ brcmf_sdbrcm_readframes(struct brcmf_bus *bus, uint maxframes, bool *finished) | |||
2006 | pkt_align(pkt, rdlen, BRCMF_SDALIGN); | 1994 | pkt_align(pkt, rdlen, BRCMF_SDALIGN); |
2007 | 1995 | ||
2008 | /* Read the remaining frame data */ | 1996 | /* Read the remaining frame data */ |
2009 | sdret = brcmf_sdcard_recv_buf(bus->sdiodev, bus->sdiodev->sbwad, | 1997 | sdret = brcmf_sdcard_recv_pkt(bus->sdiodev, bus->sdiodev->sbwad, |
2010 | SDIO_FUNC_2, F2SYNC, ((u8 *) (pkt->data)), | 1998 | SDIO_FUNC_2, F2SYNC, pkt); |
2011 | rdlen, pkt); | ||
2012 | bus->f2rxdata++; | 1999 | bus->f2rxdata++; |
2013 | 2000 | ||
2014 | if (sdret < 0) { | 2001 | if (sdret < 0) { |
@@ -2075,7 +2062,7 @@ deliver: | |||
2075 | 2062 | ||
2076 | /* Unlock during rx call */ | 2063 | /* Unlock during rx call */ |
2077 | up(&bus->sdsem); | 2064 | up(&bus->sdsem); |
2078 | brcmf_rx_frame(bus->drvr, ifidx, pkt, 1); | 2065 | brcmf_rx_packet(bus->drvr, ifidx, pkt); |
2079 | down(&bus->sdsem); | 2066 | down(&bus->sdsem); |
2080 | } | 2067 | } |
2081 | rxcount = maxframes - rxleft; | 2068 | rxcount = maxframes - rxleft; |
@@ -2095,16 +2082,8 @@ deliver: | |||
2095 | return rxcount; | 2082 | return rxcount; |
2096 | } | 2083 | } |
2097 | 2084 | ||
2098 | static int | ||
2099 | brcmf_sdbrcm_send_buf(struct brcmf_bus *bus, u32 addr, uint fn, uint flags, | ||
2100 | u8 *buf, uint nbytes, struct sk_buff *pkt) | ||
2101 | { | ||
2102 | return brcmf_sdcard_send_buf | ||
2103 | (bus->sdiodev, addr, fn, flags, buf, nbytes, pkt); | ||
2104 | } | ||
2105 | |||
2106 | static void | 2085 | static void |
2107 | brcmf_sdbrcm_wait_for_event(struct brcmf_bus *bus, bool *lockvar) | 2086 | brcmf_sdbrcm_wait_for_event(struct brcmf_sdio *bus, bool *lockvar) |
2108 | { | 2087 | { |
2109 | up(&bus->sdsem); | 2088 | up(&bus->sdsem); |
2110 | wait_event_interruptible_timeout(bus->ctrl_wait, | 2089 | wait_event_interruptible_timeout(bus->ctrl_wait, |
@@ -2114,7 +2093,7 @@ brcmf_sdbrcm_wait_for_event(struct brcmf_bus *bus, bool *lockvar) | |||
2114 | } | 2093 | } |
2115 | 2094 | ||
2116 | static void | 2095 | static void |
2117 | brcmf_sdbrcm_wait_event_wakeup(struct brcmf_bus *bus) | 2096 | brcmf_sdbrcm_wait_event_wakeup(struct brcmf_sdio *bus) |
2118 | { | 2097 | { |
2119 | if (waitqueue_active(&bus->ctrl_wait)) | 2098 | if (waitqueue_active(&bus->ctrl_wait)) |
2120 | wake_up_interruptible(&bus->ctrl_wait); | 2099 | wake_up_interruptible(&bus->ctrl_wait); |
@@ -2123,7 +2102,7 @@ brcmf_sdbrcm_wait_event_wakeup(struct brcmf_bus *bus) | |||
2123 | 2102 | ||
2124 | /* Writes a HW/SW header into the packet and sends it. */ | 2103 | /* Writes a HW/SW header into the packet and sends it. */ |
2125 | /* Assumes: (a) header space already there, (b) caller holds lock */ | 2104 | /* Assumes: (a) header space already there, (b) caller holds lock */ |
2126 | static int brcmf_sdbrcm_txpkt(struct brcmf_bus *bus, struct sk_buff *pkt, | 2105 | static int brcmf_sdbrcm_txpkt(struct brcmf_sdio *bus, struct sk_buff *pkt, |
2127 | uint chan, bool free_pkt) | 2106 | uint chan, bool free_pkt) |
2128 | { | 2107 | { |
2129 | int ret; | 2108 | int ret; |
@@ -2212,9 +2191,8 @@ static int brcmf_sdbrcm_txpkt(struct brcmf_bus *bus, struct sk_buff *pkt, | |||
2212 | if (len & (ALIGNMENT - 1)) | 2191 | if (len & (ALIGNMENT - 1)) |
2213 | len = roundup(len, ALIGNMENT); | 2192 | len = roundup(len, ALIGNMENT); |
2214 | 2193 | ||
2215 | ret = brcmf_sdbrcm_send_buf(bus, bus->sdiodev->sbwad, | 2194 | ret = brcmf_sdcard_send_pkt(bus->sdiodev, bus->sdiodev->sbwad, |
2216 | SDIO_FUNC_2, F2SYNC, frame, | 2195 | SDIO_FUNC_2, F2SYNC, pkt); |
2217 | len, pkt); | ||
2218 | bus->f2txdata++; | 2196 | bus->f2txdata++; |
2219 | 2197 | ||
2220 | if (ret < 0) { | 2198 | if (ret < 0) { |
@@ -2261,7 +2239,7 @@ done: | |||
2261 | return ret; | 2239 | return ret; |
2262 | } | 2240 | } |
2263 | 2241 | ||
2264 | static uint brcmf_sdbrcm_sendfromq(struct brcmf_bus *bus, uint maxframes) | 2242 | static uint brcmf_sdbrcm_sendfromq(struct brcmf_sdio *bus, uint maxframes) |
2265 | { | 2243 | { |
2266 | struct sk_buff *pkt; | 2244 | struct sk_buff *pkt; |
2267 | u32 intstatus = 0; | 2245 | u32 intstatus = 0; |
@@ -2309,14 +2287,14 @@ static uint brcmf_sdbrcm_sendfromq(struct brcmf_bus *bus, uint maxframes) | |||
2309 | } | 2287 | } |
2310 | 2288 | ||
2311 | /* Deflow-control stack if needed */ | 2289 | /* Deflow-control stack if needed */ |
2312 | if (drvr->up && (drvr->busstate == BRCMF_BUS_DATA) && | 2290 | if (drvr->up && (drvr->bus_if->state == BRCMF_BUS_DATA) && |
2313 | drvr->txoff && (pktq_len(&bus->txq) < TXLOW)) | 2291 | drvr->txoff && (pktq_len(&bus->txq) < TXLOW)) |
2314 | brcmf_txflowcontrol(drvr, 0, OFF); | 2292 | brcmf_txflowcontrol(drvr, 0, OFF); |
2315 | 2293 | ||
2316 | return cnt; | 2294 | return cnt; |
2317 | } | 2295 | } |
2318 | 2296 | ||
2319 | static bool brcmf_sdbrcm_dpc(struct brcmf_bus *bus) | 2297 | static bool brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) |
2320 | { | 2298 | { |
2321 | u32 intstatus, newstatus = 0; | 2299 | u32 intstatus, newstatus = 0; |
2322 | uint retries = 0; | 2300 | uint retries = 0; |
@@ -2344,7 +2322,7 @@ static bool brcmf_sdbrcm_dpc(struct brcmf_bus *bus) | |||
2344 | SBSDIO_DEVICE_CTL, &err); | 2322 | SBSDIO_DEVICE_CTL, &err); |
2345 | if (err) { | 2323 | if (err) { |
2346 | brcmf_dbg(ERROR, "error reading DEVCTL: %d\n", err); | 2324 | brcmf_dbg(ERROR, "error reading DEVCTL: %d\n", err); |
2347 | bus->drvr->busstate = BRCMF_BUS_DOWN; | 2325 | bus->drvr->bus_if->state = BRCMF_BUS_DOWN; |
2348 | } | 2326 | } |
2349 | #endif /* BCMDBG */ | 2327 | #endif /* BCMDBG */ |
2350 | 2328 | ||
@@ -2354,7 +2332,7 @@ static bool brcmf_sdbrcm_dpc(struct brcmf_bus *bus) | |||
2354 | if (err) { | 2332 | if (err) { |
2355 | brcmf_dbg(ERROR, "error reading CSR: %d\n", | 2333 | brcmf_dbg(ERROR, "error reading CSR: %d\n", |
2356 | err); | 2334 | err); |
2357 | bus->drvr->busstate = BRCMF_BUS_DOWN; | 2335 | bus->drvr->bus_if->state = BRCMF_BUS_DOWN; |
2358 | } | 2336 | } |
2359 | 2337 | ||
2360 | brcmf_dbg(INFO, "DPC: PENDING, devctl 0x%02x clkctl 0x%02x\n", | 2338 | brcmf_dbg(INFO, "DPC: PENDING, devctl 0x%02x clkctl 0x%02x\n", |
@@ -2367,7 +2345,7 @@ static bool brcmf_sdbrcm_dpc(struct brcmf_bus *bus) | |||
2367 | if (err) { | 2345 | if (err) { |
2368 | brcmf_dbg(ERROR, "error reading DEVCTL: %d\n", | 2346 | brcmf_dbg(ERROR, "error reading DEVCTL: %d\n", |
2369 | err); | 2347 | err); |
2370 | bus->drvr->busstate = BRCMF_BUS_DOWN; | 2348 | bus->drvr->bus_if->state = BRCMF_BUS_DOWN; |
2371 | } | 2349 | } |
2372 | devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; | 2350 | devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; |
2373 | brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, | 2351 | brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1, |
@@ -2375,7 +2353,7 @@ static bool brcmf_sdbrcm_dpc(struct brcmf_bus *bus) | |||
2375 | if (err) { | 2353 | if (err) { |
2376 | brcmf_dbg(ERROR, "error writing DEVCTL: %d\n", | 2354 | brcmf_dbg(ERROR, "error writing DEVCTL: %d\n", |
2377 | err); | 2355 | err); |
2378 | bus->drvr->busstate = BRCMF_BUS_DOWN; | 2356 | bus->drvr->bus_if->state = BRCMF_BUS_DOWN; |
2379 | } | 2357 | } |
2380 | bus->clkstate = CLK_AVAIL; | 2358 | bus->clkstate = CLK_AVAIL; |
2381 | } else { | 2359 | } else { |
@@ -2477,9 +2455,9 @@ clkwait: | |||
2477 | (bus->clkstate == CLK_AVAIL)) { | 2455 | (bus->clkstate == CLK_AVAIL)) { |
2478 | int ret, i; | 2456 | int ret, i; |
2479 | 2457 | ||
2480 | ret = brcmf_sdbrcm_send_buf(bus, bus->sdiodev->sbwad, | 2458 | ret = brcmf_sdcard_send_buf(bus->sdiodev, bus->sdiodev->sbwad, |
2481 | SDIO_FUNC_2, F2SYNC, (u8 *) bus->ctrl_frame_buf, | 2459 | SDIO_FUNC_2, F2SYNC, (u8 *) bus->ctrl_frame_buf, |
2482 | (u32) bus->ctrl_frame_len, NULL); | 2460 | (u32) bus->ctrl_frame_len); |
2483 | 2461 | ||
2484 | if (ret < 0) { | 2462 | if (ret < 0) { |
2485 | /* On failure, abort the command and | 2463 | /* On failure, abort the command and |
@@ -2531,11 +2509,11 @@ clkwait: | |||
2531 | else await next interrupt */ | 2509 | else await next interrupt */ |
2532 | /* On failed register access, all bets are off: | 2510 | /* On failed register access, all bets are off: |
2533 | no resched or interrupts */ | 2511 | no resched or interrupts */ |
2534 | if ((bus->drvr->busstate == BRCMF_BUS_DOWN) || | 2512 | if ((bus->drvr->bus_if->state == BRCMF_BUS_DOWN) || |
2535 | brcmf_sdcard_regfail(bus->sdiodev)) { | 2513 | brcmf_sdcard_regfail(bus->sdiodev)) { |
2536 | brcmf_dbg(ERROR, "failed backplane access over SDIO, halting operation %d\n", | 2514 | brcmf_dbg(ERROR, "failed backplane access over SDIO, halting operation %d\n", |
2537 | brcmf_sdcard_regfail(bus->sdiodev)); | 2515 | brcmf_sdcard_regfail(bus->sdiodev)); |
2538 | bus->drvr->busstate = BRCMF_BUS_DOWN; | 2516 | bus->drvr->bus_if->state = BRCMF_BUS_DOWN; |
2539 | bus->intstatus = 0; | 2517 | bus->intstatus = 0; |
2540 | } else if (bus->clkstate == CLK_PENDING) { | 2518 | } else if (bus->clkstate == CLK_PENDING) { |
2541 | brcmf_dbg(INFO, "rescheduled due to CLK_PENDING awaiting I_CHIPACTIVE interrupt\n"); | 2519 | brcmf_dbg(INFO, "rescheduled due to CLK_PENDING awaiting I_CHIPACTIVE interrupt\n"); |
@@ -2562,7 +2540,7 @@ clkwait: | |||
2562 | 2540 | ||
2563 | static int brcmf_sdbrcm_dpc_thread(void *data) | 2541 | static int brcmf_sdbrcm_dpc_thread(void *data) |
2564 | { | 2542 | { |
2565 | struct brcmf_bus *bus = (struct brcmf_bus *) data; | 2543 | struct brcmf_sdio *bus = (struct brcmf_sdio *) data; |
2566 | 2544 | ||
2567 | allow_signal(SIGTERM); | 2545 | allow_signal(SIGTERM); |
2568 | /* Run until signal received */ | 2546 | /* Run until signal received */ |
@@ -2572,12 +2550,12 @@ static int brcmf_sdbrcm_dpc_thread(void *data) | |||
2572 | if (!wait_for_completion_interruptible(&bus->dpc_wait)) { | 2550 | if (!wait_for_completion_interruptible(&bus->dpc_wait)) { |
2573 | /* Call bus dpc unless it indicated down | 2551 | /* Call bus dpc unless it indicated down |
2574 | (then clean stop) */ | 2552 | (then clean stop) */ |
2575 | if (bus->drvr->busstate != BRCMF_BUS_DOWN) { | 2553 | if (bus->drvr->bus_if->state != BRCMF_BUS_DOWN) { |
2576 | if (brcmf_sdbrcm_dpc(bus)) | 2554 | if (brcmf_sdbrcm_dpc(bus)) |
2577 | complete(&bus->dpc_wait); | 2555 | complete(&bus->dpc_wait); |
2578 | } else { | 2556 | } else { |
2579 | /* after stopping the bus, exit thread */ | 2557 | /* after stopping the bus, exit thread */ |
2580 | brcmf_sdbrcm_bus_stop(bus); | 2558 | brcmf_sdbrcm_bus_stop(bus->sdiodev->dev); |
2581 | bus->dpc_tsk = NULL; | 2559 | bus->dpc_tsk = NULL; |
2582 | break; | 2560 | break; |
2583 | } | 2561 | } |
@@ -2587,10 +2565,13 @@ static int brcmf_sdbrcm_dpc_thread(void *data) | |||
2587 | return 0; | 2565 | return 0; |
2588 | } | 2566 | } |
2589 | 2567 | ||
2590 | int brcmf_sdbrcm_bus_txdata(struct brcmf_bus *bus, struct sk_buff *pkt) | 2568 | int brcmf_sdbrcm_bus_txdata(struct device *dev, struct sk_buff *pkt) |
2591 | { | 2569 | { |
2592 | int ret = -EBADE; | 2570 | int ret = -EBADE; |
2593 | uint datalen, prec; | 2571 | uint datalen, prec; |
2572 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||
2573 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv; | ||
2574 | struct brcmf_sdio *bus = sdiodev->bus; | ||
2594 | 2575 | ||
2595 | brcmf_dbg(TRACE, "Enter\n"); | 2576 | brcmf_dbg(TRACE, "Enter\n"); |
2596 | 2577 | ||
@@ -2638,7 +2619,7 @@ int brcmf_sdbrcm_bus_txdata(struct brcmf_bus *bus, struct sk_buff *pkt) | |||
2638 | } | 2619 | } |
2639 | 2620 | ||
2640 | static int | 2621 | static int |
2641 | brcmf_sdbrcm_membytes(struct brcmf_bus *bus, bool write, u32 address, u8 *data, | 2622 | brcmf_sdbrcm_membytes(struct brcmf_sdio *bus, bool write, u32 address, u8 *data, |
2642 | uint size) | 2623 | uint size) |
2643 | { | 2624 | { |
2644 | int bcmerror = 0; | 2625 | int bcmerror = 0; |
@@ -2699,7 +2680,7 @@ xfer_done: | |||
2699 | #ifdef BCMDBG | 2680 | #ifdef BCMDBG |
2700 | #define CONSOLE_LINE_MAX 192 | 2681 | #define CONSOLE_LINE_MAX 192 |
2701 | 2682 | ||
2702 | static int brcmf_sdbrcm_readconsole(struct brcmf_bus *bus) | 2683 | static int brcmf_sdbrcm_readconsole(struct brcmf_sdio *bus) |
2703 | { | 2684 | { |
2704 | struct brcmf_console *c = &bus->console; | 2685 | struct brcmf_console *c = &bus->console; |
2705 | u8 line[CONSOLE_LINE_MAX], ch; | 2686 | u8 line[CONSOLE_LINE_MAX], ch; |
@@ -2776,14 +2757,14 @@ break2: | |||
2776 | } | 2757 | } |
2777 | #endif /* BCMDBG */ | 2758 | #endif /* BCMDBG */ |
2778 | 2759 | ||
2779 | static int brcmf_tx_frame(struct brcmf_bus *bus, u8 *frame, u16 len) | 2760 | static int brcmf_tx_frame(struct brcmf_sdio *bus, u8 *frame, u16 len) |
2780 | { | 2761 | { |
2781 | int i; | 2762 | int i; |
2782 | int ret; | 2763 | int ret; |
2783 | 2764 | ||
2784 | bus->ctrl_frame_stat = false; | 2765 | bus->ctrl_frame_stat = false; |
2785 | ret = brcmf_sdbrcm_send_buf(bus, bus->sdiodev->sbwad, | 2766 | ret = brcmf_sdcard_send_buf(bus->sdiodev, bus->sdiodev->sbwad, |
2786 | SDIO_FUNC_2, F2SYNC, frame, len, NULL); | 2767 | SDIO_FUNC_2, F2SYNC, frame, len); |
2787 | 2768 | ||
2788 | if (ret < 0) { | 2769 | if (ret < 0) { |
2789 | /* On failure, abort the command and terminate the frame */ | 2770 | /* On failure, abort the command and terminate the frame */ |
@@ -2819,7 +2800,7 @@ static int brcmf_tx_frame(struct brcmf_bus *bus, u8 *frame, u16 len) | |||
2819 | } | 2800 | } |
2820 | 2801 | ||
2821 | int | 2802 | int |
2822 | brcmf_sdbrcm_bus_txctl(struct brcmf_bus *bus, unsigned char *msg, uint msglen) | 2803 | brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen) |
2823 | { | 2804 | { |
2824 | u8 *frame; | 2805 | u8 *frame; |
2825 | u16 len; | 2806 | u16 len; |
@@ -2827,6 +2808,9 @@ brcmf_sdbrcm_bus_txctl(struct brcmf_bus *bus, unsigned char *msg, uint msglen) | |||
2827 | uint retries = 0; | 2808 | uint retries = 0; |
2828 | u8 doff = 0; | 2809 | u8 doff = 0; |
2829 | int ret = -1; | 2810 | int ret = -1; |
2811 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||
2812 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv; | ||
2813 | struct brcmf_sdio *bus = sdiodev->bus; | ||
2830 | 2814 | ||
2831 | brcmf_dbg(TRACE, "Enter\n"); | 2815 | brcmf_dbg(TRACE, "Enter\n"); |
2832 | 2816 | ||
@@ -2934,11 +2918,14 @@ brcmf_sdbrcm_bus_txctl(struct brcmf_bus *bus, unsigned char *msg, uint msglen) | |||
2934 | } | 2918 | } |
2935 | 2919 | ||
2936 | int | 2920 | int |
2937 | brcmf_sdbrcm_bus_rxctl(struct brcmf_bus *bus, unsigned char *msg, uint msglen) | 2921 | brcmf_sdbrcm_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen) |
2938 | { | 2922 | { |
2939 | int timeleft; | 2923 | int timeleft; |
2940 | uint rxlen = 0; | 2924 | uint rxlen = 0; |
2941 | bool pending; | 2925 | bool pending; |
2926 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||
2927 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv; | ||
2928 | struct brcmf_sdio *bus = sdiodev->bus; | ||
2942 | 2929 | ||
2943 | brcmf_dbg(TRACE, "Enter\n"); | 2930 | brcmf_dbg(TRACE, "Enter\n"); |
2944 | 2931 | ||
@@ -2971,7 +2958,7 @@ brcmf_sdbrcm_bus_rxctl(struct brcmf_bus *bus, unsigned char *msg, uint msglen) | |||
2971 | return rxlen ? (int)rxlen : -ETIMEDOUT; | 2958 | return rxlen ? (int)rxlen : -ETIMEDOUT; |
2972 | } | 2959 | } |
2973 | 2960 | ||
2974 | static int brcmf_sdbrcm_downloadvars(struct brcmf_bus *bus, void *arg, int len) | 2961 | static int brcmf_sdbrcm_downloadvars(struct brcmf_sdio *bus, void *arg, int len) |
2975 | { | 2962 | { |
2976 | int bcmerror = 0; | 2963 | int bcmerror = 0; |
2977 | 2964 | ||
@@ -3004,7 +2991,7 @@ err: | |||
3004 | return bcmerror; | 2991 | return bcmerror; |
3005 | } | 2992 | } |
3006 | 2993 | ||
3007 | static int brcmf_sdbrcm_write_vars(struct brcmf_bus *bus) | 2994 | static int brcmf_sdbrcm_write_vars(struct brcmf_sdio *bus) |
3008 | { | 2995 | { |
3009 | int bcmerror = 0; | 2996 | int bcmerror = 0; |
3010 | u32 varsize; | 2997 | u32 varsize; |
@@ -3091,7 +3078,7 @@ static int brcmf_sdbrcm_write_vars(struct brcmf_bus *bus) | |||
3091 | return bcmerror; | 3078 | return bcmerror; |
3092 | } | 3079 | } |
3093 | 3080 | ||
3094 | static int brcmf_sdbrcm_download_state(struct brcmf_bus *bus, bool enter) | 3081 | static int brcmf_sdbrcm_download_state(struct brcmf_sdio *bus, bool enter) |
3095 | { | 3082 | { |
3096 | uint retries; | 3083 | uint retries; |
3097 | int bcmerror = 0; | 3084 | int bcmerror = 0; |
@@ -3134,13 +3121,13 @@ static int brcmf_sdbrcm_download_state(struct brcmf_bus *bus, bool enter) | |||
3134 | /* Allow HT Clock now that the ARM is running. */ | 3121 | /* Allow HT Clock now that the ARM is running. */ |
3135 | bus->alp_only = false; | 3122 | bus->alp_only = false; |
3136 | 3123 | ||
3137 | bus->drvr->busstate = BRCMF_BUS_LOAD; | 3124 | bus->drvr->bus_if->state = BRCMF_BUS_LOAD; |
3138 | } | 3125 | } |
3139 | fail: | 3126 | fail: |
3140 | return bcmerror; | 3127 | return bcmerror; |
3141 | } | 3128 | } |
3142 | 3129 | ||
3143 | static int brcmf_sdbrcm_get_image(char *buf, int len, struct brcmf_bus *bus) | 3130 | static int brcmf_sdbrcm_get_image(char *buf, int len, struct brcmf_sdio *bus) |
3144 | { | 3131 | { |
3145 | if (bus->firmware->size < bus->fw_ptr + len) | 3132 | if (bus->firmware->size < bus->fw_ptr + len) |
3146 | len = bus->firmware->size - bus->fw_ptr; | 3133 | len = bus->firmware->size - bus->fw_ptr; |
@@ -3150,10 +3137,7 @@ static int brcmf_sdbrcm_get_image(char *buf, int len, struct brcmf_bus *bus) | |||
3150 | return len; | 3137 | return len; |
3151 | } | 3138 | } |
3152 | 3139 | ||
3153 | MODULE_FIRMWARE(BCM4329_FW_NAME); | 3140 | static int brcmf_sdbrcm_download_code_file(struct brcmf_sdio *bus) |
3154 | MODULE_FIRMWARE(BCM4329_NV_NAME); | ||
3155 | |||
3156 | static int brcmf_sdbrcm_download_code_file(struct brcmf_bus *bus) | ||
3157 | { | 3141 | { |
3158 | int offset = 0; | 3142 | int offset = 0; |
3159 | uint len; | 3143 | uint len; |
@@ -3162,8 +3146,7 @@ static int brcmf_sdbrcm_download_code_file(struct brcmf_bus *bus) | |||
3162 | 3146 | ||
3163 | brcmf_dbg(INFO, "Enter\n"); | 3147 | brcmf_dbg(INFO, "Enter\n"); |
3164 | 3148 | ||
3165 | bus->fw_name = BCM4329_FW_NAME; | 3149 | ret = request_firmware(&bus->firmware, BRCMFMAC_FW_NAME, |
3166 | ret = request_firmware(&bus->firmware, bus->fw_name, | ||
3167 | &bus->sdiodev->func[2]->dev); | 3150 | &bus->sdiodev->func[2]->dev); |
3168 | if (ret) { | 3151 | if (ret) { |
3169 | brcmf_dbg(ERROR, "Fail to request firmware %d\n", ret); | 3152 | brcmf_dbg(ERROR, "Fail to request firmware %d\n", ret); |
@@ -3253,15 +3236,14 @@ static uint brcmf_process_nvram_vars(char *varbuf, uint len) | |||
3253 | return buf_len; | 3236 | return buf_len; |
3254 | } | 3237 | } |
3255 | 3238 | ||
3256 | static int brcmf_sdbrcm_download_nvram(struct brcmf_bus *bus) | 3239 | static int brcmf_sdbrcm_download_nvram(struct brcmf_sdio *bus) |
3257 | { | 3240 | { |
3258 | uint len; | 3241 | uint len; |
3259 | char *memblock = NULL; | 3242 | char *memblock = NULL; |
3260 | char *bufp; | 3243 | char *bufp; |
3261 | int ret; | 3244 | int ret; |
3262 | 3245 | ||
3263 | bus->nv_name = BCM4329_NV_NAME; | 3246 | ret = request_firmware(&bus->firmware, BRCMFMAC_NV_NAME, |
3264 | ret = request_firmware(&bus->firmware, bus->nv_name, | ||
3265 | &bus->sdiodev->func[2]->dev); | 3247 | &bus->sdiodev->func[2]->dev); |
3266 | if (ret) { | 3248 | if (ret) { |
3267 | brcmf_dbg(ERROR, "Fail to request nvram %d\n", ret); | 3249 | brcmf_dbg(ERROR, "Fail to request nvram %d\n", ret); |
@@ -3301,7 +3283,7 @@ err: | |||
3301 | return ret; | 3283 | return ret; |
3302 | } | 3284 | } |
3303 | 3285 | ||
3304 | static int _brcmf_sdbrcm_download_firmware(struct brcmf_bus *bus) | 3286 | static int _brcmf_sdbrcm_download_firmware(struct brcmf_sdio *bus) |
3305 | { | 3287 | { |
3306 | int bcmerror = -1; | 3288 | int bcmerror = -1; |
3307 | 3289 | ||
@@ -3334,7 +3316,7 @@ err: | |||
3334 | } | 3316 | } |
3335 | 3317 | ||
3336 | static bool | 3318 | static bool |
3337 | brcmf_sdbrcm_download_firmware(struct brcmf_bus *bus) | 3319 | brcmf_sdbrcm_download_firmware(struct brcmf_sdio *bus) |
3338 | { | 3320 | { |
3339 | bool ret; | 3321 | bool ret; |
3340 | 3322 | ||
@@ -3348,12 +3330,15 @@ brcmf_sdbrcm_download_firmware(struct brcmf_bus *bus) | |||
3348 | return ret; | 3330 | return ret; |
3349 | } | 3331 | } |
3350 | 3332 | ||
3351 | void brcmf_sdbrcm_bus_stop(struct brcmf_bus *bus) | 3333 | void brcmf_sdbrcm_bus_stop(struct device *dev) |
3352 | { | 3334 | { |
3353 | u32 local_hostintmask; | 3335 | u32 local_hostintmask; |
3354 | u8 saveclk; | 3336 | u8 saveclk; |
3355 | uint retries; | 3337 | uint retries; |
3356 | int err; | 3338 | int err; |
3339 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||
3340 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv; | ||
3341 | struct brcmf_sdio *bus = sdiodev->bus; | ||
3357 | 3342 | ||
3358 | brcmf_dbg(TRACE, "Enter\n"); | 3343 | brcmf_dbg(TRACE, "Enter\n"); |
3359 | 3344 | ||
@@ -3382,7 +3367,7 @@ void brcmf_sdbrcm_bus_stop(struct brcmf_bus *bus) | |||
3382 | bus->hostintmask = 0; | 3367 | bus->hostintmask = 0; |
3383 | 3368 | ||
3384 | /* Change our idea of bus state */ | 3369 | /* Change our idea of bus state */ |
3385 | bus->drvr->busstate = BRCMF_BUS_DOWN; | 3370 | bus->drvr->bus_if->state = BRCMF_BUS_DOWN; |
3386 | 3371 | ||
3387 | /* Force clocks on backplane to be sure F2 interrupt propagates */ | 3372 | /* Force clocks on backplane to be sure F2 interrupt propagates */ |
3388 | saveclk = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, | 3373 | saveclk = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1, |
@@ -3426,9 +3411,11 @@ void brcmf_sdbrcm_bus_stop(struct brcmf_bus *bus) | |||
3426 | up(&bus->sdsem); | 3411 | up(&bus->sdsem); |
3427 | } | 3412 | } |
3428 | 3413 | ||
3429 | int brcmf_sdbrcm_bus_init(struct brcmf_pub *drvr) | 3414 | int brcmf_sdbrcm_bus_init(struct device *dev) |
3430 | { | 3415 | { |
3431 | struct brcmf_bus *bus = drvr->bus; | 3416 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); |
3417 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv; | ||
3418 | struct brcmf_sdio *bus = sdiodev->bus; | ||
3432 | unsigned long timeout; | 3419 | unsigned long timeout; |
3433 | uint retries = 0; | 3420 | uint retries = 0; |
3434 | u8 ready, enable; | 3421 | u8 ready, enable; |
@@ -3438,7 +3425,7 @@ int brcmf_sdbrcm_bus_init(struct brcmf_pub *drvr) | |||
3438 | brcmf_dbg(TRACE, "Enter\n"); | 3425 | brcmf_dbg(TRACE, "Enter\n"); |
3439 | 3426 | ||
3440 | /* try to download image and nvram to the dongle */ | 3427 | /* try to download image and nvram to the dongle */ |
3441 | if (drvr->busstate == BRCMF_BUS_DOWN) { | 3428 | if (bus_if->state == BRCMF_BUS_DOWN) { |
3442 | if (!(brcmf_sdbrcm_download_firmware(bus))) | 3429 | if (!(brcmf_sdbrcm_download_firmware(bus))) |
3443 | return -1; | 3430 | return -1; |
3444 | } | 3431 | } |
@@ -3504,7 +3491,7 @@ int brcmf_sdbrcm_bus_init(struct brcmf_pub *drvr) | |||
3504 | SBSDIO_WATERMARK, 8, &err); | 3491 | SBSDIO_WATERMARK, 8, &err); |
3505 | 3492 | ||
3506 | /* Set bus state according to enable result */ | 3493 | /* Set bus state according to enable result */ |
3507 | drvr->busstate = BRCMF_BUS_DATA; | 3494 | bus_if->state = BRCMF_BUS_DATA; |
3508 | } | 3495 | } |
3509 | 3496 | ||
3510 | else { | 3497 | else { |
@@ -3519,7 +3506,7 @@ int brcmf_sdbrcm_bus_init(struct brcmf_pub *drvr) | |||
3519 | SBSDIO_FUNC1_CHIPCLKCSR, saveclk, &err); | 3506 | SBSDIO_FUNC1_CHIPCLKCSR, saveclk, &err); |
3520 | 3507 | ||
3521 | /* If we didn't come up, turn off backplane clock */ | 3508 | /* If we didn't come up, turn off backplane clock */ |
3522 | if (drvr->busstate != BRCMF_BUS_DATA) | 3509 | if (bus_if->state != BRCMF_BUS_DATA) |
3523 | brcmf_sdbrcm_clkctl(bus, CLK_NONE, false); | 3510 | brcmf_sdbrcm_clkctl(bus, CLK_NONE, false); |
3524 | 3511 | ||
3525 | exit: | 3512 | exit: |
@@ -3530,7 +3517,7 @@ exit: | |||
3530 | 3517 | ||
3531 | void brcmf_sdbrcm_isr(void *arg) | 3518 | void brcmf_sdbrcm_isr(void *arg) |
3532 | { | 3519 | { |
3533 | struct brcmf_bus *bus = (struct brcmf_bus *) arg; | 3520 | struct brcmf_sdio *bus = (struct brcmf_sdio *) arg; |
3534 | 3521 | ||
3535 | brcmf_dbg(TRACE, "Enter\n"); | 3522 | brcmf_dbg(TRACE, "Enter\n"); |
3536 | 3523 | ||
@@ -3539,7 +3526,7 @@ void brcmf_sdbrcm_isr(void *arg) | |||
3539 | return; | 3526 | return; |
3540 | } | 3527 | } |
3541 | 3528 | ||
3542 | if (bus->drvr->busstate == BRCMF_BUS_DOWN) { | 3529 | if (bus->drvr->bus_if->state == BRCMF_BUS_DOWN) { |
3543 | brcmf_dbg(ERROR, "bus is down. we have nothing to do\n"); | 3530 | brcmf_dbg(ERROR, "bus is down. we have nothing to do\n"); |
3544 | return; | 3531 | return; |
3545 | } | 3532 | } |
@@ -3562,14 +3549,14 @@ void brcmf_sdbrcm_isr(void *arg) | |||
3562 | complete(&bus->dpc_wait); | 3549 | complete(&bus->dpc_wait); |
3563 | } | 3550 | } |
3564 | 3551 | ||
3565 | static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_pub *drvr) | 3552 | static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus) |
3566 | { | 3553 | { |
3567 | struct brcmf_bus *bus; | 3554 | #ifdef BCMDBG |
3555 | struct brcmf_bus *bus_if = dev_get_drvdata(bus->sdiodev->dev); | ||
3556 | #endif /* BCMDBG */ | ||
3568 | 3557 | ||
3569 | brcmf_dbg(TIMER, "Enter\n"); | 3558 | brcmf_dbg(TIMER, "Enter\n"); |
3570 | 3559 | ||
3571 | bus = drvr->bus; | ||
3572 | |||
3573 | /* Ignore the timer if simulating bus down */ | 3560 | /* Ignore the timer if simulating bus down */ |
3574 | if (bus->sleeping) | 3561 | if (bus->sleeping) |
3575 | return false; | 3562 | return false; |
@@ -3613,7 +3600,8 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_pub *drvr) | |||
3613 | } | 3600 | } |
3614 | #ifdef BCMDBG | 3601 | #ifdef BCMDBG |
3615 | /* Poll for console output periodically */ | 3602 | /* Poll for console output periodically */ |
3616 | if (drvr->busstate == BRCMF_BUS_DATA && bus->console_interval != 0) { | 3603 | if (bus_if->state == BRCMF_BUS_DATA && |
3604 | bus->console_interval != 0) { | ||
3617 | bus->console.count += BRCMF_WD_POLL_MS; | 3605 | bus->console.count += BRCMF_WD_POLL_MS; |
3618 | if (bus->console.count >= bus->console_interval) { | 3606 | if (bus->console.count >= bus->console_interval) { |
3619 | bus->console.count -= bus->console_interval; | 3607 | bus->console.count -= bus->console_interval; |
@@ -3648,10 +3636,12 @@ static bool brcmf_sdbrcm_chipmatch(u16 chipid) | |||
3648 | { | 3636 | { |
3649 | if (chipid == BCM4329_CHIP_ID) | 3637 | if (chipid == BCM4329_CHIP_ID) |
3650 | return true; | 3638 | return true; |
3639 | if (chipid == BCM4330_CHIP_ID) | ||
3640 | return true; | ||
3651 | return false; | 3641 | return false; |
3652 | } | 3642 | } |
3653 | 3643 | ||
3654 | static void brcmf_sdbrcm_release_malloc(struct brcmf_bus *bus) | 3644 | static void brcmf_sdbrcm_release_malloc(struct brcmf_sdio *bus) |
3655 | { | 3645 | { |
3656 | brcmf_dbg(TRACE, "Enter\n"); | 3646 | brcmf_dbg(TRACE, "Enter\n"); |
3657 | 3647 | ||
@@ -3663,7 +3653,7 @@ static void brcmf_sdbrcm_release_malloc(struct brcmf_bus *bus) | |||
3663 | bus->databuf = NULL; | 3653 | bus->databuf = NULL; |
3664 | } | 3654 | } |
3665 | 3655 | ||
3666 | static bool brcmf_sdbrcm_probe_malloc(struct brcmf_bus *bus) | 3656 | static bool brcmf_sdbrcm_probe_malloc(struct brcmf_sdio *bus) |
3667 | { | 3657 | { |
3668 | brcmf_dbg(TRACE, "Enter\n"); | 3658 | brcmf_dbg(TRACE, "Enter\n"); |
3669 | 3659 | ||
@@ -3699,7 +3689,7 @@ fail: | |||
3699 | } | 3689 | } |
3700 | 3690 | ||
3701 | static bool | 3691 | static bool |
3702 | brcmf_sdbrcm_probe_attach(struct brcmf_bus *bus, u32 regsva) | 3692 | brcmf_sdbrcm_probe_attach(struct brcmf_sdio *bus, u32 regsva) |
3703 | { | 3693 | { |
3704 | u8 clkctl = 0; | 3694 | u8 clkctl = 0; |
3705 | int err = 0; | 3695 | int err = 0; |
@@ -3784,7 +3774,7 @@ fail: | |||
3784 | return false; | 3774 | return false; |
3785 | } | 3775 | } |
3786 | 3776 | ||
3787 | static bool brcmf_sdbrcm_probe_init(struct brcmf_bus *bus) | 3777 | static bool brcmf_sdbrcm_probe_init(struct brcmf_sdio *bus) |
3788 | { | 3778 | { |
3789 | brcmf_dbg(TRACE, "Enter\n"); | 3779 | brcmf_dbg(TRACE, "Enter\n"); |
3790 | 3780 | ||
@@ -3792,7 +3782,7 @@ static bool brcmf_sdbrcm_probe_init(struct brcmf_bus *bus) | |||
3792 | brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_0, SDIO_CCCR_IOEx, | 3782 | brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_0, SDIO_CCCR_IOEx, |
3793 | SDIO_FUNC_ENABLE_1, NULL); | 3783 | SDIO_FUNC_ENABLE_1, NULL); |
3794 | 3784 | ||
3795 | bus->drvr->busstate = BRCMF_BUS_DOWN; | 3785 | bus->drvr->bus_if->state = BRCMF_BUS_DOWN; |
3796 | bus->sleeping = false; | 3786 | bus->sleeping = false; |
3797 | bus->rxflow = false; | 3787 | bus->rxflow = false; |
3798 | 3788 | ||
@@ -3819,7 +3809,7 @@ static bool brcmf_sdbrcm_probe_init(struct brcmf_bus *bus) | |||
3819 | static int | 3809 | static int |
3820 | brcmf_sdbrcm_watchdog_thread(void *data) | 3810 | brcmf_sdbrcm_watchdog_thread(void *data) |
3821 | { | 3811 | { |
3822 | struct brcmf_bus *bus = (struct brcmf_bus *)data; | 3812 | struct brcmf_sdio *bus = (struct brcmf_sdio *)data; |
3823 | 3813 | ||
3824 | allow_signal(SIGTERM); | 3814 | allow_signal(SIGTERM); |
3825 | /* Run until signal received */ | 3815 | /* Run until signal received */ |
@@ -3827,7 +3817,7 @@ brcmf_sdbrcm_watchdog_thread(void *data) | |||
3827 | if (kthread_should_stop()) | 3817 | if (kthread_should_stop()) |
3828 | break; | 3818 | break; |
3829 | if (!wait_for_completion_interruptible(&bus->watchdog_wait)) { | 3819 | if (!wait_for_completion_interruptible(&bus->watchdog_wait)) { |
3830 | brcmf_sdbrcm_bus_watchdog(bus->drvr); | 3820 | brcmf_sdbrcm_bus_watchdog(bus); |
3831 | /* Count the tick for reference */ | 3821 | /* Count the tick for reference */ |
3832 | bus->drvr->tickcnt++; | 3822 | bus->drvr->tickcnt++; |
3833 | } else | 3823 | } else |
@@ -3839,7 +3829,7 @@ brcmf_sdbrcm_watchdog_thread(void *data) | |||
3839 | static void | 3829 | static void |
3840 | brcmf_sdbrcm_watchdog(unsigned long data) | 3830 | brcmf_sdbrcm_watchdog(unsigned long data) |
3841 | { | 3831 | { |
3842 | struct brcmf_bus *bus = (struct brcmf_bus *)data; | 3832 | struct brcmf_sdio *bus = (struct brcmf_sdio *)data; |
3843 | 3833 | ||
3844 | if (bus->watchdog_tsk) { | 3834 | if (bus->watchdog_tsk) { |
3845 | complete(&bus->watchdog_wait); | 3835 | complete(&bus->watchdog_wait); |
@@ -3850,7 +3840,7 @@ brcmf_sdbrcm_watchdog(unsigned long data) | |||
3850 | } | 3840 | } |
3851 | } | 3841 | } |
3852 | 3842 | ||
3853 | static void brcmf_sdbrcm_release_dongle(struct brcmf_bus *bus) | 3843 | static void brcmf_sdbrcm_release_dongle(struct brcmf_sdio *bus) |
3854 | { | 3844 | { |
3855 | brcmf_dbg(TRACE, "Enter\n"); | 3845 | brcmf_dbg(TRACE, "Enter\n"); |
3856 | 3846 | ||
@@ -3867,7 +3857,7 @@ static void brcmf_sdbrcm_release_dongle(struct brcmf_bus *bus) | |||
3867 | } | 3857 | } |
3868 | 3858 | ||
3869 | /* Detach and free everything */ | 3859 | /* Detach and free everything */ |
3870 | static void brcmf_sdbrcm_release(struct brcmf_bus *bus) | 3860 | static void brcmf_sdbrcm_release(struct brcmf_sdio *bus) |
3871 | { | 3861 | { |
3872 | brcmf_dbg(TRACE, "Enter\n"); | 3862 | brcmf_dbg(TRACE, "Enter\n"); |
3873 | 3863 | ||
@@ -3889,21 +3879,10 @@ static void brcmf_sdbrcm_release(struct brcmf_bus *bus) | |||
3889 | brcmf_dbg(TRACE, "Disconnected\n"); | 3879 | brcmf_dbg(TRACE, "Disconnected\n"); |
3890 | } | 3880 | } |
3891 | 3881 | ||
3892 | void *brcmf_sdbrcm_probe(u16 bus_no, u16 slot, u16 func, uint bustype, | 3882 | void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev) |
3893 | u32 regsva, struct brcmf_sdio_dev *sdiodev) | ||
3894 | { | 3883 | { |
3895 | int ret; | 3884 | int ret; |
3896 | struct brcmf_bus *bus; | 3885 | struct brcmf_sdio *bus; |
3897 | |||
3898 | /* Init global variables at run-time, not as part of the declaration. | ||
3899 | * This is required to support init/de-init of the driver. | ||
3900 | * Initialization | ||
3901 | * of globals as part of the declaration results in non-deterministic | ||
3902 | * behavior since the value of the globals may be different on the | ||
3903 | * first time that the driver is initialized vs subsequent | ||
3904 | * initializations. | ||
3905 | */ | ||
3906 | brcmf_c_init(); | ||
3907 | 3886 | ||
3908 | brcmf_dbg(TRACE, "Enter\n"); | 3887 | brcmf_dbg(TRACE, "Enter\n"); |
3909 | 3888 | ||
@@ -3911,7 +3890,7 @@ void *brcmf_sdbrcm_probe(u16 bus_no, u16 slot, u16 func, uint bustype, | |||
3911 | * regsva == SI_ENUM_BASE*/ | 3890 | * regsva == SI_ENUM_BASE*/ |
3912 | 3891 | ||
3913 | /* Allocate private bus interface state */ | 3892 | /* Allocate private bus interface state */ |
3914 | bus = kzalloc(sizeof(struct brcmf_bus), GFP_ATOMIC); | 3893 | bus = kzalloc(sizeof(struct brcmf_sdio), GFP_ATOMIC); |
3915 | if (!bus) | 3894 | if (!bus) |
3916 | goto fail; | 3895 | goto fail; |
3917 | 3896 | ||
@@ -3963,7 +3942,7 @@ void *brcmf_sdbrcm_probe(u16 bus_no, u16 slot, u16 func, uint bustype, | |||
3963 | } | 3942 | } |
3964 | 3943 | ||
3965 | /* Attach to the brcmf/OS/network interface */ | 3944 | /* Attach to the brcmf/OS/network interface */ |
3966 | bus->drvr = brcmf_attach(bus, SDPCM_RESERVE); | 3945 | bus->drvr = brcmf_attach(bus, SDPCM_RESERVE, bus->sdiodev->dev); |
3967 | if (!bus->drvr) { | 3946 | if (!bus->drvr) { |
3968 | brcmf_dbg(ERROR, "brcmf_attach failed\n"); | 3947 | brcmf_dbg(ERROR, "brcmf_attach failed\n"); |
3969 | goto fail; | 3948 | goto fail; |
@@ -4015,7 +3994,7 @@ fail: | |||
4015 | 3994 | ||
4016 | void brcmf_sdbrcm_disconnect(void *ptr) | 3995 | void brcmf_sdbrcm_disconnect(void *ptr) |
4017 | { | 3996 | { |
4018 | struct brcmf_bus *bus = (struct brcmf_bus *)ptr; | 3997 | struct brcmf_sdio *bus = (struct brcmf_sdio *)ptr; |
4019 | 3998 | ||
4020 | brcmf_dbg(TRACE, "Enter\n"); | 3999 | brcmf_dbg(TRACE, "Enter\n"); |
4021 | 4000 | ||
@@ -4025,13 +4004,8 @@ void brcmf_sdbrcm_disconnect(void *ptr) | |||
4025 | brcmf_dbg(TRACE, "Disconnected\n"); | 4004 | brcmf_dbg(TRACE, "Disconnected\n"); |
4026 | } | 4005 | } |
4027 | 4006 | ||
4028 | struct device *brcmf_bus_get_device(struct brcmf_bus *bus) | ||
4029 | { | ||
4030 | return &bus->sdiodev->func[2]->dev; | ||
4031 | } | ||
4032 | |||
4033 | void | 4007 | void |
4034 | brcmf_sdbrcm_wd_timer(struct brcmf_bus *bus, uint wdtick) | 4008 | brcmf_sdbrcm_wd_timer(struct brcmf_sdio *bus, uint wdtick) |
4035 | { | 4009 | { |
4036 | /* Totally stop the timer */ | 4010 | /* Totally stop the timer */ |
4037 | if (!wdtick && bus->wd_timer_valid == true) { | 4011 | if (!wdtick && bus->wd_timer_valid == true) { |
@@ -4042,7 +4016,7 @@ brcmf_sdbrcm_wd_timer(struct brcmf_bus *bus, uint wdtick) | |||
4042 | } | 4016 | } |
4043 | 4017 | ||
4044 | /* don't start the wd until fw is loaded */ | 4018 | /* don't start the wd until fw is loaded */ |
4045 | if (bus->drvr->busstate == BRCMF_BUS_DOWN) | 4019 | if (bus->drvr->bus_if->state == BRCMF_BUS_DOWN) |
4046 | return; | 4020 | return; |
4047 | 4021 | ||
4048 | if (wdtick) { | 4022 | if (wdtick) { |