aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorFranky Lin <frankyl@broadcom.com>2011-12-08 18:06:37 -0500
committerJohn W. Linville <linville@tuxdriver.com>2011-12-13 15:31:07 -0500
commitd76d1c8c1deebe0c71872ac4e500d6a2233f80ff (patch)
tree2d668b5006016da9068f7656e788fdfab9c664e0 /drivers/net
parent4a38994f1c43351b4aaca01ae93bd574f5b5075e (diff)
brcm80211: fmac: save bus interface structure in function 2 device
bus interface was stored in sdio card device. The device pointer is used as parameter of interface functions between common layer and bus layer to make the function declaration generic for different bus type. But the card device is a parent device layer for SDIO function devices. It doesn't contain all contexts needed by udev. This patch moves the shared structure to private driver data pointer of SDIO function 2 device which is more appopriate for net device and cfg80211 registration. Reviewed-by: Pieter-Paul Giesberts <pieterpg@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>
Diffstat (limited to 'drivers/net')
-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/sdio_host.h1
3 files changed, 13 insertions, 14 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
index 74933dccf69e..6c85d668c9d7 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
@@ -40,8 +40,7 @@
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_bus *bus_if = dev_get_drvdata(&func->card->dev); 43 struct brcmf_sdio_dev *sdiodev = dev_get_drvdata(&func->card->dev);
44 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv;
45 44
46 brcmf_dbg(TRACE, "***IRQHandler\n"); 45 brcmf_dbg(TRACE, "***IRQHandler\n");
47 46
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
index b416e274c677..bc992675eb98 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
@@ -481,12 +481,12 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
481 kfree(bus_if); 481 kfree(bus_if);
482 return -ENOMEM; 482 return -ENOMEM;
483 } 483 }
484 sdiodev->dev = &func->card->dev;
485 sdiodev->func[0] = func->card->sdio_func[0]; 484 sdiodev->func[0] = func->card->sdio_func[0];
486 sdiodev->func[1] = func; 485 sdiodev->func[1] = func;
486 sdiodev->bus_if = bus_if;
487 bus_if->bus_priv = sdiodev; 487 bus_if->bus_priv = sdiodev;
488 bus_if->type = SDIO_BUS; 488 bus_if->type = SDIO_BUS;
489 dev_set_drvdata(&func->card->dev, bus_if); 489 dev_set_drvdata(&func->card->dev, sdiodev);
490 490
491 atomic_set(&sdiodev->suspend, false); 491 atomic_set(&sdiodev->suspend, false);
492 init_waitqueue_head(&sdiodev->request_byte_wait); 492 init_waitqueue_head(&sdiodev->request_byte_wait);
@@ -496,12 +496,15 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
496 } 496 }
497 497
498 if (func->num == 2) { 498 if (func->num == 2) {
499 bus_if = dev_get_drvdata(&func->card->dev); 499 sdiodev = dev_get_drvdata(&func->card->dev);
500 sdiodev = bus_if->bus_priv;
501 if ((!sdiodev) || (sdiodev->func[1]->card != func->card)) 500 if ((!sdiodev) || (sdiodev->func[1]->card != func->card))
502 return -ENODEV; 501 return -ENODEV;
503 sdiodev->func[2] = func; 502 sdiodev->func[2] = func;
504 503
504 bus_if = sdiodev->bus_if;
505 sdiodev->dev = &func->dev;
506 dev_set_drvdata(&func->dev, bus_if);
507
505 brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_probe...\n"); 508 brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_probe...\n");
506 ret = brcmf_sdio_probe(sdiodev); 509 ret = brcmf_sdio_probe(sdiodev);
507 } 510 }
@@ -520,11 +523,12 @@ static void brcmf_ops_sdio_remove(struct sdio_func *func)
520 brcmf_dbg(INFO, "Function#: 0x%04x\n", func->num); 523 brcmf_dbg(INFO, "Function#: 0x%04x\n", func->num);
521 524
522 if (func->num == 2) { 525 if (func->num == 2) {
523 bus_if = dev_get_drvdata(&func->card->dev); 526 bus_if = dev_get_drvdata(&func->dev);
524 sdiodev = bus_if->bus_priv; 527 sdiodev = bus_if->bus_priv;
525 brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_remove...\n"); 528 brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_remove...\n");
526 brcmf_sdio_remove(sdiodev); 529 brcmf_sdio_remove(sdiodev);
527 dev_set_drvdata(&func->card->dev, NULL); 530 dev_set_drvdata(&func->card->dev, NULL);
531 dev_set_drvdata(&func->dev, NULL);
528 kfree(bus_if); 532 kfree(bus_if);
529 kfree(sdiodev); 533 kfree(sdiodev);
530 } 534 }
@@ -534,15 +538,12 @@ static void brcmf_ops_sdio_remove(struct sdio_func *func)
534static int brcmf_sdio_suspend(struct device *dev) 538static int brcmf_sdio_suspend(struct device *dev)
535{ 539{
536 mmc_pm_flag_t sdio_flags; 540 mmc_pm_flag_t sdio_flags;
537 struct brcmf_sdio_dev *sdiodev;
538 struct sdio_func *func = dev_to_sdio_func(dev); 541 struct sdio_func *func = dev_to_sdio_func(dev);
539 struct brcmf_bus *bus_if = dev_get_drvdata(&func->card->dev); 542 struct brcmf_sdio_dev *sdiodev = dev_get_drvdata(&func->card->dev);
540 int ret = 0; 543 int ret = 0;
541 544
542 brcmf_dbg(TRACE, "\n"); 545 brcmf_dbg(TRACE, "\n");
543 546
544 sdiodev = bus_if->bus_priv;
545
546 atomic_set(&sdiodev->suspend, true); 547 atomic_set(&sdiodev->suspend, true);
547 548
548 sdio_flags = sdio_get_host_pm_caps(sdiodev->func[1]); 549 sdio_flags = sdio_get_host_pm_caps(sdiodev->func[1]);
@@ -564,11 +565,9 @@ static int brcmf_sdio_suspend(struct device *dev)
564 565
565static int brcmf_sdio_resume(struct device *dev) 566static int brcmf_sdio_resume(struct device *dev)
566{ 567{
567 struct brcmf_sdio_dev *sdiodev;
568 struct sdio_func *func = dev_to_sdio_func(dev); 568 struct sdio_func *func = dev_to_sdio_func(dev);
569 struct brcmf_bus *bus_if = dev_get_drvdata(&func->card->dev); 569 struct brcmf_sdio_dev *sdiodev = dev_get_drvdata(&func->card->dev);
570 570
571 sdiodev = bus_if->bus_priv;
572 brcmf_sdio_wdtmr_enable(sdiodev, true); 571 brcmf_sdio_wdtmr_enable(sdiodev, true);
573 atomic_set(&sdiodev->suspend, false); 572 atomic_set(&sdiodev->suspend, false);
574 return 0; 573 return 0;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h b/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
index c4c2543438ec..d36a2a855a65 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
@@ -135,6 +135,7 @@ struct brcmf_sdio_dev {
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 struct device *dev; 137 struct device *dev;
138 struct brcmf_bus *bus_if;
138}; 139};
139 140
140/* Register/deregister device interrupt handler. */ 141/* Register/deregister device interrupt handler. */