Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
main.c
Go to the documentation of this file.
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"
29 const char lbs_driver_version[] = "COMM-USB8388-" DRIVER_RELEASE_VERSION
30 #ifdef DEBUG
31  "-dbg"
32 #endif
33  "";
34 
35 
36 /* Module parameters */
37 unsigned int lbs_debug;
39 module_param_named(libertas_debug, lbs_debug, int, 0644);
40 
41 unsigned int lbs_disablemesh;
43 module_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  */
51 
52 
53 /*
54  * the table to keep region code
55  */
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  */
64 static u8 fw_data_rates[MAX_RATES] =
65  { 0x02, 0x04, 0x0B, 0x16, 0x00, 0x0C, 0x12,
66  0x18, 0x24, 0x30, 0x48, 0x60, 0x6C, 0x00
67 };
68 
76 {
77  if (idx >= sizeof(fw_data_rates))
78  idx = 0;
79  return fw_data_rates[idx];
80 }
81 
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 
103 {
104  int ret = 0;
105 
106  switch (type) {
108  ret = lbs_set_monitor_mode(priv, 1);
109  break;
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;
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 
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));
141  memcpy(cmd.macadd, priv->current_addr, ETH_ALEN);
142 
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 
166 err:
167  if (priv->power_save)
168  priv->power_save(priv);
169  return ret;
170 }
171 
178 static int lbs_dev_open(struct net_device *dev)
179 {
180  struct lbs_private *priv = dev->ml_priv;
181  int ret = 0;
182 
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 
199 out:
200  lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
201  return ret;
202 }
203 
204 static 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 
214 int lbs_stop_iface(struct lbs_private *priv)
215 {
216  unsigned long flags;
217  int ret = 0;
218 
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 
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 
240  return ret;
241 }
242 
249 static int lbs_eth_stop(struct net_device *dev)
250 {
251  struct lbs_private *priv = dev->ml_priv;
252 
254 
255  if (priv->connect_status == LBS_CONNECTED)
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);
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 
273  return 0;
274 }
275 
277 {
278  unsigned long flags;
279 
281 
282  spin_lock_irqsave(&priv->driver_lock, flags);
283  del_timer(&priv->tx_lockup_timer);
284 
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);
295 }
297 
298 int 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 
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 
326 static 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 
339 static 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 
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 
374 void 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 
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) {
392  goto out_set_mac_control;
393  } else if (dev_flags & IFF_ALLMULTI) {
394  do_allmulti:
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) {
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 
419  } else
421 
424  out_set_mac_control:
425  if (priv->mac_control != old_mac_control)
426  lbs_set_mac_control(priv);
427 
429 }
430 
431 static 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 
438 {
439  struct lbs_private *priv = dev->ml_priv;
440 
441  schedule_work(&priv->mcast_work);
442 }
443 
452 static int lbs_thread(void *data)
453 {
454  struct net_device *dev = data;
455  struct lbs_private *priv = dev->ml_priv;
457 
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);
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 
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);
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)
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);
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);
650 
652  return 0;
653 }
654 
662 static int lbs_setup_firmware(struct lbs_private *priv)
663 {
664  int ret = -1;
665  s16 curlevel = 0, minlevel = 0, maxlevel = 0;
666 
668 
669  /* Read MAC address from firmware */
670  memset(priv->current_addr, 0xff, ETH_ALEN);
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 */
685  if (ret)
686  goto done;
687 
688  ret = lbs_set_mac_control_sync(priv);
689 done:
690  lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
691  return ret;
692 }
693 
694 int lbs_suspend(struct lbs_private *priv)
695 {
696  int ret;
697 
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)
715 
716  lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
717  return ret;
718 }
720 
721 int lbs_resume(struct lbs_private *priv)
722 {
723  int ret;
724 
726 
727  ret = lbs_set_host_sleep(priv, 0);
728 
729  netif_device_attach(priv->dev);
730  if (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 }
748 
755 static void lbs_cmd_timeout_handler(unsigned long data)
756 {
757  struct lbs_private *priv = (struct lbs_private *)data;
758  unsigned long flags;
759 
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)
777 
778  wake_up(&priv->waitq);
779 out:
780  spin_unlock_irqrestore(&priv->driver_lock, flags);
782 }
783 
791 static void lbs_tx_lockup_handler(unsigned long data)
792 {
793  struct lbs_private *priv = (struct lbs_private *)data;
794  unsigned long flags;
795 
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 
805 
806  spin_unlock_irqrestore(&priv->driver_lock, flags);
808 }
809 
816 static void auto_deepsleep_timer_fn(unsigned long data)
817 {
818  struct lbs_private *priv = (struct lbs_private *)data;
819 
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));
834  sizeof(cmd));
835  }
836  }
837  mod_timer(&priv->auto_deepsleep_timer , jiffies +
838  (priv->auto_deep_sleep_timeout * HZ)/1000);
840 }
841 
843 {
845 
846  priv->is_auto_deep_sleep_enabled = 1;
847  if (priv->is_deep_sleep)
848  priv->wakeup_dev_required = 1;
850  jiffies + (priv->auto_deep_sleep_timeout * HZ)/1000);
851 
853  return 0;
854 }
855 
857 {
859 
860  priv->is_auto_deep_sleep_enabled = 0;
861  priv->auto_deep_sleep_timeout = 0;
863 
865  return 0;
866 }
867 
868 static int lbs_init_adapter(struct lbs_private *priv)
869 {
870  int ret;
871 
873 
874  memset(priv->current_addr, 0xff, ETH_ALEN);
875 
879  priv->radio_on = 1;
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;
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;
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 
923 out:
924  lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
925 
926  return ret;
927 }
928 
929 static void lbs_free_adapter(struct lbs_private *priv)
930 {
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);
938 
940 }
941 
942 static 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 
960 struct 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 
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 
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", 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;
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 
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 
1034 done:
1035  lbs_deb_leave_args(LBS_DEB_MAIN, "priv %p", priv);
1036  return priv;
1037 }
1039 
1040 
1041 void lbs_remove_card(struct lbs_private *priv)
1042 {
1043  struct net_device *dev = priv->dev;
1044 
1046 
1047  lbs_remove_mesh(priv);
1048 
1049  if (priv->wiphy_registered)
1050  lbs_scan_deinit(priv);
1051 
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");
1059  lbs_deb_main("done destroying worker thread\n");
1060 
1061  if (priv->psmode == LBS802_11POWERMODEMAX_PSP) {
1062  priv->psmode = LBS802_11POWERMODECAM;
1064  }
1065 
1066  if (priv->is_deep_sleep) {
1067  priv->is_deep_sleep = 0;
1069  }
1070 
1071  priv->is_host_sleep_configured = 0;
1072  priv->is_host_sleep_activated = 0;
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 
1084 }
1086 
1087 
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) &&
1096 }
1097 
1098 
1099 int lbs_start_card(struct lbs_private *priv)
1100 {
1101  struct net_device *dev = priv->dev;
1102  int ret = -1;
1103 
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 
1130 done:
1131  lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
1132  return ret;
1133 }
1135 
1136 
1137 void lbs_stop_card(struct lbs_private *priv)
1138 {
1139  struct net_device *dev;
1140 
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 
1159 out:
1161 }
1163 
1164 
1165 void lbs_queue_event(struct lbs_private *priv, u32 event)
1166 {
1167  unsigned long flags;
1168 
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);
1181 }
1183 
1184 void lbs_notify_command_response(struct lbs_private *priv, u8 resp_idx)
1185 {
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 
1198 }
1200 
1201 static int __init lbs_init_module(void)
1202 {
1204  memset(&confirm_sleep, 0, sizeof(confirm_sleep));
1206  confirm_sleep.hdr.size = cpu_to_le16(sizeof(confirm_sleep));
1208  lbs_debugfs_init();
1210  return 0;
1211 }
1212 
1213 static void __exit lbs_exit_module(void)
1214 {
1218 }
1219 
1220 module_init(lbs_init_module);
1221 module_exit(lbs_exit_module);
1222 
1223 MODULE_DESCRIPTION("Libertas WLAN Driver Library");
1224 MODULE_AUTHOR("Marvell International Ltd.");
1225 MODULE_LICENSE("GPL");