diff options
author | Hante Meuleman <meuleman@broadcom.com> | 2012-11-14 21:46:20 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-11-16 14:29:02 -0500 |
commit | 5b3c183272ad261c4d8cef5b5277fd18514f6c27 (patch) | |
tree | 82001fbf4e451b2c65a5d514d64de573480be018 | |
parent | 2def5c10d2f8f81c8089b2c1b63fdc278e7d86f0 (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.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c | 140 |
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 |
43 | static irqreturn_t brcmf_sdio_irqhandler(int irq, void *dev_id) | 43 | static 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 */ |
124 | static void brcmf_sdio_irqhandler(struct sdio_func *func) | 125 | static 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 | ||
458 | static int brcmf_ops_sdio_probe(struct sdio_func *func, | 458 | static 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; | 518 | fail: |
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 | ||
522 | static void brcmf_ops_sdio_remove(struct sdio_func *func) | 526 | static 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 |
549 | static int brcmf_sdio_suspend(struct device *dev) | 555 | static 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 | ||
577 | static int brcmf_sdio_resume(struct device *dev) | 583 | static 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); |