Date: | 2011-06-14 01:08:30 (12 years 9 months ago) |
---|---|
Author: | Werner Almesberger |
Commit: | 41fca6454634123a8b04e4f608375261ddf14167 |
Message: | at86rf230: remove irq_disabled flag and clean up IRQ freeing The irq_disabled flag is part of an intricate locking mechanism whose only purpose seems to be to enforce how the program's logic works anyway. Furthermore, since the worker calls enable_irq, we shouldn't free the interrupt before flushing the work. Also, there was an unreachable call to ieee802154_unregister_device. Signed-off-by: Werner Almesberger <werner@almesberger.net> |
Files: |
drivers/ieee802154/at86rf230.c (5 diffs) |
Change Details
drivers/ieee802154/at86rf230.c | ||
---|---|---|
59 | 59 | struct ieee802154_dev *dev; |
60 | 60 | |
61 | 61 | spinlock_t lock; |
62 | unsigned irq_disabled:1; /* P: lock */ | |
63 | 62 | unsigned is_tx:1; /* P: lock */ |
64 | 63 | }; |
65 | 64 | |
... | ... | |
460 | 459 | |
461 | 460 | } while (status != 0); |
462 | 461 | |
463 | spin_lock_irqsave(&lp->lock, flags); | |
464 | if (lp->irq_disabled) { | |
465 | lp->irq_disabled = 0; | |
466 | enable_irq(lp->spi->irq); | |
467 | } | |
468 | spin_unlock_irqrestore(&lp->lock, flags); | |
462 | enable_irq(lp->spi->irq); | |
469 | 463 | } |
470 | 464 | |
471 | 465 | static irqreturn_t at86rf230_isr(int irq, void *data) |
... | ... | |
474 | 468 | |
475 | 469 | dev_dbg(&lp->spi->dev, "IRQ!\n"); |
476 | 470 | |
477 | spin_lock(&lp->lock); | |
478 | if (!lp->irq_disabled) { | |
479 | disable_irq_nosync(irq); | |
480 | lp->irq_disabled = 1; | |
481 | } | |
482 | spin_unlock(&lp->lock); | |
483 | ||
471 | disable_irq_nosync(irq); | |
484 | 472 | schedule_work(&lp->irqwork); |
485 | 473 | |
486 | 474 | return IRQ_HANDLED; |
... | ... | |
757 | 745 | |
758 | 746 | return rc; |
759 | 747 | |
760 | ieee802154_unregister_device(lp->dev); | |
761 | 748 | err_irq: |
762 | free_irq(spi->irq, lp); | |
749 | disable_irq(spi->irq); | |
763 | 750 | flush_work(&lp->irqwork); |
751 | free_irq(spi->irq, lp); | |
764 | 752 | err_gpio_dir: |
765 | 753 | if (gpio_is_valid(lp->slp_tr)) |
766 | 754 | gpio_free(lp->slp_tr); |
... | ... | |
779 | 767 | { |
780 | 768 | struct at86rf230_local *lp = spi_get_drvdata(spi); |
781 | 769 | |
770 | /* | |
771 | * @@@ this looks wrong - what if a frame arrives before | |
772 | * disable_irq ? -- wa | |
773 | */ | |
782 | 774 | ieee802154_unregister_device(lp->dev); |
783 | 775 | |
784 | free_irq(spi->irq, lp); | |
776 | disable_irq(spi->irq); | |
785 | 777 | flush_work(&lp->irqwork); |
778 | free_irq(spi->irq, lp); | |
786 | 779 | |
787 | 780 | if (gpio_is_valid(lp->slp_tr)) |
788 | 781 | gpio_free(lp->slp_tr); |
Branches:
ben-wpan
ben-wpan-stefan
5396a9238205f20f811ea57898980d3ca82df0b6
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9