• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2   * This file contains the major functions in WLAN
3   * driver. It includes init, exit, open, close and main
4   * thread etc..
5   */
6 
7 #include <linux/moduleparam.h>
8 #include <linux/delay.h>
9 #include <linux/etherdevice.h>
10 #include <linux/netdevice.h>
11 #include <linux/if_arp.h>
12 #include <linux/kthread.h>
13 #include <linux/kfifo.h>
14 #include <linux/stddef.h>
15 #include <linux/ieee80211.h>
16 #include <net/iw_handler.h>
17 
18 #include "host.h"
19 #include "decl.h"
20 #include "dev.h"
21 #include "wext.h"
22 #include "debugfs.h"
23 #include "scan.h"
24 #include "assoc.h"
25 #include "cmd.h"
26 
27 #define DRIVER_RELEASE_VERSION "323.p0"
28 const char lbs_driver_version[] = "COMM-USB8388-" DRIVER_RELEASE_VERSION
29 #ifdef  DEBUG
30     "-dbg"
31 #endif
32     "";
33 
34 
35 /* Module parameters */
36 unsigned int lbs_debug;
37 EXPORT_SYMBOL_GPL(lbs_debug);
38 module_param_named(libertas_debug, lbs_debug, int, 0644);
39 
40 
41 /* This global structure is used to send the confirm_sleep command as
42  * fast as possible down to the firmware. */
43 struct cmd_confirm_sleep confirm_sleep;
44 
45 
46 #define LBS_TX_PWR_DEFAULT		20	/*100mW */
47 #define LBS_TX_PWR_US_DEFAULT		20	/*100mW */
48 #define LBS_TX_PWR_JP_DEFAULT		16	/*50mW */
49 #define LBS_TX_PWR_FR_DEFAULT		20	/*100mW */
50 #define LBS_TX_PWR_EMEA_DEFAULT	20	/*100mW */
51 
52 /* Format { channel, frequency (MHz), maxtxpower } */
53 /* band: 'B/G', region: USA FCC/Canada IC */
54 static struct chan_freq_power channel_freq_power_US_BG[] = {
55 	{1, 2412, LBS_TX_PWR_US_DEFAULT},
56 	{2, 2417, LBS_TX_PWR_US_DEFAULT},
57 	{3, 2422, LBS_TX_PWR_US_DEFAULT},
58 	{4, 2427, LBS_TX_PWR_US_DEFAULT},
59 	{5, 2432, LBS_TX_PWR_US_DEFAULT},
60 	{6, 2437, LBS_TX_PWR_US_DEFAULT},
61 	{7, 2442, LBS_TX_PWR_US_DEFAULT},
62 	{8, 2447, LBS_TX_PWR_US_DEFAULT},
63 	{9, 2452, LBS_TX_PWR_US_DEFAULT},
64 	{10, 2457, LBS_TX_PWR_US_DEFAULT},
65 	{11, 2462, LBS_TX_PWR_US_DEFAULT}
66 };
67 
68 /* band: 'B/G', region: Europe ETSI */
69 static struct chan_freq_power channel_freq_power_EU_BG[] = {
70 	{1, 2412, LBS_TX_PWR_EMEA_DEFAULT},
71 	{2, 2417, LBS_TX_PWR_EMEA_DEFAULT},
72 	{3, 2422, LBS_TX_PWR_EMEA_DEFAULT},
73 	{4, 2427, LBS_TX_PWR_EMEA_DEFAULT},
74 	{5, 2432, LBS_TX_PWR_EMEA_DEFAULT},
75 	{6, 2437, LBS_TX_PWR_EMEA_DEFAULT},
76 	{7, 2442, LBS_TX_PWR_EMEA_DEFAULT},
77 	{8, 2447, LBS_TX_PWR_EMEA_DEFAULT},
78 	{9, 2452, LBS_TX_PWR_EMEA_DEFAULT},
79 	{10, 2457, LBS_TX_PWR_EMEA_DEFAULT},
80 	{11, 2462, LBS_TX_PWR_EMEA_DEFAULT},
81 	{12, 2467, LBS_TX_PWR_EMEA_DEFAULT},
82 	{13, 2472, LBS_TX_PWR_EMEA_DEFAULT}
83 };
84 
85 /* band: 'B/G', region: Spain */
86 static struct chan_freq_power channel_freq_power_SPN_BG[] = {
87 	{10, 2457, LBS_TX_PWR_DEFAULT},
88 	{11, 2462, LBS_TX_PWR_DEFAULT}
89 };
90 
91 /* band: 'B/G', region: France */
92 static struct chan_freq_power channel_freq_power_FR_BG[] = {
93 	{10, 2457, LBS_TX_PWR_FR_DEFAULT},
94 	{11, 2462, LBS_TX_PWR_FR_DEFAULT},
95 	{12, 2467, LBS_TX_PWR_FR_DEFAULT},
96 	{13, 2472, LBS_TX_PWR_FR_DEFAULT}
97 };
98 
99 /* band: 'B/G', region: Japan */
100 static struct chan_freq_power channel_freq_power_JPN_BG[] = {
101 	{1, 2412, LBS_TX_PWR_JP_DEFAULT},
102 	{2, 2417, LBS_TX_PWR_JP_DEFAULT},
103 	{3, 2422, LBS_TX_PWR_JP_DEFAULT},
104 	{4, 2427, LBS_TX_PWR_JP_DEFAULT},
105 	{5, 2432, LBS_TX_PWR_JP_DEFAULT},
106 	{6, 2437, LBS_TX_PWR_JP_DEFAULT},
107 	{7, 2442, LBS_TX_PWR_JP_DEFAULT},
108 	{8, 2447, LBS_TX_PWR_JP_DEFAULT},
109 	{9, 2452, LBS_TX_PWR_JP_DEFAULT},
110 	{10, 2457, LBS_TX_PWR_JP_DEFAULT},
111 	{11, 2462, LBS_TX_PWR_JP_DEFAULT},
112 	{12, 2467, LBS_TX_PWR_JP_DEFAULT},
113 	{13, 2472, LBS_TX_PWR_JP_DEFAULT},
114 	{14, 2484, LBS_TX_PWR_JP_DEFAULT}
115 };
116 
117 /**
118  * the structure for channel, frequency and power
119  */
120 struct region_cfp_table {
121 	u8 region;
122 	struct chan_freq_power *cfp_BG;
123 	int cfp_no_BG;
124 };
125 
126 /**
127  * the structure for the mapping between region and CFP
128  */
129 static struct region_cfp_table region_cfp_table[] = {
130 	{0x10,			/*US FCC */
131 	 channel_freq_power_US_BG,
132 	 ARRAY_SIZE(channel_freq_power_US_BG),
133 	 }
134 	,
135 	{0x20,			/*CANADA IC */
136 	 channel_freq_power_US_BG,
137 	 ARRAY_SIZE(channel_freq_power_US_BG),
138 	 }
139 	,
140 	{0x30, /*EU*/ channel_freq_power_EU_BG,
141 	 ARRAY_SIZE(channel_freq_power_EU_BG),
142 	 }
143 	,
144 	{0x31, /*SPAIN*/ channel_freq_power_SPN_BG,
145 	 ARRAY_SIZE(channel_freq_power_SPN_BG),
146 	 }
147 	,
148 	{0x32, /*FRANCE*/ channel_freq_power_FR_BG,
149 	 ARRAY_SIZE(channel_freq_power_FR_BG),
150 	 }
151 	,
152 	{0x40, /*JAPAN*/ channel_freq_power_JPN_BG,
153 	 ARRAY_SIZE(channel_freq_power_JPN_BG),
154 	 }
155 	,
156 /*Add new region here */
157 };
158 
159 /**
160  * the table to keep region code
161  */
162 u16 lbs_region_code_to_index[MRVDRV_MAX_REGION_CODE] =
163     { 0x10, 0x20, 0x30, 0x31, 0x32, 0x40 };
164 
165 /**
166  * 802.11b/g supported bitrates (in 500Kb/s units)
167  */
168 u8 lbs_bg_rates[MAX_RATES] =
169     { 0x02, 0x04, 0x0b, 0x16, 0x0c, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6c,
170 0x00, 0x00 };
171 
172 /**
173  * FW rate table.  FW refers to rates by their index in this table, not by the
174  * rate value itself.  Values of 0x00 are
175  * reserved positions.
176  */
177 static u8 fw_data_rates[MAX_RATES] =
178     { 0x02, 0x04, 0x0B, 0x16, 0x00, 0x0C, 0x12,
179       0x18, 0x24, 0x30, 0x48, 0x60, 0x6C, 0x00
180 };
181 
182 /**
183  *  @brief use index to get the data rate
184  *
185  *  @param idx                The index of data rate
186  *  @return 	   		data rate or 0
187  */
lbs_fw_index_to_data_rate(u8 idx)188 u32 lbs_fw_index_to_data_rate(u8 idx)
189 {
190 	if (idx >= sizeof(fw_data_rates))
191 		idx = 0;
192 	return fw_data_rates[idx];
193 }
194 
195 /**
196  *  @brief use rate to get the index
197  *
198  *  @param rate                 data rate
199  *  @return 	   		index or 0
200  */
lbs_data_rate_to_fw_index(u32 rate)201 u8 lbs_data_rate_to_fw_index(u32 rate)
202 {
203 	u8 i;
204 
205 	if (!rate)
206 		return 0;
207 
208 	for (i = 0; i < sizeof(fw_data_rates); i++) {
209 		if (rate == fw_data_rates[i])
210 			return i;
211 	}
212 	return 0;
213 }
214 
215 /**
216  * Attributes exported through sysfs
217  */
218 
219 /**
220  * @brief Get function for sysfs attribute anycast_mask
221  */
lbs_anycast_get(struct device * dev,struct device_attribute * attr,char * buf)222 static ssize_t lbs_anycast_get(struct device *dev,
223 		struct device_attribute *attr, char * buf)
224 {
225 	struct lbs_private *priv = to_net_dev(dev)->ml_priv;
226 	struct cmd_ds_mesh_access mesh_access;
227 	int ret;
228 
229 	memset(&mesh_access, 0, sizeof(mesh_access));
230 
231 	ret = lbs_mesh_access(priv, CMD_ACT_MESH_GET_ANYCAST, &mesh_access);
232 	if (ret)
233 		return ret;
234 
235 	return snprintf(buf, 12, "0x%X\n", le32_to_cpu(mesh_access.data[0]));
236 }
237 
238 /**
239  * @brief Set function for sysfs attribute anycast_mask
240  */
lbs_anycast_set(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)241 static ssize_t lbs_anycast_set(struct device *dev,
242 		struct device_attribute *attr, const char * buf, size_t count)
243 {
244 	struct lbs_private *priv = to_net_dev(dev)->ml_priv;
245 	struct cmd_ds_mesh_access mesh_access;
246 	uint32_t datum;
247 	int ret;
248 
249 	memset(&mesh_access, 0, sizeof(mesh_access));
250 	sscanf(buf, "%x", &datum);
251 	mesh_access.data[0] = cpu_to_le32(datum);
252 
253 	ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_ANYCAST, &mesh_access);
254 	if (ret)
255 		return ret;
256 
257 	return strlen(buf);
258 }
259 
260 /**
261  * @brief Get function for sysfs attribute prb_rsp_limit
262  */
lbs_prb_rsp_limit_get(struct device * dev,struct device_attribute * attr,char * buf)263 static ssize_t lbs_prb_rsp_limit_get(struct device *dev,
264 		struct device_attribute *attr, char *buf)
265 {
266 	struct lbs_private *priv = to_net_dev(dev)->ml_priv;
267 	struct cmd_ds_mesh_access mesh_access;
268 	int ret;
269 	u32 retry_limit;
270 
271 	memset(&mesh_access, 0, sizeof(mesh_access));
272 	mesh_access.data[0] = cpu_to_le32(CMD_ACT_GET);
273 
274 	ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_GET_PRB_RSP_LIMIT,
275 			&mesh_access);
276 	if (ret)
277 		return ret;
278 
279 	retry_limit = le32_to_cpu(mesh_access.data[1]);
280 	return snprintf(buf, 10, "%d\n", retry_limit);
281 }
282 
283 /**
284  * @brief Set function for sysfs attribute prb_rsp_limit
285  */
lbs_prb_rsp_limit_set(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)286 static ssize_t lbs_prb_rsp_limit_set(struct device *dev,
287 		struct device_attribute *attr, const char *buf, size_t count)
288 {
289 	struct lbs_private *priv = to_net_dev(dev)->ml_priv;
290 	struct cmd_ds_mesh_access mesh_access;
291 	int ret;
292 	unsigned long retry_limit;
293 
294 	memset(&mesh_access, 0, sizeof(mesh_access));
295 	mesh_access.data[0] = cpu_to_le32(CMD_ACT_SET);
296 
297 	if (!strict_strtoul(buf, 10, &retry_limit))
298 		return -ENOTSUPP;
299 	if (retry_limit > 15)
300 		return -ENOTSUPP;
301 
302 	mesh_access.data[1] = cpu_to_le32(retry_limit);
303 
304 	ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_GET_PRB_RSP_LIMIT,
305 			&mesh_access);
306 	if (ret)
307 		return ret;
308 
309 	return strlen(buf);
310 }
311 
312 static int lbs_add_rtap(struct lbs_private *priv);
313 static void lbs_remove_rtap(struct lbs_private *priv);
314 static int lbs_add_mesh(struct lbs_private *priv);
315 static void lbs_remove_mesh(struct lbs_private *priv);
316 
317 
318 /**
319  * Get function for sysfs attribute rtap
320  */
lbs_rtap_get(struct device * dev,struct device_attribute * attr,char * buf)321 static ssize_t lbs_rtap_get(struct device *dev,
322 		struct device_attribute *attr, char * buf)
323 {
324 	struct lbs_private *priv = to_net_dev(dev)->ml_priv;
325 	return snprintf(buf, 5, "0x%X\n", priv->monitormode);
326 }
327 
328 /**
329  *  Set function for sysfs attribute rtap
330  */
lbs_rtap_set(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)331 static ssize_t lbs_rtap_set(struct device *dev,
332 		struct device_attribute *attr, const char * buf, size_t count)
333 {
334 	int monitor_mode;
335 	struct lbs_private *priv = to_net_dev(dev)->ml_priv;
336 
337 	sscanf(buf, "%x", &monitor_mode);
338 	if (monitor_mode) {
339 		if (priv->monitormode == monitor_mode)
340 			return strlen(buf);
341 		if (!priv->monitormode) {
342 			if (priv->infra_open || priv->mesh_open)
343 				return -EBUSY;
344 			if (priv->mode == IW_MODE_INFRA)
345 				lbs_cmd_80211_deauthenticate(priv,
346 							     priv->curbssparams.bssid,
347 							     WLAN_REASON_DEAUTH_LEAVING);
348 			else if (priv->mode == IW_MODE_ADHOC)
349 				lbs_adhoc_stop(priv);
350 			lbs_add_rtap(priv);
351 		}
352 		priv->monitormode = monitor_mode;
353 	} else {
354 		if (!priv->monitormode)
355 			return strlen(buf);
356 		priv->monitormode = 0;
357 		lbs_remove_rtap(priv);
358 
359 		if (priv->currenttxskb) {
360 			dev_kfree_skb_any(priv->currenttxskb);
361 			priv->currenttxskb = NULL;
362 		}
363 
364 		/* Wake queues, command thread, etc. */
365 		lbs_host_to_card_done(priv);
366 	}
367 
368 	lbs_prepare_and_send_command(priv,
369 			CMD_802_11_MONITOR_MODE, CMD_ACT_SET,
370 			CMD_OPTION_WAITFORRSP, 0, &priv->monitormode);
371 	return strlen(buf);
372 }
373 
374 /**
375  * lbs_rtap attribute to be exported per ethX interface
376  * through sysfs (/sys/class/net/ethX/lbs_rtap)
377  */
378 static DEVICE_ATTR(lbs_rtap, 0644, lbs_rtap_get, lbs_rtap_set );
379 
380 /**
381  * Get function for sysfs attribute mesh
382  */
lbs_mesh_get(struct device * dev,struct device_attribute * attr,char * buf)383 static ssize_t lbs_mesh_get(struct device *dev,
384 		struct device_attribute *attr, char * buf)
385 {
386 	struct lbs_private *priv = to_net_dev(dev)->ml_priv;
387 	return snprintf(buf, 5, "0x%X\n", !!priv->mesh_dev);
388 }
389 
390 /**
391  *  Set function for sysfs attribute mesh
392  */
lbs_mesh_set(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)393 static ssize_t lbs_mesh_set(struct device *dev,
394 		struct device_attribute *attr, const char * buf, size_t count)
395 {
396 	struct lbs_private *priv = to_net_dev(dev)->ml_priv;
397 	int enable;
398 	int ret, action = CMD_ACT_MESH_CONFIG_STOP;
399 
400 	sscanf(buf, "%x", &enable);
401 	enable = !!enable;
402 	if (enable == !!priv->mesh_dev)
403 		return count;
404 	if (enable)
405 		action = CMD_ACT_MESH_CONFIG_START;
406 	ret = lbs_mesh_config(priv, action, priv->curbssparams.channel);
407 	if (ret)
408 		return ret;
409 
410 	if (enable)
411 		lbs_add_mesh(priv);
412 	else
413 		lbs_remove_mesh(priv);
414 
415 	return count;
416 }
417 
418 /**
419  * lbs_mesh attribute to be exported per ethX interface
420  * through sysfs (/sys/class/net/ethX/lbs_mesh)
421  */
422 static DEVICE_ATTR(lbs_mesh, 0644, lbs_mesh_get, lbs_mesh_set);
423 
424 /**
425  * anycast_mask attribute to be exported per mshX interface
426  * through sysfs (/sys/class/net/mshX/anycast_mask)
427  */
428 static DEVICE_ATTR(anycast_mask, 0644, lbs_anycast_get, lbs_anycast_set);
429 
430 /**
431  * prb_rsp_limit attribute to be exported per mshX interface
432  * through sysfs (/sys/class/net/mshX/prb_rsp_limit)
433  */
434 static DEVICE_ATTR(prb_rsp_limit, 0644, lbs_prb_rsp_limit_get,
435 		lbs_prb_rsp_limit_set);
436 
437 static struct attribute *lbs_mesh_sysfs_entries[] = {
438 	&dev_attr_anycast_mask.attr,
439 	&dev_attr_prb_rsp_limit.attr,
440 	NULL,
441 };
442 
443 static struct attribute_group lbs_mesh_attr_group = {
444 	.attrs = lbs_mesh_sysfs_entries,
445 };
446 
447 /**
448  *  @brief This function opens the ethX or mshX interface
449  *
450  *  @param dev     A pointer to net_device structure
451  *  @return 	   0 or -EBUSY if monitor mode active
452  */
lbs_dev_open(struct net_device * dev)453 static int lbs_dev_open(struct net_device *dev)
454 {
455 	struct lbs_private *priv = dev->ml_priv;
456 	int ret = 0;
457 
458 	lbs_deb_enter(LBS_DEB_NET);
459 
460 	spin_lock_irq(&priv->driver_lock);
461 
462 	if (priv->monitormode) {
463 		ret = -EBUSY;
464 		goto out;
465 	}
466 
467 	if (dev == priv->mesh_dev) {
468 		priv->mesh_open = 1;
469 		priv->mesh_connect_status = LBS_CONNECTED;
470 		netif_carrier_on(dev);
471 	} else {
472 		priv->infra_open = 1;
473 
474 		if (priv->connect_status == LBS_CONNECTED)
475 			netif_carrier_on(dev);
476 		else
477 			netif_carrier_off(dev);
478 	}
479 
480 	if (!priv->tx_pending_len)
481 		netif_wake_queue(dev);
482  out:
483 
484 	spin_unlock_irq(&priv->driver_lock);
485 	lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
486 	return ret;
487 }
488 
489 /**
490  *  @brief This function closes the mshX interface
491  *
492  *  @param dev     A pointer to net_device structure
493  *  @return 	   0
494  */
lbs_mesh_stop(struct net_device * dev)495 static int lbs_mesh_stop(struct net_device *dev)
496 {
497 	struct lbs_private *priv = dev->ml_priv;
498 
499 	lbs_deb_enter(LBS_DEB_MESH);
500 	spin_lock_irq(&priv->driver_lock);
501 
502 	priv->mesh_open = 0;
503 	priv->mesh_connect_status = LBS_DISCONNECTED;
504 
505 	netif_stop_queue(dev);
506 	netif_carrier_off(dev);
507 
508 	spin_unlock_irq(&priv->driver_lock);
509 
510 	schedule_work(&priv->mcast_work);
511 
512 	lbs_deb_leave(LBS_DEB_MESH);
513 	return 0;
514 }
515 
516 /**
517  *  @brief This function closes the ethX interface
518  *
519  *  @param dev     A pointer to net_device structure
520  *  @return 	   0
521  */
lbs_eth_stop(struct net_device * dev)522 static int lbs_eth_stop(struct net_device *dev)
523 {
524 	struct lbs_private *priv = dev->ml_priv;
525 
526 	lbs_deb_enter(LBS_DEB_NET);
527 
528 	spin_lock_irq(&priv->driver_lock);
529 	priv->infra_open = 0;
530 	netif_stop_queue(dev);
531 	spin_unlock_irq(&priv->driver_lock);
532 
533 	schedule_work(&priv->mcast_work);
534 
535 	lbs_deb_leave(LBS_DEB_NET);
536 	return 0;
537 }
538 
lbs_tx_timeout(struct net_device * dev)539 static void lbs_tx_timeout(struct net_device *dev)
540 {
541 	struct lbs_private *priv = dev->ml_priv;
542 
543 	lbs_deb_enter(LBS_DEB_TX);
544 
545 	lbs_pr_err("tx watch dog timeout\n");
546 
547 	dev->trans_start = jiffies;
548 
549 	if (priv->currenttxskb)
550 		lbs_send_tx_feedback(priv, 0);
551 
552 	/* XX: Shouldn't we also call into the hw-specific driver
553 	   to kick it somehow? */
554 	lbs_host_to_card_done(priv);
555 
556 	/* More often than not, this actually happens because the
557 	   firmware has crapped itself -- rather than just a very
558 	   busy medium. So send a harmless command, and if/when
559 	   _that_ times out, we'll kick it in the head. */
560 	lbs_prepare_and_send_command(priv, CMD_802_11_RSSI, 0,
561 				     0, 0, NULL);
562 
563 	lbs_deb_leave(LBS_DEB_TX);
564 }
565 
lbs_host_to_card_done(struct lbs_private * priv)566 void lbs_host_to_card_done(struct lbs_private *priv)
567 {
568 	unsigned long flags;
569 
570 	lbs_deb_enter(LBS_DEB_THREAD);
571 
572 	spin_lock_irqsave(&priv->driver_lock, flags);
573 
574 	priv->dnld_sent = DNLD_RES_RECEIVED;
575 
576 	/* Wake main thread if commands are pending */
577 	if (!priv->cur_cmd || priv->tx_pending_len > 0)
578 		wake_up_interruptible(&priv->waitq);
579 
580 	spin_unlock_irqrestore(&priv->driver_lock, flags);
581 	lbs_deb_leave(LBS_DEB_THREAD);
582 }
583 EXPORT_SYMBOL_GPL(lbs_host_to_card_done);
584 
585 /**
586  *  @brief This function returns the network statistics
587  *
588  *  @param dev     A pointer to struct lbs_private structure
589  *  @return 	   A pointer to net_device_stats structure
590  */
lbs_get_stats(struct net_device * dev)591 static struct net_device_stats *lbs_get_stats(struct net_device *dev)
592 {
593 	struct lbs_private *priv = dev->ml_priv;
594 
595 	lbs_deb_enter(LBS_DEB_NET);
596 	return &priv->stats;
597 }
598 
lbs_set_mac_address(struct net_device * dev,void * addr)599 static int lbs_set_mac_address(struct net_device *dev, void *addr)
600 {
601 	int ret = 0;
602 	struct lbs_private *priv = dev->ml_priv;
603 	struct sockaddr *phwaddr = addr;
604 	struct cmd_ds_802_11_mac_address cmd;
605 
606 	lbs_deb_enter(LBS_DEB_NET);
607 
608 	/* In case it was called from the mesh device */
609 	dev = priv->dev;
610 
611 	cmd.hdr.size = cpu_to_le16(sizeof(cmd));
612 	cmd.action = cpu_to_le16(CMD_ACT_SET);
613 	memcpy(cmd.macadd, phwaddr->sa_data, ETH_ALEN);
614 
615 	ret = lbs_cmd_with_response(priv, CMD_802_11_MAC_ADDRESS, &cmd);
616 	if (ret) {
617 		lbs_deb_net("set MAC address failed\n");
618 		goto done;
619 	}
620 
621 	memcpy(priv->current_addr, phwaddr->sa_data, ETH_ALEN);
622 	memcpy(dev->dev_addr, phwaddr->sa_data, ETH_ALEN);
623 	if (priv->mesh_dev)
624 		memcpy(priv->mesh_dev->dev_addr, phwaddr->sa_data, ETH_ALEN);
625 
626 done:
627 	lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
628 	return ret;
629 }
630 
631 
mac_in_list(unsigned char * list,int list_len,unsigned char * mac)632 static inline int mac_in_list(unsigned char *list, int list_len,
633 			      unsigned char *mac)
634 {
635 	while (list_len) {
636 		if (!memcmp(list, mac, ETH_ALEN))
637 			return 1;
638 		list += ETH_ALEN;
639 		list_len--;
640 	}
641 	return 0;
642 }
643 
644 
lbs_add_mcast_addrs(struct cmd_ds_mac_multicast_adr * cmd,struct net_device * dev,int nr_addrs)645 static int lbs_add_mcast_addrs(struct cmd_ds_mac_multicast_adr *cmd,
646 			       struct net_device *dev, int nr_addrs)
647 {
648 	int i = nr_addrs;
649 	struct dev_mc_list *mc_list;
650 
651 	if ((dev->flags & (IFF_UP|IFF_MULTICAST)) != (IFF_UP|IFF_MULTICAST))
652 		return nr_addrs;
653 
654 	netif_addr_lock_bh(dev);
655 	for (mc_list = dev->mc_list; mc_list; mc_list = mc_list->next) {
656 		if (mac_in_list(cmd->maclist, nr_addrs, mc_list->dmi_addr)) {
657 			lbs_deb_net("mcast address %s:%pM skipped\n", dev->name,
658 				    mc_list->dmi_addr);
659 			continue;
660 		}
661 
662 		if (i == MRVDRV_MAX_MULTICAST_LIST_SIZE)
663 			break;
664 		memcpy(&cmd->maclist[6*i], mc_list->dmi_addr, ETH_ALEN);
665 		lbs_deb_net("mcast address %s:%pM added to filter\n", dev->name,
666 			    mc_list->dmi_addr);
667 		i++;
668 	}
669 	netif_addr_unlock_bh(dev);
670 	if (mc_list)
671 		return -EOVERFLOW;
672 
673 	return i;
674 }
675 
lbs_set_mcast_worker(struct work_struct * work)676 static void lbs_set_mcast_worker(struct work_struct *work)
677 {
678 	struct lbs_private *priv = container_of(work, struct lbs_private, mcast_work);
679 	struct cmd_ds_mac_multicast_adr mcast_cmd;
680 	int dev_flags;
681 	int nr_addrs;
682 	int old_mac_control = priv->mac_control;
683 
684 	lbs_deb_enter(LBS_DEB_NET);
685 
686 	dev_flags = priv->dev->flags;
687 	if (priv->mesh_dev)
688 		dev_flags |= priv->mesh_dev->flags;
689 
690 	if (dev_flags & IFF_PROMISC) {
691 		priv->mac_control |= CMD_ACT_MAC_PROMISCUOUS_ENABLE;
692 		priv->mac_control &= ~(CMD_ACT_MAC_ALL_MULTICAST_ENABLE |
693 				       CMD_ACT_MAC_MULTICAST_ENABLE);
694 		goto out_set_mac_control;
695 	} else if (dev_flags & IFF_ALLMULTI) {
696 	do_allmulti:
697 		priv->mac_control |= CMD_ACT_MAC_ALL_MULTICAST_ENABLE;
698 		priv->mac_control &= ~(CMD_ACT_MAC_PROMISCUOUS_ENABLE |
699 				       CMD_ACT_MAC_MULTICAST_ENABLE);
700 		goto out_set_mac_control;
701 	}
702 
703 	/* Once for priv->dev, again for priv->mesh_dev if it exists */
704 	nr_addrs = lbs_add_mcast_addrs(&mcast_cmd, priv->dev, 0);
705 	if (nr_addrs >= 0 && priv->mesh_dev)
706 		nr_addrs = lbs_add_mcast_addrs(&mcast_cmd, priv->mesh_dev, nr_addrs);
707 	if (nr_addrs < 0)
708 		goto do_allmulti;
709 
710 	if (nr_addrs) {
711 		int size = offsetof(struct cmd_ds_mac_multicast_adr,
712 				    maclist[6*nr_addrs]);
713 
714 		mcast_cmd.action = cpu_to_le16(CMD_ACT_SET);
715 		mcast_cmd.hdr.size = cpu_to_le16(size);
716 		mcast_cmd.nr_of_adrs = cpu_to_le16(nr_addrs);
717 
718 		lbs_cmd_async(priv, CMD_MAC_MULTICAST_ADR, &mcast_cmd.hdr, size);
719 
720 		priv->mac_control |= CMD_ACT_MAC_MULTICAST_ENABLE;
721 	} else
722 		priv->mac_control &= ~CMD_ACT_MAC_MULTICAST_ENABLE;
723 
724 	priv->mac_control &= ~(CMD_ACT_MAC_PROMISCUOUS_ENABLE |
725 			       CMD_ACT_MAC_ALL_MULTICAST_ENABLE);
726  out_set_mac_control:
727 	if (priv->mac_control != old_mac_control)
728 		lbs_set_mac_control(priv);
729 
730 	lbs_deb_leave(LBS_DEB_NET);
731 }
732 
lbs_set_multicast_list(struct net_device * dev)733 static void lbs_set_multicast_list(struct net_device *dev)
734 {
735 	struct lbs_private *priv = dev->ml_priv;
736 
737 	schedule_work(&priv->mcast_work);
738 }
739 
740 /**
741  *  @brief This function handles the major jobs in the LBS driver.
742  *  It handles all events generated by firmware, RX data received
743  *  from firmware and TX data sent from kernel.
744  *
745  *  @param data    A pointer to lbs_thread structure
746  *  @return 	   0
747  */
lbs_thread(void * data)748 static int lbs_thread(void *data)
749 {
750 	struct net_device *dev = data;
751 	struct lbs_private *priv = dev->ml_priv;
752 	wait_queue_t wait;
753 
754 	lbs_deb_enter(LBS_DEB_THREAD);
755 
756 	init_waitqueue_entry(&wait, current);
757 
758 	for (;;) {
759 		int shouldsleep;
760 		u8 resp_idx;
761 
762 		lbs_deb_thread("1: currenttxskb %p, dnld_sent %d\n",
763 				priv->currenttxskb, priv->dnld_sent);
764 
765 		add_wait_queue(&priv->waitq, &wait);
766 		set_current_state(TASK_INTERRUPTIBLE);
767 		spin_lock_irq(&priv->driver_lock);
768 
769 		if (kthread_should_stop())
770 			shouldsleep = 0;	/* Bye */
771 		else if (priv->surpriseremoved)
772 			shouldsleep = 1;	/* We need to wait until we're _told_ to die */
773 		else if (priv->psstate == PS_STATE_SLEEP)
774 			shouldsleep = 1;	/* Sleep mode. Nothing we can do till it wakes */
775 		else if (priv->cmd_timed_out)
776 			shouldsleep = 0;	/* Command timed out. Recover */
777 		else if (!priv->fw_ready)
778 			shouldsleep = 1;	/* Firmware not ready. We're waiting for it */
779 		else if (priv->dnld_sent)
780 			shouldsleep = 1;	/* Something is en route to the device already */
781 		else if (priv->tx_pending_len > 0)
782 			shouldsleep = 0;	/* We've a packet to send */
783 		else if (priv->resp_len[priv->resp_idx])
784 			shouldsleep = 0;	/* We have a command response */
785 		else if (priv->cur_cmd)
786 			shouldsleep = 1;	/* Can't send a command; one already running */
787 		else if (!list_empty(&priv->cmdpendingq))
788 			shouldsleep = 0;	/* We have a command to send */
789 		else if (__kfifo_len(priv->event_fifo))
790 			shouldsleep = 0;	/* We have an event to process */
791 		else
792 			shouldsleep = 1;	/* No command */
793 
794 		if (shouldsleep) {
795 			lbs_deb_thread("sleeping, connect_status %d, "
796 				"psmode %d, psstate %d\n",
797 				priv->connect_status,
798 				priv->psmode, priv->psstate);
799 			spin_unlock_irq(&priv->driver_lock);
800 			schedule();
801 		} else
802 			spin_unlock_irq(&priv->driver_lock);
803 
804 		lbs_deb_thread("2: currenttxskb %p, dnld_send %d\n",
805 			       priv->currenttxskb, priv->dnld_sent);
806 
807 		set_current_state(TASK_RUNNING);
808 		remove_wait_queue(&priv->waitq, &wait);
809 
810 		lbs_deb_thread("3: currenttxskb %p, dnld_sent %d\n",
811 			       priv->currenttxskb, priv->dnld_sent);
812 
813 		if (kthread_should_stop()) {
814 			lbs_deb_thread("break from main thread\n");
815 			break;
816 		}
817 
818 		if (priv->surpriseremoved) {
819 			lbs_deb_thread("adapter removed; waiting to die...\n");
820 			continue;
821 		}
822 
823 		lbs_deb_thread("4: currenttxskb %p, dnld_sent %d\n",
824 		       priv->currenttxskb, priv->dnld_sent);
825 
826 		/* Process any pending command response */
827 		spin_lock_irq(&priv->driver_lock);
828 		resp_idx = priv->resp_idx;
829 		if (priv->resp_len[resp_idx]) {
830 			spin_unlock_irq(&priv->driver_lock);
831 			lbs_process_command_response(priv,
832 				priv->resp_buf[resp_idx],
833 				priv->resp_len[resp_idx]);
834 			spin_lock_irq(&priv->driver_lock);
835 			priv->resp_len[resp_idx] = 0;
836 		}
837 		spin_unlock_irq(&priv->driver_lock);
838 
839 		/* command timeout stuff */
840 		if (priv->cmd_timed_out && priv->cur_cmd) {
841 			struct cmd_ctrl_node *cmdnode = priv->cur_cmd;
842 
843 			if (++priv->nr_retries > 3) {
844 				lbs_pr_info("Excessive timeouts submitting "
845 					"command 0x%04x\n",
846 					le16_to_cpu(cmdnode->cmdbuf->command));
847 				lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
848 				priv->nr_retries = 0;
849 				if (priv->reset_card)
850 					priv->reset_card(priv);
851 			} else {
852 				priv->cur_cmd = NULL;
853 				priv->dnld_sent = DNLD_RES_RECEIVED;
854 				lbs_pr_info("requeueing command 0x%04x due "
855 					"to timeout (#%d)\n",
856 					le16_to_cpu(cmdnode->cmdbuf->command),
857 					priv->nr_retries);
858 
859 				/* Stick it back at the _top_ of the pending queue
860 				   for immediate resubmission */
861 				list_add(&cmdnode->list, &priv->cmdpendingq);
862 			}
863 		}
864 		priv->cmd_timed_out = 0;
865 
866 		/* Process hardware events, e.g. card removed, link lost */
867 		spin_lock_irq(&priv->driver_lock);
868 		while (__kfifo_len(priv->event_fifo)) {
869 			u32 event;
870 
871 			__kfifo_get(priv->event_fifo, (unsigned char *) &event,
872 				sizeof(event));
873 			spin_unlock_irq(&priv->driver_lock);
874 			lbs_process_event(priv, event);
875 			spin_lock_irq(&priv->driver_lock);
876 		}
877 		spin_unlock_irq(&priv->driver_lock);
878 
879 		if (!priv->fw_ready)
880 			continue;
881 
882 		/* Check if we need to confirm Sleep Request received previously */
883 		if (priv->psstate == PS_STATE_PRE_SLEEP &&
884 		    !priv->dnld_sent && !priv->cur_cmd) {
885 			if (priv->connect_status == LBS_CONNECTED) {
886 				lbs_deb_thread("pre-sleep, currenttxskb %p, "
887 					"dnld_sent %d, cur_cmd %p\n",
888 					priv->currenttxskb, priv->dnld_sent,
889 					priv->cur_cmd);
890 
891 				lbs_ps_confirm_sleep(priv);
892 			} else {
893 				/* workaround for firmware sending
894 				 * deauth/linkloss event immediately
895 				 * after sleep request; remove this
896 				 * after firmware fixes it
897 				 */
898 				priv->psstate = PS_STATE_AWAKE;
899 				lbs_pr_alert("ignore PS_SleepConfirm in "
900 					"non-connected state\n");
901 			}
902 		}
903 
904 		/* The PS state is changed during processing of Sleep Request
905 		 * event above
906 		 */
907 		if ((priv->psstate == PS_STATE_SLEEP) ||
908 		    (priv->psstate == PS_STATE_PRE_SLEEP))
909 			continue;
910 
911 		/* Execute the next command */
912 		if (!priv->dnld_sent && !priv->cur_cmd)
913 			lbs_execute_next_command(priv);
914 
915 		/* Wake-up command waiters which can't sleep in
916 		 * lbs_prepare_and_send_command
917 		 */
918 		if (!list_empty(&priv->cmdpendingq))
919 			wake_up_all(&priv->cmd_pending);
920 
921 		spin_lock_irq(&priv->driver_lock);
922 		if (!priv->dnld_sent && priv->tx_pending_len > 0) {
923 			int ret = priv->hw_host_to_card(priv, MVMS_DAT,
924 							priv->tx_pending_buf,
925 							priv->tx_pending_len);
926 			if (ret) {
927 				lbs_deb_tx("host_to_card failed %d\n", ret);
928 				priv->dnld_sent = DNLD_RES_RECEIVED;
929 			}
930 			priv->tx_pending_len = 0;
931 			if (!priv->currenttxskb) {
932 				/* We can wake the queues immediately if we aren't
933 				   waiting for TX feedback */
934 				if (priv->connect_status == LBS_CONNECTED)
935 					netif_wake_queue(priv->dev);
936 				if (priv->mesh_dev &&
937 				    priv->mesh_connect_status == LBS_CONNECTED)
938 					netif_wake_queue(priv->mesh_dev);
939 			}
940 		}
941 		spin_unlock_irq(&priv->driver_lock);
942 	}
943 
944 	del_timer(&priv->command_timer);
945 	wake_up_all(&priv->cmd_pending);
946 
947 	lbs_deb_leave(LBS_DEB_THREAD);
948 	return 0;
949 }
950 
lbs_suspend_callback(struct lbs_private * priv,unsigned long dummy,struct cmd_header * cmd)951 static int lbs_suspend_callback(struct lbs_private *priv, unsigned long dummy,
952 				struct cmd_header *cmd)
953 {
954 	lbs_deb_enter(LBS_DEB_FW);
955 
956 	netif_device_detach(priv->dev);
957 	if (priv->mesh_dev)
958 		netif_device_detach(priv->mesh_dev);
959 
960 	priv->fw_ready = 0;
961 	lbs_deb_leave(LBS_DEB_FW);
962 	return 0;
963 }
964 
lbs_suspend(struct lbs_private * priv)965 int lbs_suspend(struct lbs_private *priv)
966 {
967 	struct cmd_header cmd;
968 	int ret;
969 
970 	lbs_deb_enter(LBS_DEB_FW);
971 
972 	if (priv->wol_criteria == 0xffffffff) {
973 		lbs_pr_info("Suspend attempt without configuring wake params!\n");
974 		return -EINVAL;
975 	}
976 
977 	memset(&cmd, 0, sizeof(cmd));
978 
979 	ret = __lbs_cmd(priv, CMD_802_11_HOST_SLEEP_ACTIVATE, &cmd,
980 			sizeof(cmd), lbs_suspend_callback, 0);
981 	if (ret)
982 		lbs_pr_info("HOST_SLEEP_ACTIVATE failed: %d\n", ret);
983 
984 	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
985 	return ret;
986 }
987 EXPORT_SYMBOL_GPL(lbs_suspend);
988 
lbs_resume(struct lbs_private * priv)989 void lbs_resume(struct lbs_private *priv)
990 {
991 	lbs_deb_enter(LBS_DEB_FW);
992 
993 	priv->fw_ready = 1;
994 
995 	/* Firmware doesn't seem to give us RX packets any more
996 	   until we send it some command. Might as well update */
997 	lbs_prepare_and_send_command(priv, CMD_802_11_RSSI, 0,
998 				     0, 0, NULL);
999 
1000 	netif_device_attach(priv->dev);
1001 	if (priv->mesh_dev)
1002 		netif_device_attach(priv->mesh_dev);
1003 
1004 	lbs_deb_leave(LBS_DEB_FW);
1005 }
1006 EXPORT_SYMBOL_GPL(lbs_resume);
1007 
1008 /**
1009  *  @brief This function downloads firmware image, gets
1010  *  HW spec from firmware and set basic parameters to
1011  *  firmware.
1012  *
1013  *  @param priv    A pointer to struct lbs_private structure
1014  *  @return 	   0 or -1
1015  */
lbs_setup_firmware(struct lbs_private * priv)1016 static int lbs_setup_firmware(struct lbs_private *priv)
1017 {
1018 	int ret = -1;
1019 	s16 curlevel = 0, minlevel = 0, maxlevel = 0;
1020 
1021 	lbs_deb_enter(LBS_DEB_FW);
1022 
1023 	/* Read MAC address from firmware */
1024 	memset(priv->current_addr, 0xff, ETH_ALEN);
1025 	ret = lbs_update_hw_spec(priv);
1026 	if (ret)
1027 		goto done;
1028 
1029 	/* Read power levels if available */
1030 	ret = lbs_get_tx_power(priv, &curlevel, &minlevel, &maxlevel);
1031 	if (ret == 0) {
1032 		priv->txpower_cur = curlevel;
1033 		priv->txpower_min = minlevel;
1034 		priv->txpower_max = maxlevel;
1035 	}
1036 
1037 	lbs_set_mac_control(priv);
1038 done:
1039 	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
1040 	return ret;
1041 }
1042 
1043 /**
1044  *  This function handles the timeout of command sending.
1045  *  It will re-send the same command again.
1046  */
command_timer_fn(unsigned long data)1047 static void command_timer_fn(unsigned long data)
1048 {
1049 	struct lbs_private *priv = (struct lbs_private *)data;
1050 	unsigned long flags;
1051 
1052 	lbs_deb_enter(LBS_DEB_CMD);
1053 	spin_lock_irqsave(&priv->driver_lock, flags);
1054 
1055 	if (!priv->cur_cmd)
1056 		goto out;
1057 
1058 	lbs_pr_info("command 0x%04x timed out\n",
1059 		le16_to_cpu(priv->cur_cmd->cmdbuf->command));
1060 
1061 	priv->cmd_timed_out = 1;
1062 	wake_up_interruptible(&priv->waitq);
1063 out:
1064 	spin_unlock_irqrestore(&priv->driver_lock, flags);
1065 	lbs_deb_leave(LBS_DEB_CMD);
1066 }
1067 
lbs_sync_channel_worker(struct work_struct * work)1068 static void lbs_sync_channel_worker(struct work_struct *work)
1069 {
1070 	struct lbs_private *priv = container_of(work, struct lbs_private,
1071 		sync_channel);
1072 
1073 	lbs_deb_enter(LBS_DEB_MAIN);
1074 	if (lbs_update_channel(priv))
1075 		lbs_pr_info("Channel synchronization failed.");
1076 	lbs_deb_leave(LBS_DEB_MAIN);
1077 }
1078 
1079 
lbs_init_adapter(struct lbs_private * priv)1080 static int lbs_init_adapter(struct lbs_private *priv)
1081 {
1082 	size_t bufsize;
1083 	int i, ret = 0;
1084 
1085 	lbs_deb_enter(LBS_DEB_MAIN);
1086 
1087 	/* Allocate buffer to store the BSSID list */
1088 	bufsize = MAX_NETWORK_COUNT * sizeof(struct bss_descriptor);
1089 	priv->networks = kzalloc(bufsize, GFP_KERNEL);
1090 	if (!priv->networks) {
1091 		lbs_pr_err("Out of memory allocating beacons\n");
1092 		ret = -1;
1093 		goto out;
1094 	}
1095 
1096 	/* Initialize scan result lists */
1097 	INIT_LIST_HEAD(&priv->network_free_list);
1098 	INIT_LIST_HEAD(&priv->network_list);
1099 	for (i = 0; i < MAX_NETWORK_COUNT; i++) {
1100 		list_add_tail(&priv->networks[i].list,
1101 			      &priv->network_free_list);
1102 	}
1103 
1104 	memset(priv->current_addr, 0xff, ETH_ALEN);
1105 
1106 	priv->connect_status = LBS_DISCONNECTED;
1107 	priv->mesh_connect_status = LBS_DISCONNECTED;
1108 	priv->secinfo.auth_mode = IW_AUTH_ALG_OPEN_SYSTEM;
1109 	priv->mode = IW_MODE_INFRA;
1110 	priv->curbssparams.channel = DEFAULT_AD_HOC_CHANNEL;
1111 	priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON;
1112 	priv->radio_on = 1;
1113 	priv->enablehwauto = 1;
1114 	priv->capability = WLAN_CAPABILITY_SHORT_PREAMBLE;
1115 	priv->psmode = LBS802_11POWERMODECAM;
1116 	priv->psstate = PS_STATE_FULL_POWER;
1117 
1118 	mutex_init(&priv->lock);
1119 
1120 	setup_timer(&priv->command_timer, command_timer_fn,
1121 		(unsigned long)priv);
1122 
1123 	INIT_LIST_HEAD(&priv->cmdfreeq);
1124 	INIT_LIST_HEAD(&priv->cmdpendingq);
1125 
1126 	spin_lock_init(&priv->driver_lock);
1127 	init_waitqueue_head(&priv->cmd_pending);
1128 
1129 	/* Allocate the command buffers */
1130 	if (lbs_allocate_cmd_buffer(priv)) {
1131 		lbs_pr_err("Out of memory allocating command buffers\n");
1132 		ret = -ENOMEM;
1133 		goto out;
1134 	}
1135 	priv->resp_idx = 0;
1136 	priv->resp_len[0] = priv->resp_len[1] = 0;
1137 
1138 	/* Create the event FIFO */
1139 	priv->event_fifo = kfifo_alloc(sizeof(u32) * 16, GFP_KERNEL, NULL);
1140 	if (IS_ERR(priv->event_fifo)) {
1141 		lbs_pr_err("Out of memory allocating event FIFO buffer\n");
1142 		ret = -ENOMEM;
1143 		goto out;
1144 	}
1145 
1146 out:
1147 	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
1148 
1149 	return ret;
1150 }
1151 
lbs_free_adapter(struct lbs_private * priv)1152 static void lbs_free_adapter(struct lbs_private *priv)
1153 {
1154 	lbs_deb_enter(LBS_DEB_MAIN);
1155 
1156 	lbs_free_cmd_buffer(priv);
1157 	if (priv->event_fifo)
1158 		kfifo_free(priv->event_fifo);
1159 	del_timer(&priv->command_timer);
1160 	kfree(priv->networks);
1161 	priv->networks = NULL;
1162 
1163 	lbs_deb_leave(LBS_DEB_MAIN);
1164 }
1165 
1166 /**
1167  * @brief This function adds the card. it will probe the
1168  * card, allocate the lbs_priv and initialize the device.
1169  *
1170  *  @param card    A pointer to card
1171  *  @return 	   A pointer to struct lbs_private structure
1172  */
lbs_add_card(void * card,struct device * dmdev)1173 struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
1174 {
1175 	struct net_device *dev = NULL;
1176 	struct lbs_private *priv = NULL;
1177 
1178 	lbs_deb_enter(LBS_DEB_MAIN);
1179 
1180 	/* Allocate an Ethernet device and register it */
1181 	dev = alloc_etherdev(sizeof(struct lbs_private));
1182 	if (!dev) {
1183 		lbs_pr_err("init ethX device failed\n");
1184 		goto done;
1185 	}
1186 	priv = netdev_priv(dev);
1187 	dev->ml_priv = priv;
1188 
1189 	if (lbs_init_adapter(priv)) {
1190 		lbs_pr_err("failed to initialize adapter structure.\n");
1191 		goto err_init_adapter;
1192 	}
1193 
1194 	priv->dev = dev;
1195 	priv->card = card;
1196 	priv->mesh_open = 0;
1197 	priv->infra_open = 0;
1198 
1199 	/* Setup the OS Interface to our functions */
1200 	dev->open = lbs_dev_open;
1201 	dev->hard_start_xmit = lbs_hard_start_xmit;
1202 	dev->stop = lbs_eth_stop;
1203 	dev->set_mac_address = lbs_set_mac_address;
1204 	dev->tx_timeout = lbs_tx_timeout;
1205 	dev->get_stats = lbs_get_stats;
1206 	dev->watchdog_timeo = 5 * HZ;
1207 	dev->ethtool_ops = &lbs_ethtool_ops;
1208 #ifdef	WIRELESS_EXT
1209 	dev->wireless_handlers = (struct iw_handler_def *)&lbs_handler_def;
1210 #endif
1211 	dev->flags |= IFF_BROADCAST | IFF_MULTICAST;
1212 	dev->set_multicast_list = lbs_set_multicast_list;
1213 
1214 	SET_NETDEV_DEV(dev, dmdev);
1215 
1216 	priv->rtap_net_dev = NULL;
1217 
1218 	lbs_deb_thread("Starting main thread...\n");
1219 	init_waitqueue_head(&priv->waitq);
1220 	priv->main_thread = kthread_run(lbs_thread, dev, "lbs_main");
1221 	if (IS_ERR(priv->main_thread)) {
1222 		lbs_deb_thread("Error creating main thread.\n");
1223 		goto err_init_adapter;
1224 	}
1225 
1226 	priv->work_thread = create_singlethread_workqueue("lbs_worker");
1227 	INIT_DELAYED_WORK(&priv->assoc_work, lbs_association_worker);
1228 	INIT_DELAYED_WORK(&priv->scan_work, lbs_scan_worker);
1229 	INIT_WORK(&priv->mcast_work, lbs_set_mcast_worker);
1230 	INIT_WORK(&priv->sync_channel, lbs_sync_channel_worker);
1231 
1232 	sprintf(priv->mesh_ssid, "mesh");
1233 	priv->mesh_ssid_len = 4;
1234 
1235 	priv->wol_criteria = 0xffffffff;
1236 	priv->wol_gpio = 0xff;
1237 
1238 	goto done;
1239 
1240 err_init_adapter:
1241 	lbs_free_adapter(priv);
1242 	free_netdev(dev);
1243 	priv = NULL;
1244 
1245 done:
1246 	lbs_deb_leave_args(LBS_DEB_MAIN, "priv %p", priv);
1247 	return priv;
1248 }
1249 EXPORT_SYMBOL_GPL(lbs_add_card);
1250 
1251 
lbs_remove_card(struct lbs_private * priv)1252 void lbs_remove_card(struct lbs_private *priv)
1253 {
1254 	struct net_device *dev = priv->dev;
1255 	union iwreq_data wrqu;
1256 
1257 	lbs_deb_enter(LBS_DEB_MAIN);
1258 
1259 	lbs_remove_mesh(priv);
1260 	lbs_remove_rtap(priv);
1261 
1262 	dev = priv->dev;
1263 
1264 	cancel_delayed_work_sync(&priv->scan_work);
1265 	cancel_delayed_work_sync(&priv->assoc_work);
1266 	cancel_work_sync(&priv->mcast_work);
1267 
1268 	/* worker thread destruction blocks on the in-flight command which
1269 	 * should have been cleared already in lbs_stop_card().
1270 	 */
1271 	lbs_deb_main("destroying worker thread\n");
1272 	destroy_workqueue(priv->work_thread);
1273 	lbs_deb_main("done destroying worker thread\n");
1274 
1275 	if (priv->psmode == LBS802_11POWERMODEMAX_PSP) {
1276 		priv->psmode = LBS802_11POWERMODECAM;
1277 		lbs_ps_wakeup(priv, CMD_OPTION_WAITFORRSP);
1278 	}
1279 
1280 	memset(wrqu.ap_addr.sa_data, 0xaa, ETH_ALEN);
1281 	wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1282 	wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
1283 
1284 	/* Stop the thread servicing the interrupts */
1285 	priv->surpriseremoved = 1;
1286 	kthread_stop(priv->main_thread);
1287 
1288 	lbs_free_adapter(priv);
1289 
1290 	priv->dev = NULL;
1291 	free_netdev(dev);
1292 
1293 	lbs_deb_leave(LBS_DEB_MAIN);
1294 }
1295 EXPORT_SYMBOL_GPL(lbs_remove_card);
1296 
1297 
lbs_start_card(struct lbs_private * priv)1298 int lbs_start_card(struct lbs_private *priv)
1299 {
1300 	struct net_device *dev = priv->dev;
1301 	int ret = -1;
1302 
1303 	lbs_deb_enter(LBS_DEB_MAIN);
1304 
1305 	/* poke the firmware */
1306 	ret = lbs_setup_firmware(priv);
1307 	if (ret)
1308 		goto done;
1309 
1310 	/* init 802.11d */
1311 	lbs_init_11d(priv);
1312 
1313 	if (register_netdev(dev)) {
1314 		lbs_pr_err("cannot register ethX device\n");
1315 		goto done;
1316 	}
1317 
1318 	lbs_update_channel(priv);
1319 
1320 	/* 5.0.16p0 is known to NOT support any mesh */
1321 	if (priv->fwrelease > 0x05001000) {
1322 		/* Enable mesh, if supported, and work out which TLV it uses.
1323 		   0x100 + 291 is an unofficial value used in 5.110.20.pXX
1324 		   0x100 + 37 is the official value used in 5.110.21.pXX
1325 		   but we check them in that order because 20.pXX doesn't
1326 		   give an error -- it just silently fails. */
1327 
1328 		/* 5.110.20.pXX firmware will fail the command if the channel
1329 		   doesn't match the existing channel. But only if the TLV
1330 		   is correct. If the channel is wrong, _BOTH_ versions will
1331 		   give an error to 0x100+291, and allow 0x100+37 to succeed.
1332 		   It's just that 5.110.20.pXX will not have done anything
1333 		   useful */
1334 
1335 		priv->mesh_tlv = 0x100 + 291;
1336 		if (lbs_mesh_config(priv, CMD_ACT_MESH_CONFIG_START,
1337 				    priv->curbssparams.channel)) {
1338 			priv->mesh_tlv = 0x100 + 37;
1339 			if (lbs_mesh_config(priv, CMD_ACT_MESH_CONFIG_START,
1340 					    priv->curbssparams.channel))
1341 				priv->mesh_tlv = 0;
1342 		}
1343 		if (priv->mesh_tlv) {
1344 			lbs_add_mesh(priv);
1345 
1346 			if (device_create_file(&dev->dev, &dev_attr_lbs_mesh))
1347 				lbs_pr_err("cannot register lbs_mesh attribute\n");
1348 
1349 			/* While rtap isn't related to mesh, only mesh-enabled
1350 			 * firmware implements the rtap functionality via
1351 			 * CMD_802_11_MONITOR_MODE.
1352 			 */
1353 			if (device_create_file(&dev->dev, &dev_attr_lbs_rtap))
1354 				lbs_pr_err("cannot register lbs_rtap attribute\n");
1355 		}
1356 	}
1357 
1358 	lbs_debugfs_init_one(priv, dev);
1359 
1360 	lbs_pr_info("%s: Marvell WLAN 802.11 adapter\n", dev->name);
1361 
1362 	ret = 0;
1363 
1364 done:
1365 	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
1366 	return ret;
1367 }
1368 EXPORT_SYMBOL_GPL(lbs_start_card);
1369 
1370 
lbs_stop_card(struct lbs_private * priv)1371 void lbs_stop_card(struct lbs_private *priv)
1372 {
1373 	struct net_device *dev;
1374 	struct cmd_ctrl_node *cmdnode;
1375 	unsigned long flags;
1376 
1377 	lbs_deb_enter(LBS_DEB_MAIN);
1378 
1379 	if (!priv)
1380 		goto out;
1381 	dev = priv->dev;
1382 
1383 	netif_stop_queue(dev);
1384 	netif_carrier_off(dev);
1385 
1386 	lbs_debugfs_remove_one(priv);
1387 	if (priv->mesh_tlv) {
1388 		device_remove_file(&dev->dev, &dev_attr_lbs_mesh);
1389 		device_remove_file(&dev->dev, &dev_attr_lbs_rtap);
1390 	}
1391 
1392 	/* Delete the timeout of the currently processing command */
1393 	del_timer_sync(&priv->command_timer);
1394 
1395 	/* Flush pending command nodes */
1396 	spin_lock_irqsave(&priv->driver_lock, flags);
1397 	lbs_deb_main("clearing pending commands\n");
1398 	list_for_each_entry(cmdnode, &priv->cmdpendingq, list) {
1399 		cmdnode->result = -ENOENT;
1400 		cmdnode->cmdwaitqwoken = 1;
1401 		wake_up_interruptible(&cmdnode->cmdwait_q);
1402 	}
1403 
1404 	/* Flush the command the card is currently processing */
1405 	if (priv->cur_cmd) {
1406 		lbs_deb_main("clearing current command\n");
1407 		priv->cur_cmd->result = -ENOENT;
1408 		priv->cur_cmd->cmdwaitqwoken = 1;
1409 		wake_up_interruptible(&priv->cur_cmd->cmdwait_q);
1410 	}
1411 	lbs_deb_main("done clearing commands\n");
1412 	spin_unlock_irqrestore(&priv->driver_lock, flags);
1413 
1414 	unregister_netdev(dev);
1415 
1416 out:
1417 	lbs_deb_leave(LBS_DEB_MAIN);
1418 }
1419 EXPORT_SYMBOL_GPL(lbs_stop_card);
1420 
1421 
1422 /**
1423  * @brief This function adds mshX interface
1424  *
1425  *  @param priv    A pointer to the struct lbs_private structure
1426  *  @return 	   0 if successful, -X otherwise
1427  */
lbs_add_mesh(struct lbs_private * priv)1428 static int lbs_add_mesh(struct lbs_private *priv)
1429 {
1430 	struct net_device *mesh_dev = NULL;
1431 	int ret = 0;
1432 
1433 	lbs_deb_enter(LBS_DEB_MESH);
1434 
1435 	/* Allocate a virtual mesh device */
1436 	if (!(mesh_dev = alloc_netdev(0, "msh%d", ether_setup))) {
1437 		lbs_deb_mesh("init mshX device failed\n");
1438 		ret = -ENOMEM;
1439 		goto done;
1440 	}
1441 	mesh_dev->ml_priv = priv;
1442 	priv->mesh_dev = mesh_dev;
1443 
1444 	mesh_dev->open = lbs_dev_open;
1445 	mesh_dev->hard_start_xmit = lbs_hard_start_xmit;
1446 	mesh_dev->stop = lbs_mesh_stop;
1447 	mesh_dev->get_stats = lbs_get_stats;
1448 	mesh_dev->set_mac_address = lbs_set_mac_address;
1449 	mesh_dev->ethtool_ops = &lbs_ethtool_ops;
1450 	memcpy(mesh_dev->dev_addr, priv->dev->dev_addr,
1451 			sizeof(priv->dev->dev_addr));
1452 
1453 	SET_NETDEV_DEV(priv->mesh_dev, priv->dev->dev.parent);
1454 
1455 #ifdef	WIRELESS_EXT
1456 	mesh_dev->wireless_handlers = (struct iw_handler_def *)&mesh_handler_def;
1457 #endif
1458 	mesh_dev->flags |= IFF_BROADCAST | IFF_MULTICAST;
1459 	mesh_dev->set_multicast_list = lbs_set_multicast_list;
1460 	/* Register virtual mesh interface */
1461 	ret = register_netdev(mesh_dev);
1462 	if (ret) {
1463 		lbs_pr_err("cannot register mshX virtual interface\n");
1464 		goto err_free;
1465 	}
1466 
1467 	ret = sysfs_create_group(&(mesh_dev->dev.kobj), &lbs_mesh_attr_group);
1468 	if (ret)
1469 		goto err_unregister;
1470 
1471 	lbs_persist_config_init(mesh_dev);
1472 
1473 	/* Everything successful */
1474 	ret = 0;
1475 	goto done;
1476 
1477 err_unregister:
1478 	unregister_netdev(mesh_dev);
1479 
1480 err_free:
1481 	free_netdev(mesh_dev);
1482 
1483 done:
1484 	lbs_deb_leave_args(LBS_DEB_MESH, "ret %d", ret);
1485 	return ret;
1486 }
1487 
lbs_remove_mesh(struct lbs_private * priv)1488 static void lbs_remove_mesh(struct lbs_private *priv)
1489 {
1490 	struct net_device *mesh_dev;
1491 
1492 
1493 	mesh_dev = priv->mesh_dev;
1494 	if (!mesh_dev)
1495 		return;
1496 
1497 	lbs_deb_enter(LBS_DEB_MESH);
1498 	netif_stop_queue(mesh_dev);
1499 	netif_carrier_off(mesh_dev);
1500 	sysfs_remove_group(&(mesh_dev->dev.kobj), &lbs_mesh_attr_group);
1501 	lbs_persist_config_remove(mesh_dev);
1502 	unregister_netdev(mesh_dev);
1503 	priv->mesh_dev = NULL;
1504 	free_netdev(mesh_dev);
1505 	lbs_deb_leave(LBS_DEB_MESH);
1506 }
1507 
1508 /**
1509  *  @brief This function finds the CFP in
1510  *  region_cfp_table based on region and band parameter.
1511  *
1512  *  @param region  The region code
1513  *  @param band	   The band
1514  *  @param cfp_no  A pointer to CFP number
1515  *  @return 	   A pointer to CFP
1516  */
lbs_get_region_cfp_table(u8 region,int * cfp_no)1517 struct chan_freq_power *lbs_get_region_cfp_table(u8 region, int *cfp_no)
1518 {
1519 	int i, end;
1520 
1521 	lbs_deb_enter(LBS_DEB_MAIN);
1522 
1523 	end = ARRAY_SIZE(region_cfp_table);
1524 
1525 	for (i = 0; i < end ; i++) {
1526 		lbs_deb_main("region_cfp_table[i].region=%d\n",
1527 			region_cfp_table[i].region);
1528 		if (region_cfp_table[i].region == region) {
1529 			*cfp_no = region_cfp_table[i].cfp_no_BG;
1530 			lbs_deb_leave(LBS_DEB_MAIN);
1531 			return region_cfp_table[i].cfp_BG;
1532 		}
1533 	}
1534 
1535 	lbs_deb_leave_args(LBS_DEB_MAIN, "ret NULL");
1536 	return NULL;
1537 }
1538 
lbs_set_regiontable(struct lbs_private * priv,u8 region,u8 band)1539 int lbs_set_regiontable(struct lbs_private *priv, u8 region, u8 band)
1540 {
1541 	int ret = 0;
1542 	int i = 0;
1543 
1544 	struct chan_freq_power *cfp;
1545 	int cfp_no;
1546 
1547 	lbs_deb_enter(LBS_DEB_MAIN);
1548 
1549 	memset(priv->region_channel, 0, sizeof(priv->region_channel));
1550 
1551 	cfp = lbs_get_region_cfp_table(region, &cfp_no);
1552 	if (cfp != NULL) {
1553 		priv->region_channel[i].nrcfp = cfp_no;
1554 		priv->region_channel[i].CFP = cfp;
1555 	} else {
1556 		lbs_deb_main("wrong region code %#x in band B/G\n",
1557 		       region);
1558 		ret = -1;
1559 		goto out;
1560 	}
1561 	priv->region_channel[i].valid = 1;
1562 	priv->region_channel[i].region = region;
1563 	priv->region_channel[i].band = band;
1564 	i++;
1565 out:
1566 	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
1567 	return ret;
1568 }
1569 
lbs_queue_event(struct lbs_private * priv,u32 event)1570 void lbs_queue_event(struct lbs_private *priv, u32 event)
1571 {
1572 	unsigned long flags;
1573 
1574 	lbs_deb_enter(LBS_DEB_THREAD);
1575 	spin_lock_irqsave(&priv->driver_lock, flags);
1576 
1577 	if (priv->psstate == PS_STATE_SLEEP)
1578 		priv->psstate = PS_STATE_AWAKE;
1579 
1580 	__kfifo_put(priv->event_fifo, (unsigned char *) &event, sizeof(u32));
1581 
1582 	wake_up_interruptible(&priv->waitq);
1583 
1584 	spin_unlock_irqrestore(&priv->driver_lock, flags);
1585 	lbs_deb_leave(LBS_DEB_THREAD);
1586 }
1587 EXPORT_SYMBOL_GPL(lbs_queue_event);
1588 
lbs_notify_command_response(struct lbs_private * priv,u8 resp_idx)1589 void lbs_notify_command_response(struct lbs_private *priv, u8 resp_idx)
1590 {
1591 	lbs_deb_enter(LBS_DEB_THREAD);
1592 
1593 	if (priv->psstate == PS_STATE_SLEEP)
1594 		priv->psstate = PS_STATE_AWAKE;
1595 
1596 	/* Swap buffers by flipping the response index */
1597 	BUG_ON(resp_idx > 1);
1598 	priv->resp_idx = resp_idx;
1599 
1600 	wake_up_interruptible(&priv->waitq);
1601 
1602 	lbs_deb_leave(LBS_DEB_THREAD);
1603 }
1604 EXPORT_SYMBOL_GPL(lbs_notify_command_response);
1605 
lbs_init_module(void)1606 static int __init lbs_init_module(void)
1607 {
1608 	lbs_deb_enter(LBS_DEB_MAIN);
1609 	memset(&confirm_sleep, 0, sizeof(confirm_sleep));
1610 	confirm_sleep.hdr.command = cpu_to_le16(CMD_802_11_PS_MODE);
1611 	confirm_sleep.hdr.size = cpu_to_le16(sizeof(confirm_sleep));
1612 	confirm_sleep.action = cpu_to_le16(CMD_SUBCMD_SLEEP_CONFIRMED);
1613 	lbs_debugfs_init();
1614 	lbs_deb_leave(LBS_DEB_MAIN);
1615 	return 0;
1616 }
1617 
lbs_exit_module(void)1618 static void __exit lbs_exit_module(void)
1619 {
1620 	lbs_deb_enter(LBS_DEB_MAIN);
1621 	lbs_debugfs_remove();
1622 	lbs_deb_leave(LBS_DEB_MAIN);
1623 }
1624 
1625 /*
1626  * rtap interface support fuctions
1627  */
1628 
lbs_rtap_open(struct net_device * dev)1629 static int lbs_rtap_open(struct net_device *dev)
1630 {
1631 	/* Yes, _stop_ the queue. Because we don't support injection */
1632 	lbs_deb_enter(LBS_DEB_MAIN);
1633 	netif_carrier_off(dev);
1634 	netif_stop_queue(dev);
1635 	lbs_deb_leave(LBS_DEB_LEAVE);
1636 	return 0;
1637 }
1638 
lbs_rtap_stop(struct net_device * dev)1639 static int lbs_rtap_stop(struct net_device *dev)
1640 {
1641 	lbs_deb_enter(LBS_DEB_MAIN);
1642 	lbs_deb_leave(LBS_DEB_MAIN);
1643 	return 0;
1644 }
1645 
lbs_rtap_hard_start_xmit(struct sk_buff * skb,struct net_device * dev)1646 static int lbs_rtap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
1647 {
1648 	netif_stop_queue(dev);
1649 	return NETDEV_TX_BUSY;
1650 }
1651 
lbs_rtap_get_stats(struct net_device * dev)1652 static struct net_device_stats *lbs_rtap_get_stats(struct net_device *dev)
1653 {
1654 	struct lbs_private *priv = dev->ml_priv;
1655 	lbs_deb_enter(LBS_DEB_NET);
1656 	return &priv->stats;
1657 }
1658 
1659 
lbs_remove_rtap(struct lbs_private * priv)1660 static void lbs_remove_rtap(struct lbs_private *priv)
1661 {
1662 	lbs_deb_enter(LBS_DEB_MAIN);
1663 	if (priv->rtap_net_dev == NULL)
1664 		goto out;
1665 	unregister_netdev(priv->rtap_net_dev);
1666 	free_netdev(priv->rtap_net_dev);
1667 	priv->rtap_net_dev = NULL;
1668 out:
1669 	lbs_deb_leave(LBS_DEB_MAIN);
1670 }
1671 
lbs_add_rtap(struct lbs_private * priv)1672 static int lbs_add_rtap(struct lbs_private *priv)
1673 {
1674 	int ret = 0;
1675 	struct net_device *rtap_dev;
1676 
1677 	lbs_deb_enter(LBS_DEB_MAIN);
1678 	if (priv->rtap_net_dev) {
1679 		ret = -EPERM;
1680 		goto out;
1681 	}
1682 
1683 	rtap_dev = alloc_netdev(0, "rtap%d", ether_setup);
1684 	if (rtap_dev == NULL) {
1685 		ret = -ENOMEM;
1686 		goto out;
1687 	}
1688 
1689 	memcpy(rtap_dev->dev_addr, priv->current_addr, ETH_ALEN);
1690 	rtap_dev->type = ARPHRD_IEEE80211_RADIOTAP;
1691 	rtap_dev->open = lbs_rtap_open;
1692 	rtap_dev->stop = lbs_rtap_stop;
1693 	rtap_dev->get_stats = lbs_rtap_get_stats;
1694 	rtap_dev->hard_start_xmit = lbs_rtap_hard_start_xmit;
1695 	rtap_dev->ml_priv = priv;
1696 	SET_NETDEV_DEV(rtap_dev, priv->dev->dev.parent);
1697 
1698 	ret = register_netdev(rtap_dev);
1699 	if (ret) {
1700 		free_netdev(rtap_dev);
1701 		goto out;
1702 	}
1703 	priv->rtap_net_dev = rtap_dev;
1704 
1705 out:
1706 	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
1707 	return ret;
1708 }
1709 
1710 module_init(lbs_init_module);
1711 module_exit(lbs_exit_module);
1712 
1713 MODULE_DESCRIPTION("Libertas WLAN Driver Library");
1714 MODULE_AUTHOR("Marvell International Ltd.");
1715 MODULE_LICENSE("GPL");
1716