aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFranky Lin <frankyl@broadcom.com>2011-11-22 20:21:51 -0500
committerJohn W. Linville <linville@tuxdriver.com>2011-11-28 14:43:40 -0500
commit655713be2cf1a69990eb510f3641e9ef05648f51 (patch)
tree74624cbbb5455228969c5f5b589c2ebf23ebe39f
parente92eedf4e080fc0bd98e892cb9d31d2163ae8b29 (diff)
brcm80211: fmac: introduce common bus interface struct brcmf_bus
struct brcmf_bus will contain function porinter, bus specific private structure pointer and interface context of generic layer and bus layer. It will be the only shared structure between generic and bus layer. This patch is part of fullmac bus interface refactoring. Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Reviewed-by: Alwin Beukers <alwin@broadcom.com> Reviewed-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: Franky Lin <frankyl@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c3
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c23
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd.h5
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h2
4 files changed, 26 insertions, 7 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
index 6c85d668c9d7..74933dccf69e 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
@@ -40,7 +40,8 @@
40 40
41static void brcmf_sdioh_irqhandler(struct sdio_func *func) 41static void brcmf_sdioh_irqhandler(struct sdio_func *func)
42{ 42{
43 struct brcmf_sdio_dev *sdiodev = dev_get_drvdata(&func->card->dev); 43 struct brcmf_bus *bus_if = dev_get_drvdata(&func->card->dev);
44 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv;
44 45
45 brcmf_dbg(TRACE, "***IRQHandler\n"); 46 brcmf_dbg(TRACE, "***IRQHandler\n");
46 47
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
index 7a2325b2a564..77f84f8a0081 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
@@ -461,6 +461,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
461{ 461{
462 int ret = 0; 462 int ret = 0;
463 struct brcmf_sdio_dev *sdiodev; 463 struct brcmf_sdio_dev *sdiodev;
464 struct brcmf_bus *bus_if;
464 brcmf_dbg(TRACE, "Enter\n"); 465 brcmf_dbg(TRACE, "Enter\n");
465 brcmf_dbg(TRACE, "func->class=%x\n", func->class); 466 brcmf_dbg(TRACE, "func->class=%x\n", func->class);
466 brcmf_dbg(TRACE, "sdio_vendor: 0x%04x\n", func->vendor); 467 brcmf_dbg(TRACE, "sdio_vendor: 0x%04x\n", func->vendor);
@@ -472,12 +473,18 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
472 brcmf_dbg(ERROR, "card private drvdata occupied\n"); 473 brcmf_dbg(ERROR, "card private drvdata occupied\n");
473 return -ENXIO; 474 return -ENXIO;
474 } 475 }
476 bus_if = kzalloc(sizeof(struct brcmf_bus), GFP_KERNEL);
477 if (!bus_if)
478 return -ENOMEM;
475 sdiodev = kzalloc(sizeof(struct brcmf_sdio_dev), GFP_KERNEL); 479 sdiodev = kzalloc(sizeof(struct brcmf_sdio_dev), GFP_KERNEL);
476 if (!sdiodev) 480 if (!sdiodev)
477 return -ENOMEM; 481 return -ENOMEM;
482 sdiodev->dev = &func->card->dev;
478 sdiodev->func[0] = func->card->sdio_func[0]; 483 sdiodev->func[0] = func->card->sdio_func[0];
479 sdiodev->func[1] = func; 484 sdiodev->func[1] = func;
480 dev_set_drvdata(&func->card->dev, sdiodev); 485 bus_if->bus_priv = sdiodev;
486 bus_if->type = SDIO_BUS;
487 dev_set_drvdata(&func->card->dev, bus_if);
481 488
482 atomic_set(&sdiodev->suspend, false); 489 atomic_set(&sdiodev->suspend, false);
483 init_waitqueue_head(&sdiodev->request_byte_wait); 490 init_waitqueue_head(&sdiodev->request_byte_wait);
@@ -487,7 +494,8 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
487 } 494 }
488 495
489 if (func->num == 2) { 496 if (func->num == 2) {
490 sdiodev = dev_get_drvdata(&func->card->dev); 497 bus_if = dev_get_drvdata(&func->card->dev);
498 sdiodev = bus_if->bus_priv;
491 if ((!sdiodev) || (sdiodev->func[1]->card != func->card)) 499 if ((!sdiodev) || (sdiodev->func[1]->card != func->card))
492 return -ENODEV; 500 return -ENODEV;
493 sdiodev->func[2] = func; 501 sdiodev->func[2] = func;
@@ -501,6 +509,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
501 509
502static void brcmf_ops_sdio_remove(struct sdio_func *func) 510static void brcmf_ops_sdio_remove(struct sdio_func *func)
503{ 511{
512 struct brcmf_bus *bus_if;
504 struct brcmf_sdio_dev *sdiodev; 513 struct brcmf_sdio_dev *sdiodev;
505 brcmf_dbg(TRACE, "Enter\n"); 514 brcmf_dbg(TRACE, "Enter\n");
506 brcmf_dbg(INFO, "func->class=%x\n", func->class); 515 brcmf_dbg(INFO, "func->class=%x\n", func->class);
@@ -509,10 +518,12 @@ static void brcmf_ops_sdio_remove(struct sdio_func *func)
509 brcmf_dbg(INFO, "Function#: 0x%04x\n", func->num); 518 brcmf_dbg(INFO, "Function#: 0x%04x\n", func->num);
510 519
511 if (func->num == 2) { 520 if (func->num == 2) {
512 sdiodev = dev_get_drvdata(&func->card->dev); 521 bus_if = dev_get_drvdata(&func->card->dev);
522 sdiodev = bus_if->bus_priv;
513 brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_remove...\n"); 523 brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_remove...\n");
514 brcmf_sdio_remove(sdiodev); 524 brcmf_sdio_remove(sdiodev);
515 dev_set_drvdata(&func->card->dev, NULL); 525 dev_set_drvdata(&func->card->dev, NULL);
526 kfree(bus_if);
516 kfree(sdiodev); 527 kfree(sdiodev);
517 } 528 }
518} 529}
@@ -523,11 +534,12 @@ static int brcmf_sdio_suspend(struct device *dev)
523 mmc_pm_flag_t sdio_flags; 534 mmc_pm_flag_t sdio_flags;
524 struct brcmf_sdio_dev *sdiodev; 535 struct brcmf_sdio_dev *sdiodev;
525 struct sdio_func *func = dev_to_sdio_func(dev); 536 struct sdio_func *func = dev_to_sdio_func(dev);
537 struct brcmf_bus *bus_if = dev_get_drvdata(&func->card->dev);
526 int ret = 0; 538 int ret = 0;
527 539
528 brcmf_dbg(TRACE, "\n"); 540 brcmf_dbg(TRACE, "\n");
529 541
530 sdiodev = dev_get_drvdata(&func->card->dev); 542 sdiodev = bus_if->bus_priv;
531 543
532 atomic_set(&sdiodev->suspend, true); 544 atomic_set(&sdiodev->suspend, true);
533 545
@@ -552,8 +564,9 @@ static int brcmf_sdio_resume(struct device *dev)
552{ 564{
553 struct brcmf_sdio_dev *sdiodev; 565 struct brcmf_sdio_dev *sdiodev;
554 struct sdio_func *func = dev_to_sdio_func(dev); 566 struct sdio_func *func = dev_to_sdio_func(dev);
567 struct brcmf_bus *bus_if = dev_get_drvdata(&func->card->dev);
555 568
556 sdiodev = dev_get_drvdata(&func->card->dev); 569 sdiodev = bus_if->bus_priv;
557 brcmf_sdio_wdtmr_enable(sdiodev, true); 570 brcmf_sdio_wdtmr_enable(sdiodev, true);
558 atomic_set(&sdiodev->suspend, false); 571 atomic_set(&sdiodev->suspend, false);
559 return 0; 572 return 0;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
index 451b34ba3984..a557971044bc 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
@@ -571,6 +571,11 @@ struct brcmf_dcmd {
571 uint needed; /* bytes needed (optional) */ 571 uint needed; /* bytes needed (optional) */
572}; 572};
573 573
574struct brcmf_bus {
575 u8 type; /* bus type */
576 void *bus_priv; /* pointer to bus private structure */
577};
578
574/* Forward decls for struct brcmf_pub (see below) */ 579/* Forward decls for struct brcmf_pub (see below) */
575struct brcmf_sdio; /* device bus info */ 580struct brcmf_sdio; /* device bus info */
576struct brcmf_proto; /* device communication protocol info */ 581struct brcmf_proto; /* device communication protocol info */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h b/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
index 0618f5ed1acb..c4c2543438ec 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
@@ -134,7 +134,7 @@ struct brcmf_sdio_dev {
134 wait_queue_head_t request_word_wait; 134 wait_queue_head_t request_word_wait;
135 wait_queue_head_t request_chain_wait; 135 wait_queue_head_t request_chain_wait;
136 wait_queue_head_t request_buffer_wait; 136 wait_queue_head_t request_buffer_wait;
137 137 struct device *dev;
138}; 138};
139 139
140/* Register/deregister device interrupt handler. */ 140/* Register/deregister device interrupt handler. */