aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c322
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"
314MODULE_FIRMWARE(BRCMFMAC_FW_NAME);
315MODULE_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 */
448struct brcmf_bus { 452struct 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 */
605static bool data_ok(struct brcmf_bus *bus) 607static 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 */
615static void 617static void
616r_sdreg32(struct brcmf_bus *bus, u32 *regvar, u32 reg_offset, u32 *retryvar) 618r_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
635static void 637static void
636w_sdreg32(struct brcmf_bus *bus, u32 regval, u32 reg_offset, u32 *retryvar) 638w_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 */
661static void brcmf_sdbrcm_pktfree2(struct brcmf_bus *bus, struct sk_buff *pkt) 663static 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 */
668static int brcmf_sdbrcm_htclk(struct brcmf_bus *bus, bool on, bool pendok) 670static 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 */
789static int brcmf_sdbrcm_sdclk(struct brcmf_bus *bus, bool on) 791static 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 */
802static int brcmf_sdbrcm_clkctl(struct brcmf_bus *bus, uint target, bool pendok) 804static 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
858static int brcmf_sdbrcm_bussleep(struct brcmf_bus *bus, bool sleep) 860static 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
930static void bus_wake(struct brcmf_bus *bus) 932static 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
936static u32 brcmf_sdbrcm_hostmail(struct brcmf_bus *bus) 938static 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
1012static void brcmf_sdbrcm_rxfail(struct brcmf_bus *bus, bool abort, bool rtx) 1014static 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 */
1073static uint brcmf_sdbrcm_glom_from_buf(struct brcmf_bus *bus, uint len) 1075static 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 */
1096static uint brcmf_sdbrcm_glom_len(struct brcmf_bus *bus) 1098static 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
1107static void brcmf_sdbrcm_free_glom(struct brcmf_bus *bus) 1109static 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
1117static u8 brcmf_sdbrcm_rxglom(struct brcmf_bus *bus, u8 rxseq) 1119static 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
1485static int brcmf_sdbrcm_dcmd_resp_wait(struct brcmf_bus *bus, uint *condition, 1474static 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
1507static int brcmf_sdbrcm_dcmd_resp_wake(struct brcmf_bus *bus) 1496static 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}
1514static void 1503static void
1515brcmf_sdbrcm_read_control(struct brcmf_bus *bus, u8 *hdr, uint len, uint doff) 1504brcmf_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 */
1605static void brcmf_pad(struct brcmf_bus *bus, u16 *pad, u16 *rdlen) 1593static 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
1617static void 1605static void
1618brcmf_alloc_pkt_and_read(struct brcmf_bus *bus, u16 rdlen, 1606brcmf_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 */
1650static int 1637static int
1651brcmf_check_rxbuf(struct brcmf_bus *bus, struct sk_buff *pkt, u8 *rxbuf, 1638brcmf_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 */
1706static uint 1693static uint
1707brcmf_sdbrcm_readframes(struct brcmf_bus *bus, uint maxframes, bool *finished) 1694brcmf_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
2098static int
2099brcmf_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
2106static void 2085static void
2107brcmf_sdbrcm_wait_for_event(struct brcmf_bus *bus, bool *lockvar) 2086brcmf_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
2116static void 2095static void
2117brcmf_sdbrcm_wait_event_wakeup(struct brcmf_bus *bus) 2096brcmf_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 */
2126static int brcmf_sdbrcm_txpkt(struct brcmf_bus *bus, struct sk_buff *pkt, 2105static 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
2264static uint brcmf_sdbrcm_sendfromq(struct brcmf_bus *bus, uint maxframes) 2242static 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
2319static bool brcmf_sdbrcm_dpc(struct brcmf_bus *bus) 2297static 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
2563static int brcmf_sdbrcm_dpc_thread(void *data) 2541static 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
2590int brcmf_sdbrcm_bus_txdata(struct brcmf_bus *bus, struct sk_buff *pkt) 2568int 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
2640static int 2621static int
2641brcmf_sdbrcm_membytes(struct brcmf_bus *bus, bool write, u32 address, u8 *data, 2622brcmf_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
2702static int brcmf_sdbrcm_readconsole(struct brcmf_bus *bus) 2683static 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
2779static int brcmf_tx_frame(struct brcmf_bus *bus, u8 *frame, u16 len) 2760static 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
2821int 2802int
2822brcmf_sdbrcm_bus_txctl(struct brcmf_bus *bus, unsigned char *msg, uint msglen) 2803brcmf_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
2936int 2920int
2937brcmf_sdbrcm_bus_rxctl(struct brcmf_bus *bus, unsigned char *msg, uint msglen) 2921brcmf_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
2974static int brcmf_sdbrcm_downloadvars(struct brcmf_bus *bus, void *arg, int len) 2961static 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
3007static int brcmf_sdbrcm_write_vars(struct brcmf_bus *bus) 2994static 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
3094static int brcmf_sdbrcm_download_state(struct brcmf_bus *bus, bool enter) 3081static 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 }
3139fail: 3126fail:
3140 return bcmerror; 3127 return bcmerror;
3141} 3128}
3142 3129
3143static int brcmf_sdbrcm_get_image(char *buf, int len, struct brcmf_bus *bus) 3130static 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
3153MODULE_FIRMWARE(BCM4329_FW_NAME); 3140static int brcmf_sdbrcm_download_code_file(struct brcmf_sdio *bus)
3154MODULE_FIRMWARE(BCM4329_NV_NAME);
3155
3156static 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
3256static int brcmf_sdbrcm_download_nvram(struct brcmf_bus *bus) 3239static 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
3304static int _brcmf_sdbrcm_download_firmware(struct brcmf_bus *bus) 3286static 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
3336static bool 3318static bool
3337brcmf_sdbrcm_download_firmware(struct brcmf_bus *bus) 3319brcmf_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
3351void brcmf_sdbrcm_bus_stop(struct brcmf_bus *bus) 3333void 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
3429int brcmf_sdbrcm_bus_init(struct brcmf_pub *drvr) 3414int 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
3525exit: 3512exit:
@@ -3530,7 +3517,7 @@ exit:
3530 3517
3531void brcmf_sdbrcm_isr(void *arg) 3518void 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
3565static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_pub *drvr) 3552static 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
3654static void brcmf_sdbrcm_release_malloc(struct brcmf_bus *bus) 3644static 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
3666static bool brcmf_sdbrcm_probe_malloc(struct brcmf_bus *bus) 3656static 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
3701static bool 3691static bool
3702brcmf_sdbrcm_probe_attach(struct brcmf_bus *bus, u32 regsva) 3692brcmf_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
3787static bool brcmf_sdbrcm_probe_init(struct brcmf_bus *bus) 3777static 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)
3819static int 3809static int
3820brcmf_sdbrcm_watchdog_thread(void *data) 3810brcmf_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)
3839static void 3829static void
3840brcmf_sdbrcm_watchdog(unsigned long data) 3830brcmf_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
3853static void brcmf_sdbrcm_release_dongle(struct brcmf_bus *bus) 3843static 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 */
3870static void brcmf_sdbrcm_release(struct brcmf_bus *bus) 3860static 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
3892void *brcmf_sdbrcm_probe(u16 bus_no, u16 slot, u16 func, uint bustype, 3882void *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
4016void brcmf_sdbrcm_disconnect(void *ptr) 3995void 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
4028struct device *brcmf_bus_get_device(struct brcmf_bus *bus)
4029{
4030 return &bus->sdiodev->func[2]->dev;
4031}
4032
4033void 4007void
4034brcmf_sdbrcm_wd_timer(struct brcmf_bus *bus, uint wdtick) 4008brcmf_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) {