diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-02-26 13:34:27 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-02-26 17:26:16 -0500 |
commit | 9e3bd9190800e8209b4a3e1d724c35f0738dcad2 (patch) | |
tree | 6899d414c070d8a5ad6074dd146419a559ae8c14 | |
parent | 0e0a228398cc967c922759be36c69d32e4f62701 (diff) |
b43: fall back gracefully to PIO mode after fatal DMA errors
This makes the b43 driver just automatically fall back to PIO mode when
DMA doesn't work.
The driver already told the user to do it, so rather than have the user
reload the module with a new flag, just make the driver do it
automatically. We keep the message as an indication that something is
wrong, but now just automatically fall back to the hopefully working PIO
case.
(Some post-2.6.33 merge fixups by Larry Finger <Larry.Finger@lwfinger.net>
and yours truly... -- JWL)
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/b43/Kconfig | 17 | ||||
-rw-r--r-- | drivers/net/wireless/b43/b43.h | 7 | ||||
-rw-r--r-- | drivers/net/wireless/b43/main.c | 14 |
3 files changed, 31 insertions, 7 deletions
diff --git a/drivers/net/wireless/b43/Kconfig b/drivers/net/wireless/b43/Kconfig index 073be566d05e..0a00d42642cd 100644 --- a/drivers/net/wireless/b43/Kconfig +++ b/drivers/net/wireless/b43/Kconfig | |||
@@ -3,7 +3,6 @@ config B43 | |||
3 | depends on SSB_POSSIBLE && MAC80211 && HAS_DMA | 3 | depends on SSB_POSSIBLE && MAC80211 && HAS_DMA |
4 | select SSB | 4 | select SSB |
5 | select FW_LOADER | 5 | select FW_LOADER |
6 | select SSB_BLOCKIO | ||
7 | ---help--- | 6 | ---help--- |
8 | b43 is a driver for the Broadcom 43xx series wireless devices. | 7 | b43 is a driver for the Broadcom 43xx series wireless devices. |
9 | 8 | ||
@@ -79,6 +78,14 @@ config B43_SDIO | |||
79 | 78 | ||
80 | If unsure, say N. | 79 | If unsure, say N. |
81 | 80 | ||
81 | #Data transfers to the device via PIO. We want it as a fallback even | ||
82 | # if we can do DMA. | ||
83 | config B43_PIO | ||
84 | bool | ||
85 | depends on B43 | ||
86 | select SSB_BLOCKIO | ||
87 | default y | ||
88 | |||
82 | config B43_NPHY | 89 | config B43_NPHY |
83 | bool "Pre IEEE 802.11n support (BROKEN)" | 90 | bool "Pre IEEE 802.11n support (BROKEN)" |
84 | depends on B43 && EXPERIMENTAL && BROKEN | 91 | depends on B43 && EXPERIMENTAL && BROKEN |
@@ -130,4 +137,12 @@ config B43_DEBUG | |||
130 | for production use. | 137 | for production use. |
131 | Only say Y, if you are debugging a problem in the b43 driver sourcecode. | 138 | Only say Y, if you are debugging a problem in the b43 driver sourcecode. |
132 | 139 | ||
140 | config B43_FORCE_PIO | ||
141 | bool "Force usage of PIO instead of DMA" | ||
142 | depends on B43 && B43_DEBUG | ||
143 | ---help--- | ||
144 | This will disable DMA and always enable PIO instead. | ||
133 | 145 | ||
146 | Say N! | ||
147 | This is only for debugging the PIO engine code. You do | ||
148 | _NOT_ want to enable this. | ||
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index 6a6ab0f630e5..b8807fb12c92 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h | |||
@@ -702,6 +702,7 @@ struct b43_wldev { | |||
702 | bool radio_hw_enable; /* saved state of radio hardware enabled state */ | 702 | bool radio_hw_enable; /* saved state of radio hardware enabled state */ |
703 | bool qos_enabled; /* TRUE, if QoS is used. */ | 703 | bool qos_enabled; /* TRUE, if QoS is used. */ |
704 | bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */ | 704 | bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */ |
705 | bool use_pio; /* TRUE if next init should use PIO */ | ||
705 | 706 | ||
706 | /* PHY/Radio device. */ | 707 | /* PHY/Radio device. */ |
707 | struct b43_phy phy; | 708 | struct b43_phy phy; |
@@ -886,6 +887,12 @@ static inline bool b43_using_pio_transfers(struct b43_wldev *dev) | |||
886 | return dev->__using_pio_transfers; | 887 | return dev->__using_pio_transfers; |
887 | } | 888 | } |
888 | 889 | ||
890 | #ifdef CONFIG_B43_FORCE_PIO | ||
891 | # define B43_PIO_DEFAULT 1 | ||
892 | #else | ||
893 | # define B43_PIO_DEFAULT 0 | ||
894 | #endif | ||
895 | |||
889 | /* Message printing */ | 896 | /* Message printing */ |
890 | void b43info(struct b43_wl *wl, const char *fmt, ...) | 897 | void b43info(struct b43_wl *wl, const char *fmt, ...) |
891 | __attribute__ ((format(printf, 2, 3))); | 898 | __attribute__ ((format(printf, 2, 3))); |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 8f7a8c0ec27d..16580d0d3a02 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -107,9 +107,9 @@ int b43_modparam_verbose = B43_VERBOSITY_DEFAULT; | |||
107 | module_param_named(verbose, b43_modparam_verbose, int, 0644); | 107 | module_param_named(verbose, b43_modparam_verbose, int, 0644); |
108 | MODULE_PARM_DESC(verbose, "Log message verbosity: 0=error, 1=warn, 2=info(default), 3=debug"); | 108 | MODULE_PARM_DESC(verbose, "Log message verbosity: 0=error, 1=warn, 2=info(default), 3=debug"); |
109 | 109 | ||
110 | static int modparam_pio; | 110 | int b43_modparam_pio = B43_PIO_DEFAULT; |
111 | module_param_named(pio, modparam_pio, int, 0444); | 111 | module_param_named(pio, b43_modparam_pio, int, 0644); |
112 | MODULE_PARM_DESC(pio, "enable(1) / disable(0) PIO mode"); | 112 | MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO"); |
113 | 113 | ||
114 | static const struct ssb_device_id b43_ssb_tbl[] = { | 114 | static const struct ssb_device_id b43_ssb_tbl[] = { |
115 | SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5), | 115 | SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5), |
@@ -1804,8 +1804,9 @@ static void b43_do_interrupt_thread(struct b43_wldev *dev) | |||
1804 | dma_reason[4], dma_reason[5]); | 1804 | dma_reason[4], dma_reason[5]); |
1805 | b43err(dev->wl, "This device does not support DMA " | 1805 | b43err(dev->wl, "This device does not support DMA " |
1806 | "on your system. Please use PIO instead.\n"); | 1806 | "on your system. Please use PIO instead.\n"); |
1807 | b43err(dev->wl, "Unload the b43 module and reload " | 1807 | /* Fall back to PIO transfers if we get fatal DMA errors! */ |
1808 | "with 'pio=1'\n"); | 1808 | dev->use_pio = 1; |
1809 | b43_controller_restart(dev, "DMA error"); | ||
1809 | return; | 1810 | return; |
1810 | } | 1811 | } |
1811 | if (merged_dma_reason & B43_DMAIRQ_NONFATALMASK) { | 1812 | if (merged_dma_reason & B43_DMAIRQ_NONFATALMASK) { |
@@ -4357,7 +4358,7 @@ static int b43_wireless_core_init(struct b43_wldev *dev) | |||
4357 | 4358 | ||
4358 | if ((dev->dev->bus->bustype == SSB_BUSTYPE_PCMCIA) || | 4359 | if ((dev->dev->bus->bustype == SSB_BUSTYPE_PCMCIA) || |
4359 | (dev->dev->bus->bustype == SSB_BUSTYPE_SDIO) || | 4360 | (dev->dev->bus->bustype == SSB_BUSTYPE_SDIO) || |
4360 | modparam_pio) { | 4361 | dev->use_pio) { |
4361 | dev->__using_pio_transfers = 1; | 4362 | dev->__using_pio_transfers = 1; |
4362 | err = b43_pio_init(dev); | 4363 | err = b43_pio_init(dev); |
4363 | } else { | 4364 | } else { |
@@ -4824,6 +4825,7 @@ static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl) | |||
4824 | if (!wldev) | 4825 | if (!wldev) |
4825 | goto out; | 4826 | goto out; |
4826 | 4827 | ||
4828 | wldev->use_pio = b43_modparam_pio; | ||
4827 | wldev->dev = dev; | 4829 | wldev->dev = dev; |
4828 | wldev->wl = wl; | 4830 | wldev->wl = wl; |
4829 | b43_set_status(wldev, B43_STAT_UNINIT); | 4831 | b43_set_status(wldev, B43_STAT_UNINIT); |