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#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8
9#include <linux/module.h>
10#include <linux/delay.h>
11#include <linux/etherdevice.h>
12#include <linux/hardirq.h>
13#include <linux/netdevice.h>
14#include <linux/if_arp.h>
15#include <linux/kthread.h>
16#include <linux/kfifo.h>
17#include <linux/slab.h>
18#include <net/cfg80211.h>
19
20#include "host.h"
21#include "decl.h"
22#include "dev.h"
23#include "cfg.h"
24#include "debugfs.h"
25#include "cmd.h"
26#include "mesh.h"
27
28#define DRIVER_RELEASE_VERSION "323.p0"
29const char lbs_driver_version[] = "COMM-USB8388-" DRIVER_RELEASE_VERSION
30#ifdef  DEBUG
31    "-dbg"
32#endif
33    "";
34
35
36/* Module parameters */
37unsigned int lbs_debug;
38EXPORT_SYMBOL_GPL(lbs_debug);
39module_param_named(libertas_debug, lbs_debug, int, 0644);
40
41unsigned int lbs_disablemesh;
42EXPORT_SYMBOL_GPL(lbs_disablemesh);
43module_param_named(libertas_disablemesh, lbs_disablemesh, int, 0644);
44
45
46/*
47 * This global structure is used to send the confirm_sleep command as
48 * fast as possible down to the firmware.
49 */
50struct cmd_confirm_sleep confirm_sleep;
51
52
53/*
54 * the table to keep region code
55 */
56u16 lbs_region_code_to_index[MRVDRV_MAX_REGION_CODE] =
57    { 0x10, 0x20, 0x30, 0x31, 0x32, 0x40 };
58
59/*
60 * FW rate table.  FW refers to rates by their index in this table, not by the
61 * rate value itself.  Values of 0x00 are
62 * reserved positions.
63 */
64static u8 fw_data_rates[MAX_RATES] =
65    { 0x02, 0x04, 0x0B, 0x16, 0x00, 0x0C, 0x12,
66      0x18, 0x24, 0x30, 0x48, 0x60, 0x6C, 0x00
67};
68
69/**
70 *  lbs_fw_index_to_data_rate - use index to get the data rate
71 *
72 *  @idx:	The index of data rate
73 *  returns:	data rate or 0
74 */
75u32 lbs_fw_index_to_data_rate(u8 idx)
76{
77	if (idx >= sizeof(fw_data_rates))
78		idx = 0;
79	return fw_data_rates[idx];
80}
81
82/**
83 *  lbs_data_rate_to_fw_index - use rate to get the index
84 *
85 *  @rate:	data rate
86 *  returns:	index or 0
87 */
88u8 lbs_data_rate_to_fw_index(u32 rate)
89{
90	u8 i;
91
92	if (!rate)
93		return 0;
94
95	for (i = 0; i < sizeof(fw_data_rates); i++) {
96		if (rate == fw_data_rates[i])
97			return i;
98	}
99	return 0;
100}
101
102int lbs_set_iface_type(struct lbs_private *priv, enum nl80211_iftype type)
103{
104	int ret = 0;
105
106	switch (type) {
107	case NL80211_IFTYPE_MONITOR:
108		ret = lbs_set_monitor_mode(priv, 1);
109		break;
110	case NL80211_IFTYPE_STATION:
111		if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
112			ret = lbs_set_monitor_mode(priv, 0);
113		if (!ret)
114			ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 1);
115		break;
116	case NL80211_IFTYPE_ADHOC:
117		if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
118			ret = lbs_set_monitor_mode(priv, 0);
119		if (!ret)
120			ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 2);
121		break;
122	default:
123		ret = -ENOTSUPP;
124	}
125	return ret;
126}
127
128int lbs_start_iface(struct lbs_private *priv)
129{
130	struct cmd_ds_802_11_mac_address cmd;
131	int ret;
132
133	if (priv->power_restore) {
134		ret = priv->power_restore(priv);
135		if (ret)
136			return ret;
137	}
138
139	cmd.hdr.size = cpu_to_le16(sizeof(cmd));
140	cmd.action = cpu_to_le16(CMD_ACT_SET);
141	memcpy(cmd.macadd, priv->current_addr, ETH_ALEN);
142
143	ret = lbs_cmd_with_response(priv, CMD_802_11_MAC_ADDRESS, &cmd);
144	if (ret) {
145		lbs_deb_net("set MAC address failed\n");
146		goto err;
147	}
148
149	ret = lbs_set_iface_type(priv, priv->wdev->iftype);
150	if (ret) {
151		lbs_deb_net("set iface type failed\n");
152		goto err;
153	}
154
155	ret = lbs_set_11d_domain_info(priv);
156	if (ret) {
157		lbs_deb_net("set 11d domain info failed\n");
158		goto err;
159	}
160
161	lbs_update_channel(priv);
162
163	priv->iface_running = true;
164	return 0;
165
166err:
167	if (priv->power_save)
168		priv->power_save(priv);
169	return ret;
170}
171
172/**
173 *  lbs_dev_open - open the ethX interface
174 *
175 *  @dev:	A pointer to &net_device structure
176 *  returns:	0 or -EBUSY if monitor mode active
177 */
178static int lbs_dev_open(struct net_device *dev)
179{
180	struct lbs_private *priv = dev->ml_priv;
181	int ret = 0;
182
183	lbs_deb_enter(LBS_DEB_NET);
184	if (!priv->iface_running) {
185		ret = lbs_start_iface(priv);
186		if (ret)
187			goto out;
188	}
189
190	spin_lock_irq(&priv->driver_lock);
191
192	netif_carrier_off(dev);
193
194	if (!priv->tx_pending_len)
195		netif_wake_queue(dev);
196
197	spin_unlock_irq(&priv->driver_lock);
198
199out:
200	lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
201	return ret;
202}
203
204static bool lbs_command_queue_empty(struct lbs_private *priv)
205{
206	unsigned long flags;
207	bool ret;
208	spin_lock_irqsave(&priv->driver_lock, flags);
209	ret = priv->cur_cmd == NULL && list_empty(&priv->cmdpendingq);
210	spin_unlock_irqrestore(&priv->driver_lock, flags);
211	return ret;
212}
213
214int lbs_stop_iface(struct lbs_private *priv)
215{
216	unsigned long flags;
217	int ret = 0;
218
219	lbs_deb_enter(LBS_DEB_MAIN);
220
221	spin_lock_irqsave(&priv->driver_lock, flags);
222	priv->iface_running = false;
223	kfree_skb(priv->currenttxskb);
224	priv->currenttxskb = NULL;
225	priv->tx_pending_len = 0;
226	spin_unlock_irqrestore(&priv->driver_lock, flags);
227
228	cancel_work_sync(&priv->mcast_work);
229	del_timer_sync(&priv->tx_lockup_timer);
230
231	/* Disable command processing, and wait for all commands to complete */
232	lbs_deb_main("waiting for commands to complete\n");
233	wait_event(priv->waitq, lbs_command_queue_empty(priv));
234	lbs_deb_main("all commands completed\n");
235
236	if (priv->power_save)
237		ret = priv->power_save(priv);
238
239	lbs_deb_leave(LBS_DEB_MAIN);
240	return ret;
241}
242
243/**
244 *  lbs_eth_stop - close the ethX interface
245 *
246 *  @dev:	A pointer to &net_device structure
247 *  returns:	0
248 */
249static int lbs_eth_stop(struct net_device *dev)
250{
251	struct lbs_private *priv = dev->ml_priv;
252
253	lbs_deb_enter(LBS_DEB_NET);
254
255	if (priv->connect_status == LBS_CONNECTED)
256		lbs_disconnect(priv, WLAN_REASON_DEAUTH_LEAVING);
257
258	spin_lock_irq(&priv->driver_lock);
259	netif_stop_queue(dev);
260	spin_unlock_irq(&priv->driver_lock);
261
262	lbs_update_mcast(priv);
263	cancel_delayed_work_sync(&priv->scan_work);
264	if (priv->scan_req)
265		lbs_scan_done(priv);
266
267	netif_carrier_off(priv->dev);
268
269	if (!lbs_iface_active(priv))
270		lbs_stop_iface(priv);
271
272	lbs_deb_leave(LBS_DEB_NET);
273	return 0;
274}
275
276void lbs_host_to_card_done(struct lbs_private *priv)
277{
278	unsigned long flags;
279
280	lbs_deb_enter(LBS_DEB_THREAD);
281
282	spin_lock_irqsave(&priv->driver_lock, flags);
283	del_timer(&priv->tx_lockup_timer);
284
285	priv->dnld_sent = DNLD_RES_RECEIVED;
286
287	/* Wake main thread if commands are pending */
288	if (!priv->cur_cmd || priv->tx_pending_len > 0) {
289		if (!priv->wakeup_dev_required)
290			wake_up(&priv->waitq);
291	}
292
293	spin_unlock_irqrestore(&priv->driver_lock, flags);
294	lbs_deb_leave(LBS_DEB_THREAD);
295}
296EXPORT_SYMBOL_GPL(lbs_host_to_card_done);
297
298int lbs_set_mac_address(struct net_device *dev, void *addr)
299{
300	int ret = 0;
301	struct lbs_private *priv = dev->ml_priv;
302	struct sockaddr *phwaddr = addr;
303
304	lbs_deb_enter(LBS_DEB_NET);
305
306	/*
307	 * Can only set MAC address when all interfaces are down, to be written
308	 * to the hardware when one of them is brought up.
309	 */
310	if (lbs_iface_active(priv))
311		return -EBUSY;
312
313	/* In case it was called from the mesh device */
314	dev = priv->dev;
315
316	memcpy(priv->current_addr, phwaddr->sa_data, ETH_ALEN);
317	memcpy(dev->dev_addr, phwaddr->sa_data, ETH_ALEN);
318	if (priv->mesh_dev)
319		memcpy(priv->mesh_dev->dev_addr, phwaddr->sa_data, ETH_ALEN);
320
321	lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
322	return ret;
323}
324
325
326static inline int mac_in_list(unsigned char *list, int list_len,
327			      unsigned char *mac)
328{
329	while (list_len) {
330		if (!memcmp(list, mac, ETH_ALEN))
331			return 1;
332		list += ETH_ALEN;
333		list_len--;
334	}
335	return 0;
336}
337
338
339static int lbs_add_mcast_addrs(struct cmd_ds_mac_multicast_adr *cmd,
340			       struct net_device *dev, int nr_addrs)
341{
342	int i = nr_addrs;
343	struct netdev_hw_addr *ha;
344	int cnt;
345
346	if ((dev->flags & (IFF_UP|IFF_MULTICAST)) != (IFF_UP|IFF_MULTICAST))
347		return nr_addrs;
348
349	netif_addr_lock_bh(dev);
350	cnt = netdev_mc_count(dev);
351	netdev_for_each_mc_addr(ha, dev) {
352		if (mac_in_list(cmd->maclist, nr_addrs, ha->addr)) {
353			lbs_deb_net("mcast address %s:%pM skipped\n", dev->name,
354				    ha->addr);
355			cnt--;
356			continue;
357		}
358
359		if (i == MRVDRV_MAX_MULTICAST_LIST_SIZE)
360			break;
361		memcpy(&cmd->maclist[6*i], ha->addr, ETH_ALEN);
362		lbs_deb_net("mcast address %s:%pM added to filter\n", dev->name,
363			    ha->addr);
364		i++;
365		cnt--;
366	}
367	netif_addr_unlock_bh(dev);
368	if (cnt)
369		return -EOVERFLOW;
370
371	return i;
372}
373
374void lbs_update_mcast(struct lbs_private *priv)
375{
376	struct cmd_ds_mac_multicast_adr mcast_cmd;
377	int dev_flags = 0;
378	int nr_addrs;
379	int old_mac_control = priv->mac_control;
380
381	lbs_deb_enter(LBS_DEB_NET);
382
383	if (netif_running(priv->dev))
384		dev_flags |= priv->dev->flags;
385	if (priv->mesh_dev && netif_running(priv->mesh_dev))
386		dev_flags |= priv->mesh_dev->flags;
387
388	if (dev_flags & IFF_PROMISC) {
389		priv->mac_control |= CMD_ACT_MAC_PROMISCUOUS_ENABLE;
390		priv->mac_control &= ~(CMD_ACT_MAC_ALL_MULTICAST_ENABLE |
391				       CMD_ACT_MAC_MULTICAST_ENABLE);
392		goto out_set_mac_control;
393	} else if (dev_flags & IFF_ALLMULTI) {
394	do_allmulti:
395		priv->mac_control |= CMD_ACT_MAC_ALL_MULTICAST_ENABLE;
396		priv->mac_control &= ~(CMD_ACT_MAC_PROMISCUOUS_ENABLE |
397				       CMD_ACT_MAC_MULTICAST_ENABLE);
398		goto out_set_mac_control;
399	}
400
401	/* Once for priv->dev, again for priv->mesh_dev if it exists */
402	nr_addrs = lbs_add_mcast_addrs(&mcast_cmd, priv->dev, 0);
403	if (nr_addrs >= 0 && priv->mesh_dev)
404		nr_addrs = lbs_add_mcast_addrs(&mcast_cmd, priv->mesh_dev, nr_addrs);
405	if (nr_addrs < 0)
406		goto do_allmulti;
407
408	if (nr_addrs) {
409		int size = offsetof(struct cmd_ds_mac_multicast_adr,
410				    maclist[6*nr_addrs]);
411
412		mcast_cmd.action = cpu_to_le16(CMD_ACT_SET);
413		mcast_cmd.hdr.size = cpu_to_le16(size);
414		mcast_cmd.nr_of_adrs = cpu_to_le16(nr_addrs);
415
416		lbs_cmd_async(priv, CMD_MAC_MULTICAST_ADR, &mcast_cmd.hdr, size);
417
418		priv->mac_control |= CMD_ACT_MAC_MULTICAST_ENABLE;
419	} else
420		priv->mac_control &= ~CMD_ACT_MAC_MULTICAST_ENABLE;
421
422	priv->mac_control &= ~(CMD_ACT_MAC_PROMISCUOUS_ENABLE |
423			       CMD_ACT_MAC_ALL_MULTICAST_ENABLE);
424 out_set_mac_control:
425	if (priv->mac_control != old_mac_control)
426		lbs_set_mac_control(priv);
427
428	lbs_deb_leave(LBS_DEB_NET);
429}
430
431static void lbs_set_mcast_worker(struct work_struct *work)
432{
433	struct lbs_private *priv = container_of(work, struct lbs_private, mcast_work);
434	lbs_update_mcast(priv);
435}
436
437void lbs_set_multicast_list(struct net_device *dev)
438{
439	struct lbs_private *priv = dev->ml_priv;
440
441	schedule_work(&priv->mcast_work);
442}
443
444/**
445 *  lbs_thread - handles the major jobs in the LBS driver.
446 *  It handles all events generated by firmware, RX data received
447 *  from firmware and TX data sent from kernel.
448 *
449 *  @data:	A pointer to &lbs_thread structure
450 *  returns:	0
451 */
452static int lbs_thread(void *data)
453{
454	struct net_device *dev = data;
455	struct lbs_private *priv = dev->ml_priv;
456	wait_queue_t wait;
457
458	lbs_deb_enter(LBS_DEB_THREAD);
459
460	init_waitqueue_entry(&wait, current);
461
462	for (;;) {
463		int shouldsleep;
464		u8 resp_idx;
465
466		lbs_deb_thread("1: currenttxskb %p, dnld_sent %d\n",
467				priv->currenttxskb, priv->dnld_sent);
468
469		add_wait_queue(&priv->waitq, &wait);
470		set_current_state(TASK_INTERRUPTIBLE);
471		spin_lock_irq(&priv->driver_lock);
472
473		if (kthread_should_stop())
474			shouldsleep = 0;	/* Bye */
475		else if (priv->surpriseremoved)
476			shouldsleep = 1;	/* We need to wait until we're _told_ to die */
477		else if (priv->psstate == PS_STATE_SLEEP)
478			shouldsleep = 1;	/* Sleep mode. Nothing we can do till it wakes */
479		else if (priv->cmd_timed_out)
480			shouldsleep = 0;	/* Command timed out. Recover */
481		else if (!priv->fw_ready)
482			shouldsleep = 1;	/* Firmware not ready. We're waiting for it */
483		else if (priv->dnld_sent)
484			shouldsleep = 1;	/* Something is en route to the device already */
485		else if (priv->tx_pending_len > 0)
486			shouldsleep = 0;	/* We've a packet to send */
487		else if (priv->resp_len[priv->resp_idx])
488			shouldsleep = 0;	/* We have a command response */
489		else if (priv->cur_cmd)
490			shouldsleep = 1;	/* Can't send a command; one already running */
491		else if (!list_empty(&priv->cmdpendingq) &&
492					!(priv->wakeup_dev_required))
493			shouldsleep = 0;	/* We have a command to send */
494		else if (kfifo_len(&priv->event_fifo))
495			shouldsleep = 0;	/* We have an event to process */
496		else
497			shouldsleep = 1;	/* No command */
498
499		if (shouldsleep) {
500			lbs_deb_thread("sleeping, connect_status %d, "
501				"psmode %d, psstate %d\n",
502				priv->connect_status,
503				priv->psmode, priv->psstate);
504			spin_unlock_irq(&priv->driver_lock);
505			schedule();
506		} else
507			spin_unlock_irq(&priv->driver_lock);
508
509		lbs_deb_thread("2: currenttxskb %p, dnld_send %d\n",
510			       priv->currenttxskb, priv->dnld_sent);
511
512		set_current_state(TASK_RUNNING);
513		remove_wait_queue(&priv->waitq, &wait);
514
515		lbs_deb_thread("3: currenttxskb %p, dnld_sent %d\n",
516			       priv->currenttxskb, priv->dnld_sent);
517
518		if (kthread_should_stop()) {
519			lbs_deb_thread("break from main thread\n");
520			break;
521		}
522
523		if (priv->surpriseremoved) {
524			lbs_deb_thread("adapter removed; waiting to die...\n");
525			continue;
526		}
527
528		lbs_deb_thread("4: currenttxskb %p, dnld_sent %d\n",
529		       priv->currenttxskb, priv->dnld_sent);
530
531		/* Process any pending command response */
532		spin_lock_irq(&priv->driver_lock);
533		resp_idx = priv->resp_idx;
534		if (priv->resp_len[resp_idx]) {
535			spin_unlock_irq(&priv->driver_lock);
536			lbs_process_command_response(priv,
537				priv->resp_buf[resp_idx],
538				priv->resp_len[resp_idx]);
539			spin_lock_irq(&priv->driver_lock);
540			priv->resp_len[resp_idx] = 0;
541		}
542		spin_unlock_irq(&priv->driver_lock);
543
544		/* Process hardware events, e.g. card removed, link lost */
545		spin_lock_irq(&priv->driver_lock);
546		while (kfifo_len(&priv->event_fifo)) {
547			u32 event;
548
549			if (kfifo_out(&priv->event_fifo,
550				(unsigned char *) &event, sizeof(event)) !=
551				sizeof(event))
552					break;
553			spin_unlock_irq(&priv->driver_lock);
554			lbs_process_event(priv, event);
555			spin_lock_irq(&priv->driver_lock);
556		}
557		spin_unlock_irq(&priv->driver_lock);
558
559		if (priv->wakeup_dev_required) {
560			lbs_deb_thread("Waking up device...\n");
561			/* Wake up device */
562			if (priv->exit_deep_sleep(priv))
563				lbs_deb_thread("Wakeup device failed\n");
564			continue;
565		}
566
567		/* command timeout stuff */
568		if (priv->cmd_timed_out && priv->cur_cmd) {
569			struct cmd_ctrl_node *cmdnode = priv->cur_cmd;
570
571			netdev_info(dev, "Timeout submitting command 0x%04x\n",
572				    le16_to_cpu(cmdnode->cmdbuf->command));
573			lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
574
575			/* Reset card, but only when it isn't in the process
576			 * of being shutdown anyway. */
577			if (!dev->dismantle && priv->reset_card)
578				priv->reset_card(priv);
579		}
580		priv->cmd_timed_out = 0;
581
582		if (!priv->fw_ready)
583			continue;
584
585		/* Check if we need to confirm Sleep Request received previously */
586		if (priv->psstate == PS_STATE_PRE_SLEEP &&
587		    !priv->dnld_sent && !priv->cur_cmd) {
588			if (priv->connect_status == LBS_CONNECTED) {
589				lbs_deb_thread("pre-sleep, currenttxskb %p, "
590					"dnld_sent %d, cur_cmd %p\n",
591					priv->currenttxskb, priv->dnld_sent,
592					priv->cur_cmd);
593
594				lbs_ps_confirm_sleep(priv);
595			} else {
596				/* workaround for firmware sending
597				 * deauth/linkloss event immediately
598				 * after sleep request; remove this
599				 * after firmware fixes it
600				 */
601				priv->psstate = PS_STATE_AWAKE;
602				netdev_alert(dev,
603					     "ignore PS_SleepConfirm in non-connected state\n");
604			}
605		}
606
607		/* The PS state is changed during processing of Sleep Request
608		 * event above
609		 */
610		if ((priv->psstate == PS_STATE_SLEEP) ||
611		    (priv->psstate == PS_STATE_PRE_SLEEP))
612			continue;
613
614		if (priv->is_deep_sleep)
615			continue;
616
617		/* Execute the next command */
618		if (!priv->dnld_sent && !priv->cur_cmd)
619			lbs_execute_next_command(priv);
620
621		spin_lock_irq(&priv->driver_lock);
622		if (!priv->dnld_sent && priv->tx_pending_len > 0) {
623			int ret = priv->hw_host_to_card(priv, MVMS_DAT,
624							priv->tx_pending_buf,
625							priv->tx_pending_len);
626			if (ret) {
627				lbs_deb_tx("host_to_card failed %d\n", ret);
628				priv->dnld_sent = DNLD_RES_RECEIVED;
629			} else {
630				mod_timer(&priv->tx_lockup_timer,
631					  jiffies + (HZ * 5));
632			}
633			priv->tx_pending_len = 0;
634			if (!priv->currenttxskb) {
635				/* We can wake the queues immediately if we aren't
636				   waiting for TX feedback */
637				if (priv->connect_status == LBS_CONNECTED)
638					netif_wake_queue(priv->dev);
639				if (priv->mesh_dev &&
640				    netif_running(priv->mesh_dev))
641					netif_wake_queue(priv->mesh_dev);
642			}
643		}
644		spin_unlock_irq(&priv->driver_lock);
645	}
646
647	del_timer(&priv->command_timer);
648	del_timer(&priv->tx_lockup_timer);
649	del_timer(&priv->auto_deepsleep_timer);
650
651	lbs_deb_leave(LBS_DEB_THREAD);
652	return 0;
653}
654
655/**
656 * lbs_setup_firmware - gets the HW spec from the firmware and sets
657 *        some basic parameters
658 *
659 *  @priv:	A pointer to &struct lbs_private structure
660 *  returns:	0 or -1
661 */
662static int lbs_setup_firmware(struct lbs_private *priv)
663{
664	int ret = -1;
665	s16 curlevel = 0, minlevel = 0, maxlevel = 0;
666
667	lbs_deb_enter(LBS_DEB_FW);
668
669	/* Read MAC address from firmware */
670	eth_broadcast_addr(priv->current_addr);
671	ret = lbs_update_hw_spec(priv);
672	if (ret)
673		goto done;
674
675	/* Read power levels if available */
676	ret = lbs_get_tx_power(priv, &curlevel, &minlevel, &maxlevel);
677	if (ret == 0) {
678		priv->txpower_cur = curlevel;
679		priv->txpower_min = minlevel;
680		priv->txpower_max = maxlevel;
681	}
682
683	/* Send cmd to FW to enable 11D function */
684	ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_11D_ENABLE, 1);
685	if (ret)
686		goto done;
687
688	ret = lbs_set_mac_control_sync(priv);
689done:
690	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
691	return ret;
692}
693
694int lbs_suspend(struct lbs_private *priv)
695{
696	int ret;
697
698	lbs_deb_enter(LBS_DEB_FW);
699
700	if (priv->is_deep_sleep) {
701		ret = lbs_set_deep_sleep(priv, 0);
702		if (ret) {
703			netdev_err(priv->dev,
704				   "deep sleep cancellation failed: %d\n", ret);
705			return ret;
706		}
707		priv->deep_sleep_required = 1;
708	}
709
710	ret = lbs_set_host_sleep(priv, 1);
711
712	netif_device_detach(priv->dev);
713	if (priv->mesh_dev)
714		netif_device_detach(priv->mesh_dev);
715
716	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
717	return ret;
718}
719EXPORT_SYMBOL_GPL(lbs_suspend);
720
721int lbs_resume(struct lbs_private *priv)
722{
723	int ret;
724
725	lbs_deb_enter(LBS_DEB_FW);
726
727	ret = lbs_set_host_sleep(priv, 0);
728
729	netif_device_attach(priv->dev);
730	if (priv->mesh_dev)
731		netif_device_attach(priv->mesh_dev);
732
733	if (priv->deep_sleep_required) {
734		priv->deep_sleep_required = 0;
735		ret = lbs_set_deep_sleep(priv, 1);
736		if (ret)
737			netdev_err(priv->dev,
738				   "deep sleep activation failed: %d\n", ret);
739	}
740
741	if (priv->setup_fw_on_resume)
742		ret = lbs_setup_firmware(priv);
743
744	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
745	return ret;
746}
747EXPORT_SYMBOL_GPL(lbs_resume);
748
749/**
750 * lbs_cmd_timeout_handler - handles the timeout of command sending.
751 * It will re-send the same command again.
752 *
753 * @data: &struct lbs_private pointer
754 */
755static void lbs_cmd_timeout_handler(unsigned long data)
756{
757	struct lbs_private *priv = (struct lbs_private *)data;
758	unsigned long flags;
759
760	lbs_deb_enter(LBS_DEB_CMD);
761	spin_lock_irqsave(&priv->driver_lock, flags);
762
763	if (!priv->cur_cmd)
764		goto out;
765
766	netdev_info(priv->dev, "command 0x%04x timed out\n",
767		    le16_to_cpu(priv->cur_cmd->cmdbuf->command));
768
769	priv->cmd_timed_out = 1;
770
771	/*
772	 * If the device didn't even acknowledge the command, reset the state
773	 * so that we don't block all future commands due to this one timeout.
774	 */
775	if (priv->dnld_sent == DNLD_CMD_SENT)
776		priv->dnld_sent = DNLD_RES_RECEIVED;
777
778	wake_up(&priv->waitq);
779out:
780	spin_unlock_irqrestore(&priv->driver_lock, flags);
781	lbs_deb_leave(LBS_DEB_CMD);
782}
783
784/**
785 * lbs_tx_lockup_handler - handles the timeout of the passing of TX frames
786 * to the hardware. This is known to frequently happen with SD8686 when
787 * waking up after a Wake-on-WLAN-triggered resume.
788 *
789 * @data: &struct lbs_private pointer
790 */
791static void lbs_tx_lockup_handler(unsigned long data)
792{
793	struct lbs_private *priv = (struct lbs_private *)data;
794	unsigned long flags;
795
796	lbs_deb_enter(LBS_DEB_TX);
797	spin_lock_irqsave(&priv->driver_lock, flags);
798
799	netdev_info(priv->dev, "TX lockup detected\n");
800	if (priv->reset_card)
801		priv->reset_card(priv);
802
803	priv->dnld_sent = DNLD_RES_RECEIVED;
804	wake_up_interruptible(&priv->waitq);
805
806	spin_unlock_irqrestore(&priv->driver_lock, flags);
807	lbs_deb_leave(LBS_DEB_TX);
808}
809
810/**
811 * auto_deepsleep_timer_fn - put the device back to deep sleep mode when
812 * timer expires and no activity (command, event, data etc.) is detected.
813 * @data:	&struct lbs_private pointer
814 * returns:	N/A
815 */
816static void auto_deepsleep_timer_fn(unsigned long data)
817{
818	struct lbs_private *priv = (struct lbs_private *)data;
819
820	lbs_deb_enter(LBS_DEB_CMD);
821
822	if (priv->is_activity_detected) {
823		priv->is_activity_detected = 0;
824	} else {
825		if (priv->is_auto_deep_sleep_enabled &&
826		    (!priv->wakeup_dev_required) &&
827		    (priv->connect_status != LBS_CONNECTED)) {
828			struct cmd_header cmd;
829
830			lbs_deb_main("Entering auto deep sleep mode...\n");
831			memset(&cmd, 0, sizeof(cmd));
832			cmd.size = cpu_to_le16(sizeof(cmd));
833			lbs_cmd_async(priv, CMD_802_11_DEEP_SLEEP, &cmd,
834					sizeof(cmd));
835		}
836	}
837	mod_timer(&priv->auto_deepsleep_timer , jiffies +
838				(priv->auto_deep_sleep_timeout * HZ)/1000);
839	lbs_deb_leave(LBS_DEB_CMD);
840}
841
842int lbs_enter_auto_deep_sleep(struct lbs_private *priv)
843{
844	lbs_deb_enter(LBS_DEB_SDIO);
845
846	priv->is_auto_deep_sleep_enabled = 1;
847	if (priv->is_deep_sleep)
848		priv->wakeup_dev_required = 1;
849	mod_timer(&priv->auto_deepsleep_timer ,
850			jiffies + (priv->auto_deep_sleep_timeout * HZ)/1000);
851
852	lbs_deb_leave(LBS_DEB_SDIO);
853	return 0;
854}
855
856int lbs_exit_auto_deep_sleep(struct lbs_private *priv)
857{
858	lbs_deb_enter(LBS_DEB_SDIO);
859
860	priv->is_auto_deep_sleep_enabled = 0;
861	priv->auto_deep_sleep_timeout = 0;
862	del_timer(&priv->auto_deepsleep_timer);
863
864	lbs_deb_leave(LBS_DEB_SDIO);
865	return 0;
866}
867
868static int lbs_init_adapter(struct lbs_private *priv)
869{
870	int ret;
871
872	lbs_deb_enter(LBS_DEB_MAIN);
873
874	eth_broadcast_addr(priv->current_addr);
875
876	priv->connect_status = LBS_DISCONNECTED;
877	priv->channel = DEFAULT_AD_HOC_CHANNEL;
878	priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON;
879	priv->radio_on = 1;
880	priv->psmode = LBS802_11POWERMODECAM;
881	priv->psstate = PS_STATE_FULL_POWER;
882	priv->is_deep_sleep = 0;
883	priv->is_auto_deep_sleep_enabled = 0;
884	priv->deep_sleep_required = 0;
885	priv->wakeup_dev_required = 0;
886	init_waitqueue_head(&priv->ds_awake_q);
887	init_waitqueue_head(&priv->scan_q);
888	priv->authtype_auto = 1;
889	priv->is_host_sleep_configured = 0;
890	priv->is_host_sleep_activated = 0;
891	init_waitqueue_head(&priv->host_sleep_q);
892	init_waitqueue_head(&priv->fw_waitq);
893	mutex_init(&priv->lock);
894
895	setup_timer(&priv->command_timer, lbs_cmd_timeout_handler,
896		(unsigned long)priv);
897	setup_timer(&priv->tx_lockup_timer, lbs_tx_lockup_handler,
898		(unsigned long)priv);
899	setup_timer(&priv->auto_deepsleep_timer, auto_deepsleep_timer_fn,
900			(unsigned long)priv);
901
902	INIT_LIST_HEAD(&priv->cmdfreeq);
903	INIT_LIST_HEAD(&priv->cmdpendingq);
904
905	spin_lock_init(&priv->driver_lock);
906
907	/* Allocate the command buffers */
908	if (lbs_allocate_cmd_buffer(priv)) {
909		pr_err("Out of memory allocating command buffers\n");
910		ret = -ENOMEM;
911		goto out;
912	}
913	priv->resp_idx = 0;
914	priv->resp_len[0] = priv->resp_len[1] = 0;
915
916	/* Create the event FIFO */
917	ret = kfifo_alloc(&priv->event_fifo, sizeof(u32) * 16, GFP_KERNEL);
918	if (ret) {
919		pr_err("Out of memory allocating event FIFO buffer\n");
920		goto out;
921	}
922
923out:
924	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
925
926	return ret;
927}
928
929static void lbs_free_adapter(struct lbs_private *priv)
930{
931	lbs_deb_enter(LBS_DEB_MAIN);
932
933	lbs_free_cmd_buffer(priv);
934	kfifo_free(&priv->event_fifo);
935	del_timer(&priv->command_timer);
936	del_timer(&priv->tx_lockup_timer);
937	del_timer(&priv->auto_deepsleep_timer);
938
939	lbs_deb_leave(LBS_DEB_MAIN);
940}
941
942static const struct net_device_ops lbs_netdev_ops = {
943	.ndo_open 		= lbs_dev_open,
944	.ndo_stop		= lbs_eth_stop,
945	.ndo_start_xmit		= lbs_hard_start_xmit,
946	.ndo_set_mac_address	= lbs_set_mac_address,
947	.ndo_set_rx_mode	= lbs_set_multicast_list,
948	.ndo_change_mtu		= eth_change_mtu,
949	.ndo_validate_addr	= eth_validate_addr,
950};
951
952/**
953 * lbs_add_card - adds the card. It will probe the
954 * card, allocate the lbs_priv and initialize the device.
955 *
956 * @card:	A pointer to card
957 * @dmdev:	A pointer to &struct device
958 * returns:	A pointer to &struct lbs_private structure
959 */
960struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
961{
962	struct net_device *dev;
963	struct wireless_dev *wdev;
964	struct lbs_private *priv = NULL;
965
966	lbs_deb_enter(LBS_DEB_MAIN);
967
968	/* Allocate an Ethernet device and register it */
969	wdev = lbs_cfg_alloc(dmdev);
970	if (IS_ERR(wdev)) {
971		pr_err("cfg80211 init failed\n");
972		goto done;
973	}
974
975	wdev->iftype = NL80211_IFTYPE_STATION;
976	priv = wdev_priv(wdev);
977	priv->wdev = wdev;
978
979	if (lbs_init_adapter(priv)) {
980		pr_err("failed to initialize adapter structure\n");
981		goto err_wdev;
982	}
983
984	dev = alloc_netdev(0, "wlan%d", NET_NAME_UNKNOWN, ether_setup);
985	if (!dev) {
986		dev_err(dmdev, "no memory for network device instance\n");
987		goto err_adapter;
988	}
989
990	dev->ieee80211_ptr = wdev;
991	dev->ml_priv = priv;
992	SET_NETDEV_DEV(dev, dmdev);
993	wdev->netdev = dev;
994	priv->dev = dev;
995
996 	dev->netdev_ops = &lbs_netdev_ops;
997	dev->watchdog_timeo = 5 * HZ;
998	dev->ethtool_ops = &lbs_ethtool_ops;
999	dev->flags |= IFF_BROADCAST | IFF_MULTICAST;
1000
1001	priv->card = card;
1002
1003	strcpy(dev->name, "wlan%d");
1004
1005	lbs_deb_thread("Starting main thread...\n");
1006	init_waitqueue_head(&priv->waitq);
1007	priv->main_thread = kthread_run(lbs_thread, dev, "lbs_main");
1008	if (IS_ERR(priv->main_thread)) {
1009		lbs_deb_thread("Error creating main thread.\n");
1010		goto err_ndev;
1011	}
1012
1013	priv->work_thread = create_singlethread_workqueue("lbs_worker");
1014	INIT_WORK(&priv->mcast_work, lbs_set_mcast_worker);
1015
1016	priv->wol_criteria = EHS_REMOVE_WAKEUP;
1017	priv->wol_gpio = 0xff;
1018	priv->wol_gap = 20;
1019	priv->ehs_remove_supported = true;
1020
1021	goto done;
1022
1023 err_ndev:
1024	free_netdev(dev);
1025
1026 err_adapter:
1027	lbs_free_adapter(priv);
1028
1029 err_wdev:
1030	lbs_cfg_free(priv);
1031
1032	priv = NULL;
1033
1034done:
1035	lbs_deb_leave_args(LBS_DEB_MAIN, "priv %p", priv);
1036	return priv;
1037}
1038EXPORT_SYMBOL_GPL(lbs_add_card);
1039
1040
1041void lbs_remove_card(struct lbs_private *priv)
1042{
1043	struct net_device *dev = priv->dev;
1044
1045	lbs_deb_enter(LBS_DEB_MAIN);
1046
1047	lbs_remove_mesh(priv);
1048
1049	if (priv->wiphy_registered)
1050		lbs_scan_deinit(priv);
1051
1052	lbs_wait_for_firmware_load(priv);
1053
1054	/* worker thread destruction blocks on the in-flight command which
1055	 * should have been cleared already in lbs_stop_card().
1056	 */
1057	lbs_deb_main("destroying worker thread\n");
1058	destroy_workqueue(priv->work_thread);
1059	lbs_deb_main("done destroying worker thread\n");
1060
1061	if (priv->psmode == LBS802_11POWERMODEMAX_PSP) {
1062		priv->psmode = LBS802_11POWERMODECAM;
1063		lbs_set_ps_mode(priv, PS_MODE_ACTION_EXIT_PS, true);
1064	}
1065
1066	if (priv->is_deep_sleep) {
1067		priv->is_deep_sleep = 0;
1068		wake_up_interruptible(&priv->ds_awake_q);
1069	}
1070
1071	priv->is_host_sleep_configured = 0;
1072	priv->is_host_sleep_activated = 0;
1073	wake_up_interruptible(&priv->host_sleep_q);
1074
1075	/* Stop the thread servicing the interrupts */
1076	priv->surpriseremoved = 1;
1077	kthread_stop(priv->main_thread);
1078
1079	lbs_free_adapter(priv);
1080	lbs_cfg_free(priv);
1081	free_netdev(dev);
1082
1083	lbs_deb_leave(LBS_DEB_MAIN);
1084}
1085EXPORT_SYMBOL_GPL(lbs_remove_card);
1086
1087
1088int lbs_rtap_supported(struct lbs_private *priv)
1089{
1090	if (MRVL_FW_MAJOR_REV(priv->fwrelease) == MRVL_FW_V5)
1091		return 1;
1092
1093	/* newer firmware use a capability mask */
1094	return ((MRVL_FW_MAJOR_REV(priv->fwrelease) >= MRVL_FW_V10) &&
1095		(priv->fwcapinfo & MESH_CAPINFO_ENABLE_MASK));
1096}
1097
1098
1099int lbs_start_card(struct lbs_private *priv)
1100{
1101	struct net_device *dev = priv->dev;
1102	int ret = -1;
1103
1104	lbs_deb_enter(LBS_DEB_MAIN);
1105
1106	/* poke the firmware */
1107	ret = lbs_setup_firmware(priv);
1108	if (ret)
1109		goto done;
1110
1111	if (!lbs_disablemesh)
1112		lbs_init_mesh(priv);
1113	else
1114		pr_info("%s: mesh disabled\n", dev->name);
1115
1116	if (lbs_cfg_register(priv)) {
1117		pr_err("cannot register device\n");
1118		goto done;
1119	}
1120
1121	if (lbs_mesh_activated(priv))
1122		lbs_start_mesh(priv);
1123
1124	lbs_debugfs_init_one(priv, dev);
1125
1126	netdev_info(dev, "Marvell WLAN 802.11 adapter\n");
1127
1128	ret = 0;
1129
1130done:
1131	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
1132	return ret;
1133}
1134EXPORT_SYMBOL_GPL(lbs_start_card);
1135
1136
1137void lbs_stop_card(struct lbs_private *priv)
1138{
1139	struct net_device *dev;
1140
1141	lbs_deb_enter(LBS_DEB_MAIN);
1142
1143	if (!priv)
1144		goto out;
1145	dev = priv->dev;
1146
1147	/* If the netdev isn't registered, it means that lbs_start_card() was
1148	 * never called so we have nothing to do here. */
1149	if (dev->reg_state != NETREG_REGISTERED)
1150		goto out;
1151
1152	netif_stop_queue(dev);
1153	netif_carrier_off(dev);
1154
1155	lbs_debugfs_remove_one(priv);
1156	lbs_deinit_mesh(priv);
1157	unregister_netdev(dev);
1158
1159out:
1160	lbs_deb_leave(LBS_DEB_MAIN);
1161}
1162EXPORT_SYMBOL_GPL(lbs_stop_card);
1163
1164
1165void lbs_queue_event(struct lbs_private *priv, u32 event)
1166{
1167	unsigned long flags;
1168
1169	lbs_deb_enter(LBS_DEB_THREAD);
1170	spin_lock_irqsave(&priv->driver_lock, flags);
1171
1172	if (priv->psstate == PS_STATE_SLEEP)
1173		priv->psstate = PS_STATE_AWAKE;
1174
1175	kfifo_in(&priv->event_fifo, (unsigned char *) &event, sizeof(u32));
1176
1177	wake_up(&priv->waitq);
1178
1179	spin_unlock_irqrestore(&priv->driver_lock, flags);
1180	lbs_deb_leave(LBS_DEB_THREAD);
1181}
1182EXPORT_SYMBOL_GPL(lbs_queue_event);
1183
1184void lbs_notify_command_response(struct lbs_private *priv, u8 resp_idx)
1185{
1186	lbs_deb_enter(LBS_DEB_THREAD);
1187
1188	if (priv->psstate == PS_STATE_SLEEP)
1189		priv->psstate = PS_STATE_AWAKE;
1190
1191	/* Swap buffers by flipping the response index */
1192	BUG_ON(resp_idx > 1);
1193	priv->resp_idx = resp_idx;
1194
1195	wake_up(&priv->waitq);
1196
1197	lbs_deb_leave(LBS_DEB_THREAD);
1198}
1199EXPORT_SYMBOL_GPL(lbs_notify_command_response);
1200
1201static int __init lbs_init_module(void)
1202{
1203	lbs_deb_enter(LBS_DEB_MAIN);
1204	memset(&confirm_sleep, 0, sizeof(confirm_sleep));
1205	confirm_sleep.hdr.command = cpu_to_le16(CMD_802_11_PS_MODE);
1206	confirm_sleep.hdr.size = cpu_to_le16(sizeof(confirm_sleep));
1207	confirm_sleep.action = cpu_to_le16(PS_MODE_ACTION_SLEEP_CONFIRMED);
1208	lbs_debugfs_init();
1209	lbs_deb_leave(LBS_DEB_MAIN);
1210	return 0;
1211}
1212
1213static void __exit lbs_exit_module(void)
1214{
1215	lbs_deb_enter(LBS_DEB_MAIN);
1216	lbs_debugfs_remove();
1217	lbs_deb_leave(LBS_DEB_MAIN);
1218}
1219
1220module_init(lbs_init_module);
1221module_exit(lbs_exit_module);
1222
1223MODULE_DESCRIPTION("Libertas WLAN Driver Library");
1224MODULE_AUTHOR("Marvell International Ltd.");
1225MODULE_LICENSE("GPL");
1226