diff options
author | John W. Linville <linville@tuxdriver.com> | 2014-01-01 15:39:56 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-01-01 15:39:56 -0500 |
commit | ad86c55bac643a745f480d26689d153ec0f38b04 (patch) | |
tree | 8ae3e20d2f3619021393166fe1f50a8ca00c1c33 /drivers/net/wireless/brcm80211 | |
parent | 21eb218989523b7bee28900aaec9f9296b70fa27 (diff) | |
parent | 39731b78b4afebb7501c05b68e2443a1b250b41c (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next into for-davem
Diffstat (limited to 'drivers/net/wireless/brcm80211')
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/Makefile | 1 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/bcdc.c | 79 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c | 628 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c | 552 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h | 8 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 740 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/fwil.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c | 41 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/proto.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/proto.h | 14 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c | 296 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h | 82 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/usb.c | 1 |
14 files changed, 1108 insertions, 1350 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/Makefile b/drivers/net/wireless/brcm80211/brcmfmac/Makefile index 2082402d4b63..5681b9862023 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/Makefile +++ b/drivers/net/wireless/brcm80211/brcmfmac/Makefile | |||
@@ -36,7 +36,6 @@ brcmfmac-objs += \ | |||
36 | brcmfmac-$(CONFIG_BRCMFMAC_SDIO) += \ | 36 | brcmfmac-$(CONFIG_BRCMFMAC_SDIO) += \ |
37 | dhd_sdio.o \ | 37 | dhd_sdio.o \ |
38 | bcmsdh.o \ | 38 | bcmsdh.o \ |
39 | bcmsdh_sdmmc.o \ | ||
40 | sdio_chip.o | 39 | sdio_chip.o |
41 | brcmfmac-$(CONFIG_BRCMFMAC_USB) += \ | 40 | brcmfmac-$(CONFIG_BRCMFMAC_USB) += \ |
42 | usb.o | 41 | usb.o |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c b/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c index 06848e426f9a..12c27d13df7f 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c | |||
@@ -101,35 +101,41 @@ struct brcmf_proto_bcdc_header { | |||
101 | * plus any space that might be needed | 101 | * plus any space that might be needed |
102 | * for bus alignment padding. | 102 | * for bus alignment padding. |
103 | */ | 103 | */ |
104 | #define ROUND_UP_MARGIN 2048 /* Biggest bus block size possible for | ||
105 | * round off at the end of buffer | ||
106 | * Currently is SDIO | ||
107 | */ | ||
108 | |||
109 | struct brcmf_bcdc { | 104 | struct brcmf_bcdc { |
110 | u16 reqid; | 105 | u16 reqid; |
111 | u8 bus_header[BUS_HEADER_LEN]; | 106 | u8 bus_header[BUS_HEADER_LEN]; |
112 | struct brcmf_proto_bcdc_dcmd msg; | 107 | struct brcmf_proto_bcdc_dcmd msg; |
113 | unsigned char buf[BRCMF_DCMD_MAXLEN + ROUND_UP_MARGIN]; | 108 | unsigned char buf[BRCMF_DCMD_MAXLEN]; |
114 | }; | 109 | }; |
115 | 110 | ||
116 | static int brcmf_proto_bcdc_msg(struct brcmf_pub *drvr) | 111 | |
112 | static int | ||
113 | brcmf_proto_bcdc_msg(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf, | ||
114 | uint len, bool set) | ||
117 | { | 115 | { |
118 | struct brcmf_bcdc *bcdc = (struct brcmf_bcdc *)drvr->proto->pd; | 116 | struct brcmf_bcdc *bcdc = (struct brcmf_bcdc *)drvr->proto->pd; |
119 | int len = le32_to_cpu(bcdc->msg.len) + | 117 | struct brcmf_proto_bcdc_dcmd *msg = &bcdc->msg; |
120 | sizeof(struct brcmf_proto_bcdc_dcmd); | 118 | u32 flags; |
121 | 119 | ||
122 | brcmf_dbg(BCDC, "Enter\n"); | 120 | brcmf_dbg(BCDC, "Enter\n"); |
123 | 121 | ||
124 | /* NOTE : bcdc->msg.len holds the desired length of the buffer to be | 122 | memset(msg, 0, sizeof(struct brcmf_proto_bcdc_dcmd)); |
125 | * returned. Only up to BCDC_MAX_MSG_SIZE of this buffer area | 123 | |
126 | * is actually sent to the dongle | 124 | msg->cmd = cpu_to_le32(cmd); |
127 | */ | 125 | msg->len = cpu_to_le32(len); |
128 | if (len > BCDC_MAX_MSG_SIZE) | 126 | flags = (++bcdc->reqid << BCDC_DCMD_ID_SHIFT); |
129 | len = BCDC_MAX_MSG_SIZE; | 127 | if (set) |
128 | flags |= BCDC_DCMD_SET; | ||
129 | flags = (flags & ~BCDC_DCMD_IF_MASK) | | ||
130 | (ifidx << BCDC_DCMD_IF_SHIFT); | ||
131 | msg->flags = cpu_to_le32(flags); | ||
132 | |||
133 | if (buf) | ||
134 | memcpy(bcdc->buf, buf, len); | ||
130 | 135 | ||
131 | /* Send request */ | 136 | /* Send request */ |
132 | return brcmf_bus_txctl(drvr->bus_if, (unsigned char *)&bcdc->msg, len); | 137 | return brcmf_bus_txctl(drvr->bus_if, (unsigned char *)&bcdc->msg, |
138 | len + sizeof(struct brcmf_proto_bcdc_dcmd)); | ||
133 | } | 139 | } |
134 | 140 | ||
135 | static int brcmf_proto_bcdc_cmplt(struct brcmf_pub *drvr, u32 id, u32 len) | 141 | static int brcmf_proto_bcdc_cmplt(struct brcmf_pub *drvr, u32 id, u32 len) |
@@ -161,19 +167,7 @@ brcmf_proto_bcdc_query_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd, | |||
161 | 167 | ||
162 | brcmf_dbg(BCDC, "Enter, cmd %d len %d\n", cmd, len); | 168 | brcmf_dbg(BCDC, "Enter, cmd %d len %d\n", cmd, len); |
163 | 169 | ||
164 | memset(msg, 0, sizeof(struct brcmf_proto_bcdc_dcmd)); | 170 | ret = brcmf_proto_bcdc_msg(drvr, ifidx, cmd, buf, len, false); |
165 | |||
166 | msg->cmd = cpu_to_le32(cmd); | ||
167 | msg->len = cpu_to_le32(len); | ||
168 | flags = (++bcdc->reqid << BCDC_DCMD_ID_SHIFT); | ||
169 | flags = (flags & ~BCDC_DCMD_IF_MASK) | | ||
170 | (ifidx << BCDC_DCMD_IF_SHIFT); | ||
171 | msg->flags = cpu_to_le32(flags); | ||
172 | |||
173 | if (buf) | ||
174 | memcpy(bcdc->buf, buf, len); | ||
175 | |||
176 | ret = brcmf_proto_bcdc_msg(drvr); | ||
177 | if (ret < 0) { | 171 | if (ret < 0) { |
178 | brcmf_err("brcmf_proto_bcdc_msg failed w/status %d\n", | 172 | brcmf_err("brcmf_proto_bcdc_msg failed w/status %d\n", |
179 | ret); | 173 | ret); |
@@ -227,19 +221,7 @@ brcmf_proto_bcdc_set_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd, | |||
227 | 221 | ||
228 | brcmf_dbg(BCDC, "Enter, cmd %d len %d\n", cmd, len); | 222 | brcmf_dbg(BCDC, "Enter, cmd %d len %d\n", cmd, len); |
229 | 223 | ||
230 | memset(msg, 0, sizeof(struct brcmf_proto_bcdc_dcmd)); | 224 | ret = brcmf_proto_bcdc_msg(drvr, ifidx, cmd, buf, len, true); |
231 | |||
232 | msg->cmd = cpu_to_le32(cmd); | ||
233 | msg->len = cpu_to_le32(len); | ||
234 | flags = (++bcdc->reqid << BCDC_DCMD_ID_SHIFT) | BCDC_DCMD_SET; | ||
235 | flags = (flags & ~BCDC_DCMD_IF_MASK) | | ||
236 | (ifidx << BCDC_DCMD_IF_SHIFT); | ||
237 | msg->flags = cpu_to_le32(flags); | ||
238 | |||
239 | if (buf) | ||
240 | memcpy(bcdc->buf, buf, len); | ||
241 | |||
242 | ret = brcmf_proto_bcdc_msg(drvr); | ||
243 | if (ret < 0) | 225 | if (ret < 0) |
244 | goto done; | 226 | goto done; |
245 | 227 | ||
@@ -347,6 +329,15 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pub *drvr, bool do_fws, u8 *ifidx, | |||
347 | return 0; | 329 | return 0; |
348 | } | 330 | } |
349 | 331 | ||
332 | static int | ||
333 | brcmf_proto_bcdc_txdata(struct brcmf_pub *drvr, int ifidx, u8 offset, | ||
334 | struct sk_buff *pktbuf) | ||
335 | { | ||
336 | brcmf_proto_bcdc_hdrpush(drvr, ifidx, offset, pktbuf); | ||
337 | return brcmf_bus_txdata(drvr->bus_if, pktbuf); | ||
338 | } | ||
339 | |||
340 | |||
350 | int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) | 341 | int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) |
351 | { | 342 | { |
352 | struct brcmf_bcdc *bcdc; | 343 | struct brcmf_bcdc *bcdc; |
@@ -361,15 +352,15 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) | |||
361 | goto fail; | 352 | goto fail; |
362 | } | 353 | } |
363 | 354 | ||
364 | drvr->proto->hdrpush = brcmf_proto_bcdc_hdrpush; | ||
365 | drvr->proto->hdrpull = brcmf_proto_bcdc_hdrpull; | 355 | drvr->proto->hdrpull = brcmf_proto_bcdc_hdrpull; |
366 | drvr->proto->query_dcmd = brcmf_proto_bcdc_query_dcmd; | 356 | drvr->proto->query_dcmd = brcmf_proto_bcdc_query_dcmd; |
367 | drvr->proto->set_dcmd = brcmf_proto_bcdc_set_dcmd; | 357 | drvr->proto->set_dcmd = brcmf_proto_bcdc_set_dcmd; |
358 | drvr->proto->txdata = brcmf_proto_bcdc_txdata; | ||
368 | drvr->proto->pd = bcdc; | 359 | drvr->proto->pd = bcdc; |
369 | 360 | ||
370 | drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES; | 361 | drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES; |
371 | drvr->bus_if->maxctl = BRCMF_DCMD_MAXLEN + | 362 | drvr->bus_if->maxctl = BRCMF_DCMD_MAXLEN + |
372 | sizeof(struct brcmf_proto_bcdc_dcmd) + ROUND_UP_MARGIN; | 363 | sizeof(struct brcmf_proto_bcdc_dcmd); |
373 | return 0; | 364 | return 0; |
374 | 365 | ||
375 | fail: | 366 | fail: |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c index 91651ec7f13f..2b5cde67e728 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c | |||
@@ -23,9 +23,17 @@ | |||
23 | #include <linux/completion.h> | 23 | #include <linux/completion.h> |
24 | #include <linux/scatterlist.h> | 24 | #include <linux/scatterlist.h> |
25 | #include <linux/mmc/sdio.h> | 25 | #include <linux/mmc/sdio.h> |
26 | #include <linux/mmc/core.h> | ||
26 | #include <linux/mmc/sdio_func.h> | 27 | #include <linux/mmc/sdio_func.h> |
28 | #include <linux/mmc/sdio_ids.h> | ||
27 | #include <linux/mmc/card.h> | 29 | #include <linux/mmc/card.h> |
30 | #include <linux/mmc/host.h> | ||
31 | #include <linux/platform_device.h> | ||
28 | #include <linux/platform_data/brcmfmac-sdio.h> | 32 | #include <linux/platform_data/brcmfmac-sdio.h> |
33 | #include <linux/suspend.h> | ||
34 | #include <linux/errno.h> | ||
35 | #include <linux/module.h> | ||
36 | #include <net/cfg80211.h> | ||
29 | 37 | ||
30 | #include <defs.h> | 38 | #include <defs.h> |
31 | #include <brcm_hw_ids.h> | 39 | #include <brcm_hw_ids.h> |
@@ -35,11 +43,21 @@ | |||
35 | #include "dhd_bus.h" | 43 | #include "dhd_bus.h" |
36 | #include "dhd_dbg.h" | 44 | #include "dhd_dbg.h" |
37 | #include "sdio_host.h" | 45 | #include "sdio_host.h" |
46 | #include "sdio_chip.h" | ||
38 | 47 | ||
39 | #define SDIOH_API_ACCESS_RETRY_LIMIT 2 | 48 | #define SDIOH_API_ACCESS_RETRY_LIMIT 2 |
40 | 49 | ||
50 | #define SDIO_VENDOR_ID_BROADCOM 0x02d0 | ||
41 | 51 | ||
42 | static irqreturn_t brcmf_sdio_oob_irqhandler(int irq, void *dev_id) | 52 | #define DMA_ALIGN_MASK 0x03 |
53 | |||
54 | #define SDIO_FUNC1_BLOCKSIZE 64 | ||
55 | #define SDIO_FUNC2_BLOCKSIZE 512 | ||
56 | /* Maximum milliseconds to wait for F2 to come up */ | ||
57 | #define SDIO_WAIT_F2RDY 3000 | ||
58 | |||
59 | |||
60 | static irqreturn_t brcmf_sdiod_oob_irqhandler(int irq, void *dev_id) | ||
43 | { | 61 | { |
44 | struct brcmf_bus *bus_if = dev_get_drvdata(dev_id); | 62 | struct brcmf_bus *bus_if = dev_get_drvdata(dev_id); |
45 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; | 63 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; |
@@ -54,27 +72,46 @@ static irqreturn_t brcmf_sdio_oob_irqhandler(int irq, void *dev_id) | |||
54 | sdiodev->irq_en = false; | 72 | sdiodev->irq_en = false; |
55 | } | 73 | } |
56 | 74 | ||
57 | brcmf_sdbrcm_isr(sdiodev->bus); | 75 | brcmf_sdio_isr(sdiodev->bus); |
58 | 76 | ||
59 | return IRQ_HANDLED; | 77 | return IRQ_HANDLED; |
60 | } | 78 | } |
61 | 79 | ||
62 | static void brcmf_sdio_ib_irqhandler(struct sdio_func *func) | 80 | static void brcmf_sdiod_ib_irqhandler(struct sdio_func *func) |
63 | { | 81 | { |
64 | struct brcmf_bus *bus_if = dev_get_drvdata(&func->dev); | 82 | struct brcmf_bus *bus_if = dev_get_drvdata(&func->dev); |
65 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; | 83 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; |
66 | 84 | ||
67 | brcmf_dbg(INTR, "IB intr triggered\n"); | 85 | brcmf_dbg(INTR, "IB intr triggered\n"); |
68 | 86 | ||
69 | brcmf_sdbrcm_isr(sdiodev->bus); | 87 | brcmf_sdio_isr(sdiodev->bus); |
70 | } | 88 | } |
71 | 89 | ||
72 | /* dummy handler for SDIO function 2 interrupt */ | 90 | /* dummy handler for SDIO function 2 interrupt */ |
73 | static void brcmf_sdio_dummy_irqhandler(struct sdio_func *func) | 91 | static void brcmf_sdiod_dummy_irqhandler(struct sdio_func *func) |
92 | { | ||
93 | } | ||
94 | |||
95 | static bool brcmf_sdiod_pm_resume_error(struct brcmf_sdio_dev *sdiodev) | ||
74 | { | 96 | { |
97 | bool is_err = false; | ||
98 | #ifdef CONFIG_PM_SLEEP | ||
99 | is_err = atomic_read(&sdiodev->suspend); | ||
100 | #endif | ||
101 | return is_err; | ||
75 | } | 102 | } |
76 | 103 | ||
77 | int brcmf_sdio_intr_register(struct brcmf_sdio_dev *sdiodev) | 104 | static void brcmf_sdiod_pm_resume_wait(struct brcmf_sdio_dev *sdiodev, |
105 | wait_queue_head_t *wq) | ||
106 | { | ||
107 | #ifdef CONFIG_PM_SLEEP | ||
108 | int retry = 0; | ||
109 | while (atomic_read(&sdiodev->suspend) && retry++ != 30) | ||
110 | wait_event_timeout(*wq, false, HZ/100); | ||
111 | #endif | ||
112 | } | ||
113 | |||
114 | int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev) | ||
78 | { | 115 | { |
79 | int ret = 0; | 116 | int ret = 0; |
80 | u8 data; | 117 | u8 data; |
@@ -84,7 +121,7 @@ int brcmf_sdio_intr_register(struct brcmf_sdio_dev *sdiodev) | |||
84 | brcmf_dbg(SDIO, "Enter, register OOB IRQ %d\n", | 121 | brcmf_dbg(SDIO, "Enter, register OOB IRQ %d\n", |
85 | sdiodev->pdata->oob_irq_nr); | 122 | sdiodev->pdata->oob_irq_nr); |
86 | ret = request_irq(sdiodev->pdata->oob_irq_nr, | 123 | ret = request_irq(sdiodev->pdata->oob_irq_nr, |
87 | brcmf_sdio_oob_irqhandler, | 124 | brcmf_sdiod_oob_irqhandler, |
88 | sdiodev->pdata->oob_irq_flags, | 125 | sdiodev->pdata->oob_irq_flags, |
89 | "brcmf_oob_intr", | 126 | "brcmf_oob_intr", |
90 | &sdiodev->func[1]->dev); | 127 | &sdiodev->func[1]->dev); |
@@ -108,36 +145,36 @@ int brcmf_sdio_intr_register(struct brcmf_sdio_dev *sdiodev) | |||
108 | sdio_claim_host(sdiodev->func[1]); | 145 | sdio_claim_host(sdiodev->func[1]); |
109 | 146 | ||
110 | /* must configure SDIO_CCCR_IENx to enable irq */ | 147 | /* must configure SDIO_CCCR_IENx to enable irq */ |
111 | data = brcmf_sdio_regrb(sdiodev, SDIO_CCCR_IENx, &ret); | 148 | data = brcmf_sdiod_regrb(sdiodev, SDIO_CCCR_IENx, &ret); |
112 | data |= 1 << SDIO_FUNC_1 | 1 << SDIO_FUNC_2 | 1; | 149 | data |= 1 << SDIO_FUNC_1 | 1 << SDIO_FUNC_2 | 1; |
113 | brcmf_sdio_regwb(sdiodev, SDIO_CCCR_IENx, data, &ret); | 150 | brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_IENx, data, &ret); |
114 | 151 | ||
115 | /* redirect, configure and enable io for interrupt signal */ | 152 | /* redirect, configure and enable io for interrupt signal */ |
116 | data = SDIO_SEPINT_MASK | SDIO_SEPINT_OE; | 153 | data = SDIO_SEPINT_MASK | SDIO_SEPINT_OE; |
117 | if (sdiodev->pdata->oob_irq_flags & IRQF_TRIGGER_HIGH) | 154 | if (sdiodev->pdata->oob_irq_flags & IRQF_TRIGGER_HIGH) |
118 | data |= SDIO_SEPINT_ACT_HI; | 155 | data |= SDIO_SEPINT_ACT_HI; |
119 | brcmf_sdio_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, data, &ret); | 156 | brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, data, &ret); |
120 | 157 | ||
121 | sdio_release_host(sdiodev->func[1]); | 158 | sdio_release_host(sdiodev->func[1]); |
122 | } else { | 159 | } else { |
123 | brcmf_dbg(SDIO, "Entering\n"); | 160 | brcmf_dbg(SDIO, "Entering\n"); |
124 | sdio_claim_host(sdiodev->func[1]); | 161 | sdio_claim_host(sdiodev->func[1]); |
125 | sdio_claim_irq(sdiodev->func[1], brcmf_sdio_ib_irqhandler); | 162 | sdio_claim_irq(sdiodev->func[1], brcmf_sdiod_ib_irqhandler); |
126 | sdio_claim_irq(sdiodev->func[2], brcmf_sdio_dummy_irqhandler); | 163 | sdio_claim_irq(sdiodev->func[2], brcmf_sdiod_dummy_irqhandler); |
127 | sdio_release_host(sdiodev->func[1]); | 164 | sdio_release_host(sdiodev->func[1]); |
128 | } | 165 | } |
129 | 166 | ||
130 | return 0; | 167 | return 0; |
131 | } | 168 | } |
132 | 169 | ||
133 | int brcmf_sdio_intr_unregister(struct brcmf_sdio_dev *sdiodev) | 170 | int brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev) |
134 | { | 171 | { |
135 | brcmf_dbg(SDIO, "Entering\n"); | 172 | brcmf_dbg(SDIO, "Entering\n"); |
136 | 173 | ||
137 | if ((sdiodev->pdata) && (sdiodev->pdata->oob_irq_supported)) { | 174 | if ((sdiodev->pdata) && (sdiodev->pdata->oob_irq_supported)) { |
138 | sdio_claim_host(sdiodev->func[1]); | 175 | sdio_claim_host(sdiodev->func[1]); |
139 | brcmf_sdio_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL); | 176 | brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL); |
140 | brcmf_sdio_regwb(sdiodev, SDIO_CCCR_IENx, 0, NULL); | 177 | brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_IENx, 0, NULL); |
141 | sdio_release_host(sdiodev->func[1]); | 178 | sdio_release_host(sdiodev->func[1]); |
142 | 179 | ||
143 | if (sdiodev->oob_irq_requested) { | 180 | if (sdiodev->oob_irq_requested) { |
@@ -160,8 +197,117 @@ int brcmf_sdio_intr_unregister(struct brcmf_sdio_dev *sdiodev) | |||
160 | return 0; | 197 | return 0; |
161 | } | 198 | } |
162 | 199 | ||
200 | static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func, | ||
201 | uint regaddr, u8 byte) | ||
202 | { | ||
203 | int err_ret; | ||
204 | |||
205 | /* | ||
206 | * Can only directly write to some F0 registers. | ||
207 | * Handle CCCR_IENx and CCCR_ABORT command | ||
208 | * as a special case. | ||
209 | */ | ||
210 | if ((regaddr == SDIO_CCCR_ABORT) || | ||
211 | (regaddr == SDIO_CCCR_IENx)) | ||
212 | sdio_writeb(func, byte, regaddr, &err_ret); | ||
213 | else | ||
214 | sdio_f0_writeb(func, byte, regaddr, &err_ret); | ||
215 | |||
216 | return err_ret; | ||
217 | } | ||
218 | |||
219 | static int brcmf_sdiod_request_byte(struct brcmf_sdio_dev *sdiodev, uint rw, | ||
220 | uint func, uint regaddr, u8 *byte) | ||
221 | { | ||
222 | int err_ret; | ||
223 | |||
224 | brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x\n", rw, func, regaddr); | ||
225 | |||
226 | brcmf_sdiod_pm_resume_wait(sdiodev, &sdiodev->request_byte_wait); | ||
227 | if (brcmf_sdiod_pm_resume_error(sdiodev)) | ||
228 | return -EIO; | ||
229 | |||
230 | if (rw && func == 0) { | ||
231 | /* handle F0 separately */ | ||
232 | err_ret = brcmf_sdiod_f0_writeb(sdiodev->func[func], | ||
233 | regaddr, *byte); | ||
234 | } else { | ||
235 | if (rw) /* CMD52 Write */ | ||
236 | sdio_writeb(sdiodev->func[func], *byte, regaddr, | ||
237 | &err_ret); | ||
238 | else if (func == 0) { | ||
239 | *byte = sdio_f0_readb(sdiodev->func[func], regaddr, | ||
240 | &err_ret); | ||
241 | } else { | ||
242 | *byte = sdio_readb(sdiodev->func[func], regaddr, | ||
243 | &err_ret); | ||
244 | } | ||
245 | } | ||
246 | |||
247 | if (err_ret) { | ||
248 | /* | ||
249 | * SleepCSR register access can fail when | ||
250 | * waking up the device so reduce this noise | ||
251 | * in the logs. | ||
252 | */ | ||
253 | if (regaddr != SBSDIO_FUNC1_SLEEPCSR) | ||
254 | brcmf_err("Failed to %s byte F%d:@0x%05x=%02x, Err: %d\n", | ||
255 | rw ? "write" : "read", func, regaddr, *byte, | ||
256 | err_ret); | ||
257 | else | ||
258 | brcmf_dbg(SDIO, "Failed to %s byte F%d:@0x%05x=%02x, Err: %d\n", | ||
259 | rw ? "write" : "read", func, regaddr, *byte, | ||
260 | err_ret); | ||
261 | } | ||
262 | return err_ret; | ||
263 | } | ||
264 | |||
265 | static int brcmf_sdiod_request_word(struct brcmf_sdio_dev *sdiodev, uint rw, | ||
266 | uint func, uint addr, u32 *word, | ||
267 | uint nbytes) | ||
268 | { | ||
269 | int err_ret = -EIO; | ||
270 | |||
271 | if (func == 0) { | ||
272 | brcmf_err("Only CMD52 allowed to F0\n"); | ||
273 | return -EINVAL; | ||
274 | } | ||
275 | |||
276 | brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x, nbytes=%d\n", | ||
277 | rw, func, addr, nbytes); | ||
278 | |||
279 | brcmf_sdiod_pm_resume_wait(sdiodev, &sdiodev->request_word_wait); | ||
280 | if (brcmf_sdiod_pm_resume_error(sdiodev)) | ||
281 | return -EIO; | ||
282 | |||
283 | if (rw) { /* CMD52 Write */ | ||
284 | if (nbytes == 4) | ||
285 | sdio_writel(sdiodev->func[func], *word, addr, | ||
286 | &err_ret); | ||
287 | else if (nbytes == 2) | ||
288 | sdio_writew(sdiodev->func[func], (*word & 0xFFFF), | ||
289 | addr, &err_ret); | ||
290 | else | ||
291 | brcmf_err("Invalid nbytes: %d\n", nbytes); | ||
292 | } else { /* CMD52 Read */ | ||
293 | if (nbytes == 4) | ||
294 | *word = sdio_readl(sdiodev->func[func], addr, &err_ret); | ||
295 | else if (nbytes == 2) | ||
296 | *word = sdio_readw(sdiodev->func[func], addr, | ||
297 | &err_ret) & 0xFFFF; | ||
298 | else | ||
299 | brcmf_err("Invalid nbytes: %d\n", nbytes); | ||
300 | } | ||
301 | |||
302 | if (err_ret) | ||
303 | brcmf_err("Failed to %s word, Err: 0x%08x\n", | ||
304 | rw ? "write" : "read", err_ret); | ||
305 | |||
306 | return err_ret; | ||
307 | } | ||
308 | |||
163 | static int | 309 | static int |
164 | brcmf_sdcard_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address) | 310 | brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address) |
165 | { | 311 | { |
166 | int err = 0, i; | 312 | int err = 0, i; |
167 | u8 addr[3]; | 313 | u8 addr[3]; |
@@ -176,7 +322,7 @@ brcmf_sdcard_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address) | |||
176 | do { | 322 | do { |
177 | if (retry) | 323 | if (retry) |
178 | usleep_range(1000, 2000); | 324 | usleep_range(1000, 2000); |
179 | err = brcmf_sdioh_request_byte(sdiodev, SDIOH_WRITE, | 325 | err = brcmf_sdiod_request_byte(sdiodev, SDIOH_WRITE, |
180 | SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRLOW + i, | 326 | SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRLOW + i, |
181 | &addr[i]); | 327 | &addr[i]); |
182 | } while (err != 0 && retry++ < SDIOH_API_ACCESS_RETRY_LIMIT); | 328 | } while (err != 0 && retry++ < SDIOH_API_ACCESS_RETRY_LIMIT); |
@@ -192,13 +338,13 @@ brcmf_sdcard_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address) | |||
192 | } | 338 | } |
193 | 339 | ||
194 | static int | 340 | static int |
195 | brcmf_sdio_addrprep(struct brcmf_sdio_dev *sdiodev, uint width, u32 *addr) | 341 | brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, uint width, u32 *addr) |
196 | { | 342 | { |
197 | uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK; | 343 | uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK; |
198 | int err = 0; | 344 | int err = 0; |
199 | 345 | ||
200 | if (bar0 != sdiodev->sbwad) { | 346 | if (bar0 != sdiodev->sbwad) { |
201 | err = brcmf_sdcard_set_sbaddr_window(sdiodev, bar0); | 347 | err = brcmf_sdiod_set_sbaddr_window(sdiodev, bar0); |
202 | if (err) | 348 | if (err) |
203 | return err; | 349 | return err; |
204 | 350 | ||
@@ -213,9 +359,8 @@ brcmf_sdio_addrprep(struct brcmf_sdio_dev *sdiodev, uint width, u32 *addr) | |||
213 | return 0; | 359 | return 0; |
214 | } | 360 | } |
215 | 361 | ||
216 | int | 362 | static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr, |
217 | brcmf_sdio_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr, | 363 | void *data, bool write) |
218 | void *data, bool write) | ||
219 | { | 364 | { |
220 | u8 func_num, reg_size; | 365 | u8 func_num, reg_size; |
221 | s32 retry = 0; | 366 | s32 retry = 0; |
@@ -237,7 +382,7 @@ brcmf_sdio_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr, | |||
237 | func_num = SDIO_FUNC_1; | 382 | func_num = SDIO_FUNC_1; |
238 | reg_size = 4; | 383 | reg_size = 4; |
239 | 384 | ||
240 | ret = brcmf_sdio_addrprep(sdiodev, reg_size, &addr); | 385 | ret = brcmf_sdiod_addrprep(sdiodev, reg_size, &addr); |
241 | if (ret) | 386 | if (ret) |
242 | goto done; | 387 | goto done; |
243 | } | 388 | } |
@@ -248,10 +393,10 @@ brcmf_sdio_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr, | |||
248 | if (retry) /* wait for 1 ms till bus get settled down */ | 393 | if (retry) /* wait for 1 ms till bus get settled down */ |
249 | usleep_range(1000, 2000); | 394 | usleep_range(1000, 2000); |
250 | if (reg_size == 1) | 395 | if (reg_size == 1) |
251 | ret = brcmf_sdioh_request_byte(sdiodev, write, | 396 | ret = brcmf_sdiod_request_byte(sdiodev, write, |
252 | func_num, addr, data); | 397 | func_num, addr, data); |
253 | else | 398 | else |
254 | ret = brcmf_sdioh_request_word(sdiodev, write, | 399 | ret = brcmf_sdiod_request_word(sdiodev, write, |
255 | func_num, addr, data, 4); | 400 | func_num, addr, data, 4); |
256 | } while (ret != 0 && retry++ < SDIOH_API_ACCESS_RETRY_LIMIT); | 401 | } while (ret != 0 && retry++ < SDIOH_API_ACCESS_RETRY_LIMIT); |
257 | 402 | ||
@@ -262,13 +407,13 @@ done: | |||
262 | return ret; | 407 | return ret; |
263 | } | 408 | } |
264 | 409 | ||
265 | u8 brcmf_sdio_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) | 410 | u8 brcmf_sdiod_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) |
266 | { | 411 | { |
267 | u8 data; | 412 | u8 data; |
268 | int retval; | 413 | int retval; |
269 | 414 | ||
270 | brcmf_dbg(SDIO, "addr:0x%08x\n", addr); | 415 | brcmf_dbg(SDIO, "addr:0x%08x\n", addr); |
271 | retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, false); | 416 | retval = brcmf_sdiod_regrw_helper(sdiodev, addr, &data, false); |
272 | brcmf_dbg(SDIO, "data:0x%02x\n", data); | 417 | brcmf_dbg(SDIO, "data:0x%02x\n", data); |
273 | 418 | ||
274 | if (ret) | 419 | if (ret) |
@@ -277,13 +422,13 @@ u8 brcmf_sdio_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) | |||
277 | return data; | 422 | return data; |
278 | } | 423 | } |
279 | 424 | ||
280 | u32 brcmf_sdio_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) | 425 | u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) |
281 | { | 426 | { |
282 | u32 data; | 427 | u32 data; |
283 | int retval; | 428 | int retval; |
284 | 429 | ||
285 | brcmf_dbg(SDIO, "addr:0x%08x\n", addr); | 430 | brcmf_dbg(SDIO, "addr:0x%08x\n", addr); |
286 | retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, false); | 431 | retval = brcmf_sdiod_regrw_helper(sdiodev, addr, &data, false); |
287 | brcmf_dbg(SDIO, "data:0x%08x\n", data); | 432 | brcmf_dbg(SDIO, "data:0x%08x\n", data); |
288 | 433 | ||
289 | if (ret) | 434 | if (ret) |
@@ -292,37 +437,37 @@ u32 brcmf_sdio_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) | |||
292 | return data; | 437 | return data; |
293 | } | 438 | } |
294 | 439 | ||
295 | void brcmf_sdio_regwb(struct brcmf_sdio_dev *sdiodev, u32 addr, | 440 | void brcmf_sdiod_regwb(struct brcmf_sdio_dev *sdiodev, u32 addr, |
296 | u8 data, int *ret) | 441 | u8 data, int *ret) |
297 | { | 442 | { |
298 | int retval; | 443 | int retval; |
299 | 444 | ||
300 | brcmf_dbg(SDIO, "addr:0x%08x, data:0x%02x\n", addr, data); | 445 | brcmf_dbg(SDIO, "addr:0x%08x, data:0x%02x\n", addr, data); |
301 | retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, true); | 446 | retval = brcmf_sdiod_regrw_helper(sdiodev, addr, &data, true); |
302 | 447 | ||
303 | if (ret) | 448 | if (ret) |
304 | *ret = retval; | 449 | *ret = retval; |
305 | } | 450 | } |
306 | 451 | ||
307 | void brcmf_sdio_regwl(struct brcmf_sdio_dev *sdiodev, u32 addr, | 452 | void brcmf_sdiod_regwl(struct brcmf_sdio_dev *sdiodev, u32 addr, |
308 | u32 data, int *ret) | 453 | u32 data, int *ret) |
309 | { | 454 | { |
310 | int retval; | 455 | int retval; |
311 | 456 | ||
312 | brcmf_dbg(SDIO, "addr:0x%08x, data:0x%08x\n", addr, data); | 457 | brcmf_dbg(SDIO, "addr:0x%08x, data:0x%08x\n", addr, data); |
313 | retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, true); | 458 | retval = brcmf_sdiod_regrw_helper(sdiodev, addr, &data, true); |
314 | 459 | ||
315 | if (ret) | 460 | if (ret) |
316 | *ret = retval; | 461 | *ret = retval; |
317 | } | 462 | } |
318 | 463 | ||
319 | static int brcmf_sdio_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn, | 464 | static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn, |
320 | bool write, u32 addr, struct sk_buff *pkt) | 465 | bool write, u32 addr, struct sk_buff *pkt) |
321 | { | 466 | { |
322 | unsigned int req_sz; | 467 | unsigned int req_sz; |
323 | 468 | ||
324 | brcmf_pm_resume_wait(sdiodev, &sdiodev->request_buffer_wait); | 469 | brcmf_sdiod_pm_resume_wait(sdiodev, &sdiodev->request_buffer_wait); |
325 | if (brcmf_pm_resume_error(sdiodev)) | 470 | if (brcmf_sdiod_pm_resume_error(sdiodev)) |
326 | return -EIO; | 471 | return -EIO; |
327 | 472 | ||
328 | /* Single skb use the standard mmc interface */ | 473 | /* Single skb use the standard mmc interface */ |
@@ -345,7 +490,7 @@ static int brcmf_sdio_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn, | |||
345 | } | 490 | } |
346 | 491 | ||
347 | /** | 492 | /** |
348 | * brcmf_sdio_sglist_rw - SDIO interface function for block data access | 493 | * brcmf_sdiod_sglist_rw - SDIO interface function for block data access |
349 | * @sdiodev: brcmfmac sdio device | 494 | * @sdiodev: brcmfmac sdio device |
350 | * @fn: SDIO function number | 495 | * @fn: SDIO function number |
351 | * @write: direction flag | 496 | * @write: direction flag |
@@ -356,9 +501,9 @@ static int brcmf_sdio_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn, | |||
356 | * stack for block data access. It assumes that the skb passed down by the | 501 | * stack for block data access. It assumes that the skb passed down by the |
357 | * caller has already been padded and aligned. | 502 | * caller has already been padded and aligned. |
358 | */ | 503 | */ |
359 | static int brcmf_sdio_sglist_rw(struct brcmf_sdio_dev *sdiodev, uint fn, | 504 | static int brcmf_sdiod_sglist_rw(struct brcmf_sdio_dev *sdiodev, uint fn, |
360 | bool write, u32 addr, | 505 | bool write, u32 addr, |
361 | struct sk_buff_head *pktlist) | 506 | struct sk_buff_head *pktlist) |
362 | { | 507 | { |
363 | unsigned int req_sz, func_blk_sz, sg_cnt, sg_data_sz, pkt_offset; | 508 | unsigned int req_sz, func_blk_sz, sg_cnt, sg_data_sz, pkt_offset; |
364 | unsigned int max_req_sz, orig_offset, dst_offset; | 509 | unsigned int max_req_sz, orig_offset, dst_offset; |
@@ -376,8 +521,8 @@ static int brcmf_sdio_sglist_rw(struct brcmf_sdio_dev *sdiodev, uint fn, | |||
376 | if (!pktlist->qlen) | 521 | if (!pktlist->qlen) |
377 | return -EINVAL; | 522 | return -EINVAL; |
378 | 523 | ||
379 | brcmf_pm_resume_wait(sdiodev, &sdiodev->request_buffer_wait); | 524 | brcmf_sdiod_pm_resume_wait(sdiodev, &sdiodev->request_buffer_wait); |
380 | if (brcmf_pm_resume_error(sdiodev)) | 525 | if (brcmf_sdiod_pm_resume_error(sdiodev)) |
381 | return -EIO; | 526 | return -EIO; |
382 | 527 | ||
383 | target_list = pktlist; | 528 | target_list = pktlist; |
@@ -524,9 +669,7 @@ exit: | |||
524 | return ret; | 669 | return ret; |
525 | } | 670 | } |
526 | 671 | ||
527 | int | 672 | int brcmf_sdiod_recv_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes) |
528 | brcmf_sdcard_recv_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | ||
529 | uint flags, u8 *buf, uint nbytes) | ||
530 | { | 673 | { |
531 | struct sk_buff *mypkt; | 674 | struct sk_buff *mypkt; |
532 | int err; | 675 | int err; |
@@ -538,7 +681,7 @@ brcmf_sdcard_recv_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | |||
538 | return -EIO; | 681 | return -EIO; |
539 | } | 682 | } |
540 | 683 | ||
541 | err = brcmf_sdcard_recv_pkt(sdiodev, addr, fn, flags, mypkt); | 684 | err = brcmf_sdiod_recv_pkt(sdiodev, mypkt); |
542 | if (!err) | 685 | if (!err) |
543 | memcpy(buf, mypkt->data, nbytes); | 686 | memcpy(buf, mypkt->data, nbytes); |
544 | 687 | ||
@@ -546,50 +689,47 @@ brcmf_sdcard_recv_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | |||
546 | return err; | 689 | return err; |
547 | } | 690 | } |
548 | 691 | ||
549 | int | 692 | int brcmf_sdiod_recv_pkt(struct brcmf_sdio_dev *sdiodev, struct sk_buff *pkt) |
550 | brcmf_sdcard_recv_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | ||
551 | uint flags, struct sk_buff *pkt) | ||
552 | { | 693 | { |
553 | uint width; | 694 | u32 addr = sdiodev->sbwad; |
554 | int err = 0; | 695 | int err = 0; |
555 | 696 | ||
556 | brcmf_dbg(SDIO, "fun = %d, addr = 0x%x, size = %d\n", | 697 | brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pkt->len); |
557 | fn, addr, pkt->len); | ||
558 | 698 | ||
559 | width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; | 699 | err = brcmf_sdiod_addrprep(sdiodev, 4, &addr); |
560 | err = brcmf_sdio_addrprep(sdiodev, width, &addr); | ||
561 | if (err) | 700 | if (err) |
562 | goto done; | 701 | goto done; |
563 | 702 | ||
564 | err = brcmf_sdio_buffrw(sdiodev, fn, false, addr, pkt); | 703 | err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, pkt); |
565 | 704 | ||
566 | done: | 705 | done: |
567 | return err; | 706 | return err; |
568 | } | 707 | } |
569 | 708 | ||
570 | int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | 709 | int brcmf_sdiod_recv_chain(struct brcmf_sdio_dev *sdiodev, |
571 | uint flags, struct sk_buff_head *pktq, uint totlen) | 710 | struct sk_buff_head *pktq, uint totlen) |
572 | { | 711 | { |
573 | struct sk_buff *glom_skb; | 712 | struct sk_buff *glom_skb; |
574 | struct sk_buff *skb; | 713 | struct sk_buff *skb; |
575 | uint width; | 714 | u32 addr = sdiodev->sbwad; |
576 | int err = 0; | 715 | int err = 0; |
577 | 716 | ||
578 | brcmf_dbg(SDIO, "fun = %d, addr = 0x%x, size = %d\n", | 717 | brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", |
579 | fn, addr, pktq->qlen); | 718 | addr, pktq->qlen); |
580 | 719 | ||
581 | width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; | 720 | err = brcmf_sdiod_addrprep(sdiodev, 4, &addr); |
582 | err = brcmf_sdio_addrprep(sdiodev, width, &addr); | ||
583 | if (err) | 721 | if (err) |
584 | goto done; | 722 | goto done; |
585 | 723 | ||
586 | if (pktq->qlen == 1) | 724 | if (pktq->qlen == 1) |
587 | err = brcmf_sdio_buffrw(sdiodev, fn, false, addr, pktq->next); | 725 | err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, |
726 | pktq->next); | ||
588 | else if (!sdiodev->sg_support) { | 727 | else if (!sdiodev->sg_support) { |
589 | glom_skb = brcmu_pkt_buf_get_skb(totlen); | 728 | glom_skb = brcmu_pkt_buf_get_skb(totlen); |
590 | if (!glom_skb) | 729 | if (!glom_skb) |
591 | return -ENOMEM; | 730 | return -ENOMEM; |
592 | err = brcmf_sdio_buffrw(sdiodev, fn, false, addr, glom_skb); | 731 | err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, |
732 | glom_skb); | ||
593 | if (err) | 733 | if (err) |
594 | goto done; | 734 | goto done; |
595 | 735 | ||
@@ -598,18 +738,17 @@ int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | |||
598 | skb_pull(glom_skb, skb->len); | 738 | skb_pull(glom_skb, skb->len); |
599 | } | 739 | } |
600 | } else | 740 | } else |
601 | err = brcmf_sdio_sglist_rw(sdiodev, fn, false, addr, pktq); | 741 | err = brcmf_sdiod_sglist_rw(sdiodev, SDIO_FUNC_2, false, addr, |
742 | pktq); | ||
602 | 743 | ||
603 | done: | 744 | done: |
604 | return err; | 745 | return err; |
605 | } | 746 | } |
606 | 747 | ||
607 | int | 748 | int brcmf_sdiod_send_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes) |
608 | brcmf_sdcard_send_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | ||
609 | uint flags, u8 *buf, uint nbytes) | ||
610 | { | 749 | { |
611 | struct sk_buff *mypkt; | 750 | struct sk_buff *mypkt; |
612 | uint width; | 751 | u32 addr = sdiodev->sbwad; |
613 | int err; | 752 | int err; |
614 | 753 | ||
615 | mypkt = brcmu_pkt_buf_get_skb(nbytes); | 754 | mypkt = brcmu_pkt_buf_get_skb(nbytes); |
@@ -621,48 +760,47 @@ brcmf_sdcard_send_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | |||
621 | 760 | ||
622 | memcpy(mypkt->data, buf, nbytes); | 761 | memcpy(mypkt->data, buf, nbytes); |
623 | 762 | ||
624 | width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; | 763 | err = brcmf_sdiod_addrprep(sdiodev, 4, &addr); |
625 | err = brcmf_sdio_addrprep(sdiodev, width, &addr); | ||
626 | 764 | ||
627 | if (!err) | 765 | if (!err) |
628 | err = brcmf_sdio_buffrw(sdiodev, fn, true, addr, mypkt); | 766 | err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true, addr, |
767 | mypkt); | ||
629 | 768 | ||
630 | brcmu_pkt_buf_free_skb(mypkt); | 769 | brcmu_pkt_buf_free_skb(mypkt); |
631 | return err; | 770 | return err; |
632 | 771 | ||
633 | } | 772 | } |
634 | 773 | ||
635 | int | 774 | int brcmf_sdiod_send_pkt(struct brcmf_sdio_dev *sdiodev, |
636 | brcmf_sdcard_send_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | 775 | struct sk_buff_head *pktq) |
637 | uint flags, struct sk_buff_head *pktq) | ||
638 | { | 776 | { |
639 | struct sk_buff *skb; | 777 | struct sk_buff *skb; |
640 | uint width; | 778 | u32 addr = sdiodev->sbwad; |
641 | int err; | 779 | int err; |
642 | 780 | ||
643 | brcmf_dbg(SDIO, "fun = %d, addr = 0x%x, size = %d\n", | 781 | brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pktq->qlen); |
644 | fn, addr, pktq->qlen); | ||
645 | 782 | ||
646 | width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; | 783 | err = brcmf_sdiod_addrprep(sdiodev, 4, &addr); |
647 | err = brcmf_sdio_addrprep(sdiodev, width, &addr); | ||
648 | if (err) | 784 | if (err) |
649 | return err; | 785 | return err; |
650 | 786 | ||
651 | if (pktq->qlen == 1 || !sdiodev->sg_support) | 787 | if (pktq->qlen == 1 || !sdiodev->sg_support) |
652 | skb_queue_walk(pktq, skb) { | 788 | skb_queue_walk(pktq, skb) { |
653 | err = brcmf_sdio_buffrw(sdiodev, fn, true, addr, skb); | 789 | err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true, |
790 | addr, skb); | ||
654 | if (err) | 791 | if (err) |
655 | break; | 792 | break; |
656 | } | 793 | } |
657 | else | 794 | else |
658 | err = brcmf_sdio_sglist_rw(sdiodev, fn, true, addr, pktq); | 795 | err = brcmf_sdiod_sglist_rw(sdiodev, SDIO_FUNC_2, true, addr, |
796 | pktq); | ||
659 | 797 | ||
660 | return err; | 798 | return err; |
661 | } | 799 | } |
662 | 800 | ||
663 | int | 801 | int |
664 | brcmf_sdio_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address, | 802 | brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address, |
665 | u8 *data, uint size) | 803 | u8 *data, uint size) |
666 | { | 804 | { |
667 | int bcmerror = 0; | 805 | int bcmerror = 0; |
668 | struct sk_buff *pkt; | 806 | struct sk_buff *pkt; |
@@ -689,7 +827,7 @@ brcmf_sdio_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address, | |||
689 | /* Do the transfer(s) */ | 827 | /* Do the transfer(s) */ |
690 | while (size) { | 828 | while (size) { |
691 | /* Set the backplane window to include the start address */ | 829 | /* Set the backplane window to include the start address */ |
692 | bcmerror = brcmf_sdcard_set_sbaddr_window(sdiodev, address); | 830 | bcmerror = brcmf_sdiod_set_sbaddr_window(sdiodev, address); |
693 | if (bcmerror) | 831 | if (bcmerror) |
694 | break; | 832 | break; |
695 | 833 | ||
@@ -703,8 +841,8 @@ brcmf_sdio_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address, | |||
703 | skb_put(pkt, dsize); | 841 | skb_put(pkt, dsize); |
704 | if (write) | 842 | if (write) |
705 | memcpy(pkt->data, data, dsize); | 843 | memcpy(pkt->data, data, dsize); |
706 | bcmerror = brcmf_sdio_buffrw(sdiodev, SDIO_FUNC_1, write, | 844 | bcmerror = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_1, write, |
707 | sdaddr, pkt); | 845 | sdaddr, pkt); |
708 | if (bcmerror) { | 846 | if (bcmerror) { |
709 | brcmf_err("membytes transfer failed\n"); | 847 | brcmf_err("membytes transfer failed\n"); |
710 | break; | 848 | break; |
@@ -726,7 +864,7 @@ brcmf_sdio_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address, | |||
726 | dev_kfree_skb(pkt); | 864 | dev_kfree_skb(pkt); |
727 | 865 | ||
728 | /* Return the window to backplane enumeration space for core access */ | 866 | /* Return the window to backplane enumeration space for core access */ |
729 | if (brcmf_sdcard_set_sbaddr_window(sdiodev, sdiodev->sbwad)) | 867 | if (brcmf_sdiod_set_sbaddr_window(sdiodev, sdiodev->sbwad)) |
730 | brcmf_err("FAILED to set window back to 0x%x\n", | 868 | brcmf_err("FAILED to set window back to 0x%x\n", |
731 | sdiodev->sbwad); | 869 | sdiodev->sbwad); |
732 | 870 | ||
@@ -735,65 +873,337 @@ brcmf_sdio_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address, | |||
735 | return bcmerror; | 873 | return bcmerror; |
736 | } | 874 | } |
737 | 875 | ||
738 | int brcmf_sdcard_abort(struct brcmf_sdio_dev *sdiodev, uint fn) | 876 | int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, uint fn) |
739 | { | 877 | { |
740 | char t_func = (char)fn; | 878 | char t_func = (char)fn; |
741 | brcmf_dbg(SDIO, "Enter\n"); | 879 | brcmf_dbg(SDIO, "Enter\n"); |
742 | 880 | ||
743 | /* issue abort cmd52 command through F0 */ | 881 | /* issue abort cmd52 command through F0 */ |
744 | brcmf_sdioh_request_byte(sdiodev, SDIOH_WRITE, SDIO_FUNC_0, | 882 | brcmf_sdiod_request_byte(sdiodev, SDIOH_WRITE, SDIO_FUNC_0, |
745 | SDIO_CCCR_ABORT, &t_func); | 883 | SDIO_CCCR_ABORT, &t_func); |
746 | 884 | ||
747 | brcmf_dbg(SDIO, "Exit\n"); | 885 | brcmf_dbg(SDIO, "Exit\n"); |
748 | return 0; | 886 | return 0; |
749 | } | 887 | } |
750 | 888 | ||
751 | int brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev) | 889 | static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev) |
890 | { | ||
891 | sdiodev->bus_if->state = BRCMF_BUS_DOWN; | ||
892 | |||
893 | if (sdiodev->bus) { | ||
894 | brcmf_sdio_remove(sdiodev->bus); | ||
895 | sdiodev->bus = NULL; | ||
896 | } | ||
897 | |||
898 | /* Disable Function 2 */ | ||
899 | sdio_claim_host(sdiodev->func[2]); | ||
900 | sdio_disable_func(sdiodev->func[2]); | ||
901 | sdio_release_host(sdiodev->func[2]); | ||
902 | |||
903 | /* Disable Function 1 */ | ||
904 | sdio_claim_host(sdiodev->func[1]); | ||
905 | sdio_disable_func(sdiodev->func[1]); | ||
906 | sdio_release_host(sdiodev->func[1]); | ||
907 | |||
908 | sdiodev->sbwad = 0; | ||
909 | |||
910 | return 0; | ||
911 | } | ||
912 | |||
913 | static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev) | ||
752 | { | 914 | { |
753 | u32 regs = 0; | 915 | struct sdio_func *func; |
916 | struct mmc_host *host; | ||
917 | uint max_blocks; | ||
754 | int ret = 0; | 918 | int ret = 0; |
755 | 919 | ||
756 | ret = brcmf_sdioh_attach(sdiodev); | 920 | sdiodev->num_funcs = 2; |
757 | if (ret) | 921 | |
922 | sdio_claim_host(sdiodev->func[1]); | ||
923 | |||
924 | ret = sdio_set_block_size(sdiodev->func[1], SDIO_FUNC1_BLOCKSIZE); | ||
925 | if (ret) { | ||
926 | brcmf_err("Failed to set F1 blocksize\n"); | ||
927 | sdio_release_host(sdiodev->func[1]); | ||
928 | goto out; | ||
929 | } | ||
930 | ret = sdio_set_block_size(sdiodev->func[2], SDIO_FUNC2_BLOCKSIZE); | ||
931 | if (ret) { | ||
932 | brcmf_err("Failed to set F2 blocksize\n"); | ||
933 | sdio_release_host(sdiodev->func[1]); | ||
934 | goto out; | ||
935 | } | ||
936 | |||
937 | /* increase F2 timeout */ | ||
938 | sdiodev->func[2]->enable_timeout = SDIO_WAIT_F2RDY; | ||
939 | |||
940 | /* Enable Function 1 */ | ||
941 | ret = sdio_enable_func(sdiodev->func[1]); | ||
942 | sdio_release_host(sdiodev->func[1]); | ||
943 | if (ret) { | ||
944 | brcmf_err("Failed to enable F1: err=%d\n", ret); | ||
758 | goto out; | 945 | goto out; |
946 | } | ||
759 | 947 | ||
760 | regs = SI_ENUM_BASE; | 948 | /* |
949 | * determine host related variables after brcmf_sdiod_probe() | ||
950 | * as func->cur_blksize is properly set and F2 init has been | ||
951 | * completed successfully. | ||
952 | */ | ||
953 | func = sdiodev->func[2]; | ||
954 | host = func->card->host; | ||
955 | sdiodev->sg_support = host->max_segs > 1; | ||
956 | max_blocks = min_t(uint, host->max_blk_count, 511u); | ||
957 | sdiodev->max_request_size = min_t(uint, host->max_req_size, | ||
958 | max_blocks * func->cur_blksize); | ||
959 | sdiodev->max_segment_count = min_t(uint, host->max_segs, | ||
960 | SG_MAX_SINGLE_ALLOC); | ||
961 | sdiodev->max_segment_size = host->max_seg_size; | ||
761 | 962 | ||
762 | /* try to attach to the target device */ | 963 | /* try to attach to the target device */ |
763 | sdiodev->bus = brcmf_sdbrcm_probe(regs, sdiodev); | 964 | sdiodev->bus = brcmf_sdio_probe(sdiodev); |
764 | if (!sdiodev->bus) { | 965 | if (!sdiodev->bus) { |
765 | brcmf_err("device attach failed\n"); | ||
766 | ret = -ENODEV; | 966 | ret = -ENODEV; |
767 | goto out; | 967 | goto out; |
768 | } | 968 | } |
769 | 969 | ||
770 | out: | 970 | out: |
771 | if (ret) | 971 | if (ret) |
772 | brcmf_sdio_remove(sdiodev); | 972 | brcmf_sdiod_remove(sdiodev); |
773 | 973 | ||
774 | return ret; | 974 | return ret; |
775 | } | 975 | } |
776 | 976 | ||
777 | int brcmf_sdio_remove(struct brcmf_sdio_dev *sdiodev) | 977 | /* devices we support, null terminated */ |
978 | static const struct sdio_device_id brcmf_sdmmc_ids[] = { | ||
979 | {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_43143)}, | ||
980 | {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_43241)}, | ||
981 | {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4329)}, | ||
982 | {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4330)}, | ||
983 | {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4334)}, | ||
984 | {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, | ||
985 | SDIO_DEVICE_ID_BROADCOM_4335_4339)}, | ||
986 | { /* end: all zeroes */ }, | ||
987 | }; | ||
988 | MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids); | ||
989 | |||
990 | static struct brcmfmac_sdio_platform_data *brcmfmac_sdio_pdata; | ||
991 | |||
992 | |||
993 | static int brcmf_ops_sdio_probe(struct sdio_func *func, | ||
994 | const struct sdio_device_id *id) | ||
778 | { | 995 | { |
779 | sdiodev->bus_if->state = BRCMF_BUS_DOWN; | 996 | int err; |
997 | struct brcmf_sdio_dev *sdiodev; | ||
998 | struct brcmf_bus *bus_if; | ||
780 | 999 | ||
781 | if (sdiodev->bus) { | 1000 | brcmf_dbg(SDIO, "Enter\n"); |
782 | brcmf_sdbrcm_disconnect(sdiodev->bus); | 1001 | brcmf_dbg(SDIO, "Class=%x\n", func->class); |
783 | sdiodev->bus = NULL; | 1002 | brcmf_dbg(SDIO, "sdio vendor ID: 0x%04x\n", func->vendor); |
1003 | brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device); | ||
1004 | brcmf_dbg(SDIO, "Function#: %d\n", func->num); | ||
1005 | |||
1006 | /* Consume func num 1 but dont do anything with it. */ | ||
1007 | if (func->num == 1) | ||
1008 | return 0; | ||
1009 | |||
1010 | /* Ignore anything but func 2 */ | ||
1011 | if (func->num != 2) | ||
1012 | return -ENODEV; | ||
1013 | |||
1014 | bus_if = kzalloc(sizeof(struct brcmf_bus), GFP_KERNEL); | ||
1015 | if (!bus_if) | ||
1016 | return -ENOMEM; | ||
1017 | sdiodev = kzalloc(sizeof(struct brcmf_sdio_dev), GFP_KERNEL); | ||
1018 | if (!sdiodev) { | ||
1019 | kfree(bus_if); | ||
1020 | return -ENOMEM; | ||
784 | } | 1021 | } |
785 | 1022 | ||
786 | brcmf_sdioh_detach(sdiodev); | 1023 | /* store refs to functions used. mmc_card does |
1024 | * not hold the F0 function pointer. | ||
1025 | */ | ||
1026 | sdiodev->func[0] = kmemdup(func, sizeof(*func), GFP_KERNEL); | ||
1027 | sdiodev->func[0]->num = 0; | ||
1028 | sdiodev->func[1] = func->card->sdio_func[0]; | ||
1029 | sdiodev->func[2] = func; | ||
1030 | |||
1031 | sdiodev->bus_if = bus_if; | ||
1032 | bus_if->bus_priv.sdio = sdiodev; | ||
1033 | bus_if->proto_type = BRCMF_PROTO_BCDC; | ||
1034 | dev_set_drvdata(&func->dev, bus_if); | ||
1035 | dev_set_drvdata(&sdiodev->func[1]->dev, bus_if); | ||
1036 | sdiodev->dev = &sdiodev->func[1]->dev; | ||
1037 | sdiodev->pdata = brcmfmac_sdio_pdata; | ||
1038 | |||
1039 | atomic_set(&sdiodev->suspend, false); | ||
1040 | init_waitqueue_head(&sdiodev->request_byte_wait); | ||
1041 | init_waitqueue_head(&sdiodev->request_word_wait); | ||
1042 | init_waitqueue_head(&sdiodev->request_buffer_wait); | ||
1043 | |||
1044 | brcmf_dbg(SDIO, "F2 found, calling brcmf_sdiod_probe...\n"); | ||
1045 | err = brcmf_sdiod_probe(sdiodev); | ||
1046 | if (err) { | ||
1047 | brcmf_err("F2 error, probe failed %d...\n", err); | ||
1048 | goto fail; | ||
1049 | } | ||
787 | 1050 | ||
788 | sdiodev->sbwad = 0; | 1051 | brcmf_dbg(SDIO, "F2 init completed...\n"); |
1052 | return 0; | ||
1053 | |||
1054 | fail: | ||
1055 | dev_set_drvdata(&func->dev, NULL); | ||
1056 | dev_set_drvdata(&sdiodev->func[1]->dev, NULL); | ||
1057 | kfree(sdiodev->func[0]); | ||
1058 | kfree(sdiodev); | ||
1059 | kfree(bus_if); | ||
1060 | return err; | ||
1061 | } | ||
1062 | |||
1063 | static void brcmf_ops_sdio_remove(struct sdio_func *func) | ||
1064 | { | ||
1065 | struct brcmf_bus *bus_if; | ||
1066 | struct brcmf_sdio_dev *sdiodev; | ||
1067 | |||
1068 | brcmf_dbg(SDIO, "Enter\n"); | ||
1069 | brcmf_dbg(SDIO, "sdio vendor ID: 0x%04x\n", func->vendor); | ||
1070 | brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device); | ||
1071 | brcmf_dbg(SDIO, "Function: %d\n", func->num); | ||
1072 | |||
1073 | if (func->num != 1 && func->num != 2) | ||
1074 | return; | ||
1075 | |||
1076 | bus_if = dev_get_drvdata(&func->dev); | ||
1077 | if (bus_if) { | ||
1078 | sdiodev = bus_if->bus_priv.sdio; | ||
1079 | brcmf_sdiod_remove(sdiodev); | ||
1080 | |||
1081 | dev_set_drvdata(&sdiodev->func[1]->dev, NULL); | ||
1082 | dev_set_drvdata(&sdiodev->func[2]->dev, NULL); | ||
1083 | |||
1084 | kfree(bus_if); | ||
1085 | kfree(sdiodev->func[0]); | ||
1086 | kfree(sdiodev); | ||
1087 | } | ||
1088 | |||
1089 | brcmf_dbg(SDIO, "Exit\n"); | ||
1090 | } | ||
1091 | |||
1092 | #ifdef CONFIG_PM_SLEEP | ||
1093 | static int brcmf_ops_sdio_suspend(struct device *dev) | ||
1094 | { | ||
1095 | mmc_pm_flag_t sdio_flags; | ||
1096 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||
1097 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; | ||
1098 | int ret = 0; | ||
1099 | |||
1100 | brcmf_dbg(SDIO, "\n"); | ||
1101 | |||
1102 | atomic_set(&sdiodev->suspend, true); | ||
1103 | |||
1104 | sdio_flags = sdio_get_host_pm_caps(sdiodev->func[1]); | ||
1105 | if (!(sdio_flags & MMC_PM_KEEP_POWER)) { | ||
1106 | brcmf_err("Host can't keep power while suspended\n"); | ||
1107 | return -EINVAL; | ||
1108 | } | ||
1109 | |||
1110 | ret = sdio_set_host_pm_flags(sdiodev->func[1], MMC_PM_KEEP_POWER); | ||
1111 | if (ret) { | ||
1112 | brcmf_err("Failed to set pm_flags\n"); | ||
1113 | return ret; | ||
1114 | } | ||
1115 | |||
1116 | brcmf_sdio_wd_timer(sdiodev->bus, 0); | ||
1117 | |||
1118 | return ret; | ||
1119 | } | ||
1120 | |||
1121 | static int brcmf_ops_sdio_resume(struct device *dev) | ||
1122 | { | ||
1123 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||
1124 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; | ||
1125 | |||
1126 | brcmf_sdio_wd_timer(sdiodev->bus, BRCMF_WD_POLL_MS); | ||
1127 | atomic_set(&sdiodev->suspend, false); | ||
1128 | return 0; | ||
1129 | } | ||
1130 | |||
1131 | static const struct dev_pm_ops brcmf_sdio_pm_ops = { | ||
1132 | .suspend = brcmf_ops_sdio_suspend, | ||
1133 | .resume = brcmf_ops_sdio_resume, | ||
1134 | }; | ||
1135 | #endif /* CONFIG_PM_SLEEP */ | ||
1136 | |||
1137 | static struct sdio_driver brcmf_sdmmc_driver = { | ||
1138 | .probe = brcmf_ops_sdio_probe, | ||
1139 | .remove = brcmf_ops_sdio_remove, | ||
1140 | .name = BRCMFMAC_SDIO_PDATA_NAME, | ||
1141 | .id_table = brcmf_sdmmc_ids, | ||
1142 | #ifdef CONFIG_PM_SLEEP | ||
1143 | .drv = { | ||
1144 | .pm = &brcmf_sdio_pm_ops, | ||
1145 | }, | ||
1146 | #endif /* CONFIG_PM_SLEEP */ | ||
1147 | }; | ||
1148 | |||
1149 | static int brcmf_sdio_pd_probe(struct platform_device *pdev) | ||
1150 | { | ||
1151 | brcmf_dbg(SDIO, "Enter\n"); | ||
1152 | |||
1153 | brcmfmac_sdio_pdata = dev_get_platdata(&pdev->dev); | ||
1154 | |||
1155 | if (brcmfmac_sdio_pdata->power_on) | ||
1156 | brcmfmac_sdio_pdata->power_on(); | ||
1157 | |||
1158 | return 0; | ||
1159 | } | ||
1160 | |||
1161 | static int brcmf_sdio_pd_remove(struct platform_device *pdev) | ||
1162 | { | ||
1163 | brcmf_dbg(SDIO, "Enter\n"); | ||
1164 | |||
1165 | if (brcmfmac_sdio_pdata->power_off) | ||
1166 | brcmfmac_sdio_pdata->power_off(); | ||
1167 | |||
1168 | sdio_unregister_driver(&brcmf_sdmmc_driver); | ||
789 | 1169 | ||
790 | return 0; | 1170 | return 0; |
791 | } | 1171 | } |
792 | 1172 | ||
793 | void brcmf_sdio_wdtmr_enable(struct brcmf_sdio_dev *sdiodev, bool enable) | 1173 | static struct platform_driver brcmf_sdio_pd = { |
1174 | .remove = brcmf_sdio_pd_remove, | ||
1175 | .driver = { | ||
1176 | .name = BRCMFMAC_SDIO_PDATA_NAME, | ||
1177 | .owner = THIS_MODULE, | ||
1178 | } | ||
1179 | }; | ||
1180 | |||
1181 | void brcmf_sdio_register(void) | ||
1182 | { | ||
1183 | int ret; | ||
1184 | |||
1185 | ret = sdio_register_driver(&brcmf_sdmmc_driver); | ||
1186 | if (ret) | ||
1187 | brcmf_err("sdio_register_driver failed: %d\n", ret); | ||
1188 | } | ||
1189 | |||
1190 | void brcmf_sdio_exit(void) | ||
794 | { | 1191 | { |
795 | if (enable) | 1192 | brcmf_dbg(SDIO, "Enter\n"); |
796 | brcmf_sdbrcm_wd_timer(sdiodev->bus, BRCMF_WD_POLL_MS); | 1193 | |
1194 | if (brcmfmac_sdio_pdata) | ||
1195 | platform_driver_unregister(&brcmf_sdio_pd); | ||
797 | else | 1196 | else |
798 | brcmf_sdbrcm_wd_timer(sdiodev->bus, 0); | 1197 | sdio_unregister_driver(&brcmf_sdmmc_driver); |
1198 | } | ||
1199 | |||
1200 | void __init brcmf_sdio_init(void) | ||
1201 | { | ||
1202 | int ret; | ||
1203 | |||
1204 | brcmf_dbg(SDIO, "Enter\n"); | ||
1205 | |||
1206 | ret = platform_driver_probe(&brcmf_sdio_pd, brcmf_sdio_pd_probe); | ||
1207 | if (ret == -ENODEV) | ||
1208 | brcmf_dbg(SDIO, "No platform data available.\n"); | ||
799 | } | 1209 | } |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c deleted file mode 100644 index a511c27122b8..000000000000 --- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c +++ /dev/null | |||
@@ -1,552 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2010 Broadcom Corporation | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | ||
11 | * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION | ||
13 | * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | ||
14 | * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #include <linux/types.h> | ||
18 | #include <linux/netdevice.h> | ||
19 | #include <linux/mmc/sdio.h> | ||
20 | #include <linux/mmc/core.h> | ||
21 | #include <linux/mmc/sdio_func.h> | ||
22 | #include <linux/mmc/sdio_ids.h> | ||
23 | #include <linux/mmc/card.h> | ||
24 | #include <linux/mmc/host.h> | ||
25 | #include <linux/suspend.h> | ||
26 | #include <linux/errno.h> | ||
27 | #include <linux/sched.h> /* request_irq() */ | ||
28 | #include <linux/module.h> | ||
29 | #include <linux/platform_device.h> | ||
30 | #include <linux/platform_data/brcmfmac-sdio.h> | ||
31 | #include <net/cfg80211.h> | ||
32 | |||
33 | #include <defs.h> | ||
34 | #include <brcm_hw_ids.h> | ||
35 | #include <brcmu_utils.h> | ||
36 | #include <brcmu_wifi.h> | ||
37 | #include "sdio_host.h" | ||
38 | #include "sdio_chip.h" | ||
39 | #include "dhd_dbg.h" | ||
40 | #include "dhd_bus.h" | ||
41 | |||
42 | #define SDIO_VENDOR_ID_BROADCOM 0x02d0 | ||
43 | |||
44 | #define DMA_ALIGN_MASK 0x03 | ||
45 | |||
46 | #define SDIO_FUNC1_BLOCKSIZE 64 | ||
47 | #define SDIO_FUNC2_BLOCKSIZE 512 | ||
48 | |||
49 | /* devices we support, null terminated */ | ||
50 | static const struct sdio_device_id brcmf_sdmmc_ids[] = { | ||
51 | {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_43143)}, | ||
52 | {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_43241)}, | ||
53 | {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4329)}, | ||
54 | {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4330)}, | ||
55 | {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4334)}, | ||
56 | {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, | ||
57 | SDIO_DEVICE_ID_BROADCOM_4335_4339)}, | ||
58 | { /* end: all zeroes */ }, | ||
59 | }; | ||
60 | MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids); | ||
61 | |||
62 | static struct brcmfmac_sdio_platform_data *brcmfmac_sdio_pdata; | ||
63 | |||
64 | |||
65 | bool | ||
66 | brcmf_pm_resume_error(struct brcmf_sdio_dev *sdiodev) | ||
67 | { | ||
68 | bool is_err = false; | ||
69 | #ifdef CONFIG_PM_SLEEP | ||
70 | is_err = atomic_read(&sdiodev->suspend); | ||
71 | #endif | ||
72 | return is_err; | ||
73 | } | ||
74 | |||
75 | void | ||
76 | brcmf_pm_resume_wait(struct brcmf_sdio_dev *sdiodev, wait_queue_head_t *wq) | ||
77 | { | ||
78 | #ifdef CONFIG_PM_SLEEP | ||
79 | int retry = 0; | ||
80 | while (atomic_read(&sdiodev->suspend) && retry++ != 30) | ||
81 | wait_event_timeout(*wq, false, HZ/100); | ||
82 | #endif | ||
83 | } | ||
84 | |||
85 | static inline int brcmf_sdioh_f0_write_byte(struct brcmf_sdio_dev *sdiodev, | ||
86 | uint regaddr, u8 *byte) | ||
87 | { | ||
88 | struct sdio_func *sdfunc = sdiodev->func[0]; | ||
89 | int err_ret; | ||
90 | |||
91 | /* | ||
92 | * Can only directly write to some F0 registers. | ||
93 | * Handle F2 enable/disable and Abort command | ||
94 | * as a special case. | ||
95 | */ | ||
96 | if (regaddr == SDIO_CCCR_IOEx) { | ||
97 | sdfunc = sdiodev->func[2]; | ||
98 | if (sdfunc) { | ||
99 | if (*byte & SDIO_FUNC_ENABLE_2) { | ||
100 | /* Enable Function 2 */ | ||
101 | err_ret = sdio_enable_func(sdfunc); | ||
102 | if (err_ret) | ||
103 | brcmf_err("enable F2 failed:%d\n", | ||
104 | err_ret); | ||
105 | } else { | ||
106 | /* Disable Function 2 */ | ||
107 | err_ret = sdio_disable_func(sdfunc); | ||
108 | if (err_ret) | ||
109 | brcmf_err("Disable F2 failed:%d\n", | ||
110 | err_ret); | ||
111 | } | ||
112 | } else { | ||
113 | err_ret = -ENOENT; | ||
114 | } | ||
115 | } else if ((regaddr == SDIO_CCCR_ABORT) || | ||
116 | (regaddr == SDIO_CCCR_IENx)) { | ||
117 | sdfunc = kmemdup(sdiodev->func[0], sizeof(struct sdio_func), | ||
118 | GFP_KERNEL); | ||
119 | if (!sdfunc) | ||
120 | return -ENOMEM; | ||
121 | sdfunc->num = 0; | ||
122 | sdio_writeb(sdfunc, *byte, regaddr, &err_ret); | ||
123 | kfree(sdfunc); | ||
124 | } else if (regaddr < 0xF0) { | ||
125 | brcmf_err("F0 Wr:0x%02x: write disallowed\n", regaddr); | ||
126 | err_ret = -EPERM; | ||
127 | } else { | ||
128 | sdio_f0_writeb(sdfunc, *byte, regaddr, &err_ret); | ||
129 | } | ||
130 | |||
131 | return err_ret; | ||
132 | } | ||
133 | |||
134 | int brcmf_sdioh_request_byte(struct brcmf_sdio_dev *sdiodev, uint rw, uint func, | ||
135 | uint regaddr, u8 *byte) | ||
136 | { | ||
137 | int err_ret; | ||
138 | |||
139 | brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x\n", rw, func, regaddr); | ||
140 | |||
141 | brcmf_pm_resume_wait(sdiodev, &sdiodev->request_byte_wait); | ||
142 | if (brcmf_pm_resume_error(sdiodev)) | ||
143 | return -EIO; | ||
144 | |||
145 | if (rw && func == 0) { | ||
146 | /* handle F0 separately */ | ||
147 | err_ret = brcmf_sdioh_f0_write_byte(sdiodev, regaddr, byte); | ||
148 | } else { | ||
149 | if (rw) /* CMD52 Write */ | ||
150 | sdio_writeb(sdiodev->func[func], *byte, regaddr, | ||
151 | &err_ret); | ||
152 | else if (func == 0) { | ||
153 | *byte = sdio_f0_readb(sdiodev->func[func], regaddr, | ||
154 | &err_ret); | ||
155 | } else { | ||
156 | *byte = sdio_readb(sdiodev->func[func], regaddr, | ||
157 | &err_ret); | ||
158 | } | ||
159 | } | ||
160 | |||
161 | if (err_ret) { | ||
162 | /* | ||
163 | * SleepCSR register access can fail when | ||
164 | * waking up the device so reduce this noise | ||
165 | * in the logs. | ||
166 | */ | ||
167 | if (regaddr != SBSDIO_FUNC1_SLEEPCSR) | ||
168 | brcmf_err("Failed to %s byte F%d:@0x%05x=%02x, Err: %d\n", | ||
169 | rw ? "write" : "read", func, regaddr, *byte, | ||
170 | err_ret); | ||
171 | else | ||
172 | brcmf_dbg(SDIO, "Failed to %s byte F%d:@0x%05x=%02x, Err: %d\n", | ||
173 | rw ? "write" : "read", func, regaddr, *byte, | ||
174 | err_ret); | ||
175 | } | ||
176 | return err_ret; | ||
177 | } | ||
178 | |||
179 | int brcmf_sdioh_request_word(struct brcmf_sdio_dev *sdiodev, | ||
180 | uint rw, uint func, uint addr, u32 *word, | ||
181 | uint nbytes) | ||
182 | { | ||
183 | int err_ret = -EIO; | ||
184 | |||
185 | if (func == 0) { | ||
186 | brcmf_err("Only CMD52 allowed to F0\n"); | ||
187 | return -EINVAL; | ||
188 | } | ||
189 | |||
190 | brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x, nbytes=%d\n", | ||
191 | rw, func, addr, nbytes); | ||
192 | |||
193 | brcmf_pm_resume_wait(sdiodev, &sdiodev->request_word_wait); | ||
194 | if (brcmf_pm_resume_error(sdiodev)) | ||
195 | return -EIO; | ||
196 | |||
197 | if (rw) { /* CMD52 Write */ | ||
198 | if (nbytes == 4) | ||
199 | sdio_writel(sdiodev->func[func], *word, addr, | ||
200 | &err_ret); | ||
201 | else if (nbytes == 2) | ||
202 | sdio_writew(sdiodev->func[func], (*word & 0xFFFF), | ||
203 | addr, &err_ret); | ||
204 | else | ||
205 | brcmf_err("Invalid nbytes: %d\n", nbytes); | ||
206 | } else { /* CMD52 Read */ | ||
207 | if (nbytes == 4) | ||
208 | *word = sdio_readl(sdiodev->func[func], addr, &err_ret); | ||
209 | else if (nbytes == 2) | ||
210 | *word = sdio_readw(sdiodev->func[func], addr, | ||
211 | &err_ret) & 0xFFFF; | ||
212 | else | ||
213 | brcmf_err("Invalid nbytes: %d\n", nbytes); | ||
214 | } | ||
215 | |||
216 | if (err_ret) | ||
217 | brcmf_err("Failed to %s word, Err: 0x%08x\n", | ||
218 | rw ? "write" : "read", err_ret); | ||
219 | |||
220 | return err_ret; | ||
221 | } | ||
222 | |||
223 | static int brcmf_sdioh_get_cisaddr(struct brcmf_sdio_dev *sdiodev, u32 regaddr) | ||
224 | { | ||
225 | /* read 24 bits and return valid 17 bit addr */ | ||
226 | int i, ret; | ||
227 | u32 scratch, regdata; | ||
228 | __le32 scratch_le; | ||
229 | u8 *ptr = (u8 *)&scratch_le; | ||
230 | |||
231 | for (i = 0; i < 3; i++) { | ||
232 | regdata = brcmf_sdio_regrl(sdiodev, regaddr, &ret); | ||
233 | if (ret != 0) | ||
234 | brcmf_err("Can't read!\n"); | ||
235 | |||
236 | *ptr++ = (u8) regdata; | ||
237 | regaddr++; | ||
238 | } | ||
239 | |||
240 | /* Only the lower 17-bits are valid */ | ||
241 | scratch = le32_to_cpu(scratch_le); | ||
242 | scratch &= 0x0001FFFF; | ||
243 | return scratch; | ||
244 | } | ||
245 | |||
246 | static int brcmf_sdioh_enablefuncs(struct brcmf_sdio_dev *sdiodev) | ||
247 | { | ||
248 | int err_ret; | ||
249 | u32 fbraddr; | ||
250 | u8 func; | ||
251 | |||
252 | brcmf_dbg(SDIO, "\n"); | ||
253 | |||
254 | /* Get the Card's common CIS address */ | ||
255 | sdiodev->func_cis_ptr[0] = brcmf_sdioh_get_cisaddr(sdiodev, | ||
256 | SDIO_CCCR_CIS); | ||
257 | brcmf_dbg(SDIO, "Card's Common CIS Ptr = 0x%x\n", | ||
258 | sdiodev->func_cis_ptr[0]); | ||
259 | |||
260 | /* Get the Card's function CIS (for each function) */ | ||
261 | for (fbraddr = SDIO_FBR_BASE(1), func = 1; | ||
262 | func <= sdiodev->num_funcs; func++, fbraddr += SDIOD_FBR_SIZE) { | ||
263 | sdiodev->func_cis_ptr[func] = | ||
264 | brcmf_sdioh_get_cisaddr(sdiodev, SDIO_FBR_CIS + fbraddr); | ||
265 | brcmf_dbg(SDIO, "Function %d CIS Ptr = 0x%x\n", | ||
266 | func, sdiodev->func_cis_ptr[func]); | ||
267 | } | ||
268 | |||
269 | /* Enable Function 1 */ | ||
270 | err_ret = sdio_enable_func(sdiodev->func[1]); | ||
271 | if (err_ret) | ||
272 | brcmf_err("Failed to enable F1 Err: 0x%08x\n", err_ret); | ||
273 | |||
274 | return false; | ||
275 | } | ||
276 | |||
277 | /* | ||
278 | * Public entry points & extern's | ||
279 | */ | ||
280 | int brcmf_sdioh_attach(struct brcmf_sdio_dev *sdiodev) | ||
281 | { | ||
282 | int err_ret = 0; | ||
283 | struct mmc_host *host; | ||
284 | struct sdio_func *func; | ||
285 | uint max_blocks; | ||
286 | |||
287 | brcmf_dbg(SDIO, "\n"); | ||
288 | |||
289 | sdiodev->num_funcs = 2; | ||
290 | |||
291 | sdio_claim_host(sdiodev->func[1]); | ||
292 | |||
293 | err_ret = sdio_set_block_size(sdiodev->func[1], SDIO_FUNC1_BLOCKSIZE); | ||
294 | if (err_ret) { | ||
295 | brcmf_err("Failed to set F1 blocksize\n"); | ||
296 | goto out; | ||
297 | } | ||
298 | |||
299 | err_ret = sdio_set_block_size(sdiodev->func[2], SDIO_FUNC2_BLOCKSIZE); | ||
300 | if (err_ret) { | ||
301 | brcmf_err("Failed to set F2 blocksize\n"); | ||
302 | goto out; | ||
303 | } | ||
304 | |||
305 | brcmf_sdioh_enablefuncs(sdiodev); | ||
306 | |||
307 | /* | ||
308 | * determine host related variables after brcmf_sdio_probe() | ||
309 | * as func->cur_blksize is properly set and F2 init has been | ||
310 | * completed successfully. | ||
311 | */ | ||
312 | func = sdiodev->func[2]; | ||
313 | host = func->card->host; | ||
314 | sdiodev->sg_support = host->max_segs > 1; | ||
315 | max_blocks = min_t(uint, host->max_blk_count, 511u); | ||
316 | sdiodev->max_request_size = min_t(uint, host->max_req_size, | ||
317 | max_blocks * func->cur_blksize); | ||
318 | sdiodev->max_segment_count = min_t(uint, host->max_segs, | ||
319 | SG_MAX_SINGLE_ALLOC); | ||
320 | sdiodev->max_segment_size = host->max_seg_size; | ||
321 | out: | ||
322 | sdio_release_host(sdiodev->func[1]); | ||
323 | brcmf_dbg(SDIO, "Done\n"); | ||
324 | return err_ret; | ||
325 | } | ||
326 | |||
327 | void brcmf_sdioh_detach(struct brcmf_sdio_dev *sdiodev) | ||
328 | { | ||
329 | brcmf_dbg(SDIO, "\n"); | ||
330 | |||
331 | /* Disable Function 2 */ | ||
332 | sdio_claim_host(sdiodev->func[2]); | ||
333 | sdio_disable_func(sdiodev->func[2]); | ||
334 | sdio_release_host(sdiodev->func[2]); | ||
335 | |||
336 | /* Disable Function 1 */ | ||
337 | sdio_claim_host(sdiodev->func[1]); | ||
338 | sdio_disable_func(sdiodev->func[1]); | ||
339 | sdio_release_host(sdiodev->func[1]); | ||
340 | |||
341 | } | ||
342 | |||
343 | static int brcmf_ops_sdio_probe(struct sdio_func *func, | ||
344 | const struct sdio_device_id *id) | ||
345 | { | ||
346 | int err; | ||
347 | struct brcmf_sdio_dev *sdiodev; | ||
348 | struct brcmf_bus *bus_if; | ||
349 | |||
350 | brcmf_dbg(SDIO, "Enter\n"); | ||
351 | brcmf_dbg(SDIO, "Class=%x\n", func->class); | ||
352 | brcmf_dbg(SDIO, "sdio vendor ID: 0x%04x\n", func->vendor); | ||
353 | brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device); | ||
354 | brcmf_dbg(SDIO, "Function#: %d\n", func->num); | ||
355 | |||
356 | /* Consume func num 1 but dont do anything with it. */ | ||
357 | if (func->num == 1) | ||
358 | return 0; | ||
359 | |||
360 | /* Ignore anything but func 2 */ | ||
361 | if (func->num != 2) | ||
362 | return -ENODEV; | ||
363 | |||
364 | bus_if = kzalloc(sizeof(struct brcmf_bus), GFP_KERNEL); | ||
365 | if (!bus_if) | ||
366 | return -ENOMEM; | ||
367 | sdiodev = kzalloc(sizeof(struct brcmf_sdio_dev), GFP_KERNEL); | ||
368 | if (!sdiodev) { | ||
369 | kfree(bus_if); | ||
370 | return -ENOMEM; | ||
371 | } | ||
372 | |||
373 | sdiodev->func[0] = func->card->sdio_func[0]; | ||
374 | sdiodev->func[1] = func->card->sdio_func[0]; | ||
375 | sdiodev->func[2] = func; | ||
376 | |||
377 | sdiodev->bus_if = bus_if; | ||
378 | bus_if->bus_priv.sdio = sdiodev; | ||
379 | dev_set_drvdata(&func->dev, bus_if); | ||
380 | dev_set_drvdata(&sdiodev->func[1]->dev, bus_if); | ||
381 | sdiodev->dev = &sdiodev->func[1]->dev; | ||
382 | sdiodev->pdata = brcmfmac_sdio_pdata; | ||
383 | |||
384 | atomic_set(&sdiodev->suspend, false); | ||
385 | init_waitqueue_head(&sdiodev->request_byte_wait); | ||
386 | init_waitqueue_head(&sdiodev->request_word_wait); | ||
387 | init_waitqueue_head(&sdiodev->request_buffer_wait); | ||
388 | |||
389 | brcmf_dbg(SDIO, "F2 found, calling brcmf_sdio_probe...\n"); | ||
390 | err = brcmf_sdio_probe(sdiodev); | ||
391 | if (err) { | ||
392 | brcmf_err("F2 error, probe failed %d...\n", err); | ||
393 | goto fail; | ||
394 | } | ||
395 | |||
396 | brcmf_dbg(SDIO, "F2 init completed...\n"); | ||
397 | return 0; | ||
398 | |||
399 | fail: | ||
400 | dev_set_drvdata(&func->dev, NULL); | ||
401 | dev_set_drvdata(&sdiodev->func[1]->dev, NULL); | ||
402 | kfree(sdiodev); | ||
403 | kfree(bus_if); | ||
404 | return err; | ||
405 | } | ||
406 | |||
407 | static void brcmf_ops_sdio_remove(struct sdio_func *func) | ||
408 | { | ||
409 | struct brcmf_bus *bus_if; | ||
410 | struct brcmf_sdio_dev *sdiodev; | ||
411 | |||
412 | brcmf_dbg(SDIO, "Enter\n"); | ||
413 | brcmf_dbg(SDIO, "sdio vendor ID: 0x%04x\n", func->vendor); | ||
414 | brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device); | ||
415 | brcmf_dbg(SDIO, "Function: %d\n", func->num); | ||
416 | |||
417 | if (func->num != 1 && func->num != 2) | ||
418 | return; | ||
419 | |||
420 | bus_if = dev_get_drvdata(&func->dev); | ||
421 | if (bus_if) { | ||
422 | sdiodev = bus_if->bus_priv.sdio; | ||
423 | brcmf_sdio_remove(sdiodev); | ||
424 | |||
425 | dev_set_drvdata(&sdiodev->func[1]->dev, NULL); | ||
426 | dev_set_drvdata(&sdiodev->func[2]->dev, NULL); | ||
427 | |||
428 | kfree(bus_if); | ||
429 | kfree(sdiodev); | ||
430 | } | ||
431 | |||
432 | brcmf_dbg(SDIO, "Exit\n"); | ||
433 | } | ||
434 | |||
435 | #ifdef CONFIG_PM_SLEEP | ||
436 | static int brcmf_sdio_suspend(struct device *dev) | ||
437 | { | ||
438 | mmc_pm_flag_t sdio_flags; | ||
439 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||
440 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; | ||
441 | int ret = 0; | ||
442 | |||
443 | brcmf_dbg(SDIO, "\n"); | ||
444 | |||
445 | atomic_set(&sdiodev->suspend, true); | ||
446 | |||
447 | sdio_flags = sdio_get_host_pm_caps(sdiodev->func[1]); | ||
448 | if (!(sdio_flags & MMC_PM_KEEP_POWER)) { | ||
449 | brcmf_err("Host can't keep power while suspended\n"); | ||
450 | return -EINVAL; | ||
451 | } | ||
452 | |||
453 | ret = sdio_set_host_pm_flags(sdiodev->func[1], MMC_PM_KEEP_POWER); | ||
454 | if (ret) { | ||
455 | brcmf_err("Failed to set pm_flags\n"); | ||
456 | return ret; | ||
457 | } | ||
458 | |||
459 | brcmf_sdio_wdtmr_enable(sdiodev, false); | ||
460 | |||
461 | return ret; | ||
462 | } | ||
463 | |||
464 | static int brcmf_sdio_resume(struct device *dev) | ||
465 | { | ||
466 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||
467 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; | ||
468 | |||
469 | brcmf_sdio_wdtmr_enable(sdiodev, true); | ||
470 | atomic_set(&sdiodev->suspend, false); | ||
471 | return 0; | ||
472 | } | ||
473 | |||
474 | static const struct dev_pm_ops brcmf_sdio_pm_ops = { | ||
475 | .suspend = brcmf_sdio_suspend, | ||
476 | .resume = brcmf_sdio_resume, | ||
477 | }; | ||
478 | #endif /* CONFIG_PM_SLEEP */ | ||
479 | |||
480 | static struct sdio_driver brcmf_sdmmc_driver = { | ||
481 | .probe = brcmf_ops_sdio_probe, | ||
482 | .remove = brcmf_ops_sdio_remove, | ||
483 | .name = BRCMFMAC_SDIO_PDATA_NAME, | ||
484 | .id_table = brcmf_sdmmc_ids, | ||
485 | #ifdef CONFIG_PM_SLEEP | ||
486 | .drv = { | ||
487 | .pm = &brcmf_sdio_pm_ops, | ||
488 | }, | ||
489 | #endif /* CONFIG_PM_SLEEP */ | ||
490 | }; | ||
491 | |||
492 | static int brcmf_sdio_pd_probe(struct platform_device *pdev) | ||
493 | { | ||
494 | brcmf_dbg(SDIO, "Enter\n"); | ||
495 | |||
496 | brcmfmac_sdio_pdata = dev_get_platdata(&pdev->dev); | ||
497 | |||
498 | if (brcmfmac_sdio_pdata->power_on) | ||
499 | brcmfmac_sdio_pdata->power_on(); | ||
500 | |||
501 | return 0; | ||
502 | } | ||
503 | |||
504 | static int brcmf_sdio_pd_remove(struct platform_device *pdev) | ||
505 | { | ||
506 | brcmf_dbg(SDIO, "Enter\n"); | ||
507 | |||
508 | if (brcmfmac_sdio_pdata->power_off) | ||
509 | brcmfmac_sdio_pdata->power_off(); | ||
510 | |||
511 | sdio_unregister_driver(&brcmf_sdmmc_driver); | ||
512 | |||
513 | return 0; | ||
514 | } | ||
515 | |||
516 | static struct platform_driver brcmf_sdio_pd = { | ||
517 | .remove = brcmf_sdio_pd_remove, | ||
518 | .driver = { | ||
519 | .name = BRCMFMAC_SDIO_PDATA_NAME, | ||
520 | .owner = THIS_MODULE, | ||
521 | } | ||
522 | }; | ||
523 | |||
524 | void brcmf_sdio_register(void) | ||
525 | { | ||
526 | int ret; | ||
527 | |||
528 | ret = sdio_register_driver(&brcmf_sdmmc_driver); | ||
529 | if (ret) | ||
530 | brcmf_err("sdio_register_driver failed: %d\n", ret); | ||
531 | } | ||
532 | |||
533 | void brcmf_sdio_exit(void) | ||
534 | { | ||
535 | brcmf_dbg(SDIO, "Enter\n"); | ||
536 | |||
537 | if (brcmfmac_sdio_pdata) | ||
538 | platform_driver_unregister(&brcmf_sdio_pd); | ||
539 | else | ||
540 | sdio_unregister_driver(&brcmf_sdmmc_driver); | ||
541 | } | ||
542 | |||
543 | void __init brcmf_sdio_init(void) | ||
544 | { | ||
545 | int ret; | ||
546 | |||
547 | brcmf_dbg(SDIO, "Enter\n"); | ||
548 | |||
549 | ret = platform_driver_probe(&brcmf_sdio_pd, brcmf_sdio_pd_probe); | ||
550 | if (ret == -ENODEV) | ||
551 | brcmf_dbg(SDIO, "No platform data available.\n"); | ||
552 | } | ||
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h index 6a54905528be..5c12a07673fa 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h | |||
@@ -24,6 +24,12 @@ enum brcmf_bus_state { | |||
24 | BRCMF_BUS_DATA /* Ready for frame transfers */ | 24 | BRCMF_BUS_DATA /* Ready for frame transfers */ |
25 | }; | 25 | }; |
26 | 26 | ||
27 | /* The level of bus communication with the dongle */ | ||
28 | enum brcmf_bus_protocol_type { | ||
29 | BRCMF_PROTO_BCDC, | ||
30 | BRCMF_PROTO_MSGBUF | ||
31 | }; | ||
32 | |||
27 | struct brcmf_bus_dcmd { | 33 | struct brcmf_bus_dcmd { |
28 | char *name; | 34 | char *name; |
29 | char *param; | 35 | char *param; |
@@ -65,6 +71,7 @@ struct brcmf_bus_ops { | |||
65 | * struct brcmf_bus - interface structure between common and bus layer | 71 | * struct brcmf_bus - interface structure between common and bus layer |
66 | * | 72 | * |
67 | * @bus_priv: pointer to private bus device. | 73 | * @bus_priv: pointer to private bus device. |
74 | * @proto_type: protocol type, bcdc or msgbuf | ||
68 | * @dev: device pointer of bus device. | 75 | * @dev: device pointer of bus device. |
69 | * @drvr: public driver information. | 76 | * @drvr: public driver information. |
70 | * @state: operational state of the bus interface. | 77 | * @state: operational state of the bus interface. |
@@ -80,6 +87,7 @@ struct brcmf_bus { | |||
80 | struct brcmf_sdio_dev *sdio; | 87 | struct brcmf_sdio_dev *sdio; |
81 | struct brcmf_usbdev *usb; | 88 | struct brcmf_usbdev *usb; |
82 | } bus_priv; | 89 | } bus_priv; |
90 | enum brcmf_bus_protocol_type proto_type; | ||
83 | struct device *dev; | 91 | struct device *dev; |
84 | struct brcmf_pub *drvr; | 92 | struct brcmf_pub *drvr; |
85 | enum brcmf_bus_state state; | 93 | enum brcmf_bus_state state; |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c index 0f95f3e79c10..f214510e3bee 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | |||
@@ -260,9 +260,6 @@ struct rte_console { | |||
260 | #define MAX_HDR_READ (1 << 6) | 260 | #define MAX_HDR_READ (1 << 6) |
261 | #define MAX_RX_DATASZ 2048 | 261 | #define MAX_RX_DATASZ 2048 |
262 | 262 | ||
263 | /* Maximum milliseconds to wait for F2 to come up */ | ||
264 | #define BRCMF_WAIT_F2RDY 3000 | ||
265 | |||
266 | /* Bump up limit on waiting for HT to account for first startup; | 263 | /* Bump up limit on waiting for HT to account for first startup; |
267 | * if the image is doing a CRC calculation before programming the PMU | 264 | * if the image is doing a CRC calculation before programming the PMU |
268 | * for HT availability, it could take a couple hundred ms more, so | 265 | * for HT availability, it could take a couple hundred ms more, so |
@@ -559,7 +556,7 @@ static const struct brcmf_firmware_names brcmf_fwname_data[] = { | |||
559 | }; | 556 | }; |
560 | 557 | ||
561 | 558 | ||
562 | static const struct firmware *brcmf_sdbrcm_get_fw(struct brcmf_sdio *bus, | 559 | static const struct firmware *brcmf_sdio_get_fw(struct brcmf_sdio *bus, |
563 | enum brcmf_firmware_type type) | 560 | enum brcmf_firmware_type type) |
564 | { | 561 | { |
565 | const struct firmware *fw; | 562 | const struct firmware *fw; |
@@ -624,8 +621,8 @@ r_sdreg32(struct brcmf_sdio *bus, u32 *regvar, u32 offset) | |||
624 | u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); | 621 | u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); |
625 | int ret; | 622 | int ret; |
626 | 623 | ||
627 | *regvar = brcmf_sdio_regrl(bus->sdiodev, | 624 | *regvar = brcmf_sdiod_regrl(bus->sdiodev, |
628 | bus->ci->c_inf[idx].base + offset, &ret); | 625 | bus->ci->c_inf[idx].base + offset, &ret); |
629 | 626 | ||
630 | return ret; | 627 | return ret; |
631 | } | 628 | } |
@@ -636,15 +633,15 @@ w_sdreg32(struct brcmf_sdio *bus, u32 regval, u32 reg_offset) | |||
636 | u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); | 633 | u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); |
637 | int ret; | 634 | int ret; |
638 | 635 | ||
639 | brcmf_sdio_regwl(bus->sdiodev, | 636 | brcmf_sdiod_regwl(bus->sdiodev, |
640 | bus->ci->c_inf[idx].base + reg_offset, | 637 | bus->ci->c_inf[idx].base + reg_offset, |
641 | regval, &ret); | 638 | regval, &ret); |
642 | 639 | ||
643 | return ret; | 640 | return ret; |
644 | } | 641 | } |
645 | 642 | ||
646 | static int | 643 | static int |
647 | brcmf_sdbrcm_kso_control(struct brcmf_sdio *bus, bool on) | 644 | brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool on) |
648 | { | 645 | { |
649 | u8 wr_val = 0, rd_val, cmp_val, bmask; | 646 | u8 wr_val = 0, rd_val, cmp_val, bmask; |
650 | int err = 0; | 647 | int err = 0; |
@@ -654,8 +651,8 @@ brcmf_sdbrcm_kso_control(struct brcmf_sdio *bus, bool on) | |||
654 | 651 | ||
655 | wr_val = (on << SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT); | 652 | wr_val = (on << SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT); |
656 | /* 1st KSO write goes to AOS wake up core if device is asleep */ | 653 | /* 1st KSO write goes to AOS wake up core if device is asleep */ |
657 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, | 654 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, |
658 | wr_val, &err); | 655 | wr_val, &err); |
659 | if (err) { | 656 | if (err) { |
660 | brcmf_err("SDIO_AOS KSO write error: %d\n", err); | 657 | brcmf_err("SDIO_AOS KSO write error: %d\n", err); |
661 | return err; | 658 | return err; |
@@ -685,15 +682,15 @@ brcmf_sdbrcm_kso_control(struct brcmf_sdio *bus, bool on) | |||
685 | * just one write attempt may fail, | 682 | * just one write attempt may fail, |
686 | * read it back until it matches written value | 683 | * read it back until it matches written value |
687 | */ | 684 | */ |
688 | rd_val = brcmf_sdio_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, | 685 | rd_val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, |
689 | &err); | 686 | &err); |
690 | if (((rd_val & bmask) == cmp_val) && !err) | 687 | if (((rd_val & bmask) == cmp_val) && !err) |
691 | break; | 688 | break; |
692 | brcmf_dbg(SDIO, "KSO wr/rd retry:%d (max: %d) ERR:%x\n", | 689 | brcmf_dbg(SDIO, "KSO wr/rd retry:%d (max: %d) ERR:%x\n", |
693 | try_cnt, MAX_KSO_ATTEMPTS, err); | 690 | try_cnt, MAX_KSO_ATTEMPTS, err); |
694 | udelay(KSO_WAIT_US); | 691 | udelay(KSO_WAIT_US); |
695 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, | 692 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, |
696 | wr_val, &err); | 693 | wr_val, &err); |
697 | } while (try_cnt++ < MAX_KSO_ATTEMPTS); | 694 | } while (try_cnt++ < MAX_KSO_ATTEMPTS); |
698 | 695 | ||
699 | return err; | 696 | return err; |
@@ -704,7 +701,7 @@ brcmf_sdbrcm_kso_control(struct brcmf_sdio *bus, bool on) | |||
704 | #define HOSTINTMASK (I_HMB_SW_MASK | I_CHIPACTIVE) | 701 | #define HOSTINTMASK (I_HMB_SW_MASK | I_CHIPACTIVE) |
705 | 702 | ||
706 | /* Turn backplane clock on or off */ | 703 | /* Turn backplane clock on or off */ |
707 | static int brcmf_sdbrcm_htclk(struct brcmf_sdio *bus, bool on, bool pendok) | 704 | static int brcmf_sdio_htclk(struct brcmf_sdio *bus, bool on, bool pendok) |
708 | { | 705 | { |
709 | int err; | 706 | int err; |
710 | u8 clkctl, clkreq, devctl; | 707 | u8 clkctl, clkreq, devctl; |
@@ -724,16 +721,16 @@ static int brcmf_sdbrcm_htclk(struct brcmf_sdio *bus, bool on, bool pendok) | |||
724 | clkreq = | 721 | clkreq = |
725 | bus->alp_only ? SBSDIO_ALP_AVAIL_REQ : SBSDIO_HT_AVAIL_REQ; | 722 | bus->alp_only ? SBSDIO_ALP_AVAIL_REQ : SBSDIO_HT_AVAIL_REQ; |
726 | 723 | ||
727 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, | 724 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, |
728 | clkreq, &err); | 725 | clkreq, &err); |
729 | if (err) { | 726 | if (err) { |
730 | brcmf_err("HT Avail request error: %d\n", err); | 727 | brcmf_err("HT Avail request error: %d\n", err); |
731 | return -EBADE; | 728 | return -EBADE; |
732 | } | 729 | } |
733 | 730 | ||
734 | /* Check current status */ | 731 | /* Check current status */ |
735 | clkctl = brcmf_sdio_regrb(bus->sdiodev, | 732 | clkctl = brcmf_sdiod_regrb(bus->sdiodev, |
736 | SBSDIO_FUNC1_CHIPCLKCSR, &err); | 733 | SBSDIO_FUNC1_CHIPCLKCSR, &err); |
737 | if (err) { | 734 | if (err) { |
738 | brcmf_err("HT Avail read error: %d\n", err); | 735 | brcmf_err("HT Avail read error: %d\n", err); |
739 | return -EBADE; | 736 | return -EBADE; |
@@ -742,8 +739,8 @@ static int brcmf_sdbrcm_htclk(struct brcmf_sdio *bus, bool on, bool pendok) | |||
742 | /* Go to pending and await interrupt if appropriate */ | 739 | /* Go to pending and await interrupt if appropriate */ |
743 | if (!SBSDIO_CLKAV(clkctl, bus->alp_only) && pendok) { | 740 | if (!SBSDIO_CLKAV(clkctl, bus->alp_only) && pendok) { |
744 | /* Allow only clock-available interrupt */ | 741 | /* Allow only clock-available interrupt */ |
745 | devctl = brcmf_sdio_regrb(bus->sdiodev, | 742 | devctl = brcmf_sdiod_regrb(bus->sdiodev, |
746 | SBSDIO_DEVICE_CTL, &err); | 743 | SBSDIO_DEVICE_CTL, &err); |
747 | if (err) { | 744 | if (err) { |
748 | brcmf_err("Devctl error setting CA: %d\n", | 745 | brcmf_err("Devctl error setting CA: %d\n", |
749 | err); | 746 | err); |
@@ -751,28 +748,28 @@ static int brcmf_sdbrcm_htclk(struct brcmf_sdio *bus, bool on, bool pendok) | |||
751 | } | 748 | } |
752 | 749 | ||
753 | devctl |= SBSDIO_DEVCTL_CA_INT_ONLY; | 750 | devctl |= SBSDIO_DEVCTL_CA_INT_ONLY; |
754 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL, | 751 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL, |
755 | devctl, &err); | 752 | devctl, &err); |
756 | brcmf_dbg(SDIO, "CLKCTL: set PENDING\n"); | 753 | brcmf_dbg(SDIO, "CLKCTL: set PENDING\n"); |
757 | bus->clkstate = CLK_PENDING; | 754 | bus->clkstate = CLK_PENDING; |
758 | 755 | ||
759 | return 0; | 756 | return 0; |
760 | } else if (bus->clkstate == CLK_PENDING) { | 757 | } else if (bus->clkstate == CLK_PENDING) { |
761 | /* Cancel CA-only interrupt filter */ | 758 | /* Cancel CA-only interrupt filter */ |
762 | devctl = brcmf_sdio_regrb(bus->sdiodev, | 759 | devctl = brcmf_sdiod_regrb(bus->sdiodev, |
763 | SBSDIO_DEVICE_CTL, &err); | 760 | SBSDIO_DEVICE_CTL, &err); |
764 | devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; | 761 | devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; |
765 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL, | 762 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL, |
766 | devctl, &err); | 763 | devctl, &err); |
767 | } | 764 | } |
768 | 765 | ||
769 | /* Otherwise, wait here (polling) for HT Avail */ | 766 | /* Otherwise, wait here (polling) for HT Avail */ |
770 | timeout = jiffies + | 767 | timeout = jiffies + |
771 | msecs_to_jiffies(PMU_MAX_TRANSITION_DLY/1000); | 768 | msecs_to_jiffies(PMU_MAX_TRANSITION_DLY/1000); |
772 | while (!SBSDIO_CLKAV(clkctl, bus->alp_only)) { | 769 | while (!SBSDIO_CLKAV(clkctl, bus->alp_only)) { |
773 | clkctl = brcmf_sdio_regrb(bus->sdiodev, | 770 | clkctl = brcmf_sdiod_regrb(bus->sdiodev, |
774 | SBSDIO_FUNC1_CHIPCLKCSR, | 771 | SBSDIO_FUNC1_CHIPCLKCSR, |
775 | &err); | 772 | &err); |
776 | if (time_after(jiffies, timeout)) | 773 | if (time_after(jiffies, timeout)) |
777 | break; | 774 | break; |
778 | else | 775 | else |
@@ -805,16 +802,16 @@ static int brcmf_sdbrcm_htclk(struct brcmf_sdio *bus, bool on, bool pendok) | |||
805 | 802 | ||
806 | if (bus->clkstate == CLK_PENDING) { | 803 | if (bus->clkstate == CLK_PENDING) { |
807 | /* Cancel CA-only interrupt filter */ | 804 | /* Cancel CA-only interrupt filter */ |
808 | devctl = brcmf_sdio_regrb(bus->sdiodev, | 805 | devctl = brcmf_sdiod_regrb(bus->sdiodev, |
809 | SBSDIO_DEVICE_CTL, &err); | 806 | SBSDIO_DEVICE_CTL, &err); |
810 | devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; | 807 | devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; |
811 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL, | 808 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL, |
812 | devctl, &err); | 809 | devctl, &err); |
813 | } | 810 | } |
814 | 811 | ||
815 | bus->clkstate = CLK_SDONLY; | 812 | bus->clkstate = CLK_SDONLY; |
816 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, | 813 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, |
817 | clkreq, &err); | 814 | clkreq, &err); |
818 | brcmf_dbg(SDIO, "CLKCTL: turned OFF\n"); | 815 | brcmf_dbg(SDIO, "CLKCTL: turned OFF\n"); |
819 | if (err) { | 816 | if (err) { |
820 | brcmf_err("Failed access turning clock off: %d\n", | 817 | brcmf_err("Failed access turning clock off: %d\n", |
@@ -826,7 +823,7 @@ static int brcmf_sdbrcm_htclk(struct brcmf_sdio *bus, bool on, bool pendok) | |||
826 | } | 823 | } |
827 | 824 | ||
828 | /* Change idle/active SD state */ | 825 | /* Change idle/active SD state */ |
829 | static int brcmf_sdbrcm_sdclk(struct brcmf_sdio *bus, bool on) | 826 | static int brcmf_sdio_sdclk(struct brcmf_sdio *bus, bool on) |
830 | { | 827 | { |
831 | brcmf_dbg(SDIO, "Enter\n"); | 828 | brcmf_dbg(SDIO, "Enter\n"); |
832 | 829 | ||
@@ -839,7 +836,7 @@ static int brcmf_sdbrcm_sdclk(struct brcmf_sdio *bus, bool on) | |||
839 | } | 836 | } |
840 | 837 | ||
841 | /* Transition SD and backplane clock readiness */ | 838 | /* Transition SD and backplane clock readiness */ |
842 | static int brcmf_sdbrcm_clkctl(struct brcmf_sdio *bus, uint target, bool pendok) | 839 | static int brcmf_sdio_clkctl(struct brcmf_sdio *bus, uint target, bool pendok) |
843 | { | 840 | { |
844 | #ifdef DEBUG | 841 | #ifdef DEBUG |
845 | uint oldstate = bus->clkstate; | 842 | uint oldstate = bus->clkstate; |
@@ -850,7 +847,7 @@ static int brcmf_sdbrcm_clkctl(struct brcmf_sdio *bus, uint target, bool pendok) | |||
850 | /* Early exit if we're already there */ | 847 | /* Early exit if we're already there */ |
851 | if (bus->clkstate == target) { | 848 | if (bus->clkstate == target) { |
852 | if (target == CLK_AVAIL) { | 849 | if (target == CLK_AVAIL) { |
853 | brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS); | 850 | brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS); |
854 | bus->activity = true; | 851 | bus->activity = true; |
855 | } | 852 | } |
856 | return 0; | 853 | return 0; |
@@ -860,32 +857,32 @@ static int brcmf_sdbrcm_clkctl(struct brcmf_sdio *bus, uint target, bool pendok) | |||
860 | case CLK_AVAIL: | 857 | case CLK_AVAIL: |
861 | /* Make sure SD clock is available */ | 858 | /* Make sure SD clock is available */ |
862 | if (bus->clkstate == CLK_NONE) | 859 | if (bus->clkstate == CLK_NONE) |
863 | brcmf_sdbrcm_sdclk(bus, true); | 860 | brcmf_sdio_sdclk(bus, true); |
864 | /* Now request HT Avail on the backplane */ | 861 | /* Now request HT Avail on the backplane */ |
865 | brcmf_sdbrcm_htclk(bus, true, pendok); | 862 | brcmf_sdio_htclk(bus, true, pendok); |
866 | brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS); | 863 | brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS); |
867 | bus->activity = true; | 864 | bus->activity = true; |
868 | break; | 865 | break; |
869 | 866 | ||
870 | case CLK_SDONLY: | 867 | case CLK_SDONLY: |
871 | /* Remove HT request, or bring up SD clock */ | 868 | /* Remove HT request, or bring up SD clock */ |
872 | if (bus->clkstate == CLK_NONE) | 869 | if (bus->clkstate == CLK_NONE) |
873 | brcmf_sdbrcm_sdclk(bus, true); | 870 | brcmf_sdio_sdclk(bus, true); |
874 | else if (bus->clkstate == CLK_AVAIL) | 871 | else if (bus->clkstate == CLK_AVAIL) |
875 | brcmf_sdbrcm_htclk(bus, false, false); | 872 | brcmf_sdio_htclk(bus, false, false); |
876 | else | 873 | else |
877 | brcmf_err("request for %d -> %d\n", | 874 | brcmf_err("request for %d -> %d\n", |
878 | bus->clkstate, target); | 875 | bus->clkstate, target); |
879 | brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS); | 876 | brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS); |
880 | break; | 877 | break; |
881 | 878 | ||
882 | case CLK_NONE: | 879 | case CLK_NONE: |
883 | /* Make sure to remove HT request */ | 880 | /* Make sure to remove HT request */ |
884 | if (bus->clkstate == CLK_AVAIL) | 881 | if (bus->clkstate == CLK_AVAIL) |
885 | brcmf_sdbrcm_htclk(bus, false, false); | 882 | brcmf_sdio_htclk(bus, false, false); |
886 | /* Now remove the SD clock */ | 883 | /* Now remove the SD clock */ |
887 | brcmf_sdbrcm_sdclk(bus, false); | 884 | brcmf_sdio_sdclk(bus, false); |
888 | brcmf_sdbrcm_wd_timer(bus, 0); | 885 | brcmf_sdio_wd_timer(bus, 0); |
889 | break; | 886 | break; |
890 | } | 887 | } |
891 | #ifdef DEBUG | 888 | #ifdef DEBUG |
@@ -896,7 +893,7 @@ static int brcmf_sdbrcm_clkctl(struct brcmf_sdio *bus, uint target, bool pendok) | |||
896 | } | 893 | } |
897 | 894 | ||
898 | static int | 895 | static int |
899 | brcmf_sdbrcm_bus_sleep(struct brcmf_sdio *bus, bool sleep, bool pendok) | 896 | brcmf_sdio_bus_sleep(struct brcmf_sdio *bus, bool sleep, bool pendok) |
900 | { | 897 | { |
901 | int err = 0; | 898 | int err = 0; |
902 | brcmf_dbg(TRACE, "Enter\n"); | 899 | brcmf_dbg(TRACE, "Enter\n"); |
@@ -919,13 +916,13 @@ brcmf_sdbrcm_bus_sleep(struct brcmf_sdio *bus, bool sleep, bool pendok) | |||
919 | brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) && | 916 | brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) && |
920 | data_ok(bus))) | 917 | data_ok(bus))) |
921 | return -EBUSY; | 918 | return -EBUSY; |
922 | err = brcmf_sdbrcm_kso_control(bus, false); | 919 | err = brcmf_sdio_kso_control(bus, false); |
923 | /* disable watchdog */ | 920 | /* disable watchdog */ |
924 | if (!err) | 921 | if (!err) |
925 | brcmf_sdbrcm_wd_timer(bus, 0); | 922 | brcmf_sdio_wd_timer(bus, 0); |
926 | } else { | 923 | } else { |
927 | bus->idlecount = 0; | 924 | bus->idlecount = 0; |
928 | err = brcmf_sdbrcm_kso_control(bus, true); | 925 | err = brcmf_sdio_kso_control(bus, true); |
929 | } | 926 | } |
930 | if (!err) { | 927 | if (!err) { |
931 | /* Change state */ | 928 | /* Change state */ |
@@ -943,16 +940,16 @@ end: | |||
943 | /* control clocks */ | 940 | /* control clocks */ |
944 | if (sleep) { | 941 | if (sleep) { |
945 | if (!bus->sr_enabled) | 942 | if (!bus->sr_enabled) |
946 | brcmf_sdbrcm_clkctl(bus, CLK_NONE, pendok); | 943 | brcmf_sdio_clkctl(bus, CLK_NONE, pendok); |
947 | } else { | 944 | } else { |
948 | brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, pendok); | 945 | brcmf_sdio_clkctl(bus, CLK_AVAIL, pendok); |
949 | } | 946 | } |
950 | 947 | ||
951 | return err; | 948 | return err; |
952 | 949 | ||
953 | } | 950 | } |
954 | 951 | ||
955 | static u32 brcmf_sdbrcm_hostmail(struct brcmf_sdio *bus) | 952 | static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus) |
956 | { | 953 | { |
957 | u32 intstatus = 0; | 954 | u32 intstatus = 0; |
958 | u32 hmb_data; | 955 | u32 hmb_data; |
@@ -1028,7 +1025,7 @@ static u32 brcmf_sdbrcm_hostmail(struct brcmf_sdio *bus) | |||
1028 | return intstatus; | 1025 | return intstatus; |
1029 | } | 1026 | } |
1030 | 1027 | ||
1031 | static void brcmf_sdbrcm_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx) | 1028 | static void brcmf_sdio_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx) |
1032 | { | 1029 | { |
1033 | uint retries = 0; | 1030 | uint retries = 0; |
1034 | u16 lastrbc; | 1031 | u16 lastrbc; |
@@ -1040,18 +1037,18 @@ static void brcmf_sdbrcm_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx) | |||
1040 | rtx ? ", send NAK" : ""); | 1037 | rtx ? ", send NAK" : ""); |
1041 | 1038 | ||
1042 | if (abort) | 1039 | if (abort) |
1043 | brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2); | 1040 | brcmf_sdiod_abort(bus->sdiodev, SDIO_FUNC_2); |
1044 | 1041 | ||
1045 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, | 1042 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, |
1046 | SFC_RF_TERM, &err); | 1043 | SFC_RF_TERM, &err); |
1047 | bus->sdcnt.f1regdata++; | 1044 | bus->sdcnt.f1regdata++; |
1048 | 1045 | ||
1049 | /* Wait until the packet has been flushed (device/FIFO stable) */ | 1046 | /* Wait until the packet has been flushed (device/FIFO stable) */ |
1050 | for (lastrbc = retries = 0xffff; retries > 0; retries--) { | 1047 | for (lastrbc = retries = 0xffff; retries > 0; retries--) { |
1051 | hi = brcmf_sdio_regrb(bus->sdiodev, | 1048 | hi = brcmf_sdiod_regrb(bus->sdiodev, |
1052 | SBSDIO_FUNC1_RFRAMEBCHI, &err); | 1049 | SBSDIO_FUNC1_RFRAMEBCHI, &err); |
1053 | lo = brcmf_sdio_regrb(bus->sdiodev, | 1050 | lo = brcmf_sdiod_regrb(bus->sdiodev, |
1054 | SBSDIO_FUNC1_RFRAMEBCLO, &err); | 1051 | SBSDIO_FUNC1_RFRAMEBCLO, &err); |
1055 | bus->sdcnt.f1regdata += 2; | 1052 | bus->sdcnt.f1regdata += 2; |
1056 | 1053 | ||
1057 | if ((hi == 0) && (lo == 0)) | 1054 | if ((hi == 0) && (lo == 0)) |
@@ -1088,7 +1085,7 @@ static void brcmf_sdbrcm_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx) | |||
1088 | } | 1085 | } |
1089 | 1086 | ||
1090 | /* return total length of buffer chain */ | 1087 | /* return total length of buffer chain */ |
1091 | static uint brcmf_sdbrcm_glom_len(struct brcmf_sdio *bus) | 1088 | static uint brcmf_sdio_glom_len(struct brcmf_sdio *bus) |
1092 | { | 1089 | { |
1093 | struct sk_buff *p; | 1090 | struct sk_buff *p; |
1094 | uint total; | 1091 | uint total; |
@@ -1099,7 +1096,7 @@ static uint brcmf_sdbrcm_glom_len(struct brcmf_sdio *bus) | |||
1099 | return total; | 1096 | return total; |
1100 | } | 1097 | } |
1101 | 1098 | ||
1102 | static void brcmf_sdbrcm_free_glom(struct brcmf_sdio *bus) | 1099 | static void brcmf_sdio_free_glom(struct brcmf_sdio *bus) |
1103 | { | 1100 | { |
1104 | struct sk_buff *cur, *next; | 1101 | struct sk_buff *cur, *next; |
1105 | 1102 | ||
@@ -1187,7 +1184,7 @@ static int brcmf_sdio_hdparse(struct brcmf_sdio *bus, u8 *header, | |||
1187 | if ((u16)(~(len ^ checksum))) { | 1184 | if ((u16)(~(len ^ checksum))) { |
1188 | brcmf_err("HW header checksum error\n"); | 1185 | brcmf_err("HW header checksum error\n"); |
1189 | bus->sdcnt.rx_badhdr++; | 1186 | bus->sdcnt.rx_badhdr++; |
1190 | brcmf_sdbrcm_rxfail(bus, false, false); | 1187 | brcmf_sdio_rxfail(bus, false, false); |
1191 | return -EIO; | 1188 | return -EIO; |
1192 | } | 1189 | } |
1193 | if (len < SDPCM_HDRLEN) { | 1190 | if (len < SDPCM_HDRLEN) { |
@@ -1219,7 +1216,7 @@ static int brcmf_sdio_hdparse(struct brcmf_sdio *bus, u8 *header, | |||
1219 | type != BRCMF_SDIO_FT_SUPER) { | 1216 | type != BRCMF_SDIO_FT_SUPER) { |
1220 | brcmf_err("HW header length too long\n"); | 1217 | brcmf_err("HW header length too long\n"); |
1221 | bus->sdcnt.rx_toolong++; | 1218 | bus->sdcnt.rx_toolong++; |
1222 | brcmf_sdbrcm_rxfail(bus, false, false); | 1219 | brcmf_sdio_rxfail(bus, false, false); |
1223 | rd->len = 0; | 1220 | rd->len = 0; |
1224 | return -EPROTO; | 1221 | return -EPROTO; |
1225 | } | 1222 | } |
@@ -1238,7 +1235,7 @@ static int brcmf_sdio_hdparse(struct brcmf_sdio *bus, u8 *header, | |||
1238 | if (rd->dat_offset < SDPCM_HDRLEN || rd->dat_offset > rd->len) { | 1235 | if (rd->dat_offset < SDPCM_HDRLEN || rd->dat_offset > rd->len) { |
1239 | brcmf_err("seq %d: bad data offset\n", rx_seq); | 1236 | brcmf_err("seq %d: bad data offset\n", rx_seq); |
1240 | bus->sdcnt.rx_badhdr++; | 1237 | bus->sdcnt.rx_badhdr++; |
1241 | brcmf_sdbrcm_rxfail(bus, false, false); | 1238 | brcmf_sdio_rxfail(bus, false, false); |
1242 | rd->len = 0; | 1239 | rd->len = 0; |
1243 | return -ENXIO; | 1240 | return -ENXIO; |
1244 | } | 1241 | } |
@@ -1311,7 +1308,7 @@ static void brcmf_sdio_hdpack(struct brcmf_sdio *bus, u8 *header, | |||
1311 | trace_brcmf_sdpcm_hdr(SDPCM_TX + !!(bus->txglom), header); | 1308 | trace_brcmf_sdpcm_hdr(SDPCM_TX + !!(bus->txglom), header); |
1312 | } | 1309 | } |
1313 | 1310 | ||
1314 | static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq) | 1311 | static u8 brcmf_sdio_rxglom(struct brcmf_sdio *bus, u8 rxseq) |
1315 | { | 1312 | { |
1316 | u16 dlen, totlen; | 1313 | u16 dlen, totlen; |
1317 | u8 *dptr, num = 0; | 1314 | u8 *dptr, num = 0; |
@@ -1391,7 +1388,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq) | |||
1391 | } | 1388 | } |
1392 | pfirst = pnext = NULL; | 1389 | pfirst = pnext = NULL; |
1393 | } else { | 1390 | } else { |
1394 | brcmf_sdbrcm_free_glom(bus); | 1391 | brcmf_sdio_free_glom(bus); |
1395 | num = 0; | 1392 | num = 0; |
1396 | } | 1393 | } |
1397 | 1394 | ||
@@ -1414,16 +1411,15 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq) | |||
1414 | } | 1411 | } |
1415 | 1412 | ||
1416 | pfirst = skb_peek(&bus->glom); | 1413 | pfirst = skb_peek(&bus->glom); |
1417 | dlen = (u16) brcmf_sdbrcm_glom_len(bus); | 1414 | dlen = (u16) brcmf_sdio_glom_len(bus); |
1418 | 1415 | ||
1419 | /* Do an SDIO read for the superframe. Configurable iovar to | 1416 | /* Do an SDIO read for the superframe. Configurable iovar to |
1420 | * read directly into the chained packet, or allocate a large | 1417 | * read directly into the chained packet, or allocate a large |
1421 | * packet and and copy into the chain. | 1418 | * packet and and copy into the chain. |
1422 | */ | 1419 | */ |
1423 | sdio_claim_host(bus->sdiodev->func[1]); | 1420 | sdio_claim_host(bus->sdiodev->func[1]); |
1424 | errcode = brcmf_sdcard_recv_chain(bus->sdiodev, | 1421 | errcode = brcmf_sdiod_recv_chain(bus->sdiodev, |
1425 | bus->sdiodev->sbwad, | 1422 | &bus->glom, dlen); |
1426 | SDIO_FUNC_2, F2SYNC, &bus->glom, dlen); | ||
1427 | sdio_release_host(bus->sdiodev->func[1]); | 1423 | sdio_release_host(bus->sdiodev->func[1]); |
1428 | bus->sdcnt.f2rxdata++; | 1424 | bus->sdcnt.f2rxdata++; |
1429 | 1425 | ||
@@ -1434,12 +1430,12 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq) | |||
1434 | 1430 | ||
1435 | sdio_claim_host(bus->sdiodev->func[1]); | 1431 | sdio_claim_host(bus->sdiodev->func[1]); |
1436 | if (bus->glomerr++ < 3) { | 1432 | if (bus->glomerr++ < 3) { |
1437 | brcmf_sdbrcm_rxfail(bus, true, true); | 1433 | brcmf_sdio_rxfail(bus, true, true); |
1438 | } else { | 1434 | } else { |
1439 | bus->glomerr = 0; | 1435 | bus->glomerr = 0; |
1440 | brcmf_sdbrcm_rxfail(bus, true, false); | 1436 | brcmf_sdio_rxfail(bus, true, false); |
1441 | bus->sdcnt.rxglomfail++; | 1437 | bus->sdcnt.rxglomfail++; |
1442 | brcmf_sdbrcm_free_glom(bus); | 1438 | brcmf_sdio_free_glom(bus); |
1443 | } | 1439 | } |
1444 | sdio_release_host(bus->sdiodev->func[1]); | 1440 | sdio_release_host(bus->sdiodev->func[1]); |
1445 | return 0; | 1441 | return 0; |
@@ -1487,12 +1483,12 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq) | |||
1487 | if (bus->glomerr++ < 3) { | 1483 | if (bus->glomerr++ < 3) { |
1488 | /* Restore superframe header space */ | 1484 | /* Restore superframe header space */ |
1489 | skb_push(pfirst, sfdoff); | 1485 | skb_push(pfirst, sfdoff); |
1490 | brcmf_sdbrcm_rxfail(bus, true, true); | 1486 | brcmf_sdio_rxfail(bus, true, true); |
1491 | } else { | 1487 | } else { |
1492 | bus->glomerr = 0; | 1488 | bus->glomerr = 0; |
1493 | brcmf_sdbrcm_rxfail(bus, true, false); | 1489 | brcmf_sdio_rxfail(bus, true, false); |
1494 | bus->sdcnt.rxglomfail++; | 1490 | bus->sdcnt.rxglomfail++; |
1495 | brcmf_sdbrcm_free_glom(bus); | 1491 | brcmf_sdio_free_glom(bus); |
1496 | } | 1492 | } |
1497 | sdio_release_host(bus->sdiodev->func[1]); | 1493 | sdio_release_host(bus->sdiodev->func[1]); |
1498 | bus->cur_read.len = 0; | 1494 | bus->cur_read.len = 0; |
@@ -1536,8 +1532,8 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq) | |||
1536 | return num; | 1532 | return num; |
1537 | } | 1533 | } |
1538 | 1534 | ||
1539 | static int brcmf_sdbrcm_dcmd_resp_wait(struct brcmf_sdio *bus, uint *condition, | 1535 | static int brcmf_sdio_dcmd_resp_wait(struct brcmf_sdio *bus, uint *condition, |
1540 | bool *pending) | 1536 | bool *pending) |
1541 | { | 1537 | { |
1542 | DECLARE_WAITQUEUE(wait, current); | 1538 | DECLARE_WAITQUEUE(wait, current); |
1543 | int timeout = msecs_to_jiffies(DCMD_RESP_TIMEOUT); | 1539 | int timeout = msecs_to_jiffies(DCMD_RESP_TIMEOUT); |
@@ -1558,7 +1554,7 @@ static int brcmf_sdbrcm_dcmd_resp_wait(struct brcmf_sdio *bus, uint *condition, | |||
1558 | return timeout; | 1554 | return timeout; |
1559 | } | 1555 | } |
1560 | 1556 | ||
1561 | static int brcmf_sdbrcm_dcmd_resp_wake(struct brcmf_sdio *bus) | 1557 | static int brcmf_sdio_dcmd_resp_wake(struct brcmf_sdio *bus) |
1562 | { | 1558 | { |
1563 | if (waitqueue_active(&bus->dcmd_resp_wait)) | 1559 | if (waitqueue_active(&bus->dcmd_resp_wait)) |
1564 | wake_up_interruptible(&bus->dcmd_resp_wait); | 1560 | wake_up_interruptible(&bus->dcmd_resp_wait); |
@@ -1566,7 +1562,7 @@ static int brcmf_sdbrcm_dcmd_resp_wake(struct brcmf_sdio *bus) | |||
1566 | return 0; | 1562 | return 0; |
1567 | } | 1563 | } |
1568 | static void | 1564 | static void |
1569 | brcmf_sdbrcm_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff) | 1565 | brcmf_sdio_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff) |
1570 | { | 1566 | { |
1571 | uint rdlen, pad; | 1567 | uint rdlen, pad; |
1572 | u8 *buf = NULL, *rbuf; | 1568 | u8 *buf = NULL, *rbuf; |
@@ -1604,7 +1600,7 @@ brcmf_sdbrcm_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff) | |||
1604 | if ((rdlen + BRCMF_FIRSTREAD) > bus->sdiodev->bus_if->maxctl) { | 1600 | if ((rdlen + BRCMF_FIRSTREAD) > bus->sdiodev->bus_if->maxctl) { |
1605 | brcmf_err("%d-byte control read exceeds %d-byte buffer\n", | 1601 | brcmf_err("%d-byte control read exceeds %d-byte buffer\n", |
1606 | rdlen, bus->sdiodev->bus_if->maxctl); | 1602 | rdlen, bus->sdiodev->bus_if->maxctl); |
1607 | brcmf_sdbrcm_rxfail(bus, false, false); | 1603 | brcmf_sdio_rxfail(bus, false, false); |
1608 | goto done; | 1604 | goto done; |
1609 | } | 1605 | } |
1610 | 1606 | ||
@@ -1612,15 +1608,12 @@ brcmf_sdbrcm_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff) | |||
1612 | brcmf_err("%d-byte ctl frame (%d-byte ctl data) exceeds %d-byte limit\n", | 1608 | brcmf_err("%d-byte ctl frame (%d-byte ctl data) exceeds %d-byte limit\n", |
1613 | len, len - doff, bus->sdiodev->bus_if->maxctl); | 1609 | len, len - doff, bus->sdiodev->bus_if->maxctl); |
1614 | bus->sdcnt.rx_toolong++; | 1610 | bus->sdcnt.rx_toolong++; |
1615 | brcmf_sdbrcm_rxfail(bus, false, false); | 1611 | brcmf_sdio_rxfail(bus, false, false); |
1616 | goto done; | 1612 | goto done; |
1617 | } | 1613 | } |
1618 | 1614 | ||
1619 | /* Read remain of frame body */ | 1615 | /* Read remain of frame body */ |
1620 | sdret = brcmf_sdcard_recv_buf(bus->sdiodev, | 1616 | sdret = brcmf_sdiod_recv_buf(bus->sdiodev, rbuf, rdlen); |
1621 | bus->sdiodev->sbwad, | ||
1622 | SDIO_FUNC_2, | ||
1623 | F2SYNC, rbuf, rdlen); | ||
1624 | bus->sdcnt.f2rxdata++; | 1617 | bus->sdcnt.f2rxdata++; |
1625 | 1618 | ||
1626 | /* Control frame failures need retransmission */ | 1619 | /* Control frame failures need retransmission */ |
@@ -1628,7 +1621,7 @@ brcmf_sdbrcm_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff) | |||
1628 | brcmf_err("read %d control bytes failed: %d\n", | 1621 | brcmf_err("read %d control bytes failed: %d\n", |
1629 | rdlen, sdret); | 1622 | rdlen, sdret); |
1630 | bus->sdcnt.rxc_errors++; | 1623 | bus->sdcnt.rxc_errors++; |
1631 | brcmf_sdbrcm_rxfail(bus, true, true); | 1624 | brcmf_sdio_rxfail(bus, true, true); |
1632 | goto done; | 1625 | goto done; |
1633 | } else | 1626 | } else |
1634 | memcpy(buf + BRCMF_FIRSTREAD, rbuf, rdlen); | 1627 | memcpy(buf + BRCMF_FIRSTREAD, rbuf, rdlen); |
@@ -1653,11 +1646,11 @@ gotpkt: | |||
1653 | 1646 | ||
1654 | done: | 1647 | done: |
1655 | /* Awake any waiters */ | 1648 | /* Awake any waiters */ |
1656 | brcmf_sdbrcm_dcmd_resp_wake(bus); | 1649 | brcmf_sdio_dcmd_resp_wake(bus); |
1657 | } | 1650 | } |
1658 | 1651 | ||
1659 | /* Pad read to blocksize for efficiency */ | 1652 | /* Pad read to blocksize for efficiency */ |
1660 | static void brcmf_pad(struct brcmf_sdio *bus, u16 *pad, u16 *rdlen) | 1653 | static void brcmf_sdio_pad(struct brcmf_sdio *bus, u16 *pad, u16 *rdlen) |
1661 | { | 1654 | { |
1662 | if (bus->roundup && bus->blocksize && *rdlen > bus->blocksize) { | 1655 | if (bus->roundup && bus->blocksize && *rdlen > bus->blocksize) { |
1663 | *pad = bus->blocksize - (*rdlen % bus->blocksize); | 1656 | *pad = bus->blocksize - (*rdlen % bus->blocksize); |
@@ -1694,7 +1687,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) | |||
1694 | u8 cnt; | 1687 | u8 cnt; |
1695 | brcmf_dbg(GLOM, "calling rxglom: glomd %p, glom %p\n", | 1688 | brcmf_dbg(GLOM, "calling rxglom: glomd %p, glom %p\n", |
1696 | bus->glomd, skb_peek(&bus->glom)); | 1689 | bus->glomd, skb_peek(&bus->glom)); |
1697 | cnt = brcmf_sdbrcm_rxglom(bus, rd->seq_num); | 1690 | cnt = brcmf_sdio_rxglom(bus, rd->seq_num); |
1698 | brcmf_dbg(GLOM, "rxglom returned %d\n", cnt); | 1691 | brcmf_dbg(GLOM, "rxglom returned %d\n", cnt); |
1699 | rd->seq_num += cnt - 1; | 1692 | rd->seq_num += cnt - 1; |
1700 | rxleft = (rxleft > cnt) ? (rxleft - cnt) : 1; | 1693 | rxleft = (rxleft > cnt) ? (rxleft - cnt) : 1; |
@@ -1705,17 +1698,14 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) | |||
1705 | /* read header first for unknow frame length */ | 1698 | /* read header first for unknow frame length */ |
1706 | sdio_claim_host(bus->sdiodev->func[1]); | 1699 | sdio_claim_host(bus->sdiodev->func[1]); |
1707 | if (!rd->len) { | 1700 | if (!rd->len) { |
1708 | ret = brcmf_sdcard_recv_buf(bus->sdiodev, | 1701 | ret = brcmf_sdiod_recv_buf(bus->sdiodev, |
1709 | bus->sdiodev->sbwad, | 1702 | bus->rxhdr, BRCMF_FIRSTREAD); |
1710 | SDIO_FUNC_2, F2SYNC, | ||
1711 | bus->rxhdr, | ||
1712 | BRCMF_FIRSTREAD); | ||
1713 | bus->sdcnt.f2rxhdrs++; | 1703 | bus->sdcnt.f2rxhdrs++; |
1714 | if (ret < 0) { | 1704 | if (ret < 0) { |
1715 | brcmf_err("RXHEADER FAILED: %d\n", | 1705 | brcmf_err("RXHEADER FAILED: %d\n", |
1716 | ret); | 1706 | ret); |
1717 | bus->sdcnt.rx_hdrfail++; | 1707 | bus->sdcnt.rx_hdrfail++; |
1718 | brcmf_sdbrcm_rxfail(bus, true, true); | 1708 | brcmf_sdio_rxfail(bus, true, true); |
1719 | sdio_release_host(bus->sdiodev->func[1]); | 1709 | sdio_release_host(bus->sdiodev->func[1]); |
1720 | continue; | 1710 | continue; |
1721 | } | 1711 | } |
@@ -1734,9 +1724,9 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) | |||
1734 | } | 1724 | } |
1735 | 1725 | ||
1736 | if (rd->channel == SDPCM_CONTROL_CHANNEL) { | 1726 | if (rd->channel == SDPCM_CONTROL_CHANNEL) { |
1737 | brcmf_sdbrcm_read_control(bus, bus->rxhdr, | 1727 | brcmf_sdio_read_control(bus, bus->rxhdr, |
1738 | rd->len, | 1728 | rd->len, |
1739 | rd->dat_offset); | 1729 | rd->dat_offset); |
1740 | /* prepare the descriptor for the next read */ | 1730 | /* prepare the descriptor for the next read */ |
1741 | rd->len = rd->len_nxtfrm << 4; | 1731 | rd->len = rd->len_nxtfrm << 4; |
1742 | rd->len_nxtfrm = 0; | 1732 | rd->len_nxtfrm = 0; |
@@ -1750,14 +1740,14 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) | |||
1750 | head_read = BRCMF_FIRSTREAD; | 1740 | head_read = BRCMF_FIRSTREAD; |
1751 | } | 1741 | } |
1752 | 1742 | ||
1753 | brcmf_pad(bus, &pad, &rd->len_left); | 1743 | brcmf_sdio_pad(bus, &pad, &rd->len_left); |
1754 | 1744 | ||
1755 | pkt = brcmu_pkt_buf_get_skb(rd->len_left + head_read + | 1745 | pkt = brcmu_pkt_buf_get_skb(rd->len_left + head_read + |
1756 | bus->head_align); | 1746 | bus->head_align); |
1757 | if (!pkt) { | 1747 | if (!pkt) { |
1758 | /* Give up on data, request rtx of events */ | 1748 | /* Give up on data, request rtx of events */ |
1759 | brcmf_err("brcmu_pkt_buf_get_skb failed\n"); | 1749 | brcmf_err("brcmu_pkt_buf_get_skb failed\n"); |
1760 | brcmf_sdbrcm_rxfail(bus, false, | 1750 | brcmf_sdio_rxfail(bus, false, |
1761 | RETRYCHAN(rd->channel)); | 1751 | RETRYCHAN(rd->channel)); |
1762 | sdio_release_host(bus->sdiodev->func[1]); | 1752 | sdio_release_host(bus->sdiodev->func[1]); |
1763 | continue; | 1753 | continue; |
@@ -1765,8 +1755,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) | |||
1765 | skb_pull(pkt, head_read); | 1755 | skb_pull(pkt, head_read); |
1766 | pkt_align(pkt, rd->len_left, bus->head_align); | 1756 | pkt_align(pkt, rd->len_left, bus->head_align); |
1767 | 1757 | ||
1768 | ret = brcmf_sdcard_recv_pkt(bus->sdiodev, bus->sdiodev->sbwad, | 1758 | ret = brcmf_sdiod_recv_pkt(bus->sdiodev, pkt); |
1769 | SDIO_FUNC_2, F2SYNC, pkt); | ||
1770 | bus->sdcnt.f2rxdata++; | 1759 | bus->sdcnt.f2rxdata++; |
1771 | sdio_release_host(bus->sdiodev->func[1]); | 1760 | sdio_release_host(bus->sdiodev->func[1]); |
1772 | 1761 | ||
@@ -1775,7 +1764,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) | |||
1775 | rd->len, rd->channel, ret); | 1764 | rd->len, rd->channel, ret); |
1776 | brcmu_pkt_buf_free_skb(pkt); | 1765 | brcmu_pkt_buf_free_skb(pkt); |
1777 | sdio_claim_host(bus->sdiodev->func[1]); | 1766 | sdio_claim_host(bus->sdiodev->func[1]); |
1778 | brcmf_sdbrcm_rxfail(bus, true, | 1767 | brcmf_sdio_rxfail(bus, true, |
1779 | RETRYCHAN(rd->channel)); | 1768 | RETRYCHAN(rd->channel)); |
1780 | sdio_release_host(bus->sdiodev->func[1]); | 1769 | sdio_release_host(bus->sdiodev->func[1]); |
1781 | continue; | 1770 | continue; |
@@ -1800,7 +1789,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) | |||
1800 | rd->len, | 1789 | rd->len, |
1801 | roundup(rd_new.len, 16) >> 4); | 1790 | roundup(rd_new.len, 16) >> 4); |
1802 | rd->len = 0; | 1791 | rd->len = 0; |
1803 | brcmf_sdbrcm_rxfail(bus, true, true); | 1792 | brcmf_sdio_rxfail(bus, true, true); |
1804 | sdio_release_host(bus->sdiodev->func[1]); | 1793 | sdio_release_host(bus->sdiodev->func[1]); |
1805 | brcmu_pkt_buf_free_skb(pkt); | 1794 | brcmu_pkt_buf_free_skb(pkt); |
1806 | continue; | 1795 | continue; |
@@ -1822,7 +1811,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) | |||
1822 | /* Force retry w/normal header read */ | 1811 | /* Force retry w/normal header read */ |
1823 | rd->len = 0; | 1812 | rd->len = 0; |
1824 | sdio_claim_host(bus->sdiodev->func[1]); | 1813 | sdio_claim_host(bus->sdiodev->func[1]); |
1825 | brcmf_sdbrcm_rxfail(bus, false, true); | 1814 | brcmf_sdio_rxfail(bus, false, true); |
1826 | sdio_release_host(bus->sdiodev->func[1]); | 1815 | sdio_release_host(bus->sdiodev->func[1]); |
1827 | brcmu_pkt_buf_free_skb(pkt); | 1816 | brcmu_pkt_buf_free_skb(pkt); |
1828 | continue; | 1817 | continue; |
@@ -1847,7 +1836,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) | |||
1847 | brcmf_err("%s: glom superframe w/o " | 1836 | brcmf_err("%s: glom superframe w/o " |
1848 | "descriptor!\n", __func__); | 1837 | "descriptor!\n", __func__); |
1849 | sdio_claim_host(bus->sdiodev->func[1]); | 1838 | sdio_claim_host(bus->sdiodev->func[1]); |
1850 | brcmf_sdbrcm_rxfail(bus, false, false); | 1839 | brcmf_sdio_rxfail(bus, false, false); |
1851 | sdio_release_host(bus->sdiodev->func[1]); | 1840 | sdio_release_host(bus->sdiodev->func[1]); |
1852 | } | 1841 | } |
1853 | /* prepare the descriptor for the next read */ | 1842 | /* prepare the descriptor for the next read */ |
@@ -1891,7 +1880,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) | |||
1891 | } | 1880 | } |
1892 | 1881 | ||
1893 | static void | 1882 | static void |
1894 | brcmf_sdbrcm_wait_event_wakeup(struct brcmf_sdio *bus) | 1883 | brcmf_sdio_wait_event_wakeup(struct brcmf_sdio *bus) |
1895 | { | 1884 | { |
1896 | if (waitqueue_active(&bus->ctrl_wait)) | 1885 | if (waitqueue_active(&bus->ctrl_wait)) |
1897 | wake_up_interruptible(&bus->ctrl_wait); | 1886 | wake_up_interruptible(&bus->ctrl_wait); |
@@ -2107,8 +2096,8 @@ brcmf_sdio_txpkt_postp(struct brcmf_sdio *bus, struct sk_buff_head *pktq) | |||
2107 | 2096 | ||
2108 | /* Writes a HW/SW header into the packet and sends it. */ | 2097 | /* Writes a HW/SW header into the packet and sends it. */ |
2109 | /* Assumes: (a) header space already there, (b) caller holds lock */ | 2098 | /* Assumes: (a) header space already there, (b) caller holds lock */ |
2110 | static int brcmf_sdbrcm_txpkt(struct brcmf_sdio *bus, struct sk_buff_head *pktq, | 2099 | static int brcmf_sdio_txpkt(struct brcmf_sdio *bus, struct sk_buff_head *pktq, |
2111 | uint chan) | 2100 | uint chan) |
2112 | { | 2101 | { |
2113 | int ret; | 2102 | int ret; |
2114 | int i; | 2103 | int i; |
@@ -2121,8 +2110,7 @@ static int brcmf_sdbrcm_txpkt(struct brcmf_sdio *bus, struct sk_buff_head *pktq, | |||
2121 | goto done; | 2110 | goto done; |
2122 | 2111 | ||
2123 | sdio_claim_host(bus->sdiodev->func[1]); | 2112 | sdio_claim_host(bus->sdiodev->func[1]); |
2124 | ret = brcmf_sdcard_send_pkt(bus->sdiodev, bus->sdiodev->sbwad, | 2113 | ret = brcmf_sdiod_send_pkt(bus->sdiodev, pktq); |
2125 | SDIO_FUNC_2, F2SYNC, pktq); | ||
2126 | bus->sdcnt.f2txdata++; | 2114 | bus->sdcnt.f2txdata++; |
2127 | 2115 | ||
2128 | if (ret < 0) { | 2116 | if (ret < 0) { |
@@ -2131,17 +2119,17 @@ static int brcmf_sdbrcm_txpkt(struct brcmf_sdio *bus, struct sk_buff_head *pktq, | |||
2131 | ret); | 2119 | ret); |
2132 | bus->sdcnt.tx_sderrs++; | 2120 | bus->sdcnt.tx_sderrs++; |
2133 | 2121 | ||
2134 | brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2); | 2122 | brcmf_sdiod_abort(bus->sdiodev, SDIO_FUNC_2); |
2135 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, | 2123 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, |
2136 | SFC_WF_TERM, NULL); | 2124 | SFC_WF_TERM, NULL); |
2137 | bus->sdcnt.f1regdata++; | 2125 | bus->sdcnt.f1regdata++; |
2138 | 2126 | ||
2139 | for (i = 0; i < 3; i++) { | 2127 | for (i = 0; i < 3; i++) { |
2140 | u8 hi, lo; | 2128 | u8 hi, lo; |
2141 | hi = brcmf_sdio_regrb(bus->sdiodev, | 2129 | hi = brcmf_sdiod_regrb(bus->sdiodev, |
2142 | SBSDIO_FUNC1_WFRAMEBCHI, NULL); | 2130 | SBSDIO_FUNC1_WFRAMEBCHI, NULL); |
2143 | lo = brcmf_sdio_regrb(bus->sdiodev, | 2131 | lo = brcmf_sdiod_regrb(bus->sdiodev, |
2144 | SBSDIO_FUNC1_WFRAMEBCLO, NULL); | 2132 | SBSDIO_FUNC1_WFRAMEBCLO, NULL); |
2145 | bus->sdcnt.f1regdata += 2; | 2133 | bus->sdcnt.f1regdata += 2; |
2146 | if ((hi == 0) && (lo == 0)) | 2134 | if ((hi == 0) && (lo == 0)) |
2147 | break; | 2135 | break; |
@@ -2160,7 +2148,7 @@ done: | |||
2160 | return ret; | 2148 | return ret; |
2161 | } | 2149 | } |
2162 | 2150 | ||
2163 | static uint brcmf_sdbrcm_sendfromq(struct brcmf_sdio *bus, uint maxframes) | 2151 | static uint brcmf_sdio_sendfromq(struct brcmf_sdio *bus, uint maxframes) |
2164 | { | 2152 | { |
2165 | struct sk_buff *pkt; | 2153 | struct sk_buff *pkt; |
2166 | struct sk_buff_head pktq; | 2154 | struct sk_buff_head pktq; |
@@ -2194,7 +2182,7 @@ static uint brcmf_sdbrcm_sendfromq(struct brcmf_sdio *bus, uint maxframes) | |||
2194 | if (i == 0) | 2182 | if (i == 0) |
2195 | break; | 2183 | break; |
2196 | 2184 | ||
2197 | ret = brcmf_sdbrcm_txpkt(bus, &pktq, SDPCM_DATA_CHANNEL); | 2185 | ret = brcmf_sdio_txpkt(bus, &pktq, SDPCM_DATA_CHANNEL); |
2198 | cnt += i; | 2186 | cnt += i; |
2199 | 2187 | ||
2200 | /* In poll mode, need to check for other events */ | 2188 | /* In poll mode, need to check for other events */ |
@@ -2223,7 +2211,7 @@ static uint brcmf_sdbrcm_sendfromq(struct brcmf_sdio *bus, uint maxframes) | |||
2223 | return cnt; | 2211 | return cnt; |
2224 | } | 2212 | } |
2225 | 2213 | ||
2226 | static void brcmf_sdbrcm_bus_stop(struct device *dev) | 2214 | static void brcmf_sdio_bus_stop(struct device *dev) |
2227 | { | 2215 | { |
2228 | u32 local_hostintmask; | 2216 | u32 local_hostintmask; |
2229 | u8 saveclk; | 2217 | u8 saveclk; |
@@ -2243,7 +2231,7 @@ static void brcmf_sdbrcm_bus_stop(struct device *dev) | |||
2243 | sdio_claim_host(bus->sdiodev->func[1]); | 2231 | sdio_claim_host(bus->sdiodev->func[1]); |
2244 | 2232 | ||
2245 | /* Enable clock for device interrupts */ | 2233 | /* Enable clock for device interrupts */ |
2246 | brcmf_sdbrcm_bus_sleep(bus, false, false); | 2234 | brcmf_sdio_bus_sleep(bus, false, false); |
2247 | 2235 | ||
2248 | /* Disable and clear interrupts at the chip level also */ | 2236 | /* Disable and clear interrupts at the chip level also */ |
2249 | w_sdreg32(bus, 0, offsetof(struct sdpcmd_regs, hostintmask)); | 2237 | w_sdreg32(bus, 0, offsetof(struct sdpcmd_regs, hostintmask)); |
@@ -2254,26 +2242,25 @@ static void brcmf_sdbrcm_bus_stop(struct device *dev) | |||
2254 | bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; | 2242 | bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; |
2255 | 2243 | ||
2256 | /* Force clocks on backplane to be sure F2 interrupt propagates */ | 2244 | /* Force clocks on backplane to be sure F2 interrupt propagates */ |
2257 | saveclk = brcmf_sdio_regrb(bus->sdiodev, | 2245 | saveclk = brcmf_sdiod_regrb(bus->sdiodev, |
2258 | SBSDIO_FUNC1_CHIPCLKCSR, &err); | 2246 | SBSDIO_FUNC1_CHIPCLKCSR, &err); |
2259 | if (!err) { | 2247 | if (!err) { |
2260 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, | 2248 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, |
2261 | (saveclk | SBSDIO_FORCE_HT), &err); | 2249 | (saveclk | SBSDIO_FORCE_HT), &err); |
2262 | } | 2250 | } |
2263 | if (err) | 2251 | if (err) |
2264 | brcmf_err("Failed to force clock for F2: err %d\n", err); | 2252 | brcmf_err("Failed to force clock for F2: err %d\n", err); |
2265 | 2253 | ||
2266 | /* Turn off the bus (F2), free any pending packets */ | 2254 | /* Turn off the bus (F2), free any pending packets */ |
2267 | brcmf_dbg(INTR, "disable SDIO interrupts\n"); | 2255 | brcmf_dbg(INTR, "disable SDIO interrupts\n"); |
2268 | brcmf_sdio_regwb(bus->sdiodev, SDIO_CCCR_IOEx, SDIO_FUNC_ENABLE_1, | 2256 | sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]); |
2269 | NULL); | ||
2270 | 2257 | ||
2271 | /* Clear any pending interrupts now that F2 is disabled */ | 2258 | /* Clear any pending interrupts now that F2 is disabled */ |
2272 | w_sdreg32(bus, local_hostintmask, | 2259 | w_sdreg32(bus, local_hostintmask, |
2273 | offsetof(struct sdpcmd_regs, intstatus)); | 2260 | offsetof(struct sdpcmd_regs, intstatus)); |
2274 | 2261 | ||
2275 | /* Turn off the backplane clock (only) */ | 2262 | /* Turn off the backplane clock (only) */ |
2276 | brcmf_sdbrcm_clkctl(bus, CLK_SDONLY, false); | 2263 | brcmf_sdio_clkctl(bus, CLK_SDONLY, false); |
2277 | sdio_release_host(bus->sdiodev->func[1]); | 2264 | sdio_release_host(bus->sdiodev->func[1]); |
2278 | 2265 | ||
2279 | /* Clear the data packet queues */ | 2266 | /* Clear the data packet queues */ |
@@ -2282,20 +2269,20 @@ static void brcmf_sdbrcm_bus_stop(struct device *dev) | |||
2282 | /* Clear any held glomming stuff */ | 2269 | /* Clear any held glomming stuff */ |
2283 | if (bus->glomd) | 2270 | if (bus->glomd) |
2284 | brcmu_pkt_buf_free_skb(bus->glomd); | 2271 | brcmu_pkt_buf_free_skb(bus->glomd); |
2285 | brcmf_sdbrcm_free_glom(bus); | 2272 | brcmf_sdio_free_glom(bus); |
2286 | 2273 | ||
2287 | /* Clear rx control and wake any waiters */ | 2274 | /* Clear rx control and wake any waiters */ |
2288 | spin_lock_bh(&bus->rxctl_lock); | 2275 | spin_lock_bh(&bus->rxctl_lock); |
2289 | bus->rxlen = 0; | 2276 | bus->rxlen = 0; |
2290 | spin_unlock_bh(&bus->rxctl_lock); | 2277 | spin_unlock_bh(&bus->rxctl_lock); |
2291 | brcmf_sdbrcm_dcmd_resp_wake(bus); | 2278 | brcmf_sdio_dcmd_resp_wake(bus); |
2292 | 2279 | ||
2293 | /* Reset some F2 state stuff */ | 2280 | /* Reset some F2 state stuff */ |
2294 | bus->rxskip = false; | 2281 | bus->rxskip = false; |
2295 | bus->tx_seq = bus->rx_seq = 0; | 2282 | bus->tx_seq = bus->rx_seq = 0; |
2296 | } | 2283 | } |
2297 | 2284 | ||
2298 | static inline void brcmf_sdbrcm_clrintr(struct brcmf_sdio *bus) | 2285 | static inline void brcmf_sdio_clrintr(struct brcmf_sdio *bus) |
2299 | { | 2286 | { |
2300 | unsigned long flags; | 2287 | unsigned long flags; |
2301 | 2288 | ||
@@ -2320,7 +2307,7 @@ static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus) | |||
2320 | addr = bus->ci->c_inf[idx].base + | 2307 | addr = bus->ci->c_inf[idx].base + |
2321 | offsetof(struct sdpcmd_regs, intstatus); | 2308 | offsetof(struct sdpcmd_regs, intstatus); |
2322 | 2309 | ||
2323 | ret = brcmf_sdio_regrw_helper(bus->sdiodev, addr, &val, false); | 2310 | val = brcmf_sdiod_regrl(bus->sdiodev, addr, &ret); |
2324 | bus->sdcnt.f1regdata++; | 2311 | bus->sdcnt.f1regdata++; |
2325 | if (ret != 0) | 2312 | if (ret != 0) |
2326 | val = 0; | 2313 | val = 0; |
@@ -2330,7 +2317,7 @@ static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus) | |||
2330 | 2317 | ||
2331 | /* Clear interrupts */ | 2318 | /* Clear interrupts */ |
2332 | if (val) { | 2319 | if (val) { |
2333 | ret = brcmf_sdio_regrw_helper(bus->sdiodev, addr, &val, true); | 2320 | brcmf_sdiod_regwl(bus->sdiodev, addr, val, &ret); |
2334 | bus->sdcnt.f1regdata++; | 2321 | bus->sdcnt.f1regdata++; |
2335 | } | 2322 | } |
2336 | 2323 | ||
@@ -2344,7 +2331,7 @@ static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus) | |||
2344 | return ret; | 2331 | return ret; |
2345 | } | 2332 | } |
2346 | 2333 | ||
2347 | static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) | 2334 | static void brcmf_sdio_dpc(struct brcmf_sdio *bus) |
2348 | { | 2335 | { |
2349 | u32 newstatus = 0; | 2336 | u32 newstatus = 0; |
2350 | unsigned long intstatus; | 2337 | unsigned long intstatus; |
@@ -2363,8 +2350,8 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) | |||
2363 | 2350 | ||
2364 | #ifdef DEBUG | 2351 | #ifdef DEBUG |
2365 | /* Check for inconsistent device control */ | 2352 | /* Check for inconsistent device control */ |
2366 | devctl = brcmf_sdio_regrb(bus->sdiodev, | 2353 | devctl = brcmf_sdiod_regrb(bus->sdiodev, |
2367 | SBSDIO_DEVICE_CTL, &err); | 2354 | SBSDIO_DEVICE_CTL, &err); |
2368 | if (err) { | 2355 | if (err) { |
2369 | brcmf_err("error reading DEVCTL: %d\n", err); | 2356 | brcmf_err("error reading DEVCTL: %d\n", err); |
2370 | bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; | 2357 | bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; |
@@ -2372,8 +2359,8 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) | |||
2372 | #endif /* DEBUG */ | 2359 | #endif /* DEBUG */ |
2373 | 2360 | ||
2374 | /* Read CSR, if clock on switch to AVAIL, else ignore */ | 2361 | /* Read CSR, if clock on switch to AVAIL, else ignore */ |
2375 | clkctl = brcmf_sdio_regrb(bus->sdiodev, | 2362 | clkctl = brcmf_sdiod_regrb(bus->sdiodev, |
2376 | SBSDIO_FUNC1_CHIPCLKCSR, &err); | 2363 | SBSDIO_FUNC1_CHIPCLKCSR, &err); |
2377 | if (err) { | 2364 | if (err) { |
2378 | brcmf_err("error reading CSR: %d\n", | 2365 | brcmf_err("error reading CSR: %d\n", |
2379 | err); | 2366 | err); |
@@ -2384,16 +2371,16 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) | |||
2384 | devctl, clkctl); | 2371 | devctl, clkctl); |
2385 | 2372 | ||
2386 | if (SBSDIO_HTAV(clkctl)) { | 2373 | if (SBSDIO_HTAV(clkctl)) { |
2387 | devctl = brcmf_sdio_regrb(bus->sdiodev, | 2374 | devctl = brcmf_sdiod_regrb(bus->sdiodev, |
2388 | SBSDIO_DEVICE_CTL, &err); | 2375 | SBSDIO_DEVICE_CTL, &err); |
2389 | if (err) { | 2376 | if (err) { |
2390 | brcmf_err("error reading DEVCTL: %d\n", | 2377 | brcmf_err("error reading DEVCTL: %d\n", |
2391 | err); | 2378 | err); |
2392 | bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; | 2379 | bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; |
2393 | } | 2380 | } |
2394 | devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; | 2381 | devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; |
2395 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL, | 2382 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL, |
2396 | devctl, &err); | 2383 | devctl, &err); |
2397 | if (err) { | 2384 | if (err) { |
2398 | brcmf_err("error writing DEVCTL: %d\n", | 2385 | brcmf_err("error writing DEVCTL: %d\n", |
2399 | err); | 2386 | err); |
@@ -2404,7 +2391,7 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) | |||
2404 | } | 2391 | } |
2405 | 2392 | ||
2406 | /* Make sure backplane clock is on */ | 2393 | /* Make sure backplane clock is on */ |
2407 | brcmf_sdbrcm_bus_sleep(bus, false, true); | 2394 | brcmf_sdio_bus_sleep(bus, false, true); |
2408 | 2395 | ||
2409 | /* Pending interrupt indicates new device status */ | 2396 | /* Pending interrupt indicates new device status */ |
2410 | if (atomic_read(&bus->ipend) > 0) { | 2397 | if (atomic_read(&bus->ipend) > 0) { |
@@ -2435,7 +2422,7 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) | |||
2435 | /* Handle host mailbox indication */ | 2422 | /* Handle host mailbox indication */ |
2436 | if (intstatus & I_HMB_HOST_INT) { | 2423 | if (intstatus & I_HMB_HOST_INT) { |
2437 | intstatus &= ~I_HMB_HOST_INT; | 2424 | intstatus &= ~I_HMB_HOST_INT; |
2438 | intstatus |= brcmf_sdbrcm_hostmail(bus); | 2425 | intstatus |= brcmf_sdio_hostmail(bus); |
2439 | } | 2426 | } |
2440 | 2427 | ||
2441 | sdio_release_host(bus->sdiodev->func[1]); | 2428 | sdio_release_host(bus->sdiodev->func[1]); |
@@ -2480,16 +2467,15 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) | |||
2480 | set_bit(n, (unsigned long *)&bus->intstatus.counter); | 2467 | set_bit(n, (unsigned long *)&bus->intstatus.counter); |
2481 | } | 2468 | } |
2482 | 2469 | ||
2483 | brcmf_sdbrcm_clrintr(bus); | 2470 | brcmf_sdio_clrintr(bus); |
2484 | 2471 | ||
2485 | if (data_ok(bus) && bus->ctrl_frame_stat && | 2472 | if (data_ok(bus) && bus->ctrl_frame_stat && |
2486 | (bus->clkstate == CLK_AVAIL)) { | 2473 | (bus->clkstate == CLK_AVAIL)) { |
2487 | int i; | 2474 | int i; |
2488 | 2475 | ||
2489 | sdio_claim_host(bus->sdiodev->func[1]); | 2476 | sdio_claim_host(bus->sdiodev->func[1]); |
2490 | err = brcmf_sdcard_send_buf(bus->sdiodev, bus->sdiodev->sbwad, | 2477 | err = brcmf_sdiod_send_buf(bus->sdiodev, bus->ctrl_frame_buf, |
2491 | SDIO_FUNC_2, F2SYNC, bus->ctrl_frame_buf, | 2478 | (u32)bus->ctrl_frame_len); |
2492 | (u32) bus->ctrl_frame_len); | ||
2493 | 2479 | ||
2494 | if (err < 0) { | 2480 | if (err < 0) { |
2495 | /* On failure, abort the command and | 2481 | /* On failure, abort the command and |
@@ -2498,20 +2484,20 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) | |||
2498 | err); | 2484 | err); |
2499 | bus->sdcnt.tx_sderrs++; | 2485 | bus->sdcnt.tx_sderrs++; |
2500 | 2486 | ||
2501 | brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2); | 2487 | brcmf_sdiod_abort(bus->sdiodev, SDIO_FUNC_2); |
2502 | 2488 | ||
2503 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, | 2489 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, |
2504 | SFC_WF_TERM, &err); | 2490 | SFC_WF_TERM, &err); |
2505 | bus->sdcnt.f1regdata++; | 2491 | bus->sdcnt.f1regdata++; |
2506 | 2492 | ||
2507 | for (i = 0; i < 3; i++) { | 2493 | for (i = 0; i < 3; i++) { |
2508 | u8 hi, lo; | 2494 | u8 hi, lo; |
2509 | hi = brcmf_sdio_regrb(bus->sdiodev, | 2495 | hi = brcmf_sdiod_regrb(bus->sdiodev, |
2510 | SBSDIO_FUNC1_WFRAMEBCHI, | 2496 | SBSDIO_FUNC1_WFRAMEBCHI, |
2511 | &err); | 2497 | &err); |
2512 | lo = brcmf_sdio_regrb(bus->sdiodev, | 2498 | lo = brcmf_sdiod_regrb(bus->sdiodev, |
2513 | SBSDIO_FUNC1_WFRAMEBCLO, | 2499 | SBSDIO_FUNC1_WFRAMEBCLO, |
2514 | &err); | 2500 | &err); |
2515 | bus->sdcnt.f1regdata += 2; | 2501 | bus->sdcnt.f1regdata += 2; |
2516 | if ((hi == 0) && (lo == 0)) | 2502 | if ((hi == 0) && (lo == 0)) |
2517 | break; | 2503 | break; |
@@ -2522,7 +2508,7 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) | |||
2522 | } | 2508 | } |
2523 | sdio_release_host(bus->sdiodev->func[1]); | 2509 | sdio_release_host(bus->sdiodev->func[1]); |
2524 | bus->ctrl_frame_stat = false; | 2510 | bus->ctrl_frame_stat = false; |
2525 | brcmf_sdbrcm_wait_event_wakeup(bus); | 2511 | brcmf_sdio_wait_event_wakeup(bus); |
2526 | } | 2512 | } |
2527 | /* Send queued frames (limit 1 if rx may still be pending) */ | 2513 | /* Send queued frames (limit 1 if rx may still be pending) */ |
2528 | else if ((bus->clkstate == CLK_AVAIL) && !atomic_read(&bus->fcstate) && | 2514 | else if ((bus->clkstate == CLK_AVAIL) && !atomic_read(&bus->fcstate) && |
@@ -2530,7 +2516,7 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) | |||
2530 | && data_ok(bus)) { | 2516 | && data_ok(bus)) { |
2531 | framecnt = bus->rxpending ? min(txlimit, bus->txminmax) : | 2517 | framecnt = bus->rxpending ? min(txlimit, bus->txminmax) : |
2532 | txlimit; | 2518 | txlimit; |
2533 | framecnt = brcmf_sdbrcm_sendfromq(bus, framecnt); | 2519 | framecnt = brcmf_sdio_sendfromq(bus, framecnt); |
2534 | txlimit -= framecnt; | 2520 | txlimit -= framecnt; |
2535 | } | 2521 | } |
2536 | 2522 | ||
@@ -2552,12 +2538,12 @@ static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) | |||
2552 | bus->activity = false; | 2538 | bus->activity = false; |
2553 | brcmf_dbg(SDIO, "idle state\n"); | 2539 | brcmf_dbg(SDIO, "idle state\n"); |
2554 | sdio_claim_host(bus->sdiodev->func[1]); | 2540 | sdio_claim_host(bus->sdiodev->func[1]); |
2555 | brcmf_sdbrcm_bus_sleep(bus, true, false); | 2541 | brcmf_sdio_bus_sleep(bus, true, false); |
2556 | sdio_release_host(bus->sdiodev->func[1]); | 2542 | sdio_release_host(bus->sdiodev->func[1]); |
2557 | } | 2543 | } |
2558 | } | 2544 | } |
2559 | 2545 | ||
2560 | static struct pktq *brcmf_sdbrcm_bus_gettxq(struct device *dev) | 2546 | static struct pktq *brcmf_sdio_bus_gettxq(struct device *dev) |
2561 | { | 2547 | { |
2562 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); | 2548 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); |
2563 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; | 2549 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; |
@@ -2566,7 +2552,7 @@ static struct pktq *brcmf_sdbrcm_bus_gettxq(struct device *dev) | |||
2566 | return &bus->txq; | 2552 | return &bus->txq; |
2567 | } | 2553 | } |
2568 | 2554 | ||
2569 | static int brcmf_sdbrcm_bus_txdata(struct device *dev, struct sk_buff *pkt) | 2555 | static int brcmf_sdio_bus_txdata(struct device *dev, struct sk_buff *pkt) |
2570 | { | 2556 | { |
2571 | int ret = -EBADE; | 2557 | int ret = -EBADE; |
2572 | uint datalen, prec; | 2558 | uint datalen, prec; |
@@ -2622,7 +2608,7 @@ static int brcmf_sdbrcm_bus_txdata(struct device *dev, struct sk_buff *pkt) | |||
2622 | #ifdef DEBUG | 2608 | #ifdef DEBUG |
2623 | #define CONSOLE_LINE_MAX 192 | 2609 | #define CONSOLE_LINE_MAX 192 |
2624 | 2610 | ||
2625 | static int brcmf_sdbrcm_readconsole(struct brcmf_sdio *bus) | 2611 | static int brcmf_sdio_readconsole(struct brcmf_sdio *bus) |
2626 | { | 2612 | { |
2627 | struct brcmf_console *c = &bus->console; | 2613 | struct brcmf_console *c = &bus->console; |
2628 | u8 line[CONSOLE_LINE_MAX], ch; | 2614 | u8 line[CONSOLE_LINE_MAX], ch; |
@@ -2635,8 +2621,8 @@ static int brcmf_sdbrcm_readconsole(struct brcmf_sdio *bus) | |||
2635 | 2621 | ||
2636 | /* Read console log struct */ | 2622 | /* Read console log struct */ |
2637 | addr = bus->console_addr + offsetof(struct rte_console, log_le); | 2623 | addr = bus->console_addr + offsetof(struct rte_console, log_le); |
2638 | rv = brcmf_sdio_ramrw(bus->sdiodev, false, addr, (u8 *)&c->log_le, | 2624 | rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (u8 *)&c->log_le, |
2639 | sizeof(c->log_le)); | 2625 | sizeof(c->log_le)); |
2640 | if (rv < 0) | 2626 | if (rv < 0) |
2641 | return rv; | 2627 | return rv; |
2642 | 2628 | ||
@@ -2661,7 +2647,7 @@ static int brcmf_sdbrcm_readconsole(struct brcmf_sdio *bus) | |||
2661 | 2647 | ||
2662 | /* Read the console buffer */ | 2648 | /* Read the console buffer */ |
2663 | addr = le32_to_cpu(c->log_le.buf); | 2649 | addr = le32_to_cpu(c->log_le.buf); |
2664 | rv = brcmf_sdio_ramrw(bus->sdiodev, false, addr, c->buf, c->bufsize); | 2650 | rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, c->buf, c->bufsize); |
2665 | if (rv < 0) | 2651 | if (rv < 0) |
2666 | return rv; | 2652 | return rv; |
2667 | 2653 | ||
@@ -2699,14 +2685,13 @@ break2: | |||
2699 | } | 2685 | } |
2700 | #endif /* DEBUG */ | 2686 | #endif /* DEBUG */ |
2701 | 2687 | ||
2702 | static int brcmf_tx_frame(struct brcmf_sdio *bus, u8 *frame, u16 len) | 2688 | static int brcmf_sdio_tx_frame(struct brcmf_sdio *bus, u8 *frame, u16 len) |
2703 | { | 2689 | { |
2704 | int i; | 2690 | int i; |
2705 | int ret; | 2691 | int ret; |
2706 | 2692 | ||
2707 | bus->ctrl_frame_stat = false; | 2693 | bus->ctrl_frame_stat = false; |
2708 | ret = brcmf_sdcard_send_buf(bus->sdiodev, bus->sdiodev->sbwad, | 2694 | ret = brcmf_sdiod_send_buf(bus->sdiodev, frame, len); |
2709 | SDIO_FUNC_2, F2SYNC, frame, len); | ||
2710 | 2695 | ||
2711 | if (ret < 0) { | 2696 | if (ret < 0) { |
2712 | /* On failure, abort the command and terminate the frame */ | 2697 | /* On failure, abort the command and terminate the frame */ |
@@ -2714,18 +2699,18 @@ static int brcmf_tx_frame(struct brcmf_sdio *bus, u8 *frame, u16 len) | |||
2714 | ret); | 2699 | ret); |
2715 | bus->sdcnt.tx_sderrs++; | 2700 | bus->sdcnt.tx_sderrs++; |
2716 | 2701 | ||
2717 | brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2); | 2702 | brcmf_sdiod_abort(bus->sdiodev, SDIO_FUNC_2); |
2718 | 2703 | ||
2719 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, | 2704 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, |
2720 | SFC_WF_TERM, NULL); | 2705 | SFC_WF_TERM, NULL); |
2721 | bus->sdcnt.f1regdata++; | 2706 | bus->sdcnt.f1regdata++; |
2722 | 2707 | ||
2723 | for (i = 0; i < 3; i++) { | 2708 | for (i = 0; i < 3; i++) { |
2724 | u8 hi, lo; | 2709 | u8 hi, lo; |
2725 | hi = brcmf_sdio_regrb(bus->sdiodev, | 2710 | hi = brcmf_sdiod_regrb(bus->sdiodev, |
2726 | SBSDIO_FUNC1_WFRAMEBCHI, NULL); | 2711 | SBSDIO_FUNC1_WFRAMEBCHI, NULL); |
2727 | lo = brcmf_sdio_regrb(bus->sdiodev, | 2712 | lo = brcmf_sdiod_regrb(bus->sdiodev, |
2728 | SBSDIO_FUNC1_WFRAMEBCLO, NULL); | 2713 | SBSDIO_FUNC1_WFRAMEBCLO, NULL); |
2729 | bus->sdcnt.f1regdata += 2; | 2714 | bus->sdcnt.f1regdata += 2; |
2730 | if (hi == 0 && lo == 0) | 2715 | if (hi == 0 && lo == 0) |
2731 | break; | 2716 | break; |
@@ -2739,7 +2724,7 @@ static int brcmf_tx_frame(struct brcmf_sdio *bus, u8 *frame, u16 len) | |||
2739 | } | 2724 | } |
2740 | 2725 | ||
2741 | static int | 2726 | static int |
2742 | brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen) | 2727 | brcmf_sdio_bus_txctl(struct device *dev, unsigned char *msg, uint msglen) |
2743 | { | 2728 | { |
2744 | u8 *frame; | 2729 | u8 *frame; |
2745 | u16 len, pad; | 2730 | u16 len, pad; |
@@ -2783,7 +2768,7 @@ brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen) | |||
2783 | 2768 | ||
2784 | /* Make sure backplane clock is on */ | 2769 | /* Make sure backplane clock is on */ |
2785 | sdio_claim_host(bus->sdiodev->func[1]); | 2770 | sdio_claim_host(bus->sdiodev->func[1]); |
2786 | brcmf_sdbrcm_bus_sleep(bus, false, false); | 2771 | brcmf_sdio_bus_sleep(bus, false, false); |
2787 | sdio_release_host(bus->sdiodev->func[1]); | 2772 | sdio_release_host(bus->sdiodev->func[1]); |
2788 | 2773 | ||
2789 | hd_info.len = (u16)msglen; | 2774 | hd_info.len = (u16)msglen; |
@@ -2827,7 +2812,7 @@ brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen) | |||
2827 | 2812 | ||
2828 | do { | 2813 | do { |
2829 | sdio_claim_host(bus->sdiodev->func[1]); | 2814 | sdio_claim_host(bus->sdiodev->func[1]); |
2830 | ret = brcmf_tx_frame(bus, frame, len); | 2815 | ret = brcmf_sdio_tx_frame(bus, frame, len); |
2831 | sdio_release_host(bus->sdiodev->func[1]); | 2816 | sdio_release_host(bus->sdiodev->func[1]); |
2832 | } while (ret < 0 && retries++ < TXRETRIES); | 2817 | } while (ret < 0 && retries++ < TXRETRIES); |
2833 | } | 2818 | } |
@@ -2837,7 +2822,7 @@ brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen) | |||
2837 | bus->activity = false; | 2822 | bus->activity = false; |
2838 | sdio_claim_host(bus->sdiodev->func[1]); | 2823 | sdio_claim_host(bus->sdiodev->func[1]); |
2839 | brcmf_dbg(INFO, "idle\n"); | 2824 | brcmf_dbg(INFO, "idle\n"); |
2840 | brcmf_sdbrcm_clkctl(bus, CLK_NONE, true); | 2825 | brcmf_sdio_clkctl(bus, CLK_NONE, true); |
2841 | sdio_release_host(bus->sdiodev->func[1]); | 2826 | sdio_release_host(bus->sdiodev->func[1]); |
2842 | } | 2827 | } |
2843 | 2828 | ||
@@ -2871,8 +2856,8 @@ static int brcmf_sdio_readshared(struct brcmf_sdio *bus, | |||
2871 | * address of sdpcm_shared structure | 2856 | * address of sdpcm_shared structure |
2872 | */ | 2857 | */ |
2873 | sdio_claim_host(bus->sdiodev->func[1]); | 2858 | sdio_claim_host(bus->sdiodev->func[1]); |
2874 | brcmf_sdbrcm_bus_sleep(bus, false, false); | 2859 | brcmf_sdio_bus_sleep(bus, false, false); |
2875 | rv = brcmf_sdio_ramrw(bus->sdiodev, false, shaddr, (u8 *)&addr_le, 4); | 2860 | rv = brcmf_sdiod_ramrw(bus->sdiodev, false, shaddr, (u8 *)&addr_le, 4); |
2876 | sdio_release_host(bus->sdiodev->func[1]); | 2861 | sdio_release_host(bus->sdiodev->func[1]); |
2877 | if (rv < 0) | 2862 | if (rv < 0) |
2878 | return rv; | 2863 | return rv; |
@@ -2892,8 +2877,8 @@ static int brcmf_sdio_readshared(struct brcmf_sdio *bus, | |||
2892 | } | 2877 | } |
2893 | 2878 | ||
2894 | /* Read hndrte_shared structure */ | 2879 | /* Read hndrte_shared structure */ |
2895 | rv = brcmf_sdio_ramrw(bus->sdiodev, false, addr, (u8 *)&sh_le, | 2880 | rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (u8 *)&sh_le, |
2896 | sizeof(struct sdpcm_shared_le)); | 2881 | sizeof(struct sdpcm_shared_le)); |
2897 | if (rv < 0) | 2882 | if (rv < 0) |
2898 | return rv; | 2883 | return rv; |
2899 | 2884 | ||
@@ -2929,22 +2914,22 @@ static int brcmf_sdio_dump_console(struct brcmf_sdio *bus, | |||
2929 | 2914 | ||
2930 | /* obtain console information from device memory */ | 2915 | /* obtain console information from device memory */ |
2931 | addr = sh->console_addr + offsetof(struct rte_console, log_le); | 2916 | addr = sh->console_addr + offsetof(struct rte_console, log_le); |
2932 | rv = brcmf_sdio_ramrw(bus->sdiodev, false, addr, | 2917 | rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, |
2933 | (u8 *)&sh_val, sizeof(u32)); | 2918 | (u8 *)&sh_val, sizeof(u32)); |
2934 | if (rv < 0) | 2919 | if (rv < 0) |
2935 | return rv; | 2920 | return rv; |
2936 | console_ptr = le32_to_cpu(sh_val); | 2921 | console_ptr = le32_to_cpu(sh_val); |
2937 | 2922 | ||
2938 | addr = sh->console_addr + offsetof(struct rte_console, log_le.buf_size); | 2923 | addr = sh->console_addr + offsetof(struct rte_console, log_le.buf_size); |
2939 | rv = brcmf_sdio_ramrw(bus->sdiodev, false, addr, | 2924 | rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, |
2940 | (u8 *)&sh_val, sizeof(u32)); | 2925 | (u8 *)&sh_val, sizeof(u32)); |
2941 | if (rv < 0) | 2926 | if (rv < 0) |
2942 | return rv; | 2927 | return rv; |
2943 | console_size = le32_to_cpu(sh_val); | 2928 | console_size = le32_to_cpu(sh_val); |
2944 | 2929 | ||
2945 | addr = sh->console_addr + offsetof(struct rte_console, log_le.idx); | 2930 | addr = sh->console_addr + offsetof(struct rte_console, log_le.idx); |
2946 | rv = brcmf_sdio_ramrw(bus->sdiodev, false, addr, | 2931 | rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, |
2947 | (u8 *)&sh_val, sizeof(u32)); | 2932 | (u8 *)&sh_val, sizeof(u32)); |
2948 | if (rv < 0) | 2933 | if (rv < 0) |
2949 | return rv; | 2934 | return rv; |
2950 | console_index = le32_to_cpu(sh_val); | 2935 | console_index = le32_to_cpu(sh_val); |
@@ -2958,8 +2943,8 @@ static int brcmf_sdio_dump_console(struct brcmf_sdio *bus, | |||
2958 | 2943 | ||
2959 | /* obtain the console data from device */ | 2944 | /* obtain the console data from device */ |
2960 | conbuf[console_size] = '\0'; | 2945 | conbuf[console_size] = '\0'; |
2961 | rv = brcmf_sdio_ramrw(bus->sdiodev, false, console_ptr, (u8 *)conbuf, | 2946 | rv = brcmf_sdiod_ramrw(bus->sdiodev, false, console_ptr, (u8 *)conbuf, |
2962 | console_size); | 2947 | console_size); |
2963 | if (rv < 0) | 2948 | if (rv < 0) |
2964 | goto done; | 2949 | goto done; |
2965 | 2950 | ||
@@ -2996,8 +2981,8 @@ static int brcmf_sdio_trap_info(struct brcmf_sdio *bus, struct sdpcm_shared *sh, | |||
2996 | return 0; | 2981 | return 0; |
2997 | } | 2982 | } |
2998 | 2983 | ||
2999 | error = brcmf_sdio_ramrw(bus->sdiodev, false, sh->trap_addr, (u8 *)&tr, | 2984 | error = brcmf_sdiod_ramrw(bus->sdiodev, false, sh->trap_addr, (u8 *)&tr, |
3000 | sizeof(struct brcmf_trap_info)); | 2985 | sizeof(struct brcmf_trap_info)); |
3001 | if (error < 0) | 2986 | if (error < 0) |
3002 | return error; | 2987 | return error; |
3003 | 2988 | ||
@@ -3040,14 +3025,14 @@ static int brcmf_sdio_assert_info(struct brcmf_sdio *bus, | |||
3040 | 3025 | ||
3041 | sdio_claim_host(bus->sdiodev->func[1]); | 3026 | sdio_claim_host(bus->sdiodev->func[1]); |
3042 | if (sh->assert_file_addr != 0) { | 3027 | if (sh->assert_file_addr != 0) { |
3043 | error = brcmf_sdio_ramrw(bus->sdiodev, false, | 3028 | error = brcmf_sdiod_ramrw(bus->sdiodev, false, |
3044 | sh->assert_file_addr, (u8 *)file, 80); | 3029 | sh->assert_file_addr, (u8 *)file, 80); |
3045 | if (error < 0) | 3030 | if (error < 0) |
3046 | return error; | 3031 | return error; |
3047 | } | 3032 | } |
3048 | if (sh->assert_exp_addr != 0) { | 3033 | if (sh->assert_exp_addr != 0) { |
3049 | error = brcmf_sdio_ramrw(bus->sdiodev, false, | 3034 | error = brcmf_sdiod_ramrw(bus->sdiodev, false, |
3050 | sh->assert_exp_addr, (u8 *)expr, 80); | 3035 | sh->assert_exp_addr, (u8 *)expr, 80); |
3051 | if (error < 0) | 3036 | if (error < 0) |
3052 | return error; | 3037 | return error; |
3053 | } | 3038 | } |
@@ -3059,7 +3044,7 @@ static int brcmf_sdio_assert_info(struct brcmf_sdio *bus, | |||
3059 | return simple_read_from_buffer(data, count, &pos, buf, res); | 3044 | return simple_read_from_buffer(data, count, &pos, buf, res); |
3060 | } | 3045 | } |
3061 | 3046 | ||
3062 | static int brcmf_sdbrcm_checkdied(struct brcmf_sdio *bus) | 3047 | static int brcmf_sdio_checkdied(struct brcmf_sdio *bus) |
3063 | { | 3048 | { |
3064 | int error; | 3049 | int error; |
3065 | struct sdpcm_shared sh; | 3050 | struct sdpcm_shared sh; |
@@ -3080,8 +3065,8 @@ static int brcmf_sdbrcm_checkdied(struct brcmf_sdio *bus) | |||
3080 | return 0; | 3065 | return 0; |
3081 | } | 3066 | } |
3082 | 3067 | ||
3083 | static int brcmf_sdbrcm_died_dump(struct brcmf_sdio *bus, char __user *data, | 3068 | static int brcmf_sdio_died_dump(struct brcmf_sdio *bus, char __user *data, |
3084 | size_t count, loff_t *ppos) | 3069 | size_t count, loff_t *ppos) |
3085 | { | 3070 | { |
3086 | int error = 0; | 3071 | int error = 0; |
3087 | struct sdpcm_shared sh; | 3072 | struct sdpcm_shared sh; |
@@ -3122,7 +3107,7 @@ static ssize_t brcmf_sdio_forensic_read(struct file *f, char __user *data, | |||
3122 | struct brcmf_sdio *bus = f->private_data; | 3107 | struct brcmf_sdio *bus = f->private_data; |
3123 | int res; | 3108 | int res; |
3124 | 3109 | ||
3125 | res = brcmf_sdbrcm_died_dump(bus, data, count, ppos); | 3110 | res = brcmf_sdio_died_dump(bus, data, count, ppos); |
3126 | if (res > 0) | 3111 | if (res > 0) |
3127 | *ppos += res; | 3112 | *ppos += res; |
3128 | return (ssize_t)res; | 3113 | return (ssize_t)res; |
@@ -3147,7 +3132,7 @@ static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus) | |||
3147 | brcmf_debugfs_create_sdio_count(drvr, &bus->sdcnt); | 3132 | brcmf_debugfs_create_sdio_count(drvr, &bus->sdcnt); |
3148 | } | 3133 | } |
3149 | #else | 3134 | #else |
3150 | static int brcmf_sdbrcm_checkdied(struct brcmf_sdio *bus) | 3135 | static int brcmf_sdio_checkdied(struct brcmf_sdio *bus) |
3151 | { | 3136 | { |
3152 | return 0; | 3137 | return 0; |
3153 | } | 3138 | } |
@@ -3158,7 +3143,7 @@ static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus) | |||
3158 | #endif /* DEBUG */ | 3143 | #endif /* DEBUG */ |
3159 | 3144 | ||
3160 | static int | 3145 | static int |
3161 | brcmf_sdbrcm_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen) | 3146 | brcmf_sdio_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen) |
3162 | { | 3147 | { |
3163 | int timeleft; | 3148 | int timeleft; |
3164 | uint rxlen = 0; | 3149 | uint rxlen = 0; |
@@ -3171,7 +3156,7 @@ brcmf_sdbrcm_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen) | |||
3171 | brcmf_dbg(TRACE, "Enter\n"); | 3156 | brcmf_dbg(TRACE, "Enter\n"); |
3172 | 3157 | ||
3173 | /* Wait until control frame is available */ | 3158 | /* Wait until control frame is available */ |
3174 | timeleft = brcmf_sdbrcm_dcmd_resp_wait(bus, &bus->rxlen, &pending); | 3159 | timeleft = brcmf_sdio_dcmd_resp_wait(bus, &bus->rxlen, &pending); |
3175 | 3160 | ||
3176 | spin_lock_bh(&bus->rxctl_lock); | 3161 | spin_lock_bh(&bus->rxctl_lock); |
3177 | rxlen = bus->rxlen; | 3162 | rxlen = bus->rxlen; |
@@ -3188,13 +3173,13 @@ brcmf_sdbrcm_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen) | |||
3188 | rxlen, msglen); | 3173 | rxlen, msglen); |
3189 | } else if (timeleft == 0) { | 3174 | } else if (timeleft == 0) { |
3190 | brcmf_err("resumed on timeout\n"); | 3175 | brcmf_err("resumed on timeout\n"); |
3191 | brcmf_sdbrcm_checkdied(bus); | 3176 | brcmf_sdio_checkdied(bus); |
3192 | } else if (pending) { | 3177 | } else if (pending) { |
3193 | brcmf_dbg(CTL, "cancelled\n"); | 3178 | brcmf_dbg(CTL, "cancelled\n"); |
3194 | return -ERESTARTSYS; | 3179 | return -ERESTARTSYS; |
3195 | } else { | 3180 | } else { |
3196 | brcmf_dbg(CTL, "resumed for unknown reason?\n"); | 3181 | brcmf_dbg(CTL, "resumed for unknown reason?\n"); |
3197 | brcmf_sdbrcm_checkdied(bus); | 3182 | brcmf_sdio_checkdied(bus); |
3198 | } | 3183 | } |
3199 | 3184 | ||
3200 | if (rxlen) | 3185 | if (rxlen) |
@@ -3205,7 +3190,7 @@ brcmf_sdbrcm_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen) | |||
3205 | return rxlen ? (int)rxlen : -ETIMEDOUT; | 3190 | return rxlen ? (int)rxlen : -ETIMEDOUT; |
3206 | } | 3191 | } |
3207 | 3192 | ||
3208 | static bool brcmf_sdbrcm_download_state(struct brcmf_sdio *bus, bool enter) | 3193 | static bool brcmf_sdio_download_state(struct brcmf_sdio *bus, bool enter) |
3209 | { | 3194 | { |
3210 | struct chip_info *ci = bus->ci; | 3195 | struct chip_info *ci = bus->ci; |
3211 | 3196 | ||
@@ -3230,7 +3215,7 @@ static bool brcmf_sdbrcm_download_state(struct brcmf_sdio *bus, bool enter) | |||
3230 | return true; | 3215 | return true; |
3231 | } | 3216 | } |
3232 | 3217 | ||
3233 | static int brcmf_sdbrcm_download_code_file(struct brcmf_sdio *bus) | 3218 | static int brcmf_sdio_download_code_file(struct brcmf_sdio *bus) |
3234 | { | 3219 | { |
3235 | const struct firmware *fw; | 3220 | const struct firmware *fw; |
3236 | int err; | 3221 | int err; |
@@ -3238,7 +3223,7 @@ static int brcmf_sdbrcm_download_code_file(struct brcmf_sdio *bus) | |||
3238 | int address; | 3223 | int address; |
3239 | int len; | 3224 | int len; |
3240 | 3225 | ||
3241 | fw = brcmf_sdbrcm_get_fw(bus, BRCMF_FIRMWARE_BIN); | 3226 | fw = brcmf_sdio_get_fw(bus, BRCMF_FIRMWARE_BIN); |
3242 | if (fw == NULL) | 3227 | if (fw == NULL) |
3243 | return -ENOENT; | 3228 | return -ENOENT; |
3244 | 3229 | ||
@@ -3252,8 +3237,8 @@ static int brcmf_sdbrcm_download_code_file(struct brcmf_sdio *bus) | |||
3252 | while (offset < fw->size) { | 3237 | while (offset < fw->size) { |
3253 | len = ((offset + MEMBLOCK) < fw->size) ? MEMBLOCK : | 3238 | len = ((offset + MEMBLOCK) < fw->size) ? MEMBLOCK : |
3254 | fw->size - offset; | 3239 | fw->size - offset; |
3255 | err = brcmf_sdio_ramrw(bus->sdiodev, true, address, | 3240 | err = brcmf_sdiod_ramrw(bus->sdiodev, true, address, |
3256 | (u8 *)&fw->data[offset], len); | 3241 | (u8 *)&fw->data[offset], len); |
3257 | if (err) { | 3242 | if (err) { |
3258 | brcmf_err("error %d on writing %d membytes at 0x%08x\n", | 3243 | brcmf_err("error %d on writing %d membytes at 0x%08x\n", |
3259 | err, len, address); | 3244 | err, len, address); |
@@ -3278,8 +3263,8 @@ failure: | |||
3278 | * by two NULs. | 3263 | * by two NULs. |
3279 | */ | 3264 | */ |
3280 | 3265 | ||
3281 | static int brcmf_process_nvram_vars(struct brcmf_sdio *bus, | 3266 | static int brcmf_sdio_strip_nvram(struct brcmf_sdio *bus, |
3282 | const struct firmware *nv) | 3267 | const struct firmware *nv) |
3283 | { | 3268 | { |
3284 | char *varbuf; | 3269 | char *varbuf; |
3285 | char *dp; | 3270 | char *dp; |
@@ -3343,44 +3328,48 @@ err: | |||
3343 | return ret; | 3328 | return ret; |
3344 | } | 3329 | } |
3345 | 3330 | ||
3346 | static int brcmf_sdbrcm_download_nvram(struct brcmf_sdio *bus) | 3331 | static int brcmf_sdio_download_nvram(struct brcmf_sdio *bus) |
3347 | { | 3332 | { |
3348 | const struct firmware *nv; | 3333 | const struct firmware *nv; |
3349 | int ret; | 3334 | int ret; |
3350 | 3335 | ||
3351 | nv = brcmf_sdbrcm_get_fw(bus, BRCMF_FIRMWARE_NVRAM); | 3336 | nv = brcmf_sdio_get_fw(bus, BRCMF_FIRMWARE_NVRAM); |
3352 | if (nv == NULL) | 3337 | if (nv == NULL) |
3353 | return -ENOENT; | 3338 | return -ENOENT; |
3354 | 3339 | ||
3355 | ret = brcmf_process_nvram_vars(bus, nv); | 3340 | ret = brcmf_sdio_strip_nvram(bus, nv); |
3356 | 3341 | ||
3357 | release_firmware(nv); | 3342 | release_firmware(nv); |
3358 | 3343 | ||
3359 | return ret; | 3344 | return ret; |
3360 | } | 3345 | } |
3361 | 3346 | ||
3362 | static int _brcmf_sdbrcm_download_firmware(struct brcmf_sdio *bus) | 3347 | static int brcmf_sdio_download_firmware(struct brcmf_sdio *bus) |
3363 | { | 3348 | { |
3364 | int bcmerror = -1; | 3349 | int bcmerror = -EFAULT; |
3350 | |||
3351 | |||
3352 | sdio_claim_host(bus->sdiodev->func[1]); | ||
3353 | brcmf_sdio_clkctl(bus, CLK_AVAIL, false); | ||
3365 | 3354 | ||
3366 | /* Keep arm in reset */ | 3355 | /* Keep arm in reset */ |
3367 | if (!brcmf_sdbrcm_download_state(bus, true)) { | 3356 | if (!brcmf_sdio_download_state(bus, true)) { |
3368 | brcmf_err("error placing ARM core in reset\n"); | 3357 | brcmf_err("error placing ARM core in reset\n"); |
3369 | goto err; | 3358 | goto err; |
3370 | } | 3359 | } |
3371 | 3360 | ||
3372 | if (brcmf_sdbrcm_download_code_file(bus)) { | 3361 | if (brcmf_sdio_download_code_file(bus)) { |
3373 | brcmf_err("dongle image file download failed\n"); | 3362 | brcmf_err("dongle image file download failed\n"); |
3374 | goto err; | 3363 | goto err; |
3375 | } | 3364 | } |
3376 | 3365 | ||
3377 | if (brcmf_sdbrcm_download_nvram(bus)) { | 3366 | if (brcmf_sdio_download_nvram(bus)) { |
3378 | brcmf_err("dongle nvram file download failed\n"); | 3367 | brcmf_err("dongle nvram file download failed\n"); |
3379 | goto err; | 3368 | goto err; |
3380 | } | 3369 | } |
3381 | 3370 | ||
3382 | /* Take arm out of reset */ | 3371 | /* Take arm out of reset */ |
3383 | if (!brcmf_sdbrcm_download_state(bus, false)) { | 3372 | if (!brcmf_sdio_download_state(bus, false)) { |
3384 | brcmf_err("error getting out of ARM core reset\n"); | 3373 | brcmf_err("error getting out of ARM core reset\n"); |
3385 | goto err; | 3374 | goto err; |
3386 | } | 3375 | } |
@@ -3388,10 +3377,12 @@ static int _brcmf_sdbrcm_download_firmware(struct brcmf_sdio *bus) | |||
3388 | bcmerror = 0; | 3377 | bcmerror = 0; |
3389 | 3378 | ||
3390 | err: | 3379 | err: |
3380 | brcmf_sdio_clkctl(bus, CLK_SDONLY, false); | ||
3381 | sdio_release_host(bus->sdiodev->func[1]); | ||
3391 | return bcmerror; | 3382 | return bcmerror; |
3392 | } | 3383 | } |
3393 | 3384 | ||
3394 | static bool brcmf_sdbrcm_sr_capable(struct brcmf_sdio *bus) | 3385 | static bool brcmf_sdio_sr_capable(struct brcmf_sdio *bus) |
3395 | { | 3386 | { |
3396 | u32 addr, reg; | 3387 | u32 addr, reg; |
3397 | 3388 | ||
@@ -3403,47 +3394,45 @@ static bool brcmf_sdbrcm_sr_capable(struct brcmf_sdio *bus) | |||
3403 | 3394 | ||
3404 | /* read PMU chipcontrol register 3*/ | 3395 | /* read PMU chipcontrol register 3*/ |
3405 | addr = CORE_CC_REG(bus->ci->c_inf[0].base, chipcontrol_addr); | 3396 | addr = CORE_CC_REG(bus->ci->c_inf[0].base, chipcontrol_addr); |
3406 | brcmf_sdio_regwl(bus->sdiodev, addr, 3, NULL); | 3397 | brcmf_sdiod_regwl(bus->sdiodev, addr, 3, NULL); |
3407 | addr = CORE_CC_REG(bus->ci->c_inf[0].base, chipcontrol_data); | 3398 | addr = CORE_CC_REG(bus->ci->c_inf[0].base, chipcontrol_data); |
3408 | reg = brcmf_sdio_regrl(bus->sdiodev, addr, NULL); | 3399 | reg = brcmf_sdiod_regrl(bus->sdiodev, addr, NULL); |
3409 | 3400 | ||
3410 | return (bool)reg; | 3401 | return (bool)reg; |
3411 | } | 3402 | } |
3412 | 3403 | ||
3413 | static void brcmf_sdbrcm_sr_init(struct brcmf_sdio *bus) | 3404 | static void brcmf_sdio_sr_init(struct brcmf_sdio *bus) |
3414 | { | 3405 | { |
3415 | int err = 0; | 3406 | int err = 0; |
3416 | u8 val; | 3407 | u8 val; |
3417 | 3408 | ||
3418 | brcmf_dbg(TRACE, "Enter\n"); | 3409 | brcmf_dbg(TRACE, "Enter\n"); |
3419 | 3410 | ||
3420 | val = brcmf_sdio_regrb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, | 3411 | val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, &err); |
3421 | &err); | ||
3422 | if (err) { | 3412 | if (err) { |
3423 | brcmf_err("error reading SBSDIO_FUNC1_WAKEUPCTRL\n"); | 3413 | brcmf_err("error reading SBSDIO_FUNC1_WAKEUPCTRL\n"); |
3424 | return; | 3414 | return; |
3425 | } | 3415 | } |
3426 | 3416 | ||
3427 | val |= 1 << SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT; | 3417 | val |= 1 << SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT; |
3428 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, | 3418 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, val, &err); |
3429 | val, &err); | ||
3430 | if (err) { | 3419 | if (err) { |
3431 | brcmf_err("error writing SBSDIO_FUNC1_WAKEUPCTRL\n"); | 3420 | brcmf_err("error writing SBSDIO_FUNC1_WAKEUPCTRL\n"); |
3432 | return; | 3421 | return; |
3433 | } | 3422 | } |
3434 | 3423 | ||
3435 | /* Add CMD14 Support */ | 3424 | /* Add CMD14 Support */ |
3436 | brcmf_sdio_regwb(bus->sdiodev, SDIO_CCCR_BRCM_CARDCAP, | 3425 | brcmf_sdiod_regwb(bus->sdiodev, SDIO_CCCR_BRCM_CARDCAP, |
3437 | (SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT | | 3426 | (SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT | |
3438 | SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT), | 3427 | SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT), |
3439 | &err); | 3428 | &err); |
3440 | if (err) { | 3429 | if (err) { |
3441 | brcmf_err("error writing SDIO_CCCR_BRCM_CARDCAP\n"); | 3430 | brcmf_err("error writing SDIO_CCCR_BRCM_CARDCAP\n"); |
3442 | return; | 3431 | return; |
3443 | } | 3432 | } |
3444 | 3433 | ||
3445 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, | 3434 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, |
3446 | SBSDIO_FORCE_HT, &err); | 3435 | SBSDIO_FORCE_HT, &err); |
3447 | if (err) { | 3436 | if (err) { |
3448 | brcmf_err("error writing SBSDIO_FUNC1_CHIPCLKCSR\n"); | 3437 | brcmf_err("error writing SBSDIO_FUNC1_CHIPCLKCSR\n"); |
3449 | return; | 3438 | return; |
@@ -3455,7 +3444,7 @@ static void brcmf_sdbrcm_sr_init(struct brcmf_sdio *bus) | |||
3455 | } | 3444 | } |
3456 | 3445 | ||
3457 | /* enable KSO bit */ | 3446 | /* enable KSO bit */ |
3458 | static int brcmf_sdbrcm_kso_init(struct brcmf_sdio *bus) | 3447 | static int brcmf_sdio_kso_init(struct brcmf_sdio *bus) |
3459 | { | 3448 | { |
3460 | u8 val; | 3449 | u8 val; |
3461 | int err = 0; | 3450 | int err = 0; |
@@ -3466,8 +3455,7 @@ static int brcmf_sdbrcm_kso_init(struct brcmf_sdio *bus) | |||
3466 | if (bus->ci->c_inf[1].rev < 12) | 3455 | if (bus->ci->c_inf[1].rev < 12) |
3467 | return 0; | 3456 | return 0; |
3468 | 3457 | ||
3469 | val = brcmf_sdio_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, | 3458 | val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, &err); |
3470 | &err); | ||
3471 | if (err) { | 3459 | if (err) { |
3472 | brcmf_err("error reading SBSDIO_FUNC1_SLEEPCSR\n"); | 3460 | brcmf_err("error reading SBSDIO_FUNC1_SLEEPCSR\n"); |
3473 | return err; | 3461 | return err; |
@@ -3476,8 +3464,8 @@ static int brcmf_sdbrcm_kso_init(struct brcmf_sdio *bus) | |||
3476 | if (!(val & SBSDIO_FUNC1_SLEEPCSR_KSO_MASK)) { | 3464 | if (!(val & SBSDIO_FUNC1_SLEEPCSR_KSO_MASK)) { |
3477 | val |= (SBSDIO_FUNC1_SLEEPCSR_KSO_EN << | 3465 | val |= (SBSDIO_FUNC1_SLEEPCSR_KSO_EN << |
3478 | SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT); | 3466 | SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT); |
3479 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, | 3467 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, |
3480 | val, &err); | 3468 | val, &err); |
3481 | if (err) { | 3469 | if (err) { |
3482 | brcmf_err("error writing SBSDIO_FUNC1_SLEEPCSR\n"); | 3470 | brcmf_err("error writing SBSDIO_FUNC1_SLEEPCSR\n"); |
3483 | return err; | 3471 | return err; |
@@ -3488,25 +3476,7 @@ static int brcmf_sdbrcm_kso_init(struct brcmf_sdio *bus) | |||
3488 | } | 3476 | } |
3489 | 3477 | ||
3490 | 3478 | ||
3491 | static bool | 3479 | static int brcmf_sdio_bus_preinit(struct device *dev) |
3492 | brcmf_sdbrcm_download_firmware(struct brcmf_sdio *bus) | ||
3493 | { | ||
3494 | bool ret; | ||
3495 | |||
3496 | sdio_claim_host(bus->sdiodev->func[1]); | ||
3497 | |||
3498 | brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); | ||
3499 | |||
3500 | ret = _brcmf_sdbrcm_download_firmware(bus) == 0; | ||
3501 | |||
3502 | brcmf_sdbrcm_clkctl(bus, CLK_SDONLY, false); | ||
3503 | |||
3504 | sdio_release_host(bus->sdiodev->func[1]); | ||
3505 | |||
3506 | return ret; | ||
3507 | } | ||
3508 | |||
3509 | static int brcmf_sdbrcm_bus_preinit(struct device *dev) | ||
3510 | { | 3480 | { |
3511 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); | 3481 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); |
3512 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; | 3482 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; |
@@ -3565,13 +3535,11 @@ done: | |||
3565 | return err; | 3535 | return err; |
3566 | } | 3536 | } |
3567 | 3537 | ||
3568 | static int brcmf_sdbrcm_bus_init(struct device *dev) | 3538 | static int brcmf_sdio_bus_init(struct device *dev) |
3569 | { | 3539 | { |
3570 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); | 3540 | struct brcmf_bus *bus_if = dev_get_drvdata(dev); |
3571 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; | 3541 | struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; |
3572 | struct brcmf_sdio *bus = sdiodev->bus; | 3542 | struct brcmf_sdio *bus = sdiodev->bus; |
3573 | unsigned long timeout; | ||
3574 | u8 ready, enable; | ||
3575 | int err, ret = 0; | 3543 | int err, ret = 0; |
3576 | u8 saveclk; | 3544 | u8 saveclk; |
3577 | 3545 | ||
@@ -3579,8 +3547,9 @@ static int brcmf_sdbrcm_bus_init(struct device *dev) | |||
3579 | 3547 | ||
3580 | /* try to download image and nvram to the dongle */ | 3548 | /* try to download image and nvram to the dongle */ |
3581 | if (bus_if->state == BRCMF_BUS_DOWN) { | 3549 | if (bus_if->state == BRCMF_BUS_DOWN) { |
3582 | if (!(brcmf_sdbrcm_download_firmware(bus))) | 3550 | err = brcmf_sdio_download_firmware(bus); |
3583 | return -1; | 3551 | if (err) |
3552 | return err; | ||
3584 | } | 3553 | } |
3585 | 3554 | ||
3586 | if (!bus->sdiodev->bus_if->drvr) | 3555 | if (!bus->sdiodev->bus_if->drvr) |
@@ -3588,21 +3557,21 @@ static int brcmf_sdbrcm_bus_init(struct device *dev) | |||
3588 | 3557 | ||
3589 | /* Start the watchdog timer */ | 3558 | /* Start the watchdog timer */ |
3590 | bus->sdcnt.tickcnt = 0; | 3559 | bus->sdcnt.tickcnt = 0; |
3591 | brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS); | 3560 | brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS); |
3592 | 3561 | ||
3593 | sdio_claim_host(bus->sdiodev->func[1]); | 3562 | sdio_claim_host(bus->sdiodev->func[1]); |
3594 | 3563 | ||
3595 | /* Make sure backplane clock is on, needed to generate F2 interrupt */ | 3564 | /* Make sure backplane clock is on, needed to generate F2 interrupt */ |
3596 | brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); | 3565 | brcmf_sdio_clkctl(bus, CLK_AVAIL, false); |
3597 | if (bus->clkstate != CLK_AVAIL) | 3566 | if (bus->clkstate != CLK_AVAIL) |
3598 | goto exit; | 3567 | goto exit; |
3599 | 3568 | ||
3600 | /* Force clocks on backplane to be sure F2 interrupt propagates */ | 3569 | /* Force clocks on backplane to be sure F2 interrupt propagates */ |
3601 | saveclk = brcmf_sdio_regrb(bus->sdiodev, | 3570 | saveclk = brcmf_sdiod_regrb(bus->sdiodev, |
3602 | SBSDIO_FUNC1_CHIPCLKCSR, &err); | 3571 | SBSDIO_FUNC1_CHIPCLKCSR, &err); |
3603 | if (!err) { | 3572 | if (!err) { |
3604 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, | 3573 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, |
3605 | (saveclk | SBSDIO_FORCE_HT), &err); | 3574 | (saveclk | SBSDIO_FORCE_HT), &err); |
3606 | } | 3575 | } |
3607 | if (err) { | 3576 | if (err) { |
3608 | brcmf_err("Failed to force clock for F2: err %d\n", err); | 3577 | brcmf_err("Failed to force clock for F2: err %d\n", err); |
@@ -3612,56 +3581,42 @@ static int brcmf_sdbrcm_bus_init(struct device *dev) | |||
3612 | /* Enable function 2 (frame transfers) */ | 3581 | /* Enable function 2 (frame transfers) */ |
3613 | w_sdreg32(bus, SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT, | 3582 | w_sdreg32(bus, SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT, |
3614 | offsetof(struct sdpcmd_regs, tosbmailboxdata)); | 3583 | offsetof(struct sdpcmd_regs, tosbmailboxdata)); |
3615 | enable = (SDIO_FUNC_ENABLE_1 | SDIO_FUNC_ENABLE_2); | 3584 | err = sdio_enable_func(bus->sdiodev->func[SDIO_FUNC_2]); |
3616 | |||
3617 | brcmf_sdio_regwb(bus->sdiodev, SDIO_CCCR_IOEx, enable, NULL); | ||
3618 | 3585 | ||
3619 | timeout = jiffies + msecs_to_jiffies(BRCMF_WAIT_F2RDY); | ||
3620 | ready = 0; | ||
3621 | while (enable != ready) { | ||
3622 | ready = brcmf_sdio_regrb(bus->sdiodev, | ||
3623 | SDIO_CCCR_IORx, NULL); | ||
3624 | if (time_after(jiffies, timeout)) | ||
3625 | break; | ||
3626 | else if (time_after(jiffies, timeout - BRCMF_WAIT_F2RDY + 50)) | ||
3627 | /* prevent busy waiting if it takes too long */ | ||
3628 | msleep_interruptible(20); | ||
3629 | } | ||
3630 | 3586 | ||
3631 | brcmf_dbg(INFO, "enable 0x%02x, ready 0x%02x\n", enable, ready); | 3587 | brcmf_dbg(INFO, "enable F2: err=%d\n", err); |
3632 | 3588 | ||
3633 | /* If F2 successfully enabled, set core and enable interrupts */ | 3589 | /* If F2 successfully enabled, set core and enable interrupts */ |
3634 | if (ready == enable) { | 3590 | if (!err) { |
3635 | /* Set up the interrupt mask and enable interrupts */ | 3591 | /* Set up the interrupt mask and enable interrupts */ |
3636 | bus->hostintmask = HOSTINTMASK; | 3592 | bus->hostintmask = HOSTINTMASK; |
3637 | w_sdreg32(bus, bus->hostintmask, | 3593 | w_sdreg32(bus, bus->hostintmask, |
3638 | offsetof(struct sdpcmd_regs, hostintmask)); | 3594 | offsetof(struct sdpcmd_regs, hostintmask)); |
3639 | 3595 | ||
3640 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_WATERMARK, 8, &err); | 3596 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_WATERMARK, 8, &err); |
3641 | } else { | 3597 | } else { |
3642 | /* Disable F2 again */ | 3598 | /* Disable F2 again */ |
3643 | enable = SDIO_FUNC_ENABLE_1; | 3599 | sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]); |
3644 | brcmf_sdio_regwb(bus->sdiodev, SDIO_CCCR_IOEx, enable, NULL); | ||
3645 | ret = -ENODEV; | 3600 | ret = -ENODEV; |
3646 | } | 3601 | } |
3647 | 3602 | ||
3648 | if (brcmf_sdbrcm_sr_capable(bus)) { | 3603 | if (brcmf_sdio_sr_capable(bus)) { |
3649 | brcmf_sdbrcm_sr_init(bus); | 3604 | brcmf_sdio_sr_init(bus); |
3650 | } else { | 3605 | } else { |
3651 | /* Restore previous clock setting */ | 3606 | /* Restore previous clock setting */ |
3652 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, | 3607 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, |
3653 | saveclk, &err); | 3608 | saveclk, &err); |
3654 | } | 3609 | } |
3655 | 3610 | ||
3656 | if (ret == 0) { | 3611 | if (ret == 0) { |
3657 | ret = brcmf_sdio_intr_register(bus->sdiodev); | 3612 | ret = brcmf_sdiod_intr_register(bus->sdiodev); |
3658 | if (ret != 0) | 3613 | if (ret != 0) |
3659 | brcmf_err("intr register failed:%d\n", ret); | 3614 | brcmf_err("intr register failed:%d\n", ret); |
3660 | } | 3615 | } |
3661 | 3616 | ||
3662 | /* If we didn't come up, turn off backplane clock */ | 3617 | /* If we didn't come up, turn off backplane clock */ |
3663 | if (bus_if->state != BRCMF_BUS_DATA) | 3618 | if (bus_if->state != BRCMF_BUS_DATA) |
3664 | brcmf_sdbrcm_clkctl(bus, CLK_NONE, false); | 3619 | brcmf_sdio_clkctl(bus, CLK_NONE, false); |
3665 | 3620 | ||
3666 | exit: | 3621 | exit: |
3667 | sdio_release_host(bus->sdiodev->func[1]); | 3622 | sdio_release_host(bus->sdiodev->func[1]); |
@@ -3669,10 +3624,8 @@ exit: | |||
3669 | return ret; | 3624 | return ret; |
3670 | } | 3625 | } |
3671 | 3626 | ||
3672 | void brcmf_sdbrcm_isr(void *arg) | 3627 | void brcmf_sdio_isr(struct brcmf_sdio *bus) |
3673 | { | 3628 | { |
3674 | struct brcmf_sdio *bus = (struct brcmf_sdio *) arg; | ||
3675 | |||
3676 | brcmf_dbg(TRACE, "Enter\n"); | 3629 | brcmf_dbg(TRACE, "Enter\n"); |
3677 | 3630 | ||
3678 | if (!bus) { | 3631 | if (!bus) { |
@@ -3702,7 +3655,7 @@ void brcmf_sdbrcm_isr(void *arg) | |||
3702 | queue_work(bus->brcmf_wq, &bus->datawork); | 3655 | queue_work(bus->brcmf_wq, &bus->datawork); |
3703 | } | 3656 | } |
3704 | 3657 | ||
3705 | static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus) | 3658 | static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus) |
3706 | { | 3659 | { |
3707 | #ifdef DEBUG | 3660 | #ifdef DEBUG |
3708 | struct brcmf_bus *bus_if = dev_get_drvdata(bus->sdiodev->dev); | 3661 | struct brcmf_bus *bus_if = dev_get_drvdata(bus->sdiodev->dev); |
@@ -3726,9 +3679,9 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus) | |||
3726 | u8 devpend; | 3679 | u8 devpend; |
3727 | 3680 | ||
3728 | sdio_claim_host(bus->sdiodev->func[1]); | 3681 | sdio_claim_host(bus->sdiodev->func[1]); |
3729 | devpend = brcmf_sdio_regrb(bus->sdiodev, | 3682 | devpend = brcmf_sdiod_regrb(bus->sdiodev, |
3730 | SDIO_CCCR_INTx, | 3683 | SDIO_CCCR_INTx, |
3731 | NULL); | 3684 | NULL); |
3732 | sdio_release_host(bus->sdiodev->func[1]); | 3685 | sdio_release_host(bus->sdiodev->func[1]); |
3733 | intstatus = | 3686 | intstatus = |
3734 | devpend & (INTR_STATUS_FUNC1 | | 3687 | devpend & (INTR_STATUS_FUNC1 | |
@@ -3758,8 +3711,8 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus) | |||
3758 | bus->console.count -= bus->console_interval; | 3711 | bus->console.count -= bus->console_interval; |
3759 | sdio_claim_host(bus->sdiodev->func[1]); | 3712 | sdio_claim_host(bus->sdiodev->func[1]); |
3760 | /* Make sure backplane clock is on */ | 3713 | /* Make sure backplane clock is on */ |
3761 | brcmf_sdbrcm_bus_sleep(bus, false, false); | 3714 | brcmf_sdio_bus_sleep(bus, false, false); |
3762 | if (brcmf_sdbrcm_readconsole(bus) < 0) | 3715 | if (brcmf_sdio_readconsole(bus) < 0) |
3763 | /* stop on error */ | 3716 | /* stop on error */ |
3764 | bus->console_interval = 0; | 3717 | bus->console_interval = 0; |
3765 | sdio_release_host(bus->sdiodev->func[1]); | 3718 | sdio_release_host(bus->sdiodev->func[1]); |
@@ -3773,11 +3726,11 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus) | |||
3773 | bus->idlecount = 0; | 3726 | bus->idlecount = 0; |
3774 | if (bus->activity) { | 3727 | if (bus->activity) { |
3775 | bus->activity = false; | 3728 | bus->activity = false; |
3776 | brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS); | 3729 | brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS); |
3777 | } else { | 3730 | } else { |
3778 | brcmf_dbg(SDIO, "idle\n"); | 3731 | brcmf_dbg(SDIO, "idle\n"); |
3779 | sdio_claim_host(bus->sdiodev->func[1]); | 3732 | sdio_claim_host(bus->sdiodev->func[1]); |
3780 | brcmf_sdbrcm_bus_sleep(bus, true, false); | 3733 | brcmf_sdio_bus_sleep(bus, true, false); |
3781 | sdio_release_host(bus->sdiodev->func[1]); | 3734 | sdio_release_host(bus->sdiodev->func[1]); |
3782 | } | 3735 | } |
3783 | } | 3736 | } |
@@ -3792,12 +3745,12 @@ static void brcmf_sdio_dataworker(struct work_struct *work) | |||
3792 | datawork); | 3745 | datawork); |
3793 | 3746 | ||
3794 | while (atomic_read(&bus->dpc_tskcnt)) { | 3747 | while (atomic_read(&bus->dpc_tskcnt)) { |
3795 | brcmf_sdbrcm_dpc(bus); | 3748 | brcmf_sdio_dpc(bus); |
3796 | atomic_dec(&bus->dpc_tskcnt); | 3749 | atomic_dec(&bus->dpc_tskcnt); |
3797 | } | 3750 | } |
3798 | } | 3751 | } |
3799 | 3752 | ||
3800 | static void brcmf_sdbrcm_release_malloc(struct brcmf_sdio *bus) | 3753 | static void brcmf_sdio_release_malloc(struct brcmf_sdio *bus) |
3801 | { | 3754 | { |
3802 | brcmf_dbg(TRACE, "Enter\n"); | 3755 | brcmf_dbg(TRACE, "Enter\n"); |
3803 | 3756 | ||
@@ -3806,7 +3759,7 @@ static void brcmf_sdbrcm_release_malloc(struct brcmf_sdio *bus) | |||
3806 | bus->rxlen = 0; | 3759 | bus->rxlen = 0; |
3807 | } | 3760 | } |
3808 | 3761 | ||
3809 | static bool brcmf_sdbrcm_probe_malloc(struct brcmf_sdio *bus) | 3762 | static bool brcmf_sdio_probe_malloc(struct brcmf_sdio *bus) |
3810 | { | 3763 | { |
3811 | brcmf_dbg(TRACE, "Enter\n"); | 3764 | brcmf_dbg(TRACE, "Enter\n"); |
3812 | 3765 | ||
@@ -3823,7 +3776,7 @@ static bool brcmf_sdbrcm_probe_malloc(struct brcmf_sdio *bus) | |||
3823 | } | 3776 | } |
3824 | 3777 | ||
3825 | static bool | 3778 | static bool |
3826 | brcmf_sdbrcm_probe_attach(struct brcmf_sdio *bus, u32 regsva) | 3779 | brcmf_sdio_probe_attach(struct brcmf_sdio *bus) |
3827 | { | 3780 | { |
3828 | u8 clkctl = 0; | 3781 | u8 clkctl = 0; |
3829 | int err = 0; | 3782 | int err = 0; |
@@ -3836,18 +3789,18 @@ brcmf_sdbrcm_probe_attach(struct brcmf_sdio *bus, u32 regsva) | |||
3836 | sdio_claim_host(bus->sdiodev->func[1]); | 3789 | sdio_claim_host(bus->sdiodev->func[1]); |
3837 | 3790 | ||
3838 | pr_debug("F1 signature read @0x18000000=0x%4x\n", | 3791 | pr_debug("F1 signature read @0x18000000=0x%4x\n", |
3839 | brcmf_sdio_regrl(bus->sdiodev, SI_ENUM_BASE, NULL)); | 3792 | brcmf_sdiod_regrl(bus->sdiodev, SI_ENUM_BASE, NULL)); |
3840 | 3793 | ||
3841 | /* | 3794 | /* |
3842 | * Force PLL off until brcmf_sdio_chip_attach() | 3795 | * Force PLL off until brcmf_sdio_chip_attach() |
3843 | * programs PLL control regs | 3796 | * programs PLL control regs |
3844 | */ | 3797 | */ |
3845 | 3798 | ||
3846 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, | 3799 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, |
3847 | BRCMF_INIT_CLKCTL1, &err); | 3800 | BRCMF_INIT_CLKCTL1, &err); |
3848 | if (!err) | 3801 | if (!err) |
3849 | clkctl = brcmf_sdio_regrb(bus->sdiodev, | 3802 | clkctl = brcmf_sdiod_regrb(bus->sdiodev, |
3850 | SBSDIO_FUNC1_CHIPCLKCSR, &err); | 3803 | SBSDIO_FUNC1_CHIPCLKCSR, &err); |
3851 | 3804 | ||
3852 | if (err || ((clkctl & ~SBSDIO_AVBITS) != BRCMF_INIT_CLKCTL1)) { | 3805 | if (err || ((clkctl & ~SBSDIO_AVBITS) != BRCMF_INIT_CLKCTL1)) { |
3853 | brcmf_err("ChipClkCSR access: err %d wrote 0x%02x read 0x%02x\n", | 3806 | brcmf_err("ChipClkCSR access: err %d wrote 0x%02x read 0x%02x\n", |
@@ -3855,12 +3808,12 @@ brcmf_sdbrcm_probe_attach(struct brcmf_sdio *bus, u32 regsva) | |||
3855 | goto fail; | 3808 | goto fail; |
3856 | } | 3809 | } |
3857 | 3810 | ||
3858 | if (brcmf_sdio_chip_attach(bus->sdiodev, &bus->ci, regsva)) { | 3811 | if (brcmf_sdio_chip_attach(bus->sdiodev, &bus->ci)) { |
3859 | brcmf_err("brcmf_sdio_chip_attach failed!\n"); | 3812 | brcmf_err("brcmf_sdio_chip_attach failed!\n"); |
3860 | goto fail; | 3813 | goto fail; |
3861 | } | 3814 | } |
3862 | 3815 | ||
3863 | if (brcmf_sdbrcm_kso_init(bus)) { | 3816 | if (brcmf_sdio_kso_init(bus)) { |
3864 | brcmf_err("error enabling KSO\n"); | 3817 | brcmf_err("error enabling KSO\n"); |
3865 | goto fail; | 3818 | goto fail; |
3866 | } | 3819 | } |
@@ -3879,33 +3832,33 @@ brcmf_sdbrcm_probe_attach(struct brcmf_sdio *bus, u32 regsva) | |||
3879 | } | 3832 | } |
3880 | 3833 | ||
3881 | /* Set card control so an SDIO card reset does a WLAN backplane reset */ | 3834 | /* Set card control so an SDIO card reset does a WLAN backplane reset */ |
3882 | reg_val = brcmf_sdio_regrb(bus->sdiodev, | 3835 | reg_val = brcmf_sdiod_regrb(bus->sdiodev, |
3883 | SDIO_CCCR_BRCM_CARDCTRL, &err); | 3836 | SDIO_CCCR_BRCM_CARDCTRL, &err); |
3884 | if (err) | 3837 | if (err) |
3885 | goto fail; | 3838 | goto fail; |
3886 | 3839 | ||
3887 | reg_val |= SDIO_CCCR_BRCM_CARDCTRL_WLANRESET; | 3840 | reg_val |= SDIO_CCCR_BRCM_CARDCTRL_WLANRESET; |
3888 | 3841 | ||
3889 | brcmf_sdio_regwb(bus->sdiodev, | 3842 | brcmf_sdiod_regwb(bus->sdiodev, |
3890 | SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err); | 3843 | SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err); |
3891 | if (err) | 3844 | if (err) |
3892 | goto fail; | 3845 | goto fail; |
3893 | 3846 | ||
3894 | /* set PMUControl so a backplane reset does PMU state reload */ | 3847 | /* set PMUControl so a backplane reset does PMU state reload */ |
3895 | reg_addr = CORE_CC_REG(bus->ci->c_inf[0].base, | 3848 | reg_addr = CORE_CC_REG(bus->ci->c_inf[0].base, |
3896 | pmucontrol); | 3849 | pmucontrol); |
3897 | reg_val = brcmf_sdio_regrl(bus->sdiodev, | 3850 | reg_val = brcmf_sdiod_regrl(bus->sdiodev, |
3898 | reg_addr, | 3851 | reg_addr, |
3899 | &err); | 3852 | &err); |
3900 | if (err) | 3853 | if (err) |
3901 | goto fail; | 3854 | goto fail; |
3902 | 3855 | ||
3903 | reg_val |= (BCMA_CC_PMU_CTL_RES_RELOAD << BCMA_CC_PMU_CTL_RES_SHIFT); | 3856 | reg_val |= (BCMA_CC_PMU_CTL_RES_RELOAD << BCMA_CC_PMU_CTL_RES_SHIFT); |
3904 | 3857 | ||
3905 | brcmf_sdio_regwl(bus->sdiodev, | 3858 | brcmf_sdiod_regwl(bus->sdiodev, |
3906 | reg_addr, | 3859 | reg_addr, |
3907 | reg_val, | 3860 | reg_val, |
3908 | &err); | 3861 | &err); |
3909 | if (err) | 3862 | if (err) |
3910 | goto fail; | 3863 | goto fail; |
3911 | 3864 | ||
@@ -3935,21 +3888,20 @@ fail: | |||
3935 | return false; | 3888 | return false; |
3936 | } | 3889 | } |
3937 | 3890 | ||
3938 | static bool brcmf_sdbrcm_probe_init(struct brcmf_sdio *bus) | 3891 | static bool brcmf_sdio_probe_init(struct brcmf_sdio *bus) |
3939 | { | 3892 | { |
3940 | brcmf_dbg(TRACE, "Enter\n"); | 3893 | brcmf_dbg(TRACE, "Enter\n"); |
3941 | 3894 | ||
3942 | sdio_claim_host(bus->sdiodev->func[1]); | 3895 | sdio_claim_host(bus->sdiodev->func[1]); |
3943 | 3896 | ||
3944 | /* Disable F2 to clear any intermediate frame state on the dongle */ | 3897 | /* Disable F2 to clear any intermediate frame state on the dongle */ |
3945 | brcmf_sdio_regwb(bus->sdiodev, SDIO_CCCR_IOEx, | 3898 | sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]); |
3946 | SDIO_FUNC_ENABLE_1, NULL); | ||
3947 | 3899 | ||
3948 | bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; | 3900 | bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; |
3949 | bus->rxflow = false; | 3901 | bus->rxflow = false; |
3950 | 3902 | ||
3951 | /* Done with backplane-dependent accesses, can drop clock... */ | 3903 | /* Done with backplane-dependent accesses, can drop clock... */ |
3952 | brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL); | 3904 | brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL); |
3953 | 3905 | ||
3954 | sdio_release_host(bus->sdiodev->func[1]); | 3906 | sdio_release_host(bus->sdiodev->func[1]); |
3955 | 3907 | ||
@@ -3970,7 +3922,7 @@ static bool brcmf_sdbrcm_probe_init(struct brcmf_sdio *bus) | |||
3970 | } | 3922 | } |
3971 | 3923 | ||
3972 | static int | 3924 | static int |
3973 | brcmf_sdbrcm_watchdog_thread(void *data) | 3925 | brcmf_sdio_watchdog_thread(void *data) |
3974 | { | 3926 | { |
3975 | struct brcmf_sdio *bus = (struct brcmf_sdio *)data; | 3927 | struct brcmf_sdio *bus = (struct brcmf_sdio *)data; |
3976 | 3928 | ||
@@ -3980,7 +3932,7 @@ brcmf_sdbrcm_watchdog_thread(void *data) | |||
3980 | if (kthread_should_stop()) | 3932 | if (kthread_should_stop()) |
3981 | break; | 3933 | break; |
3982 | if (!wait_for_completion_interruptible(&bus->watchdog_wait)) { | 3934 | if (!wait_for_completion_interruptible(&bus->watchdog_wait)) { |
3983 | brcmf_sdbrcm_bus_watchdog(bus); | 3935 | brcmf_sdio_bus_watchdog(bus); |
3984 | /* Count the tick for reference */ | 3936 | /* Count the tick for reference */ |
3985 | bus->sdcnt.tickcnt++; | 3937 | bus->sdcnt.tickcnt++; |
3986 | } else | 3938 | } else |
@@ -3990,7 +3942,7 @@ brcmf_sdbrcm_watchdog_thread(void *data) | |||
3990 | } | 3942 | } |
3991 | 3943 | ||
3992 | static void | 3944 | static void |
3993 | brcmf_sdbrcm_watchdog(unsigned long data) | 3945 | brcmf_sdio_watchdog(unsigned long data) |
3994 | { | 3946 | { |
3995 | struct brcmf_sdio *bus = (struct brcmf_sdio *)data; | 3947 | struct brcmf_sdio *bus = (struct brcmf_sdio *)data; |
3996 | 3948 | ||
@@ -4003,14 +3955,14 @@ brcmf_sdbrcm_watchdog(unsigned long data) | |||
4003 | } | 3955 | } |
4004 | } | 3956 | } |
4005 | 3957 | ||
4006 | static void brcmf_sdbrcm_release_dongle(struct brcmf_sdio *bus) | 3958 | static void brcmf_sdio_release_dongle(struct brcmf_sdio *bus) |
4007 | { | 3959 | { |
4008 | brcmf_dbg(TRACE, "Enter\n"); | 3960 | brcmf_dbg(TRACE, "Enter\n"); |
4009 | 3961 | ||
4010 | if (bus->ci) { | 3962 | if (bus->ci) { |
4011 | sdio_claim_host(bus->sdiodev->func[1]); | 3963 | sdio_claim_host(bus->sdiodev->func[1]); |
4012 | brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false); | 3964 | brcmf_sdio_clkctl(bus, CLK_AVAIL, false); |
4013 | brcmf_sdbrcm_clkctl(bus, CLK_NONE, false); | 3965 | brcmf_sdio_clkctl(bus, CLK_NONE, false); |
4014 | sdio_release_host(bus->sdiodev->func[1]); | 3966 | sdio_release_host(bus->sdiodev->func[1]); |
4015 | brcmf_sdio_chip_detach(&bus->ci); | 3967 | brcmf_sdio_chip_detach(&bus->ci); |
4016 | if (bus->vars && bus->varsz) | 3968 | if (bus->vars && bus->varsz) |
@@ -4021,53 +3973,23 @@ static void brcmf_sdbrcm_release_dongle(struct brcmf_sdio *bus) | |||
4021 | brcmf_dbg(TRACE, "Disconnected\n"); | 3973 | brcmf_dbg(TRACE, "Disconnected\n"); |
4022 | } | 3974 | } |
4023 | 3975 | ||
4024 | /* Detach and free everything */ | ||
4025 | static void brcmf_sdbrcm_release(struct brcmf_sdio *bus) | ||
4026 | { | ||
4027 | brcmf_dbg(TRACE, "Enter\n"); | ||
4028 | |||
4029 | if (bus) { | ||
4030 | /* De-register interrupt handler */ | ||
4031 | brcmf_sdio_intr_unregister(bus->sdiodev); | ||
4032 | |||
4033 | cancel_work_sync(&bus->datawork); | ||
4034 | if (bus->brcmf_wq) | ||
4035 | destroy_workqueue(bus->brcmf_wq); | ||
4036 | |||
4037 | if (bus->sdiodev->bus_if->drvr) { | ||
4038 | brcmf_detach(bus->sdiodev->dev); | ||
4039 | brcmf_sdbrcm_release_dongle(bus); | ||
4040 | } | ||
4041 | |||
4042 | brcmu_pkt_buf_free_skb(bus->txglom_sgpad); | ||
4043 | brcmf_sdbrcm_release_malloc(bus); | ||
4044 | kfree(bus->hdrbuf); | ||
4045 | kfree(bus); | ||
4046 | } | ||
4047 | |||
4048 | brcmf_dbg(TRACE, "Disconnected\n"); | ||
4049 | } | ||
4050 | |||
4051 | static struct brcmf_bus_ops brcmf_sdio_bus_ops = { | 3976 | static struct brcmf_bus_ops brcmf_sdio_bus_ops = { |
4052 | .stop = brcmf_sdbrcm_bus_stop, | 3977 | .stop = brcmf_sdio_bus_stop, |
4053 | .preinit = brcmf_sdbrcm_bus_preinit, | 3978 | .preinit = brcmf_sdio_bus_preinit, |
4054 | .init = brcmf_sdbrcm_bus_init, | 3979 | .init = brcmf_sdio_bus_init, |
4055 | .txdata = brcmf_sdbrcm_bus_txdata, | 3980 | .txdata = brcmf_sdio_bus_txdata, |
4056 | .txctl = brcmf_sdbrcm_bus_txctl, | 3981 | .txctl = brcmf_sdio_bus_txctl, |
4057 | .rxctl = brcmf_sdbrcm_bus_rxctl, | 3982 | .rxctl = brcmf_sdio_bus_rxctl, |
4058 | .gettxq = brcmf_sdbrcm_bus_gettxq, | 3983 | .gettxq = brcmf_sdio_bus_gettxq, |
4059 | }; | 3984 | }; |
4060 | 3985 | ||
4061 | void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev) | 3986 | struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev) |
4062 | { | 3987 | { |
4063 | int ret; | 3988 | int ret; |
4064 | struct brcmf_sdio *bus; | 3989 | struct brcmf_sdio *bus; |
4065 | 3990 | ||
4066 | brcmf_dbg(TRACE, "Enter\n"); | 3991 | brcmf_dbg(TRACE, "Enter\n"); |
4067 | 3992 | ||
4068 | /* We make an assumption about address window mappings: | ||
4069 | * regsva == SI_ENUM_BASE*/ | ||
4070 | |||
4071 | /* Allocate private bus interface state */ | 3993 | /* Allocate private bus interface state */ |
4072 | bus = kzalloc(sizeof(struct brcmf_sdio), GFP_ATOMIC); | 3994 | bus = kzalloc(sizeof(struct brcmf_sdio), GFP_ATOMIC); |
4073 | if (!bus) | 3995 | if (!bus) |
@@ -4101,8 +4023,8 @@ void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev) | |||
4101 | } | 4023 | } |
4102 | 4024 | ||
4103 | /* attempt to attach to the dongle */ | 4025 | /* attempt to attach to the dongle */ |
4104 | if (!(brcmf_sdbrcm_probe_attach(bus, regsva))) { | 4026 | if (!(brcmf_sdio_probe_attach(bus))) { |
4105 | brcmf_err("brcmf_sdbrcm_probe_attach failed\n"); | 4027 | brcmf_err("brcmf_sdio_probe_attach failed\n"); |
4106 | goto fail; | 4028 | goto fail; |
4107 | } | 4029 | } |
4108 | 4030 | ||
@@ -4114,11 +4036,11 @@ void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev) | |||
4114 | /* Set up the watchdog timer */ | 4036 | /* Set up the watchdog timer */ |
4115 | init_timer(&bus->timer); | 4037 | init_timer(&bus->timer); |
4116 | bus->timer.data = (unsigned long)bus; | 4038 | bus->timer.data = (unsigned long)bus; |
4117 | bus->timer.function = brcmf_sdbrcm_watchdog; | 4039 | bus->timer.function = brcmf_sdio_watchdog; |
4118 | 4040 | ||
4119 | /* Initialize watchdog thread */ | 4041 | /* Initialize watchdog thread */ |
4120 | init_completion(&bus->watchdog_wait); | 4042 | init_completion(&bus->watchdog_wait); |
4121 | bus->watchdog_tsk = kthread_run(brcmf_sdbrcm_watchdog_thread, | 4043 | bus->watchdog_tsk = kthread_run(brcmf_sdio_watchdog_thread, |
4122 | bus, "brcmf_watchdog"); | 4044 | bus, "brcmf_watchdog"); |
4123 | if (IS_ERR(bus->watchdog_tsk)) { | 4045 | if (IS_ERR(bus->watchdog_tsk)) { |
4124 | pr_warn("brcmf_watchdog thread failed to start\n"); | 4046 | pr_warn("brcmf_watchdog thread failed to start\n"); |
@@ -4144,13 +4066,13 @@ void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev) | |||
4144 | } | 4066 | } |
4145 | 4067 | ||
4146 | /* Allocate buffers */ | 4068 | /* Allocate buffers */ |
4147 | if (!(brcmf_sdbrcm_probe_malloc(bus))) { | 4069 | if (!(brcmf_sdio_probe_malloc(bus))) { |
4148 | brcmf_err("brcmf_sdbrcm_probe_malloc failed\n"); | 4070 | brcmf_err("brcmf_sdio_probe_malloc failed\n"); |
4149 | goto fail; | 4071 | goto fail; |
4150 | } | 4072 | } |
4151 | 4073 | ||
4152 | if (!(brcmf_sdbrcm_probe_init(bus))) { | 4074 | if (!(brcmf_sdio_probe_init(bus))) { |
4153 | brcmf_err("brcmf_sdbrcm_probe_init failed\n"); | 4075 | brcmf_err("brcmf_sdio_probe_init failed\n"); |
4154 | goto fail; | 4076 | goto fail; |
4155 | } | 4077 | } |
4156 | 4078 | ||
@@ -4167,24 +4089,38 @@ void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev) | |||
4167 | return bus; | 4089 | return bus; |
4168 | 4090 | ||
4169 | fail: | 4091 | fail: |
4170 | brcmf_sdbrcm_release(bus); | 4092 | brcmf_sdio_remove(bus); |
4171 | return NULL; | 4093 | return NULL; |
4172 | } | 4094 | } |
4173 | 4095 | ||
4174 | void brcmf_sdbrcm_disconnect(void *ptr) | 4096 | /* Detach and free everything */ |
4097 | void brcmf_sdio_remove(struct brcmf_sdio *bus) | ||
4175 | { | 4098 | { |
4176 | struct brcmf_sdio *bus = (struct brcmf_sdio *)ptr; | ||
4177 | |||
4178 | brcmf_dbg(TRACE, "Enter\n"); | 4099 | brcmf_dbg(TRACE, "Enter\n"); |
4179 | 4100 | ||
4180 | if (bus) | 4101 | if (bus) { |
4181 | brcmf_sdbrcm_release(bus); | 4102 | /* De-register interrupt handler */ |
4103 | brcmf_sdiod_intr_unregister(bus->sdiodev); | ||
4104 | |||
4105 | cancel_work_sync(&bus->datawork); | ||
4106 | if (bus->brcmf_wq) | ||
4107 | destroy_workqueue(bus->brcmf_wq); | ||
4108 | |||
4109 | if (bus->sdiodev->bus_if->drvr) { | ||
4110 | brcmf_detach(bus->sdiodev->dev); | ||
4111 | brcmf_sdio_release_dongle(bus); | ||
4112 | } | ||
4113 | |||
4114 | brcmu_pkt_buf_free_skb(bus->txglom_sgpad); | ||
4115 | brcmf_sdio_release_malloc(bus); | ||
4116 | kfree(bus->hdrbuf); | ||
4117 | kfree(bus); | ||
4118 | } | ||
4182 | 4119 | ||
4183 | brcmf_dbg(TRACE, "Disconnected\n"); | 4120 | brcmf_dbg(TRACE, "Disconnected\n"); |
4184 | } | 4121 | } |
4185 | 4122 | ||
4186 | void | 4123 | void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, uint wdtick) |
4187 | brcmf_sdbrcm_wd_timer(struct brcmf_sdio *bus, uint wdtick) | ||
4188 | { | 4124 | { |
4189 | /* Totally stop the timer */ | 4125 | /* Totally stop the timer */ |
4190 | if (!wdtick && bus->wd_timer_valid) { | 4126 | if (!wdtick && bus->wd_timer_valid) { |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwil.c b/drivers/net/wireless/brcm80211/brcmfmac/fwil.c index b72d3395499a..22adbe311d20 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/fwil.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil.c | |||
@@ -68,7 +68,7 @@ brcmf_fil_cmd_data_set(struct brcmf_if *ifp, u32 cmd, void *data, u32 len) | |||
68 | 68 | ||
69 | brcmf_dbg(FIL, "cmd=%d, len=%d\n", cmd, len); | 69 | brcmf_dbg(FIL, "cmd=%d, len=%d\n", cmd, len); |
70 | brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, | 70 | brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, |
71 | min_t(uint, len, MAX_HEX_DUMP_LEN), "data"); | 71 | min_t(uint, len, MAX_HEX_DUMP_LEN), "data\n"); |
72 | 72 | ||
73 | err = brcmf_fil_cmd_data(ifp, cmd, data, len, true); | 73 | err = brcmf_fil_cmd_data(ifp, cmd, data, len, true); |
74 | mutex_unlock(&ifp->drvr->proto_block); | 74 | mutex_unlock(&ifp->drvr->proto_block); |
@@ -86,7 +86,7 @@ brcmf_fil_cmd_data_get(struct brcmf_if *ifp, u32 cmd, void *data, u32 len) | |||
86 | 86 | ||
87 | brcmf_dbg(FIL, "cmd=%d, len=%d\n", cmd, len); | 87 | brcmf_dbg(FIL, "cmd=%d, len=%d\n", cmd, len); |
88 | brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, | 88 | brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, |
89 | min_t(uint, len, MAX_HEX_DUMP_LEN), "data"); | 89 | min_t(uint, len, MAX_HEX_DUMP_LEN), "data\n"); |
90 | 90 | ||
91 | mutex_unlock(&ifp->drvr->proto_block); | 91 | mutex_unlock(&ifp->drvr->proto_block); |
92 | 92 | ||
@@ -155,7 +155,7 @@ brcmf_fil_iovar_data_set(struct brcmf_if *ifp, char *name, void *data, | |||
155 | 155 | ||
156 | brcmf_dbg(FIL, "name=%s, len=%d\n", name, len); | 156 | brcmf_dbg(FIL, "name=%s, len=%d\n", name, len); |
157 | brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, | 157 | brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, |
158 | min_t(uint, len, MAX_HEX_DUMP_LEN), "data"); | 158 | min_t(uint, len, MAX_HEX_DUMP_LEN), "data\n"); |
159 | 159 | ||
160 | buflen = brcmf_create_iovar(name, data, len, drvr->proto_buf, | 160 | buflen = brcmf_create_iovar(name, data, len, drvr->proto_buf, |
161 | sizeof(drvr->proto_buf)); | 161 | sizeof(drvr->proto_buf)); |
@@ -195,7 +195,7 @@ brcmf_fil_iovar_data_get(struct brcmf_if *ifp, char *name, void *data, | |||
195 | 195 | ||
196 | brcmf_dbg(FIL, "name=%s, len=%d\n", name, len); | 196 | brcmf_dbg(FIL, "name=%s, len=%d\n", name, len); |
197 | brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, | 197 | brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, |
198 | min_t(uint, len, MAX_HEX_DUMP_LEN), "data"); | 198 | min_t(uint, len, MAX_HEX_DUMP_LEN), "data\n"); |
199 | 199 | ||
200 | mutex_unlock(&drvr->proto_block); | 200 | mutex_unlock(&drvr->proto_block); |
201 | return err; | 201 | return err; |
@@ -278,7 +278,7 @@ brcmf_fil_bsscfg_data_set(struct brcmf_if *ifp, char *name, | |||
278 | 278 | ||
279 | brcmf_dbg(FIL, "bssidx=%d, name=%s, len=%d\n", ifp->bssidx, name, len); | 279 | brcmf_dbg(FIL, "bssidx=%d, name=%s, len=%d\n", ifp->bssidx, name, len); |
280 | brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, | 280 | brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, |
281 | min_t(uint, len, MAX_HEX_DUMP_LEN), "data"); | 281 | min_t(uint, len, MAX_HEX_DUMP_LEN), "data\n"); |
282 | 282 | ||
283 | buflen = brcmf_create_bsscfg(ifp->bssidx, name, data, len, | 283 | buflen = brcmf_create_bsscfg(ifp->bssidx, name, data, len, |
284 | drvr->proto_buf, sizeof(drvr->proto_buf)); | 284 | drvr->proto_buf, sizeof(drvr->proto_buf)); |
@@ -317,7 +317,7 @@ brcmf_fil_bsscfg_data_get(struct brcmf_if *ifp, char *name, | |||
317 | } | 317 | } |
318 | brcmf_dbg(FIL, "bssidx=%d, name=%s, len=%d\n", ifp->bssidx, name, len); | 318 | brcmf_dbg(FIL, "bssidx=%d, name=%s, len=%d\n", ifp->bssidx, name, len); |
319 | brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, | 319 | brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data, |
320 | min_t(uint, len, MAX_HEX_DUMP_LEN), "data"); | 320 | min_t(uint, len, MAX_HEX_DUMP_LEN), "data\n"); |
321 | 321 | ||
322 | mutex_unlock(&drvr->proto_block); | 322 | mutex_unlock(&drvr->proto_block); |
323 | return err; | 323 | return err; |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c index e9bdfdb95d8f..7918c1033662 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c | |||
@@ -838,7 +838,7 @@ static void brcmf_fws_cleanup(struct brcmf_fws_info *fws, int ifidx) | |||
838 | brcmf_fws_hanger_cleanup(fws, matchfn, ifidx); | 838 | brcmf_fws_hanger_cleanup(fws, matchfn, ifidx); |
839 | } | 839 | } |
840 | 840 | ||
841 | static int brcmf_fws_hdrpush(struct brcmf_fws_info *fws, struct sk_buff *skb) | 841 | static u8 brcmf_fws_hdrpush(struct brcmf_fws_info *fws, struct sk_buff *skb) |
842 | { | 842 | { |
843 | struct brcmf_fws_mac_descriptor *entry = brcmf_skbcb(skb)->mac; | 843 | struct brcmf_fws_mac_descriptor *entry = brcmf_skbcb(skb)->mac; |
844 | u8 *wlh; | 844 | u8 *wlh; |
@@ -887,9 +887,7 @@ static int brcmf_fws_hdrpush(struct brcmf_fws_info *fws, struct sk_buff *skb) | |||
887 | if (fillers) | 887 | if (fillers) |
888 | memset(wlh, BRCMF_FWS_TYPE_FILLER, fillers); | 888 | memset(wlh, BRCMF_FWS_TYPE_FILLER, fillers); |
889 | 889 | ||
890 | brcmf_proto_hdrpush(fws->drvr, brcmf_skb_if_flags_get_field(skb, INDEX), | 890 | return (u8)(data_offset >> 2); |
891 | data_offset >> 2, skb); | ||
892 | return 0; | ||
893 | } | 891 | } |
894 | 892 | ||
895 | static bool brcmf_fws_tim_update(struct brcmf_fws_info *fws, | 893 | static bool brcmf_fws_tim_update(struct brcmf_fws_info *fws, |
@@ -897,10 +895,11 @@ static bool brcmf_fws_tim_update(struct brcmf_fws_info *fws, | |||
897 | int fifo, bool send_immediately) | 895 | int fifo, bool send_immediately) |
898 | { | 896 | { |
899 | struct sk_buff *skb; | 897 | struct sk_buff *skb; |
900 | struct brcmf_bus *bus; | ||
901 | struct brcmf_skbuff_cb *skcb; | 898 | struct brcmf_skbuff_cb *skcb; |
902 | s32 err; | 899 | s32 err; |
903 | u32 len; | 900 | u32 len; |
901 | u8 data_offset; | ||
902 | int ifidx; | ||
904 | 903 | ||
905 | /* check delayedQ and suppressQ in one call using bitmap */ | 904 | /* check delayedQ and suppressQ in one call using bitmap */ |
906 | if (brcmu_pktq_mlen(&entry->psq, 3 << (fifo * 2)) == 0) | 905 | if (brcmu_pktq_mlen(&entry->psq, 3 << (fifo * 2)) == 0) |
@@ -928,13 +927,11 @@ static bool brcmf_fws_tim_update(struct brcmf_fws_info *fws, | |||
928 | skcb->state = BRCMF_FWS_SKBSTATE_TIM; | 927 | skcb->state = BRCMF_FWS_SKBSTATE_TIM; |
929 | skcb->htod = 0; | 928 | skcb->htod = 0; |
930 | skcb->htod_seq = 0; | 929 | skcb->htod_seq = 0; |
931 | bus = fws->drvr->bus_if; | 930 | data_offset = brcmf_fws_hdrpush(fws, skb); |
932 | err = brcmf_fws_hdrpush(fws, skb); | 931 | ifidx = brcmf_skb_if_flags_get_field(skb, INDEX); |
933 | if (err == 0) { | 932 | brcmf_fws_unlock(fws); |
934 | brcmf_fws_unlock(fws); | 933 | err = brcmf_proto_txdata(fws->drvr, ifidx, data_offset, skb); |
935 | err = brcmf_bus_txdata(bus, skb); | 934 | brcmf_fws_lock(fws); |
936 | brcmf_fws_lock(fws); | ||
937 | } | ||
938 | if (err) | 935 | if (err) |
939 | brcmu_pkt_buf_free_skb(skb); | 936 | brcmu_pkt_buf_free_skb(skb); |
940 | return true; | 937 | return true; |
@@ -1393,7 +1390,7 @@ static int brcmf_fws_txstatus_suppressed(struct brcmf_fws_info *fws, int fifo, | |||
1393 | entry->generation = genbit; | 1390 | entry->generation = genbit; |
1394 | 1391 | ||
1395 | ret = brcmf_proto_hdrpull(fws->drvr, false, &ifidx, skb); | 1392 | ret = brcmf_proto_hdrpull(fws->drvr, false, &ifidx, skb); |
1396 | if (ret == 0) | 1393 | if (ret == 0) { |
1397 | brcmf_skb_htod_tag_set_field(skb, GENERATION, genbit); | 1394 | brcmf_skb_htod_tag_set_field(skb, GENERATION, genbit); |
1398 | brcmf_skbcb(skb)->htod_seq = seq; | 1395 | brcmf_skbcb(skb)->htod_seq = seq; |
1399 | if (brcmf_skb_htod_seq_get_field(skb, FROMFW)) { | 1396 | if (brcmf_skb_htod_seq_get_field(skb, FROMFW)) { |
@@ -1404,6 +1401,8 @@ static int brcmf_fws_txstatus_suppressed(struct brcmf_fws_info *fws, int fifo, | |||
1404 | } | 1401 | } |
1405 | ret = brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_SUPPRESSED, fifo, | 1402 | ret = brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_SUPPRESSED, fifo, |
1406 | skb); | 1403 | skb); |
1404 | } | ||
1405 | |||
1407 | if (ret != 0) { | 1406 | if (ret != 0) { |
1408 | /* suppress q is full or hdrpull failed, drop this packet */ | 1407 | /* suppress q is full or hdrpull failed, drop this packet */ |
1409 | brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb, | 1408 | brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb, |
@@ -1717,7 +1716,7 @@ int brcmf_fws_hdrpull(struct brcmf_pub *drvr, int ifidx, s16 signal_len, | |||
1717 | return 0; | 1716 | return 0; |
1718 | } | 1717 | } |
1719 | 1718 | ||
1720 | static void brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo, | 1719 | static u8 brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo, |
1721 | struct sk_buff *p) | 1720 | struct sk_buff *p) |
1722 | { | 1721 | { |
1723 | struct brcmf_skbuff_cb *skcb = brcmf_skbcb(p); | 1722 | struct brcmf_skbuff_cb *skcb = brcmf_skbcb(p); |
@@ -1735,7 +1734,7 @@ static void brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo, | |||
1735 | flags |= BRCMF_FWS_HTOD_FLAG_PKT_REQUESTED; | 1734 | flags |= BRCMF_FWS_HTOD_FLAG_PKT_REQUESTED; |
1736 | } | 1735 | } |
1737 | brcmf_skb_htod_tag_set_field(p, FLAGS, flags); | 1736 | brcmf_skb_htod_tag_set_field(p, FLAGS, flags); |
1738 | brcmf_fws_hdrpush(fws, p); | 1737 | return brcmf_fws_hdrpush(fws, p); |
1739 | } | 1738 | } |
1740 | 1739 | ||
1741 | static void brcmf_fws_rollback_toq(struct brcmf_fws_info *fws, | 1740 | static void brcmf_fws_rollback_toq(struct brcmf_fws_info *fws, |
@@ -1803,20 +1802,21 @@ static int brcmf_fws_commit_skb(struct brcmf_fws_info *fws, int fifo, | |||
1803 | { | 1802 | { |
1804 | struct brcmf_skbuff_cb *skcb = brcmf_skbcb(skb); | 1803 | struct brcmf_skbuff_cb *skcb = brcmf_skbcb(skb); |
1805 | struct brcmf_fws_mac_descriptor *entry; | 1804 | struct brcmf_fws_mac_descriptor *entry; |
1806 | struct brcmf_bus *bus = fws->drvr->bus_if; | ||
1807 | int rc; | 1805 | int rc; |
1808 | u8 ifidx; | 1806 | u8 ifidx; |
1807 | u8 data_offset; | ||
1809 | 1808 | ||
1810 | entry = skcb->mac; | 1809 | entry = skcb->mac; |
1811 | if (IS_ERR(entry)) | 1810 | if (IS_ERR(entry)) |
1812 | return PTR_ERR(entry); | 1811 | return PTR_ERR(entry); |
1813 | 1812 | ||
1814 | brcmf_fws_precommit_skb(fws, fifo, skb); | 1813 | data_offset = brcmf_fws_precommit_skb(fws, fifo, skb); |
1815 | entry->transit_count++; | 1814 | entry->transit_count++; |
1816 | if (entry->suppressed) | 1815 | if (entry->suppressed) |
1817 | entry->suppr_transit_count++; | 1816 | entry->suppr_transit_count++; |
1817 | ifidx = brcmf_skb_if_flags_get_field(skb, INDEX); | ||
1818 | brcmf_fws_unlock(fws); | 1818 | brcmf_fws_unlock(fws); |
1819 | rc = brcmf_bus_txdata(bus, skb); | 1819 | rc = brcmf_proto_txdata(fws->drvr, ifidx, data_offset, skb); |
1820 | brcmf_fws_lock(fws); | 1820 | brcmf_fws_lock(fws); |
1821 | brcmf_dbg(DATA, "%s flags %X htod %X bus_tx %d\n", entry->name, | 1821 | brcmf_dbg(DATA, "%s flags %X htod %X bus_tx %d\n", entry->name, |
1822 | skcb->if_flags, skcb->htod, rc); | 1822 | skcb->if_flags, skcb->htod, rc); |
@@ -1977,10 +1977,9 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker) | |||
1977 | &skb, true); | 1977 | &skb, true); |
1978 | ifidx = brcmf_skb_if_flags_get_field(skb, | 1978 | ifidx = brcmf_skb_if_flags_get_field(skb, |
1979 | INDEX); | 1979 | INDEX); |
1980 | brcmf_proto_hdrpush(drvr, ifidx, 0, skb); | 1980 | /* Use proto layer to send data frame */ |
1981 | /* Use bus module to send data frame */ | ||
1982 | brcmf_fws_unlock(fws); | 1981 | brcmf_fws_unlock(fws); |
1983 | ret = brcmf_bus_txdata(drvr->bus_if, skb); | 1982 | ret = brcmf_proto_txdata(drvr, ifidx, 0, skb); |
1984 | brcmf_fws_lock(fws); | 1983 | brcmf_fws_lock(fws); |
1985 | if (ret < 0) | 1984 | if (ret < 0) |
1986 | brcmf_txfinalize(drvr, skb, false); | 1985 | brcmf_txfinalize(drvr, skb, false); |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/proto.c b/drivers/net/wireless/brcm80211/brcmfmac/proto.c index 87eb2bd4c072..b6b464184946 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/proto.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/proto.c | |||
@@ -39,7 +39,7 @@ int brcmf_proto_attach(struct brcmf_pub *drvr) | |||
39 | if (brcmf_proto_bcdc_attach(drvr)) | 39 | if (brcmf_proto_bcdc_attach(drvr)) |
40 | goto fail; | 40 | goto fail; |
41 | 41 | ||
42 | if ((proto->hdrpush == NULL) || (proto->hdrpull == NULL) || | 42 | if ((proto->txdata == NULL) || (proto->hdrpull == NULL) || |
43 | (proto->query_dcmd == NULL) || (proto->set_dcmd == NULL)) { | 43 | (proto->query_dcmd == NULL) || (proto->set_dcmd == NULL)) { |
44 | brcmf_err("Not all proto handlers have been installed\n"); | 44 | brcmf_err("Not all proto handlers have been installed\n"); |
45 | goto fail; | 45 | goto fail; |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/proto.h b/drivers/net/wireless/brcm80211/brcmfmac/proto.h index 8de1b3bce228..482fb0ba4a30 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/proto.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/proto.h | |||
@@ -17,14 +17,14 @@ | |||
17 | #define BRCMFMAC_PROTO_H | 17 | #define BRCMFMAC_PROTO_H |
18 | 18 | ||
19 | struct brcmf_proto { | 19 | struct brcmf_proto { |
20 | void (*hdrpush)(struct brcmf_pub *drvr, int ifidx, u8 offset, | ||
21 | struct sk_buff *skb); | ||
22 | int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws, u8 *ifidx, | 20 | int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws, u8 *ifidx, |
23 | struct sk_buff *skb); | 21 | struct sk_buff *skb); |
24 | int (*query_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, | 22 | int (*query_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, |
25 | void *buf, uint len); | 23 | void *buf, uint len); |
26 | int (*set_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf, | 24 | int (*set_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf, |
27 | uint len); | 25 | uint len); |
26 | int (*txdata)(struct brcmf_pub *drvr, int ifidx, u8 offset, | ||
27 | struct sk_buff *skb); | ||
28 | void *pd; | 28 | void *pd; |
29 | }; | 29 | }; |
30 | 30 | ||
@@ -32,11 +32,6 @@ struct brcmf_proto { | |||
32 | int brcmf_proto_attach(struct brcmf_pub *drvr); | 32 | int brcmf_proto_attach(struct brcmf_pub *drvr); |
33 | void brcmf_proto_detach(struct brcmf_pub *drvr); | 33 | void brcmf_proto_detach(struct brcmf_pub *drvr); |
34 | 34 | ||
35 | static inline void brcmf_proto_hdrpush(struct brcmf_pub *drvr, int ifidx, | ||
36 | u8 offset, struct sk_buff *skb) | ||
37 | { | ||
38 | drvr->proto->hdrpush(drvr, ifidx, offset, skb); | ||
39 | } | ||
40 | static inline int brcmf_proto_hdrpull(struct brcmf_pub *drvr, bool do_fws, | 35 | static inline int brcmf_proto_hdrpull(struct brcmf_pub *drvr, bool do_fws, |
41 | u8 *ifidx, struct sk_buff *skb) | 36 | u8 *ifidx, struct sk_buff *skb) |
42 | { | 37 | { |
@@ -52,6 +47,11 @@ static inline int brcmf_proto_set_dcmd(struct brcmf_pub *drvr, int ifidx, | |||
52 | { | 47 | { |
53 | return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len); | 48 | return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len); |
54 | } | 49 | } |
50 | static inline int brcmf_proto_txdata(struct brcmf_pub *drvr, int ifidx, | ||
51 | u8 offset, struct sk_buff *skb) | ||
52 | { | ||
53 | return drvr->proto->txdata(drvr, ifidx, offset, skb); | ||
54 | } | ||
55 | 55 | ||
56 | 56 | ||
57 | #endif /* BRCMFMAC_PROTO_H */ | 57 | #endif /* BRCMFMAC_PROTO_H */ |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c index 2096a14ef1fb..5f39f28e6efb 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c | |||
@@ -112,9 +112,9 @@ brcmf_sdio_sb_corerev(struct brcmf_sdio_dev *sdiodev, | |||
112 | 112 | ||
113 | idx = brcmf_sdio_chip_getinfidx(ci, coreid); | 113 | idx = brcmf_sdio_chip_getinfidx(ci, coreid); |
114 | 114 | ||
115 | regdata = brcmf_sdio_regrl(sdiodev, | 115 | regdata = brcmf_sdiod_regrl(sdiodev, |
116 | CORE_SB(ci->c_inf[idx].base, sbidhigh), | 116 | CORE_SB(ci->c_inf[idx].base, sbidhigh), |
117 | NULL); | 117 | NULL); |
118 | return SBCOREREV(regdata); | 118 | return SBCOREREV(regdata); |
119 | } | 119 | } |
120 | 120 | ||
@@ -140,9 +140,9 @@ brcmf_sdio_sb_iscoreup(struct brcmf_sdio_dev *sdiodev, | |||
140 | if (idx == BRCMF_MAX_CORENUM) | 140 | if (idx == BRCMF_MAX_CORENUM) |
141 | return false; | 141 | return false; |
142 | 142 | ||
143 | regdata = brcmf_sdio_regrl(sdiodev, | 143 | regdata = brcmf_sdiod_regrl(sdiodev, |
144 | CORE_SB(ci->c_inf[idx].base, sbtmstatelow), | 144 | CORE_SB(ci->c_inf[idx].base, sbtmstatelow), |
145 | NULL); | 145 | NULL); |
146 | regdata &= (SSB_TMSLOW_RESET | SSB_TMSLOW_REJECT | | 146 | regdata &= (SSB_TMSLOW_RESET | SSB_TMSLOW_REJECT | |
147 | SSB_IMSTATE_REJECT | SSB_TMSLOW_CLOCK); | 147 | SSB_IMSTATE_REJECT | SSB_TMSLOW_CLOCK); |
148 | return (SSB_TMSLOW_CLOCK == regdata); | 148 | return (SSB_TMSLOW_CLOCK == regdata); |
@@ -160,13 +160,13 @@ brcmf_sdio_ai_iscoreup(struct brcmf_sdio_dev *sdiodev, | |||
160 | if (idx == BRCMF_MAX_CORENUM) | 160 | if (idx == BRCMF_MAX_CORENUM) |
161 | return false; | 161 | return false; |
162 | 162 | ||
163 | regdata = brcmf_sdio_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, | 163 | regdata = brcmf_sdiod_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, |
164 | NULL); | 164 | NULL); |
165 | ret = (regdata & (BCMA_IOCTL_FGC | BCMA_IOCTL_CLK)) == BCMA_IOCTL_CLK; | 165 | ret = (regdata & (BCMA_IOCTL_FGC | BCMA_IOCTL_CLK)) == BCMA_IOCTL_CLK; |
166 | 166 | ||
167 | regdata = brcmf_sdio_regrl(sdiodev, | 167 | regdata = brcmf_sdiod_regrl(sdiodev, |
168 | ci->c_inf[idx].wrapbase+BCMA_RESET_CTL, | 168 | ci->c_inf[idx].wrapbase+BCMA_RESET_CTL, |
169 | NULL); | 169 | NULL); |
170 | ret = ret && ((regdata & BCMA_RESET_CTL_RESET) == 0); | 170 | ret = ret && ((regdata & BCMA_RESET_CTL_RESET) == 0); |
171 | 171 | ||
172 | return ret; | 172 | return ret; |
@@ -182,79 +182,79 @@ brcmf_sdio_sb_coredisable(struct brcmf_sdio_dev *sdiodev, | |||
182 | idx = brcmf_sdio_chip_getinfidx(ci, coreid); | 182 | idx = brcmf_sdio_chip_getinfidx(ci, coreid); |
183 | base = ci->c_inf[idx].base; | 183 | base = ci->c_inf[idx].base; |
184 | 184 | ||
185 | regdata = brcmf_sdio_regrl(sdiodev, CORE_SB(base, sbtmstatelow), NULL); | 185 | regdata = brcmf_sdiod_regrl(sdiodev, CORE_SB(base, sbtmstatelow), NULL); |
186 | if (regdata & SSB_TMSLOW_RESET) | 186 | if (regdata & SSB_TMSLOW_RESET) |
187 | return; | 187 | return; |
188 | 188 | ||
189 | regdata = brcmf_sdio_regrl(sdiodev, CORE_SB(base, sbtmstatelow), NULL); | 189 | regdata = brcmf_sdiod_regrl(sdiodev, CORE_SB(base, sbtmstatelow), NULL); |
190 | if ((regdata & SSB_TMSLOW_CLOCK) != 0) { | 190 | if ((regdata & SSB_TMSLOW_CLOCK) != 0) { |
191 | /* | 191 | /* |
192 | * set target reject and spin until busy is clear | 192 | * set target reject and spin until busy is clear |
193 | * (preserve core-specific bits) | 193 | * (preserve core-specific bits) |
194 | */ | 194 | */ |
195 | regdata = brcmf_sdio_regrl(sdiodev, CORE_SB(base, sbtmstatelow), | 195 | regdata = brcmf_sdiod_regrl(sdiodev, |
196 | NULL); | 196 | CORE_SB(base, sbtmstatelow), NULL); |
197 | brcmf_sdio_regwl(sdiodev, CORE_SB(base, sbtmstatelow), | 197 | brcmf_sdiod_regwl(sdiodev, CORE_SB(base, sbtmstatelow), |
198 | regdata | SSB_TMSLOW_REJECT, NULL); | 198 | regdata | SSB_TMSLOW_REJECT, NULL); |
199 | 199 | ||
200 | regdata = brcmf_sdio_regrl(sdiodev, CORE_SB(base, sbtmstatelow), | 200 | regdata = brcmf_sdiod_regrl(sdiodev, |
201 | NULL); | 201 | CORE_SB(base, sbtmstatelow), NULL); |
202 | udelay(1); | 202 | udelay(1); |
203 | SPINWAIT((brcmf_sdio_regrl(sdiodev, | 203 | SPINWAIT((brcmf_sdiod_regrl(sdiodev, |
204 | CORE_SB(base, sbtmstatehigh), | 204 | CORE_SB(base, sbtmstatehigh), |
205 | NULL) & | 205 | NULL) & |
206 | SSB_TMSHIGH_BUSY), 100000); | 206 | SSB_TMSHIGH_BUSY), 100000); |
207 | 207 | ||
208 | regdata = brcmf_sdio_regrl(sdiodev, | 208 | regdata = brcmf_sdiod_regrl(sdiodev, |
209 | CORE_SB(base, sbtmstatehigh), | 209 | CORE_SB(base, sbtmstatehigh), |
210 | NULL); | 210 | NULL); |
211 | if (regdata & SSB_TMSHIGH_BUSY) | 211 | if (regdata & SSB_TMSHIGH_BUSY) |
212 | brcmf_err("core state still busy\n"); | 212 | brcmf_err("core state still busy\n"); |
213 | 213 | ||
214 | regdata = brcmf_sdio_regrl(sdiodev, CORE_SB(base, sbidlow), | 214 | regdata = brcmf_sdiod_regrl(sdiodev, CORE_SB(base, sbidlow), |
215 | NULL); | 215 | NULL); |
216 | if (regdata & SSB_IDLOW_INITIATOR) { | 216 | if (regdata & SSB_IDLOW_INITIATOR) { |
217 | regdata = brcmf_sdio_regrl(sdiodev, | 217 | regdata = brcmf_sdiod_regrl(sdiodev, |
218 | CORE_SB(base, sbimstate), | 218 | CORE_SB(base, sbimstate), |
219 | NULL); | 219 | NULL); |
220 | regdata |= SSB_IMSTATE_REJECT; | 220 | regdata |= SSB_IMSTATE_REJECT; |
221 | brcmf_sdio_regwl(sdiodev, CORE_SB(base, sbimstate), | 221 | brcmf_sdiod_regwl(sdiodev, CORE_SB(base, sbimstate), |
222 | regdata, NULL); | 222 | regdata, NULL); |
223 | regdata = brcmf_sdio_regrl(sdiodev, | 223 | regdata = brcmf_sdiod_regrl(sdiodev, |
224 | CORE_SB(base, sbimstate), | 224 | CORE_SB(base, sbimstate), |
225 | NULL); | 225 | NULL); |
226 | udelay(1); | 226 | udelay(1); |
227 | SPINWAIT((brcmf_sdio_regrl(sdiodev, | 227 | SPINWAIT((brcmf_sdiod_regrl(sdiodev, |
228 | CORE_SB(base, sbimstate), | 228 | CORE_SB(base, sbimstate), |
229 | NULL) & | 229 | NULL) & |
230 | SSB_IMSTATE_BUSY), 100000); | 230 | SSB_IMSTATE_BUSY), 100000); |
231 | } | 231 | } |
232 | 232 | ||
233 | /* set reset and reject while enabling the clocks */ | 233 | /* set reset and reject while enabling the clocks */ |
234 | regdata = SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK | | 234 | regdata = SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK | |
235 | SSB_TMSLOW_REJECT | SSB_TMSLOW_RESET; | 235 | SSB_TMSLOW_REJECT | SSB_TMSLOW_RESET; |
236 | brcmf_sdio_regwl(sdiodev, CORE_SB(base, sbtmstatelow), | 236 | brcmf_sdiod_regwl(sdiodev, CORE_SB(base, sbtmstatelow), |
237 | regdata, NULL); | 237 | regdata, NULL); |
238 | regdata = brcmf_sdio_regrl(sdiodev, CORE_SB(base, sbtmstatelow), | 238 | regdata = brcmf_sdiod_regrl(sdiodev, |
239 | NULL); | 239 | CORE_SB(base, sbtmstatelow), NULL); |
240 | udelay(10); | 240 | udelay(10); |
241 | 241 | ||
242 | /* clear the initiator reject bit */ | 242 | /* clear the initiator reject bit */ |
243 | regdata = brcmf_sdio_regrl(sdiodev, CORE_SB(base, sbidlow), | 243 | regdata = brcmf_sdiod_regrl(sdiodev, CORE_SB(base, sbidlow), |
244 | NULL); | 244 | NULL); |
245 | if (regdata & SSB_IDLOW_INITIATOR) { | 245 | if (regdata & SSB_IDLOW_INITIATOR) { |
246 | regdata = brcmf_sdio_regrl(sdiodev, | 246 | regdata = brcmf_sdiod_regrl(sdiodev, |
247 | CORE_SB(base, sbimstate), | 247 | CORE_SB(base, sbimstate), |
248 | NULL); | 248 | NULL); |
249 | regdata &= ~SSB_IMSTATE_REJECT; | 249 | regdata &= ~SSB_IMSTATE_REJECT; |
250 | brcmf_sdio_regwl(sdiodev, CORE_SB(base, sbimstate), | 250 | brcmf_sdiod_regwl(sdiodev, CORE_SB(base, sbimstate), |
251 | regdata, NULL); | 251 | regdata, NULL); |
252 | } | 252 | } |
253 | } | 253 | } |
254 | 254 | ||
255 | /* leave reset and reject asserted */ | 255 | /* leave reset and reject asserted */ |
256 | brcmf_sdio_regwl(sdiodev, CORE_SB(base, sbtmstatelow), | 256 | brcmf_sdiod_regwl(sdiodev, CORE_SB(base, sbtmstatelow), |
257 | (SSB_TMSLOW_REJECT | SSB_TMSLOW_RESET), NULL); | 257 | (SSB_TMSLOW_REJECT | SSB_TMSLOW_RESET), NULL); |
258 | udelay(1); | 258 | udelay(1); |
259 | } | 259 | } |
260 | 260 | ||
@@ -270,9 +270,9 @@ brcmf_sdio_ai_coredisable(struct brcmf_sdio_dev *sdiodev, | |||
270 | return; | 270 | return; |
271 | 271 | ||
272 | /* if core is already in reset, just return */ | 272 | /* if core is already in reset, just return */ |
273 | regdata = brcmf_sdio_regrl(sdiodev, | 273 | regdata = brcmf_sdiod_regrl(sdiodev, |
274 | ci->c_inf[idx].wrapbase+BCMA_RESET_CTL, | 274 | ci->c_inf[idx].wrapbase+BCMA_RESET_CTL, |
275 | NULL); | 275 | NULL); |
276 | if ((regdata & BCMA_RESET_CTL_RESET) != 0) | 276 | if ((regdata & BCMA_RESET_CTL_RESET) != 0) |
277 | return; | 277 | return; |
278 | 278 | ||
@@ -281,24 +281,24 @@ brcmf_sdio_ai_coredisable(struct brcmf_sdio_dev *sdiodev, | |||
281 | * extra 10ms is taken into account for firmware load stage | 281 | * extra 10ms is taken into account for firmware load stage |
282 | * after 10300us carry on disabling the core anyway | 282 | * after 10300us carry on disabling the core anyway |
283 | */ | 283 | */ |
284 | SPINWAIT(brcmf_sdio_regrl(sdiodev, | 284 | SPINWAIT(brcmf_sdiod_regrl(sdiodev, |
285 | ci->c_inf[idx].wrapbase+BCMA_RESET_ST, | ||
286 | NULL), 10300); | ||
287 | regdata = brcmf_sdio_regrl(sdiodev, | ||
288 | ci->c_inf[idx].wrapbase+BCMA_RESET_ST, | 285 | ci->c_inf[idx].wrapbase+BCMA_RESET_ST, |
289 | NULL); | 286 | NULL), 10300); |
287 | regdata = brcmf_sdiod_regrl(sdiodev, | ||
288 | ci->c_inf[idx].wrapbase+BCMA_RESET_ST, | ||
289 | NULL); | ||
290 | if (regdata) | 290 | if (regdata) |
291 | brcmf_err("disabling core 0x%x with reset status %x\n", | 291 | brcmf_err("disabling core 0x%x with reset status %x\n", |
292 | coreid, regdata); | 292 | coreid, regdata); |
293 | 293 | ||
294 | brcmf_sdio_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_RESET_CTL, | 294 | brcmf_sdiod_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_RESET_CTL, |
295 | BCMA_RESET_CTL_RESET, NULL); | 295 | BCMA_RESET_CTL_RESET, NULL); |
296 | udelay(1); | 296 | udelay(1); |
297 | 297 | ||
298 | brcmf_sdio_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, | 298 | brcmf_sdiod_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, |
299 | core_bits, NULL); | 299 | core_bits, NULL); |
300 | regdata = brcmf_sdio_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, | 300 | regdata = brcmf_sdiod_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, |
301 | NULL); | 301 | NULL); |
302 | usleep_range(10, 20); | 302 | usleep_range(10, 20); |
303 | 303 | ||
304 | } | 304 | } |
@@ -325,47 +325,47 @@ brcmf_sdio_sb_resetcore(struct brcmf_sdio_dev *sdiodev, | |||
325 | * set reset while enabling the clock and | 325 | * set reset while enabling the clock and |
326 | * forcing them on throughout the core | 326 | * forcing them on throughout the core |
327 | */ | 327 | */ |
328 | brcmf_sdio_regwl(sdiodev, | 328 | brcmf_sdiod_regwl(sdiodev, |
329 | CORE_SB(ci->c_inf[idx].base, sbtmstatelow), | 329 | CORE_SB(ci->c_inf[idx].base, sbtmstatelow), |
330 | SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK | SSB_TMSLOW_RESET, | 330 | SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK | SSB_TMSLOW_RESET, |
331 | NULL); | 331 | NULL); |
332 | regdata = brcmf_sdio_regrl(sdiodev, | 332 | regdata = brcmf_sdiod_regrl(sdiodev, |
333 | CORE_SB(ci->c_inf[idx].base, sbtmstatelow), | 333 | CORE_SB(ci->c_inf[idx].base, sbtmstatelow), |
334 | NULL); | 334 | NULL); |
335 | udelay(1); | 335 | udelay(1); |
336 | 336 | ||
337 | /* clear any serror */ | 337 | /* clear any serror */ |
338 | regdata = brcmf_sdio_regrl(sdiodev, | 338 | regdata = brcmf_sdiod_regrl(sdiodev, |
339 | CORE_SB(ci->c_inf[idx].base, sbtmstatehigh), | 339 | CORE_SB(ci->c_inf[idx].base, sbtmstatehigh), |
340 | NULL); | 340 | NULL); |
341 | if (regdata & SSB_TMSHIGH_SERR) | 341 | if (regdata & SSB_TMSHIGH_SERR) |
342 | brcmf_sdio_regwl(sdiodev, | 342 | brcmf_sdiod_regwl(sdiodev, |
343 | CORE_SB(ci->c_inf[idx].base, sbtmstatehigh), | 343 | CORE_SB(ci->c_inf[idx].base, sbtmstatehigh), |
344 | 0, NULL); | 344 | 0, NULL); |
345 | 345 | ||
346 | regdata = brcmf_sdio_regrl(sdiodev, | 346 | regdata = brcmf_sdiod_regrl(sdiodev, |
347 | CORE_SB(ci->c_inf[idx].base, sbimstate), | 347 | CORE_SB(ci->c_inf[idx].base, sbimstate), |
348 | NULL); | 348 | NULL); |
349 | if (regdata & (SSB_IMSTATE_IBE | SSB_IMSTATE_TO)) | 349 | if (regdata & (SSB_IMSTATE_IBE | SSB_IMSTATE_TO)) |
350 | brcmf_sdio_regwl(sdiodev, | 350 | brcmf_sdiod_regwl(sdiodev, |
351 | CORE_SB(ci->c_inf[idx].base, sbimstate), | 351 | CORE_SB(ci->c_inf[idx].base, sbimstate), |
352 | regdata & ~(SSB_IMSTATE_IBE | SSB_IMSTATE_TO), | 352 | regdata & ~(SSB_IMSTATE_IBE | SSB_IMSTATE_TO), |
353 | NULL); | 353 | NULL); |
354 | 354 | ||
355 | /* clear reset and allow it to propagate throughout the core */ | 355 | /* clear reset and allow it to propagate throughout the core */ |
356 | brcmf_sdio_regwl(sdiodev, CORE_SB(ci->c_inf[idx].base, sbtmstatelow), | 356 | brcmf_sdiod_regwl(sdiodev, CORE_SB(ci->c_inf[idx].base, sbtmstatelow), |
357 | SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK, NULL); | 357 | SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK, NULL); |
358 | regdata = brcmf_sdio_regrl(sdiodev, | 358 | regdata = brcmf_sdiod_regrl(sdiodev, |
359 | CORE_SB(ci->c_inf[idx].base, sbtmstatelow), | 359 | CORE_SB(ci->c_inf[idx].base, sbtmstatelow), |
360 | NULL); | 360 | NULL); |
361 | udelay(1); | 361 | udelay(1); |
362 | 362 | ||
363 | /* leave clock enabled */ | 363 | /* leave clock enabled */ |
364 | brcmf_sdio_regwl(sdiodev, CORE_SB(ci->c_inf[idx].base, sbtmstatelow), | 364 | brcmf_sdiod_regwl(sdiodev, CORE_SB(ci->c_inf[idx].base, sbtmstatelow), |
365 | SSB_TMSLOW_CLOCK, NULL); | 365 | SSB_TMSLOW_CLOCK, NULL); |
366 | regdata = brcmf_sdio_regrl(sdiodev, | 366 | regdata = brcmf_sdiod_regrl(sdiodev, |
367 | CORE_SB(ci->c_inf[idx].base, sbtmstatelow), | 367 | CORE_SB(ci->c_inf[idx].base, sbtmstatelow), |
368 | NULL); | 368 | NULL); |
369 | udelay(1); | 369 | udelay(1); |
370 | } | 370 | } |
371 | 371 | ||
@@ -384,21 +384,21 @@ brcmf_sdio_ai_resetcore(struct brcmf_sdio_dev *sdiodev, | |||
384 | brcmf_sdio_ai_coredisable(sdiodev, ci, coreid, core_bits); | 384 | brcmf_sdio_ai_coredisable(sdiodev, ci, coreid, core_bits); |
385 | 385 | ||
386 | /* now do initialization sequence */ | 386 | /* now do initialization sequence */ |
387 | brcmf_sdio_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, | 387 | brcmf_sdiod_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, |
388 | core_bits | BCMA_IOCTL_FGC | BCMA_IOCTL_CLK, NULL); | 388 | core_bits | BCMA_IOCTL_FGC | BCMA_IOCTL_CLK, NULL); |
389 | regdata = brcmf_sdio_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, | 389 | regdata = brcmf_sdiod_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, |
390 | NULL); | 390 | NULL); |
391 | brcmf_sdio_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_RESET_CTL, | 391 | brcmf_sdiod_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_RESET_CTL, |
392 | 0, NULL); | 392 | 0, NULL); |
393 | regdata = brcmf_sdio_regrl(sdiodev, | 393 | regdata = brcmf_sdiod_regrl(sdiodev, |
394 | ci->c_inf[idx].wrapbase+BCMA_RESET_CTL, | 394 | ci->c_inf[idx].wrapbase+BCMA_RESET_CTL, |
395 | NULL); | 395 | NULL); |
396 | udelay(1); | 396 | udelay(1); |
397 | 397 | ||
398 | brcmf_sdio_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, | 398 | brcmf_sdiod_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, |
399 | core_bits | BCMA_IOCTL_CLK, NULL); | 399 | core_bits | BCMA_IOCTL_CLK, NULL); |
400 | regdata = brcmf_sdio_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, | 400 | regdata = brcmf_sdiod_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, |
401 | NULL); | 401 | NULL); |
402 | udelay(1); | 402 | udelay(1); |
403 | } | 403 | } |
404 | 404 | ||
@@ -438,7 +438,7 @@ static inline int brcmf_sdio_chip_cichk(struct chip_info *ci) | |||
438 | #endif | 438 | #endif |
439 | 439 | ||
440 | static int brcmf_sdio_chip_recognition(struct brcmf_sdio_dev *sdiodev, | 440 | static int brcmf_sdio_chip_recognition(struct brcmf_sdio_dev *sdiodev, |
441 | struct chip_info *ci, u32 regs) | 441 | struct chip_info *ci) |
442 | { | 442 | { |
443 | u32 regdata; | 443 | u32 regdata; |
444 | int ret; | 444 | int ret; |
@@ -449,10 +449,10 @@ static int brcmf_sdio_chip_recognition(struct brcmf_sdio_dev *sdiodev, | |||
449 | * other ways of recognition should be added here. | 449 | * other ways of recognition should be added here. |
450 | */ | 450 | */ |
451 | ci->c_inf[0].id = BCMA_CORE_CHIPCOMMON; | 451 | ci->c_inf[0].id = BCMA_CORE_CHIPCOMMON; |
452 | ci->c_inf[0].base = regs; | 452 | ci->c_inf[0].base = SI_ENUM_BASE; |
453 | regdata = brcmf_sdio_regrl(sdiodev, | 453 | regdata = brcmf_sdiod_regrl(sdiodev, |
454 | CORE_CC_REG(ci->c_inf[0].base, chipid), | 454 | CORE_CC_REG(ci->c_inf[0].base, chipid), |
455 | NULL); | 455 | NULL); |
456 | ci->chip = regdata & CID_ID_MASK; | 456 | ci->chip = regdata & CID_ID_MASK; |
457 | ci->chiprev = (regdata & CID_REV_MASK) >> CID_REV_SHIFT; | 457 | ci->chiprev = (regdata & CID_REV_MASK) >> CID_REV_SHIFT; |
458 | if (sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 && | 458 | if (sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 && |
@@ -607,7 +607,7 @@ brcmf_sdio_chip_buscoreprep(struct brcmf_sdio_dev *sdiodev) | |||
607 | 607 | ||
608 | /* Try forcing SDIO core to do ALPAvail request only */ | 608 | /* Try forcing SDIO core to do ALPAvail request only */ |
609 | clkset = SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ; | 609 | clkset = SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ; |
610 | brcmf_sdio_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, clkset, &err); | 610 | brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, clkset, &err); |
611 | if (err) { | 611 | if (err) { |
612 | brcmf_err("error writing for HT off\n"); | 612 | brcmf_err("error writing for HT off\n"); |
613 | return err; | 613 | return err; |
@@ -615,8 +615,8 @@ brcmf_sdio_chip_buscoreprep(struct brcmf_sdio_dev *sdiodev) | |||
615 | 615 | ||
616 | /* If register supported, wait for ALPAvail and then force ALP */ | 616 | /* If register supported, wait for ALPAvail and then force ALP */ |
617 | /* This may take up to 15 milliseconds */ | 617 | /* This may take up to 15 milliseconds */ |
618 | clkval = brcmf_sdio_regrb(sdiodev, | 618 | clkval = brcmf_sdiod_regrb(sdiodev, |
619 | SBSDIO_FUNC1_CHIPCLKCSR, NULL); | 619 | SBSDIO_FUNC1_CHIPCLKCSR, NULL); |
620 | 620 | ||
621 | if ((clkval & ~SBSDIO_AVBITS) != clkset) { | 621 | if ((clkval & ~SBSDIO_AVBITS) != clkset) { |
622 | brcmf_err("ChipClkCSR access: wrote 0x%02x read 0x%02x\n", | 622 | brcmf_err("ChipClkCSR access: wrote 0x%02x read 0x%02x\n", |
@@ -624,8 +624,8 @@ brcmf_sdio_chip_buscoreprep(struct brcmf_sdio_dev *sdiodev) | |||
624 | return -EACCES; | 624 | return -EACCES; |
625 | } | 625 | } |
626 | 626 | ||
627 | SPINWAIT(((clkval = brcmf_sdio_regrb(sdiodev, | 627 | SPINWAIT(((clkval = brcmf_sdiod_regrb(sdiodev, |
628 | SBSDIO_FUNC1_CHIPCLKCSR, NULL)), | 628 | SBSDIO_FUNC1_CHIPCLKCSR, NULL)), |
629 | !SBSDIO_ALPAV(clkval)), | 629 | !SBSDIO_ALPAV(clkval)), |
630 | PMU_MAX_TRANSITION_DLY); | 630 | PMU_MAX_TRANSITION_DLY); |
631 | if (!SBSDIO_ALPAV(clkval)) { | 631 | if (!SBSDIO_ALPAV(clkval)) { |
@@ -635,11 +635,11 @@ brcmf_sdio_chip_buscoreprep(struct brcmf_sdio_dev *sdiodev) | |||
635 | } | 635 | } |
636 | 636 | ||
637 | clkset = SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_FORCE_ALP; | 637 | clkset = SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_FORCE_ALP; |
638 | brcmf_sdio_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, clkset, &err); | 638 | brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, clkset, &err); |
639 | udelay(65); | 639 | udelay(65); |
640 | 640 | ||
641 | /* Also, disable the extra SDIO pull-ups */ | 641 | /* Also, disable the extra SDIO pull-ups */ |
642 | brcmf_sdio_regwb(sdiodev, SBSDIO_FUNC1_SDIOPULLUP, 0, NULL); | 642 | brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SDIOPULLUP, 0, NULL); |
643 | 643 | ||
644 | return 0; | 644 | return 0; |
645 | } | 645 | } |
@@ -654,16 +654,16 @@ brcmf_sdio_chip_buscoresetup(struct brcmf_sdio_dev *sdiodev, | |||
654 | ci->c_inf[0].rev = ci->corerev(sdiodev, ci, ci->c_inf[0].id); | 654 | ci->c_inf[0].rev = ci->corerev(sdiodev, ci, ci->c_inf[0].id); |
655 | 655 | ||
656 | /* get chipcommon capabilites */ | 656 | /* get chipcommon capabilites */ |
657 | ci->c_inf[0].caps = brcmf_sdio_regrl(sdiodev, | 657 | ci->c_inf[0].caps = brcmf_sdiod_regrl(sdiodev, |
658 | CORE_CC_REG(base, capabilities), | 658 | CORE_CC_REG(base, capabilities), |
659 | NULL); | 659 | NULL); |
660 | 660 | ||
661 | /* get pmu caps & rev */ | 661 | /* get pmu caps & rev */ |
662 | if (ci->c_inf[0].caps & CC_CAP_PMU) { | 662 | if (ci->c_inf[0].caps & CC_CAP_PMU) { |
663 | ci->pmucaps = | 663 | ci->pmucaps = |
664 | brcmf_sdio_regrl(sdiodev, | 664 | brcmf_sdiod_regrl(sdiodev, |
665 | CORE_CC_REG(base, pmucapabilities), | 665 | CORE_CC_REG(base, pmucapabilities), |
666 | NULL); | 666 | NULL); |
667 | ci->pmurev = ci->pmucaps & PCAP_REV_MASK; | 667 | ci->pmurev = ci->pmucaps & PCAP_REV_MASK; |
668 | } | 668 | } |
669 | 669 | ||
@@ -681,7 +681,7 @@ brcmf_sdio_chip_buscoresetup(struct brcmf_sdio_dev *sdiodev, | |||
681 | } | 681 | } |
682 | 682 | ||
683 | int brcmf_sdio_chip_attach(struct brcmf_sdio_dev *sdiodev, | 683 | int brcmf_sdio_chip_attach(struct brcmf_sdio_dev *sdiodev, |
684 | struct chip_info **ci_ptr, u32 regs) | 684 | struct chip_info **ci_ptr) |
685 | { | 685 | { |
686 | int ret; | 686 | int ret; |
687 | struct chip_info *ci; | 687 | struct chip_info *ci; |
@@ -697,16 +697,16 @@ int brcmf_sdio_chip_attach(struct brcmf_sdio_dev *sdiodev, | |||
697 | if (ret != 0) | 697 | if (ret != 0) |
698 | goto err; | 698 | goto err; |
699 | 699 | ||
700 | ret = brcmf_sdio_chip_recognition(sdiodev, ci, regs); | 700 | ret = brcmf_sdio_chip_recognition(sdiodev, ci); |
701 | if (ret != 0) | 701 | if (ret != 0) |
702 | goto err; | 702 | goto err; |
703 | 703 | ||
704 | brcmf_sdio_chip_buscoresetup(sdiodev, ci); | 704 | brcmf_sdio_chip_buscoresetup(sdiodev, ci); |
705 | 705 | ||
706 | brcmf_sdio_regwl(sdiodev, CORE_CC_REG(ci->c_inf[0].base, gpiopullup), | 706 | brcmf_sdiod_regwl(sdiodev, CORE_CC_REG(ci->c_inf[0].base, gpiopullup), |
707 | 0, NULL); | 707 | 0, NULL); |
708 | brcmf_sdio_regwl(sdiodev, CORE_CC_REG(ci->c_inf[0].base, gpiopulldown), | 708 | brcmf_sdiod_regwl(sdiodev, CORE_CC_REG(ci->c_inf[0].base, gpiopulldown), |
709 | 0, NULL); | 709 | 0, NULL); |
710 | 710 | ||
711 | *ci_ptr = ci; | 711 | *ci_ptr = ci; |
712 | return 0; | 712 | return 0; |
@@ -784,12 +784,12 @@ brcmf_sdio_chip_drivestrengthinit(struct brcmf_sdio_dev *sdiodev, | |||
784 | } | 784 | } |
785 | } | 785 | } |
786 | addr = CORE_CC_REG(base, chipcontrol_addr); | 786 | addr = CORE_CC_REG(base, chipcontrol_addr); |
787 | brcmf_sdio_regwl(sdiodev, addr, 1, NULL); | 787 | brcmf_sdiod_regwl(sdiodev, addr, 1, NULL); |
788 | cc_data_temp = brcmf_sdio_regrl(sdiodev, addr, NULL); | 788 | cc_data_temp = brcmf_sdiod_regrl(sdiodev, addr, NULL); |
789 | cc_data_temp &= ~str_mask; | 789 | cc_data_temp &= ~str_mask; |
790 | drivestrength_sel <<= str_shift; | 790 | drivestrength_sel <<= str_shift; |
791 | cc_data_temp |= drivestrength_sel; | 791 | cc_data_temp |= drivestrength_sel; |
792 | brcmf_sdio_regwl(sdiodev, addr, cc_data_temp, NULL); | 792 | brcmf_sdiod_regwl(sdiodev, addr, cc_data_temp, NULL); |
793 | 793 | ||
794 | brcmf_dbg(INFO, "SDIO: %d mA (req=%d mA) drive strength selected, set to 0x%08x\n", | 794 | brcmf_dbg(INFO, "SDIO: %d mA (req=%d mA) drive strength selected, set to 0x%08x\n", |
795 | str_tab[i].strength, drivestrength, cc_data_temp); | 795 | str_tab[i].strength, drivestrength, cc_data_temp); |
@@ -816,8 +816,8 @@ brcmf_sdio_chip_verifynvram(struct brcmf_sdio_dev *sdiodev, u32 nvram_addr, | |||
816 | memset(nvram_ularray, 0xaa, nvram_sz); | 816 | memset(nvram_ularray, 0xaa, nvram_sz); |
817 | 817 | ||
818 | /* Read the vars list to temp buffer for comparison */ | 818 | /* Read the vars list to temp buffer for comparison */ |
819 | err = brcmf_sdio_ramrw(sdiodev, false, nvram_addr, nvram_ularray, | 819 | err = brcmf_sdiod_ramrw(sdiodev, false, nvram_addr, nvram_ularray, |
820 | nvram_sz); | 820 | nvram_sz); |
821 | if (err) { | 821 | if (err) { |
822 | brcmf_err("error %d on reading %d nvram bytes at 0x%08x\n", | 822 | brcmf_err("error %d on reading %d nvram bytes at 0x%08x\n", |
823 | err, nvram_sz, nvram_addr); | 823 | err, nvram_sz, nvram_addr); |
@@ -850,7 +850,7 @@ static bool brcmf_sdio_chip_writenvram(struct brcmf_sdio_dev *sdiodev, | |||
850 | nvram_addr = (ci->ramsize - 4) - nvram_sz + ci->rambase; | 850 | nvram_addr = (ci->ramsize - 4) - nvram_sz + ci->rambase; |
851 | 851 | ||
852 | /* Write the vars list */ | 852 | /* Write the vars list */ |
853 | err = brcmf_sdio_ramrw(sdiodev, true, nvram_addr, nvram_dat, nvram_sz); | 853 | err = brcmf_sdiod_ramrw(sdiodev, true, nvram_addr, nvram_dat, nvram_sz); |
854 | if (err) { | 854 | if (err) { |
855 | brcmf_err("error %d on writing %d nvram bytes at 0x%08x\n", | 855 | brcmf_err("error %d on writing %d nvram bytes at 0x%08x\n", |
856 | err, nvram_sz, nvram_addr); | 856 | err, nvram_sz, nvram_addr); |
@@ -874,8 +874,8 @@ static bool brcmf_sdio_chip_writenvram(struct brcmf_sdio_dev *sdiodev, | |||
874 | nvram_addr, nvram_sz, token); | 874 | nvram_addr, nvram_sz, token); |
875 | 875 | ||
876 | /* Write the length token to the last word */ | 876 | /* Write the length token to the last word */ |
877 | if (brcmf_sdio_ramrw(sdiodev, true, (ci->ramsize - 4 + ci->rambase), | 877 | if (brcmf_sdiod_ramrw(sdiodev, true, (ci->ramsize - 4 + ci->rambase), |
878 | (u8 *)&token_le, 4)) | 878 | (u8 *)&token_le, 4)) |
879 | return false; | 879 | return false; |
880 | 880 | ||
881 | return true; | 881 | return true; |
@@ -891,7 +891,7 @@ brcmf_sdio_chip_cm3_enterdl(struct brcmf_sdio_dev *sdiodev, | |||
891 | ci->resetcore(sdiodev, ci, BCMA_CORE_INTERNAL_MEM, 0); | 891 | ci->resetcore(sdiodev, ci, BCMA_CORE_INTERNAL_MEM, 0); |
892 | 892 | ||
893 | /* clear length token */ | 893 | /* clear length token */ |
894 | brcmf_sdio_ramrw(sdiodev, true, ci->ramsize - 4, (u8 *)&zeros, 4); | 894 | brcmf_sdiod_ramrw(sdiodev, true, ci->ramsize - 4, (u8 *)&zeros, 4); |
895 | } | 895 | } |
896 | 896 | ||
897 | static bool | 897 | static bool |
@@ -913,7 +913,7 @@ brcmf_sdio_chip_cm3_exitdl(struct brcmf_sdio_dev *sdiodev, struct chip_info *ci, | |||
913 | core_idx = brcmf_sdio_chip_getinfidx(ci, BCMA_CORE_SDIO_DEV); | 913 | core_idx = brcmf_sdio_chip_getinfidx(ci, BCMA_CORE_SDIO_DEV); |
914 | reg_addr = ci->c_inf[core_idx].base; | 914 | reg_addr = ci->c_inf[core_idx].base; |
915 | reg_addr += offsetof(struct sdpcmd_regs, intstatus); | 915 | reg_addr += offsetof(struct sdpcmd_regs, intstatus); |
916 | brcmf_sdio_regwl(sdiodev, reg_addr, 0xFFFFFFFF, NULL); | 916 | brcmf_sdiod_regwl(sdiodev, reg_addr, 0xFFFFFFFF, NULL); |
917 | 917 | ||
918 | ci->resetcore(sdiodev, ci, BCMA_CORE_ARM_CM3, 0); | 918 | ci->resetcore(sdiodev, ci, BCMA_CORE_ARM_CM3, 0); |
919 | 919 | ||
@@ -942,11 +942,11 @@ brcmf_sdio_chip_cr4_exitdl(struct brcmf_sdio_dev *sdiodev, struct chip_info *ci, | |||
942 | core_idx = brcmf_sdio_chip_getinfidx(ci, BCMA_CORE_SDIO_DEV); | 942 | core_idx = brcmf_sdio_chip_getinfidx(ci, BCMA_CORE_SDIO_DEV); |
943 | reg_addr = ci->c_inf[core_idx].base; | 943 | reg_addr = ci->c_inf[core_idx].base; |
944 | reg_addr += offsetof(struct sdpcmd_regs, intstatus); | 944 | reg_addr += offsetof(struct sdpcmd_regs, intstatus); |
945 | brcmf_sdio_regwl(sdiodev, reg_addr, 0xFFFFFFFF, NULL); | 945 | brcmf_sdiod_regwl(sdiodev, reg_addr, 0xFFFFFFFF, NULL); |
946 | 946 | ||
947 | /* Write reset vector to address 0 */ | 947 | /* Write reset vector to address 0 */ |
948 | brcmf_sdio_ramrw(sdiodev, true, 0, (void *)&ci->rst_vec, | 948 | brcmf_sdiod_ramrw(sdiodev, true, 0, (void *)&ci->rst_vec, |
949 | sizeof(ci->rst_vec)); | 949 | sizeof(ci->rst_vec)); |
950 | 950 | ||
951 | /* restore ARM */ | 951 | /* restore ARM */ |
952 | ci->resetcore(sdiodev, ci, BCMA_CORE_ARM_CR4, 0); | 952 | ci->resetcore(sdiodev, ci, BCMA_CORE_ARM_CR4, 0); |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h index 507c61c991fa..d0f4b45b24c7 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h | |||
@@ -224,7 +224,7 @@ struct sdpcmd_regs { | |||
224 | }; | 224 | }; |
225 | 225 | ||
226 | int brcmf_sdio_chip_attach(struct brcmf_sdio_dev *sdiodev, | 226 | int brcmf_sdio_chip_attach(struct brcmf_sdio_dev *sdiodev, |
227 | struct chip_info **ci_ptr, u32 regs); | 227 | struct chip_info **ci_ptr); |
228 | void brcmf_sdio_chip_detach(struct chip_info **ci_ptr); | 228 | void brcmf_sdio_chip_detach(struct chip_info **ci_ptr); |
229 | void brcmf_sdio_chip_drivestrengthinit(struct brcmf_sdio_dev *sdiodev, | 229 | void brcmf_sdio_chip_drivestrengthinit(struct brcmf_sdio_dev *sdiodev, |
230 | struct chip_info *ci, u32 drivestrength); | 230 | struct chip_info *ci, u32 drivestrength); |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h b/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h index fc0d4f0129db..a0981b32c729 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h | |||
@@ -164,9 +164,8 @@ struct brcmf_sdio; | |||
164 | struct brcmf_sdio_dev { | 164 | struct brcmf_sdio_dev { |
165 | struct sdio_func *func[SDIO_MAX_FUNCS]; | 165 | struct sdio_func *func[SDIO_MAX_FUNCS]; |
166 | u8 num_funcs; /* Supported funcs on client */ | 166 | u8 num_funcs; /* Supported funcs on client */ |
167 | u32 func_cis_ptr[SDIOD_MAX_IOFUNCS]; | ||
168 | u32 sbwad; /* Save backplane window address */ | 167 | u32 sbwad; /* Save backplane window address */ |
169 | void *bus; | 168 | struct brcmf_sdio *bus; |
170 | atomic_t suspend; /* suspend flag */ | 169 | atomic_t suspend; /* suspend flag */ |
171 | wait_queue_head_t request_byte_wait; | 170 | wait_queue_head_t request_byte_wait; |
172 | wait_queue_head_t request_word_wait; | 171 | wait_queue_head_t request_word_wait; |
@@ -185,22 +184,19 @@ struct brcmf_sdio_dev { | |||
185 | }; | 184 | }; |
186 | 185 | ||
187 | /* Register/deregister interrupt handler. */ | 186 | /* Register/deregister interrupt handler. */ |
188 | int brcmf_sdio_intr_register(struct brcmf_sdio_dev *sdiodev); | 187 | int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev); |
189 | int brcmf_sdio_intr_unregister(struct brcmf_sdio_dev *sdiodev); | 188 | int brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev); |
190 | 189 | ||
191 | /* sdio device register access interface */ | 190 | /* sdio device register access interface */ |
192 | u8 brcmf_sdio_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret); | 191 | u8 brcmf_sdiod_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret); |
193 | u32 brcmf_sdio_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret); | 192 | u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret); |
194 | void brcmf_sdio_regwb(struct brcmf_sdio_dev *sdiodev, u32 addr, u8 data, | 193 | void brcmf_sdiod_regwb(struct brcmf_sdio_dev *sdiodev, u32 addr, u8 data, |
195 | int *ret); | 194 | int *ret); |
196 | void brcmf_sdio_regwl(struct brcmf_sdio_dev *sdiodev, u32 addr, u32 data, | 195 | void brcmf_sdiod_regwl(struct brcmf_sdio_dev *sdiodev, u32 addr, u32 data, |
197 | int *ret); | 196 | int *ret); |
198 | int brcmf_sdio_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr, | ||
199 | void *data, bool write); | ||
200 | 197 | ||
201 | /* Buffer transfer to/from device (client) core via cmd53. | 198 | /* Buffer transfer to/from device (client) core via cmd53. |
202 | * fn: function number | 199 | * fn: function number |
203 | * addr: backplane address (i.e. >= regsva from attach) | ||
204 | * flags: backplane width, address increment, sync/async | 200 | * flags: backplane width, address increment, sync/async |
205 | * buf: pointer to memory data buffer | 201 | * buf: pointer to memory data buffer |
206 | * nbytes: number of bytes to transfer to/from buf | 202 | * nbytes: number of bytes to transfer to/from buf |
@@ -210,17 +206,14 @@ int brcmf_sdio_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr, | |||
210 | * Returns 0 or error code. | 206 | * Returns 0 or error code. |
211 | * NOTE: Async operation is not currently supported. | 207 | * NOTE: Async operation is not currently supported. |
212 | */ | 208 | */ |
213 | int brcmf_sdcard_send_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | 209 | int brcmf_sdiod_send_pkt(struct brcmf_sdio_dev *sdiodev, |
214 | uint flags, struct sk_buff_head *pktq); | 210 | struct sk_buff_head *pktq); |
215 | int brcmf_sdcard_send_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | 211 | int brcmf_sdiod_send_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes); |
216 | uint flags, u8 *buf, uint nbytes); | 212 | |
217 | 213 | int brcmf_sdiod_recv_pkt(struct brcmf_sdio_dev *sdiodev, struct sk_buff *pkt); | |
218 | int brcmf_sdcard_recv_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | 214 | int brcmf_sdiod_recv_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes); |
219 | uint flags, struct sk_buff *pkt); | 215 | int brcmf_sdiod_recv_chain(struct brcmf_sdio_dev *sdiodev, |
220 | int brcmf_sdcard_recv_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | 216 | struct sk_buff_head *pktq, uint totlen); |
221 | uint flags, u8 *buf, uint nbytes); | ||
222 | int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | ||
223 | uint flags, struct sk_buff_head *pktq, uint totlen); | ||
224 | 217 | ||
225 | /* Flags bits */ | 218 | /* Flags bits */ |
226 | 219 | ||
@@ -236,43 +229,16 @@ int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | |||
236 | * nbytes: number of bytes to transfer to/from buf | 229 | * nbytes: number of bytes to transfer to/from buf |
237 | * Returns 0 or error code. | 230 | * Returns 0 or error code. |
238 | */ | 231 | */ |
239 | int brcmf_sdcard_rwdata(struct brcmf_sdio_dev *sdiodev, uint rw, u32 addr, | 232 | int brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address, |
240 | u8 *buf, uint nbytes); | 233 | u8 *data, uint size); |
241 | int brcmf_sdio_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address, | ||
242 | u8 *data, uint size); | ||
243 | 234 | ||
244 | /* Issue an abort to the specified function */ | 235 | /* Issue an abort to the specified function */ |
245 | int brcmf_sdcard_abort(struct brcmf_sdio_dev *sdiodev, uint fn); | 236 | int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, uint fn); |
246 | |||
247 | /* platform specific/high level functions */ | ||
248 | int brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev); | ||
249 | int brcmf_sdio_remove(struct brcmf_sdio_dev *sdiodev); | ||
250 | |||
251 | /* attach, return handler on success, NULL if failed. | ||
252 | * The handler shall be provided by all subsequent calls. No local cache | ||
253 | * cfghdl points to the starting address of pci device mapped memory | ||
254 | */ | ||
255 | int brcmf_sdioh_attach(struct brcmf_sdio_dev *sdiodev); | ||
256 | void brcmf_sdioh_detach(struct brcmf_sdio_dev *sdiodev); | ||
257 | |||
258 | /* read or write one byte using cmd52 */ | ||
259 | int brcmf_sdioh_request_byte(struct brcmf_sdio_dev *sdiodev, uint rw, uint fnc, | ||
260 | uint addr, u8 *byte); | ||
261 | |||
262 | /* read or write 2/4 bytes using cmd53 */ | ||
263 | int brcmf_sdioh_request_word(struct brcmf_sdio_dev *sdiodev, uint rw, uint fnc, | ||
264 | uint addr, u32 *word, uint nbyte); | ||
265 | |||
266 | /* Watchdog timer interface for pm ops */ | ||
267 | void brcmf_sdio_wdtmr_enable(struct brcmf_sdio_dev *sdiodev, bool enable); | ||
268 | 237 | ||
269 | void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev); | 238 | struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev); |
270 | void brcmf_sdbrcm_disconnect(void *ptr); | 239 | void brcmf_sdio_remove(struct brcmf_sdio *bus); |
271 | void brcmf_sdbrcm_isr(void *arg); | 240 | void brcmf_sdio_isr(struct brcmf_sdio *bus); |
272 | 241 | ||
273 | void brcmf_sdbrcm_wd_timer(struct brcmf_sdio *bus, uint wdtick); | 242 | void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, uint wdtick); |
274 | 243 | ||
275 | void brcmf_pm_resume_wait(struct brcmf_sdio_dev *sdiodev, | ||
276 | wait_queue_head_t *wq); | ||
277 | bool brcmf_pm_resume_error(struct brcmf_sdio_dev *sdiodev); | ||
278 | #endif /* _BRCM_SDH_H_ */ | 244 | #endif /* _BRCM_SDH_H_ */ |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c index 51c4de054b15..c345c32eb631 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c | |||
@@ -1253,6 +1253,7 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo) | |||
1253 | bus->ops = &brcmf_usb_bus_ops; | 1253 | bus->ops = &brcmf_usb_bus_ops; |
1254 | bus->chip = bus_pub->devid; | 1254 | bus->chip = bus_pub->devid; |
1255 | bus->chiprev = bus_pub->chiprev; | 1255 | bus->chiprev = bus_pub->chiprev; |
1256 | bus->proto_type = BRCMF_PROTO_BCDC; | ||
1256 | 1257 | ||
1257 | /* Attach to the common driver interface */ | 1258 | /* Attach to the common driver interface */ |
1258 | ret = brcmf_attach(dev); | 1259 | ret = brcmf_attach(dev); |