1 /*
2 
3   Broadcom B43 wireless driver
4 
5   Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>
6   Copyright (c) 2005 Stefano Brivio <stefano.brivio@polimi.it>
7   Copyright (c) 2005-2009 Michael Buesch <m@bues.ch>
8   Copyright (c) 2005 Danny van Dyk <kugelfang@gentoo.org>
9   Copyright (c) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
10   Copyright (c) 2010-2011 Rafał Miłecki <zajec5@gmail.com>
11 
12   SDIO support
13   Copyright (c) 2009 Albert Herranz <albert_herranz@yahoo.es>
14 
15   Some parts of the code in this file are derived from the ipw2200
16   driver  Copyright(c) 2003 - 2004 Intel Corporation.
17 
18   This program is free software; you can redistribute it and/or modify
19   it under the terms of the GNU General Public License as published by
20   the Free Software Foundation; either version 2 of the License, or
21   (at your option) any later version.
22 
23   This program is distributed in the hope that it will be useful,
24   but WITHOUT ANY WARRANTY; without even the implied warranty of
25   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26   GNU General Public License for more details.
27 
28   You should have received a copy of the GNU General Public License
29   along with this program; see the file COPYING.  If not, write to
30   the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
31   Boston, MA 02110-1301, USA.
32 
33 */
34 
35 #include <linux/delay.h>
36 #include <linux/init.h>
37 #include <linux/module.h>
38 #include <linux/if_arp.h>
39 #include <linux/etherdevice.h>
40 #include <linux/firmware.h>
41 #include <linux/workqueue.h>
42 #include <linux/skbuff.h>
43 #include <linux/io.h>
44 #include <linux/dma-mapping.h>
45 #include <linux/slab.h>
46 #include <asm/unaligned.h>
47 
48 #include "b43.h"
49 #include "main.h"
50 #include "debugfs.h"
51 #include "phy_common.h"
52 #include "phy_g.h"
53 #include "phy_n.h"
54 #include "dma.h"
55 #include "pio.h"
56 #include "sysfs.h"
57 #include "xmit.h"
58 #include "lo.h"
59 #include "pcmcia.h"
60 #include "sdio.h"
61 #include <linux/mmc/sdio_func.h>
62 
63 MODULE_DESCRIPTION("Broadcom B43 wireless driver");
64 MODULE_AUTHOR("Martin Langer");
65 MODULE_AUTHOR("Stefano Brivio");
66 MODULE_AUTHOR("Michael Buesch");
67 MODULE_AUTHOR("Gábor Stefanik");
68 MODULE_AUTHOR("Rafał Miłecki");
69 MODULE_LICENSE("GPL");
70 
71 MODULE_FIRMWARE("b43/ucode11.fw");
72 MODULE_FIRMWARE("b43/ucode13.fw");
73 MODULE_FIRMWARE("b43/ucode14.fw");
74 MODULE_FIRMWARE("b43/ucode15.fw");
75 MODULE_FIRMWARE("b43/ucode16_mimo.fw");
76 MODULE_FIRMWARE("b43/ucode5.fw");
77 MODULE_FIRMWARE("b43/ucode9.fw");
78 
79 static int modparam_bad_frames_preempt;
80 module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
81 MODULE_PARM_DESC(bad_frames_preempt,
82 		 "enable(1) / disable(0) Bad Frames Preemption");
83 
84 static char modparam_fwpostfix[16];
85 module_param_string(fwpostfix, modparam_fwpostfix, 16, 0444);
86 MODULE_PARM_DESC(fwpostfix, "Postfix for the .fw files to load.");
87 
88 static int modparam_hwpctl;
89 module_param_named(hwpctl, modparam_hwpctl, int, 0444);
90 MODULE_PARM_DESC(hwpctl, "Enable hardware-side power control (default off)");
91 
92 static int modparam_nohwcrypt;
93 module_param_named(nohwcrypt, modparam_nohwcrypt, int, 0444);
94 MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
95 
96 static int modparam_hwtkip;
97 module_param_named(hwtkip, modparam_hwtkip, int, 0444);
98 MODULE_PARM_DESC(hwtkip, "Enable hardware tkip.");
99 
100 static int modparam_qos = 1;
101 module_param_named(qos, modparam_qos, int, 0444);
102 MODULE_PARM_DESC(qos, "Enable QOS support (default on)");
103 
104 static int modparam_btcoex = 1;
105 module_param_named(btcoex, modparam_btcoex, int, 0444);
106 MODULE_PARM_DESC(btcoex, "Enable Bluetooth coexistence (default on)");
107 
108 int b43_modparam_verbose = B43_VERBOSITY_DEFAULT;
109 module_param_named(verbose, b43_modparam_verbose, int, 0644);
110 MODULE_PARM_DESC(verbose, "Log message verbosity: 0=error, 1=warn, 2=info(default), 3=debug");
111 
112 static int b43_modparam_pio = 0;
113 module_param_named(pio, b43_modparam_pio, int, 0644);
114 MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO");
115 
116 #ifdef CONFIG_B43_BCMA
117 static const struct bcma_device_id b43_bcma_tbl[] = {
118 	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x11, BCMA_ANY_CLASS),
119 #ifdef CONFIG_B43_BCMA_EXTRA
120 	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x17, BCMA_ANY_CLASS),
121 	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x18, BCMA_ANY_CLASS),
122 #endif
123 	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x1D, BCMA_ANY_CLASS),
124 	BCMA_CORETABLE_END
125 };
126 MODULE_DEVICE_TABLE(bcma, b43_bcma_tbl);
127 #endif
128 
129 #ifdef CONFIG_B43_SSB
130 static const struct ssb_device_id b43_ssb_tbl[] = {
131 	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5),
132 	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 6),
133 	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 7),
134 	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 9),
135 	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 10),
136 	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 11),
137 	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 12),
138 	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 13),
139 	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 15),
140 	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 16),
141 	SSB_DEVTABLE_END
142 };
143 MODULE_DEVICE_TABLE(ssb, b43_ssb_tbl);
144 #endif
145 
146 /* Channel and ratetables are shared for all devices.
147  * They can't be const, because ieee80211 puts some precalculated
148  * data in there. This data is the same for all devices, so we don't
149  * get concurrency issues */
150 #define RATETAB_ENT(_rateid, _flags) \
151 	{								\
152 		.bitrate	= B43_RATE_TO_BASE100KBPS(_rateid),	\
153 		.hw_value	= (_rateid),				\
154 		.flags		= (_flags),				\
155 	}
156 
157 /*
158  * NOTE: When changing this, sync with xmit.c's
159  *	 b43_plcp_get_bitrate_idx_* functions!
160  */
161 static struct ieee80211_rate __b43_ratetable[] = {
162 	RATETAB_ENT(B43_CCK_RATE_1MB, 0),
163 	RATETAB_ENT(B43_CCK_RATE_2MB, IEEE80211_RATE_SHORT_PREAMBLE),
164 	RATETAB_ENT(B43_CCK_RATE_5MB, IEEE80211_RATE_SHORT_PREAMBLE),
165 	RATETAB_ENT(B43_CCK_RATE_11MB, IEEE80211_RATE_SHORT_PREAMBLE),
166 	RATETAB_ENT(B43_OFDM_RATE_6MB, 0),
167 	RATETAB_ENT(B43_OFDM_RATE_9MB, 0),
168 	RATETAB_ENT(B43_OFDM_RATE_12MB, 0),
169 	RATETAB_ENT(B43_OFDM_RATE_18MB, 0),
170 	RATETAB_ENT(B43_OFDM_RATE_24MB, 0),
171 	RATETAB_ENT(B43_OFDM_RATE_36MB, 0),
172 	RATETAB_ENT(B43_OFDM_RATE_48MB, 0),
173 	RATETAB_ENT(B43_OFDM_RATE_54MB, 0),
174 };
175 
176 #define b43_a_ratetable		(__b43_ratetable + 4)
177 #define b43_a_ratetable_size	8
178 #define b43_b_ratetable		(__b43_ratetable + 0)
179 #define b43_b_ratetable_size	4
180 #define b43_g_ratetable		(__b43_ratetable + 0)
181 #define b43_g_ratetable_size	12
182 
183 #define CHAN4G(_channel, _freq, _flags) {			\
184 	.band			= IEEE80211_BAND_2GHZ,		\
185 	.center_freq		= (_freq),			\
186 	.hw_value		= (_channel),			\
187 	.flags			= (_flags),			\
188 	.max_antenna_gain	= 0,				\
189 	.max_power		= 30,				\
190 }
191 static struct ieee80211_channel b43_2ghz_chantable[] = {
192 	CHAN4G(1, 2412, 0),
193 	CHAN4G(2, 2417, 0),
194 	CHAN4G(3, 2422, 0),
195 	CHAN4G(4, 2427, 0),
196 	CHAN4G(5, 2432, 0),
197 	CHAN4G(6, 2437, 0),
198 	CHAN4G(7, 2442, 0),
199 	CHAN4G(8, 2447, 0),
200 	CHAN4G(9, 2452, 0),
201 	CHAN4G(10, 2457, 0),
202 	CHAN4G(11, 2462, 0),
203 	CHAN4G(12, 2467, 0),
204 	CHAN4G(13, 2472, 0),
205 	CHAN4G(14, 2484, 0),
206 };
207 #undef CHAN4G
208 
209 #define CHAN5G(_channel, _flags) {				\
210 	.band			= IEEE80211_BAND_5GHZ,		\
211 	.center_freq		= 5000 + (5 * (_channel)),	\
212 	.hw_value		= (_channel),			\
213 	.flags			= (_flags),			\
214 	.max_antenna_gain	= 0,				\
215 	.max_power		= 30,				\
216 }
217 static struct ieee80211_channel b43_5ghz_nphy_chantable[] = {
218 	CHAN5G(32, 0),		CHAN5G(34, 0),
219 	CHAN5G(36, 0),		CHAN5G(38, 0),
220 	CHAN5G(40, 0),		CHAN5G(42, 0),
221 	CHAN5G(44, 0),		CHAN5G(46, 0),
222 	CHAN5G(48, 0),		CHAN5G(50, 0),
223 	CHAN5G(52, 0),		CHAN5G(54, 0),
224 	CHAN5G(56, 0),		CHAN5G(58, 0),
225 	CHAN5G(60, 0),		CHAN5G(62, 0),
226 	CHAN5G(64, 0),		CHAN5G(66, 0),
227 	CHAN5G(68, 0),		CHAN5G(70, 0),
228 	CHAN5G(72, 0),		CHAN5G(74, 0),
229 	CHAN5G(76, 0),		CHAN5G(78, 0),
230 	CHAN5G(80, 0),		CHAN5G(82, 0),
231 	CHAN5G(84, 0),		CHAN5G(86, 0),
232 	CHAN5G(88, 0),		CHAN5G(90, 0),
233 	CHAN5G(92, 0),		CHAN5G(94, 0),
234 	CHAN5G(96, 0),		CHAN5G(98, 0),
235 	CHAN5G(100, 0),		CHAN5G(102, 0),
236 	CHAN5G(104, 0),		CHAN5G(106, 0),
237 	CHAN5G(108, 0),		CHAN5G(110, 0),
238 	CHAN5G(112, 0),		CHAN5G(114, 0),
239 	CHAN5G(116, 0),		CHAN5G(118, 0),
240 	CHAN5G(120, 0),		CHAN5G(122, 0),
241 	CHAN5G(124, 0),		CHAN5G(126, 0),
242 	CHAN5G(128, 0),		CHAN5G(130, 0),
243 	CHAN5G(132, 0),		CHAN5G(134, 0),
244 	CHAN5G(136, 0),		CHAN5G(138, 0),
245 	CHAN5G(140, 0),		CHAN5G(142, 0),
246 	CHAN5G(144, 0),		CHAN5G(145, 0),
247 	CHAN5G(146, 0),		CHAN5G(147, 0),
248 	CHAN5G(148, 0),		CHAN5G(149, 0),
249 	CHAN5G(150, 0),		CHAN5G(151, 0),
250 	CHAN5G(152, 0),		CHAN5G(153, 0),
251 	CHAN5G(154, 0),		CHAN5G(155, 0),
252 	CHAN5G(156, 0),		CHAN5G(157, 0),
253 	CHAN5G(158, 0),		CHAN5G(159, 0),
254 	CHAN5G(160, 0),		CHAN5G(161, 0),
255 	CHAN5G(162, 0),		CHAN5G(163, 0),
256 	CHAN5G(164, 0),		CHAN5G(165, 0),
257 	CHAN5G(166, 0),		CHAN5G(168, 0),
258 	CHAN5G(170, 0),		CHAN5G(172, 0),
259 	CHAN5G(174, 0),		CHAN5G(176, 0),
260 	CHAN5G(178, 0),		CHAN5G(180, 0),
261 	CHAN5G(182, 0),		CHAN5G(184, 0),
262 	CHAN5G(186, 0),		CHAN5G(188, 0),
263 	CHAN5G(190, 0),		CHAN5G(192, 0),
264 	CHAN5G(194, 0),		CHAN5G(196, 0),
265 	CHAN5G(198, 0),		CHAN5G(200, 0),
266 	CHAN5G(202, 0),		CHAN5G(204, 0),
267 	CHAN5G(206, 0),		CHAN5G(208, 0),
268 	CHAN5G(210, 0),		CHAN5G(212, 0),
269 	CHAN5G(214, 0),		CHAN5G(216, 0),
270 	CHAN5G(218, 0),		CHAN5G(220, 0),
271 	CHAN5G(222, 0),		CHAN5G(224, 0),
272 	CHAN5G(226, 0),		CHAN5G(228, 0),
273 };
274 
275 static struct ieee80211_channel b43_5ghz_aphy_chantable[] = {
276 	CHAN5G(34, 0),		CHAN5G(36, 0),
277 	CHAN5G(38, 0),		CHAN5G(40, 0),
278 	CHAN5G(42, 0),		CHAN5G(44, 0),
279 	CHAN5G(46, 0),		CHAN5G(48, 0),
280 	CHAN5G(52, 0),		CHAN5G(56, 0),
281 	CHAN5G(60, 0),		CHAN5G(64, 0),
282 	CHAN5G(100, 0),		CHAN5G(104, 0),
283 	CHAN5G(108, 0),		CHAN5G(112, 0),
284 	CHAN5G(116, 0),		CHAN5G(120, 0),
285 	CHAN5G(124, 0),		CHAN5G(128, 0),
286 	CHAN5G(132, 0),		CHAN5G(136, 0),
287 	CHAN5G(140, 0),		CHAN5G(149, 0),
288 	CHAN5G(153, 0),		CHAN5G(157, 0),
289 	CHAN5G(161, 0),		CHAN5G(165, 0),
290 	CHAN5G(184, 0),		CHAN5G(188, 0),
291 	CHAN5G(192, 0),		CHAN5G(196, 0),
292 	CHAN5G(200, 0),		CHAN5G(204, 0),
293 	CHAN5G(208, 0),		CHAN5G(212, 0),
294 	CHAN5G(216, 0),
295 };
296 #undef CHAN5G
297 
298 static struct ieee80211_supported_band b43_band_5GHz_nphy = {
299 	.band		= IEEE80211_BAND_5GHZ,
300 	.channels	= b43_5ghz_nphy_chantable,
301 	.n_channels	= ARRAY_SIZE(b43_5ghz_nphy_chantable),
302 	.bitrates	= b43_a_ratetable,
303 	.n_bitrates	= b43_a_ratetable_size,
304 };
305 
306 static struct ieee80211_supported_band b43_band_5GHz_aphy = {
307 	.band		= IEEE80211_BAND_5GHZ,
308 	.channels	= b43_5ghz_aphy_chantable,
309 	.n_channels	= ARRAY_SIZE(b43_5ghz_aphy_chantable),
310 	.bitrates	= b43_a_ratetable,
311 	.n_bitrates	= b43_a_ratetable_size,
312 };
313 
314 static struct ieee80211_supported_band b43_band_2GHz = {
315 	.band		= IEEE80211_BAND_2GHZ,
316 	.channels	= b43_2ghz_chantable,
317 	.n_channels	= ARRAY_SIZE(b43_2ghz_chantable),
318 	.bitrates	= b43_g_ratetable,
319 	.n_bitrates	= b43_g_ratetable_size,
320 };
321 
322 static void b43_wireless_core_exit(struct b43_wldev *dev);
323 static int b43_wireless_core_init(struct b43_wldev *dev);
324 static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev);
325 static int b43_wireless_core_start(struct b43_wldev *dev);
326 static void b43_op_bss_info_changed(struct ieee80211_hw *hw,
327 				    struct ieee80211_vif *vif,
328 				    struct ieee80211_bss_conf *conf,
329 				    u32 changed);
330 
b43_ratelimit(struct b43_wl * wl)331 static int b43_ratelimit(struct b43_wl *wl)
332 {
333 	if (!wl || !wl->current_dev)
334 		return 1;
335 	if (b43_status(wl->current_dev) < B43_STAT_STARTED)
336 		return 1;
337 	/* We are up and running.
338 	 * Ratelimit the messages to avoid DoS over the net. */
339 	return net_ratelimit();
340 }
341 
b43info(struct b43_wl * wl,const char * fmt,...)342 void b43info(struct b43_wl *wl, const char *fmt, ...)
343 {
344 	struct va_format vaf;
345 	va_list args;
346 
347 	if (b43_modparam_verbose < B43_VERBOSITY_INFO)
348 		return;
349 	if (!b43_ratelimit(wl))
350 		return;
351 
352 	va_start(args, fmt);
353 
354 	vaf.fmt = fmt;
355 	vaf.va = &args;
356 
357 	printk(KERN_INFO "b43-%s: %pV",
358 	       (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
359 
360 	va_end(args);
361 }
362 
b43err(struct b43_wl * wl,const char * fmt,...)363 void b43err(struct b43_wl *wl, const char *fmt, ...)
364 {
365 	struct va_format vaf;
366 	va_list args;
367 
368 	if (b43_modparam_verbose < B43_VERBOSITY_ERROR)
369 		return;
370 	if (!b43_ratelimit(wl))
371 		return;
372 
373 	va_start(args, fmt);
374 
375 	vaf.fmt = fmt;
376 	vaf.va = &args;
377 
378 	printk(KERN_ERR "b43-%s ERROR: %pV",
379 	       (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
380 
381 	va_end(args);
382 }
383 
b43warn(struct b43_wl * wl,const char * fmt,...)384 void b43warn(struct b43_wl *wl, const char *fmt, ...)
385 {
386 	struct va_format vaf;
387 	va_list args;
388 
389 	if (b43_modparam_verbose < B43_VERBOSITY_WARN)
390 		return;
391 	if (!b43_ratelimit(wl))
392 		return;
393 
394 	va_start(args, fmt);
395 
396 	vaf.fmt = fmt;
397 	vaf.va = &args;
398 
399 	printk(KERN_WARNING "b43-%s warning: %pV",
400 	       (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
401 
402 	va_end(args);
403 }
404 
b43dbg(struct b43_wl * wl,const char * fmt,...)405 void b43dbg(struct b43_wl *wl, const char *fmt, ...)
406 {
407 	struct va_format vaf;
408 	va_list args;
409 
410 	if (b43_modparam_verbose < B43_VERBOSITY_DEBUG)
411 		return;
412 
413 	va_start(args, fmt);
414 
415 	vaf.fmt = fmt;
416 	vaf.va = &args;
417 
418 	printk(KERN_DEBUG "b43-%s debug: %pV",
419 	       (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
420 
421 	va_end(args);
422 }
423 
b43_ram_write(struct b43_wldev * dev,u16 offset,u32 val)424 static void b43_ram_write(struct b43_wldev *dev, u16 offset, u32 val)
425 {
426 	u32 macctl;
427 
428 	B43_WARN_ON(offset % 4 != 0);
429 
430 	macctl = b43_read32(dev, B43_MMIO_MACCTL);
431 	if (macctl & B43_MACCTL_BE)
432 		val = swab32(val);
433 
434 	b43_write32(dev, B43_MMIO_RAM_CONTROL, offset);
435 	mmiowb();
436 	b43_write32(dev, B43_MMIO_RAM_DATA, val);
437 }
438 
b43_shm_control_word(struct b43_wldev * dev,u16 routing,u16 offset)439 static inline void b43_shm_control_word(struct b43_wldev *dev,
440 					u16 routing, u16 offset)
441 {
442 	u32 control;
443 
444 	/* "offset" is the WORD offset. */
445 	control = routing;
446 	control <<= 16;
447 	control |= offset;
448 	b43_write32(dev, B43_MMIO_SHM_CONTROL, control);
449 }
450 
b43_shm_read32(struct b43_wldev * dev,u16 routing,u16 offset)451 u32 b43_shm_read32(struct b43_wldev *dev, u16 routing, u16 offset)
452 {
453 	u32 ret;
454 
455 	if (routing == B43_SHM_SHARED) {
456 		B43_WARN_ON(offset & 0x0001);
457 		if (offset & 0x0003) {
458 			/* Unaligned access */
459 			b43_shm_control_word(dev, routing, offset >> 2);
460 			ret = b43_read16(dev, B43_MMIO_SHM_DATA_UNALIGNED);
461 			b43_shm_control_word(dev, routing, (offset >> 2) + 1);
462 			ret |= ((u32)b43_read16(dev, B43_MMIO_SHM_DATA)) << 16;
463 
464 			goto out;
465 		}
466 		offset >>= 2;
467 	}
468 	b43_shm_control_word(dev, routing, offset);
469 	ret = b43_read32(dev, B43_MMIO_SHM_DATA);
470 out:
471 	return ret;
472 }
473 
b43_shm_read16(struct b43_wldev * dev,u16 routing,u16 offset)474 u16 b43_shm_read16(struct b43_wldev *dev, u16 routing, u16 offset)
475 {
476 	u16 ret;
477 
478 	if (routing == B43_SHM_SHARED) {
479 		B43_WARN_ON(offset & 0x0001);
480 		if (offset & 0x0003) {
481 			/* Unaligned access */
482 			b43_shm_control_word(dev, routing, offset >> 2);
483 			ret = b43_read16(dev, B43_MMIO_SHM_DATA_UNALIGNED);
484 
485 			goto out;
486 		}
487 		offset >>= 2;
488 	}
489 	b43_shm_control_word(dev, routing, offset);
490 	ret = b43_read16(dev, B43_MMIO_SHM_DATA);
491 out:
492 	return ret;
493 }
494 
b43_shm_write32(struct b43_wldev * dev,u16 routing,u16 offset,u32 value)495 void b43_shm_write32(struct b43_wldev *dev, u16 routing, u16 offset, u32 value)
496 {
497 	if (routing == B43_SHM_SHARED) {
498 		B43_WARN_ON(offset & 0x0001);
499 		if (offset & 0x0003) {
500 			/* Unaligned access */
501 			b43_shm_control_word(dev, routing, offset >> 2);
502 			b43_write16(dev, B43_MMIO_SHM_DATA_UNALIGNED,
503 				    value & 0xFFFF);
504 			b43_shm_control_word(dev, routing, (offset >> 2) + 1);
505 			b43_write16(dev, B43_MMIO_SHM_DATA,
506 				    (value >> 16) & 0xFFFF);
507 			return;
508 		}
509 		offset >>= 2;
510 	}
511 	b43_shm_control_word(dev, routing, offset);
512 	b43_write32(dev, B43_MMIO_SHM_DATA, value);
513 }
514 
b43_shm_write16(struct b43_wldev * dev,u16 routing,u16 offset,u16 value)515 void b43_shm_write16(struct b43_wldev *dev, u16 routing, u16 offset, u16 value)
516 {
517 	if (routing == B43_SHM_SHARED) {
518 		B43_WARN_ON(offset & 0x0001);
519 		if (offset & 0x0003) {
520 			/* Unaligned access */
521 			b43_shm_control_word(dev, routing, offset >> 2);
522 			b43_write16(dev, B43_MMIO_SHM_DATA_UNALIGNED, value);
523 			return;
524 		}
525 		offset >>= 2;
526 	}
527 	b43_shm_control_word(dev, routing, offset);
528 	b43_write16(dev, B43_MMIO_SHM_DATA, value);
529 }
530 
531 /* Read HostFlags */
b43_hf_read(struct b43_wldev * dev)532 u64 b43_hf_read(struct b43_wldev *dev)
533 {
534 	u64 ret;
535 
536 	ret = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFHI);
537 	ret <<= 16;
538 	ret |= b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFMI);
539 	ret <<= 16;
540 	ret |= b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFLO);
541 
542 	return ret;
543 }
544 
545 /* Write HostFlags */
b43_hf_write(struct b43_wldev * dev,u64 value)546 void b43_hf_write(struct b43_wldev *dev, u64 value)
547 {
548 	u16 lo, mi, hi;
549 
550 	lo = (value & 0x00000000FFFFULL);
551 	mi = (value & 0x0000FFFF0000ULL) >> 16;
552 	hi = (value & 0xFFFF00000000ULL) >> 32;
553 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFLO, lo);
554 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFMI, mi);
555 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFHI, hi);
556 }
557 
558 /* Read the firmware capabilities bitmask (Opensource firmware only) */
b43_fwcapa_read(struct b43_wldev * dev)559 static u16 b43_fwcapa_read(struct b43_wldev *dev)
560 {
561 	B43_WARN_ON(!dev->fw.opensource);
562 	return b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_FWCAPA);
563 }
564 
b43_tsf_read(struct b43_wldev * dev,u64 * tsf)565 void b43_tsf_read(struct b43_wldev *dev, u64 *tsf)
566 {
567 	u32 low, high;
568 
569 	B43_WARN_ON(dev->dev->core_rev < 3);
570 
571 	/* The hardware guarantees us an atomic read, if we
572 	 * read the low register first. */
573 	low = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_LOW);
574 	high = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_HIGH);
575 
576 	*tsf = high;
577 	*tsf <<= 32;
578 	*tsf |= low;
579 }
580 
b43_time_lock(struct b43_wldev * dev)581 static void b43_time_lock(struct b43_wldev *dev)
582 {
583 	b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_TBTTHOLD);
584 	/* Commit the write */
585 	b43_read32(dev, B43_MMIO_MACCTL);
586 }
587 
b43_time_unlock(struct b43_wldev * dev)588 static void b43_time_unlock(struct b43_wldev *dev)
589 {
590 	b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_TBTTHOLD, 0);
591 	/* Commit the write */
592 	b43_read32(dev, B43_MMIO_MACCTL);
593 }
594 
b43_tsf_write_locked(struct b43_wldev * dev,u64 tsf)595 static void b43_tsf_write_locked(struct b43_wldev *dev, u64 tsf)
596 {
597 	u32 low, high;
598 
599 	B43_WARN_ON(dev->dev->core_rev < 3);
600 
601 	low = tsf;
602 	high = (tsf >> 32);
603 	/* The hardware guarantees us an atomic write, if we
604 	 * write the low register first. */
605 	b43_write32(dev, B43_MMIO_REV3PLUS_TSF_LOW, low);
606 	mmiowb();
607 	b43_write32(dev, B43_MMIO_REV3PLUS_TSF_HIGH, high);
608 	mmiowb();
609 }
610 
b43_tsf_write(struct b43_wldev * dev,u64 tsf)611 void b43_tsf_write(struct b43_wldev *dev, u64 tsf)
612 {
613 	b43_time_lock(dev);
614 	b43_tsf_write_locked(dev, tsf);
615 	b43_time_unlock(dev);
616 }
617 
618 static
b43_macfilter_set(struct b43_wldev * dev,u16 offset,const u8 * mac)619 void b43_macfilter_set(struct b43_wldev *dev, u16 offset, const u8 *mac)
620 {
621 	static const u8 zero_addr[ETH_ALEN] = { 0 };
622 	u16 data;
623 
624 	if (!mac)
625 		mac = zero_addr;
626 
627 	offset |= 0x0020;
628 	b43_write16(dev, B43_MMIO_MACFILTER_CONTROL, offset);
629 
630 	data = mac[0];
631 	data |= mac[1] << 8;
632 	b43_write16(dev, B43_MMIO_MACFILTER_DATA, data);
633 	data = mac[2];
634 	data |= mac[3] << 8;
635 	b43_write16(dev, B43_MMIO_MACFILTER_DATA, data);
636 	data = mac[4];
637 	data |= mac[5] << 8;
638 	b43_write16(dev, B43_MMIO_MACFILTER_DATA, data);
639 }
640 
b43_write_mac_bssid_templates(struct b43_wldev * dev)641 static void b43_write_mac_bssid_templates(struct b43_wldev *dev)
642 {
643 	const u8 *mac;
644 	const u8 *bssid;
645 	u8 mac_bssid[ETH_ALEN * 2];
646 	int i;
647 	u32 tmp;
648 
649 	bssid = dev->wl->bssid;
650 	mac = dev->wl->mac_addr;
651 
652 	b43_macfilter_set(dev, B43_MACFILTER_BSSID, bssid);
653 
654 	memcpy(mac_bssid, mac, ETH_ALEN);
655 	memcpy(mac_bssid + ETH_ALEN, bssid, ETH_ALEN);
656 
657 	/* Write our MAC address and BSSID to template ram */
658 	for (i = 0; i < ARRAY_SIZE(mac_bssid); i += sizeof(u32)) {
659 		tmp = (u32) (mac_bssid[i + 0]);
660 		tmp |= (u32) (mac_bssid[i + 1]) << 8;
661 		tmp |= (u32) (mac_bssid[i + 2]) << 16;
662 		tmp |= (u32) (mac_bssid[i + 3]) << 24;
663 		b43_ram_write(dev, 0x20 + i, tmp);
664 	}
665 }
666 
b43_upload_card_macaddress(struct b43_wldev * dev)667 static void b43_upload_card_macaddress(struct b43_wldev *dev)
668 {
669 	b43_write_mac_bssid_templates(dev);
670 	b43_macfilter_set(dev, B43_MACFILTER_SELF, dev->wl->mac_addr);
671 }
672 
b43_set_slot_time(struct b43_wldev * dev,u16 slot_time)673 static void b43_set_slot_time(struct b43_wldev *dev, u16 slot_time)
674 {
675 	/* slot_time is in usec. */
676 	/* This test used to exit for all but a G PHY. */
677 	if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ)
678 		return;
679 	b43_write16(dev, B43_MMIO_IFSSLOT, 510 + slot_time);
680 	/* Shared memory location 0x0010 is the slot time and should be
681 	 * set to slot_time; however, this register is initially 0 and changing
682 	 * the value adversely affects the transmit rate for BCM4311
683 	 * devices. Until this behavior is unterstood, delete this step
684 	 *
685 	 * b43_shm_write16(dev, B43_SHM_SHARED, 0x0010, slot_time);
686 	 */
687 }
688 
b43_short_slot_timing_enable(struct b43_wldev * dev)689 static void b43_short_slot_timing_enable(struct b43_wldev *dev)
690 {
691 	b43_set_slot_time(dev, 9);
692 }
693 
b43_short_slot_timing_disable(struct b43_wldev * dev)694 static void b43_short_slot_timing_disable(struct b43_wldev *dev)
695 {
696 	b43_set_slot_time(dev, 20);
697 }
698 
699 /* DummyTransmission function, as documented on
700  * http://bcm-v4.sipsolutions.net/802.11/DummyTransmission
701  */
b43_dummy_transmission(struct b43_wldev * dev,bool ofdm,bool pa_on)702 void b43_dummy_transmission(struct b43_wldev *dev, bool ofdm, bool pa_on)
703 {
704 	struct b43_phy *phy = &dev->phy;
705 	unsigned int i, max_loop;
706 	u16 value;
707 	u32 buffer[5] = {
708 		0x00000000,
709 		0x00D40000,
710 		0x00000000,
711 		0x01000000,
712 		0x00000000,
713 	};
714 
715 	if (ofdm) {
716 		max_loop = 0x1E;
717 		buffer[0] = 0x000201CC;
718 	} else {
719 		max_loop = 0xFA;
720 		buffer[0] = 0x000B846E;
721 	}
722 
723 	for (i = 0; i < 5; i++)
724 		b43_ram_write(dev, i * 4, buffer[i]);
725 
726 	b43_write16(dev, B43_MMIO_XMTSEL, 0x0000);
727 
728 	if (dev->dev->core_rev < 11)
729 		b43_write16(dev, B43_MMIO_WEPCTL, 0x0000);
730 	else
731 		b43_write16(dev, B43_MMIO_WEPCTL, 0x0100);
732 
733 	value = (ofdm ? 0x41 : 0x40);
734 	b43_write16(dev, B43_MMIO_TXE0_PHYCTL, value);
735 	if (phy->type == B43_PHYTYPE_N || phy->type == B43_PHYTYPE_LP ||
736 	    phy->type == B43_PHYTYPE_LCN)
737 		b43_write16(dev, B43_MMIO_TXE0_PHYCTL1, 0x1A02);
738 
739 	b43_write16(dev, B43_MMIO_TXE0_WM_0, 0x0000);
740 	b43_write16(dev, B43_MMIO_TXE0_WM_1, 0x0000);
741 
742 	b43_write16(dev, B43_MMIO_XMTTPLATETXPTR, 0x0000);
743 	b43_write16(dev, B43_MMIO_XMTTXCNT, 0x0014);
744 	b43_write16(dev, B43_MMIO_XMTSEL, 0x0826);
745 	b43_write16(dev, B43_MMIO_TXE0_CTL, 0x0000);
746 
747 	if (!pa_on && phy->type == B43_PHYTYPE_N)
748 		; /*b43_nphy_pa_override(dev, false) */
749 
750 	switch (phy->type) {
751 	case B43_PHYTYPE_N:
752 	case B43_PHYTYPE_LCN:
753 		b43_write16(dev, B43_MMIO_TXE0_AUX, 0x00D0);
754 		break;
755 	case B43_PHYTYPE_LP:
756 		b43_write16(dev, B43_MMIO_TXE0_AUX, 0x0050);
757 		break;
758 	default:
759 		b43_write16(dev, B43_MMIO_TXE0_AUX, 0x0030);
760 	}
761 	b43_read16(dev, B43_MMIO_TXE0_AUX);
762 
763 	if (phy->radio_ver == 0x2050 && phy->radio_rev <= 0x5)
764 		b43_radio_write16(dev, 0x0051, 0x0017);
765 	for (i = 0x00; i < max_loop; i++) {
766 		value = b43_read16(dev, B43_MMIO_TXE0_STATUS);
767 		if (value & 0x0080)
768 			break;
769 		udelay(10);
770 	}
771 	for (i = 0x00; i < 0x0A; i++) {
772 		value = b43_read16(dev, B43_MMIO_TXE0_STATUS);
773 		if (value & 0x0400)
774 			break;
775 		udelay(10);
776 	}
777 	for (i = 0x00; i < 0x19; i++) {
778 		value = b43_read16(dev, B43_MMIO_IFSSTAT);
779 		if (!(value & 0x0100))
780 			break;
781 		udelay(10);
782 	}
783 	if (phy->radio_ver == 0x2050 && phy->radio_rev <= 0x5)
784 		b43_radio_write16(dev, 0x0051, 0x0037);
785 }
786 
key_write(struct b43_wldev * dev,u8 index,u8 algorithm,const u8 * key)787 static void key_write(struct b43_wldev *dev,
788 		      u8 index, u8 algorithm, const u8 *key)
789 {
790 	unsigned int i;
791 	u32 offset;
792 	u16 value;
793 	u16 kidx;
794 
795 	/* Key index/algo block */
796 	kidx = b43_kidx_to_fw(dev, index);
797 	value = ((kidx << 4) | algorithm);
798 	b43_shm_write16(dev, B43_SHM_SHARED,
799 			B43_SHM_SH_KEYIDXBLOCK + (kidx * 2), value);
800 
801 	/* Write the key to the Key Table Pointer offset */
802 	offset = dev->ktp + (index * B43_SEC_KEYSIZE);
803 	for (i = 0; i < B43_SEC_KEYSIZE; i += 2) {
804 		value = key[i];
805 		value |= (u16) (key[i + 1]) << 8;
806 		b43_shm_write16(dev, B43_SHM_SHARED, offset + i, value);
807 	}
808 }
809 
keymac_write(struct b43_wldev * dev,u8 index,const u8 * addr)810 static void keymac_write(struct b43_wldev *dev, u8 index, const u8 *addr)
811 {
812 	u32 addrtmp[2] = { 0, 0, };
813 	u8 pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
814 
815 	if (b43_new_kidx_api(dev))
816 		pairwise_keys_start = B43_NR_GROUP_KEYS;
817 
818 	B43_WARN_ON(index < pairwise_keys_start);
819 	/* We have four default TX keys and possibly four default RX keys.
820 	 * Physical mac 0 is mapped to physical key 4 or 8, depending
821 	 * on the firmware version.
822 	 * So we must adjust the index here.
823 	 */
824 	index -= pairwise_keys_start;
825 	B43_WARN_ON(index >= B43_NR_PAIRWISE_KEYS);
826 
827 	if (addr) {
828 		addrtmp[0] = addr[0];
829 		addrtmp[0] |= ((u32) (addr[1]) << 8);
830 		addrtmp[0] |= ((u32) (addr[2]) << 16);
831 		addrtmp[0] |= ((u32) (addr[3]) << 24);
832 		addrtmp[1] = addr[4];
833 		addrtmp[1] |= ((u32) (addr[5]) << 8);
834 	}
835 
836 	/* Receive match transmitter address (RCMTA) mechanism */
837 	b43_shm_write32(dev, B43_SHM_RCMTA,
838 			(index * 2) + 0, addrtmp[0]);
839 	b43_shm_write16(dev, B43_SHM_RCMTA,
840 			(index * 2) + 1, addrtmp[1]);
841 }
842 
843 /* The ucode will use phase1 key with TEK key to decrypt rx packets.
844  * When a packet is received, the iv32 is checked.
845  * - if it doesn't the packet is returned without modification (and software
846  *   decryption can be done). That's what happen when iv16 wrap.
847  * - if it does, the rc4 key is computed, and decryption is tried.
848  *   Either it will success and B43_RX_MAC_DEC is returned,
849  *   either it fails and B43_RX_MAC_DEC|B43_RX_MAC_DECERR is returned
850  *   and the packet is not usable (it got modified by the ucode).
851  * So in order to never have B43_RX_MAC_DECERR, we should provide
852  * a iv32 and phase1key that match. Because we drop packets in case of
853  * B43_RX_MAC_DECERR, if we have a correct iv32 but a wrong phase1key, all
854  * packets will be lost without higher layer knowing (ie no resync possible
855  * until next wrap).
856  *
857  * NOTE : this should support 50 key like RCMTA because
858  * (B43_SHM_SH_KEYIDXBLOCK - B43_SHM_SH_TKIPTSCTTAK)/14 = 50
859  */
rx_tkip_phase1_write(struct b43_wldev * dev,u8 index,u32 iv32,u16 * phase1key)860 static void rx_tkip_phase1_write(struct b43_wldev *dev, u8 index, u32 iv32,
861 		u16 *phase1key)
862 {
863 	unsigned int i;
864 	u32 offset;
865 	u8 pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
866 
867 	if (!modparam_hwtkip)
868 		return;
869 
870 	if (b43_new_kidx_api(dev))
871 		pairwise_keys_start = B43_NR_GROUP_KEYS;
872 
873 	B43_WARN_ON(index < pairwise_keys_start);
874 	/* We have four default TX keys and possibly four default RX keys.
875 	 * Physical mac 0 is mapped to physical key 4 or 8, depending
876 	 * on the firmware version.
877 	 * So we must adjust the index here.
878 	 */
879 	index -= pairwise_keys_start;
880 	B43_WARN_ON(index >= B43_NR_PAIRWISE_KEYS);
881 
882 	if (b43_debug(dev, B43_DBG_KEYS)) {
883 		b43dbg(dev->wl, "rx_tkip_phase1_write : idx 0x%x, iv32 0x%x\n",
884 				index, iv32);
885 	}
886 	/* Write the key to the  RX tkip shared mem */
887 	offset = B43_SHM_SH_TKIPTSCTTAK + index * (10 + 4);
888 	for (i = 0; i < 10; i += 2) {
889 		b43_shm_write16(dev, B43_SHM_SHARED, offset + i,
890 				phase1key ? phase1key[i / 2] : 0);
891 	}
892 	b43_shm_write16(dev, B43_SHM_SHARED, offset + i, iv32);
893 	b43_shm_write16(dev, B43_SHM_SHARED, offset + i + 2, iv32 >> 16);
894 }
895 
b43_op_update_tkip_key(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_key_conf * keyconf,struct ieee80211_sta * sta,u32 iv32,u16 * phase1key)896 static void b43_op_update_tkip_key(struct ieee80211_hw *hw,
897 				   struct ieee80211_vif *vif,
898 				   struct ieee80211_key_conf *keyconf,
899 				   struct ieee80211_sta *sta,
900 				   u32 iv32, u16 *phase1key)
901 {
902 	struct b43_wl *wl = hw_to_b43_wl(hw);
903 	struct b43_wldev *dev;
904 	int index = keyconf->hw_key_idx;
905 
906 	if (B43_WARN_ON(!modparam_hwtkip))
907 		return;
908 
909 	/* This is only called from the RX path through mac80211, where
910 	 * our mutex is already locked. */
911 	B43_WARN_ON(!mutex_is_locked(&wl->mutex));
912 	dev = wl->current_dev;
913 	B43_WARN_ON(!dev || b43_status(dev) < B43_STAT_INITIALIZED);
914 
915 	keymac_write(dev, index, NULL);	/* First zero out mac to avoid race */
916 
917 	rx_tkip_phase1_write(dev, index, iv32, phase1key);
918 	/* only pairwise TKIP keys are supported right now */
919 	if (WARN_ON(!sta))
920 		return;
921 	keymac_write(dev, index, sta->addr);
922 }
923 
do_key_write(struct b43_wldev * dev,u8 index,u8 algorithm,const u8 * key,size_t key_len,const u8 * mac_addr)924 static void do_key_write(struct b43_wldev *dev,
925 			 u8 index, u8 algorithm,
926 			 const u8 *key, size_t key_len, const u8 *mac_addr)
927 {
928 	u8 buf[B43_SEC_KEYSIZE] = { 0, };
929 	u8 pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
930 
931 	if (b43_new_kidx_api(dev))
932 		pairwise_keys_start = B43_NR_GROUP_KEYS;
933 
934 	B43_WARN_ON(index >= ARRAY_SIZE(dev->key));
935 	B43_WARN_ON(key_len > B43_SEC_KEYSIZE);
936 
937 	if (index >= pairwise_keys_start)
938 		keymac_write(dev, index, NULL);	/* First zero out mac. */
939 	if (algorithm == B43_SEC_ALGO_TKIP) {
940 		/*
941 		 * We should provide an initial iv32, phase1key pair.
942 		 * We could start with iv32=0 and compute the corresponding
943 		 * phase1key, but this means calling ieee80211_get_tkip_key
944 		 * with a fake skb (or export other tkip function).
945 		 * Because we are lazy we hope iv32 won't start with
946 		 * 0xffffffff and let's b43_op_update_tkip_key provide a
947 		 * correct pair.
948 		 */
949 		rx_tkip_phase1_write(dev, index, 0xffffffff, (u16*)buf);
950 	} else if (index >= pairwise_keys_start) /* clear it */
951 		rx_tkip_phase1_write(dev, index, 0, NULL);
952 	if (key)
953 		memcpy(buf, key, key_len);
954 	key_write(dev, index, algorithm, buf);
955 	if (index >= pairwise_keys_start)
956 		keymac_write(dev, index, mac_addr);
957 
958 	dev->key[index].algorithm = algorithm;
959 }
960 
b43_key_write(struct b43_wldev * dev,int index,u8 algorithm,const u8 * key,size_t key_len,const u8 * mac_addr,struct ieee80211_key_conf * keyconf)961 static int b43_key_write(struct b43_wldev *dev,
962 			 int index, u8 algorithm,
963 			 const u8 *key, size_t key_len,
964 			 const u8 *mac_addr,
965 			 struct ieee80211_key_conf *keyconf)
966 {
967 	int i;
968 	int pairwise_keys_start;
969 
970 	/* For ALG_TKIP the key is encoded as a 256-bit (32 byte) data block:
971 	 * 	- Temporal Encryption Key (128 bits)
972 	 * 	- Temporal Authenticator Tx MIC Key (64 bits)
973 	 * 	- Temporal Authenticator Rx MIC Key (64 bits)
974 	 *
975 	 * 	Hardware only store TEK
976 	 */
977 	if (algorithm == B43_SEC_ALGO_TKIP && key_len == 32)
978 		key_len = 16;
979 	if (key_len > B43_SEC_KEYSIZE)
980 		return -EINVAL;
981 	for (i = 0; i < ARRAY_SIZE(dev->key); i++) {
982 		/* Check that we don't already have this key. */
983 		B43_WARN_ON(dev->key[i].keyconf == keyconf);
984 	}
985 	if (index < 0) {
986 		/* Pairwise key. Get an empty slot for the key. */
987 		if (b43_new_kidx_api(dev))
988 			pairwise_keys_start = B43_NR_GROUP_KEYS;
989 		else
990 			pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
991 		for (i = pairwise_keys_start;
992 		     i < pairwise_keys_start + B43_NR_PAIRWISE_KEYS;
993 		     i++) {
994 			B43_WARN_ON(i >= ARRAY_SIZE(dev->key));
995 			if (!dev->key[i].keyconf) {
996 				/* found empty */
997 				index = i;
998 				break;
999 			}
1000 		}
1001 		if (index < 0) {
1002 			b43warn(dev->wl, "Out of hardware key memory\n");
1003 			return -ENOSPC;
1004 		}
1005 	} else
1006 		B43_WARN_ON(index > 3);
1007 
1008 	do_key_write(dev, index, algorithm, key, key_len, mac_addr);
1009 	if ((index <= 3) && !b43_new_kidx_api(dev)) {
1010 		/* Default RX key */
1011 		B43_WARN_ON(mac_addr);
1012 		do_key_write(dev, index + 4, algorithm, key, key_len, NULL);
1013 	}
1014 	keyconf->hw_key_idx = index;
1015 	dev->key[index].keyconf = keyconf;
1016 
1017 	return 0;
1018 }
1019 
b43_key_clear(struct b43_wldev * dev,int index)1020 static int b43_key_clear(struct b43_wldev *dev, int index)
1021 {
1022 	if (B43_WARN_ON((index < 0) || (index >= ARRAY_SIZE(dev->key))))
1023 		return -EINVAL;
1024 	do_key_write(dev, index, B43_SEC_ALGO_NONE,
1025 		     NULL, B43_SEC_KEYSIZE, NULL);
1026 	if ((index <= 3) && !b43_new_kidx_api(dev)) {
1027 		do_key_write(dev, index + 4, B43_SEC_ALGO_NONE,
1028 			     NULL, B43_SEC_KEYSIZE, NULL);
1029 	}
1030 	dev->key[index].keyconf = NULL;
1031 
1032 	return 0;
1033 }
1034 
b43_clear_keys(struct b43_wldev * dev)1035 static void b43_clear_keys(struct b43_wldev *dev)
1036 {
1037 	int i, count;
1038 
1039 	if (b43_new_kidx_api(dev))
1040 		count = B43_NR_GROUP_KEYS + B43_NR_PAIRWISE_KEYS;
1041 	else
1042 		count = B43_NR_GROUP_KEYS * 2 + B43_NR_PAIRWISE_KEYS;
1043 	for (i = 0; i < count; i++)
1044 		b43_key_clear(dev, i);
1045 }
1046 
b43_dump_keymemory(struct b43_wldev * dev)1047 static void b43_dump_keymemory(struct b43_wldev *dev)
1048 {
1049 	unsigned int i, index, count, offset, pairwise_keys_start;
1050 	u8 mac[ETH_ALEN];
1051 	u16 algo;
1052 	u32 rcmta0;
1053 	u16 rcmta1;
1054 	u64 hf;
1055 	struct b43_key *key;
1056 
1057 	if (!b43_debug(dev, B43_DBG_KEYS))
1058 		return;
1059 
1060 	hf = b43_hf_read(dev);
1061 	b43dbg(dev->wl, "Hardware key memory dump:  USEDEFKEYS=%u\n",
1062 	       !!(hf & B43_HF_USEDEFKEYS));
1063 	if (b43_new_kidx_api(dev)) {
1064 		pairwise_keys_start = B43_NR_GROUP_KEYS;
1065 		count = B43_NR_GROUP_KEYS + B43_NR_PAIRWISE_KEYS;
1066 	} else {
1067 		pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
1068 		count = B43_NR_GROUP_KEYS * 2 + B43_NR_PAIRWISE_KEYS;
1069 	}
1070 	for (index = 0; index < count; index++) {
1071 		key = &(dev->key[index]);
1072 		printk(KERN_DEBUG "Key slot %02u: %s",
1073 		       index, (key->keyconf == NULL) ? " " : "*");
1074 		offset = dev->ktp + (index * B43_SEC_KEYSIZE);
1075 		for (i = 0; i < B43_SEC_KEYSIZE; i += 2) {
1076 			u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, offset + i);
1077 			printk("%02X%02X", (tmp & 0xFF), ((tmp >> 8) & 0xFF));
1078 		}
1079 
1080 		algo = b43_shm_read16(dev, B43_SHM_SHARED,
1081 				      B43_SHM_SH_KEYIDXBLOCK + (index * 2));
1082 		printk("   Algo: %04X/%02X", algo, key->algorithm);
1083 
1084 		if (index >= pairwise_keys_start) {
1085 			if (key->algorithm == B43_SEC_ALGO_TKIP) {
1086 				printk("   TKIP: ");
1087 				offset = B43_SHM_SH_TKIPTSCTTAK + (index - 4) * (10 + 4);
1088 				for (i = 0; i < 14; i += 2) {
1089 					u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, offset + i);
1090 					printk("%02X%02X", (tmp & 0xFF), ((tmp >> 8) & 0xFF));
1091 				}
1092 			}
1093 			rcmta0 = b43_shm_read32(dev, B43_SHM_RCMTA,
1094 						((index - pairwise_keys_start) * 2) + 0);
1095 			rcmta1 = b43_shm_read16(dev, B43_SHM_RCMTA,
1096 						((index - pairwise_keys_start) * 2) + 1);
1097 			*((__le32 *)(&mac[0])) = cpu_to_le32(rcmta0);
1098 			*((__le16 *)(&mac[4])) = cpu_to_le16(rcmta1);
1099 			printk("   MAC: %pM", mac);
1100 		} else
1101 			printk("   DEFAULT KEY");
1102 		printk("\n");
1103 	}
1104 }
1105 
b43_power_saving_ctl_bits(struct b43_wldev * dev,unsigned int ps_flags)1106 void b43_power_saving_ctl_bits(struct b43_wldev *dev, unsigned int ps_flags)
1107 {
1108 	u32 macctl;
1109 	u16 ucstat;
1110 	bool hwps;
1111 	bool awake;
1112 	int i;
1113 
1114 	B43_WARN_ON((ps_flags & B43_PS_ENABLED) &&
1115 		    (ps_flags & B43_PS_DISABLED));
1116 	B43_WARN_ON((ps_flags & B43_PS_AWAKE) && (ps_flags & B43_PS_ASLEEP));
1117 
1118 	if (ps_flags & B43_PS_ENABLED) {
1119 		hwps = true;
1120 	} else if (ps_flags & B43_PS_DISABLED) {
1121 		hwps = false;
1122 	} else {
1123 		//TODO: If powersave is not off and FIXME is not set and we are not in adhoc
1124 		//      and thus is not an AP and we are associated, set bit 25
1125 	}
1126 	if (ps_flags & B43_PS_AWAKE) {
1127 		awake = true;
1128 	} else if (ps_flags & B43_PS_ASLEEP) {
1129 		awake = false;
1130 	} else {
1131 		//TODO: If the device is awake or this is an AP, or we are scanning, or FIXME,
1132 		//      or we are associated, or FIXME, or the latest PS-Poll packet sent was
1133 		//      successful, set bit26
1134 	}
1135 
1136 /* FIXME: For now we force awake-on and hwps-off */
1137 	hwps = false;
1138 	awake = true;
1139 
1140 	macctl = b43_read32(dev, B43_MMIO_MACCTL);
1141 	if (hwps)
1142 		macctl |= B43_MACCTL_HWPS;
1143 	else
1144 		macctl &= ~B43_MACCTL_HWPS;
1145 	if (awake)
1146 		macctl |= B43_MACCTL_AWAKE;
1147 	else
1148 		macctl &= ~B43_MACCTL_AWAKE;
1149 	b43_write32(dev, B43_MMIO_MACCTL, macctl);
1150 	/* Commit write */
1151 	b43_read32(dev, B43_MMIO_MACCTL);
1152 	if (awake && dev->dev->core_rev >= 5) {
1153 		/* Wait for the microcode to wake up. */
1154 		for (i = 0; i < 100; i++) {
1155 			ucstat = b43_shm_read16(dev, B43_SHM_SHARED,
1156 						B43_SHM_SH_UCODESTAT);
1157 			if (ucstat != B43_SHM_SH_UCODESTAT_SLEEP)
1158 				break;
1159 			udelay(10);
1160 		}
1161 	}
1162 }
1163 
1164 #ifdef CONFIG_B43_BCMA
b43_bcma_phy_reset(struct b43_wldev * dev)1165 static void b43_bcma_phy_reset(struct b43_wldev *dev)
1166 {
1167 	u32 flags;
1168 
1169 	/* Put PHY into reset */
1170 	flags = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
1171 	flags |= B43_BCMA_IOCTL_PHY_RESET;
1172 	flags |= B43_BCMA_IOCTL_PHY_BW_20MHZ; /* Make 20 MHz def */
1173 	bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags);
1174 	udelay(2);
1175 
1176 	/* Take PHY out of reset */
1177 	flags = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
1178 	flags &= ~B43_BCMA_IOCTL_PHY_RESET;
1179 	flags |= BCMA_IOCTL_FGC;
1180 	bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags);
1181 	udelay(1);
1182 
1183 	/* Do not force clock anymore */
1184 	flags = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
1185 	flags &= ~BCMA_IOCTL_FGC;
1186 	bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags);
1187 	udelay(1);
1188 }
1189 
b43_bcma_wireless_core_reset(struct b43_wldev * dev,bool gmode)1190 static void b43_bcma_wireless_core_reset(struct b43_wldev *dev, bool gmode)
1191 {
1192 	b43_device_enable(dev, B43_BCMA_IOCTL_PHY_CLKEN);
1193 	bcma_core_set_clockmode(dev->dev->bdev, BCMA_CLKMODE_FAST);
1194 	b43_bcma_phy_reset(dev);
1195 	bcma_core_pll_ctl(dev->dev->bdev, 0x300, 0x3000000, true);
1196 }
1197 #endif
1198 
b43_ssb_wireless_core_reset(struct b43_wldev * dev,bool gmode)1199 static void b43_ssb_wireless_core_reset(struct b43_wldev *dev, bool gmode)
1200 {
1201 	struct ssb_device *sdev = dev->dev->sdev;
1202 	u32 tmslow;
1203 	u32 flags = 0;
1204 
1205 	if (gmode)
1206 		flags |= B43_TMSLOW_GMODE;
1207 	flags |= B43_TMSLOW_PHYCLKEN;
1208 	flags |= B43_TMSLOW_PHYRESET;
1209 	if (dev->phy.type == B43_PHYTYPE_N)
1210 		flags |= B43_TMSLOW_PHY_BANDWIDTH_20MHZ; /* Make 20 MHz def */
1211 	b43_device_enable(dev, flags);
1212 	msleep(2);		/* Wait for the PLL to turn on. */
1213 
1214 	/* Now take the PHY out of Reset again */
1215 	tmslow = ssb_read32(sdev, SSB_TMSLOW);
1216 	tmslow |= SSB_TMSLOW_FGC;
1217 	tmslow &= ~B43_TMSLOW_PHYRESET;
1218 	ssb_write32(sdev, SSB_TMSLOW, tmslow);
1219 	ssb_read32(sdev, SSB_TMSLOW);	/* flush */
1220 	msleep(1);
1221 	tmslow &= ~SSB_TMSLOW_FGC;
1222 	ssb_write32(sdev, SSB_TMSLOW, tmslow);
1223 	ssb_read32(sdev, SSB_TMSLOW);	/* flush */
1224 	msleep(1);
1225 }
1226 
b43_wireless_core_reset(struct b43_wldev * dev,bool gmode)1227 void b43_wireless_core_reset(struct b43_wldev *dev, bool gmode)
1228 {
1229 	u32 macctl;
1230 
1231 	switch (dev->dev->bus_type) {
1232 #ifdef CONFIG_B43_BCMA
1233 	case B43_BUS_BCMA:
1234 		b43_bcma_wireless_core_reset(dev, gmode);
1235 		break;
1236 #endif
1237 #ifdef CONFIG_B43_SSB
1238 	case B43_BUS_SSB:
1239 		b43_ssb_wireless_core_reset(dev, gmode);
1240 		break;
1241 #endif
1242 	}
1243 
1244 	/* Turn Analog ON, but only if we already know the PHY-type.
1245 	 * This protects against very early setup where we don't know the
1246 	 * PHY-type, yet. wireless_core_reset will be called once again later,
1247 	 * when we know the PHY-type. */
1248 	if (dev->phy.ops)
1249 		dev->phy.ops->switch_analog(dev, 1);
1250 
1251 	macctl = b43_read32(dev, B43_MMIO_MACCTL);
1252 	macctl &= ~B43_MACCTL_GMODE;
1253 	if (gmode)
1254 		macctl |= B43_MACCTL_GMODE;
1255 	macctl |= B43_MACCTL_IHR_ENABLED;
1256 	b43_write32(dev, B43_MMIO_MACCTL, macctl);
1257 }
1258 
handle_irq_transmit_status(struct b43_wldev * dev)1259 static void handle_irq_transmit_status(struct b43_wldev *dev)
1260 {
1261 	u32 v0, v1;
1262 	u16 tmp;
1263 	struct b43_txstatus stat;
1264 
1265 	while (1) {
1266 		v0 = b43_read32(dev, B43_MMIO_XMITSTAT_0);
1267 		if (!(v0 & 0x00000001))
1268 			break;
1269 		v1 = b43_read32(dev, B43_MMIO_XMITSTAT_1);
1270 
1271 		stat.cookie = (v0 >> 16);
1272 		stat.seq = (v1 & 0x0000FFFF);
1273 		stat.phy_stat = ((v1 & 0x00FF0000) >> 16);
1274 		tmp = (v0 & 0x0000FFFF);
1275 		stat.frame_count = ((tmp & 0xF000) >> 12);
1276 		stat.rts_count = ((tmp & 0x0F00) >> 8);
1277 		stat.supp_reason = ((tmp & 0x001C) >> 2);
1278 		stat.pm_indicated = !!(tmp & 0x0080);
1279 		stat.intermediate = !!(tmp & 0x0040);
1280 		stat.for_ampdu = !!(tmp & 0x0020);
1281 		stat.acked = !!(tmp & 0x0002);
1282 
1283 		b43_handle_txstatus(dev, &stat);
1284 	}
1285 }
1286 
drain_txstatus_queue(struct b43_wldev * dev)1287 static void drain_txstatus_queue(struct b43_wldev *dev)
1288 {
1289 	u32 dummy;
1290 
1291 	if (dev->dev->core_rev < 5)
1292 		return;
1293 	/* Read all entries from the microcode TXstatus FIFO
1294 	 * and throw them away.
1295 	 */
1296 	while (1) {
1297 		dummy = b43_read32(dev, B43_MMIO_XMITSTAT_0);
1298 		if (!(dummy & 0x00000001))
1299 			break;
1300 		dummy = b43_read32(dev, B43_MMIO_XMITSTAT_1);
1301 	}
1302 }
1303 
b43_jssi_read(struct b43_wldev * dev)1304 static u32 b43_jssi_read(struct b43_wldev *dev)
1305 {
1306 	u32 val = 0;
1307 
1308 	val = b43_shm_read16(dev, B43_SHM_SHARED, 0x08A);
1309 	val <<= 16;
1310 	val |= b43_shm_read16(dev, B43_SHM_SHARED, 0x088);
1311 
1312 	return val;
1313 }
1314 
b43_jssi_write(struct b43_wldev * dev,u32 jssi)1315 static void b43_jssi_write(struct b43_wldev *dev, u32 jssi)
1316 {
1317 	b43_shm_write16(dev, B43_SHM_SHARED, 0x088, (jssi & 0x0000FFFF));
1318 	b43_shm_write16(dev, B43_SHM_SHARED, 0x08A, (jssi & 0xFFFF0000) >> 16);
1319 }
1320 
b43_generate_noise_sample(struct b43_wldev * dev)1321 static void b43_generate_noise_sample(struct b43_wldev *dev)
1322 {
1323 	b43_jssi_write(dev, 0x7F7F7F7F);
1324 	b43_write32(dev, B43_MMIO_MACCMD,
1325 		    b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE);
1326 }
1327 
b43_calculate_link_quality(struct b43_wldev * dev)1328 static void b43_calculate_link_quality(struct b43_wldev *dev)
1329 {
1330 	/* Top half of Link Quality calculation. */
1331 
1332 	if (dev->phy.type != B43_PHYTYPE_G)
1333 		return;
1334 	if (dev->noisecalc.calculation_running)
1335 		return;
1336 	dev->noisecalc.calculation_running = true;
1337 	dev->noisecalc.nr_samples = 0;
1338 
1339 	b43_generate_noise_sample(dev);
1340 }
1341 
handle_irq_noise(struct b43_wldev * dev)1342 static void handle_irq_noise(struct b43_wldev *dev)
1343 {
1344 	struct b43_phy_g *phy = dev->phy.g;
1345 	u16 tmp;
1346 	u8 noise[4];
1347 	u8 i, j;
1348 	s32 average;
1349 
1350 	/* Bottom half of Link Quality calculation. */
1351 
1352 	if (dev->phy.type != B43_PHYTYPE_G)
1353 		return;
1354 
1355 	/* Possible race condition: It might be possible that the user
1356 	 * changed to a different channel in the meantime since we
1357 	 * started the calculation. We ignore that fact, since it's
1358 	 * not really that much of a problem. The background noise is
1359 	 * an estimation only anyway. Slightly wrong results will get damped
1360 	 * by the averaging of the 8 sample rounds. Additionally the
1361 	 * value is shortlived. So it will be replaced by the next noise
1362 	 * calculation round soon. */
1363 
1364 	B43_WARN_ON(!dev->noisecalc.calculation_running);
1365 	*((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev));
1366 	if (noise[0] == 0x7F || noise[1] == 0x7F ||
1367 	    noise[2] == 0x7F || noise[3] == 0x7F)
1368 		goto generate_new;
1369 
1370 	/* Get the noise samples. */
1371 	B43_WARN_ON(dev->noisecalc.nr_samples >= 8);
1372 	i = dev->noisecalc.nr_samples;
1373 	noise[0] = clamp_val(noise[0], 0, ARRAY_SIZE(phy->nrssi_lt) - 1);
1374 	noise[1] = clamp_val(noise[1], 0, ARRAY_SIZE(phy->nrssi_lt) - 1);
1375 	noise[2] = clamp_val(noise[2], 0, ARRAY_SIZE(phy->nrssi_lt) - 1);
1376 	noise[3] = clamp_val(noise[3], 0, ARRAY_SIZE(phy->nrssi_lt) - 1);
1377 	dev->noisecalc.samples[i][0] = phy->nrssi_lt[noise[0]];
1378 	dev->noisecalc.samples[i][1] = phy->nrssi_lt[noise[1]];
1379 	dev->noisecalc.samples[i][2] = phy->nrssi_lt[noise[2]];
1380 	dev->noisecalc.samples[i][3] = phy->nrssi_lt[noise[3]];
1381 	dev->noisecalc.nr_samples++;
1382 	if (dev->noisecalc.nr_samples == 8) {
1383 		/* Calculate the Link Quality by the noise samples. */
1384 		average = 0;
1385 		for (i = 0; i < 8; i++) {
1386 			for (j = 0; j < 4; j++)
1387 				average += dev->noisecalc.samples[i][j];
1388 		}
1389 		average /= (8 * 4);
1390 		average *= 125;
1391 		average += 64;
1392 		average /= 128;
1393 		tmp = b43_shm_read16(dev, B43_SHM_SHARED, 0x40C);
1394 		tmp = (tmp / 128) & 0x1F;
1395 		if (tmp >= 8)
1396 			average += 2;
1397 		else
1398 			average -= 25;
1399 		if (tmp == 8)
1400 			average -= 72;
1401 		else
1402 			average -= 48;
1403 
1404 		dev->stats.link_noise = average;
1405 		dev->noisecalc.calculation_running = false;
1406 		return;
1407 	}
1408 generate_new:
1409 	b43_generate_noise_sample(dev);
1410 }
1411 
handle_irq_tbtt_indication(struct b43_wldev * dev)1412 static void handle_irq_tbtt_indication(struct b43_wldev *dev)
1413 {
1414 	if (b43_is_mode(dev->wl, NL80211_IFTYPE_AP)) {
1415 		///TODO: PS TBTT
1416 	} else {
1417 		if (1 /*FIXME: the last PSpoll frame was sent successfully */ )
1418 			b43_power_saving_ctl_bits(dev, 0);
1419 	}
1420 	if (b43_is_mode(dev->wl, NL80211_IFTYPE_ADHOC))
1421 		dev->dfq_valid = true;
1422 }
1423 
handle_irq_atim_end(struct b43_wldev * dev)1424 static void handle_irq_atim_end(struct b43_wldev *dev)
1425 {
1426 	if (dev->dfq_valid) {
1427 		b43_write32(dev, B43_MMIO_MACCMD,
1428 			    b43_read32(dev, B43_MMIO_MACCMD)
1429 			    | B43_MACCMD_DFQ_VALID);
1430 		dev->dfq_valid = false;
1431 	}
1432 }
1433 
handle_irq_pmq(struct b43_wldev * dev)1434 static void handle_irq_pmq(struct b43_wldev *dev)
1435 {
1436 	u32 tmp;
1437 
1438 	//TODO: AP mode.
1439 
1440 	while (1) {
1441 		tmp = b43_read32(dev, B43_MMIO_PS_STATUS);
1442 		if (!(tmp & 0x00000008))
1443 			break;
1444 	}
1445 	/* 16bit write is odd, but correct. */
1446 	b43_write16(dev, B43_MMIO_PS_STATUS, 0x0002);
1447 }
1448 
b43_write_template_common(struct b43_wldev * dev,const u8 * data,u16 size,u16 ram_offset,u16 shm_size_offset,u8 rate)1449 static void b43_write_template_common(struct b43_wldev *dev,
1450 				      const u8 *data, u16 size,
1451 				      u16 ram_offset,
1452 				      u16 shm_size_offset, u8 rate)
1453 {
1454 	u32 i, tmp;
1455 	struct b43_plcp_hdr4 plcp;
1456 
1457 	plcp.data = 0;
1458 	b43_generate_plcp_hdr(&plcp, size + FCS_LEN, rate);
1459 	b43_ram_write(dev, ram_offset, le32_to_cpu(plcp.data));
1460 	ram_offset += sizeof(u32);
1461 	/* The PLCP is 6 bytes long, but we only wrote 4 bytes, yet.
1462 	 * So leave the first two bytes of the next write blank.
1463 	 */
1464 	tmp = (u32) (data[0]) << 16;
1465 	tmp |= (u32) (data[1]) << 24;
1466 	b43_ram_write(dev, ram_offset, tmp);
1467 	ram_offset += sizeof(u32);
1468 	for (i = 2; i < size; i += sizeof(u32)) {
1469 		tmp = (u32) (data[i + 0]);
1470 		if (i + 1 < size)
1471 			tmp |= (u32) (data[i + 1]) << 8;
1472 		if (i + 2 < size)
1473 			tmp |= (u32) (data[i + 2]) << 16;
1474 		if (i + 3 < size)
1475 			tmp |= (u32) (data[i + 3]) << 24;
1476 		b43_ram_write(dev, ram_offset + i - 2, tmp);
1477 	}
1478 	b43_shm_write16(dev, B43_SHM_SHARED, shm_size_offset,
1479 			size + sizeof(struct b43_plcp_hdr6));
1480 }
1481 
1482 /* Check if the use of the antenna that ieee80211 told us to
1483  * use is possible. This will fall back to DEFAULT.
1484  * "antenna_nr" is the antenna identifier we got from ieee80211. */
b43_ieee80211_antenna_sanitize(struct b43_wldev * dev,u8 antenna_nr)1485 u8 b43_ieee80211_antenna_sanitize(struct b43_wldev *dev,
1486 				  u8 antenna_nr)
1487 {
1488 	u8 antenna_mask;
1489 
1490 	if (antenna_nr == 0) {
1491 		/* Zero means "use default antenna". That's always OK. */
1492 		return 0;
1493 	}
1494 
1495 	/* Get the mask of available antennas. */
1496 	if (dev->phy.gmode)
1497 		antenna_mask = dev->dev->bus_sprom->ant_available_bg;
1498 	else
1499 		antenna_mask = dev->dev->bus_sprom->ant_available_a;
1500 
1501 	if (!(antenna_mask & (1 << (antenna_nr - 1)))) {
1502 		/* This antenna is not available. Fall back to default. */
1503 		return 0;
1504 	}
1505 
1506 	return antenna_nr;
1507 }
1508 
1509 /* Convert a b43 antenna number value to the PHY TX control value. */
b43_antenna_to_phyctl(int antenna)1510 static u16 b43_antenna_to_phyctl(int antenna)
1511 {
1512 	switch (antenna) {
1513 	case B43_ANTENNA0:
1514 		return B43_TXH_PHY_ANT0;
1515 	case B43_ANTENNA1:
1516 		return B43_TXH_PHY_ANT1;
1517 	case B43_ANTENNA2:
1518 		return B43_TXH_PHY_ANT2;
1519 	case B43_ANTENNA3:
1520 		return B43_TXH_PHY_ANT3;
1521 	case B43_ANTENNA_AUTO0:
1522 	case B43_ANTENNA_AUTO1:
1523 		return B43_TXH_PHY_ANT01AUTO;
1524 	}
1525 	B43_WARN_ON(1);
1526 	return 0;
1527 }
1528 
b43_write_beacon_template(struct b43_wldev * dev,u16 ram_offset,u16 shm_size_offset)1529 static void b43_write_beacon_template(struct b43_wldev *dev,
1530 				      u16 ram_offset,
1531 				      u16 shm_size_offset)
1532 {
1533 	unsigned int i, len, variable_len;
1534 	const struct ieee80211_mgmt *bcn;
1535 	const u8 *ie;
1536 	bool tim_found = false;
1537 	unsigned int rate;
1538 	u16 ctl;
1539 	int antenna;
1540 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(dev->wl->current_beacon);
1541 
1542 	bcn = (const struct ieee80211_mgmt *)(dev->wl->current_beacon->data);
1543 	len = min((size_t) dev->wl->current_beacon->len,
1544 		  0x200 - sizeof(struct b43_plcp_hdr6));
1545 	rate = ieee80211_get_tx_rate(dev->wl->hw, info)->hw_value;
1546 
1547 	b43_write_template_common(dev, (const u8 *)bcn,
1548 				  len, ram_offset, shm_size_offset, rate);
1549 
1550 	/* Write the PHY TX control parameters. */
1551 	antenna = B43_ANTENNA_DEFAULT;
1552 	antenna = b43_antenna_to_phyctl(antenna);
1553 	ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
1554 	/* We can't send beacons with short preamble. Would get PHY errors. */
1555 	ctl &= ~B43_TXH_PHY_SHORTPRMBL;
1556 	ctl &= ~B43_TXH_PHY_ANT;
1557 	ctl &= ~B43_TXH_PHY_ENC;
1558 	ctl |= antenna;
1559 	if (b43_is_cck_rate(rate))
1560 		ctl |= B43_TXH_PHY_ENC_CCK;
1561 	else
1562 		ctl |= B43_TXH_PHY_ENC_OFDM;
1563 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL, ctl);
1564 
1565 	/* Find the position of the TIM and the DTIM_period value
1566 	 * and write them to SHM. */
1567 	ie = bcn->u.beacon.variable;
1568 	variable_len = len - offsetof(struct ieee80211_mgmt, u.beacon.variable);
1569 	for (i = 0; i < variable_len - 2; ) {
1570 		uint8_t ie_id, ie_len;
1571 
1572 		ie_id = ie[i];
1573 		ie_len = ie[i + 1];
1574 		if (ie_id == 5) {
1575 			u16 tim_position;
1576 			u16 dtim_period;
1577 			/* This is the TIM Information Element */
1578 
1579 			/* Check whether the ie_len is in the beacon data range. */
1580 			if (variable_len < ie_len + 2 + i)
1581 				break;
1582 			/* A valid TIM is at least 4 bytes long. */
1583 			if (ie_len < 4)
1584 				break;
1585 			tim_found = true;
1586 
1587 			tim_position = sizeof(struct b43_plcp_hdr6);
1588 			tim_position += offsetof(struct ieee80211_mgmt, u.beacon.variable);
1589 			tim_position += i;
1590 
1591 			dtim_period = ie[i + 3];
1592 
1593 			b43_shm_write16(dev, B43_SHM_SHARED,
1594 					B43_SHM_SH_TIMBPOS, tim_position);
1595 			b43_shm_write16(dev, B43_SHM_SHARED,
1596 					B43_SHM_SH_DTIMPER, dtim_period);
1597 			break;
1598 		}
1599 		i += ie_len + 2;
1600 	}
1601 	if (!tim_found) {
1602 		/*
1603 		 * If ucode wants to modify TIM do it behind the beacon, this
1604 		 * will happen, for example, when doing mesh networking.
1605 		 */
1606 		b43_shm_write16(dev, B43_SHM_SHARED,
1607 				B43_SHM_SH_TIMBPOS,
1608 				len + sizeof(struct b43_plcp_hdr6));
1609 		b43_shm_write16(dev, B43_SHM_SHARED,
1610 				B43_SHM_SH_DTIMPER, 0);
1611 	}
1612 	b43dbg(dev->wl, "Updated beacon template at 0x%x\n", ram_offset);
1613 }
1614 
b43_upload_beacon0(struct b43_wldev * dev)1615 static void b43_upload_beacon0(struct b43_wldev *dev)
1616 {
1617 	struct b43_wl *wl = dev->wl;
1618 
1619 	if (wl->beacon0_uploaded)
1620 		return;
1621 	b43_write_beacon_template(dev, 0x68, 0x18);
1622 	wl->beacon0_uploaded = true;
1623 }
1624 
b43_upload_beacon1(struct b43_wldev * dev)1625 static void b43_upload_beacon1(struct b43_wldev *dev)
1626 {
1627 	struct b43_wl *wl = dev->wl;
1628 
1629 	if (wl->beacon1_uploaded)
1630 		return;
1631 	b43_write_beacon_template(dev, 0x468, 0x1A);
1632 	wl->beacon1_uploaded = true;
1633 }
1634 
handle_irq_beacon(struct b43_wldev * dev)1635 static void handle_irq_beacon(struct b43_wldev *dev)
1636 {
1637 	struct b43_wl *wl = dev->wl;
1638 	u32 cmd, beacon0_valid, beacon1_valid;
1639 
1640 	if (!b43_is_mode(wl, NL80211_IFTYPE_AP) &&
1641 	    !b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) &&
1642 	    !b43_is_mode(wl, NL80211_IFTYPE_ADHOC))
1643 		return;
1644 
1645 	/* This is the bottom half of the asynchronous beacon update. */
1646 
1647 	/* Ignore interrupt in the future. */
1648 	dev->irq_mask &= ~B43_IRQ_BEACON;
1649 
1650 	cmd = b43_read32(dev, B43_MMIO_MACCMD);
1651 	beacon0_valid = (cmd & B43_MACCMD_BEACON0_VALID);
1652 	beacon1_valid = (cmd & B43_MACCMD_BEACON1_VALID);
1653 
1654 	/* Schedule interrupt manually, if busy. */
1655 	if (beacon0_valid && beacon1_valid) {
1656 		b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, B43_IRQ_BEACON);
1657 		dev->irq_mask |= B43_IRQ_BEACON;
1658 		return;
1659 	}
1660 
1661 	if (unlikely(wl->beacon_templates_virgin)) {
1662 		/* We never uploaded a beacon before.
1663 		 * Upload both templates now, but only mark one valid. */
1664 		wl->beacon_templates_virgin = false;
1665 		b43_upload_beacon0(dev);
1666 		b43_upload_beacon1(dev);
1667 		cmd = b43_read32(dev, B43_MMIO_MACCMD);
1668 		cmd |= B43_MACCMD_BEACON0_VALID;
1669 		b43_write32(dev, B43_MMIO_MACCMD, cmd);
1670 	} else {
1671 		if (!beacon0_valid) {
1672 			b43_upload_beacon0(dev);
1673 			cmd = b43_read32(dev, B43_MMIO_MACCMD);
1674 			cmd |= B43_MACCMD_BEACON0_VALID;
1675 			b43_write32(dev, B43_MMIO_MACCMD, cmd);
1676 		} else if (!beacon1_valid) {
1677 			b43_upload_beacon1(dev);
1678 			cmd = b43_read32(dev, B43_MMIO_MACCMD);
1679 			cmd |= B43_MACCMD_BEACON1_VALID;
1680 			b43_write32(dev, B43_MMIO_MACCMD, cmd);
1681 		}
1682 	}
1683 }
1684 
b43_do_beacon_update_trigger_work(struct b43_wldev * dev)1685 static void b43_do_beacon_update_trigger_work(struct b43_wldev *dev)
1686 {
1687 	u32 old_irq_mask = dev->irq_mask;
1688 
1689 	/* update beacon right away or defer to irq */
1690 	handle_irq_beacon(dev);
1691 	if (old_irq_mask != dev->irq_mask) {
1692 		/* The handler updated the IRQ mask. */
1693 		B43_WARN_ON(!dev->irq_mask);
1694 		if (b43_read32(dev, B43_MMIO_GEN_IRQ_MASK)) {
1695 			b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask);
1696 		} else {
1697 			/* Device interrupts are currently disabled. That means
1698 			 * we just ran the hardirq handler and scheduled the
1699 			 * IRQ thread. The thread will write the IRQ mask when
1700 			 * it finished, so there's nothing to do here. Writing
1701 			 * the mask _here_ would incorrectly re-enable IRQs. */
1702 		}
1703 	}
1704 }
1705 
b43_beacon_update_trigger_work(struct work_struct * work)1706 static void b43_beacon_update_trigger_work(struct work_struct *work)
1707 {
1708 	struct b43_wl *wl = container_of(work, struct b43_wl,
1709 					 beacon_update_trigger);
1710 	struct b43_wldev *dev;
1711 
1712 	mutex_lock(&wl->mutex);
1713 	dev = wl->current_dev;
1714 	if (likely(dev && (b43_status(dev) >= B43_STAT_INITIALIZED))) {
1715 		if (b43_bus_host_is_sdio(dev->dev)) {
1716 			/* wl->mutex is enough. */
1717 			b43_do_beacon_update_trigger_work(dev);
1718 			mmiowb();
1719 		} else {
1720 			spin_lock_irq(&wl->hardirq_lock);
1721 			b43_do_beacon_update_trigger_work(dev);
1722 			mmiowb();
1723 			spin_unlock_irq(&wl->hardirq_lock);
1724 		}
1725 	}
1726 	mutex_unlock(&wl->mutex);
1727 }
1728 
1729 /* Asynchronously update the packet templates in template RAM.
1730  * Locking: Requires wl->mutex to be locked. */
b43_update_templates(struct b43_wl * wl)1731 static void b43_update_templates(struct b43_wl *wl)
1732 {
1733 	struct sk_buff *beacon;
1734 
1735 	/* This is the top half of the ansynchronous beacon update.
1736 	 * The bottom half is the beacon IRQ.
1737 	 * Beacon update must be asynchronous to avoid sending an
1738 	 * invalid beacon. This can happen for example, if the firmware
1739 	 * transmits a beacon while we are updating it. */
1740 
1741 	/* We could modify the existing beacon and set the aid bit in
1742 	 * the TIM field, but that would probably require resizing and
1743 	 * moving of data within the beacon template.
1744 	 * Simply request a new beacon and let mac80211 do the hard work. */
1745 	beacon = ieee80211_beacon_get(wl->hw, wl->vif);
1746 	if (unlikely(!beacon))
1747 		return;
1748 
1749 	if (wl->current_beacon)
1750 		dev_kfree_skb_any(wl->current_beacon);
1751 	wl->current_beacon = beacon;
1752 	wl->beacon0_uploaded = false;
1753 	wl->beacon1_uploaded = false;
1754 	ieee80211_queue_work(wl->hw, &wl->beacon_update_trigger);
1755 }
1756 
b43_set_beacon_int(struct b43_wldev * dev,u16 beacon_int)1757 static void b43_set_beacon_int(struct b43_wldev *dev, u16 beacon_int)
1758 {
1759 	b43_time_lock(dev);
1760 	if (dev->dev->core_rev >= 3) {
1761 		b43_write32(dev, B43_MMIO_TSF_CFP_REP, (beacon_int << 16));
1762 		b43_write32(dev, B43_MMIO_TSF_CFP_START, (beacon_int << 10));
1763 	} else {
1764 		b43_write16(dev, 0x606, (beacon_int >> 6));
1765 		b43_write16(dev, 0x610, beacon_int);
1766 	}
1767 	b43_time_unlock(dev);
1768 	b43dbg(dev->wl, "Set beacon interval to %u\n", beacon_int);
1769 }
1770 
b43_handle_firmware_panic(struct b43_wldev * dev)1771 static void b43_handle_firmware_panic(struct b43_wldev *dev)
1772 {
1773 	u16 reason;
1774 
1775 	/* Read the register that contains the reason code for the panic. */
1776 	reason = b43_shm_read16(dev, B43_SHM_SCRATCH, B43_FWPANIC_REASON_REG);
1777 	b43err(dev->wl, "Whoopsy, firmware panic! Reason: %u\n", reason);
1778 
1779 	switch (reason) {
1780 	default:
1781 		b43dbg(dev->wl, "The panic reason is unknown.\n");
1782 		/* fallthrough */
1783 	case B43_FWPANIC_DIE:
1784 		/* Do not restart the controller or firmware.
1785 		 * The device is nonfunctional from now on.
1786 		 * Restarting would result in this panic to trigger again,
1787 		 * so we avoid that recursion. */
1788 		break;
1789 	case B43_FWPANIC_RESTART:
1790 		b43_controller_restart(dev, "Microcode panic");
1791 		break;
1792 	}
1793 }
1794 
handle_irq_ucode_debug(struct b43_wldev * dev)1795 static void handle_irq_ucode_debug(struct b43_wldev *dev)
1796 {
1797 	unsigned int i, cnt;
1798 	u16 reason, marker_id, marker_line;
1799 	__le16 *buf;
1800 
1801 	/* The proprietary firmware doesn't have this IRQ. */
1802 	if (!dev->fw.opensource)
1803 		return;
1804 
1805 	/* Read the register that contains the reason code for this IRQ. */
1806 	reason = b43_shm_read16(dev, B43_SHM_SCRATCH, B43_DEBUGIRQ_REASON_REG);
1807 
1808 	switch (reason) {
1809 	case B43_DEBUGIRQ_PANIC:
1810 		b43_handle_firmware_panic(dev);
1811 		break;
1812 	case B43_DEBUGIRQ_DUMP_SHM:
1813 		if (!B43_DEBUG)
1814 			break; /* Only with driver debugging enabled. */
1815 		buf = kmalloc(4096, GFP_ATOMIC);
1816 		if (!buf) {
1817 			b43dbg(dev->wl, "SHM-dump: Failed to allocate memory\n");
1818 			goto out;
1819 		}
1820 		for (i = 0; i < 4096; i += 2) {
1821 			u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, i);
1822 			buf[i / 2] = cpu_to_le16(tmp);
1823 		}
1824 		b43info(dev->wl, "Shared memory dump:\n");
1825 		print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET,
1826 			       16, 2, buf, 4096, 1);
1827 		kfree(buf);
1828 		break;
1829 	case B43_DEBUGIRQ_DUMP_REGS:
1830 		if (!B43_DEBUG)
1831 			break; /* Only with driver debugging enabled. */
1832 		b43info(dev->wl, "Microcode register dump:\n");
1833 		for (i = 0, cnt = 0; i < 64; i++) {
1834 			u16 tmp = b43_shm_read16(dev, B43_SHM_SCRATCH, i);
1835 			if (cnt == 0)
1836 				printk(KERN_INFO);
1837 			printk("r%02u: 0x%04X  ", i, tmp);
1838 			cnt++;
1839 			if (cnt == 6) {
1840 				printk("\n");
1841 				cnt = 0;
1842 			}
1843 		}
1844 		printk("\n");
1845 		break;
1846 	case B43_DEBUGIRQ_MARKER:
1847 		if (!B43_DEBUG)
1848 			break; /* Only with driver debugging enabled. */
1849 		marker_id = b43_shm_read16(dev, B43_SHM_SCRATCH,
1850 					   B43_MARKER_ID_REG);
1851 		marker_line = b43_shm_read16(dev, B43_SHM_SCRATCH,
1852 					     B43_MARKER_LINE_REG);
1853 		b43info(dev->wl, "The firmware just executed the MARKER(%u) "
1854 			"at line number %u\n",
1855 			marker_id, marker_line);
1856 		break;
1857 	default:
1858 		b43dbg(dev->wl, "Debug-IRQ triggered for unknown reason: %u\n",
1859 		       reason);
1860 	}
1861 out:
1862 	/* Acknowledge the debug-IRQ, so the firmware can continue. */
1863 	b43_shm_write16(dev, B43_SHM_SCRATCH,
1864 			B43_DEBUGIRQ_REASON_REG, B43_DEBUGIRQ_ACK);
1865 }
1866 
b43_do_interrupt_thread(struct b43_wldev * dev)1867 static void b43_do_interrupt_thread(struct b43_wldev *dev)
1868 {
1869 	u32 reason;
1870 	u32 dma_reason[ARRAY_SIZE(dev->dma_reason)];
1871 	u32 merged_dma_reason = 0;
1872 	int i;
1873 
1874 	if (unlikely(b43_status(dev) != B43_STAT_STARTED))
1875 		return;
1876 
1877 	reason = dev->irq_reason;
1878 	for (i = 0; i < ARRAY_SIZE(dma_reason); i++) {
1879 		dma_reason[i] = dev->dma_reason[i];
1880 		merged_dma_reason |= dma_reason[i];
1881 	}
1882 
1883 	if (unlikely(reason & B43_IRQ_MAC_TXERR))
1884 		b43err(dev->wl, "MAC transmission error\n");
1885 
1886 	if (unlikely(reason & B43_IRQ_PHY_TXERR)) {
1887 		b43err(dev->wl, "PHY transmission error\n");
1888 		rmb();
1889 		if (unlikely(atomic_dec_and_test(&dev->phy.txerr_cnt))) {
1890 			atomic_set(&dev->phy.txerr_cnt,
1891 				   B43_PHY_TX_BADNESS_LIMIT);
1892 			b43err(dev->wl, "Too many PHY TX errors, "
1893 					"restarting the controller\n");
1894 			b43_controller_restart(dev, "PHY TX errors");
1895 		}
1896 	}
1897 
1898 	if (unlikely(merged_dma_reason & (B43_DMAIRQ_FATALMASK))) {
1899 		b43err(dev->wl,
1900 			"Fatal DMA error: 0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X\n",
1901 			dma_reason[0], dma_reason[1],
1902 			dma_reason[2], dma_reason[3],
1903 			dma_reason[4], dma_reason[5]);
1904 		b43err(dev->wl, "This device does not support DMA "
1905 			       "on your system. It will now be switched to PIO.\n");
1906 		/* Fall back to PIO transfers if we get fatal DMA errors! */
1907 		dev->use_pio = true;
1908 		b43_controller_restart(dev, "DMA error");
1909 		return;
1910 	}
1911 
1912 	if (unlikely(reason & B43_IRQ_UCODE_DEBUG))
1913 		handle_irq_ucode_debug(dev);
1914 	if (reason & B43_IRQ_TBTT_INDI)
1915 		handle_irq_tbtt_indication(dev);
1916 	if (reason & B43_IRQ_ATIM_END)
1917 		handle_irq_atim_end(dev);
1918 	if (reason & B43_IRQ_BEACON)
1919 		handle_irq_beacon(dev);
1920 	if (reason & B43_IRQ_PMQ)
1921 		handle_irq_pmq(dev);
1922 	if (reason & B43_IRQ_TXFIFO_FLUSH_OK)
1923 		;/* TODO */
1924 	if (reason & B43_IRQ_NOISESAMPLE_OK)
1925 		handle_irq_noise(dev);
1926 
1927 	/* Check the DMA reason registers for received data. */
1928 	if (dma_reason[0] & B43_DMAIRQ_RDESC_UFLOW) {
1929 		if (B43_DEBUG)
1930 			b43warn(dev->wl, "RX descriptor underrun\n");
1931 		b43_dma_handle_rx_overflow(dev->dma.rx_ring);
1932 	}
1933 	if (dma_reason[0] & B43_DMAIRQ_RX_DONE) {
1934 		if (b43_using_pio_transfers(dev))
1935 			b43_pio_rx(dev->pio.rx_queue);
1936 		else
1937 			b43_dma_rx(dev->dma.rx_ring);
1938 	}
1939 	B43_WARN_ON(dma_reason[1] & B43_DMAIRQ_RX_DONE);
1940 	B43_WARN_ON(dma_reason[2] & B43_DMAIRQ_RX_DONE);
1941 	B43_WARN_ON(dma_reason[3] & B43_DMAIRQ_RX_DONE);
1942 	B43_WARN_ON(dma_reason[4] & B43_DMAIRQ_RX_DONE);
1943 	B43_WARN_ON(dma_reason[5] & B43_DMAIRQ_RX_DONE);
1944 
1945 	if (reason & B43_IRQ_TX_OK)
1946 		handle_irq_transmit_status(dev);
1947 
1948 	/* Re-enable interrupts on the device by restoring the current interrupt mask. */
1949 	b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask);
1950 
1951 #if B43_DEBUG
1952 	if (b43_debug(dev, B43_DBG_VERBOSESTATS)) {
1953 		dev->irq_count++;
1954 		for (i = 0; i < ARRAY_SIZE(dev->irq_bit_count); i++) {
1955 			if (reason & (1 << i))
1956 				dev->irq_bit_count[i]++;
1957 		}
1958 	}
1959 #endif
1960 }
1961 
1962 /* Interrupt thread handler. Handles device interrupts in thread context. */
b43_interrupt_thread_handler(int irq,void * dev_id)1963 static irqreturn_t b43_interrupt_thread_handler(int irq, void *dev_id)
1964 {
1965 	struct b43_wldev *dev = dev_id;
1966 
1967 	mutex_lock(&dev->wl->mutex);
1968 	b43_do_interrupt_thread(dev);
1969 	mmiowb();
1970 	mutex_unlock(&dev->wl->mutex);
1971 
1972 	return IRQ_HANDLED;
1973 }
1974 
b43_do_interrupt(struct b43_wldev * dev)1975 static irqreturn_t b43_do_interrupt(struct b43_wldev *dev)
1976 {
1977 	u32 reason;
1978 
1979 	/* This code runs under wl->hardirq_lock, but _only_ on non-SDIO busses.
1980 	 * On SDIO, this runs under wl->mutex. */
1981 
1982 	reason = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
1983 	if (reason == 0xffffffff)	/* shared IRQ */
1984 		return IRQ_NONE;
1985 	reason &= dev->irq_mask;
1986 	if (!reason)
1987 		return IRQ_NONE;
1988 
1989 	dev->dma_reason[0] = b43_read32(dev, B43_MMIO_DMA0_REASON)
1990 	    & 0x0001FC00;
1991 	dev->dma_reason[1] = b43_read32(dev, B43_MMIO_DMA1_REASON)
1992 	    & 0x0000DC00;
1993 	dev->dma_reason[2] = b43_read32(dev, B43_MMIO_DMA2_REASON)
1994 	    & 0x0000DC00;
1995 	dev->dma_reason[3] = b43_read32(dev, B43_MMIO_DMA3_REASON)
1996 	    & 0x0001DC00;
1997 	dev->dma_reason[4] = b43_read32(dev, B43_MMIO_DMA4_REASON)
1998 	    & 0x0000DC00;
1999 /* Unused ring
2000 	dev->dma_reason[5] = b43_read32(dev, B43_MMIO_DMA5_REASON)
2001 	    & 0x0000DC00;
2002 */
2003 
2004 	/* ACK the interrupt. */
2005 	b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, reason);
2006 	b43_write32(dev, B43_MMIO_DMA0_REASON, dev->dma_reason[0]);
2007 	b43_write32(dev, B43_MMIO_DMA1_REASON, dev->dma_reason[1]);
2008 	b43_write32(dev, B43_MMIO_DMA2_REASON, dev->dma_reason[2]);
2009 	b43_write32(dev, B43_MMIO_DMA3_REASON, dev->dma_reason[3]);
2010 	b43_write32(dev, B43_MMIO_DMA4_REASON, dev->dma_reason[4]);
2011 /* Unused ring
2012 	b43_write32(dev, B43_MMIO_DMA5_REASON, dev->dma_reason[5]);
2013 */
2014 
2015 	/* Disable IRQs on the device. The IRQ thread handler will re-enable them. */
2016 	b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0);
2017 	/* Save the reason bitmasks for the IRQ thread handler. */
2018 	dev->irq_reason = reason;
2019 
2020 	return IRQ_WAKE_THREAD;
2021 }
2022 
2023 /* Interrupt handler top-half. This runs with interrupts disabled. */
b43_interrupt_handler(int irq,void * dev_id)2024 static irqreturn_t b43_interrupt_handler(int irq, void *dev_id)
2025 {
2026 	struct b43_wldev *dev = dev_id;
2027 	irqreturn_t ret;
2028 
2029 	if (unlikely(b43_status(dev) < B43_STAT_STARTED))
2030 		return IRQ_NONE;
2031 
2032 	spin_lock(&dev->wl->hardirq_lock);
2033 	ret = b43_do_interrupt(dev);
2034 	mmiowb();
2035 	spin_unlock(&dev->wl->hardirq_lock);
2036 
2037 	return ret;
2038 }
2039 
2040 /* SDIO interrupt handler. This runs in process context. */
b43_sdio_interrupt_handler(struct b43_wldev * dev)2041 static void b43_sdio_interrupt_handler(struct b43_wldev *dev)
2042 {
2043 	struct b43_wl *wl = dev->wl;
2044 	irqreturn_t ret;
2045 
2046 	mutex_lock(&wl->mutex);
2047 
2048 	ret = b43_do_interrupt(dev);
2049 	if (ret == IRQ_WAKE_THREAD)
2050 		b43_do_interrupt_thread(dev);
2051 
2052 	mutex_unlock(&wl->mutex);
2053 }
2054 
b43_do_release_fw(struct b43_firmware_file * fw)2055 void b43_do_release_fw(struct b43_firmware_file *fw)
2056 {
2057 	release_firmware(fw->data);
2058 	fw->data = NULL;
2059 	fw->filename = NULL;
2060 }
2061 
b43_release_firmware(struct b43_wldev * dev)2062 static void b43_release_firmware(struct b43_wldev *dev)
2063 {
2064 	complete(&dev->fw_load_complete);
2065 	b43_do_release_fw(&dev->fw.ucode);
2066 	b43_do_release_fw(&dev->fw.pcm);
2067 	b43_do_release_fw(&dev->fw.initvals);
2068 	b43_do_release_fw(&dev->fw.initvals_band);
2069 }
2070 
b43_print_fw_helptext(struct b43_wl * wl,bool error)2071 static void b43_print_fw_helptext(struct b43_wl *wl, bool error)
2072 {
2073 	const char text[] =
2074 		"You must go to " \
2075 		"http://wireless.kernel.org/en/users/Drivers/b43#devicefirmware " \
2076 		"and download the correct firmware for this driver version. " \
2077 		"Please carefully read all instructions on this website.\n";
2078 
2079 	if (error)
2080 		b43err(wl, text);
2081 	else
2082 		b43warn(wl, text);
2083 }
2084 
b43_fw_cb(const struct firmware * firmware,void * context)2085 static void b43_fw_cb(const struct firmware *firmware, void *context)
2086 {
2087 	struct b43_request_fw_context *ctx = context;
2088 
2089 	ctx->blob = firmware;
2090 	complete(&ctx->dev->fw_load_complete);
2091 }
2092 
b43_do_request_fw(struct b43_request_fw_context * ctx,const char * name,struct b43_firmware_file * fw,bool async)2093 int b43_do_request_fw(struct b43_request_fw_context *ctx,
2094 		      const char *name,
2095 		      struct b43_firmware_file *fw, bool async)
2096 {
2097 	struct b43_fw_header *hdr;
2098 	u32 size;
2099 	int err;
2100 
2101 	if (!name) {
2102 		/* Don't fetch anything. Free possibly cached firmware. */
2103 		/* FIXME: We should probably keep it anyway, to save some headache
2104 		 * on suspend/resume with multiband devices. */
2105 		b43_do_release_fw(fw);
2106 		return 0;
2107 	}
2108 	if (fw->filename) {
2109 		if ((fw->type == ctx->req_type) &&
2110 		    (strcmp(fw->filename, name) == 0))
2111 			return 0; /* Already have this fw. */
2112 		/* Free the cached firmware first. */
2113 		/* FIXME: We should probably do this later after we successfully
2114 		 * got the new fw. This could reduce headache with multiband devices.
2115 		 * We could also redesign this to cache the firmware for all possible
2116 		 * bands all the time. */
2117 		b43_do_release_fw(fw);
2118 	}
2119 
2120 	switch (ctx->req_type) {
2121 	case B43_FWTYPE_PROPRIETARY:
2122 		snprintf(ctx->fwname, sizeof(ctx->fwname),
2123 			 "b43%s/%s.fw",
2124 			 modparam_fwpostfix, name);
2125 		break;
2126 	case B43_FWTYPE_OPENSOURCE:
2127 		snprintf(ctx->fwname, sizeof(ctx->fwname),
2128 			 "b43-open%s/%s.fw",
2129 			 modparam_fwpostfix, name);
2130 		break;
2131 	default:
2132 		B43_WARN_ON(1);
2133 		return -ENOSYS;
2134 	}
2135 	if (async) {
2136 		/* do this part asynchronously */
2137 		init_completion(&ctx->dev->fw_load_complete);
2138 		err = request_firmware_nowait(THIS_MODULE, 1, ctx->fwname,
2139 					      ctx->dev->dev->dev, GFP_KERNEL,
2140 					      ctx, b43_fw_cb);
2141 		if (err < 0) {
2142 			pr_err("Unable to load firmware\n");
2143 			return err;
2144 		}
2145 		wait_for_completion(&ctx->dev->fw_load_complete);
2146 		if (ctx->blob)
2147 			goto fw_ready;
2148 	/* On some ARM systems, the async request will fail, but the next sync
2149 	 * request works. For this reason, we fall through here
2150 	 */
2151 	}
2152 	err = request_firmware(&ctx->blob, ctx->fwname,
2153 			       ctx->dev->dev->dev);
2154 	if (err == -ENOENT) {
2155 		snprintf(ctx->errors[ctx->req_type],
2156 			 sizeof(ctx->errors[ctx->req_type]),
2157 			 "Firmware file \"%s\" not found\n",
2158 			 ctx->fwname);
2159 		return err;
2160 	} else if (err) {
2161 		snprintf(ctx->errors[ctx->req_type],
2162 			 sizeof(ctx->errors[ctx->req_type]),
2163 			 "Firmware file \"%s\" request failed (err=%d)\n",
2164 			 ctx->fwname, err);
2165 		return err;
2166 	}
2167 fw_ready:
2168 	if (ctx->blob->size < sizeof(struct b43_fw_header))
2169 		goto err_format;
2170 	hdr = (struct b43_fw_header *)(ctx->blob->data);
2171 	switch (hdr->type) {
2172 	case B43_FW_TYPE_UCODE:
2173 	case B43_FW_TYPE_PCM:
2174 		size = be32_to_cpu(hdr->size);
2175 		if (size != ctx->blob->size - sizeof(struct b43_fw_header))
2176 			goto err_format;
2177 		/* fallthrough */
2178 	case B43_FW_TYPE_IV:
2179 		if (hdr->ver != 1)
2180 			goto err_format;
2181 		break;
2182 	default:
2183 		goto err_format;
2184 	}
2185 
2186 	fw->data = ctx->blob;
2187 	fw->filename = name;
2188 	fw->type = ctx->req_type;
2189 
2190 	return 0;
2191 
2192 err_format:
2193 	snprintf(ctx->errors[ctx->req_type],
2194 		 sizeof(ctx->errors[ctx->req_type]),
2195 		 "Firmware file \"%s\" format error.\n", ctx->fwname);
2196 	release_firmware(ctx->blob);
2197 
2198 	return -EPROTO;
2199 }
2200 
b43_try_request_fw(struct b43_request_fw_context * ctx)2201 static int b43_try_request_fw(struct b43_request_fw_context *ctx)
2202 {
2203 	struct b43_wldev *dev = ctx->dev;
2204 	struct b43_firmware *fw = &ctx->dev->fw;
2205 	const u8 rev = ctx->dev->dev->core_rev;
2206 	const char *filename;
2207 	u32 tmshigh;
2208 	int err;
2209 
2210 	/* Files for HT and LCN were found by trying one by one */
2211 
2212 	/* Get microcode */
2213 	if ((rev >= 5) && (rev <= 10)) {
2214 		filename = "ucode5";
2215 	} else if ((rev >= 11) && (rev <= 12)) {
2216 		filename = "ucode11";
2217 	} else if (rev == 13) {
2218 		filename = "ucode13";
2219 	} else if (rev == 14) {
2220 		filename = "ucode14";
2221 	} else if (rev == 15) {
2222 		filename = "ucode15";
2223 	} else {
2224 		switch (dev->phy.type) {
2225 		case B43_PHYTYPE_N:
2226 			if (rev >= 16)
2227 				filename = "ucode16_mimo";
2228 			else
2229 				goto err_no_ucode;
2230 			break;
2231 		case B43_PHYTYPE_HT:
2232 			if (rev == 29)
2233 				filename = "ucode29_mimo";
2234 			else
2235 				goto err_no_ucode;
2236 			break;
2237 		case B43_PHYTYPE_LCN:
2238 			if (rev == 24)
2239 				filename = "ucode24_mimo";
2240 			else
2241 				goto err_no_ucode;
2242 			break;
2243 		default:
2244 			goto err_no_ucode;
2245 		}
2246 	}
2247 	err = b43_do_request_fw(ctx, filename, &fw->ucode, true);
2248 	if (err)
2249 		goto err_load;
2250 
2251 	/* Get PCM code */
2252 	if ((rev >= 5) && (rev <= 10))
2253 		filename = "pcm5";
2254 	else if (rev >= 11)
2255 		filename = NULL;
2256 	else
2257 		goto err_no_pcm;
2258 	fw->pcm_request_failed = false;
2259 	err = b43_do_request_fw(ctx, filename, &fw->pcm, false);
2260 	if (err == -ENOENT) {
2261 		/* We did not find a PCM file? Not fatal, but
2262 		 * core rev <= 10 must do without hwcrypto then. */
2263 		fw->pcm_request_failed = true;
2264 	} else if (err)
2265 		goto err_load;
2266 
2267 	/* Get initvals */
2268 	switch (dev->phy.type) {
2269 	case B43_PHYTYPE_A:
2270 		if ((rev >= 5) && (rev <= 10)) {
2271 			tmshigh = ssb_read32(dev->dev->sdev, SSB_TMSHIGH);
2272 			if (tmshigh & B43_TMSHIGH_HAVE_2GHZ_PHY)
2273 				filename = "a0g1initvals5";
2274 			else
2275 				filename = "a0g0initvals5";
2276 		} else
2277 			goto err_no_initvals;
2278 		break;
2279 	case B43_PHYTYPE_G:
2280 		if ((rev >= 5) && (rev <= 10))
2281 			filename = "b0g0initvals5";
2282 		else if (rev >= 13)
2283 			filename = "b0g0initvals13";
2284 		else
2285 			goto err_no_initvals;
2286 		break;
2287 	case B43_PHYTYPE_N:
2288 		if (rev >= 16)
2289 			filename = "n0initvals16";
2290 		else if ((rev >= 11) && (rev <= 12))
2291 			filename = "n0initvals11";
2292 		else
2293 			goto err_no_initvals;
2294 		break;
2295 	case B43_PHYTYPE_LP:
2296 		if (rev == 13)
2297 			filename = "lp0initvals13";
2298 		else if (rev == 14)
2299 			filename = "lp0initvals14";
2300 		else if (rev >= 15)
2301 			filename = "lp0initvals15";
2302 		else
2303 			goto err_no_initvals;
2304 		break;
2305 	case B43_PHYTYPE_HT:
2306 		if (rev == 29)
2307 			filename = "ht0initvals29";
2308 		else
2309 			goto err_no_initvals;
2310 		break;
2311 	case B43_PHYTYPE_LCN:
2312 		if (rev == 24)
2313 			filename = "lcn0initvals24";
2314 		else
2315 			goto err_no_initvals;
2316 		break;
2317 	default:
2318 		goto err_no_initvals;
2319 	}
2320 	err = b43_do_request_fw(ctx, filename, &fw->initvals, false);
2321 	if (err)
2322 		goto err_load;
2323 
2324 	/* Get bandswitch initvals */
2325 	switch (dev->phy.type) {
2326 	case B43_PHYTYPE_A:
2327 		if ((rev >= 5) && (rev <= 10)) {
2328 			tmshigh = ssb_read32(dev->dev->sdev, SSB_TMSHIGH);
2329 			if (tmshigh & B43_TMSHIGH_HAVE_2GHZ_PHY)
2330 				filename = "a0g1bsinitvals5";
2331 			else
2332 				filename = "a0g0bsinitvals5";
2333 		} else if (rev >= 11)
2334 			filename = NULL;
2335 		else
2336 			goto err_no_initvals;
2337 		break;
2338 	case B43_PHYTYPE_G:
2339 		if ((rev >= 5) && (rev <= 10))
2340 			filename = "b0g0bsinitvals5";
2341 		else if (rev >= 11)
2342 			filename = NULL;
2343 		else
2344 			goto err_no_initvals;
2345 		break;
2346 	case B43_PHYTYPE_N:
2347 		if (rev >= 16)
2348 			filename = "n0bsinitvals16";
2349 		else if ((rev >= 11) && (rev <= 12))
2350 			filename = "n0bsinitvals11";
2351 		else
2352 			goto err_no_initvals;
2353 		break;
2354 	case B43_PHYTYPE_LP:
2355 		if (rev == 13)
2356 			filename = "lp0bsinitvals13";
2357 		else if (rev == 14)
2358 			filename = "lp0bsinitvals14";
2359 		else if (rev >= 15)
2360 			filename = "lp0bsinitvals15";
2361 		else
2362 			goto err_no_initvals;
2363 		break;
2364 	case B43_PHYTYPE_HT:
2365 		if (rev == 29)
2366 			filename = "ht0bsinitvals29";
2367 		else
2368 			goto err_no_initvals;
2369 		break;
2370 	case B43_PHYTYPE_LCN:
2371 		if (rev == 24)
2372 			filename = "lcn0bsinitvals24";
2373 		else
2374 			goto err_no_initvals;
2375 		break;
2376 	default:
2377 		goto err_no_initvals;
2378 	}
2379 	err = b43_do_request_fw(ctx, filename, &fw->initvals_band, false);
2380 	if (err)
2381 		goto err_load;
2382 
2383 	return 0;
2384 
2385 err_no_ucode:
2386 	err = ctx->fatal_failure = -EOPNOTSUPP;
2387 	b43err(dev->wl, "The driver does not know which firmware (ucode) "
2388 	       "is required for your device (wl-core rev %u)\n", rev);
2389 	goto error;
2390 
2391 err_no_pcm:
2392 	err = ctx->fatal_failure = -EOPNOTSUPP;
2393 	b43err(dev->wl, "The driver does not know which firmware (PCM) "
2394 	       "is required for your device (wl-core rev %u)\n", rev);
2395 	goto error;
2396 
2397 err_no_initvals:
2398 	err = ctx->fatal_failure = -EOPNOTSUPP;
2399 	b43err(dev->wl, "The driver does not know which firmware (initvals) "
2400 	       "is required for your device (wl-core rev %u)\n", rev);
2401 	goto error;
2402 
2403 err_load:
2404 	/* We failed to load this firmware image. The error message
2405 	 * already is in ctx->errors. Return and let our caller decide
2406 	 * what to do. */
2407 	goto error;
2408 
2409 error:
2410 	b43_release_firmware(dev);
2411 	return err;
2412 }
2413 
2414 static int b43_one_core_attach(struct b43_bus_dev *dev, struct b43_wl *wl);
2415 static void b43_one_core_detach(struct b43_bus_dev *dev);
2416 static int b43_rng_init(struct b43_wl *wl);
2417 
b43_request_firmware(struct work_struct * work)2418 static void b43_request_firmware(struct work_struct *work)
2419 {
2420 	struct b43_wl *wl = container_of(work,
2421 			    struct b43_wl, firmware_load);
2422 	struct b43_wldev *dev = wl->current_dev;
2423 	struct b43_request_fw_context *ctx;
2424 	unsigned int i;
2425 	int err;
2426 	const char *errmsg;
2427 
2428 	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
2429 	if (!ctx)
2430 		return;
2431 	ctx->dev = dev;
2432 
2433 	ctx->req_type = B43_FWTYPE_PROPRIETARY;
2434 	err = b43_try_request_fw(ctx);
2435 	if (!err)
2436 		goto start_ieee80211; /* Successfully loaded it. */
2437 	/* Was fw version known? */
2438 	if (ctx->fatal_failure)
2439 		goto out;
2440 
2441 	/* proprietary fw not found, try open source */
2442 	ctx->req_type = B43_FWTYPE_OPENSOURCE;
2443 	err = b43_try_request_fw(ctx);
2444 	if (!err)
2445 		goto start_ieee80211; /* Successfully loaded it. */
2446 	if(ctx->fatal_failure)
2447 		goto out;
2448 
2449 	/* Could not find a usable firmware. Print the errors. */
2450 	for (i = 0; i < B43_NR_FWTYPES; i++) {
2451 		errmsg = ctx->errors[i];
2452 		if (strlen(errmsg))
2453 			b43err(dev->wl, "%s", errmsg);
2454 	}
2455 	b43_print_fw_helptext(dev->wl, 1);
2456 	goto out;
2457 
2458 start_ieee80211:
2459 	err = ieee80211_register_hw(wl->hw);
2460 	if (err)
2461 		goto err_one_core_detach;
2462 	b43_leds_register(wl->current_dev);
2463 
2464 	/* Register HW RNG driver */
2465 	b43_rng_init(wl);
2466 
2467 	goto out;
2468 
2469 err_one_core_detach:
2470 	b43_one_core_detach(dev->dev);
2471 
2472 out:
2473 	kfree(ctx);
2474 }
2475 
b43_upload_microcode(struct b43_wldev * dev)2476 static int b43_upload_microcode(struct b43_wldev *dev)
2477 {
2478 	struct wiphy *wiphy = dev->wl->hw->wiphy;
2479 	const size_t hdr_len = sizeof(struct b43_fw_header);
2480 	const __be32 *data;
2481 	unsigned int i, len;
2482 	u16 fwrev, fwpatch, fwdate, fwtime;
2483 	u32 tmp, macctl;
2484 	int err = 0;
2485 
2486 	/* Jump the microcode PSM to offset 0 */
2487 	macctl = b43_read32(dev, B43_MMIO_MACCTL);
2488 	B43_WARN_ON(macctl & B43_MACCTL_PSM_RUN);
2489 	macctl |= B43_MACCTL_PSM_JMP0;
2490 	b43_write32(dev, B43_MMIO_MACCTL, macctl);
2491 	/* Zero out all microcode PSM registers and shared memory. */
2492 	for (i = 0; i < 64; i++)
2493 		b43_shm_write16(dev, B43_SHM_SCRATCH, i, 0);
2494 	for (i = 0; i < 4096; i += 2)
2495 		b43_shm_write16(dev, B43_SHM_SHARED, i, 0);
2496 
2497 	/* Upload Microcode. */
2498 	data = (__be32 *) (dev->fw.ucode.data->data + hdr_len);
2499 	len = (dev->fw.ucode.data->size - hdr_len) / sizeof(__be32);
2500 	b43_shm_control_word(dev, B43_SHM_UCODE | B43_SHM_AUTOINC_W, 0x0000);
2501 	for (i = 0; i < len; i++) {
2502 		b43_write32(dev, B43_MMIO_SHM_DATA, be32_to_cpu(data[i]));
2503 		udelay(10);
2504 	}
2505 
2506 	if (dev->fw.pcm.data) {
2507 		/* Upload PCM data. */
2508 		data = (__be32 *) (dev->fw.pcm.data->data + hdr_len);
2509 		len = (dev->fw.pcm.data->size - hdr_len) / sizeof(__be32);
2510 		b43_shm_control_word(dev, B43_SHM_HW, 0x01EA);
2511 		b43_write32(dev, B43_MMIO_SHM_DATA, 0x00004000);
2512 		/* No need for autoinc bit in SHM_HW */
2513 		b43_shm_control_word(dev, B43_SHM_HW, 0x01EB);
2514 		for (i = 0; i < len; i++) {
2515 			b43_write32(dev, B43_MMIO_SHM_DATA, be32_to_cpu(data[i]));
2516 			udelay(10);
2517 		}
2518 	}
2519 
2520 	b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, B43_IRQ_ALL);
2521 
2522 	/* Start the microcode PSM */
2523 	b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_JMP0,
2524 		      B43_MACCTL_PSM_RUN);
2525 
2526 	/* Wait for the microcode to load and respond */
2527 	i = 0;
2528 	while (1) {
2529 		tmp = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
2530 		if (tmp == B43_IRQ_MAC_SUSPENDED)
2531 			break;
2532 		i++;
2533 		if (i >= 20) {
2534 			b43err(dev->wl, "Microcode not responding\n");
2535 			b43_print_fw_helptext(dev->wl, 1);
2536 			err = -ENODEV;
2537 			goto error;
2538 		}
2539 		msleep(50);
2540 	}
2541 	b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);	/* dummy read */
2542 
2543 	/* Get and check the revisions. */
2544 	fwrev = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODEREV);
2545 	fwpatch = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODEPATCH);
2546 	fwdate = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODEDATE);
2547 	fwtime = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODETIME);
2548 
2549 	if (fwrev <= 0x128) {
2550 		b43err(dev->wl, "YOUR FIRMWARE IS TOO OLD. Firmware from "
2551 		       "binary drivers older than version 4.x is unsupported. "
2552 		       "You must upgrade your firmware files.\n");
2553 		b43_print_fw_helptext(dev->wl, 1);
2554 		err = -EOPNOTSUPP;
2555 		goto error;
2556 	}
2557 	dev->fw.rev = fwrev;
2558 	dev->fw.patch = fwpatch;
2559 	if (dev->fw.rev >= 598)
2560 		dev->fw.hdr_format = B43_FW_HDR_598;
2561 	else if (dev->fw.rev >= 410)
2562 		dev->fw.hdr_format = B43_FW_HDR_410;
2563 	else
2564 		dev->fw.hdr_format = B43_FW_HDR_351;
2565 	dev->fw.opensource = (fwdate == 0xFFFF);
2566 
2567 	/* Default to use-all-queues. */
2568 	dev->wl->hw->queues = dev->wl->mac80211_initially_registered_queues;
2569 	dev->qos_enabled = !!modparam_qos;
2570 	/* Default to firmware/hardware crypto acceleration. */
2571 	dev->hwcrypto_enabled = true;
2572 
2573 	if (dev->fw.opensource) {
2574 		u16 fwcapa;
2575 
2576 		/* Patchlevel info is encoded in the "time" field. */
2577 		dev->fw.patch = fwtime;
2578 		b43info(dev->wl, "Loading OpenSource firmware version %u.%u\n",
2579 			dev->fw.rev, dev->fw.patch);
2580 
2581 		fwcapa = b43_fwcapa_read(dev);
2582 		if (!(fwcapa & B43_FWCAPA_HWCRYPTO) || dev->fw.pcm_request_failed) {
2583 			b43info(dev->wl, "Hardware crypto acceleration not supported by firmware\n");
2584 			/* Disable hardware crypto and fall back to software crypto. */
2585 			dev->hwcrypto_enabled = false;
2586 		}
2587 		if (!(fwcapa & B43_FWCAPA_QOS)) {
2588 			b43info(dev->wl, "QoS not supported by firmware\n");
2589 			/* Disable QoS. Tweak hw->queues to 1. It will be restored before
2590 			 * ieee80211_unregister to make sure the networking core can
2591 			 * properly free possible resources. */
2592 			dev->wl->hw->queues = 1;
2593 			dev->qos_enabled = false;
2594 		}
2595 	} else {
2596 		b43info(dev->wl, "Loading firmware version %u.%u "
2597 			"(20%.2i-%.2i-%.2i %.2i:%.2i:%.2i)\n",
2598 			fwrev, fwpatch,
2599 			(fwdate >> 12) & 0xF, (fwdate >> 8) & 0xF, fwdate & 0xFF,
2600 			(fwtime >> 11) & 0x1F, (fwtime >> 5) & 0x3F, fwtime & 0x1F);
2601 		if (dev->fw.pcm_request_failed) {
2602 			b43warn(dev->wl, "No \"pcm5.fw\" firmware file found. "
2603 				"Hardware accelerated cryptography is disabled.\n");
2604 			b43_print_fw_helptext(dev->wl, 0);
2605 		}
2606 	}
2607 
2608 	snprintf(wiphy->fw_version, sizeof(wiphy->fw_version), "%u.%u",
2609 			dev->fw.rev, dev->fw.patch);
2610 	wiphy->hw_version = dev->dev->core_id;
2611 
2612 	if (dev->fw.hdr_format == B43_FW_HDR_351) {
2613 		/* We're over the deadline, but we keep support for old fw
2614 		 * until it turns out to be in major conflict with something new. */
2615 		b43warn(dev->wl, "You are using an old firmware image. "
2616 			"Support for old firmware will be removed soon "
2617 			"(official deadline was July 2008).\n");
2618 		b43_print_fw_helptext(dev->wl, 0);
2619 	}
2620 
2621 	return 0;
2622 
2623 error:
2624 	/* Stop the microcode PSM. */
2625 	b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_RUN,
2626 		      B43_MACCTL_PSM_JMP0);
2627 
2628 	return err;
2629 }
2630 
b43_write_initvals(struct b43_wldev * dev,const struct b43_iv * ivals,size_t count,size_t array_size)2631 static int b43_write_initvals(struct b43_wldev *dev,
2632 			      const struct b43_iv *ivals,
2633 			      size_t count,
2634 			      size_t array_size)
2635 {
2636 	const struct b43_iv *iv;
2637 	u16 offset;
2638 	size_t i;
2639 	bool bit32;
2640 
2641 	BUILD_BUG_ON(sizeof(struct b43_iv) != 6);
2642 	iv = ivals;
2643 	for (i = 0; i < count; i++) {
2644 		if (array_size < sizeof(iv->offset_size))
2645 			goto err_format;
2646 		array_size -= sizeof(iv->offset_size);
2647 		offset = be16_to_cpu(iv->offset_size);
2648 		bit32 = !!(offset & B43_IV_32BIT);
2649 		offset &= B43_IV_OFFSET_MASK;
2650 		if (offset >= 0x1000)
2651 			goto err_format;
2652 		if (bit32) {
2653 			u32 value;
2654 
2655 			if (array_size < sizeof(iv->data.d32))
2656 				goto err_format;
2657 			array_size -= sizeof(iv->data.d32);
2658 
2659 			value = get_unaligned_be32(&iv->data.d32);
2660 			b43_write32(dev, offset, value);
2661 
2662 			iv = (const struct b43_iv *)((const uint8_t *)iv +
2663 							sizeof(__be16) +
2664 							sizeof(__be32));
2665 		} else {
2666 			u16 value;
2667 
2668 			if (array_size < sizeof(iv->data.d16))
2669 				goto err_format;
2670 			array_size -= sizeof(iv->data.d16);
2671 
2672 			value = be16_to_cpu(iv->data.d16);
2673 			b43_write16(dev, offset, value);
2674 
2675 			iv = (const struct b43_iv *)((const uint8_t *)iv +
2676 							sizeof(__be16) +
2677 							sizeof(__be16));
2678 		}
2679 	}
2680 	if (array_size)
2681 		goto err_format;
2682 
2683 	return 0;
2684 
2685 err_format:
2686 	b43err(dev->wl, "Initial Values Firmware file-format error.\n");
2687 	b43_print_fw_helptext(dev->wl, 1);
2688 
2689 	return -EPROTO;
2690 }
2691 
b43_upload_initvals(struct b43_wldev * dev)2692 static int b43_upload_initvals(struct b43_wldev *dev)
2693 {
2694 	const size_t hdr_len = sizeof(struct b43_fw_header);
2695 	const struct b43_fw_header *hdr;
2696 	struct b43_firmware *fw = &dev->fw;
2697 	const struct b43_iv *ivals;
2698 	size_t count;
2699 	int err;
2700 
2701 	hdr = (const struct b43_fw_header *)(fw->initvals.data->data);
2702 	ivals = (const struct b43_iv *)(fw->initvals.data->data + hdr_len);
2703 	count = be32_to_cpu(hdr->size);
2704 	err = b43_write_initvals(dev, ivals, count,
2705 				 fw->initvals.data->size - hdr_len);
2706 	if (err)
2707 		goto out;
2708 	if (fw->initvals_band.data) {
2709 		hdr = (const struct b43_fw_header *)(fw->initvals_band.data->data);
2710 		ivals = (const struct b43_iv *)(fw->initvals_band.data->data + hdr_len);
2711 		count = be32_to_cpu(hdr->size);
2712 		err = b43_write_initvals(dev, ivals, count,
2713 					 fw->initvals_band.data->size - hdr_len);
2714 		if (err)
2715 			goto out;
2716 	}
2717 out:
2718 
2719 	return err;
2720 }
2721 
2722 /* Initialize the GPIOs
2723  * http://bcm-specs.sipsolutions.net/GPIO
2724  */
b43_ssb_gpio_dev(struct b43_wldev * dev)2725 static struct ssb_device *b43_ssb_gpio_dev(struct b43_wldev *dev)
2726 {
2727 	struct ssb_bus *bus = dev->dev->sdev->bus;
2728 
2729 #ifdef CONFIG_SSB_DRIVER_PCICORE
2730 	return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
2731 #else
2732 	return bus->chipco.dev;
2733 #endif
2734 }
2735 
b43_gpio_init(struct b43_wldev * dev)2736 static int b43_gpio_init(struct b43_wldev *dev)
2737 {
2738 	struct ssb_device *gpiodev;
2739 	u32 mask, set;
2740 
2741 	b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);
2742 	b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, 0xF);
2743 
2744 	mask = 0x0000001F;
2745 	set = 0x0000000F;
2746 	if (dev->dev->chip_id == 0x4301) {
2747 		mask |= 0x0060;
2748 		set |= 0x0060;
2749 	}
2750 	if (dev->dev->chip_id == 0x5354)
2751 		set &= 0xff02;
2752 	if (0 /* FIXME: conditional unknown */ ) {
2753 		b43_write16(dev, B43_MMIO_GPIO_MASK,
2754 			    b43_read16(dev, B43_MMIO_GPIO_MASK)
2755 			    | 0x0100);
2756 		mask |= 0x0180;
2757 		set |= 0x0180;
2758 	}
2759 	if (dev->dev->bus_sprom->boardflags_lo & B43_BFL_PACTRL) {
2760 		b43_write16(dev, B43_MMIO_GPIO_MASK,
2761 			    b43_read16(dev, B43_MMIO_GPIO_MASK)
2762 			    | 0x0200);
2763 		mask |= 0x0200;
2764 		set |= 0x0200;
2765 	}
2766 	if (dev->dev->core_rev >= 2)
2767 		mask |= 0x0010;	/* FIXME: This is redundant. */
2768 
2769 	switch (dev->dev->bus_type) {
2770 #ifdef CONFIG_B43_BCMA
2771 	case B43_BUS_BCMA:
2772 		bcma_cc_write32(&dev->dev->bdev->bus->drv_cc, BCMA_CC_GPIOCTL,
2773 				(bcma_cc_read32(&dev->dev->bdev->bus->drv_cc,
2774 					BCMA_CC_GPIOCTL) & mask) | set);
2775 		break;
2776 #endif
2777 #ifdef CONFIG_B43_SSB
2778 	case B43_BUS_SSB:
2779 		gpiodev = b43_ssb_gpio_dev(dev);
2780 		if (gpiodev)
2781 			ssb_write32(gpiodev, B43_GPIO_CONTROL,
2782 				    (ssb_read32(gpiodev, B43_GPIO_CONTROL)
2783 				    & mask) | set);
2784 		break;
2785 #endif
2786 	}
2787 
2788 	return 0;
2789 }
2790 
2791 /* Turn off all GPIO stuff. Call this on module unload, for example. */
b43_gpio_cleanup(struct b43_wldev * dev)2792 static void b43_gpio_cleanup(struct b43_wldev *dev)
2793 {
2794 	struct ssb_device *gpiodev;
2795 
2796 	switch (dev->dev->bus_type) {
2797 #ifdef CONFIG_B43_BCMA
2798 	case B43_BUS_BCMA:
2799 		bcma_cc_write32(&dev->dev->bdev->bus->drv_cc, BCMA_CC_GPIOCTL,
2800 				0);
2801 		break;
2802 #endif
2803 #ifdef CONFIG_B43_SSB
2804 	case B43_BUS_SSB:
2805 		gpiodev = b43_ssb_gpio_dev(dev);
2806 		if (gpiodev)
2807 			ssb_write32(gpiodev, B43_GPIO_CONTROL, 0);
2808 		break;
2809 #endif
2810 	}
2811 }
2812 
2813 /* http://bcm-specs.sipsolutions.net/EnableMac */
b43_mac_enable(struct b43_wldev * dev)2814 void b43_mac_enable(struct b43_wldev *dev)
2815 {
2816 	if (b43_debug(dev, B43_DBG_FIRMWARE)) {
2817 		u16 fwstate;
2818 
2819 		fwstate = b43_shm_read16(dev, B43_SHM_SHARED,
2820 					 B43_SHM_SH_UCODESTAT);
2821 		if ((fwstate != B43_SHM_SH_UCODESTAT_SUSP) &&
2822 		    (fwstate != B43_SHM_SH_UCODESTAT_SLEEP)) {
2823 			b43err(dev->wl, "b43_mac_enable(): The firmware "
2824 			       "should be suspended, but current state is %u\n",
2825 			       fwstate);
2826 		}
2827 	}
2828 
2829 	dev->mac_suspended--;
2830 	B43_WARN_ON(dev->mac_suspended < 0);
2831 	if (dev->mac_suspended == 0) {
2832 		b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_ENABLED);
2833 		b43_write32(dev, B43_MMIO_GEN_IRQ_REASON,
2834 			    B43_IRQ_MAC_SUSPENDED);
2835 		/* Commit writes */
2836 		b43_read32(dev, B43_MMIO_MACCTL);
2837 		b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
2838 		b43_power_saving_ctl_bits(dev, 0);
2839 	}
2840 }
2841 
2842 /* http://bcm-specs.sipsolutions.net/SuspendMAC */
b43_mac_suspend(struct b43_wldev * dev)2843 void b43_mac_suspend(struct b43_wldev *dev)
2844 {
2845 	int i;
2846 	u32 tmp;
2847 
2848 	might_sleep();
2849 	B43_WARN_ON(dev->mac_suspended < 0);
2850 
2851 	if (dev->mac_suspended == 0) {
2852 		b43_power_saving_ctl_bits(dev, B43_PS_AWAKE);
2853 		b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_ENABLED, 0);
2854 		/* force pci to flush the write */
2855 		b43_read32(dev, B43_MMIO_MACCTL);
2856 		for (i = 35; i; i--) {
2857 			tmp = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
2858 			if (tmp & B43_IRQ_MAC_SUSPENDED)
2859 				goto out;
2860 			udelay(10);
2861 		}
2862 		/* Hm, it seems this will take some time. Use msleep(). */
2863 		for (i = 40; i; i--) {
2864 			tmp = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
2865 			if (tmp & B43_IRQ_MAC_SUSPENDED)
2866 				goto out;
2867 			msleep(1);
2868 		}
2869 		b43err(dev->wl, "MAC suspend failed\n");
2870 	}
2871 out:
2872 	dev->mac_suspended++;
2873 }
2874 
2875 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/MacPhyClkSet */
b43_mac_phy_clock_set(struct b43_wldev * dev,bool on)2876 void b43_mac_phy_clock_set(struct b43_wldev *dev, bool on)
2877 {
2878 	u32 tmp;
2879 
2880 	switch (dev->dev->bus_type) {
2881 #ifdef CONFIG_B43_BCMA
2882 	case B43_BUS_BCMA:
2883 		tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
2884 		if (on)
2885 			tmp |= B43_BCMA_IOCTL_MACPHYCLKEN;
2886 		else
2887 			tmp &= ~B43_BCMA_IOCTL_MACPHYCLKEN;
2888 		bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp);
2889 		break;
2890 #endif
2891 #ifdef CONFIG_B43_SSB
2892 	case B43_BUS_SSB:
2893 		tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW);
2894 		if (on)
2895 			tmp |= B43_TMSLOW_MACPHYCLKEN;
2896 		else
2897 			tmp &= ~B43_TMSLOW_MACPHYCLKEN;
2898 		ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp);
2899 		break;
2900 #endif
2901 	}
2902 }
2903 
b43_adjust_opmode(struct b43_wldev * dev)2904 static void b43_adjust_opmode(struct b43_wldev *dev)
2905 {
2906 	struct b43_wl *wl = dev->wl;
2907 	u32 ctl;
2908 	u16 cfp_pretbtt;
2909 
2910 	ctl = b43_read32(dev, B43_MMIO_MACCTL);
2911 	/* Reset status to STA infrastructure mode. */
2912 	ctl &= ~B43_MACCTL_AP;
2913 	ctl &= ~B43_MACCTL_KEEP_CTL;
2914 	ctl &= ~B43_MACCTL_KEEP_BADPLCP;
2915 	ctl &= ~B43_MACCTL_KEEP_BAD;
2916 	ctl &= ~B43_MACCTL_PROMISC;
2917 	ctl &= ~B43_MACCTL_BEACPROMISC;
2918 	ctl |= B43_MACCTL_INFRA;
2919 
2920 	if (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
2921 	    b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT))
2922 		ctl |= B43_MACCTL_AP;
2923 	else if (b43_is_mode(wl, NL80211_IFTYPE_ADHOC))
2924 		ctl &= ~B43_MACCTL_INFRA;
2925 
2926 	if (wl->filter_flags & FIF_CONTROL)
2927 		ctl |= B43_MACCTL_KEEP_CTL;
2928 	if (wl->filter_flags & FIF_FCSFAIL)
2929 		ctl |= B43_MACCTL_KEEP_BAD;
2930 	if (wl->filter_flags & FIF_PLCPFAIL)
2931 		ctl |= B43_MACCTL_KEEP_BADPLCP;
2932 	if (wl->filter_flags & FIF_PROMISC_IN_BSS)
2933 		ctl |= B43_MACCTL_PROMISC;
2934 	if (wl->filter_flags & FIF_BCN_PRBRESP_PROMISC)
2935 		ctl |= B43_MACCTL_BEACPROMISC;
2936 
2937 	/* Workaround: On old hardware the HW-MAC-address-filter
2938 	 * doesn't work properly, so always run promisc in filter
2939 	 * it in software. */
2940 	if (dev->dev->core_rev <= 4)
2941 		ctl |= B43_MACCTL_PROMISC;
2942 
2943 	b43_write32(dev, B43_MMIO_MACCTL, ctl);
2944 
2945 	cfp_pretbtt = 2;
2946 	if ((ctl & B43_MACCTL_INFRA) && !(ctl & B43_MACCTL_AP)) {
2947 		if (dev->dev->chip_id == 0x4306 &&
2948 		    dev->dev->chip_rev == 3)
2949 			cfp_pretbtt = 100;
2950 		else
2951 			cfp_pretbtt = 50;
2952 	}
2953 	b43_write16(dev, 0x612, cfp_pretbtt);
2954 
2955 	/* FIXME: We don't currently implement the PMQ mechanism,
2956 	 *        so always disable it. If we want to implement PMQ,
2957 	 *        we need to enable it here (clear DISCPMQ) in AP mode.
2958 	 */
2959 	if (0  /* ctl & B43_MACCTL_AP */)
2960 		b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_DISCPMQ, 0);
2961 	else
2962 		b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_DISCPMQ);
2963 }
2964 
b43_rate_memory_write(struct b43_wldev * dev,u16 rate,int is_ofdm)2965 static void b43_rate_memory_write(struct b43_wldev *dev, u16 rate, int is_ofdm)
2966 {
2967 	u16 offset;
2968 
2969 	if (is_ofdm) {
2970 		offset = 0x480;
2971 		offset += (b43_plcp_get_ratecode_ofdm(rate) & 0x000F) * 2;
2972 	} else {
2973 		offset = 0x4C0;
2974 		offset += (b43_plcp_get_ratecode_cck(rate) & 0x000F) * 2;
2975 	}
2976 	b43_shm_write16(dev, B43_SHM_SHARED, offset + 0x20,
2977 			b43_shm_read16(dev, B43_SHM_SHARED, offset));
2978 }
2979 
b43_rate_memory_init(struct b43_wldev * dev)2980 static void b43_rate_memory_init(struct b43_wldev *dev)
2981 {
2982 	switch (dev->phy.type) {
2983 	case B43_PHYTYPE_A:
2984 	case B43_PHYTYPE_G:
2985 	case B43_PHYTYPE_N:
2986 	case B43_PHYTYPE_LP:
2987 	case B43_PHYTYPE_HT:
2988 	case B43_PHYTYPE_LCN:
2989 		b43_rate_memory_write(dev, B43_OFDM_RATE_6MB, 1);
2990 		b43_rate_memory_write(dev, B43_OFDM_RATE_12MB, 1);
2991 		b43_rate_memory_write(dev, B43_OFDM_RATE_18MB, 1);
2992 		b43_rate_memory_write(dev, B43_OFDM_RATE_24MB, 1);
2993 		b43_rate_memory_write(dev, B43_OFDM_RATE_36MB, 1);
2994 		b43_rate_memory_write(dev, B43_OFDM_RATE_48MB, 1);
2995 		b43_rate_memory_write(dev, B43_OFDM_RATE_54MB, 1);
2996 		if (dev->phy.type == B43_PHYTYPE_A)
2997 			break;
2998 		/* fallthrough */
2999 	case B43_PHYTYPE_B:
3000 		b43_rate_memory_write(dev, B43_CCK_RATE_1MB, 0);
3001 		b43_rate_memory_write(dev, B43_CCK_RATE_2MB, 0);
3002 		b43_rate_memory_write(dev, B43_CCK_RATE_5MB, 0);
3003 		b43_rate_memory_write(dev, B43_CCK_RATE_11MB, 0);
3004 		break;
3005 	default:
3006 		B43_WARN_ON(1);
3007 	}
3008 }
3009 
3010 /* Set the default values for the PHY TX Control Words. */
b43_set_phytxctl_defaults(struct b43_wldev * dev)3011 static void b43_set_phytxctl_defaults(struct b43_wldev *dev)
3012 {
3013 	u16 ctl = 0;
3014 
3015 	ctl |= B43_TXH_PHY_ENC_CCK;
3016 	ctl |= B43_TXH_PHY_ANT01AUTO;
3017 	ctl |= B43_TXH_PHY_TXPWR;
3018 
3019 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL, ctl);
3020 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_ACKCTSPHYCTL, ctl);
3021 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL, ctl);
3022 }
3023 
3024 /* Set the TX-Antenna for management frames sent by firmware. */
b43_mgmtframe_txantenna(struct b43_wldev * dev,int antenna)3025 static void b43_mgmtframe_txantenna(struct b43_wldev *dev, int antenna)
3026 {
3027 	u16 ant;
3028 	u16 tmp;
3029 
3030 	ant = b43_antenna_to_phyctl(antenna);
3031 
3032 	/* For ACK/CTS */
3033 	tmp = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_ACKCTSPHYCTL);
3034 	tmp = (tmp & ~B43_TXH_PHY_ANT) | ant;
3035 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_ACKCTSPHYCTL, tmp);
3036 	/* For Probe Resposes */
3037 	tmp = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL);
3038 	tmp = (tmp & ~B43_TXH_PHY_ANT) | ant;
3039 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL, tmp);
3040 }
3041 
3042 /* This is the opposite of b43_chip_init() */
b43_chip_exit(struct b43_wldev * dev)3043 static void b43_chip_exit(struct b43_wldev *dev)
3044 {
3045 	b43_phy_exit(dev);
3046 	b43_gpio_cleanup(dev);
3047 	/* firmware is released later */
3048 }
3049 
3050 /* Initialize the chip
3051  * http://bcm-specs.sipsolutions.net/ChipInit
3052  */
b43_chip_init(struct b43_wldev * dev)3053 static int b43_chip_init(struct b43_wldev *dev)
3054 {
3055 	struct b43_phy *phy = &dev->phy;
3056 	int err;
3057 	u32 macctl;
3058 	u16 value16;
3059 
3060 	/* Initialize the MAC control */
3061 	macctl = B43_MACCTL_IHR_ENABLED | B43_MACCTL_SHM_ENABLED;
3062 	if (dev->phy.gmode)
3063 		macctl |= B43_MACCTL_GMODE;
3064 	macctl |= B43_MACCTL_INFRA;
3065 	b43_write32(dev, B43_MMIO_MACCTL, macctl);
3066 
3067 	err = b43_upload_microcode(dev);
3068 	if (err)
3069 		goto out;	/* firmware is released later */
3070 
3071 	err = b43_gpio_init(dev);
3072 	if (err)
3073 		goto out;	/* firmware is released later */
3074 
3075 	err = b43_upload_initvals(dev);
3076 	if (err)
3077 		goto err_gpio_clean;
3078 
3079 	/* Turn the Analog on and initialize the PHY. */
3080 	phy->ops->switch_analog(dev, 1);
3081 	err = b43_phy_init(dev);
3082 	if (err)
3083 		goto err_gpio_clean;
3084 
3085 	/* Disable Interference Mitigation. */
3086 	if (phy->ops->interf_mitigation)
3087 		phy->ops->interf_mitigation(dev, B43_INTERFMODE_NONE);
3088 
3089 	/* Select the antennae */
3090 	if (phy->ops->set_rx_antenna)
3091 		phy->ops->set_rx_antenna(dev, B43_ANTENNA_DEFAULT);
3092 	b43_mgmtframe_txantenna(dev, B43_ANTENNA_DEFAULT);
3093 
3094 	if (phy->type == B43_PHYTYPE_B) {
3095 		value16 = b43_read16(dev, 0x005E);
3096 		value16 |= 0x0004;
3097 		b43_write16(dev, 0x005E, value16);
3098 	}
3099 	b43_write32(dev, 0x0100, 0x01000000);
3100 	if (dev->dev->core_rev < 5)
3101 		b43_write32(dev, 0x010C, 0x01000000);
3102 
3103 	b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_INFRA, 0);
3104 	b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_INFRA);
3105 
3106 	/* Probe Response Timeout value */
3107 	/* FIXME: Default to 0, has to be set by ioctl probably... :-/ */
3108 	b43_shm_write16(dev, B43_SHM_SHARED, 0x0074, 0x0000);
3109 
3110 	/* Initially set the wireless operation mode. */
3111 	b43_adjust_opmode(dev);
3112 
3113 	if (dev->dev->core_rev < 3) {
3114 		b43_write16(dev, 0x060E, 0x0000);
3115 		b43_write16(dev, 0x0610, 0x8000);
3116 		b43_write16(dev, 0x0604, 0x0000);
3117 		b43_write16(dev, 0x0606, 0x0200);
3118 	} else {
3119 		b43_write32(dev, 0x0188, 0x80000000);
3120 		b43_write32(dev, 0x018C, 0x02000000);
3121 	}
3122 	b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, 0x00004000);
3123 	b43_write32(dev, B43_MMIO_DMA0_IRQ_MASK, 0x0001FC00);
3124 	b43_write32(dev, B43_MMIO_DMA1_IRQ_MASK, 0x0000DC00);
3125 	b43_write32(dev, B43_MMIO_DMA2_IRQ_MASK, 0x0000DC00);
3126 	b43_write32(dev, B43_MMIO_DMA3_IRQ_MASK, 0x0001DC00);
3127 	b43_write32(dev, B43_MMIO_DMA4_IRQ_MASK, 0x0000DC00);
3128 	b43_write32(dev, B43_MMIO_DMA5_IRQ_MASK, 0x0000DC00);
3129 
3130 	b43_mac_phy_clock_set(dev, true);
3131 
3132 	switch (dev->dev->bus_type) {
3133 #ifdef CONFIG_B43_BCMA
3134 	case B43_BUS_BCMA:
3135 		/* FIXME: 0xE74 is quite common, but should be read from CC */
3136 		b43_write16(dev, B43_MMIO_POWERUP_DELAY, 0xE74);
3137 		break;
3138 #endif
3139 #ifdef CONFIG_B43_SSB
3140 	case B43_BUS_SSB:
3141 		b43_write16(dev, B43_MMIO_POWERUP_DELAY,
3142 			    dev->dev->sdev->bus->chipco.fast_pwrup_delay);
3143 		break;
3144 #endif
3145 	}
3146 
3147 	err = 0;
3148 	b43dbg(dev->wl, "Chip initialized\n");
3149 out:
3150 	return err;
3151 
3152 err_gpio_clean:
3153 	b43_gpio_cleanup(dev);
3154 	return err;
3155 }
3156 
b43_periodic_every60sec(struct b43_wldev * dev)3157 static void b43_periodic_every60sec(struct b43_wldev *dev)
3158 {
3159 	const struct b43_phy_operations *ops = dev->phy.ops;
3160 
3161 	if (ops->pwork_60sec)
3162 		ops->pwork_60sec(dev);
3163 
3164 	/* Force check the TX power emission now. */
3165 	b43_phy_txpower_check(dev, B43_TXPWR_IGNORE_TIME);
3166 }
3167 
b43_periodic_every30sec(struct b43_wldev * dev)3168 static void b43_periodic_every30sec(struct b43_wldev *dev)
3169 {
3170 	/* Update device statistics. */
3171 	b43_calculate_link_quality(dev);
3172 }
3173 
b43_periodic_every15sec(struct b43_wldev * dev)3174 static void b43_periodic_every15sec(struct b43_wldev *dev)
3175 {
3176 	struct b43_phy *phy = &dev->phy;
3177 	u16 wdr;
3178 
3179 	if (dev->fw.opensource) {
3180 		/* Check if the firmware is still alive.
3181 		 * It will reset the watchdog counter to 0 in its idle loop. */
3182 		wdr = b43_shm_read16(dev, B43_SHM_SCRATCH, B43_WATCHDOG_REG);
3183 		if (unlikely(wdr)) {
3184 			b43err(dev->wl, "Firmware watchdog: The firmware died!\n");
3185 			b43_controller_restart(dev, "Firmware watchdog");
3186 			return;
3187 		} else {
3188 			b43_shm_write16(dev, B43_SHM_SCRATCH,
3189 					B43_WATCHDOG_REG, 1);
3190 		}
3191 	}
3192 
3193 	if (phy->ops->pwork_15sec)
3194 		phy->ops->pwork_15sec(dev);
3195 
3196 	atomic_set(&phy->txerr_cnt, B43_PHY_TX_BADNESS_LIMIT);
3197 	wmb();
3198 
3199 #if B43_DEBUG
3200 	if (b43_debug(dev, B43_DBG_VERBOSESTATS)) {
3201 		unsigned int i;
3202 
3203 		b43dbg(dev->wl, "Stats: %7u IRQs/sec, %7u TX/sec, %7u RX/sec\n",
3204 		       dev->irq_count / 15,
3205 		       dev->tx_count / 15,
3206 		       dev->rx_count / 15);
3207 		dev->irq_count = 0;
3208 		dev->tx_count = 0;
3209 		dev->rx_count = 0;
3210 		for (i = 0; i < ARRAY_SIZE(dev->irq_bit_count); i++) {
3211 			if (dev->irq_bit_count[i]) {
3212 				b43dbg(dev->wl, "Stats: %7u IRQ-%02u/sec (0x%08X)\n",
3213 				       dev->irq_bit_count[i] / 15, i, (1 << i));
3214 				dev->irq_bit_count[i] = 0;
3215 			}
3216 		}
3217 	}
3218 #endif
3219 }
3220 
do_periodic_work(struct b43_wldev * dev)3221 static void do_periodic_work(struct b43_wldev *dev)
3222 {
3223 	unsigned int state;
3224 
3225 	state = dev->periodic_state;
3226 	if (state % 4 == 0)
3227 		b43_periodic_every60sec(dev);
3228 	if (state % 2 == 0)
3229 		b43_periodic_every30sec(dev);
3230 	b43_periodic_every15sec(dev);
3231 }
3232 
3233 /* Periodic work locking policy:
3234  * 	The whole periodic work handler is protected by
3235  * 	wl->mutex. If another lock is needed somewhere in the
3236  * 	pwork callchain, it's acquired in-place, where it's needed.
3237  */
b43_periodic_work_handler(struct work_struct * work)3238 static void b43_periodic_work_handler(struct work_struct *work)
3239 {
3240 	struct b43_wldev *dev = container_of(work, struct b43_wldev,
3241 					     periodic_work.work);
3242 	struct b43_wl *wl = dev->wl;
3243 	unsigned long delay;
3244 
3245 	mutex_lock(&wl->mutex);
3246 
3247 	if (unlikely(b43_status(dev) != B43_STAT_STARTED))
3248 		goto out;
3249 	if (b43_debug(dev, B43_DBG_PWORK_STOP))
3250 		goto out_requeue;
3251 
3252 	do_periodic_work(dev);
3253 
3254 	dev->periodic_state++;
3255 out_requeue:
3256 	if (b43_debug(dev, B43_DBG_PWORK_FAST))
3257 		delay = msecs_to_jiffies(50);
3258 	else
3259 		delay = round_jiffies_relative(HZ * 15);
3260 	ieee80211_queue_delayed_work(wl->hw, &dev->periodic_work, delay);
3261 out:
3262 	mutex_unlock(&wl->mutex);
3263 }
3264 
b43_periodic_tasks_setup(struct b43_wldev * dev)3265 static void b43_periodic_tasks_setup(struct b43_wldev *dev)
3266 {
3267 	struct delayed_work *work = &dev->periodic_work;
3268 
3269 	dev->periodic_state = 0;
3270 	INIT_DELAYED_WORK(work, b43_periodic_work_handler);
3271 	ieee80211_queue_delayed_work(dev->wl->hw, work, 0);
3272 }
3273 
3274 /* Check if communication with the device works correctly. */
b43_validate_chipaccess(struct b43_wldev * dev)3275 static int b43_validate_chipaccess(struct b43_wldev *dev)
3276 {
3277 	u32 v, backup0, backup4;
3278 
3279 	backup0 = b43_shm_read32(dev, B43_SHM_SHARED, 0);
3280 	backup4 = b43_shm_read32(dev, B43_SHM_SHARED, 4);
3281 
3282 	/* Check for read/write and endianness problems. */
3283 	b43_shm_write32(dev, B43_SHM_SHARED, 0, 0x55AAAA55);
3284 	if (b43_shm_read32(dev, B43_SHM_SHARED, 0) != 0x55AAAA55)
3285 		goto error;
3286 	b43_shm_write32(dev, B43_SHM_SHARED, 0, 0xAA5555AA);
3287 	if (b43_shm_read32(dev, B43_SHM_SHARED, 0) != 0xAA5555AA)
3288 		goto error;
3289 
3290 	/* Check if unaligned 32bit SHM_SHARED access works properly.
3291 	 * However, don't bail out on failure, because it's noncritical. */
3292 	b43_shm_write16(dev, B43_SHM_SHARED, 0, 0x1122);
3293 	b43_shm_write16(dev, B43_SHM_SHARED, 2, 0x3344);
3294 	b43_shm_write16(dev, B43_SHM_SHARED, 4, 0x5566);
3295 	b43_shm_write16(dev, B43_SHM_SHARED, 6, 0x7788);
3296 	if (b43_shm_read32(dev, B43_SHM_SHARED, 2) != 0x55663344)
3297 		b43warn(dev->wl, "Unaligned 32bit SHM read access is broken\n");
3298 	b43_shm_write32(dev, B43_SHM_SHARED, 2, 0xAABBCCDD);
3299 	if (b43_shm_read16(dev, B43_SHM_SHARED, 0) != 0x1122 ||
3300 	    b43_shm_read16(dev, B43_SHM_SHARED, 2) != 0xCCDD ||
3301 	    b43_shm_read16(dev, B43_SHM_SHARED, 4) != 0xAABB ||
3302 	    b43_shm_read16(dev, B43_SHM_SHARED, 6) != 0x7788)
3303 		b43warn(dev->wl, "Unaligned 32bit SHM write access is broken\n");
3304 
3305 	b43_shm_write32(dev, B43_SHM_SHARED, 0, backup0);
3306 	b43_shm_write32(dev, B43_SHM_SHARED, 4, backup4);
3307 
3308 	if ((dev->dev->core_rev >= 3) && (dev->dev->core_rev <= 10)) {
3309 		/* The 32bit register shadows the two 16bit registers
3310 		 * with update sideeffects. Validate this. */
3311 		b43_write16(dev, B43_MMIO_TSF_CFP_START, 0xAAAA);
3312 		b43_write32(dev, B43_MMIO_TSF_CFP_START, 0xCCCCBBBB);
3313 		if (b43_read16(dev, B43_MMIO_TSF_CFP_START_LOW) != 0xBBBB)
3314 			goto error;
3315 		if (b43_read16(dev, B43_MMIO_TSF_CFP_START_HIGH) != 0xCCCC)
3316 			goto error;
3317 	}
3318 	b43_write32(dev, B43_MMIO_TSF_CFP_START, 0);
3319 
3320 	v = b43_read32(dev, B43_MMIO_MACCTL);
3321 	v |= B43_MACCTL_GMODE;
3322 	if (v != (B43_MACCTL_GMODE | B43_MACCTL_IHR_ENABLED))
3323 		goto error;
3324 
3325 	return 0;
3326 error:
3327 	b43err(dev->wl, "Failed to validate the chipaccess\n");
3328 	return -ENODEV;
3329 }
3330 
b43_security_init(struct b43_wldev * dev)3331 static void b43_security_init(struct b43_wldev *dev)
3332 {
3333 	dev->ktp = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_KTP);
3334 	/* KTP is a word address, but we address SHM bytewise.
3335 	 * So multiply by two.
3336 	 */
3337 	dev->ktp *= 2;
3338 	/* Number of RCMTA address slots */
3339 	b43_write16(dev, B43_MMIO_RCMTA_COUNT, B43_NR_PAIRWISE_KEYS);
3340 	/* Clear the key memory. */
3341 	b43_clear_keys(dev);
3342 }
3343 
3344 #ifdef CONFIG_B43_HWRNG
b43_rng_read(struct hwrng * rng,u32 * data)3345 static int b43_rng_read(struct hwrng *rng, u32 *data)
3346 {
3347 	struct b43_wl *wl = (struct b43_wl *)rng->priv;
3348 	struct b43_wldev *dev;
3349 	int count = -ENODEV;
3350 
3351 	mutex_lock(&wl->mutex);
3352 	dev = wl->current_dev;
3353 	if (likely(dev && b43_status(dev) >= B43_STAT_INITIALIZED)) {
3354 		*data = b43_read16(dev, B43_MMIO_RNG);
3355 		count = sizeof(u16);
3356 	}
3357 	mutex_unlock(&wl->mutex);
3358 
3359 	return count;
3360 }
3361 #endif /* CONFIG_B43_HWRNG */
3362 
b43_rng_exit(struct b43_wl * wl)3363 static void b43_rng_exit(struct b43_wl *wl)
3364 {
3365 #ifdef CONFIG_B43_HWRNG
3366 	if (wl->rng_initialized)
3367 		hwrng_unregister(&wl->rng);
3368 #endif /* CONFIG_B43_HWRNG */
3369 }
3370 
b43_rng_init(struct b43_wl * wl)3371 static int b43_rng_init(struct b43_wl *wl)
3372 {
3373 	int err = 0;
3374 
3375 #ifdef CONFIG_B43_HWRNG
3376 	snprintf(wl->rng_name, ARRAY_SIZE(wl->rng_name),
3377 		 "%s_%s", KBUILD_MODNAME, wiphy_name(wl->hw->wiphy));
3378 	wl->rng.name = wl->rng_name;
3379 	wl->rng.data_read = b43_rng_read;
3380 	wl->rng.priv = (unsigned long)wl;
3381 	wl->rng_initialized = true;
3382 	err = hwrng_register(&wl->rng);
3383 	if (err) {
3384 		wl->rng_initialized = false;
3385 		b43err(wl, "Failed to register the random "
3386 		       "number generator (%d)\n", err);
3387 	}
3388 #endif /* CONFIG_B43_HWRNG */
3389 
3390 	return err;
3391 }
3392 
b43_tx_work(struct work_struct * work)3393 static void b43_tx_work(struct work_struct *work)
3394 {
3395 	struct b43_wl *wl = container_of(work, struct b43_wl, tx_work);
3396 	struct b43_wldev *dev;
3397 	struct sk_buff *skb;
3398 	int queue_num;
3399 	int err = 0;
3400 
3401 	mutex_lock(&wl->mutex);
3402 	dev = wl->current_dev;
3403 	if (unlikely(!dev || b43_status(dev) < B43_STAT_STARTED)) {
3404 		mutex_unlock(&wl->mutex);
3405 		return;
3406 	}
3407 
3408 	for (queue_num = 0; queue_num < B43_QOS_QUEUE_NUM; queue_num++) {
3409 		while (skb_queue_len(&wl->tx_queue[queue_num])) {
3410 			skb = skb_dequeue(&wl->tx_queue[queue_num]);
3411 			if (b43_using_pio_transfers(dev))
3412 				err = b43_pio_tx(dev, skb);
3413 			else
3414 				err = b43_dma_tx(dev, skb);
3415 			if (err == -ENOSPC) {
3416 				wl->tx_queue_stopped[queue_num] = 1;
3417 				ieee80211_stop_queue(wl->hw, queue_num);
3418 				skb_queue_head(&wl->tx_queue[queue_num], skb);
3419 				break;
3420 			}
3421 			if (unlikely(err))
3422 				ieee80211_free_txskb(wl->hw, skb);
3423 			err = 0;
3424 		}
3425 
3426 		if (!err)
3427 			wl->tx_queue_stopped[queue_num] = 0;
3428 	}
3429 
3430 #if B43_DEBUG
3431 	dev->tx_count++;
3432 #endif
3433 	mutex_unlock(&wl->mutex);
3434 }
3435 
b43_op_tx(struct ieee80211_hw * hw,struct sk_buff * skb)3436 static void b43_op_tx(struct ieee80211_hw *hw,
3437 		     struct sk_buff *skb)
3438 {
3439 	struct b43_wl *wl = hw_to_b43_wl(hw);
3440 
3441 	if (unlikely(skb->len < 2 + 2 + 6)) {
3442 		/* Too short, this can't be a valid frame. */
3443 		ieee80211_free_txskb(hw, skb);
3444 		return;
3445 	}
3446 	B43_WARN_ON(skb_shinfo(skb)->nr_frags);
3447 
3448 	skb_queue_tail(&wl->tx_queue[skb->queue_mapping], skb);
3449 	if (!wl->tx_queue_stopped[skb->queue_mapping]) {
3450 		ieee80211_queue_work(wl->hw, &wl->tx_work);
3451 	} else {
3452 		ieee80211_stop_queue(wl->hw, skb->queue_mapping);
3453 	}
3454 }
3455 
b43_qos_params_upload(struct b43_wldev * dev,const struct ieee80211_tx_queue_params * p,u16 shm_offset)3456 static void b43_qos_params_upload(struct b43_wldev *dev,
3457 				  const struct ieee80211_tx_queue_params *p,
3458 				  u16 shm_offset)
3459 {
3460 	u16 params[B43_NR_QOSPARAMS];
3461 	int bslots, tmp;
3462 	unsigned int i;
3463 
3464 	if (!dev->qos_enabled)
3465 		return;
3466 
3467 	bslots = b43_read16(dev, B43_MMIO_RNG) & p->cw_min;
3468 
3469 	memset(&params, 0, sizeof(params));
3470 
3471 	params[B43_QOSPARAM_TXOP] = p->txop * 32;
3472 	params[B43_QOSPARAM_CWMIN] = p->cw_min;
3473 	params[B43_QOSPARAM_CWMAX] = p->cw_max;
3474 	params[B43_QOSPARAM_CWCUR] = p->cw_min;
3475 	params[B43_QOSPARAM_AIFS] = p->aifs;
3476 	params[B43_QOSPARAM_BSLOTS] = bslots;
3477 	params[B43_QOSPARAM_REGGAP] = bslots + p->aifs;
3478 
3479 	for (i = 0; i < ARRAY_SIZE(params); i++) {
3480 		if (i == B43_QOSPARAM_STATUS) {
3481 			tmp = b43_shm_read16(dev, B43_SHM_SHARED,
3482 					     shm_offset + (i * 2));
3483 			/* Mark the parameters as updated. */
3484 			tmp |= 0x100;
3485 			b43_shm_write16(dev, B43_SHM_SHARED,
3486 					shm_offset + (i * 2),
3487 					tmp);
3488 		} else {
3489 			b43_shm_write16(dev, B43_SHM_SHARED,
3490 					shm_offset + (i * 2),
3491 					params[i]);
3492 		}
3493 	}
3494 }
3495 
3496 /* Mapping of mac80211 queue numbers to b43 QoS SHM offsets. */
3497 static const u16 b43_qos_shm_offsets[] = {
3498 	/* [mac80211-queue-nr] = SHM_OFFSET, */
3499 	[0] = B43_QOS_VOICE,
3500 	[1] = B43_QOS_VIDEO,
3501 	[2] = B43_QOS_BESTEFFORT,
3502 	[3] = B43_QOS_BACKGROUND,
3503 };
3504 
3505 /* Update all QOS parameters in hardware. */
b43_qos_upload_all(struct b43_wldev * dev)3506 static void b43_qos_upload_all(struct b43_wldev *dev)
3507 {
3508 	struct b43_wl *wl = dev->wl;
3509 	struct b43_qos_params *params;
3510 	unsigned int i;
3511 
3512 	if (!dev->qos_enabled)
3513 		return;
3514 
3515 	BUILD_BUG_ON(ARRAY_SIZE(b43_qos_shm_offsets) !=
3516 		     ARRAY_SIZE(wl->qos_params));
3517 
3518 	b43_mac_suspend(dev);
3519 	for (i = 0; i < ARRAY_SIZE(wl->qos_params); i++) {
3520 		params = &(wl->qos_params[i]);
3521 		b43_qos_params_upload(dev, &(params->p),
3522 				      b43_qos_shm_offsets[i]);
3523 	}
3524 	b43_mac_enable(dev);
3525 }
3526 
b43_qos_clear(struct b43_wl * wl)3527 static void b43_qos_clear(struct b43_wl *wl)
3528 {
3529 	struct b43_qos_params *params;
3530 	unsigned int i;
3531 
3532 	/* Initialize QoS parameters to sane defaults. */
3533 
3534 	BUILD_BUG_ON(ARRAY_SIZE(b43_qos_shm_offsets) !=
3535 		     ARRAY_SIZE(wl->qos_params));
3536 
3537 	for (i = 0; i < ARRAY_SIZE(wl->qos_params); i++) {
3538 		params = &(wl->qos_params[i]);
3539 
3540 		switch (b43_qos_shm_offsets[i]) {
3541 		case B43_QOS_VOICE:
3542 			params->p.txop = 0;
3543 			params->p.aifs = 2;
3544 			params->p.cw_min = 0x0001;
3545 			params->p.cw_max = 0x0001;
3546 			break;
3547 		case B43_QOS_VIDEO:
3548 			params->p.txop = 0;
3549 			params->p.aifs = 2;
3550 			params->p.cw_min = 0x0001;
3551 			params->p.cw_max = 0x0001;
3552 			break;
3553 		case B43_QOS_BESTEFFORT:
3554 			params->p.txop = 0;
3555 			params->p.aifs = 3;
3556 			params->p.cw_min = 0x0001;
3557 			params->p.cw_max = 0x03FF;
3558 			break;
3559 		case B43_QOS_BACKGROUND:
3560 			params->p.txop = 0;
3561 			params->p.aifs = 7;
3562 			params->p.cw_min = 0x0001;
3563 			params->p.cw_max = 0x03FF;
3564 			break;
3565 		default:
3566 			B43_WARN_ON(1);
3567 		}
3568 	}
3569 }
3570 
3571 /* Initialize the core's QOS capabilities */
b43_qos_init(struct b43_wldev * dev)3572 static void b43_qos_init(struct b43_wldev *dev)
3573 {
3574 	if (!dev->qos_enabled) {
3575 		/* Disable QOS support. */
3576 		b43_hf_write(dev, b43_hf_read(dev) & ~B43_HF_EDCF);
3577 		b43_write16(dev, B43_MMIO_IFSCTL,
3578 			    b43_read16(dev, B43_MMIO_IFSCTL)
3579 			    & ~B43_MMIO_IFSCTL_USE_EDCF);
3580 		b43dbg(dev->wl, "QoS disabled\n");
3581 		return;
3582 	}
3583 
3584 	/* Upload the current QOS parameters. */
3585 	b43_qos_upload_all(dev);
3586 
3587 	/* Enable QOS support. */
3588 	b43_hf_write(dev, b43_hf_read(dev) | B43_HF_EDCF);
3589 	b43_write16(dev, B43_MMIO_IFSCTL,
3590 		    b43_read16(dev, B43_MMIO_IFSCTL)
3591 		    | B43_MMIO_IFSCTL_USE_EDCF);
3592 	b43dbg(dev->wl, "QoS enabled\n");
3593 }
3594 
b43_op_conf_tx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u16 _queue,const struct ieee80211_tx_queue_params * params)3595 static int b43_op_conf_tx(struct ieee80211_hw *hw,
3596 			  struct ieee80211_vif *vif, u16 _queue,
3597 			  const struct ieee80211_tx_queue_params *params)
3598 {
3599 	struct b43_wl *wl = hw_to_b43_wl(hw);
3600 	struct b43_wldev *dev;
3601 	unsigned int queue = (unsigned int)_queue;
3602 	int err = -ENODEV;
3603 
3604 	if (queue >= ARRAY_SIZE(wl->qos_params)) {
3605 		/* Queue not available or don't support setting
3606 		 * params on this queue. Return success to not
3607 		 * confuse mac80211. */
3608 		return 0;
3609 	}
3610 	BUILD_BUG_ON(ARRAY_SIZE(b43_qos_shm_offsets) !=
3611 		     ARRAY_SIZE(wl->qos_params));
3612 
3613 	mutex_lock(&wl->mutex);
3614 	dev = wl->current_dev;
3615 	if (unlikely(!dev || (b43_status(dev) < B43_STAT_INITIALIZED)))
3616 		goto out_unlock;
3617 
3618 	memcpy(&(wl->qos_params[queue].p), params, sizeof(*params));
3619 	b43_mac_suspend(dev);
3620 	b43_qos_params_upload(dev, &(wl->qos_params[queue].p),
3621 			      b43_qos_shm_offsets[queue]);
3622 	b43_mac_enable(dev);
3623 	err = 0;
3624 
3625 out_unlock:
3626 	mutex_unlock(&wl->mutex);
3627 
3628 	return err;
3629 }
3630 
b43_op_get_stats(struct ieee80211_hw * hw,struct ieee80211_low_level_stats * stats)3631 static int b43_op_get_stats(struct ieee80211_hw *hw,
3632 			    struct ieee80211_low_level_stats *stats)
3633 {
3634 	struct b43_wl *wl = hw_to_b43_wl(hw);
3635 
3636 	mutex_lock(&wl->mutex);
3637 	memcpy(stats, &wl->ieee_stats, sizeof(*stats));
3638 	mutex_unlock(&wl->mutex);
3639 
3640 	return 0;
3641 }
3642 
b43_op_get_tsf(struct ieee80211_hw * hw,struct ieee80211_vif * vif)3643 static u64 b43_op_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
3644 {
3645 	struct b43_wl *wl = hw_to_b43_wl(hw);
3646 	struct b43_wldev *dev;
3647 	u64 tsf;
3648 
3649 	mutex_lock(&wl->mutex);
3650 	dev = wl->current_dev;
3651 
3652 	if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED))
3653 		b43_tsf_read(dev, &tsf);
3654 	else
3655 		tsf = 0;
3656 
3657 	mutex_unlock(&wl->mutex);
3658 
3659 	return tsf;
3660 }
3661 
b43_op_set_tsf(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u64 tsf)3662 static void b43_op_set_tsf(struct ieee80211_hw *hw,
3663 			   struct ieee80211_vif *vif, u64 tsf)
3664 {
3665 	struct b43_wl *wl = hw_to_b43_wl(hw);
3666 	struct b43_wldev *dev;
3667 
3668 	mutex_lock(&wl->mutex);
3669 	dev = wl->current_dev;
3670 
3671 	if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED))
3672 		b43_tsf_write(dev, tsf);
3673 
3674 	mutex_unlock(&wl->mutex);
3675 }
3676 
b43_put_phy_into_reset(struct b43_wldev * dev)3677 static void b43_put_phy_into_reset(struct b43_wldev *dev)
3678 {
3679 	u32 tmp;
3680 
3681 	switch (dev->dev->bus_type) {
3682 #ifdef CONFIG_B43_BCMA
3683 	case B43_BUS_BCMA:
3684 		b43err(dev->wl,
3685 		       "Putting PHY into reset not supported on BCMA\n");
3686 		break;
3687 #endif
3688 #ifdef CONFIG_B43_SSB
3689 	case B43_BUS_SSB:
3690 		tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW);
3691 		tmp &= ~B43_TMSLOW_GMODE;
3692 		tmp |= B43_TMSLOW_PHYRESET;
3693 		tmp |= SSB_TMSLOW_FGC;
3694 		ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp);
3695 		msleep(1);
3696 
3697 		tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW);
3698 		tmp &= ~SSB_TMSLOW_FGC;
3699 		tmp |= B43_TMSLOW_PHYRESET;
3700 		ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp);
3701 		msleep(1);
3702 
3703 		break;
3704 #endif
3705 	}
3706 }
3707 
band_to_string(enum ieee80211_band band)3708 static const char *band_to_string(enum ieee80211_band band)
3709 {
3710 	switch (band) {
3711 	case IEEE80211_BAND_5GHZ:
3712 		return "5";
3713 	case IEEE80211_BAND_2GHZ:
3714 		return "2.4";
3715 	default:
3716 		break;
3717 	}
3718 	B43_WARN_ON(1);
3719 	return "";
3720 }
3721 
3722 /* Expects wl->mutex locked */
b43_switch_band(struct b43_wl * wl,struct ieee80211_channel * chan)3723 static int b43_switch_band(struct b43_wl *wl, struct ieee80211_channel *chan)
3724 {
3725 	struct b43_wldev *up_dev = NULL;
3726 	struct b43_wldev *down_dev;
3727 	struct b43_wldev *d;
3728 	int err;
3729 	bool uninitialized_var(gmode);
3730 	int prev_status;
3731 
3732 	/* Find a device and PHY which supports the band. */
3733 	list_for_each_entry(d, &wl->devlist, list) {
3734 		switch (chan->band) {
3735 		case IEEE80211_BAND_5GHZ:
3736 			if (d->phy.supports_5ghz) {
3737 				up_dev = d;
3738 				gmode = false;
3739 			}
3740 			break;
3741 		case IEEE80211_BAND_2GHZ:
3742 			if (d->phy.supports_2ghz) {
3743 				up_dev = d;
3744 				gmode = true;
3745 			}
3746 			break;
3747 		default:
3748 			B43_WARN_ON(1);
3749 			return -EINVAL;
3750 		}
3751 		if (up_dev)
3752 			break;
3753 	}
3754 	if (!up_dev) {
3755 		b43err(wl, "Could not find a device for %s-GHz band operation\n",
3756 		       band_to_string(chan->band));
3757 		return -ENODEV;
3758 	}
3759 	if ((up_dev == wl->current_dev) &&
3760 	    (!!wl->current_dev->phy.gmode == !!gmode)) {
3761 		/* This device is already running. */
3762 		return 0;
3763 	}
3764 	b43dbg(wl, "Switching to %s-GHz band\n",
3765 	       band_to_string(chan->band));
3766 	down_dev = wl->current_dev;
3767 
3768 	prev_status = b43_status(down_dev);
3769 	/* Shutdown the currently running core. */
3770 	if (prev_status >= B43_STAT_STARTED)
3771 		down_dev = b43_wireless_core_stop(down_dev);
3772 	if (prev_status >= B43_STAT_INITIALIZED)
3773 		b43_wireless_core_exit(down_dev);
3774 
3775 	if (down_dev != up_dev) {
3776 		/* We switch to a different core, so we put PHY into
3777 		 * RESET on the old core. */
3778 		b43_put_phy_into_reset(down_dev);
3779 	}
3780 
3781 	/* Now start the new core. */
3782 	up_dev->phy.gmode = gmode;
3783 	if (prev_status >= B43_STAT_INITIALIZED) {
3784 		err = b43_wireless_core_init(up_dev);
3785 		if (err) {
3786 			b43err(wl, "Fatal: Could not initialize device for "
3787 			       "selected %s-GHz band\n",
3788 			       band_to_string(chan->band));
3789 			goto init_failure;
3790 		}
3791 	}
3792 	if (prev_status >= B43_STAT_STARTED) {
3793 		err = b43_wireless_core_start(up_dev);
3794 		if (err) {
3795 			b43err(wl, "Fatal: Coult not start device for "
3796 			       "selected %s-GHz band\n",
3797 			       band_to_string(chan->band));
3798 			b43_wireless_core_exit(up_dev);
3799 			goto init_failure;
3800 		}
3801 	}
3802 	B43_WARN_ON(b43_status(up_dev) != prev_status);
3803 
3804 	wl->current_dev = up_dev;
3805 
3806 	return 0;
3807 init_failure:
3808 	/* Whoops, failed to init the new core. No core is operating now. */
3809 	wl->current_dev = NULL;
3810 	return err;
3811 }
3812 
3813 /* Write the short and long frame retry limit values. */
b43_set_retry_limits(struct b43_wldev * dev,unsigned int short_retry,unsigned int long_retry)3814 static void b43_set_retry_limits(struct b43_wldev *dev,
3815 				 unsigned int short_retry,
3816 				 unsigned int long_retry)
3817 {
3818 	/* The retry limit is a 4-bit counter. Enforce this to avoid overflowing
3819 	 * the chip-internal counter. */
3820 	short_retry = min(short_retry, (unsigned int)0xF);
3821 	long_retry = min(long_retry, (unsigned int)0xF);
3822 
3823 	b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_SRLIMIT,
3824 			short_retry);
3825 	b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_LRLIMIT,
3826 			long_retry);
3827 }
3828 
b43_op_config(struct ieee80211_hw * hw,u32 changed)3829 static int b43_op_config(struct ieee80211_hw *hw, u32 changed)
3830 {
3831 	struct b43_wl *wl = hw_to_b43_wl(hw);
3832 	struct b43_wldev *dev;
3833 	struct b43_phy *phy;
3834 	struct ieee80211_conf *conf = &hw->conf;
3835 	int antenna;
3836 	int err = 0;
3837 	bool reload_bss = false;
3838 
3839 	mutex_lock(&wl->mutex);
3840 
3841 	dev = wl->current_dev;
3842 
3843 	/* Switch the band (if necessary). This might change the active core. */
3844 	err = b43_switch_band(wl, conf->channel);
3845 	if (err)
3846 		goto out_unlock_mutex;
3847 
3848 	/* Need to reload all settings if the core changed */
3849 	if (dev != wl->current_dev) {
3850 		dev = wl->current_dev;
3851 		changed = ~0;
3852 		reload_bss = true;
3853 	}
3854 
3855 	phy = &dev->phy;
3856 
3857 	if (conf_is_ht(conf))
3858 		phy->is_40mhz =
3859 			(conf_is_ht40_minus(conf) || conf_is_ht40_plus(conf));
3860 	else
3861 		phy->is_40mhz = false;
3862 
3863 	b43_mac_suspend(dev);
3864 
3865 	if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS)
3866 		b43_set_retry_limits(dev, conf->short_frame_max_tx_count,
3867 					  conf->long_frame_max_tx_count);
3868 	changed &= ~IEEE80211_CONF_CHANGE_RETRY_LIMITS;
3869 	if (!changed)
3870 		goto out_mac_enable;
3871 
3872 	/* Switch to the requested channel.
3873 	 * The firmware takes care of races with the TX handler. */
3874 	if (conf->channel->hw_value != phy->channel)
3875 		b43_switch_channel(dev, conf->channel->hw_value);
3876 
3877 	dev->wl->radiotap_enabled = !!(conf->flags & IEEE80211_CONF_MONITOR);
3878 
3879 	/* Adjust the desired TX power level. */
3880 	if (conf->power_level != 0) {
3881 		if (conf->power_level != phy->desired_txpower) {
3882 			phy->desired_txpower = conf->power_level;
3883 			b43_phy_txpower_check(dev, B43_TXPWR_IGNORE_TIME |
3884 						   B43_TXPWR_IGNORE_TSSI);
3885 		}
3886 	}
3887 
3888 	/* Antennas for RX and management frame TX. */
3889 	antenna = B43_ANTENNA_DEFAULT;
3890 	b43_mgmtframe_txantenna(dev, antenna);
3891 	antenna = B43_ANTENNA_DEFAULT;
3892 	if (phy->ops->set_rx_antenna)
3893 		phy->ops->set_rx_antenna(dev, antenna);
3894 
3895 	if (wl->radio_enabled != phy->radio_on) {
3896 		if (wl->radio_enabled) {
3897 			b43_software_rfkill(dev, false);
3898 			b43info(dev->wl, "Radio turned on by software\n");
3899 			if (!dev->radio_hw_enable) {
3900 				b43info(dev->wl, "The hardware RF-kill button "
3901 					"still turns the radio physically off. "
3902 					"Press the button to turn it on.\n");
3903 			}
3904 		} else {
3905 			b43_software_rfkill(dev, true);
3906 			b43info(dev->wl, "Radio turned off by software\n");
3907 		}
3908 	}
3909 
3910 out_mac_enable:
3911 	b43_mac_enable(dev);
3912 out_unlock_mutex:
3913 	mutex_unlock(&wl->mutex);
3914 
3915 	if (wl->vif && reload_bss)
3916 		b43_op_bss_info_changed(hw, wl->vif, &wl->vif->bss_conf, ~0);
3917 
3918 	return err;
3919 }
3920 
b43_update_basic_rates(struct b43_wldev * dev,u32 brates)3921 static void b43_update_basic_rates(struct b43_wldev *dev, u32 brates)
3922 {
3923 	struct ieee80211_supported_band *sband =
3924 		dev->wl->hw->wiphy->bands[b43_current_band(dev->wl)];
3925 	struct ieee80211_rate *rate;
3926 	int i;
3927 	u16 basic, direct, offset, basic_offset, rateptr;
3928 
3929 	for (i = 0; i < sband->n_bitrates; i++) {
3930 		rate = &sband->bitrates[i];
3931 
3932 		if (b43_is_cck_rate(rate->hw_value)) {
3933 			direct = B43_SHM_SH_CCKDIRECT;
3934 			basic = B43_SHM_SH_CCKBASIC;
3935 			offset = b43_plcp_get_ratecode_cck(rate->hw_value);
3936 			offset &= 0xF;
3937 		} else {
3938 			direct = B43_SHM_SH_OFDMDIRECT;
3939 			basic = B43_SHM_SH_OFDMBASIC;
3940 			offset = b43_plcp_get_ratecode_ofdm(rate->hw_value);
3941 			offset &= 0xF;
3942 		}
3943 
3944 		rate = ieee80211_get_response_rate(sband, brates, rate->bitrate);
3945 
3946 		if (b43_is_cck_rate(rate->hw_value)) {
3947 			basic_offset = b43_plcp_get_ratecode_cck(rate->hw_value);
3948 			basic_offset &= 0xF;
3949 		} else {
3950 			basic_offset = b43_plcp_get_ratecode_ofdm(rate->hw_value);
3951 			basic_offset &= 0xF;
3952 		}
3953 
3954 		/*
3955 		 * Get the pointer that we need to point to
3956 		 * from the direct map
3957 		 */
3958 		rateptr = b43_shm_read16(dev, B43_SHM_SHARED,
3959 					 direct + 2 * basic_offset);
3960 		/* and write it to the basic map */
3961 		b43_shm_write16(dev, B43_SHM_SHARED, basic + 2 * offset,
3962 				rateptr);
3963 	}
3964 }
3965 
b43_op_bss_info_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * conf,u32 changed)3966 static void b43_op_bss_info_changed(struct ieee80211_hw *hw,
3967 				    struct ieee80211_vif *vif,
3968 				    struct ieee80211_bss_conf *conf,
3969 				    u32 changed)
3970 {
3971 	struct b43_wl *wl = hw_to_b43_wl(hw);
3972 	struct b43_wldev *dev;
3973 
3974 	mutex_lock(&wl->mutex);
3975 
3976 	dev = wl->current_dev;
3977 	if (!dev || b43_status(dev) < B43_STAT_STARTED)
3978 		goto out_unlock_mutex;
3979 
3980 	B43_WARN_ON(wl->vif != vif);
3981 
3982 	if (changed & BSS_CHANGED_BSSID) {
3983 		if (conf->bssid)
3984 			memcpy(wl->bssid, conf->bssid, ETH_ALEN);
3985 		else
3986 			memset(wl->bssid, 0, ETH_ALEN);
3987 	}
3988 
3989 	if (b43_status(dev) >= B43_STAT_INITIALIZED) {
3990 		if (changed & BSS_CHANGED_BEACON &&
3991 		    (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
3992 		     b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) ||
3993 		     b43_is_mode(wl, NL80211_IFTYPE_ADHOC)))
3994 			b43_update_templates(wl);
3995 
3996 		if (changed & BSS_CHANGED_BSSID)
3997 			b43_write_mac_bssid_templates(dev);
3998 	}
3999 
4000 	b43_mac_suspend(dev);
4001 
4002 	/* Update templates for AP/mesh mode. */
4003 	if (changed & BSS_CHANGED_BEACON_INT &&
4004 	    (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
4005 	     b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) ||
4006 	     b43_is_mode(wl, NL80211_IFTYPE_ADHOC)) &&
4007 	    conf->beacon_int)
4008 		b43_set_beacon_int(dev, conf->beacon_int);
4009 
4010 	if (changed & BSS_CHANGED_BASIC_RATES)
4011 		b43_update_basic_rates(dev, conf->basic_rates);
4012 
4013 	if (changed & BSS_CHANGED_ERP_SLOT) {
4014 		if (conf->use_short_slot)
4015 			b43_short_slot_timing_enable(dev);
4016 		else
4017 			b43_short_slot_timing_disable(dev);
4018 	}
4019 
4020 	b43_mac_enable(dev);
4021 out_unlock_mutex:
4022 	mutex_unlock(&wl->mutex);
4023 }
4024 
b43_op_set_key(struct ieee80211_hw * hw,enum set_key_cmd cmd,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)4025 static int b43_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4026 			  struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4027 			  struct ieee80211_key_conf *key)
4028 {
4029 	struct b43_wl *wl = hw_to_b43_wl(hw);
4030 	struct b43_wldev *dev;
4031 	u8 algorithm;
4032 	u8 index;
4033 	int err;
4034 	static const u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
4035 
4036 	if (modparam_nohwcrypt)
4037 		return -ENOSPC; /* User disabled HW-crypto */
4038 
4039 	mutex_lock(&wl->mutex);
4040 
4041 	dev = wl->current_dev;
4042 	err = -ENODEV;
4043 	if (!dev || b43_status(dev) < B43_STAT_INITIALIZED)
4044 		goto out_unlock;
4045 
4046 	if (dev->fw.pcm_request_failed || !dev->hwcrypto_enabled) {
4047 		/* We don't have firmware for the crypto engine.
4048 		 * Must use software-crypto. */
4049 		err = -EOPNOTSUPP;
4050 		goto out_unlock;
4051 	}
4052 
4053 	err = -EINVAL;
4054 	switch (key->cipher) {
4055 	case WLAN_CIPHER_SUITE_WEP40:
4056 		algorithm = B43_SEC_ALGO_WEP40;
4057 		break;
4058 	case WLAN_CIPHER_SUITE_WEP104:
4059 		algorithm = B43_SEC_ALGO_WEP104;
4060 		break;
4061 	case WLAN_CIPHER_SUITE_TKIP:
4062 		algorithm = B43_SEC_ALGO_TKIP;
4063 		break;
4064 	case WLAN_CIPHER_SUITE_CCMP:
4065 		algorithm = B43_SEC_ALGO_AES;
4066 		break;
4067 	default:
4068 		B43_WARN_ON(1);
4069 		goto out_unlock;
4070 	}
4071 	index = (u8) (key->keyidx);
4072 	if (index > 3)
4073 		goto out_unlock;
4074 
4075 	switch (cmd) {
4076 	case SET_KEY:
4077 		if (algorithm == B43_SEC_ALGO_TKIP &&
4078 		    (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE) ||
4079 		    !modparam_hwtkip)) {
4080 			/* We support only pairwise key */
4081 			err = -EOPNOTSUPP;
4082 			goto out_unlock;
4083 		}
4084 
4085 		if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
4086 			if (WARN_ON(!sta)) {
4087 				err = -EOPNOTSUPP;
4088 				goto out_unlock;
4089 			}
4090 			/* Pairwise key with an assigned MAC address. */
4091 			err = b43_key_write(dev, -1, algorithm,
4092 					    key->key, key->keylen,
4093 					    sta->addr, key);
4094 		} else {
4095 			/* Group key */
4096 			err = b43_key_write(dev, index, algorithm,
4097 					    key->key, key->keylen, NULL, key);
4098 		}
4099 		if (err)
4100 			goto out_unlock;
4101 
4102 		if (algorithm == B43_SEC_ALGO_WEP40 ||
4103 		    algorithm == B43_SEC_ALGO_WEP104) {
4104 			b43_hf_write(dev, b43_hf_read(dev) | B43_HF_USEDEFKEYS);
4105 		} else {
4106 			b43_hf_write(dev,
4107 				     b43_hf_read(dev) & ~B43_HF_USEDEFKEYS);
4108 		}
4109 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
4110 		if (algorithm == B43_SEC_ALGO_TKIP)
4111 			key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
4112 		break;
4113 	case DISABLE_KEY: {
4114 		err = b43_key_clear(dev, key->hw_key_idx);
4115 		if (err)
4116 			goto out_unlock;
4117 		break;
4118 	}
4119 	default:
4120 		B43_WARN_ON(1);
4121 	}
4122 
4123 out_unlock:
4124 	if (!err) {
4125 		b43dbg(wl, "%s hardware based encryption for keyidx: %d, "
4126 		       "mac: %pM\n",
4127 		       cmd == SET_KEY ? "Using" : "Disabling", key->keyidx,
4128 		       sta ? sta->addr : bcast_addr);
4129 		b43_dump_keymemory(dev);
4130 	}
4131 	mutex_unlock(&wl->mutex);
4132 
4133 	return err;
4134 }
4135 
b43_op_configure_filter(struct ieee80211_hw * hw,unsigned int changed,unsigned int * fflags,u64 multicast)4136 static void b43_op_configure_filter(struct ieee80211_hw *hw,
4137 				    unsigned int changed, unsigned int *fflags,
4138 				    u64 multicast)
4139 {
4140 	struct b43_wl *wl = hw_to_b43_wl(hw);
4141 	struct b43_wldev *dev;
4142 
4143 	mutex_lock(&wl->mutex);
4144 	dev = wl->current_dev;
4145 	if (!dev) {
4146 		*fflags = 0;
4147 		goto out_unlock;
4148 	}
4149 
4150 	*fflags &= FIF_PROMISC_IN_BSS |
4151 		  FIF_ALLMULTI |
4152 		  FIF_FCSFAIL |
4153 		  FIF_PLCPFAIL |
4154 		  FIF_CONTROL |
4155 		  FIF_OTHER_BSS |
4156 		  FIF_BCN_PRBRESP_PROMISC;
4157 
4158 	changed &= FIF_PROMISC_IN_BSS |
4159 		   FIF_ALLMULTI |
4160 		   FIF_FCSFAIL |
4161 		   FIF_PLCPFAIL |
4162 		   FIF_CONTROL |
4163 		   FIF_OTHER_BSS |
4164 		   FIF_BCN_PRBRESP_PROMISC;
4165 
4166 	wl->filter_flags = *fflags;
4167 
4168 	if (changed && b43_status(dev) >= B43_STAT_INITIALIZED)
4169 		b43_adjust_opmode(dev);
4170 
4171 out_unlock:
4172 	mutex_unlock(&wl->mutex);
4173 }
4174 
4175 /* Locking: wl->mutex
4176  * Returns the current dev. This might be different from the passed in dev,
4177  * because the core might be gone away while we unlocked the mutex. */
b43_wireless_core_stop(struct b43_wldev * dev)4178 static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev)
4179 {
4180 	struct b43_wl *wl;
4181 	struct b43_wldev *orig_dev;
4182 	u32 mask;
4183 	int queue_num;
4184 
4185 	if (!dev)
4186 		return NULL;
4187 	wl = dev->wl;
4188 redo:
4189 	if (!dev || b43_status(dev) < B43_STAT_STARTED)
4190 		return dev;
4191 
4192 	/* Cancel work. Unlock to avoid deadlocks. */
4193 	mutex_unlock(&wl->mutex);
4194 	cancel_delayed_work_sync(&dev->periodic_work);
4195 	cancel_work_sync(&wl->tx_work);
4196 	cancel_work_sync(&wl->firmware_load);
4197 	mutex_lock(&wl->mutex);
4198 	dev = wl->current_dev;
4199 	if (!dev || b43_status(dev) < B43_STAT_STARTED) {
4200 		/* Whoops, aliens ate up the device while we were unlocked. */
4201 		return dev;
4202 	}
4203 
4204 	/* Disable interrupts on the device. */
4205 	b43_set_status(dev, B43_STAT_INITIALIZED);
4206 	if (b43_bus_host_is_sdio(dev->dev)) {
4207 		/* wl->mutex is locked. That is enough. */
4208 		b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0);
4209 		b43_read32(dev, B43_MMIO_GEN_IRQ_MASK);	/* Flush */
4210 	} else {
4211 		spin_lock_irq(&wl->hardirq_lock);
4212 		b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0);
4213 		b43_read32(dev, B43_MMIO_GEN_IRQ_MASK);	/* Flush */
4214 		spin_unlock_irq(&wl->hardirq_lock);
4215 	}
4216 	/* Synchronize and free the interrupt handlers. Unlock to avoid deadlocks. */
4217 	orig_dev = dev;
4218 	mutex_unlock(&wl->mutex);
4219 	if (b43_bus_host_is_sdio(dev->dev)) {
4220 		b43_sdio_free_irq(dev);
4221 	} else {
4222 		synchronize_irq(dev->dev->irq);
4223 		free_irq(dev->dev->irq, dev);
4224 	}
4225 	mutex_lock(&wl->mutex);
4226 	dev = wl->current_dev;
4227 	if (!dev)
4228 		return dev;
4229 	if (dev != orig_dev) {
4230 		if (b43_status(dev) >= B43_STAT_STARTED)
4231 			goto redo;
4232 		return dev;
4233 	}
4234 	mask = b43_read32(dev, B43_MMIO_GEN_IRQ_MASK);
4235 	B43_WARN_ON(mask != 0xFFFFFFFF && mask);
4236 
4237 	/* Drain all TX queues. */
4238 	for (queue_num = 0; queue_num < B43_QOS_QUEUE_NUM; queue_num++) {
4239 		while (skb_queue_len(&wl->tx_queue[queue_num])) {
4240 			struct sk_buff *skb;
4241 
4242 			skb = skb_dequeue(&wl->tx_queue[queue_num]);
4243 			ieee80211_free_txskb(wl->hw, skb);
4244 		}
4245 	}
4246 
4247 	b43_mac_suspend(dev);
4248 	b43_leds_exit(dev);
4249 	b43dbg(wl, "Wireless interface stopped\n");
4250 
4251 	return dev;
4252 }
4253 
4254 /* Locking: wl->mutex */
b43_wireless_core_start(struct b43_wldev * dev)4255 static int b43_wireless_core_start(struct b43_wldev *dev)
4256 {
4257 	int err;
4258 
4259 	B43_WARN_ON(b43_status(dev) != B43_STAT_INITIALIZED);
4260 
4261 	drain_txstatus_queue(dev);
4262 	if (b43_bus_host_is_sdio(dev->dev)) {
4263 		err = b43_sdio_request_irq(dev, b43_sdio_interrupt_handler);
4264 		if (err) {
4265 			b43err(dev->wl, "Cannot request SDIO IRQ\n");
4266 			goto out;
4267 		}
4268 	} else {
4269 		err = request_threaded_irq(dev->dev->irq, b43_interrupt_handler,
4270 					   b43_interrupt_thread_handler,
4271 					   IRQF_SHARED, KBUILD_MODNAME, dev);
4272 		if (err) {
4273 			b43err(dev->wl, "Cannot request IRQ-%d\n",
4274 			       dev->dev->irq);
4275 			goto out;
4276 		}
4277 	}
4278 
4279 	/* We are ready to run. */
4280 	ieee80211_wake_queues(dev->wl->hw);
4281 	b43_set_status(dev, B43_STAT_STARTED);
4282 
4283 	/* Start data flow (TX/RX). */
4284 	b43_mac_enable(dev);
4285 	b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask);
4286 
4287 	/* Start maintenance work */
4288 	b43_periodic_tasks_setup(dev);
4289 
4290 	b43_leds_init(dev);
4291 
4292 	b43dbg(dev->wl, "Wireless interface started\n");
4293 out:
4294 	return err;
4295 }
4296 
4297 /* Get PHY and RADIO versioning numbers */
b43_phy_versioning(struct b43_wldev * dev)4298 static int b43_phy_versioning(struct b43_wldev *dev)
4299 {
4300 	struct b43_phy *phy = &dev->phy;
4301 	u32 tmp;
4302 	u8 analog_type;
4303 	u8 phy_type;
4304 	u8 phy_rev;
4305 	u16 radio_manuf;
4306 	u16 radio_ver;
4307 	u16 radio_rev;
4308 	int unsupported = 0;
4309 
4310 	/* Get PHY versioning */
4311 	tmp = b43_read16(dev, B43_MMIO_PHY_VER);
4312 	analog_type = (tmp & B43_PHYVER_ANALOG) >> B43_PHYVER_ANALOG_SHIFT;
4313 	phy_type = (tmp & B43_PHYVER_TYPE) >> B43_PHYVER_TYPE_SHIFT;
4314 	phy_rev = (tmp & B43_PHYVER_VERSION);
4315 	switch (phy_type) {
4316 	case B43_PHYTYPE_A:
4317 		if (phy_rev >= 4)
4318 			unsupported = 1;
4319 		break;
4320 	case B43_PHYTYPE_B:
4321 		if (phy_rev != 2 && phy_rev != 4 && phy_rev != 6
4322 		    && phy_rev != 7)
4323 			unsupported = 1;
4324 		break;
4325 	case B43_PHYTYPE_G:
4326 		if (phy_rev > 9)
4327 			unsupported = 1;
4328 		break;
4329 #ifdef CONFIG_B43_PHY_N
4330 	case B43_PHYTYPE_N:
4331 		if (phy_rev > 9)
4332 			unsupported = 1;
4333 		break;
4334 #endif
4335 #ifdef CONFIG_B43_PHY_LP
4336 	case B43_PHYTYPE_LP:
4337 		if (phy_rev > 2)
4338 			unsupported = 1;
4339 		break;
4340 #endif
4341 #ifdef CONFIG_B43_PHY_HT
4342 	case B43_PHYTYPE_HT:
4343 		if (phy_rev > 1)
4344 			unsupported = 1;
4345 		break;
4346 #endif
4347 #ifdef CONFIG_B43_PHY_LCN
4348 	case B43_PHYTYPE_LCN:
4349 		if (phy_rev > 1)
4350 			unsupported = 1;
4351 		break;
4352 #endif
4353 	default:
4354 		unsupported = 1;
4355 	}
4356 	if (unsupported) {
4357 		b43err(dev->wl, "FOUND UNSUPPORTED PHY "
4358 		       "(Analog %u, Type %u, Revision %u)\n",
4359 		       analog_type, phy_type, phy_rev);
4360 		return -EOPNOTSUPP;
4361 	}
4362 	b43dbg(dev->wl, "Found PHY: Analog %u, Type %u, Revision %u\n",
4363 	       analog_type, phy_type, phy_rev);
4364 
4365 	/* Get RADIO versioning */
4366 	if (dev->dev->core_rev >= 24) {
4367 		u16 radio24[3];
4368 
4369 		for (tmp = 0; tmp < 3; tmp++) {
4370 			b43_write16(dev, B43_MMIO_RADIO24_CONTROL, tmp);
4371 			radio24[tmp] = b43_read16(dev, B43_MMIO_RADIO24_DATA);
4372 		}
4373 
4374 		/* Broadcom uses "id" for our "ver" and has separated "ver" */
4375 		/* radio_ver = (radio24[0] & 0xF0) >> 4; */
4376 
4377 		radio_manuf = 0x17F;
4378 		radio_ver = (radio24[2] << 8) | radio24[1];
4379 		radio_rev = (radio24[0] & 0xF);
4380 	} else {
4381 		if (dev->dev->chip_id == 0x4317) {
4382 			if (dev->dev->chip_rev == 0)
4383 				tmp = 0x3205017F;
4384 			else if (dev->dev->chip_rev == 1)
4385 				tmp = 0x4205017F;
4386 			else
4387 				tmp = 0x5205017F;
4388 		} else {
4389 			b43_write16(dev, B43_MMIO_RADIO_CONTROL,
4390 				    B43_RADIOCTL_ID);
4391 			tmp = b43_read16(dev, B43_MMIO_RADIO_DATA_LOW);
4392 			b43_write16(dev, B43_MMIO_RADIO_CONTROL,
4393 				    B43_RADIOCTL_ID);
4394 			tmp |= (u32)b43_read16(dev, B43_MMIO_RADIO_DATA_HIGH)
4395 				<< 16;
4396 		}
4397 		radio_manuf = (tmp & 0x00000FFF);
4398 		radio_ver = (tmp & 0x0FFFF000) >> 12;
4399 		radio_rev = (tmp & 0xF0000000) >> 28;
4400 	}
4401 
4402 	if (radio_manuf != 0x17F /* Broadcom */)
4403 		unsupported = 1;
4404 	switch (phy_type) {
4405 	case B43_PHYTYPE_A:
4406 		if (radio_ver != 0x2060)
4407 			unsupported = 1;
4408 		if (radio_rev != 1)
4409 			unsupported = 1;
4410 		if (radio_manuf != 0x17F)
4411 			unsupported = 1;
4412 		break;
4413 	case B43_PHYTYPE_B:
4414 		if ((radio_ver & 0xFFF0) != 0x2050)
4415 			unsupported = 1;
4416 		break;
4417 	case B43_PHYTYPE_G:
4418 		if (radio_ver != 0x2050)
4419 			unsupported = 1;
4420 		break;
4421 	case B43_PHYTYPE_N:
4422 		if (radio_ver != 0x2055 && radio_ver != 0x2056)
4423 			unsupported = 1;
4424 		break;
4425 	case B43_PHYTYPE_LP:
4426 		if (radio_ver != 0x2062 && radio_ver != 0x2063)
4427 			unsupported = 1;
4428 		break;
4429 	case B43_PHYTYPE_HT:
4430 		if (radio_ver != 0x2059)
4431 			unsupported = 1;
4432 		break;
4433 	case B43_PHYTYPE_LCN:
4434 		if (radio_ver != 0x2064)
4435 			unsupported = 1;
4436 		break;
4437 	default:
4438 		B43_WARN_ON(1);
4439 	}
4440 	if (unsupported) {
4441 		b43err(dev->wl, "FOUND UNSUPPORTED RADIO "
4442 		       "(Manuf 0x%X, Version 0x%X, Revision %u)\n",
4443 		       radio_manuf, radio_ver, radio_rev);
4444 		return -EOPNOTSUPP;
4445 	}
4446 	b43dbg(dev->wl, "Found Radio: Manuf 0x%X, Version 0x%X, Revision %u\n",
4447 	       radio_manuf, radio_ver, radio_rev);
4448 
4449 	phy->radio_manuf = radio_manuf;
4450 	phy->radio_ver = radio_ver;
4451 	phy->radio_rev = radio_rev;
4452 
4453 	phy->analog = analog_type;
4454 	phy->type = phy_type;
4455 	phy->rev = phy_rev;
4456 
4457 	return 0;
4458 }
4459 
setup_struct_phy_for_init(struct b43_wldev * dev,struct b43_phy * phy)4460 static void setup_struct_phy_for_init(struct b43_wldev *dev,
4461 				      struct b43_phy *phy)
4462 {
4463 	phy->hardware_power_control = !!modparam_hwpctl;
4464 	phy->next_txpwr_check_time = jiffies;
4465 	/* PHY TX errors counter. */
4466 	atomic_set(&phy->txerr_cnt, B43_PHY_TX_BADNESS_LIMIT);
4467 
4468 #if B43_DEBUG
4469 	phy->phy_locked = false;
4470 	phy->radio_locked = false;
4471 #endif
4472 }
4473 
setup_struct_wldev_for_init(struct b43_wldev * dev)4474 static void setup_struct_wldev_for_init(struct b43_wldev *dev)
4475 {
4476 	dev->dfq_valid = false;
4477 
4478 	/* Assume the radio is enabled. If it's not enabled, the state will
4479 	 * immediately get fixed on the first periodic work run. */
4480 	dev->radio_hw_enable = true;
4481 
4482 	/* Stats */
4483 	memset(&dev->stats, 0, sizeof(dev->stats));
4484 
4485 	setup_struct_phy_for_init(dev, &dev->phy);
4486 
4487 	/* IRQ related flags */
4488 	dev->irq_reason = 0;
4489 	memset(dev->dma_reason, 0, sizeof(dev->dma_reason));
4490 	dev->irq_mask = B43_IRQ_MASKTEMPLATE;
4491 	if (b43_modparam_verbose < B43_VERBOSITY_DEBUG)
4492 		dev->irq_mask &= ~B43_IRQ_PHY_TXERR;
4493 
4494 	dev->mac_suspended = 1;
4495 
4496 	/* Noise calculation context */
4497 	memset(&dev->noisecalc, 0, sizeof(dev->noisecalc));
4498 }
4499 
b43_bluetooth_coext_enable(struct b43_wldev * dev)4500 static void b43_bluetooth_coext_enable(struct b43_wldev *dev)
4501 {
4502 	struct ssb_sprom *sprom = dev->dev->bus_sprom;
4503 	u64 hf;
4504 
4505 	if (!modparam_btcoex)
4506 		return;
4507 	if (!(sprom->boardflags_lo & B43_BFL_BTCOEXIST))
4508 		return;
4509 	if (dev->phy.type != B43_PHYTYPE_B && !dev->phy.gmode)
4510 		return;
4511 
4512 	hf = b43_hf_read(dev);
4513 	if (sprom->boardflags_lo & B43_BFL_BTCMOD)
4514 		hf |= B43_HF_BTCOEXALT;
4515 	else
4516 		hf |= B43_HF_BTCOEX;
4517 	b43_hf_write(dev, hf);
4518 }
4519 
b43_bluetooth_coext_disable(struct b43_wldev * dev)4520 static void b43_bluetooth_coext_disable(struct b43_wldev *dev)
4521 {
4522 	if (!modparam_btcoex)
4523 		return;
4524 	//TODO
4525 }
4526 
b43_imcfglo_timeouts_workaround(struct b43_wldev * dev)4527 static void b43_imcfglo_timeouts_workaround(struct b43_wldev *dev)
4528 {
4529 	struct ssb_bus *bus;
4530 	u32 tmp;
4531 
4532 	if (dev->dev->bus_type != B43_BUS_SSB)
4533 		return;
4534 
4535 	bus = dev->dev->sdev->bus;
4536 
4537 	if ((bus->chip_id == 0x4311 && bus->chip_rev == 2) ||
4538 	    (bus->chip_id == 0x4312)) {
4539 		tmp = ssb_read32(dev->dev->sdev, SSB_IMCFGLO);
4540 		tmp &= ~SSB_IMCFGLO_REQTO;
4541 		tmp &= ~SSB_IMCFGLO_SERTO;
4542 		tmp |= 0x3;
4543 		ssb_write32(dev->dev->sdev, SSB_IMCFGLO, tmp);
4544 		ssb_commit_settings(bus);
4545 	}
4546 }
4547 
b43_set_synth_pu_delay(struct b43_wldev * dev,bool idle)4548 static void b43_set_synth_pu_delay(struct b43_wldev *dev, bool idle)
4549 {
4550 	u16 pu_delay;
4551 
4552 	/* The time value is in microseconds. */
4553 	if (dev->phy.type == B43_PHYTYPE_A)
4554 		pu_delay = 3700;
4555 	else
4556 		pu_delay = 1050;
4557 	if (b43_is_mode(dev->wl, NL80211_IFTYPE_ADHOC) || idle)
4558 		pu_delay = 500;
4559 	if ((dev->phy.radio_ver == 0x2050) && (dev->phy.radio_rev == 8))
4560 		pu_delay = max(pu_delay, (u16)2400);
4561 
4562 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_SPUWKUP, pu_delay);
4563 }
4564 
4565 /* Set the TSF CFP pre-TargetBeaconTransmissionTime. */
b43_set_pretbtt(struct b43_wldev * dev)4566 static void b43_set_pretbtt(struct b43_wldev *dev)
4567 {
4568 	u16 pretbtt;
4569 
4570 	/* The time value is in microseconds. */
4571 	if (b43_is_mode(dev->wl, NL80211_IFTYPE_ADHOC)) {
4572 		pretbtt = 2;
4573 	} else {
4574 		if (dev->phy.type == B43_PHYTYPE_A)
4575 			pretbtt = 120;
4576 		else
4577 			pretbtt = 250;
4578 	}
4579 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRETBTT, pretbtt);
4580 	b43_write16(dev, B43_MMIO_TSF_CFP_PRETBTT, pretbtt);
4581 }
4582 
4583 /* Shutdown a wireless core */
4584 /* Locking: wl->mutex */
b43_wireless_core_exit(struct b43_wldev * dev)4585 static void b43_wireless_core_exit(struct b43_wldev *dev)
4586 {
4587 	B43_WARN_ON(dev && b43_status(dev) > B43_STAT_INITIALIZED);
4588 	if (!dev || b43_status(dev) != B43_STAT_INITIALIZED)
4589 		return;
4590 
4591 	b43_set_status(dev, B43_STAT_UNINIT);
4592 
4593 	/* Stop the microcode PSM. */
4594 	b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_RUN,
4595 		      B43_MACCTL_PSM_JMP0);
4596 
4597 	b43_dma_free(dev);
4598 	b43_pio_free(dev);
4599 	b43_chip_exit(dev);
4600 	dev->phy.ops->switch_analog(dev, 0);
4601 	if (dev->wl->current_beacon) {
4602 		dev_kfree_skb_any(dev->wl->current_beacon);
4603 		dev->wl->current_beacon = NULL;
4604 	}
4605 
4606 	b43_device_disable(dev, 0);
4607 	b43_bus_may_powerdown(dev);
4608 }
4609 
4610 /* Initialize a wireless core */
b43_wireless_core_init(struct b43_wldev * dev)4611 static int b43_wireless_core_init(struct b43_wldev *dev)
4612 {
4613 	struct ssb_sprom *sprom = dev->dev->bus_sprom;
4614 	struct b43_phy *phy = &dev->phy;
4615 	int err;
4616 	u64 hf;
4617 
4618 	B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT);
4619 
4620 	err = b43_bus_powerup(dev, 0);
4621 	if (err)
4622 		goto out;
4623 	if (!b43_device_is_enabled(dev))
4624 		b43_wireless_core_reset(dev, phy->gmode);
4625 
4626 	/* Reset all data structures. */
4627 	setup_struct_wldev_for_init(dev);
4628 	phy->ops->prepare_structs(dev);
4629 
4630 	/* Enable IRQ routing to this device. */
4631 	switch (dev->dev->bus_type) {
4632 #ifdef CONFIG_B43_BCMA
4633 	case B43_BUS_BCMA:
4634 		bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci,
4635 				      dev->dev->bdev, true);
4636 		break;
4637 #endif
4638 #ifdef CONFIG_B43_SSB
4639 	case B43_BUS_SSB:
4640 		ssb_pcicore_dev_irqvecs_enable(&dev->dev->sdev->bus->pcicore,
4641 					       dev->dev->sdev);
4642 		break;
4643 #endif
4644 	}
4645 
4646 	b43_imcfglo_timeouts_workaround(dev);
4647 	b43_bluetooth_coext_disable(dev);
4648 	if (phy->ops->prepare_hardware) {
4649 		err = phy->ops->prepare_hardware(dev);
4650 		if (err)
4651 			goto err_busdown;
4652 	}
4653 	err = b43_chip_init(dev);
4654 	if (err)
4655 		goto err_busdown;
4656 	b43_shm_write16(dev, B43_SHM_SHARED,
4657 			B43_SHM_SH_WLCOREREV, dev->dev->core_rev);
4658 	hf = b43_hf_read(dev);
4659 	if (phy->type == B43_PHYTYPE_G) {
4660 		hf |= B43_HF_SYMW;
4661 		if (phy->rev == 1)
4662 			hf |= B43_HF_GDCW;
4663 		if (sprom->boardflags_lo & B43_BFL_PACTRL)
4664 			hf |= B43_HF_OFDMPABOOST;
4665 	}
4666 	if (phy->radio_ver == 0x2050) {
4667 		if (phy->radio_rev == 6)
4668 			hf |= B43_HF_4318TSSI;
4669 		if (phy->radio_rev < 6)
4670 			hf |= B43_HF_VCORECALC;
4671 	}
4672 	if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
4673 		hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
4674 #ifdef CONFIG_SSB_DRIVER_PCICORE
4675 	if (dev->dev->bus_type == B43_BUS_SSB &&
4676 	    dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
4677 	    dev->dev->sdev->bus->pcicore.dev->id.revision <= 10)
4678 		hf |= B43_HF_PCISCW; /* PCI slow clock workaround. */
4679 #endif
4680 	hf &= ~B43_HF_SKCFPUP;
4681 	b43_hf_write(dev, hf);
4682 
4683 	b43_set_retry_limits(dev, B43_DEFAULT_SHORT_RETRY_LIMIT,
4684 			     B43_DEFAULT_LONG_RETRY_LIMIT);
4685 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_SFFBLIM, 3);
4686 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_LFFBLIM, 2);
4687 
4688 	/* Disable sending probe responses from firmware.
4689 	 * Setting the MaxTime to one usec will always trigger
4690 	 * a timeout, so we never send any probe resp.
4691 	 * A timeout of zero is infinite. */
4692 	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRMAXTIME, 1);
4693 
4694 	b43_rate_memory_init(dev);
4695 	b43_set_phytxctl_defaults(dev);
4696 
4697 	/* Minimum Contention Window */
4698 	if (phy->type == B43_PHYTYPE_B)
4699 		b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MINCONT, 0x1F);
4700 	else
4701 		b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MINCONT, 0xF);
4702 	/* Maximum Contention Window */
4703 	b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MAXCONT, 0x3FF);
4704 
4705 	if (b43_bus_host_is_pcmcia(dev->dev) ||
4706 	    b43_bus_host_is_sdio(dev->dev)) {
4707 		dev->__using_pio_transfers = true;
4708 		err = b43_pio_init(dev);
4709 	} else if (dev->use_pio) {
4710 		b43warn(dev->wl, "Forced PIO by use_pio module parameter. "
4711 			"This should not be needed and will result in lower "
4712 			"performance.\n");
4713 		dev->__using_pio_transfers = true;
4714 		err = b43_pio_init(dev);
4715 	} else {
4716 		dev->__using_pio_transfers = false;
4717 		err = b43_dma_init(dev);
4718 	}
4719 	if (err)
4720 		goto err_chip_exit;
4721 	b43_qos_init(dev);
4722 	b43_set_synth_pu_delay(dev, 1);
4723 	b43_bluetooth_coext_enable(dev);
4724 
4725 	b43_bus_powerup(dev, !(sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW));
4726 	b43_upload_card_macaddress(dev);
4727 	b43_security_init(dev);
4728 
4729 	ieee80211_wake_queues(dev->wl->hw);
4730 
4731 	b43_set_status(dev, B43_STAT_INITIALIZED);
4732 
4733 out:
4734 	return err;
4735 
4736 err_chip_exit:
4737 	b43_chip_exit(dev);
4738 err_busdown:
4739 	b43_bus_may_powerdown(dev);
4740 	B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT);
4741 	return err;
4742 }
4743 
b43_op_add_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)4744 static int b43_op_add_interface(struct ieee80211_hw *hw,
4745 				struct ieee80211_vif *vif)
4746 {
4747 	struct b43_wl *wl = hw_to_b43_wl(hw);
4748 	struct b43_wldev *dev;
4749 	int err = -EOPNOTSUPP;
4750 
4751 	/* TODO: allow WDS/AP devices to coexist */
4752 
4753 	if (vif->type != NL80211_IFTYPE_AP &&
4754 	    vif->type != NL80211_IFTYPE_MESH_POINT &&
4755 	    vif->type != NL80211_IFTYPE_STATION &&
4756 	    vif->type != NL80211_IFTYPE_WDS &&
4757 	    vif->type != NL80211_IFTYPE_ADHOC)
4758 		return -EOPNOTSUPP;
4759 
4760 	mutex_lock(&wl->mutex);
4761 	if (wl->operating)
4762 		goto out_mutex_unlock;
4763 
4764 	b43dbg(wl, "Adding Interface type %d\n", vif->type);
4765 
4766 	dev = wl->current_dev;
4767 	wl->operating = true;
4768 	wl->vif = vif;
4769 	wl->if_type = vif->type;
4770 	memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
4771 
4772 	b43_adjust_opmode(dev);
4773 	b43_set_pretbtt(dev);
4774 	b43_set_synth_pu_delay(dev, 0);
4775 	b43_upload_card_macaddress(dev);
4776 
4777 	err = 0;
4778  out_mutex_unlock:
4779 	mutex_unlock(&wl->mutex);
4780 
4781 	if (err == 0)
4782 		b43_op_bss_info_changed(hw, vif, &vif->bss_conf, ~0);
4783 
4784 	return err;
4785 }
4786 
b43_op_remove_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)4787 static void b43_op_remove_interface(struct ieee80211_hw *hw,
4788 				    struct ieee80211_vif *vif)
4789 {
4790 	struct b43_wl *wl = hw_to_b43_wl(hw);
4791 	struct b43_wldev *dev = wl->current_dev;
4792 
4793 	b43dbg(wl, "Removing Interface type %d\n", vif->type);
4794 
4795 	mutex_lock(&wl->mutex);
4796 
4797 	B43_WARN_ON(!wl->operating);
4798 	B43_WARN_ON(wl->vif != vif);
4799 	wl->vif = NULL;
4800 
4801 	wl->operating = false;
4802 
4803 	b43_adjust_opmode(dev);
4804 	memset(wl->mac_addr, 0, ETH_ALEN);
4805 	b43_upload_card_macaddress(dev);
4806 
4807 	mutex_unlock(&wl->mutex);
4808 }
4809 
b43_op_start(struct ieee80211_hw * hw)4810 static int b43_op_start(struct ieee80211_hw *hw)
4811 {
4812 	struct b43_wl *wl = hw_to_b43_wl(hw);
4813 	struct b43_wldev *dev = wl->current_dev;
4814 	int did_init = 0;
4815 	int err = 0;
4816 
4817 	/* Kill all old instance specific information to make sure
4818 	 * the card won't use it in the short timeframe between start
4819 	 * and mac80211 reconfiguring it. */
4820 	memset(wl->bssid, 0, ETH_ALEN);
4821 	memset(wl->mac_addr, 0, ETH_ALEN);
4822 	wl->filter_flags = 0;
4823 	wl->radiotap_enabled = false;
4824 	b43_qos_clear(wl);
4825 	wl->beacon0_uploaded = false;
4826 	wl->beacon1_uploaded = false;
4827 	wl->beacon_templates_virgin = true;
4828 	wl->radio_enabled = true;
4829 
4830 	mutex_lock(&wl->mutex);
4831 
4832 	if (b43_status(dev) < B43_STAT_INITIALIZED) {
4833 		err = b43_wireless_core_init(dev);
4834 		if (err)
4835 			goto out_mutex_unlock;
4836 		did_init = 1;
4837 	}
4838 
4839 	if (b43_status(dev) < B43_STAT_STARTED) {
4840 		err = b43_wireless_core_start(dev);
4841 		if (err) {
4842 			if (did_init)
4843 				b43_wireless_core_exit(dev);
4844 			goto out_mutex_unlock;
4845 		}
4846 	}
4847 
4848 	/* XXX: only do if device doesn't support rfkill irq */
4849 	wiphy_rfkill_start_polling(hw->wiphy);
4850 
4851  out_mutex_unlock:
4852 	mutex_unlock(&wl->mutex);
4853 
4854 	/*
4855 	 * Configuration may have been overwritten during initialization.
4856 	 * Reload the configuration, but only if initialization was
4857 	 * successful. Reloading the configuration after a failed init
4858 	 * may hang the system.
4859 	 */
4860 	if (!err)
4861 		b43_op_config(hw, ~0);
4862 
4863 	return err;
4864 }
4865 
b43_op_stop(struct ieee80211_hw * hw)4866 static void b43_op_stop(struct ieee80211_hw *hw)
4867 {
4868 	struct b43_wl *wl = hw_to_b43_wl(hw);
4869 	struct b43_wldev *dev = wl->current_dev;
4870 
4871 	cancel_work_sync(&(wl->beacon_update_trigger));
4872 
4873 	if (!dev)
4874 		goto out;
4875 
4876 	mutex_lock(&wl->mutex);
4877 	if (b43_status(dev) >= B43_STAT_STARTED) {
4878 		dev = b43_wireless_core_stop(dev);
4879 		if (!dev)
4880 			goto out_unlock;
4881 	}
4882 	b43_wireless_core_exit(dev);
4883 	wl->radio_enabled = false;
4884 
4885 out_unlock:
4886 	mutex_unlock(&wl->mutex);
4887 out:
4888 	cancel_work_sync(&(wl->txpower_adjust_work));
4889 }
4890 
b43_op_beacon_set_tim(struct ieee80211_hw * hw,struct ieee80211_sta * sta,bool set)4891 static int b43_op_beacon_set_tim(struct ieee80211_hw *hw,
4892 				 struct ieee80211_sta *sta, bool set)
4893 {
4894 	struct b43_wl *wl = hw_to_b43_wl(hw);
4895 
4896 	/* FIXME: add locking */
4897 	b43_update_templates(wl);
4898 
4899 	return 0;
4900 }
4901 
b43_op_sta_notify(struct ieee80211_hw * hw,struct ieee80211_vif * vif,enum sta_notify_cmd notify_cmd,struct ieee80211_sta * sta)4902 static void b43_op_sta_notify(struct ieee80211_hw *hw,
4903 			      struct ieee80211_vif *vif,
4904 			      enum sta_notify_cmd notify_cmd,
4905 			      struct ieee80211_sta *sta)
4906 {
4907 	struct b43_wl *wl = hw_to_b43_wl(hw);
4908 
4909 	B43_WARN_ON(!vif || wl->vif != vif);
4910 }
4911 
b43_op_sw_scan_start_notifier(struct ieee80211_hw * hw)4912 static void b43_op_sw_scan_start_notifier(struct ieee80211_hw *hw)
4913 {
4914 	struct b43_wl *wl = hw_to_b43_wl(hw);
4915 	struct b43_wldev *dev;
4916 
4917 	mutex_lock(&wl->mutex);
4918 	dev = wl->current_dev;
4919 	if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED)) {
4920 		/* Disable CFP update during scan on other channels. */
4921 		b43_hf_write(dev, b43_hf_read(dev) | B43_HF_SKCFPUP);
4922 	}
4923 	mutex_unlock(&wl->mutex);
4924 }
4925 
b43_op_sw_scan_complete_notifier(struct ieee80211_hw * hw)4926 static void b43_op_sw_scan_complete_notifier(struct ieee80211_hw *hw)
4927 {
4928 	struct b43_wl *wl = hw_to_b43_wl(hw);
4929 	struct b43_wldev *dev;
4930 
4931 	mutex_lock(&wl->mutex);
4932 	dev = wl->current_dev;
4933 	if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED)) {
4934 		/* Re-enable CFP update. */
4935 		b43_hf_write(dev, b43_hf_read(dev) & ~B43_HF_SKCFPUP);
4936 	}
4937 	mutex_unlock(&wl->mutex);
4938 }
4939 
b43_op_get_survey(struct ieee80211_hw * hw,int idx,struct survey_info * survey)4940 static int b43_op_get_survey(struct ieee80211_hw *hw, int idx,
4941 			     struct survey_info *survey)
4942 {
4943 	struct b43_wl *wl = hw_to_b43_wl(hw);
4944 	struct b43_wldev *dev = wl->current_dev;
4945 	struct ieee80211_conf *conf = &hw->conf;
4946 
4947 	if (idx != 0)
4948 		return -ENOENT;
4949 
4950 	survey->channel = conf->channel;
4951 	survey->filled = SURVEY_INFO_NOISE_DBM;
4952 	survey->noise = dev->stats.link_noise;
4953 
4954 	return 0;
4955 }
4956 
4957 static const struct ieee80211_ops b43_hw_ops = {
4958 	.tx			= b43_op_tx,
4959 	.conf_tx		= b43_op_conf_tx,
4960 	.add_interface		= b43_op_add_interface,
4961 	.remove_interface	= b43_op_remove_interface,
4962 	.config			= b43_op_config,
4963 	.bss_info_changed	= b43_op_bss_info_changed,
4964 	.configure_filter	= b43_op_configure_filter,
4965 	.set_key		= b43_op_set_key,
4966 	.update_tkip_key	= b43_op_update_tkip_key,
4967 	.get_stats		= b43_op_get_stats,
4968 	.get_tsf		= b43_op_get_tsf,
4969 	.set_tsf		= b43_op_set_tsf,
4970 	.start			= b43_op_start,
4971 	.stop			= b43_op_stop,
4972 	.set_tim		= b43_op_beacon_set_tim,
4973 	.sta_notify		= b43_op_sta_notify,
4974 	.sw_scan_start		= b43_op_sw_scan_start_notifier,
4975 	.sw_scan_complete	= b43_op_sw_scan_complete_notifier,
4976 	.get_survey		= b43_op_get_survey,
4977 	.rfkill_poll		= b43_rfkill_poll,
4978 };
4979 
4980 /* Hard-reset the chip. Do not call this directly.
4981  * Use b43_controller_restart()
4982  */
b43_chip_reset(struct work_struct * work)4983 static void b43_chip_reset(struct work_struct *work)
4984 {
4985 	struct b43_wldev *dev =
4986 	    container_of(work, struct b43_wldev, restart_work);
4987 	struct b43_wl *wl = dev->wl;
4988 	int err = 0;
4989 	int prev_status;
4990 
4991 	mutex_lock(&wl->mutex);
4992 
4993 	prev_status = b43_status(dev);
4994 	/* Bring the device down... */
4995 	if (prev_status >= B43_STAT_STARTED) {
4996 		dev = b43_wireless_core_stop(dev);
4997 		if (!dev) {
4998 			err = -ENODEV;
4999 			goto out;
5000 		}
5001 	}
5002 	if (prev_status >= B43_STAT_INITIALIZED)
5003 		b43_wireless_core_exit(dev);
5004 
5005 	/* ...and up again. */
5006 	if (prev_status >= B43_STAT_INITIALIZED) {
5007 		err = b43_wireless_core_init(dev);
5008 		if (err)
5009 			goto out;
5010 	}
5011 	if (prev_status >= B43_STAT_STARTED) {
5012 		err = b43_wireless_core_start(dev);
5013 		if (err) {
5014 			b43_wireless_core_exit(dev);
5015 			goto out;
5016 		}
5017 	}
5018 out:
5019 	if (err)
5020 		wl->current_dev = NULL; /* Failed to init the dev. */
5021 	mutex_unlock(&wl->mutex);
5022 
5023 	if (err) {
5024 		b43err(wl, "Controller restart FAILED\n");
5025 		return;
5026 	}
5027 
5028 	/* reload configuration */
5029 	b43_op_config(wl->hw, ~0);
5030 	if (wl->vif)
5031 		b43_op_bss_info_changed(wl->hw, wl->vif, &wl->vif->bss_conf, ~0);
5032 
5033 	b43info(wl, "Controller restarted\n");
5034 }
5035 
b43_setup_bands(struct b43_wldev * dev,bool have_2ghz_phy,bool have_5ghz_phy)5036 static int b43_setup_bands(struct b43_wldev *dev,
5037 			   bool have_2ghz_phy, bool have_5ghz_phy)
5038 {
5039 	struct ieee80211_hw *hw = dev->wl->hw;
5040 
5041 	if (have_2ghz_phy)
5042 		hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &b43_band_2GHz;
5043 	if (dev->phy.type == B43_PHYTYPE_N) {
5044 		if (have_5ghz_phy)
5045 			hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &b43_band_5GHz_nphy;
5046 	} else {
5047 		if (have_5ghz_phy)
5048 			hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &b43_band_5GHz_aphy;
5049 	}
5050 
5051 	dev->phy.supports_2ghz = have_2ghz_phy;
5052 	dev->phy.supports_5ghz = have_5ghz_phy;
5053 
5054 	return 0;
5055 }
5056 
b43_wireless_core_detach(struct b43_wldev * dev)5057 static void b43_wireless_core_detach(struct b43_wldev *dev)
5058 {
5059 	/* We release firmware that late to not be required to re-request
5060 	 * is all the time when we reinit the core. */
5061 	b43_release_firmware(dev);
5062 	b43_phy_free(dev);
5063 }
5064 
b43_wireless_core_attach(struct b43_wldev * dev)5065 static int b43_wireless_core_attach(struct b43_wldev *dev)
5066 {
5067 	struct b43_wl *wl = dev->wl;
5068 	struct pci_dev *pdev = NULL;
5069 	int err;
5070 	u32 tmp;
5071 	bool have_2ghz_phy = false, have_5ghz_phy = false;
5072 
5073 	/* Do NOT do any device initialization here.
5074 	 * Do it in wireless_core_init() instead.
5075 	 * This function is for gathering basic information about the HW, only.
5076 	 * Also some structs may be set up here. But most likely you want to have
5077 	 * that in core_init(), too.
5078 	 */
5079 
5080 #ifdef CONFIG_B43_SSB
5081 	if (dev->dev->bus_type == B43_BUS_SSB &&
5082 	    dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI)
5083 		pdev = dev->dev->sdev->bus->host_pci;
5084 #endif
5085 
5086 	err = b43_bus_powerup(dev, 0);
5087 	if (err) {
5088 		b43err(wl, "Bus powerup failed\n");
5089 		goto out;
5090 	}
5091 
5092 	/* Get the PHY type. */
5093 	switch (dev->dev->bus_type) {
5094 #ifdef CONFIG_B43_BCMA
5095 	case B43_BUS_BCMA:
5096 		tmp = bcma_aread32(dev->dev->bdev, BCMA_IOST);
5097 		have_2ghz_phy = !!(tmp & B43_BCMA_IOST_2G_PHY);
5098 		have_5ghz_phy = !!(tmp & B43_BCMA_IOST_5G_PHY);
5099 		break;
5100 #endif
5101 #ifdef CONFIG_B43_SSB
5102 	case B43_BUS_SSB:
5103 		if (dev->dev->core_rev >= 5) {
5104 			tmp = ssb_read32(dev->dev->sdev, SSB_TMSHIGH);
5105 			have_2ghz_phy = !!(tmp & B43_TMSHIGH_HAVE_2GHZ_PHY);
5106 			have_5ghz_phy = !!(tmp & B43_TMSHIGH_HAVE_5GHZ_PHY);
5107 		} else
5108 			B43_WARN_ON(1);
5109 		break;
5110 #endif
5111 	}
5112 
5113 	dev->phy.gmode = have_2ghz_phy;
5114 	dev->phy.radio_on = true;
5115 	b43_wireless_core_reset(dev, dev->phy.gmode);
5116 
5117 	err = b43_phy_versioning(dev);
5118 	if (err)
5119 		goto err_powerdown;
5120 	/* Check if this device supports multiband. */
5121 	if (!pdev ||
5122 	    (pdev->device != 0x4312 &&
5123 	     pdev->device != 0x4319 && pdev->device != 0x4324)) {
5124 		/* No multiband support. */
5125 		have_2ghz_phy = false;
5126 		have_5ghz_phy = false;
5127 		switch (dev->phy.type) {
5128 		case B43_PHYTYPE_A:
5129 			have_5ghz_phy = true;
5130 			break;
5131 		case B43_PHYTYPE_LP: //FIXME not always!
5132 #if 0 //FIXME enabling 5GHz causes a NULL pointer dereference
5133 			have_5ghz_phy = 1;
5134 #endif
5135 		case B43_PHYTYPE_G:
5136 		case B43_PHYTYPE_N:
5137 		case B43_PHYTYPE_HT:
5138 		case B43_PHYTYPE_LCN:
5139 			have_2ghz_phy = true;
5140 			break;
5141 		default:
5142 			B43_WARN_ON(1);
5143 		}
5144 	}
5145 	if (dev->phy.type == B43_PHYTYPE_A) {
5146 		/* FIXME */
5147 		b43err(wl, "IEEE 802.11a devices are unsupported\n");
5148 		err = -EOPNOTSUPP;
5149 		goto err_powerdown;
5150 	}
5151 	if (1 /* disable A-PHY */) {
5152 		/* FIXME: For now we disable the A-PHY on multi-PHY devices. */
5153 		if (dev->phy.type != B43_PHYTYPE_N &&
5154 		    dev->phy.type != B43_PHYTYPE_LP) {
5155 			have_2ghz_phy = true;
5156 			have_5ghz_phy = false;
5157 		}
5158 	}
5159 
5160 	err = b43_phy_allocate(dev);
5161 	if (err)
5162 		goto err_powerdown;
5163 
5164 	dev->phy.gmode = have_2ghz_phy;
5165 	b43_wireless_core_reset(dev, dev->phy.gmode);
5166 
5167 	err = b43_validate_chipaccess(dev);
5168 	if (err)
5169 		goto err_phy_free;
5170 	err = b43_setup_bands(dev, have_2ghz_phy, have_5ghz_phy);
5171 	if (err)
5172 		goto err_phy_free;
5173 
5174 	/* Now set some default "current_dev" */
5175 	if (!wl->current_dev)
5176 		wl->current_dev = dev;
5177 	INIT_WORK(&dev->restart_work, b43_chip_reset);
5178 
5179 	dev->phy.ops->switch_analog(dev, 0);
5180 	b43_device_disable(dev, 0);
5181 	b43_bus_may_powerdown(dev);
5182 
5183 out:
5184 	return err;
5185 
5186 err_phy_free:
5187 	b43_phy_free(dev);
5188 err_powerdown:
5189 	b43_bus_may_powerdown(dev);
5190 	return err;
5191 }
5192 
b43_one_core_detach(struct b43_bus_dev * dev)5193 static void b43_one_core_detach(struct b43_bus_dev *dev)
5194 {
5195 	struct b43_wldev *wldev;
5196 	struct b43_wl *wl;
5197 
5198 	/* Do not cancel ieee80211-workqueue based work here.
5199 	 * See comment in b43_remove(). */
5200 
5201 	wldev = b43_bus_get_wldev(dev);
5202 	wl = wldev->wl;
5203 	b43_debugfs_remove_device(wldev);
5204 	b43_wireless_core_detach(wldev);
5205 	list_del(&wldev->list);
5206 	wl->nr_devs--;
5207 	b43_bus_set_wldev(dev, NULL);
5208 	kfree(wldev);
5209 }
5210 
b43_one_core_attach(struct b43_bus_dev * dev,struct b43_wl * wl)5211 static int b43_one_core_attach(struct b43_bus_dev *dev, struct b43_wl *wl)
5212 {
5213 	struct b43_wldev *wldev;
5214 	int err = -ENOMEM;
5215 
5216 	wldev = kzalloc(sizeof(*wldev), GFP_KERNEL);
5217 	if (!wldev)
5218 		goto out;
5219 
5220 	wldev->use_pio = b43_modparam_pio;
5221 	wldev->dev = dev;
5222 	wldev->wl = wl;
5223 	b43_set_status(wldev, B43_STAT_UNINIT);
5224 	wldev->bad_frames_preempt = modparam_bad_frames_preempt;
5225 	INIT_LIST_HEAD(&wldev->list);
5226 
5227 	err = b43_wireless_core_attach(wldev);
5228 	if (err)
5229 		goto err_kfree_wldev;
5230 
5231 	list_add(&wldev->list, &wl->devlist);
5232 	wl->nr_devs++;
5233 	b43_bus_set_wldev(dev, wldev);
5234 	b43_debugfs_add_device(wldev);
5235 
5236       out:
5237 	return err;
5238 
5239       err_kfree_wldev:
5240 	kfree(wldev);
5241 	return err;
5242 }
5243 
5244 #define IS_PDEV(pdev, _vendor, _device, _subvendor, _subdevice)		( \
5245 	(pdev->vendor == PCI_VENDOR_ID_##_vendor) &&			\
5246 	(pdev->device == _device) &&					\
5247 	(pdev->subsystem_vendor == PCI_VENDOR_ID_##_subvendor) &&	\
5248 	(pdev->subsystem_device == _subdevice)				)
5249 
b43_sprom_fixup(struct ssb_bus * bus)5250 static void b43_sprom_fixup(struct ssb_bus *bus)
5251 {
5252 	struct pci_dev *pdev;
5253 
5254 	/* boardflags workarounds */
5255 	if (bus->boardinfo.vendor == SSB_BOARDVENDOR_DELL &&
5256 	    bus->chip_id == 0x4301 && bus->boardinfo.rev == 0x74)
5257 		bus->sprom.boardflags_lo |= B43_BFL_BTCOEXIST;
5258 	if (bus->boardinfo.vendor == PCI_VENDOR_ID_APPLE &&
5259 	    bus->boardinfo.type == 0x4E && bus->boardinfo.rev > 0x40)
5260 		bus->sprom.boardflags_lo |= B43_BFL_PACTRL;
5261 	if (bus->bustype == SSB_BUSTYPE_PCI) {
5262 		pdev = bus->host_pci;
5263 		if (IS_PDEV(pdev, BROADCOM, 0x4318, ASUSTEK, 0x100F) ||
5264 		    IS_PDEV(pdev, BROADCOM, 0x4320,    DELL, 0x0003) ||
5265 		    IS_PDEV(pdev, BROADCOM, 0x4320,      HP, 0x12f8) ||
5266 		    IS_PDEV(pdev, BROADCOM, 0x4320, LINKSYS, 0x0015) ||
5267 		    IS_PDEV(pdev, BROADCOM, 0x4320, LINKSYS, 0x0014) ||
5268 		    IS_PDEV(pdev, BROADCOM, 0x4320, LINKSYS, 0x0013) ||
5269 		    IS_PDEV(pdev, BROADCOM, 0x4320, MOTOROLA, 0x7010))
5270 			bus->sprom.boardflags_lo &= ~B43_BFL_BTCOEXIST;
5271 	}
5272 }
5273 
b43_wireless_exit(struct b43_bus_dev * dev,struct b43_wl * wl)5274 static void b43_wireless_exit(struct b43_bus_dev *dev, struct b43_wl *wl)
5275 {
5276 	struct ieee80211_hw *hw = wl->hw;
5277 
5278 	ssb_set_devtypedata(dev->sdev, NULL);
5279 	ieee80211_free_hw(hw);
5280 }
5281 
b43_wireless_init(struct b43_bus_dev * dev)5282 static struct b43_wl *b43_wireless_init(struct b43_bus_dev *dev)
5283 {
5284 	struct ssb_sprom *sprom = dev->bus_sprom;
5285 	struct ieee80211_hw *hw;
5286 	struct b43_wl *wl;
5287 	char chip_name[6];
5288 	int queue_num;
5289 
5290 	hw = ieee80211_alloc_hw(sizeof(*wl), &b43_hw_ops);
5291 	if (!hw) {
5292 		b43err(NULL, "Could not allocate ieee80211 device\n");
5293 		return ERR_PTR(-ENOMEM);
5294 	}
5295 	wl = hw_to_b43_wl(hw);
5296 
5297 	/* fill hw info */
5298 	hw->flags = IEEE80211_HW_RX_INCLUDES_FCS |
5299 		    IEEE80211_HW_SIGNAL_DBM;
5300 
5301 	hw->wiphy->interface_modes =
5302 		BIT(NL80211_IFTYPE_AP) |
5303 		BIT(NL80211_IFTYPE_MESH_POINT) |
5304 		BIT(NL80211_IFTYPE_STATION) |
5305 		BIT(NL80211_IFTYPE_WDS) |
5306 		BIT(NL80211_IFTYPE_ADHOC);
5307 
5308 	hw->queues = modparam_qos ? B43_QOS_QUEUE_NUM : 1;
5309 	wl->mac80211_initially_registered_queues = hw->queues;
5310 	hw->max_rates = 2;
5311 	SET_IEEE80211_DEV(hw, dev->dev);
5312 	if (is_valid_ether_addr(sprom->et1mac))
5313 		SET_IEEE80211_PERM_ADDR(hw, sprom->et1mac);
5314 	else
5315 		SET_IEEE80211_PERM_ADDR(hw, sprom->il0mac);
5316 
5317 	/* Initialize struct b43_wl */
5318 	wl->hw = hw;
5319 	mutex_init(&wl->mutex);
5320 	spin_lock_init(&wl->hardirq_lock);
5321 	INIT_LIST_HEAD(&wl->devlist);
5322 	INIT_WORK(&wl->beacon_update_trigger, b43_beacon_update_trigger_work);
5323 	INIT_WORK(&wl->txpower_adjust_work, b43_phy_txpower_adjust_work);
5324 	INIT_WORK(&wl->tx_work, b43_tx_work);
5325 
5326 	/* Initialize queues and flags. */
5327 	for (queue_num = 0; queue_num < B43_QOS_QUEUE_NUM; queue_num++) {
5328 		skb_queue_head_init(&wl->tx_queue[queue_num]);
5329 		wl->tx_queue_stopped[queue_num] = 0;
5330 	}
5331 
5332 	snprintf(chip_name, ARRAY_SIZE(chip_name),
5333 		 (dev->chip_id > 0x9999) ? "%d" : "%04X", dev->chip_id);
5334 	b43info(wl, "Broadcom %s WLAN found (core revision %u)\n", chip_name,
5335 		dev->core_rev);
5336 	return wl;
5337 }
5338 
5339 #ifdef CONFIG_B43_BCMA
b43_bcma_probe(struct bcma_device * core)5340 static int b43_bcma_probe(struct bcma_device *core)
5341 {
5342 	struct b43_bus_dev *dev;
5343 	struct b43_wl *wl;
5344 	int err;
5345 
5346 	dev = b43_bus_dev_bcma_init(core);
5347 	if (!dev)
5348 		return -ENODEV;
5349 
5350 	wl = b43_wireless_init(dev);
5351 	if (IS_ERR(wl)) {
5352 		err = PTR_ERR(wl);
5353 		goto bcma_out;
5354 	}
5355 
5356 	err = b43_one_core_attach(dev, wl);
5357 	if (err)
5358 		goto bcma_err_wireless_exit;
5359 
5360 	/* setup and start work to load firmware */
5361 	INIT_WORK(&wl->firmware_load, b43_request_firmware);
5362 	schedule_work(&wl->firmware_load);
5363 
5364 bcma_out:
5365 	return err;
5366 
5367 bcma_err_wireless_exit:
5368 	ieee80211_free_hw(wl->hw);
5369 	return err;
5370 }
5371 
b43_bcma_remove(struct bcma_device * core)5372 static void b43_bcma_remove(struct bcma_device *core)
5373 {
5374 	struct b43_wldev *wldev = bcma_get_drvdata(core);
5375 	struct b43_wl *wl = wldev->wl;
5376 
5377 	/* We must cancel any work here before unregistering from ieee80211,
5378 	 * as the ieee80211 unreg will destroy the workqueue. */
5379 	cancel_work_sync(&wldev->restart_work);
5380 
5381 	/* Restore the queues count before unregistering, because firmware detect
5382 	 * might have modified it. Restoring is important, so the networking
5383 	 * stack can properly free resources. */
5384 	wl->hw->queues = wl->mac80211_initially_registered_queues;
5385 	b43_leds_stop(wldev);
5386 	ieee80211_unregister_hw(wl->hw);
5387 
5388 	b43_one_core_detach(wldev->dev);
5389 
5390 	/* Unregister HW RNG driver */
5391 	b43_rng_exit(wl);
5392 
5393 	b43_leds_unregister(wl);
5394 
5395 	ieee80211_free_hw(wl->hw);
5396 }
5397 
5398 static struct bcma_driver b43_bcma_driver = {
5399 	.name		= KBUILD_MODNAME,
5400 	.id_table	= b43_bcma_tbl,
5401 	.probe		= b43_bcma_probe,
5402 	.remove		= b43_bcma_remove,
5403 };
5404 #endif
5405 
5406 #ifdef CONFIG_B43_SSB
5407 static
b43_ssb_probe(struct ssb_device * sdev,const struct ssb_device_id * id)5408 int b43_ssb_probe(struct ssb_device *sdev, const struct ssb_device_id *id)
5409 {
5410 	struct b43_bus_dev *dev;
5411 	struct b43_wl *wl;
5412 	int err;
5413 	int first = 0;
5414 
5415 	dev = b43_bus_dev_ssb_init(sdev);
5416 	if (!dev)
5417 		return -ENOMEM;
5418 
5419 	wl = ssb_get_devtypedata(sdev);
5420 	if (!wl) {
5421 		/* Probing the first core. Must setup common struct b43_wl */
5422 		first = 1;
5423 		b43_sprom_fixup(sdev->bus);
5424 		wl = b43_wireless_init(dev);
5425 		if (IS_ERR(wl)) {
5426 			err = PTR_ERR(wl);
5427 			goto out;
5428 		}
5429 		ssb_set_devtypedata(sdev, wl);
5430 		B43_WARN_ON(ssb_get_devtypedata(sdev) != wl);
5431 	}
5432 	err = b43_one_core_attach(dev, wl);
5433 	if (err)
5434 		goto err_wireless_exit;
5435 
5436 	/* setup and start work to load firmware */
5437 	INIT_WORK(&wl->firmware_load, b43_request_firmware);
5438 	schedule_work(&wl->firmware_load);
5439 
5440       out:
5441 	return err;
5442 
5443       err_wireless_exit:
5444 	if (first)
5445 		b43_wireless_exit(dev, wl);
5446 	return err;
5447 }
5448 
b43_ssb_remove(struct ssb_device * sdev)5449 static void b43_ssb_remove(struct ssb_device *sdev)
5450 {
5451 	struct b43_wl *wl = ssb_get_devtypedata(sdev);
5452 	struct b43_wldev *wldev = ssb_get_drvdata(sdev);
5453 	struct b43_bus_dev *dev = wldev->dev;
5454 
5455 	/* We must cancel any work here before unregistering from ieee80211,
5456 	 * as the ieee80211 unreg will destroy the workqueue. */
5457 	cancel_work_sync(&wldev->restart_work);
5458 
5459 	B43_WARN_ON(!wl);
5460 	if (!wldev->fw.ucode.data)
5461 		return;			/* NULL if firmware never loaded */
5462 	if (wl->current_dev == wldev) {
5463 		/* Restore the queues count before unregistering, because firmware detect
5464 		 * might have modified it. Restoring is important, so the networking
5465 		 * stack can properly free resources. */
5466 		wl->hw->queues = wl->mac80211_initially_registered_queues;
5467 		b43_leds_stop(wldev);
5468 		ieee80211_unregister_hw(wl->hw);
5469 	}
5470 
5471 	b43_one_core_detach(dev);
5472 
5473 	/* Unregister HW RNG driver */
5474 	b43_rng_exit(wl);
5475 
5476 	if (list_empty(&wl->devlist)) {
5477 		b43_leds_unregister(wl);
5478 		/* Last core on the chip unregistered.
5479 		 * We can destroy common struct b43_wl.
5480 		 */
5481 		b43_wireless_exit(dev, wl);
5482 	}
5483 }
5484 
5485 static struct ssb_driver b43_ssb_driver = {
5486 	.name		= KBUILD_MODNAME,
5487 	.id_table	= b43_ssb_tbl,
5488 	.probe		= b43_ssb_probe,
5489 	.remove		= b43_ssb_remove,
5490 };
5491 #endif /* CONFIG_B43_SSB */
5492 
5493 /* Perform a hardware reset. This can be called from any context. */
b43_controller_restart(struct b43_wldev * dev,const char * reason)5494 void b43_controller_restart(struct b43_wldev *dev, const char *reason)
5495 {
5496 	/* Must avoid requeueing, if we are in shutdown. */
5497 	if (b43_status(dev) < B43_STAT_INITIALIZED)
5498 		return;
5499 	b43info(dev->wl, "Controller RESET (%s) ...\n", reason);
5500 	ieee80211_queue_work(dev->wl->hw, &dev->restart_work);
5501 }
5502 
b43_print_driverinfo(void)5503 static void b43_print_driverinfo(void)
5504 {
5505 	const char *feat_pci = "", *feat_pcmcia = "", *feat_nphy = "",
5506 		   *feat_leds = "", *feat_sdio = "";
5507 
5508 #ifdef CONFIG_B43_PCI_AUTOSELECT
5509 	feat_pci = "P";
5510 #endif
5511 #ifdef CONFIG_B43_PCMCIA
5512 	feat_pcmcia = "M";
5513 #endif
5514 #ifdef CONFIG_B43_PHY_N
5515 	feat_nphy = "N";
5516 #endif
5517 #ifdef CONFIG_B43_LEDS
5518 	feat_leds = "L";
5519 #endif
5520 #ifdef CONFIG_B43_SDIO
5521 	feat_sdio = "S";
5522 #endif
5523 	printk(KERN_INFO "Broadcom 43xx driver loaded "
5524 	       "[ Features: %s%s%s%s%s ]\n",
5525 	       feat_pci, feat_pcmcia, feat_nphy,
5526 	       feat_leds, feat_sdio);
5527 }
5528 
b43_init(void)5529 static int __init b43_init(void)
5530 {
5531 	int err;
5532 
5533 	b43_debugfs_init();
5534 	err = b43_pcmcia_init();
5535 	if (err)
5536 		goto err_dfs_exit;
5537 	err = b43_sdio_init();
5538 	if (err)
5539 		goto err_pcmcia_exit;
5540 #ifdef CONFIG_B43_BCMA
5541 	err = bcma_driver_register(&b43_bcma_driver);
5542 	if (err)
5543 		goto err_sdio_exit;
5544 #endif
5545 #ifdef CONFIG_B43_SSB
5546 	err = ssb_driver_register(&b43_ssb_driver);
5547 	if (err)
5548 		goto err_bcma_driver_exit;
5549 #endif
5550 	b43_print_driverinfo();
5551 
5552 	return err;
5553 
5554 #ifdef CONFIG_B43_SSB
5555 err_bcma_driver_exit:
5556 #endif
5557 #ifdef CONFIG_B43_BCMA
5558 	bcma_driver_unregister(&b43_bcma_driver);
5559 err_sdio_exit:
5560 #endif
5561 	b43_sdio_exit();
5562 err_pcmcia_exit:
5563 	b43_pcmcia_exit();
5564 err_dfs_exit:
5565 	b43_debugfs_exit();
5566 	return err;
5567 }
5568 
b43_exit(void)5569 static void __exit b43_exit(void)
5570 {
5571 #ifdef CONFIG_B43_SSB
5572 	ssb_driver_unregister(&b43_ssb_driver);
5573 #endif
5574 #ifdef CONFIG_B43_BCMA
5575 	bcma_driver_unregister(&b43_bcma_driver);
5576 #endif
5577 	b43_sdio_exit();
5578 	b43_pcmcia_exit();
5579 	b43_debugfs_exit();
5580 }
5581 
5582 module_init(b43_init)
5583 module_exit(b43_exit)
5584