diff options
-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); |