diff options
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c')
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c index 8e7e6928c936..3b2c4c20e7fc 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c | |||
@@ -185,7 +185,7 @@ brcmf_sdcard_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address) | |||
185 | return err; | 185 | return err; |
186 | } | 186 | } |
187 | 187 | ||
188 | static int | 188 | int |
189 | brcmf_sdio_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr, | 189 | brcmf_sdio_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr, |
190 | void *data, bool write) | 190 | void *data, bool write) |
191 | { | 191 | { |
@@ -249,7 +249,9 @@ u8 brcmf_sdio_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) | |||
249 | int retval; | 249 | int retval; |
250 | 250 | ||
251 | brcmf_dbg(INFO, "addr:0x%08x\n", addr); | 251 | brcmf_dbg(INFO, "addr:0x%08x\n", addr); |
252 | sdio_claim_host(sdiodev->func[1]); | ||
252 | retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, false); | 253 | retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, false); |
254 | sdio_release_host(sdiodev->func[1]); | ||
253 | brcmf_dbg(INFO, "data:0x%02x\n", data); | 255 | brcmf_dbg(INFO, "data:0x%02x\n", data); |
254 | 256 | ||
255 | if (ret) | 257 | if (ret) |
@@ -264,7 +266,9 @@ u32 brcmf_sdio_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) | |||
264 | int retval; | 266 | int retval; |
265 | 267 | ||
266 | brcmf_dbg(INFO, "addr:0x%08x\n", addr); | 268 | brcmf_dbg(INFO, "addr:0x%08x\n", addr); |
269 | sdio_claim_host(sdiodev->func[1]); | ||
267 | retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, false); | 270 | retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, false); |
271 | sdio_release_host(sdiodev->func[1]); | ||
268 | brcmf_dbg(INFO, "data:0x%08x\n", data); | 272 | brcmf_dbg(INFO, "data:0x%08x\n", data); |
269 | 273 | ||
270 | if (ret) | 274 | if (ret) |
@@ -279,7 +283,9 @@ void brcmf_sdio_regwb(struct brcmf_sdio_dev *sdiodev, u32 addr, | |||
279 | int retval; | 283 | int retval; |
280 | 284 | ||
281 | brcmf_dbg(INFO, "addr:0x%08x, data:0x%02x\n", addr, data); | 285 | brcmf_dbg(INFO, "addr:0x%08x, data:0x%02x\n", addr, data); |
286 | sdio_claim_host(sdiodev->func[1]); | ||
282 | retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, true); | 287 | retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, true); |
288 | sdio_release_host(sdiodev->func[1]); | ||
283 | 289 | ||
284 | if (ret) | 290 | if (ret) |
285 | *ret = retval; | 291 | *ret = retval; |
@@ -291,7 +297,9 @@ void brcmf_sdio_regwl(struct brcmf_sdio_dev *sdiodev, u32 addr, | |||
291 | int retval; | 297 | int retval; |
292 | 298 | ||
293 | brcmf_dbg(INFO, "addr:0x%08x, data:0x%08x\n", addr, data); | 299 | brcmf_dbg(INFO, "addr:0x%08x, data:0x%08x\n", addr, data); |
300 | sdio_claim_host(sdiodev->func[1]); | ||
294 | retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, true); | 301 | retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, true); |
302 | sdio_release_host(sdiodev->func[1]); | ||
295 | 303 | ||
296 | if (ret) | 304 | if (ret) |
297 | *ret = retval; | 305 | *ret = retval; |
@@ -356,15 +364,20 @@ brcmf_sdcard_recv_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | |||
356 | brcmf_dbg(INFO, "fun = %d, addr = 0x%x, size = %d\n", | 364 | brcmf_dbg(INFO, "fun = %d, addr = 0x%x, size = %d\n", |
357 | fn, addr, pkt->len); | 365 | fn, addr, pkt->len); |
358 | 366 | ||
367 | sdio_claim_host(sdiodev->func[1]); | ||
368 | |||
359 | width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; | 369 | width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; |
360 | err = brcmf_sdcard_recv_prepare(sdiodev, fn, flags, width, &addr); | 370 | err = brcmf_sdcard_recv_prepare(sdiodev, fn, flags, width, &addr); |
361 | if (err) | 371 | if (err) |
362 | return err; | 372 | goto done; |
363 | 373 | ||
364 | incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC; | 374 | incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC; |
365 | err = brcmf_sdioh_request_buffer(sdiodev, incr_fix, SDIOH_READ, | 375 | err = brcmf_sdioh_request_buffer(sdiodev, incr_fix, SDIOH_READ, |
366 | fn, addr, pkt); | 376 | fn, addr, pkt); |
367 | 377 | ||
378 | done: | ||
379 | sdio_release_host(sdiodev->func[1]); | ||
380 | |||
368 | return err; | 381 | return err; |
369 | } | 382 | } |
370 | 383 | ||
@@ -378,15 +391,20 @@ int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | |||
378 | brcmf_dbg(INFO, "fun = %d, addr = 0x%x, size = %d\n", | 391 | brcmf_dbg(INFO, "fun = %d, addr = 0x%x, size = %d\n", |
379 | fn, addr, pktq->qlen); | 392 | fn, addr, pktq->qlen); |
380 | 393 | ||
394 | sdio_claim_host(sdiodev->func[1]); | ||
395 | |||
381 | width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; | 396 | width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; |
382 | err = brcmf_sdcard_recv_prepare(sdiodev, fn, flags, width, &addr); | 397 | err = brcmf_sdcard_recv_prepare(sdiodev, fn, flags, width, &addr); |
383 | if (err) | 398 | if (err) |
384 | return err; | 399 | goto done; |
385 | 400 | ||
386 | incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC; | 401 | incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC; |
387 | err = brcmf_sdioh_request_chain(sdiodev, incr_fix, SDIOH_READ, fn, addr, | 402 | err = brcmf_sdioh_request_chain(sdiodev, incr_fix, SDIOH_READ, fn, addr, |
388 | pktq); | 403 | pktq); |
389 | 404 | ||
405 | done: | ||
406 | sdio_release_host(sdiodev->func[1]); | ||
407 | |||
390 | return err; | 408 | return err; |
391 | } | 409 | } |
392 | 410 | ||
@@ -428,10 +446,12 @@ brcmf_sdcard_send_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | |||
428 | if (flags & SDIO_REQ_ASYNC) | 446 | if (flags & SDIO_REQ_ASYNC) |
429 | return -ENOTSUPP; | 447 | return -ENOTSUPP; |
430 | 448 | ||
449 | sdio_claim_host(sdiodev->func[1]); | ||
450 | |||
431 | if (bar0 != sdiodev->sbwad) { | 451 | if (bar0 != sdiodev->sbwad) { |
432 | err = brcmf_sdcard_set_sbaddr_window(sdiodev, bar0); | 452 | err = brcmf_sdcard_set_sbaddr_window(sdiodev, bar0); |
433 | if (err) | 453 | if (err) |
434 | return err; | 454 | goto done; |
435 | 455 | ||
436 | sdiodev->sbwad = bar0; | 456 | sdiodev->sbwad = bar0; |
437 | } | 457 | } |
@@ -443,8 +463,13 @@ brcmf_sdcard_send_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | |||
443 | if (width == 4) | 463 | if (width == 4) |
444 | addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; | 464 | addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; |
445 | 465 | ||
446 | return brcmf_sdioh_request_buffer(sdiodev, incr_fix, SDIOH_WRITE, fn, | 466 | err = brcmf_sdioh_request_buffer(sdiodev, incr_fix, SDIOH_WRITE, fn, |
447 | addr, pkt); | 467 | addr, pkt); |
468 | |||
469 | done: | ||
470 | sdio_release_host(sdiodev->func[1]); | ||
471 | |||
472 | return err; | ||
448 | } | 473 | } |
449 | 474 | ||
450 | int brcmf_sdcard_rwdata(struct brcmf_sdio_dev *sdiodev, uint rw, u32 addr, | 475 | int brcmf_sdcard_rwdata(struct brcmf_sdio_dev *sdiodev, uint rw, u32 addr, |
@@ -485,8 +510,10 @@ int brcmf_sdcard_abort(struct brcmf_sdio_dev *sdiodev, uint fn) | |||
485 | brcmf_dbg(TRACE, "Enter\n"); | 510 | brcmf_dbg(TRACE, "Enter\n"); |
486 | 511 | ||
487 | /* issue abort cmd52 command through F0 */ | 512 | /* issue abort cmd52 command through F0 */ |
513 | sdio_claim_host(sdiodev->func[1]); | ||
488 | brcmf_sdioh_request_byte(sdiodev, SDIOH_WRITE, SDIO_FUNC_0, | 514 | brcmf_sdioh_request_byte(sdiodev, SDIOH_WRITE, SDIO_FUNC_0, |
489 | SDIO_CCCR_ABORT, &t_func); | 515 | SDIO_CCCR_ABORT, &t_func); |
516 | sdio_release_host(sdiodev->func[1]); | ||
490 | 517 | ||
491 | brcmf_dbg(TRACE, "Exit\n"); | 518 | brcmf_dbg(TRACE, "Exit\n"); |
492 | return 0; | 519 | return 0; |