0001
0002
0003
0004
0005
0006
0007
0008 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0009
0010 #include <linux/module.h>
0011 #include <linux/delay.h>
0012 #include <linux/etherdevice.h>
0013 #include <linux/hardirq.h>
0014 #include <linux/netdevice.h>
0015 #include <linux/if_arp.h>
0016 #include <linux/kthread.h>
0017 #include <linux/kfifo.h>
0018 #include <linux/slab.h>
0019 #include <net/cfg80211.h>
0020
0021 #include "host.h"
0022 #include "decl.h"
0023 #include "dev.h"
0024 #include "cfg.h"
0025 #include "debugfs.h"
0026 #include "cmd.h"
0027 #include "mesh.h"
0028
0029 #define DRIVER_RELEASE_VERSION "323.p0"
0030 const char lbs_driver_version[] = "COMM-USB8388-" DRIVER_RELEASE_VERSION
0031 #ifdef DEBUG
0032 "-dbg"
0033 #endif
0034 "";
0035
0036
0037
0038 unsigned int lbs_debug;
0039 EXPORT_SYMBOL_GPL(lbs_debug);
0040 module_param_named(libertas_debug, lbs_debug, int, 0644);
0041
0042 unsigned int lbs_disablemesh;
0043 EXPORT_SYMBOL_GPL(lbs_disablemesh);
0044 module_param_named(libertas_disablemesh, lbs_disablemesh, int, 0644);
0045
0046
0047
0048
0049
0050
0051 struct cmd_confirm_sleep confirm_sleep;
0052
0053
0054
0055
0056
0057 u16 lbs_region_code_to_index[MRVDRV_MAX_REGION_CODE] =
0058 { 0x10, 0x20, 0x30, 0x31, 0x32, 0x40 };
0059
0060
0061
0062
0063
0064
0065 static u8 fw_data_rates[MAX_RATES] =
0066 { 0x02, 0x04, 0x0B, 0x16, 0x00, 0x0C, 0x12,
0067 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C, 0x00
0068 };
0069
0070
0071
0072
0073
0074
0075
0076 u32 lbs_fw_index_to_data_rate(u8 idx)
0077 {
0078 if (idx >= sizeof(fw_data_rates))
0079 idx = 0;
0080 return fw_data_rates[idx];
0081 }
0082
0083
0084
0085
0086
0087
0088
0089 u8 lbs_data_rate_to_fw_index(u32 rate)
0090 {
0091 u8 i;
0092
0093 if (!rate)
0094 return 0;
0095
0096 for (i = 0; i < sizeof(fw_data_rates); i++) {
0097 if (rate == fw_data_rates[i])
0098 return i;
0099 }
0100 return 0;
0101 }
0102
0103 int lbs_set_iface_type(struct lbs_private *priv, enum nl80211_iftype type)
0104 {
0105 int ret = 0;
0106
0107 switch (type) {
0108 case NL80211_IFTYPE_MONITOR:
0109 ret = lbs_set_monitor_mode(priv, 1);
0110 break;
0111 case NL80211_IFTYPE_STATION:
0112 if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
0113 ret = lbs_set_monitor_mode(priv, 0);
0114 if (!ret)
0115 ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 1);
0116 break;
0117 case NL80211_IFTYPE_ADHOC:
0118 if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
0119 ret = lbs_set_monitor_mode(priv, 0);
0120 if (!ret)
0121 ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 2);
0122 break;
0123 default:
0124 ret = -ENOTSUPP;
0125 }
0126 return ret;
0127 }
0128
0129 int lbs_start_iface(struct lbs_private *priv)
0130 {
0131 struct cmd_ds_802_11_mac_address cmd;
0132 int ret;
0133
0134 if (priv->power_restore) {
0135 ret = priv->power_restore(priv);
0136 if (ret)
0137 return ret;
0138 }
0139
0140 cmd.hdr.size = cpu_to_le16(sizeof(cmd));
0141 cmd.action = cpu_to_le16(CMD_ACT_SET);
0142 memcpy(cmd.macadd, priv->current_addr, ETH_ALEN);
0143
0144 ret = lbs_cmd_with_response(priv, CMD_802_11_MAC_ADDRESS, &cmd);
0145 if (ret) {
0146 lbs_deb_net("set MAC address failed\n");
0147 goto err;
0148 }
0149
0150 ret = lbs_set_iface_type(priv, priv->wdev->iftype);
0151 if (ret) {
0152 lbs_deb_net("set iface type failed\n");
0153 goto err;
0154 }
0155
0156 ret = lbs_set_11d_domain_info(priv);
0157 if (ret) {
0158 lbs_deb_net("set 11d domain info failed\n");
0159 goto err;
0160 }
0161
0162 lbs_update_channel(priv);
0163
0164 priv->iface_running = true;
0165 return 0;
0166
0167 err:
0168 if (priv->power_save)
0169 priv->power_save(priv);
0170 return ret;
0171 }
0172
0173
0174
0175
0176
0177
0178
0179 static int lbs_dev_open(struct net_device *dev)
0180 {
0181 struct lbs_private *priv = dev->ml_priv;
0182 int ret = 0;
0183
0184 if (!priv->iface_running) {
0185 ret = lbs_start_iface(priv);
0186 if (ret)
0187 goto out;
0188 }
0189
0190 spin_lock_irq(&priv->driver_lock);
0191
0192 netif_carrier_off(dev);
0193
0194 if (!priv->tx_pending_len)
0195 netif_wake_queue(dev);
0196
0197 spin_unlock_irq(&priv->driver_lock);
0198
0199 out:
0200 return ret;
0201 }
0202
0203 static bool lbs_command_queue_empty(struct lbs_private *priv)
0204 {
0205 unsigned long flags;
0206 bool ret;
0207 spin_lock_irqsave(&priv->driver_lock, flags);
0208 ret = priv->cur_cmd == NULL && list_empty(&priv->cmdpendingq);
0209 spin_unlock_irqrestore(&priv->driver_lock, flags);
0210 return ret;
0211 }
0212
0213 int lbs_stop_iface(struct lbs_private *priv)
0214 {
0215 unsigned long flags;
0216 int ret = 0;
0217
0218 spin_lock_irqsave(&priv->driver_lock, flags);
0219 priv->iface_running = false;
0220 kfree_skb(priv->currenttxskb);
0221 priv->currenttxskb = NULL;
0222 priv->tx_pending_len = 0;
0223 spin_unlock_irqrestore(&priv->driver_lock, flags);
0224
0225 cancel_work_sync(&priv->mcast_work);
0226 del_timer_sync(&priv->tx_lockup_timer);
0227
0228
0229 lbs_deb_main("waiting for commands to complete\n");
0230 wait_event(priv->waitq, lbs_command_queue_empty(priv));
0231 lbs_deb_main("all commands completed\n");
0232
0233 if (priv->power_save)
0234 ret = priv->power_save(priv);
0235
0236 return ret;
0237 }
0238
0239
0240
0241
0242
0243
0244
0245 static int lbs_eth_stop(struct net_device *dev)
0246 {
0247 struct lbs_private *priv = dev->ml_priv;
0248
0249 if (priv->connect_status == LBS_CONNECTED)
0250 lbs_disconnect(priv, WLAN_REASON_DEAUTH_LEAVING);
0251
0252 spin_lock_irq(&priv->driver_lock);
0253 netif_stop_queue(dev);
0254 spin_unlock_irq(&priv->driver_lock);
0255
0256 lbs_update_mcast(priv);
0257 cancel_delayed_work_sync(&priv->scan_work);
0258 if (priv->scan_req)
0259 lbs_scan_done(priv);
0260
0261 netif_carrier_off(priv->dev);
0262
0263 if (!lbs_iface_active(priv))
0264 lbs_stop_iface(priv);
0265
0266 return 0;
0267 }
0268
0269 void lbs_host_to_card_done(struct lbs_private *priv)
0270 {
0271 unsigned long flags;
0272
0273 spin_lock_irqsave(&priv->driver_lock, flags);
0274 del_timer(&priv->tx_lockup_timer);
0275
0276 priv->dnld_sent = DNLD_RES_RECEIVED;
0277
0278
0279 if (!priv->cur_cmd || priv->tx_pending_len > 0) {
0280 if (!priv->wakeup_dev_required)
0281 wake_up(&priv->waitq);
0282 }
0283
0284 spin_unlock_irqrestore(&priv->driver_lock, flags);
0285 }
0286 EXPORT_SYMBOL_GPL(lbs_host_to_card_done);
0287
0288 int lbs_set_mac_address(struct net_device *dev, void *addr)
0289 {
0290 int ret = 0;
0291 struct lbs_private *priv = dev->ml_priv;
0292 struct sockaddr *phwaddr = addr;
0293
0294
0295
0296
0297
0298 if (lbs_iface_active(priv))
0299 return -EBUSY;
0300
0301
0302 dev = priv->dev;
0303
0304 memcpy(priv->current_addr, phwaddr->sa_data, ETH_ALEN);
0305 eth_hw_addr_set(dev, phwaddr->sa_data);
0306 if (priv->mesh_dev)
0307 eth_hw_addr_set(priv->mesh_dev, phwaddr->sa_data);
0308
0309 return ret;
0310 }
0311
0312
0313 static inline int mac_in_list(unsigned char *list, int list_len,
0314 unsigned char *mac)
0315 {
0316 while (list_len) {
0317 if (!memcmp(list, mac, ETH_ALEN))
0318 return 1;
0319 list += ETH_ALEN;
0320 list_len--;
0321 }
0322 return 0;
0323 }
0324
0325
0326 static int lbs_add_mcast_addrs(struct cmd_ds_mac_multicast_adr *cmd,
0327 struct net_device *dev, int nr_addrs)
0328 {
0329 int i = nr_addrs;
0330 struct netdev_hw_addr *ha;
0331 int cnt;
0332
0333 if ((dev->flags & (IFF_UP|IFF_MULTICAST)) != (IFF_UP|IFF_MULTICAST))
0334 return nr_addrs;
0335
0336 netif_addr_lock_bh(dev);
0337 cnt = netdev_mc_count(dev);
0338 netdev_for_each_mc_addr(ha, dev) {
0339 if (mac_in_list(cmd->maclist, nr_addrs, ha->addr)) {
0340 lbs_deb_net("mcast address %s:%pM skipped\n", dev->name,
0341 ha->addr);
0342 cnt--;
0343 continue;
0344 }
0345
0346 if (i == MRVDRV_MAX_MULTICAST_LIST_SIZE)
0347 break;
0348 memcpy(&cmd->maclist[6*i], ha->addr, ETH_ALEN);
0349 lbs_deb_net("mcast address %s:%pM added to filter\n", dev->name,
0350 ha->addr);
0351 i++;
0352 cnt--;
0353 }
0354 netif_addr_unlock_bh(dev);
0355 if (cnt)
0356 return -EOVERFLOW;
0357
0358 return i;
0359 }
0360
0361 void lbs_update_mcast(struct lbs_private *priv)
0362 {
0363 struct cmd_ds_mac_multicast_adr mcast_cmd;
0364 int dev_flags = 0;
0365 int nr_addrs;
0366 int old_mac_control = priv->mac_control;
0367
0368 if (netif_running(priv->dev))
0369 dev_flags |= priv->dev->flags;
0370 if (priv->mesh_dev && netif_running(priv->mesh_dev))
0371 dev_flags |= priv->mesh_dev->flags;
0372
0373 if (dev_flags & IFF_PROMISC) {
0374 priv->mac_control |= CMD_ACT_MAC_PROMISCUOUS_ENABLE;
0375 priv->mac_control &= ~(CMD_ACT_MAC_ALL_MULTICAST_ENABLE |
0376 CMD_ACT_MAC_MULTICAST_ENABLE);
0377 goto out_set_mac_control;
0378 } else if (dev_flags & IFF_ALLMULTI) {
0379 do_allmulti:
0380 priv->mac_control |= CMD_ACT_MAC_ALL_MULTICAST_ENABLE;
0381 priv->mac_control &= ~(CMD_ACT_MAC_PROMISCUOUS_ENABLE |
0382 CMD_ACT_MAC_MULTICAST_ENABLE);
0383 goto out_set_mac_control;
0384 }
0385
0386
0387 nr_addrs = lbs_add_mcast_addrs(&mcast_cmd, priv->dev, 0);
0388 if (nr_addrs >= 0 && priv->mesh_dev)
0389 nr_addrs = lbs_add_mcast_addrs(&mcast_cmd, priv->mesh_dev, nr_addrs);
0390 if (nr_addrs < 0)
0391 goto do_allmulti;
0392
0393 if (nr_addrs) {
0394 int size = offsetof(struct cmd_ds_mac_multicast_adr,
0395 maclist[6*nr_addrs]);
0396
0397 mcast_cmd.action = cpu_to_le16(CMD_ACT_SET);
0398 mcast_cmd.hdr.size = cpu_to_le16(size);
0399 mcast_cmd.nr_of_adrs = cpu_to_le16(nr_addrs);
0400
0401 lbs_cmd_async(priv, CMD_MAC_MULTICAST_ADR, &mcast_cmd.hdr, size);
0402
0403 priv->mac_control |= CMD_ACT_MAC_MULTICAST_ENABLE;
0404 } else
0405 priv->mac_control &= ~CMD_ACT_MAC_MULTICAST_ENABLE;
0406
0407 priv->mac_control &= ~(CMD_ACT_MAC_PROMISCUOUS_ENABLE |
0408 CMD_ACT_MAC_ALL_MULTICAST_ENABLE);
0409 out_set_mac_control:
0410 if (priv->mac_control != old_mac_control)
0411 lbs_set_mac_control(priv);
0412 }
0413
0414 static void lbs_set_mcast_worker(struct work_struct *work)
0415 {
0416 struct lbs_private *priv = container_of(work, struct lbs_private, mcast_work);
0417 lbs_update_mcast(priv);
0418 }
0419
0420 void lbs_set_multicast_list(struct net_device *dev)
0421 {
0422 struct lbs_private *priv = dev->ml_priv;
0423
0424 schedule_work(&priv->mcast_work);
0425 }
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435 static int lbs_thread(void *data)
0436 {
0437 struct net_device *dev = data;
0438 struct lbs_private *priv = dev->ml_priv;
0439 wait_queue_entry_t wait;
0440
0441 init_waitqueue_entry(&wait, current);
0442
0443 for (;;) {
0444 int shouldsleep;
0445 u8 resp_idx;
0446
0447 lbs_deb_thread("1: currenttxskb %p, dnld_sent %d\n",
0448 priv->currenttxskb, priv->dnld_sent);
0449
0450 add_wait_queue(&priv->waitq, &wait);
0451 set_current_state(TASK_INTERRUPTIBLE);
0452 spin_lock_irq(&priv->driver_lock);
0453
0454 if (kthread_should_stop())
0455 shouldsleep = 0;
0456 else if (priv->surpriseremoved)
0457 shouldsleep = 1;
0458 else if (priv->psstate == PS_STATE_SLEEP)
0459 shouldsleep = 1;
0460 else if (priv->cmd_timed_out)
0461 shouldsleep = 0;
0462 else if (!priv->fw_ready)
0463 shouldsleep = 1;
0464 else if (priv->dnld_sent)
0465 shouldsleep = 1;
0466 else if (priv->tx_pending_len > 0)
0467 shouldsleep = 0;
0468 else if (priv->resp_len[priv->resp_idx])
0469 shouldsleep = 0;
0470 else if (priv->cur_cmd)
0471 shouldsleep = 1;
0472 else if (!list_empty(&priv->cmdpendingq) &&
0473 !(priv->wakeup_dev_required))
0474 shouldsleep = 0;
0475 else if (kfifo_len(&priv->event_fifo))
0476 shouldsleep = 0;
0477 else
0478 shouldsleep = 1;
0479
0480 if (shouldsleep) {
0481 lbs_deb_thread("sleeping, connect_status %d, "
0482 "psmode %d, psstate %d\n",
0483 priv->connect_status,
0484 priv->psmode, priv->psstate);
0485 spin_unlock_irq(&priv->driver_lock);
0486 schedule();
0487 } else
0488 spin_unlock_irq(&priv->driver_lock);
0489
0490 lbs_deb_thread("2: currenttxskb %p, dnld_send %d\n",
0491 priv->currenttxskb, priv->dnld_sent);
0492
0493 set_current_state(TASK_RUNNING);
0494 remove_wait_queue(&priv->waitq, &wait);
0495
0496 lbs_deb_thread("3: currenttxskb %p, dnld_sent %d\n",
0497 priv->currenttxskb, priv->dnld_sent);
0498
0499 if (kthread_should_stop()) {
0500 lbs_deb_thread("break from main thread\n");
0501 break;
0502 }
0503
0504 if (priv->surpriseremoved) {
0505 lbs_deb_thread("adapter removed; waiting to die...\n");
0506 continue;
0507 }
0508
0509 lbs_deb_thread("4: currenttxskb %p, dnld_sent %d\n",
0510 priv->currenttxskb, priv->dnld_sent);
0511
0512
0513 spin_lock_irq(&priv->driver_lock);
0514 resp_idx = priv->resp_idx;
0515 if (priv->resp_len[resp_idx]) {
0516 spin_unlock_irq(&priv->driver_lock);
0517 lbs_process_command_response(priv,
0518 priv->resp_buf[resp_idx],
0519 priv->resp_len[resp_idx]);
0520 spin_lock_irq(&priv->driver_lock);
0521 priv->resp_len[resp_idx] = 0;
0522 }
0523 spin_unlock_irq(&priv->driver_lock);
0524
0525
0526 spin_lock_irq(&priv->driver_lock);
0527 while (kfifo_len(&priv->event_fifo)) {
0528 u32 event;
0529
0530 if (kfifo_out(&priv->event_fifo,
0531 (unsigned char *) &event, sizeof(event)) !=
0532 sizeof(event))
0533 break;
0534 spin_unlock_irq(&priv->driver_lock);
0535 lbs_process_event(priv, event);
0536 spin_lock_irq(&priv->driver_lock);
0537 }
0538 spin_unlock_irq(&priv->driver_lock);
0539
0540 if (priv->wakeup_dev_required) {
0541 lbs_deb_thread("Waking up device...\n");
0542
0543 if (priv->exit_deep_sleep(priv))
0544 lbs_deb_thread("Wakeup device failed\n");
0545 continue;
0546 }
0547
0548
0549 if (priv->cmd_timed_out && priv->cur_cmd) {
0550 struct cmd_ctrl_node *cmdnode = priv->cur_cmd;
0551
0552 netdev_info(dev, "Timeout submitting command 0x%04x\n",
0553 le16_to_cpu(cmdnode->cmdbuf->command));
0554 lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
0555
0556
0557
0558 if (!dev->dismantle && priv->reset_card)
0559 priv->reset_card(priv);
0560 }
0561 priv->cmd_timed_out = 0;
0562
0563 if (!priv->fw_ready)
0564 continue;
0565
0566
0567 if (priv->psstate == PS_STATE_PRE_SLEEP &&
0568 !priv->dnld_sent && !priv->cur_cmd) {
0569 if (priv->connect_status == LBS_CONNECTED) {
0570 lbs_deb_thread("pre-sleep, currenttxskb %p, "
0571 "dnld_sent %d, cur_cmd %p\n",
0572 priv->currenttxskb, priv->dnld_sent,
0573 priv->cur_cmd);
0574
0575 lbs_ps_confirm_sleep(priv);
0576 } else {
0577
0578
0579
0580
0581
0582 priv->psstate = PS_STATE_AWAKE;
0583 netdev_alert(dev,
0584 "ignore PS_SleepConfirm in non-connected state\n");
0585 }
0586 }
0587
0588
0589
0590
0591 if ((priv->psstate == PS_STATE_SLEEP) ||
0592 (priv->psstate == PS_STATE_PRE_SLEEP))
0593 continue;
0594
0595 if (priv->is_deep_sleep)
0596 continue;
0597
0598
0599 if (!priv->dnld_sent && !priv->cur_cmd)
0600 lbs_execute_next_command(priv);
0601
0602 spin_lock_irq(&priv->driver_lock);
0603 if (!priv->dnld_sent && priv->tx_pending_len > 0) {
0604 int ret = priv->hw_host_to_card(priv, MVMS_DAT,
0605 priv->tx_pending_buf,
0606 priv->tx_pending_len);
0607 if (ret) {
0608 lbs_deb_tx("host_to_card failed %d\n", ret);
0609 priv->dnld_sent = DNLD_RES_RECEIVED;
0610 } else {
0611 mod_timer(&priv->tx_lockup_timer,
0612 jiffies + (HZ * 5));
0613 }
0614 priv->tx_pending_len = 0;
0615 if (!priv->currenttxskb) {
0616
0617
0618 if (priv->connect_status == LBS_CONNECTED)
0619 netif_wake_queue(priv->dev);
0620 if (priv->mesh_dev &&
0621 netif_running(priv->mesh_dev))
0622 netif_wake_queue(priv->mesh_dev);
0623 }
0624 }
0625 spin_unlock_irq(&priv->driver_lock);
0626 }
0627
0628 del_timer(&priv->command_timer);
0629 del_timer(&priv->tx_lockup_timer);
0630 del_timer(&priv->auto_deepsleep_timer);
0631
0632 return 0;
0633 }
0634
0635
0636
0637
0638
0639
0640
0641
0642 static int lbs_setup_firmware(struct lbs_private *priv)
0643 {
0644 int ret = -1;
0645 s16 curlevel = 0, minlevel = 0, maxlevel = 0;
0646
0647
0648 eth_broadcast_addr(priv->current_addr);
0649 ret = lbs_update_hw_spec(priv);
0650 if (ret)
0651 goto done;
0652
0653
0654 ret = lbs_get_tx_power(priv, &curlevel, &minlevel, &maxlevel);
0655 if (ret == 0) {
0656 priv->txpower_cur = curlevel;
0657 priv->txpower_min = minlevel;
0658 priv->txpower_max = maxlevel;
0659 }
0660
0661
0662 ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_11D_ENABLE, 1);
0663 if (ret)
0664 goto done;
0665
0666 ret = lbs_set_mac_control_sync(priv);
0667 done:
0668 return ret;
0669 }
0670
0671 int lbs_suspend(struct lbs_private *priv)
0672 {
0673 int ret;
0674
0675 if (priv->is_deep_sleep) {
0676 ret = lbs_set_deep_sleep(priv, 0);
0677 if (ret) {
0678 netdev_err(priv->dev,
0679 "deep sleep cancellation failed: %d\n", ret);
0680 return ret;
0681 }
0682 priv->deep_sleep_required = 1;
0683 }
0684
0685 ret = lbs_set_host_sleep(priv, 1);
0686
0687 netif_device_detach(priv->dev);
0688 if (priv->mesh_dev)
0689 netif_device_detach(priv->mesh_dev);
0690
0691 return ret;
0692 }
0693 EXPORT_SYMBOL_GPL(lbs_suspend);
0694
0695 int lbs_resume(struct lbs_private *priv)
0696 {
0697 int ret;
0698
0699 ret = lbs_set_host_sleep(priv, 0);
0700
0701 netif_device_attach(priv->dev);
0702 if (priv->mesh_dev)
0703 netif_device_attach(priv->mesh_dev);
0704
0705 if (priv->deep_sleep_required) {
0706 priv->deep_sleep_required = 0;
0707 ret = lbs_set_deep_sleep(priv, 1);
0708 if (ret)
0709 netdev_err(priv->dev,
0710 "deep sleep activation failed: %d\n", ret);
0711 }
0712
0713 if (priv->setup_fw_on_resume)
0714 ret = lbs_setup_firmware(priv);
0715
0716 return ret;
0717 }
0718 EXPORT_SYMBOL_GPL(lbs_resume);
0719
0720
0721
0722
0723
0724
0725
0726 static void lbs_cmd_timeout_handler(struct timer_list *t)
0727 {
0728 struct lbs_private *priv = from_timer(priv, t, command_timer);
0729 unsigned long flags;
0730
0731 spin_lock_irqsave(&priv->driver_lock, flags);
0732
0733 if (!priv->cur_cmd)
0734 goto out;
0735
0736 netdev_info(priv->dev, "command 0x%04x timed out\n",
0737 le16_to_cpu(priv->cur_cmd->cmdbuf->command));
0738
0739 priv->cmd_timed_out = 1;
0740
0741
0742
0743
0744
0745 if (priv->dnld_sent == DNLD_CMD_SENT)
0746 priv->dnld_sent = DNLD_RES_RECEIVED;
0747
0748 wake_up(&priv->waitq);
0749 out:
0750 spin_unlock_irqrestore(&priv->driver_lock, flags);
0751 }
0752
0753
0754
0755
0756
0757
0758
0759
0760 static void lbs_tx_lockup_handler(struct timer_list *t)
0761 {
0762 struct lbs_private *priv = from_timer(priv, t, tx_lockup_timer);
0763 unsigned long flags;
0764
0765 spin_lock_irqsave(&priv->driver_lock, flags);
0766
0767 netdev_info(priv->dev, "TX lockup detected\n");
0768 if (priv->reset_card)
0769 priv->reset_card(priv);
0770
0771 priv->dnld_sent = DNLD_RES_RECEIVED;
0772 wake_up_interruptible(&priv->waitq);
0773
0774 spin_unlock_irqrestore(&priv->driver_lock, flags);
0775 }
0776
0777
0778
0779
0780
0781
0782
0783 static void auto_deepsleep_timer_fn(struct timer_list *t)
0784 {
0785 struct lbs_private *priv = from_timer(priv, t, auto_deepsleep_timer);
0786
0787 if (priv->is_activity_detected) {
0788 priv->is_activity_detected = 0;
0789 } else {
0790 if (priv->is_auto_deep_sleep_enabled &&
0791 (!priv->wakeup_dev_required) &&
0792 (priv->connect_status != LBS_CONNECTED)) {
0793 struct cmd_header cmd;
0794
0795 lbs_deb_main("Entering auto deep sleep mode...\n");
0796 memset(&cmd, 0, sizeof(cmd));
0797 cmd.size = cpu_to_le16(sizeof(cmd));
0798 lbs_cmd_async(priv, CMD_802_11_DEEP_SLEEP, &cmd,
0799 sizeof(cmd));
0800 }
0801 }
0802 mod_timer(&priv->auto_deepsleep_timer , jiffies +
0803 (priv->auto_deep_sleep_timeout * HZ)/1000);
0804 }
0805
0806 int lbs_enter_auto_deep_sleep(struct lbs_private *priv)
0807 {
0808 priv->is_auto_deep_sleep_enabled = 1;
0809 if (priv->is_deep_sleep)
0810 priv->wakeup_dev_required = 1;
0811 mod_timer(&priv->auto_deepsleep_timer ,
0812 jiffies + (priv->auto_deep_sleep_timeout * HZ)/1000);
0813
0814 return 0;
0815 }
0816
0817 int lbs_exit_auto_deep_sleep(struct lbs_private *priv)
0818 {
0819 priv->is_auto_deep_sleep_enabled = 0;
0820 priv->auto_deep_sleep_timeout = 0;
0821 del_timer(&priv->auto_deepsleep_timer);
0822
0823 return 0;
0824 }
0825
0826 static int lbs_init_adapter(struct lbs_private *priv)
0827 {
0828 int ret;
0829
0830 eth_broadcast_addr(priv->current_addr);
0831
0832 priv->connect_status = LBS_DISCONNECTED;
0833 priv->channel = DEFAULT_AD_HOC_CHANNEL;
0834 priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON;
0835 priv->radio_on = 1;
0836 priv->psmode = LBS802_11POWERMODECAM;
0837 priv->psstate = PS_STATE_FULL_POWER;
0838 priv->is_deep_sleep = 0;
0839 priv->is_auto_deep_sleep_enabled = 0;
0840 priv->deep_sleep_required = 0;
0841 priv->wakeup_dev_required = 0;
0842 init_waitqueue_head(&priv->ds_awake_q);
0843 init_waitqueue_head(&priv->scan_q);
0844 priv->authtype_auto = 1;
0845 priv->is_host_sleep_configured = 0;
0846 priv->is_host_sleep_activated = 0;
0847 init_waitqueue_head(&priv->host_sleep_q);
0848 init_waitqueue_head(&priv->fw_waitq);
0849 mutex_init(&priv->lock);
0850
0851 timer_setup(&priv->command_timer, lbs_cmd_timeout_handler, 0);
0852 timer_setup(&priv->tx_lockup_timer, lbs_tx_lockup_handler, 0);
0853 timer_setup(&priv->auto_deepsleep_timer, auto_deepsleep_timer_fn, 0);
0854
0855 INIT_LIST_HEAD(&priv->cmdfreeq);
0856 INIT_LIST_HEAD(&priv->cmdpendingq);
0857
0858 spin_lock_init(&priv->driver_lock);
0859
0860
0861 if (lbs_allocate_cmd_buffer(priv)) {
0862 pr_err("Out of memory allocating command buffers\n");
0863 ret = -ENOMEM;
0864 goto out;
0865 }
0866 priv->resp_idx = 0;
0867 priv->resp_len[0] = priv->resp_len[1] = 0;
0868
0869
0870 ret = kfifo_alloc(&priv->event_fifo, sizeof(u32) * 16, GFP_KERNEL);
0871 if (ret) {
0872 pr_err("Out of memory allocating event FIFO buffer\n");
0873 goto out;
0874 }
0875
0876 out:
0877 return ret;
0878 }
0879
0880 static void lbs_free_adapter(struct lbs_private *priv)
0881 {
0882 lbs_free_cmd_buffer(priv);
0883 kfifo_free(&priv->event_fifo);
0884 del_timer(&priv->command_timer);
0885 del_timer(&priv->tx_lockup_timer);
0886 del_timer(&priv->auto_deepsleep_timer);
0887 }
0888
0889 static const struct net_device_ops lbs_netdev_ops = {
0890 .ndo_open = lbs_dev_open,
0891 .ndo_stop = lbs_eth_stop,
0892 .ndo_start_xmit = lbs_hard_start_xmit,
0893 .ndo_set_mac_address = lbs_set_mac_address,
0894 .ndo_set_rx_mode = lbs_set_multicast_list,
0895 .ndo_validate_addr = eth_validate_addr,
0896 };
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906 struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
0907 {
0908 struct net_device *dev;
0909 struct wireless_dev *wdev;
0910 struct lbs_private *priv = NULL;
0911 int err;
0912
0913
0914 wdev = lbs_cfg_alloc(dmdev);
0915 if (IS_ERR(wdev)) {
0916 err = PTR_ERR(wdev);
0917 pr_err("cfg80211 init failed\n");
0918 goto err_cfg;
0919 }
0920
0921 wdev->iftype = NL80211_IFTYPE_STATION;
0922 priv = wdev_priv(wdev);
0923 priv->wdev = wdev;
0924
0925 err = lbs_init_adapter(priv);
0926 if (err) {
0927 pr_err("failed to initialize adapter structure\n");
0928 goto err_wdev;
0929 }
0930
0931 dev = alloc_netdev(0, "wlan%d", NET_NAME_UNKNOWN, ether_setup);
0932 if (!dev) {
0933 err = -ENOMEM;
0934 dev_err(dmdev, "no memory for network device instance\n");
0935 goto err_adapter;
0936 }
0937
0938 dev->ieee80211_ptr = wdev;
0939 dev->ml_priv = priv;
0940 SET_NETDEV_DEV(dev, dmdev);
0941 wdev->netdev = dev;
0942 priv->dev = dev;
0943
0944 dev->netdev_ops = &lbs_netdev_ops;
0945 dev->watchdog_timeo = 5 * HZ;
0946 dev->ethtool_ops = &lbs_ethtool_ops;
0947 dev->flags |= IFF_BROADCAST | IFF_MULTICAST;
0948
0949 priv->card = card;
0950
0951 strcpy(dev->name, "wlan%d");
0952
0953 lbs_deb_thread("Starting main thread...\n");
0954 init_waitqueue_head(&priv->waitq);
0955 priv->main_thread = kthread_run(lbs_thread, dev, "lbs_main");
0956 if (IS_ERR(priv->main_thread)) {
0957 err = PTR_ERR(priv->main_thread);
0958 lbs_deb_thread("Error creating main thread.\n");
0959 goto err_ndev;
0960 }
0961
0962 priv->work_thread = create_singlethread_workqueue("lbs_worker");
0963 INIT_WORK(&priv->mcast_work, lbs_set_mcast_worker);
0964
0965 priv->wol_criteria = EHS_REMOVE_WAKEUP;
0966 priv->wol_gpio = 0xff;
0967 priv->wol_gap = 20;
0968 priv->ehs_remove_supported = true;
0969
0970 return priv;
0971
0972 err_ndev:
0973 free_netdev(dev);
0974
0975 err_adapter:
0976 lbs_free_adapter(priv);
0977
0978 err_wdev:
0979 lbs_cfg_free(priv);
0980
0981 err_cfg:
0982 return ERR_PTR(err);
0983 }
0984 EXPORT_SYMBOL_GPL(lbs_add_card);
0985
0986
0987 void lbs_remove_card(struct lbs_private *priv)
0988 {
0989 struct net_device *dev = priv->dev;
0990
0991 lbs_remove_mesh(priv);
0992
0993 if (priv->wiphy_registered)
0994 lbs_scan_deinit(priv);
0995
0996 lbs_wait_for_firmware_load(priv);
0997
0998
0999
1000
1001 lbs_deb_main("destroying worker thread\n");
1002 destroy_workqueue(priv->work_thread);
1003 lbs_deb_main("done destroying worker thread\n");
1004
1005 if (priv->psmode == LBS802_11POWERMODEMAX_PSP) {
1006 priv->psmode = LBS802_11POWERMODECAM;
1007
1008
1009
1010
1011 if (priv->psstate != PS_STATE_FULL_POWER)
1012 lbs_set_ps_mode(priv, PS_MODE_ACTION_EXIT_PS, true);
1013 }
1014
1015 if (priv->is_deep_sleep) {
1016 priv->is_deep_sleep = 0;
1017 wake_up_interruptible(&priv->ds_awake_q);
1018 }
1019
1020 priv->is_host_sleep_configured = 0;
1021 priv->is_host_sleep_activated = 0;
1022 wake_up_interruptible(&priv->host_sleep_q);
1023
1024
1025 priv->surpriseremoved = 1;
1026 kthread_stop(priv->main_thread);
1027
1028 lbs_free_adapter(priv);
1029 lbs_cfg_free(priv);
1030 free_netdev(dev);
1031 }
1032 EXPORT_SYMBOL_GPL(lbs_remove_card);
1033
1034
1035 int lbs_rtap_supported(struct lbs_private *priv)
1036 {
1037 if (MRVL_FW_MAJOR_REV(priv->fwrelease) == MRVL_FW_V5)
1038 return 1;
1039
1040
1041 return ((MRVL_FW_MAJOR_REV(priv->fwrelease) >= MRVL_FW_V10) &&
1042 (priv->fwcapinfo & MESH_CAPINFO_ENABLE_MASK));
1043 }
1044
1045
1046 int lbs_start_card(struct lbs_private *priv)
1047 {
1048 struct net_device *dev = priv->dev;
1049 int ret;
1050
1051
1052 ret = lbs_setup_firmware(priv);
1053 if (ret)
1054 goto done;
1055
1056 if (!lbs_disablemesh)
1057 lbs_init_mesh(priv);
1058 else
1059 pr_info("%s: mesh disabled\n", dev->name);
1060
1061 ret = lbs_cfg_register(priv);
1062 if (ret) {
1063 pr_err("cannot register device\n");
1064 goto done;
1065 }
1066
1067 if (lbs_mesh_activated(priv))
1068 lbs_start_mesh(priv);
1069
1070 lbs_debugfs_init_one(priv, dev);
1071
1072 netdev_info(dev, "Marvell WLAN 802.11 adapter\n");
1073
1074 ret = 0;
1075
1076 done:
1077 return ret;
1078 }
1079 EXPORT_SYMBOL_GPL(lbs_start_card);
1080
1081
1082 void lbs_stop_card(struct lbs_private *priv)
1083 {
1084 struct net_device *dev;
1085
1086 if (!priv)
1087 return;
1088 dev = priv->dev;
1089
1090
1091
1092 if (dev->reg_state != NETREG_REGISTERED)
1093 return;
1094
1095 netif_stop_queue(dev);
1096 netif_carrier_off(dev);
1097
1098 lbs_debugfs_remove_one(priv);
1099 lbs_deinit_mesh(priv);
1100 unregister_netdev(dev);
1101 }
1102 EXPORT_SYMBOL_GPL(lbs_stop_card);
1103
1104
1105 void lbs_queue_event(struct lbs_private *priv, u32 event)
1106 {
1107 unsigned long flags;
1108
1109 spin_lock_irqsave(&priv->driver_lock, flags);
1110
1111 if (priv->psstate == PS_STATE_SLEEP)
1112 priv->psstate = PS_STATE_AWAKE;
1113
1114 kfifo_in(&priv->event_fifo, (unsigned char *) &event, sizeof(u32));
1115
1116 wake_up(&priv->waitq);
1117
1118 spin_unlock_irqrestore(&priv->driver_lock, flags);
1119 }
1120 EXPORT_SYMBOL_GPL(lbs_queue_event);
1121
1122 void lbs_notify_command_response(struct lbs_private *priv, u8 resp_idx)
1123 {
1124 if (priv->psstate == PS_STATE_SLEEP)
1125 priv->psstate = PS_STATE_AWAKE;
1126
1127
1128 BUG_ON(resp_idx > 1);
1129 priv->resp_idx = resp_idx;
1130
1131 wake_up(&priv->waitq);
1132 }
1133 EXPORT_SYMBOL_GPL(lbs_notify_command_response);
1134
1135 static int __init lbs_init_module(void)
1136 {
1137 memset(&confirm_sleep, 0, sizeof(confirm_sleep));
1138 confirm_sleep.hdr.command = cpu_to_le16(CMD_802_11_PS_MODE);
1139 confirm_sleep.hdr.size = cpu_to_le16(sizeof(confirm_sleep));
1140 confirm_sleep.action = cpu_to_le16(PS_MODE_ACTION_SLEEP_CONFIRMED);
1141 lbs_debugfs_init();
1142
1143 return 0;
1144 }
1145
1146 static void __exit lbs_exit_module(void)
1147 {
1148 lbs_debugfs_remove();
1149 }
1150
1151 module_init(lbs_init_module);
1152 module_exit(lbs_exit_module);
1153
1154 MODULE_DESCRIPTION("Libertas WLAN Driver Library");
1155 MODULE_AUTHOR("Marvell International Ltd.");
1156 MODULE_LICENSE("GPL");