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  * Copyright (C) 2008, cozybit Inc.
3  * Copyright (C) 2003-2006, Marvell International Ltd.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or (at
8  * your option) any later version.
9  */
10 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11 
12 #include <linux/hardirq.h>
13 #include <linux/slab.h>
14 
15 #include <linux/etherdevice.h>
16 #include <linux/module.h>
17 #include "libertas_tf.h"
18 
19 #define DRIVER_RELEASE_VERSION "004.p0"
20 /* thinfirm version: 5.132.X.pX */
21 #define LBTF_FW_VER_MIN 0x05840300
22 #define LBTF_FW_VER_MAX 0x0584ffff
23 #define QOS_CONTROL_LEN 2
24 
25 /* Module parameters */
26 unsigned int lbtf_debug;
28 module_param_named(libertas_tf_debug, lbtf_debug, int, 0644);
29 
30 static const char lbtf_driver_version[] = "THINFIRM-USB8388-" DRIVER_RELEASE_VERSION
31 #ifdef DEBUG
32  "-dbg"
33 #endif
34  "";
35 
37 
38 static const struct ieee80211_channel lbtf_channels[] = {
39  { .center_freq = 2412, .hw_value = 1 },
40  { .center_freq = 2417, .hw_value = 2 },
41  { .center_freq = 2422, .hw_value = 3 },
42  { .center_freq = 2427, .hw_value = 4 },
43  { .center_freq = 2432, .hw_value = 5 },
44  { .center_freq = 2437, .hw_value = 6 },
45  { .center_freq = 2442, .hw_value = 7 },
46  { .center_freq = 2447, .hw_value = 8 },
47  { .center_freq = 2452, .hw_value = 9 },
48  { .center_freq = 2457, .hw_value = 10 },
49  { .center_freq = 2462, .hw_value = 11 },
50  { .center_freq = 2467, .hw_value = 12 },
51  { .center_freq = 2472, .hw_value = 13 },
52  { .center_freq = 2484, .hw_value = 14 },
53 };
54 
55 /* This table contains the hardware specific values for the modulation rates. */
56 static const struct ieee80211_rate lbtf_rates[] = {
57  { .bitrate = 10,
58  .hw_value = 0, },
59  { .bitrate = 20,
60  .hw_value = 1,
62  { .bitrate = 55,
63  .hw_value = 2,
65  { .bitrate = 110,
66  .hw_value = 3,
68  { .bitrate = 60,
69  .hw_value = 5,
70  .flags = 0 },
71  { .bitrate = 90,
72  .hw_value = 6,
73  .flags = 0 },
74  { .bitrate = 120,
75  .hw_value = 7,
76  .flags = 0 },
77  { .bitrate = 180,
78  .hw_value = 8,
79  .flags = 0 },
80  { .bitrate = 240,
81  .hw_value = 9,
82  .flags = 0 },
83  { .bitrate = 360,
84  .hw_value = 10,
85  .flags = 0 },
86  { .bitrate = 480,
87  .hw_value = 11,
88  .flags = 0 },
89  { .bitrate = 540,
90  .hw_value = 12,
91  .flags = 0 },
92 };
93 
94 static void lbtf_cmd_work(struct work_struct *work)
95 {
96  struct lbtf_private *priv = container_of(work, struct lbtf_private,
97  cmd_work);
98 
100 
101  spin_lock_irq(&priv->driver_lock);
102  /* command response? */
103  if (priv->cmd_response_rxed) {
104  priv->cmd_response_rxed = 0;
105  spin_unlock_irq(&priv->driver_lock);
107  spin_lock_irq(&priv->driver_lock);
108  }
109 
110  if (priv->cmd_timed_out && priv->cur_cmd) {
111  struct cmd_ctrl_node *cmdnode = priv->cur_cmd;
112 
113  if (++priv->nr_retries > 10) {
114  lbtf_complete_command(priv, cmdnode,
115  -ETIMEDOUT);
116  priv->nr_retries = 0;
117  } else {
118  priv->cur_cmd = NULL;
119 
120  /* Stick it back at the _top_ of the pending
121  * queue for immediate resubmission */
122  list_add(&cmdnode->list, &priv->cmdpendingq);
123  }
124  }
125  priv->cmd_timed_out = 0;
126  spin_unlock_irq(&priv->driver_lock);
127 
128  if (!priv->fw_ready) {
129  lbtf_deb_leave_args(LBTF_DEB_CMD, "fw not ready");
130  return;
131  }
132 
133  /* Execute the next command */
134  if (!priv->cur_cmd)
136 
138 }
139 
147 static int lbtf_setup_firmware(struct lbtf_private *priv)
148 {
149  int ret = -1;
150 
152  /*
153  * Read priv address from HW
154  */
155  memset(priv->current_addr, 0xff, ETH_ALEN);
156  ret = lbtf_update_hw_spec(priv);
157  if (ret) {
158  ret = -1;
159  goto done;
160  }
161 
162  lbtf_set_mac_control(priv);
164 
165  ret = 0;
166 done:
167  lbtf_deb_leave_args(LBTF_DEB_FW, "ret: %d", ret);
168  return ret;
169 }
170 
175 static void command_timer_fn(unsigned long data)
176 {
177  struct lbtf_private *priv = (struct lbtf_private *)data;
178  unsigned long flags;
180 
181  spin_lock_irqsave(&priv->driver_lock, flags);
182 
183  if (!priv->cur_cmd) {
184  printk(KERN_DEBUG "libertastf: command timer expired; "
185  "no pending command\n");
186  goto out;
187  }
188 
189  printk(KERN_DEBUG "libertas: command %x timed out\n",
190  le16_to_cpu(priv->cur_cmd->cmdbuf->command));
191 
192  priv->cmd_timed_out = 1;
193  queue_work(lbtf_wq, &priv->cmd_work);
194 out:
195  spin_unlock_irqrestore(&priv->driver_lock, flags);
197 }
198 
199 static int lbtf_init_adapter(struct lbtf_private *priv)
200 {
202  memset(priv->current_addr, 0xff, ETH_ALEN);
203  mutex_init(&priv->lock);
204 
205  priv->vif = NULL;
206  setup_timer(&priv->command_timer, command_timer_fn,
207  (unsigned long)priv);
208 
209  INIT_LIST_HEAD(&priv->cmdfreeq);
210  INIT_LIST_HEAD(&priv->cmdpendingq);
211 
212  spin_lock_init(&priv->driver_lock);
213 
214  /* Allocate the command buffers */
215  if (lbtf_allocate_cmd_buffer(priv))
216  return -1;
217 
219  return 0;
220 }
221 
222 static void lbtf_free_adapter(struct lbtf_private *priv)
223 {
225  lbtf_free_cmd_buffer(priv);
226  del_timer(&priv->command_timer);
228 }
229 
230 static void lbtf_op_tx(struct ieee80211_hw *hw,
232  struct sk_buff *skb)
233 {
234  struct lbtf_private *priv = hw->priv;
235 
236  priv->skb_to_tx = skb;
237  queue_work(lbtf_wq, &priv->tx_work);
238  /*
239  * queue will be restarted when we receive transmission feedback if
240  * there are no buffered multicast frames to send
241  */
242  ieee80211_stop_queues(priv->hw);
243 }
244 
245 static void lbtf_tx_work(struct work_struct *work)
246 {
247  struct lbtf_private *priv = container_of(work, struct lbtf_private,
248  tx_work);
249  unsigned int len;
250  struct ieee80211_tx_info *info;
251  struct txpd *txpd;
252  struct sk_buff *skb = NULL;
253  int err;
254 
256 
257  if ((priv->vif->type == NL80211_IFTYPE_AP) &&
258  (!skb_queue_empty(&priv->bc_ps_buf)))
259  skb = skb_dequeue(&priv->bc_ps_buf);
260  else if (priv->skb_to_tx) {
261  skb = priv->skb_to_tx;
262  priv->skb_to_tx = NULL;
263  } else {
265  return;
266  }
267 
268  len = skb->len;
269  info = IEEE80211_SKB_CB(skb);
270  txpd = (struct txpd *) skb_push(skb, sizeof(struct txpd));
271 
272  if (priv->surpriseremoved) {
273  dev_kfree_skb_any(skb);
275  return;
276  }
277 
278  memset(txpd, 0, sizeof(struct txpd));
279  /* Activate per-packet rate selection */
281  ieee80211_get_tx_rate(priv->hw, info)->hw_value);
282 
283  /* copy destination address from 802.11 header */
284  memcpy(txpd->tx_dest_addr_high, skb->data + sizeof(struct txpd) + 4,
285  ETH_ALEN);
286  txpd->tx_packet_length = cpu_to_le16(len);
287  txpd->tx_packet_location = cpu_to_le32(sizeof(struct txpd));
288  lbtf_deb_hex(LBTF_DEB_TX, "TX Data", skb->data, min_t(unsigned int, skb->len, 100));
289  BUG_ON(priv->tx_skb);
290  spin_lock_irq(&priv->driver_lock);
291  priv->tx_skb = skb;
292  err = priv->hw_host_to_card(priv, MVMS_DAT, skb->data, skb->len);
293  spin_unlock_irq(&priv->driver_lock);
294  if (err) {
295  dev_kfree_skb_any(skb);
296  priv->tx_skb = NULL;
297  pr_err("TX error: %d", err);
298  }
300 }
301 
302 static int lbtf_op_start(struct ieee80211_hw *hw)
303 {
304  struct lbtf_private *priv = hw->priv;
305  void *card = priv->card;
306  int ret = -1;
307 
309 
310  if (!priv->fw_ready)
311  /* Upload firmware */
312  if (priv->hw_prog_firmware(card))
313  goto err_prog_firmware;
314 
315  /* poke the firmware */
317  priv->radioon = RADIO_ON;
319  ret = lbtf_setup_firmware(priv);
320  if (ret)
321  goto err_prog_firmware;
322 
323  if ((priv->fwrelease < LBTF_FW_VER_MIN) ||
324  (priv->fwrelease > LBTF_FW_VER_MAX)) {
325  ret = -1;
326  goto err_prog_firmware;
327  }
328 
329  printk(KERN_INFO "libertastf: Marvell WLAN 802.11 thinfirm adapter\n");
331  return 0;
332 
333 err_prog_firmware:
334  priv->hw_reset_device(card);
335  lbtf_deb_leave_args(LBTF_DEB_MACOPS, "error programing fw; ret=%d", ret);
336  return ret;
337 }
338 
339 static void lbtf_op_stop(struct ieee80211_hw *hw)
340 {
341  struct lbtf_private *priv = hw->priv;
342  unsigned long flags;
343  struct sk_buff *skb;
344 
345  struct cmd_ctrl_node *cmdnode;
346 
348 
349  /* Flush pending command nodes */
350  spin_lock_irqsave(&priv->driver_lock, flags);
351  list_for_each_entry(cmdnode, &priv->cmdpendingq, list) {
352  cmdnode->result = -ENOENT;
353  cmdnode->cmdwaitqwoken = 1;
354  wake_up_interruptible(&cmdnode->cmdwait_q);
355  }
356 
357  spin_unlock_irqrestore(&priv->driver_lock, flags);
358  cancel_work_sync(&priv->cmd_work);
359  cancel_work_sync(&priv->tx_work);
360  while ((skb = skb_dequeue(&priv->bc_ps_buf)))
361  dev_kfree_skb_any(skb);
362  priv->radioon = RADIO_OFF;
364 
366 }
367 
368 static int lbtf_op_add_interface(struct ieee80211_hw *hw,
369  struct ieee80211_vif *vif)
370 {
371  struct lbtf_private *priv = hw->priv;
373  if (priv->vif != NULL)
374  return -EOPNOTSUPP;
375 
376  priv->vif = vif;
377  switch (vif->type) {
379  case NL80211_IFTYPE_AP:
381  break;
384  break;
385  default:
386  priv->vif = NULL;
387  return -EOPNOTSUPP;
388  }
389  lbtf_set_mac_address(priv, (u8 *) vif->addr);
391  return 0;
392 }
393 
394 static void lbtf_op_remove_interface(struct ieee80211_hw *hw,
395  struct ieee80211_vif *vif)
396 {
397  struct lbtf_private *priv = hw->priv;
399 
400  if (priv->vif->type == NL80211_IFTYPE_AP ||
401  priv->vif->type == NL80211_IFTYPE_MESH_POINT)
402  lbtf_beacon_ctrl(priv, 0, 0);
404  lbtf_set_bssid(priv, 0, NULL);
405  priv->vif = NULL;
407 }
408 
409 static int lbtf_op_config(struct ieee80211_hw *hw, u32 changed)
410 {
411  struct lbtf_private *priv = hw->priv;
412  struct ieee80211_conf *conf = &hw->conf;
414 
415  if (conf->channel->center_freq != priv->cur_freq) {
416  priv->cur_freq = conf->channel->center_freq;
417  lbtf_set_channel(priv, conf->channel->hw_value);
418  }
420  return 0;
421 }
422 
423 static u64 lbtf_op_prepare_multicast(struct ieee80211_hw *hw,
424  struct netdev_hw_addr_list *mc_list)
425 {
426  struct lbtf_private *priv = hw->priv;
427  int i;
428  struct netdev_hw_addr *ha;
429  int mc_count = netdev_hw_addr_list_count(mc_list);
430 
431  if (!mc_count || mc_count > MRVDRV_MAX_MULTICAST_LIST_SIZE)
432  return mc_count;
433 
434  priv->nr_of_multicastmacaddr = mc_count;
435  i = 0;
436  netdev_hw_addr_list_for_each(ha, mc_list)
437  memcpy(&priv->multicastlist[i++], ha->addr, ETH_ALEN);
438 
439  return mc_count;
440 }
441 
442 #define SUPPORTED_FIF_FLAGS (FIF_PROMISC_IN_BSS | FIF_ALLMULTI)
443 static void lbtf_op_configure_filter(struct ieee80211_hw *hw,
444  unsigned int changed_flags,
445  unsigned int *new_flags,
446  u64 multicast)
447 {
448  struct lbtf_private *priv = hw->priv;
449  int old_mac_control = priv->mac_control;
450 
452 
453  changed_flags &= SUPPORTED_FIF_FLAGS;
454  *new_flags &= SUPPORTED_FIF_FLAGS;
455 
456  if (!changed_flags) {
458  return;
459  }
460 
461  if (*new_flags & (FIF_PROMISC_IN_BSS))
463  else
465  if (*new_flags & (FIF_ALLMULTI) ||
466  multicast > MRVDRV_MAX_MULTICAST_LIST_SIZE) {
469  } else if (multicast) {
473  } else {
476  if (priv->nr_of_multicastmacaddr) {
477  priv->nr_of_multicastmacaddr = 0;
479  }
480  }
481 
482 
483  if (priv->mac_control != old_mac_control)
484  lbtf_set_mac_control(priv);
485 
487 }
488 
489 static void lbtf_op_bss_info_changed(struct ieee80211_hw *hw,
490  struct ieee80211_vif *vif,
491  struct ieee80211_bss_conf *bss_conf,
492  u32 changes)
493 {
494  struct lbtf_private *priv = hw->priv;
495  struct sk_buff *beacon;
497 
498  if (changes & (BSS_CHANGED_BEACON | BSS_CHANGED_BEACON_INT)) {
499  switch (priv->vif->type) {
500  case NL80211_IFTYPE_AP:
502  beacon = ieee80211_beacon_get(hw, vif);
503  if (beacon) {
504  lbtf_beacon_set(priv, beacon);
505  kfree_skb(beacon);
506  lbtf_beacon_ctrl(priv, 1,
507  bss_conf->beacon_int);
508  }
509  break;
510  default:
511  break;
512  }
513  }
514 
515  if (changes & BSS_CHANGED_BSSID) {
516  bool activate = !is_zero_ether_addr(bss_conf->bssid);
517  lbtf_set_bssid(priv, activate, bss_conf->bssid);
518  }
519 
520  if (changes & BSS_CHANGED_ERP_PREAMBLE) {
521  if (bss_conf->use_short_preamble)
523  else
526  }
527 
529 }
530 
531 static int lbtf_op_get_survey(struct ieee80211_hw *hw, int idx,
532  struct survey_info *survey)
533 {
534  struct lbtf_private *priv = hw->priv;
535  struct ieee80211_conf *conf = &hw->conf;
536 
537  if (idx != 0)
538  return -ENOENT;
539 
540  survey->channel = conf->channel;
541  survey->filled = SURVEY_INFO_NOISE_DBM;
542  survey->noise = priv->noise;
543 
544  return 0;
545 }
546 
547 static const struct ieee80211_ops lbtf_ops = {
548  .tx = lbtf_op_tx,
549  .start = lbtf_op_start,
550  .stop = lbtf_op_stop,
551  .add_interface = lbtf_op_add_interface,
552  .remove_interface = lbtf_op_remove_interface,
553  .config = lbtf_op_config,
554  .prepare_multicast = lbtf_op_prepare_multicast,
555  .configure_filter = lbtf_op_configure_filter,
556  .bss_info_changed = lbtf_op_bss_info_changed,
557  .get_survey = lbtf_op_get_survey,
558 };
559 
560 int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb)
561 {
562  struct ieee80211_rx_status stats;
563  struct rxpd *prxpd;
564  int need_padding;
565  unsigned int flags;
566  struct ieee80211_hdr *hdr;
567 
569 
570  prxpd = (struct rxpd *) skb->data;
571 
572  memset(&stats, 0, sizeof(stats));
573  if (!(prxpd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK)))
574  stats.flag |= RX_FLAG_FAILED_FCS_CRC;
575  stats.freq = priv->cur_freq;
576  stats.band = IEEE80211_BAND_2GHZ;
577  stats.signal = prxpd->snr;
578  priv->noise = prxpd->nf;
579  /* Marvell rate index has a hole at value 4 */
580  if (prxpd->rx_rate > 4)
581  --prxpd->rx_rate;
582  stats.rate_idx = prxpd->rx_rate;
583  skb_pull(skb, sizeof(struct rxpd));
584 
585  hdr = (struct ieee80211_hdr *)skb->data;
586  flags = le32_to_cpu(*(__le32 *)(skb->data + 4));
587 
588  need_padding = ieee80211_is_data_qos(hdr->frame_control);
589  need_padding ^= ieee80211_has_a4(hdr->frame_control);
590  need_padding ^= ieee80211_is_data_qos(hdr->frame_control) &&
591  (*ieee80211_get_qos_ctl(hdr) &
593 
594  if (need_padding) {
595  memmove(skb->data + 2, skb->data, skb->len);
596  skb_reserve(skb, 2);
597  }
598 
599  memcpy(IEEE80211_SKB_RXCB(skb), &stats, sizeof(stats));
600 
601  lbtf_deb_rx("rx data: skb->len-sizeof(RxPd) = %d-%zd = %zd\n",
602  skb->len, sizeof(struct rxpd), skb->len - sizeof(struct rxpd));
603  lbtf_deb_hex(LBTF_DEB_RX, "RX Data", skb->data,
604  min_t(unsigned int, skb->len, 100));
605 
606  ieee80211_rx_irqsafe(priv->hw, skb);
607 
609  return 0;
610 }
612 
620 struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev)
621 {
622  struct ieee80211_hw *hw;
623  struct lbtf_private *priv = NULL;
624 
626 
627  hw = ieee80211_alloc_hw(sizeof(struct lbtf_private), &lbtf_ops);
628  if (!hw)
629  goto done;
630 
631  priv = hw->priv;
632  if (lbtf_init_adapter(priv))
633  goto err_init_adapter;
634 
635  priv->hw = hw;
636  priv->card = card;
637  priv->tx_skb = NULL;
638 
639  hw->queues = 1;
641  hw->extra_tx_headroom = sizeof(struct txpd);
642  memcpy(priv->channels, lbtf_channels, sizeof(lbtf_channels));
643  memcpy(priv->rates, lbtf_rates, sizeof(lbtf_rates));
644  priv->band.n_bitrates = ARRAY_SIZE(lbtf_rates);
645  priv->band.bitrates = priv->rates;
646  priv->band.n_channels = ARRAY_SIZE(lbtf_channels);
647  priv->band.channels = priv->channels;
648  hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &priv->band;
649  hw->wiphy->interface_modes =
652  skb_queue_head_init(&priv->bc_ps_buf);
653 
654  SET_IEEE80211_DEV(hw, dmdev);
655 
656  INIT_WORK(&priv->cmd_work, lbtf_cmd_work);
657  INIT_WORK(&priv->tx_work, lbtf_tx_work);
658  if (ieee80211_register_hw(hw))
659  goto err_init_adapter;
660 
661  goto done;
662 
663 err_init_adapter:
664  lbtf_free_adapter(priv);
665  ieee80211_free_hw(hw);
666  priv = NULL;
667 
668 done:
669  lbtf_deb_leave_args(LBTF_DEB_MAIN, "priv %p", priv);
670  return priv;
671 }
673 
674 
676 {
677  struct ieee80211_hw *hw = priv->hw;
678 
680 
681  priv->surpriseremoved = 1;
682  del_timer(&priv->command_timer);
683  lbtf_free_adapter(priv);
684  priv->hw = NULL;
686  ieee80211_free_hw(hw);
687 
689  return 0;
690 }
692 
693 void lbtf_send_tx_feedback(struct lbtf_private *priv, u8 retrycnt, u8 fail)
694 {
695  struct ieee80211_tx_info *info = IEEE80211_SKB_CB(priv->tx_skb);
696 
697  ieee80211_tx_info_clear_status(info);
698  /*
699  * Commented out, otherwise we never go beyond 1Mbit/s using mac80211
700  * default pid rc algorithm.
701  *
702  * info->status.retry_count = MRVL_DEFAULT_RETRIES - retrycnt;
703  */
704  if (!(info->flags & IEEE80211_TX_CTL_NO_ACK) && !fail)
705  info->flags |= IEEE80211_TX_STAT_ACK;
706  skb_pull(priv->tx_skb, sizeof(struct txpd));
707  ieee80211_tx_status_irqsafe(priv->hw, priv->tx_skb);
708  priv->tx_skb = NULL;
709  if (!priv->skb_to_tx && skb_queue_empty(&priv->bc_ps_buf))
710  ieee80211_wake_queues(priv->hw);
711  else
712  queue_work(lbtf_wq, &priv->tx_work);
713 }
715 
716 void lbtf_bcn_sent(struct lbtf_private *priv)
717 {
718  struct sk_buff *skb = NULL;
719 
720  if (priv->vif->type != NL80211_IFTYPE_AP)
721  return;
722 
723  if (skb_queue_empty(&priv->bc_ps_buf)) {
724  bool tx_buff_bc = false;
725 
726  while ((skb = ieee80211_get_buffered_bc(priv->hw, priv->vif))) {
727  skb_queue_tail(&priv->bc_ps_buf, skb);
728  tx_buff_bc = true;
729  }
730  if (tx_buff_bc) {
731  ieee80211_stop_queues(priv->hw);
732  queue_work(lbtf_wq, &priv->tx_work);
733  }
734  }
735 
736  skb = ieee80211_beacon_get(priv->hw, priv->vif);
737 
738  if (skb) {
739  lbtf_beacon_set(priv, skb);
740  kfree_skb(skb);
741  }
742 }
744 
745 static int __init lbtf_init_module(void)
746 {
748  lbtf_wq = create_workqueue("libertastf");
749  if (lbtf_wq == NULL) {
750  printk(KERN_ERR "libertastf: couldn't create workqueue\n");
751  return -ENOMEM;
752  }
754  return 0;
755 }
756 
757 static void __exit lbtf_exit_module(void)
758 {
760  destroy_workqueue(lbtf_wq);
762 }
763 
764 module_init(lbtf_init_module);
765 module_exit(lbtf_exit_module);
766 
767 MODULE_DESCRIPTION("Libertas WLAN Thinfirm Driver Library");
768 MODULE_AUTHOR("Cozybit Inc.");
769 MODULE_LICENSE("GPL");