aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHante Meuleman <meuleman@broadcom.com>2012-11-14 21:46:20 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-11-16 14:29:02 -0500
commit5b3c183272ad261c4d8cef5b5277fd18514f6c27 (patch)
tree82001fbf4e451b2c65a5d514d64de573480be018
parent2def5c10d2f8f81c8089b2c1b63fdc278e7d86f0 (diff)
brcmfmac: avoid usage of func->card->dev in sdio probe.
brcmf_ops_sdio_probe used the private_date func->card->dev to store device data of brcmfmac sdio. This is not a good place to store the data. Use dev of func and use func->card->sdio_func to group the functions the driver is using. Reviewed-by: Arend Van Spriel <arend@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Hante Meuleman <meuleman@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.c10
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c140
2 files changed, 79 insertions, 71 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
index b924ed7d3e01..4c3315ce9683 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
@@ -42,7 +42,8 @@
42#ifdef CONFIG_BRCMFMAC_SDIO_OOB 42#ifdef CONFIG_BRCMFMAC_SDIO_OOB
43static irqreturn_t brcmf_sdio_irqhandler(int irq, void *dev_id) 43static irqreturn_t brcmf_sdio_irqhandler(int irq, void *dev_id)
44{ 44{
45 struct brcmf_sdio_dev *sdiodev = dev_get_drvdata(dev_id); 45 struct brcmf_bus *bus_if = dev_get_drvdata(dev_id);
46 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
46 47
47 brcmf_dbg(INTR, "oob intr triggered\n"); 48 brcmf_dbg(INTR, "oob intr triggered\n");
48 49
@@ -71,7 +72,7 @@ int brcmf_sdio_intr_register(struct brcmf_sdio_dev *sdiodev)
71 brcmf_dbg(ERROR, "requesting irq %d\n", sdiodev->irq); 72 brcmf_dbg(ERROR, "requesting irq %d\n", sdiodev->irq);
72 ret = request_irq(sdiodev->irq, brcmf_sdio_irqhandler, 73 ret = request_irq(sdiodev->irq, brcmf_sdio_irqhandler,
73 sdiodev->irq_flags, "brcmf_oob_intr", 74 sdiodev->irq_flags, "brcmf_oob_intr",
74 &sdiodev->func[1]->card->dev); 75 &sdiodev->func[1]->dev);
75 if (ret != 0) 76 if (ret != 0)
76 return ret; 77 return ret;
77 spin_lock_init(&sdiodev->irq_en_lock); 78 spin_lock_init(&sdiodev->irq_en_lock);
@@ -115,7 +116,7 @@ int brcmf_sdio_intr_unregister(struct brcmf_sdio_dev *sdiodev)
115 disable_irq_wake(sdiodev->irq); 116 disable_irq_wake(sdiodev->irq);
116 sdiodev->irq_wake = false; 117 sdiodev->irq_wake = false;
117 } 118 }
118 free_irq(sdiodev->irq, &sdiodev->func[1]->card->dev); 119 free_irq(sdiodev->irq, &sdiodev->func[1]->dev);
119 sdiodev->irq_en = false; 120 sdiodev->irq_en = false;
120 121
121 return 0; 122 return 0;
@@ -123,7 +124,8 @@ int brcmf_sdio_intr_unregister(struct brcmf_sdio_dev *sdiodev)
123#else /* CONFIG_BRCMFMAC_SDIO_OOB */ 124#else /* CONFIG_BRCMFMAC_SDIO_OOB */
124static void brcmf_sdio_irqhandler(struct sdio_func *func) 125static void brcmf_sdio_irqhandler(struct sdio_func *func)
125{ 126{
126 struct brcmf_sdio_dev *sdiodev = dev_get_drvdata(&func->card->dev); 127 struct brcmf_bus *bus_if = dev_get_drvdata(&func->dev);
128 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
127 129
128 brcmf_dbg(INTR, "ib intr triggered\n"); 130 brcmf_dbg(INTR, "ib intr triggered\n");
129 131
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
index 854573386f23..6dd75ccd2399 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
@@ -456,101 +456,107 @@ static inline int brcmf_sdio_getintrcfg(struct brcmf_sdio_dev *sdiodev)
456#endif /* CONFIG_BRCMFMAC_SDIO_OOB */ 456#endif /* CONFIG_BRCMFMAC_SDIO_OOB */
457 457
458static int brcmf_ops_sdio_probe(struct sdio_func *func, 458static int brcmf_ops_sdio_probe(struct sdio_func *func,
459 const struct sdio_device_id *id) 459 const struct sdio_device_id *id)
460{ 460{
461 int ret = 0; 461 int err;
462 struct brcmf_sdio_dev *sdiodev; 462 struct brcmf_sdio_dev *sdiodev;
463 struct brcmf_bus *bus_if; 463 struct brcmf_bus *bus_if;
464 464
465 brcmf_dbg(TRACE, "Enter\n"); 465 brcmf_dbg(TRACE, "Enter\n");
466 brcmf_dbg(TRACE, "func->class=%x\n", func->class); 466 brcmf_dbg(TRACE, "Class=%x\n", func->class);
467 brcmf_dbg(TRACE, "sdio_vendor: 0x%04x\n", func->vendor); 467 brcmf_dbg(TRACE, "sdio vendor ID: 0x%04x\n", func->vendor);
468 brcmf_dbg(TRACE, "sdio_device: 0x%04x\n", func->device); 468 brcmf_dbg(TRACE, "sdio device ID: 0x%04x\n", func->device);
469 brcmf_dbg(TRACE, "Function#: 0x%04x\n", func->num); 469 brcmf_dbg(TRACE, "Function#: %d\n", func->num);
470 470
471 if (func->num == 1) { 471 /* Consume func num 1 but dont do anything with it. */
472 if (dev_get_drvdata(&func->card->dev)) { 472 if (func->num == 1)
473 brcmf_dbg(ERROR, "card private drvdata occupied\n"); 473 return 0;
474 return -ENXIO; 474
475 } 475 /* Ignore anything but func 2 */
476 bus_if = kzalloc(sizeof(struct brcmf_bus), GFP_KERNEL); 476 if (func->num != 2)
477 if (!bus_if) 477 return -ENODEV;
478 return -ENOMEM; 478
479 sdiodev = kzalloc(sizeof(struct brcmf_sdio_dev), GFP_KERNEL); 479 bus_if = kzalloc(sizeof(struct brcmf_bus), GFP_KERNEL);
480 if (!sdiodev) { 480 if (!bus_if)
481 kfree(bus_if); 481 return -ENOMEM;
482 return -ENOMEM; 482 sdiodev = kzalloc(sizeof(struct brcmf_sdio_dev), GFP_KERNEL);
483 } 483 if (!sdiodev) {
484 sdiodev->func[0] = func; 484 kfree(bus_if);
485 sdiodev->func[1] = func; 485 return -ENOMEM;
486 sdiodev->bus_if = bus_if;
487 bus_if->bus_priv.sdio = sdiodev;
488 bus_if->type = SDIO_BUS;
489 bus_if->align = BRCMF_SDALIGN;
490 dev_set_drvdata(&func->card->dev, sdiodev);
491
492 atomic_set(&sdiodev->suspend, false);
493 init_waitqueue_head(&sdiodev->request_byte_wait);
494 init_waitqueue_head(&sdiodev->request_word_wait);
495 init_waitqueue_head(&sdiodev->request_chain_wait);
496 init_waitqueue_head(&sdiodev->request_buffer_wait);
497 } 486 }
498 487
499 if (func->num == 2) { 488 sdiodev->func[0] = func->card->sdio_func[0];
500 sdiodev = dev_get_drvdata(&func->card->dev); 489 sdiodev->func[1] = func->card->sdio_func[0];
501 if ((!sdiodev) || (sdiodev->func[1]->card != func->card)) 490 sdiodev->func[2] = func;
502 return -ENODEV;
503
504 ret = brcmf_sdio_getintrcfg(sdiodev);
505 if (ret)
506 return ret;
507 sdiodev->func[2] = func;
508 491
509 bus_if = sdiodev->bus_if; 492 sdiodev->bus_if = bus_if;
510 sdiodev->dev = &func->dev; 493 bus_if->bus_priv.sdio = sdiodev;
511 dev_set_drvdata(&func->dev, bus_if); 494 bus_if->type = SDIO_BUS;
495 bus_if->align = BRCMF_SDALIGN;
496 dev_set_drvdata(&func->dev, bus_if);
497 dev_set_drvdata(&sdiodev->func[1]->dev, bus_if);
498 sdiodev->dev = &sdiodev->func[1]->dev;
512 499
513 brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_probe...\n"); 500 atomic_set(&sdiodev->suspend, false);
514 ret = brcmf_sdio_probe(sdiodev); 501 init_waitqueue_head(&sdiodev->request_byte_wait);
515 if (ret) 502 init_waitqueue_head(&sdiodev->request_word_wait);
516 dev_set_drvdata(&func->dev, NULL); 503 init_waitqueue_head(&sdiodev->request_chain_wait);
504 init_waitqueue_head(&sdiodev->request_buffer_wait);
505 err = brcmf_sdio_getintrcfg(sdiodev);
506 if (err)
507 goto fail;
508
509 brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_probe...\n");
510 err = brcmf_sdio_probe(sdiodev);
511 if (err) {
512 brcmf_dbg(ERROR, "F2 error, probe failed %d...\n", err);
513 goto fail;
517 } 514 }
515 brcmf_dbg(TRACE, "F2 init completed...\n");
516 return 0;
518 517
519 return ret; 518fail:
519 dev_set_drvdata(&func->dev, NULL);
520 dev_set_drvdata(&sdiodev->func[1]->dev, NULL);
521 kfree(sdiodev);
522 kfree(bus_if);
523 return err;
520} 524}
521 525
522static void brcmf_ops_sdio_remove(struct sdio_func *func) 526static void brcmf_ops_sdio_remove(struct sdio_func *func)
523{ 527{
524 struct brcmf_bus *bus_if; 528 struct brcmf_bus *bus_if;
525 struct brcmf_sdio_dev *sdiodev; 529 struct brcmf_sdio_dev *sdiodev;
530
526 brcmf_dbg(TRACE, "Enter\n"); 531 brcmf_dbg(TRACE, "Enter\n");
527 brcmf_dbg(INFO, "func->class=%x\n", func->class); 532 brcmf_dbg(TRACE, "sdio vendor ID: 0x%04x\n", func->vendor);
528 brcmf_dbg(INFO, "sdio_vendor: 0x%04x\n", func->vendor); 533 brcmf_dbg(TRACE, "sdio device ID: 0x%04x\n", func->device);
529 brcmf_dbg(INFO, "sdio_device: 0x%04x\n", func->device); 534 brcmf_dbg(TRACE, "Function: %d\n", func->num);
530 brcmf_dbg(INFO, "Function#: 0x%04x\n", func->num);
531 535
532 if (func->num == 2) { 536 if (func->num != 1 && func->num != 2)
533 bus_if = dev_get_drvdata(&func->dev); 537 return;
538
539 bus_if = dev_get_drvdata(&func->dev);
540 if (bus_if) {
534 sdiodev = bus_if->bus_priv.sdio; 541 sdiodev = bus_if->bus_priv.sdio;
535 brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_remove...\n");
536 brcmf_sdio_remove(sdiodev); 542 brcmf_sdio_remove(sdiodev);
537 dev_set_drvdata(&func->dev, NULL); 543
538 } 544 dev_set_drvdata(&sdiodev->func[1]->dev, NULL);
539 if (func->num == 1) { 545 dev_set_drvdata(&sdiodev->func[2]->dev, NULL);
540 sdiodev = dev_get_drvdata(&func->card->dev); 546
541 bus_if = sdiodev->bus_if;
542 dev_set_drvdata(&func->card->dev, NULL);
543 kfree(bus_if); 547 kfree(bus_if);
544 kfree(sdiodev); 548 kfree(sdiodev);
545 } 549 }
550
551 brcmf_dbg(TRACE, "Exit\n");
546} 552}
547 553
548#ifdef CONFIG_PM_SLEEP 554#ifdef CONFIG_PM_SLEEP
549static int brcmf_sdio_suspend(struct device *dev) 555static int brcmf_sdio_suspend(struct device *dev)
550{ 556{
551 mmc_pm_flag_t sdio_flags; 557 mmc_pm_flag_t sdio_flags;
552 struct sdio_func *func = dev_to_sdio_func(dev); 558 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
553 struct brcmf_sdio_dev *sdiodev = dev_get_drvdata(&func->card->dev); 559 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
554 int ret = 0; 560 int ret = 0;
555 561
556 brcmf_dbg(TRACE, "\n"); 562 brcmf_dbg(TRACE, "\n");
@@ -576,8 +582,8 @@ static int brcmf_sdio_suspend(struct device *dev)
576 582
577static int brcmf_sdio_resume(struct device *dev) 583static int brcmf_sdio_resume(struct device *dev)
578{ 584{
579 struct sdio_func *func = dev_to_sdio_func(dev); 585 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
580 struct brcmf_sdio_dev *sdiodev = dev_get_drvdata(&func->card->dev); 586 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
581 587
582 brcmf_sdio_wdtmr_enable(sdiodev, true); 588 brcmf_sdio_wdtmr_enable(sdiodev, true);
583 atomic_set(&sdiodev->suspend, false); 589 atomic_set(&sdiodev->suspend, false);