Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cfg80211.c
Go to the documentation of this file.
1 /*
2  * Marvell Wireless LAN device driver: CFG80211
3  *
4  * Copyright (C) 2011, Marvell International Ltd.
5  *
6  * This software file (the "File") is distributed by Marvell International
7  * Ltd. under the terms of the GNU General Public License Version 2, June 1991
8  * (the "License"). You may use, redistribute and/or modify this File in
9  * accordance with the terms and conditions of the License, a copy of which
10  * is available by writing to the Free Software Foundation, Inc.,
11  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
12  * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
13  *
14  * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
16  * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
17  * this warranty disclaimer.
18  */
19 
20 #include "cfg80211.h"
21 #include "main.h"
22 
23 static const struct ieee80211_iface_limit mwifiex_ap_sta_limits[] = {
24  {
25  .max = 2, .types = BIT(NL80211_IFTYPE_STATION),
26  },
27  {
28  .max = 1, .types = BIT(NL80211_IFTYPE_AP),
29  },
30 };
31 
32 static const struct ieee80211_iface_combination mwifiex_iface_comb_ap_sta = {
33  .limits = mwifiex_ap_sta_limits,
34  .num_different_channels = 1,
35  .n_limits = ARRAY_SIZE(mwifiex_ap_sta_limits),
36  .max_interfaces = MWIFIEX_MAX_BSS_NUM,
37  .beacon_int_infra_match = true,
38 };
39 
40 static const struct ieee80211_regdomain mwifiex_world_regdom_custom = {
41  .n_reg_rules = 7,
42  .alpha2 = "99",
43  .reg_rules = {
44  /* Channel 1 - 11 */
45  REG_RULE(2412-10, 2462+10, 40, 3, 20, 0),
46  /* Channel 12 - 13 */
47  REG_RULE(2467-10, 2472+10, 20, 3, 20,
49  /* Channel 14 */
50  REG_RULE(2484-10, 2484+10, 20, 3, 20,
53  /* Channel 36 - 48 */
54  REG_RULE(5180-10, 5240+10, 40, 3, 20,
56  /* Channel 149 - 165 */
57  REG_RULE(5745-10, 5825+10, 40, 3, 20,
59  /* Channel 52 - 64 */
60  REG_RULE(5260-10, 5320+10, 40, 3, 30,
63  /* Channel 100 - 140 */
64  REG_RULE(5500-10, 5700+10, 40, 3, 30,
67  }
68 };
69 
70 /*
71  * This function maps the nl802.11 channel type into driver channel type.
72  *
73  * The mapping is as follows -
74  * NL80211_CHAN_NO_HT -> IEEE80211_HT_PARAM_CHA_SEC_NONE
75  * NL80211_CHAN_HT20 -> IEEE80211_HT_PARAM_CHA_SEC_NONE
76  * NL80211_CHAN_HT40PLUS -> IEEE80211_HT_PARAM_CHA_SEC_ABOVE
77  * NL80211_CHAN_HT40MINUS -> IEEE80211_HT_PARAM_CHA_SEC_BELOW
78  * Others -> IEEE80211_HT_PARAM_CHA_SEC_NONE
79  */
81 {
82  switch (chan_type) {
83  case NL80211_CHAN_NO_HT:
84  case NL80211_CHAN_HT20:
90  default:
92  }
93 }
94 
95 /*
96  * This function checks whether WEP is set.
97  */
98 static int
99 mwifiex_is_alg_wep(u32 cipher)
100 {
101  switch (cipher) {
104  return 1;
105  default:
106  break;
107  }
108 
109  return 0;
110 }
111 
112 /*
113  * This function retrieves the private structure from kernel wiphy structure.
114  */
115 static void *mwifiex_cfg80211_get_adapter(struct wiphy *wiphy)
116 {
117  return (void *) (*(unsigned long *) wiphy_priv(wiphy));
118 }
119 
120 /*
121  * CFG802.11 operation handler to delete a network key.
122  */
123 static int
124 mwifiex_cfg80211_del_key(struct wiphy *wiphy, struct net_device *netdev,
125  u8 key_index, bool pairwise, const u8 *mac_addr)
126 {
127  struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
128  const u8 bc_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
129  const u8 *peer_mac = pairwise ? mac_addr : bc_mac;
130 
131  if (mwifiex_set_encode(priv, NULL, NULL, 0, key_index, peer_mac, 1)) {
132  wiphy_err(wiphy, "deleting the crypto keys\n");
133  return -EFAULT;
134  }
135 
136  wiphy_dbg(wiphy, "info: crypto keys deleted\n");
137  return 0;
138 }
139 
140 /*
141  * This function forms an skb for management frame.
142  */
143 static int
144 mwifiex_form_mgmt_frame(struct sk_buff *skb, const u8 *buf, size_t len)
145 {
146  u8 addr[ETH_ALEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
147  u16 pkt_len;
148  u32 tx_control = 0, pkt_type = PKT_TYPE_MGMT;
149  struct timeval tv;
150 
151  pkt_len = len + ETH_ALEN;
152 
153  skb_reserve(skb, MWIFIEX_MIN_DATA_HEADER_LEN +
154  MWIFIEX_MGMT_FRAME_HEADER_SIZE + sizeof(pkt_len));
155  memcpy(skb_push(skb, sizeof(pkt_len)), &pkt_len, sizeof(pkt_len));
156 
157  memcpy(skb_push(skb, sizeof(tx_control)),
158  &tx_control, sizeof(tx_control));
159 
160  memcpy(skb_push(skb, sizeof(pkt_type)), &pkt_type, sizeof(pkt_type));
161 
162  /* Add packet data and address4 */
163  memcpy(skb_put(skb, sizeof(struct ieee80211_hdr_3addr)), buf,
164  sizeof(struct ieee80211_hdr_3addr));
165  memcpy(skb_put(skb, ETH_ALEN), addr, ETH_ALEN);
166  memcpy(skb_put(skb, len - sizeof(struct ieee80211_hdr_3addr)),
167  buf + sizeof(struct ieee80211_hdr_3addr),
168  len - sizeof(struct ieee80211_hdr_3addr));
169 
170  skb->priority = LOW_PRIO_TID;
171  do_gettimeofday(&tv);
172  skb->tstamp = timeval_to_ktime(tv);
173 
174  return 0;
175 }
176 
177 /*
178  * CFG802.11 operation handler to transmit a management frame.
179  */
180 static int
181 mwifiex_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
182  struct ieee80211_channel *chan, bool offchan,
184  bool channel_type_valid, unsigned int wait,
185  const u8 *buf, size_t len, bool no_cck,
186  bool dont_wait_for_ack, u64 *cookie)
187 {
188  struct sk_buff *skb;
189  u16 pkt_len;
190  const struct ieee80211_mgmt *mgmt;
191  struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
192 
193  if (!buf || !len) {
194  wiphy_err(wiphy, "invalid buffer and length\n");
195  return -EFAULT;
196  }
197 
198  mgmt = (const struct ieee80211_mgmt *)buf;
199  if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA &&
200  ieee80211_is_probe_resp(mgmt->frame_control)) {
201  /* Since we support offload probe resp, we need to skip probe
202  * resp in AP or GO mode */
203  wiphy_dbg(wiphy,
204  "info: skip to send probe resp in AP or GO mode\n");
205  return 0;
206  }
207 
208  pkt_len = len + ETH_ALEN;
209  skb = dev_alloc_skb(MWIFIEX_MIN_DATA_HEADER_LEN +
211  pkt_len + sizeof(pkt_len));
212 
213  if (!skb) {
214  wiphy_err(wiphy, "allocate skb failed for management frame\n");
215  return -ENOMEM;
216  }
217 
218  mwifiex_form_mgmt_frame(skb, buf, len);
219  mwifiex_queue_tx_pkt(priv, skb);
220 
221  *cookie = random32() | 1;
222  cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, true, GFP_ATOMIC);
223 
224  wiphy_dbg(wiphy, "info: management frame transmitted\n");
225  return 0;
226 }
227 
228 /*
229  * CFG802.11 operation handler to register a mgmt frame.
230  */
231 static void
232 mwifiex_cfg80211_mgmt_frame_register(struct wiphy *wiphy,
233  struct wireless_dev *wdev,
234  u16 frame_type, bool reg)
235 {
236  struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
237 
238  if (reg)
239  priv->mgmt_frame_mask |= BIT(frame_type >> 4);
240  else
241  priv->mgmt_frame_mask &= ~BIT(frame_type >> 4);
242 
245 
246  wiphy_dbg(wiphy, "info: mgmt frame registered\n");
247 }
248 
249 /*
250  * CFG802.11 operation handler to remain on channel.
251  */
252 static int
253 mwifiex_cfg80211_remain_on_channel(struct wiphy *wiphy,
254  struct wireless_dev *wdev,
255  struct ieee80211_channel *chan,
256  enum nl80211_channel_type channel_type,
257  unsigned int duration, u64 *cookie)
258 {
259  struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
260  int ret;
261 
262  if (!chan || !cookie) {
263  wiphy_err(wiphy, "Invalid parameter for ROC\n");
264  return -EINVAL;
265  }
266 
267  if (priv->roc_cfg.cookie) {
268  wiphy_dbg(wiphy, "info: ongoing ROC, cookie = 0x%llu\n",
269  priv->roc_cfg.cookie);
270  return -EBUSY;
271  }
272 
274  &channel_type, duration);
275 
276  if (!ret) {
277  *cookie = random32() | 1;
278  priv->roc_cfg.cookie = *cookie;
279  priv->roc_cfg.chan = *chan;
280  priv->roc_cfg.chan_type = channel_type;
281 
282  cfg80211_ready_on_channel(wdev, *cookie, chan, channel_type,
283  duration, GFP_ATOMIC);
284 
285  wiphy_dbg(wiphy, "info: ROC, cookie = 0x%llx\n", *cookie);
286  }
287 
288  return ret;
289 }
290 
291 /*
292  * CFG802.11 operation handler to cancel remain on channel.
293  */
294 static int
295 mwifiex_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
296  struct wireless_dev *wdev, u64 cookie)
297 {
298  struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
299  int ret;
300 
301  if (cookie != priv->roc_cfg.cookie)
302  return -ENOENT;
303 
305  &priv->roc_cfg.chan,
306  &priv->roc_cfg.chan_type, 0);
307 
308  if (!ret) {
310  &priv->roc_cfg.chan,
311  priv->roc_cfg.chan_type,
312  GFP_ATOMIC);
313 
314  memset(&priv->roc_cfg, 0, sizeof(struct mwifiex_roc_cfg));
315 
316  wiphy_dbg(wiphy, "info: cancel ROC, cookie = 0x%llx\n", cookie);
317  }
318 
319  return ret;
320 }
321 
322 /*
323  * CFG802.11 operation handler to set Tx power.
324  */
325 static int
326 mwifiex_cfg80211_set_tx_power(struct wiphy *wiphy,
328  int mbm)
329 {
330  struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
331  struct mwifiex_private *priv;
332  struct mwifiex_power_cfg power_cfg;
333  int dbm = MBM_TO_DBM(mbm);
334 
335  if (type == NL80211_TX_POWER_FIXED) {
336  power_cfg.is_power_auto = 0;
337  power_cfg.power_level = dbm;
338  } else {
339  power_cfg.is_power_auto = 1;
340  }
341 
342  priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
343 
344  return mwifiex_set_tx_power(priv, &power_cfg);
345 }
346 
347 /*
348  * CFG802.11 operation handler to set Power Save option.
349  *
350  * The timeout value, if provided, is currently ignored.
351  */
352 static int
353 mwifiex_cfg80211_set_power_mgmt(struct wiphy *wiphy,
354  struct net_device *dev,
355  bool enabled, int timeout)
356 {
357  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
358  u32 ps_mode;
359 
360  if (timeout)
361  wiphy_dbg(wiphy,
362  "info: ignore timeout value for IEEE Power Save\n");
363 
364  ps_mode = enabled;
365 
366  return mwifiex_drv_set_power(priv, &ps_mode);
367 }
368 
369 /*
370  * CFG802.11 operation handler to set the default network key.
371  */
372 static int
373 mwifiex_cfg80211_set_default_key(struct wiphy *wiphy, struct net_device *netdev,
374  u8 key_index, bool unicast,
375  bool multicast)
376 {
377  struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
378 
379  /* Return if WEP key not configured */
380  if (!priv->sec_info.wep_enabled)
381  return 0;
382 
383  if (priv->bss_type == MWIFIEX_BSS_TYPE_UAP) {
385  } else if (mwifiex_set_encode(priv, NULL, NULL, 0, key_index,
386  NULL, 0)) {
387  wiphy_err(wiphy, "set default Tx key index\n");
388  return -EFAULT;
389  }
390 
391  return 0;
392 }
393 
394 /*
395  * CFG802.11 operation handler to add a network key.
396  */
397 static int
398 mwifiex_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
399  u8 key_index, bool pairwise, const u8 *mac_addr,
400  struct key_params *params)
401 {
402  struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
403  struct mwifiex_wep_key *wep_key;
404  const u8 bc_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
405  const u8 *peer_mac = pairwise ? mac_addr : bc_mac;
406 
407  if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP &&
408  (params->cipher == WLAN_CIPHER_SUITE_WEP40 ||
409  params->cipher == WLAN_CIPHER_SUITE_WEP104)) {
410  if (params->key && params->key_len) {
411  wep_key = &priv->wep_key[key_index];
412  memset(wep_key, 0, sizeof(struct mwifiex_wep_key));
413  memcpy(wep_key->key_material, params->key,
414  params->key_len);
415  wep_key->key_index = key_index;
416  wep_key->key_length = params->key_len;
417  priv->sec_info.wep_enabled = 1;
418  }
419  return 0;
420  }
421 
422  if (mwifiex_set_encode(priv, params, params->key, params->key_len,
423  key_index, peer_mac, 0)) {
424  wiphy_err(wiphy, "crypto keys added\n");
425  return -EFAULT;
426  }
427 
428  return 0;
429 }
430 
431 /*
432  * This function sends domain information to the firmware.
433  *
434  * The following information are passed to the firmware -
435  * - Country codes
436  * - Sub bands (first channel, number of channels, maximum Tx power)
437  */
438 static int mwifiex_send_domain_info_cmd_fw(struct wiphy *wiphy)
439 {
440  u8 no_of_triplet = 0;
442  u8 no_of_parsed_chan = 0;
443  u8 first_chan = 0, next_chan = 0, max_pwr = 0;
444  u8 i, flag = 0;
445  enum ieee80211_band band;
446  struct ieee80211_supported_band *sband;
447  struct ieee80211_channel *ch;
448  struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
449  struct mwifiex_private *priv;
450  struct mwifiex_802_11d_domain_reg *domain_info = &adapter->domain_reg;
451 
452  /* Set country code */
453  domain_info->country_code[0] = adapter->country_code[0];
454  domain_info->country_code[1] = adapter->country_code[1];
455  domain_info->country_code[2] = ' ';
456 
457  band = mwifiex_band_to_radio_type(adapter->config_bands);
458  if (!wiphy->bands[band]) {
459  wiphy_err(wiphy, "11D: setting domain info in FW\n");
460  return -1;
461  }
462 
463  sband = wiphy->bands[band];
464 
465  for (i = 0; i < sband->n_channels ; i++) {
466  ch = &sband->channels[i];
467  if (ch->flags & IEEE80211_CHAN_DISABLED)
468  continue;
469 
470  if (!flag) {
471  flag = 1;
472  first_chan = (u32) ch->hw_value;
473  next_chan = first_chan;
474  max_pwr = ch->max_reg_power;
475  no_of_parsed_chan = 1;
476  continue;
477  }
478 
479  if (ch->hw_value == next_chan + 1 &&
480  ch->max_reg_power == max_pwr) {
481  next_chan++;
482  no_of_parsed_chan++;
483  } else {
484  t = &domain_info->triplet[no_of_triplet];
485  t->chans.first_channel = first_chan;
486  t->chans.num_channels = no_of_parsed_chan;
487  t->chans.max_power = max_pwr;
488  no_of_triplet++;
489  first_chan = (u32) ch->hw_value;
490  next_chan = first_chan;
491  max_pwr = ch->max_reg_power;
492  no_of_parsed_chan = 1;
493  }
494  }
495 
496  if (flag) {
497  t = &domain_info->triplet[no_of_triplet];
498  t->chans.first_channel = first_chan;
499  t->chans.num_channels = no_of_parsed_chan;
500  t->chans.max_power = max_pwr;
501  no_of_triplet++;
502  }
503 
504  domain_info->no_of_triplet = no_of_triplet;
505 
506  priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
507 
509  HostCmd_ACT_GEN_SET, 0, NULL)) {
510  wiphy_err(wiphy, "11D: setting domain info in FW\n");
511  return -1;
512  }
513 
514  return 0;
515 }
516 
517 /*
518  * CFG802.11 regulatory domain callback function.
519  *
520  * This function is called when the regulatory domain is changed due to the
521  * following reasons -
522  * - Set by driver
523  * - Set by system core
524  * - Set by user
525  * - Set bt Country IE
526  */
527 static int mwifiex_reg_notifier(struct wiphy *wiphy,
528  struct regulatory_request *request)
529 {
530  struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
531 
532  wiphy_dbg(wiphy, "info: cfg80211 regulatory domain callback for %c%c\n",
533  request->alpha2[0], request->alpha2[1]);
534 
535  memcpy(adapter->country_code, request->alpha2, sizeof(request->alpha2));
536 
537  switch (request->initiator) {
541  break;
542  /* Todo: apply driver specific changes in channel flags based
543  on the request initiator if necessary. */
545  break;
546  }
547  mwifiex_send_domain_info_cmd_fw(wiphy);
548 
549  return 0;
550 }
551 
552 /*
553  * This function sets the fragmentation threshold.
554  *
555  * The fragmentation threshold value must lie between MWIFIEX_FRAG_MIN_VALUE
556  * and MWIFIEX_FRAG_MAX_VALUE.
557  */
558 static int
559 mwifiex_set_frag(struct mwifiex_private *priv, u32 frag_thr)
560 {
561  if (frag_thr < MWIFIEX_FRAG_MIN_VALUE ||
562  frag_thr > MWIFIEX_FRAG_MAX_VALUE)
563  frag_thr = MWIFIEX_FRAG_MAX_VALUE;
564 
567  &frag_thr);
568 }
569 
570 /*
571  * This function sets the RTS threshold.
572 
573  * The rts value must lie between MWIFIEX_RTS_MIN_VALUE
574  * and MWIFIEX_RTS_MAX_VALUE.
575  */
576 static int
577 mwifiex_set_rts(struct mwifiex_private *priv, u32 rts_thr)
578 {
579  if (rts_thr < MWIFIEX_RTS_MIN_VALUE || rts_thr > MWIFIEX_RTS_MAX_VALUE)
580  rts_thr = MWIFIEX_RTS_MAX_VALUE;
581 
584  &rts_thr);
585 }
586 
587 /*
588  * CFG802.11 operation handler to set wiphy parameters.
589  *
590  * This function can be used to set the RTS threshold and the
591  * Fragmentation threshold of the driver.
592  */
593 static int
594 mwifiex_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
595 {
596  struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
597  struct mwifiex_private *priv;
598  struct mwifiex_uap_bss_param *bss_cfg;
599  int ret, bss_started, i;
600 
601  for (i = 0; i < adapter->priv_num; i++) {
602  priv = adapter->priv[i];
603 
604  switch (priv->bss_role) {
606  bss_cfg = kzalloc(sizeof(struct mwifiex_uap_bss_param),
607  GFP_KERNEL);
608  if (!bss_cfg)
609  return -ENOMEM;
610 
612 
613  if (changed & WIPHY_PARAM_RTS_THRESHOLD)
614  bss_cfg->rts_threshold = wiphy->rts_threshold;
615  if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
616  bss_cfg->frag_threshold = wiphy->frag_threshold;
617  if (changed & WIPHY_PARAM_RETRY_LONG)
618  bss_cfg->retry_limit = wiphy->retry_long;
619 
620  bss_started = priv->bss_started;
621 
622  ret = mwifiex_send_cmd_sync(priv,
625  NULL);
626  if (ret) {
627  wiphy_err(wiphy, "Failed to stop the BSS\n");
628  kfree(bss_cfg);
629  return ret;
630  }
631 
632  ret = mwifiex_send_cmd_async(priv,
635  UAP_BSS_PARAMS_I, bss_cfg);
636 
637  kfree(bss_cfg);
638 
639  if (ret) {
640  wiphy_err(wiphy, "Failed to set bss config\n");
641  return ret;
642  }
643 
644  if (!bss_started)
645  break;
646 
647  ret = mwifiex_send_cmd_async(priv,
650  NULL);
651  if (ret) {
652  wiphy_err(wiphy, "Failed to start BSS\n");
653  return ret;
654  }
655 
656  break;
658  if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
659  ret = mwifiex_set_rts(priv,
660  wiphy->rts_threshold);
661  if (ret)
662  return ret;
663  }
664  if (changed & WIPHY_PARAM_FRAG_THRESHOLD) {
665  ret = mwifiex_set_frag(priv,
666  wiphy->frag_threshold);
667  if (ret)
668  return ret;
669  }
670  break;
671  }
672  }
673 
674  return 0;
675 }
676 
677 static int
678 mwifiex_cfg80211_deinit_p2p(struct mwifiex_private *priv)
679 {
681 
682  if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA)
684 
686  HostCmd_ACT_GEN_SET, 0, &mode))
687  return -1;
688 
689  return 0;
690 }
691 
692 /*
693  * This function initializes the functionalities for P2P client.
694  * The P2P client initialization sequence is:
695  * disable -> device -> client
696  */
697 static int
698 mwifiex_cfg80211_init_p2p_client(struct mwifiex_private *priv)
699 {
700  u16 mode;
701 
702  if (mwifiex_cfg80211_deinit_p2p(priv))
703  return -1;
704 
705  mode = P2P_MODE_DEVICE;
707  HostCmd_ACT_GEN_SET, 0, &mode))
708  return -1;
709 
710  mode = P2P_MODE_CLIENT;
712  HostCmd_ACT_GEN_SET, 0, &mode))
713  return -1;
714 
715  return 0;
716 }
717 
718 /*
719  * This function initializes the functionalities for P2P GO.
720  * The P2P GO initialization sequence is:
721  * disable -> device -> GO
722  */
723 static int
724 mwifiex_cfg80211_init_p2p_go(struct mwifiex_private *priv)
725 {
726  u16 mode;
727 
728  if (mwifiex_cfg80211_deinit_p2p(priv))
729  return -1;
730 
731  mode = P2P_MODE_DEVICE;
733  HostCmd_ACT_GEN_SET, 0, &mode))
734  return -1;
735 
736  mode = P2P_MODE_GO;
738  HostCmd_ACT_GEN_SET, 0, &mode))
739  return -1;
740 
741  if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_UAP)
743 
744  return 0;
745 }
746 
747 /*
748  * CFG802.11 operation handler to change interface type.
749  */
750 static int
751 mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
752  struct net_device *dev,
753  enum nl80211_iftype type, u32 *flags,
754  struct vif_params *params)
755 {
756  int ret;
757  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
758 
759  switch (dev->ieee80211_ptr->iftype) {
761  switch (type) {
763  break;
765  wiphy_warn(wiphy, "%s: kept type as IBSS\n", dev->name);
766  case NL80211_IFTYPE_ADHOC: /* This shouldn't happen */
767  return 0;
768  case NL80211_IFTYPE_AP:
769  default:
770  wiphy_err(wiphy, "%s: changing to %d not supported\n",
771  dev->name, type);
772  return -EOPNOTSUPP;
773  }
774  break;
776  switch (type) {
778  break;
780  if (mwifiex_cfg80211_init_p2p_client(priv))
781  return -EFAULT;
782  dev->ieee80211_ptr->iftype = type;
783  return 0;
785  if (mwifiex_cfg80211_init_p2p_go(priv))
786  return -EFAULT;
787  dev->ieee80211_ptr->iftype = type;
788  return 0;
790  wiphy_warn(wiphy, "%s: kept type as STA\n", dev->name);
791  case NL80211_IFTYPE_STATION: /* This shouldn't happen */
792  return 0;
793  case NL80211_IFTYPE_AP:
794  default:
795  wiphy_err(wiphy, "%s: changing to %d not supported\n",
796  dev->name, type);
797  return -EOPNOTSUPP;
798  }
799  break;
800  case NL80211_IFTYPE_AP:
801  switch (type) {
803  wiphy_warn(wiphy, "%s: kept type as AP\n", dev->name);
804  case NL80211_IFTYPE_AP: /* This shouldn't happen */
805  return 0;
808  default:
809  wiphy_err(wiphy, "%s: changing to %d not supported\n",
810  dev->name, type);
811  return -EOPNOTSUPP;
812  }
813  break;
816  switch (type) {
818  if (mwifiex_cfg80211_deinit_p2p(priv))
819  return -EFAULT;
820  dev->ieee80211_ptr->iftype = type;
821  return 0;
822  default:
823  return -EOPNOTSUPP;
824  }
825  break;
826  default:
827  wiphy_err(wiphy, "%s: unknown iftype: %d\n",
828  dev->name, dev->ieee80211_ptr->iftype);
829  return -EOPNOTSUPP;
830  }
831 
832  dev->ieee80211_ptr->iftype = type;
833  priv->bss_mode = type;
835 
836  priv->sec_info.authentication_mode = NL80211_AUTHTYPE_OPEN_SYSTEM;
837 
840 
841  return ret;
842 }
843 
844 /*
845  * This function dumps the station information on a buffer.
846  *
847  * The following information are shown -
848  * - Total bytes transmitted
849  * - Total bytes received
850  * - Total packets transmitted
851  * - Total packets received
852  * - Signal quality level
853  * - Transmission rate
854  */
855 static int
856 mwifiex_dump_station_info(struct mwifiex_private *priv,
857  struct station_info *sinfo)
858 {
859  u32 rate;
860 
865 
866  /* Get signal information from the firmware */
868  HostCmd_ACT_GEN_GET, 0, NULL)) {
869  dev_err(priv->adapter->dev, "failed to get signal information\n");
870  return -EFAULT;
871  }
872 
873  if (mwifiex_drv_get_data_rate(priv, &rate)) {
874  dev_err(priv->adapter->dev, "getting data rate\n");
875  return -EFAULT;
876  }
877 
878  /* Get DTIM period information from firmware */
881  &priv->dtim_period);
882 
883  /*
884  * Bit 0 in tx_htinfo indicates that current Tx rate is 11n rate. Valid
885  * MCS index values for us are 0 to 15.
886  */
887  if ((priv->tx_htinfo & BIT(0)) && (priv->tx_rate < 16)) {
888  sinfo->txrate.mcs = priv->tx_rate;
889  sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
890  /* 40MHz rate */
891  if (priv->tx_htinfo & BIT(1))
892  sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
893  /* SGI enabled */
894  if (priv->tx_htinfo & BIT(2))
895  sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
896  }
897 
898  sinfo->signal_avg = priv->bcn_rssi_avg;
899  sinfo->rx_bytes = priv->stats.rx_bytes;
900  sinfo->tx_bytes = priv->stats.tx_bytes;
901  sinfo->rx_packets = priv->stats.rx_packets;
902  sinfo->tx_packets = priv->stats.tx_packets;
903  sinfo->signal = priv->bcn_rssi_avg;
904  /* bit rate is in 500 kb/s units. Convert it to 100kb/s units */
905  sinfo->txrate.legacy = rate * 5;
906 
907  if (priv->bss_mode == NL80211_IFTYPE_STATION) {
908  sinfo->filled |= STATION_INFO_BSS_PARAM;
909  sinfo->bss_param.flags = 0;
910  if (priv->curr_bss_params.bss_descriptor.cap_info_bitmap &
912  sinfo->bss_param.flags |=
914  if (priv->curr_bss_params.bss_descriptor.cap_info_bitmap &
916  sinfo->bss_param.flags |=
918  sinfo->bss_param.dtim_period = priv->dtim_period;
919  sinfo->bss_param.beacon_interval =
920  priv->curr_bss_params.bss_descriptor.beacon_period;
921  }
922 
923  return 0;
924 }
925 
926 /*
927  * CFG802.11 operation handler to get station information.
928  *
929  * This function only works in connected mode, and dumps the
930  * requested station information, if available.
931  */
932 static int
933 mwifiex_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
934  u8 *mac, struct station_info *sinfo)
935 {
936  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
937 
938  if (!priv->media_connected)
939  return -ENOENT;
940  if (memcmp(mac, priv->cfg_bssid, ETH_ALEN))
941  return -ENOENT;
942 
943  return mwifiex_dump_station_info(priv, sinfo);
944 }
945 
946 /*
947  * CFG802.11 operation handler to dump station information.
948  */
949 static int
950 mwifiex_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
951  int idx, u8 *mac, struct station_info *sinfo)
952 {
953  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
954 
955  if (!priv->media_connected || idx)
956  return -ENOENT;
957 
958  memcpy(mac, priv->cfg_bssid, ETH_ALEN);
959 
960  return mwifiex_dump_station_info(priv, sinfo);
961 }
962 
963 /* Supported rates to be advertised to the cfg80211 */
964 static struct ieee80211_rate mwifiex_rates[] = {
965  {.bitrate = 10, .hw_value = 2, },
966  {.bitrate = 20, .hw_value = 4, },
967  {.bitrate = 55, .hw_value = 11, },
968  {.bitrate = 110, .hw_value = 22, },
969  {.bitrate = 60, .hw_value = 12, },
970  {.bitrate = 90, .hw_value = 18, },
971  {.bitrate = 120, .hw_value = 24, },
972  {.bitrate = 180, .hw_value = 36, },
973  {.bitrate = 240, .hw_value = 48, },
974  {.bitrate = 360, .hw_value = 72, },
975  {.bitrate = 480, .hw_value = 96, },
976  {.bitrate = 540, .hw_value = 108, },
977 };
978 
979 /* Channel definitions to be advertised to cfg80211 */
980 static struct ieee80211_channel mwifiex_channels_2ghz[] = {
981  {.center_freq = 2412, .hw_value = 1, },
982  {.center_freq = 2417, .hw_value = 2, },
983  {.center_freq = 2422, .hw_value = 3, },
984  {.center_freq = 2427, .hw_value = 4, },
985  {.center_freq = 2432, .hw_value = 5, },
986  {.center_freq = 2437, .hw_value = 6, },
987  {.center_freq = 2442, .hw_value = 7, },
988  {.center_freq = 2447, .hw_value = 8, },
989  {.center_freq = 2452, .hw_value = 9, },
990  {.center_freq = 2457, .hw_value = 10, },
991  {.center_freq = 2462, .hw_value = 11, },
992  {.center_freq = 2467, .hw_value = 12, },
993  {.center_freq = 2472, .hw_value = 13, },
994  {.center_freq = 2484, .hw_value = 14, },
995 };
996 
997 static struct ieee80211_supported_band mwifiex_band_2ghz = {
998  .channels = mwifiex_channels_2ghz,
999  .n_channels = ARRAY_SIZE(mwifiex_channels_2ghz),
1000  .bitrates = mwifiex_rates,
1001  .n_bitrates = ARRAY_SIZE(mwifiex_rates),
1002 };
1003 
1004 static struct ieee80211_channel mwifiex_channels_5ghz[] = {
1005  {.center_freq = 5040, .hw_value = 8, },
1006  {.center_freq = 5060, .hw_value = 12, },
1007  {.center_freq = 5080, .hw_value = 16, },
1008  {.center_freq = 5170, .hw_value = 34, },
1009  {.center_freq = 5190, .hw_value = 38, },
1010  {.center_freq = 5210, .hw_value = 42, },
1011  {.center_freq = 5230, .hw_value = 46, },
1012  {.center_freq = 5180, .hw_value = 36, },
1013  {.center_freq = 5200, .hw_value = 40, },
1014  {.center_freq = 5220, .hw_value = 44, },
1015  {.center_freq = 5240, .hw_value = 48, },
1016  {.center_freq = 5260, .hw_value = 52, },
1017  {.center_freq = 5280, .hw_value = 56, },
1018  {.center_freq = 5300, .hw_value = 60, },
1019  {.center_freq = 5320, .hw_value = 64, },
1020  {.center_freq = 5500, .hw_value = 100, },
1021  {.center_freq = 5520, .hw_value = 104, },
1022  {.center_freq = 5540, .hw_value = 108, },
1023  {.center_freq = 5560, .hw_value = 112, },
1024  {.center_freq = 5580, .hw_value = 116, },
1025  {.center_freq = 5600, .hw_value = 120, },
1026  {.center_freq = 5620, .hw_value = 124, },
1027  {.center_freq = 5640, .hw_value = 128, },
1028  {.center_freq = 5660, .hw_value = 132, },
1029  {.center_freq = 5680, .hw_value = 136, },
1030  {.center_freq = 5700, .hw_value = 140, },
1031  {.center_freq = 5745, .hw_value = 149, },
1032  {.center_freq = 5765, .hw_value = 153, },
1033  {.center_freq = 5785, .hw_value = 157, },
1034  {.center_freq = 5805, .hw_value = 161, },
1035  {.center_freq = 5825, .hw_value = 165, },
1036 };
1037 
1038 static struct ieee80211_supported_band mwifiex_band_5ghz = {
1039  .channels = mwifiex_channels_5ghz,
1040  .n_channels = ARRAY_SIZE(mwifiex_channels_5ghz),
1041  .bitrates = mwifiex_rates + 4,
1042  .n_bitrates = ARRAY_SIZE(mwifiex_rates) - 4,
1043 };
1044 
1045 
1046 /* Supported crypto cipher suits to be advertised to cfg80211 */
1047 static const u32 mwifiex_cipher_suites[] = {
1053 };
1054 
1055 /* Supported mgmt frame types to be advertised to cfg80211 */
1056 static const struct ieee80211_txrx_stypes
1057 mwifiex_mgmt_stypes[NUM_NL80211_IFTYPES] = {
1059  .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1061  .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1063  },
1064  [NL80211_IFTYPE_AP] = {
1065  .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1067  .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1069  },
1071  .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1073  .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1075  },
1076  [NL80211_IFTYPE_P2P_GO] = {
1077  .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1079  .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1081  },
1082 };
1083 
1084 /*
1085  * CFG802.11 operation handler for setting bit rates.
1086  *
1087  * Function configures data rates to firmware using bitrate mask
1088  * provided by cfg80211.
1089  */
1090 static int mwifiex_cfg80211_set_bitrate_mask(struct wiphy *wiphy,
1091  struct net_device *dev,
1092  const u8 *peer,
1093  const struct cfg80211_bitrate_mask *mask)
1094 {
1095  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1097  enum ieee80211_band band;
1098 
1099  if (!priv->media_connected) {
1100  dev_err(priv->adapter->dev,
1101  "Can not set Tx data rate in disconnected state\n");
1102  return -EINVAL;
1103  }
1104 
1105  band = mwifiex_band_to_radio_type(priv->curr_bss_params.band);
1106 
1107  memset(bitmap_rates, 0, sizeof(bitmap_rates));
1108 
1109  /* Fill HR/DSSS rates. */
1110  if (band == IEEE80211_BAND_2GHZ)
1111  bitmap_rates[0] = mask->control[band].legacy & 0x000f;
1112 
1113  /* Fill OFDM rates */
1114  if (band == IEEE80211_BAND_2GHZ)
1115  bitmap_rates[1] = (mask->control[band].legacy & 0x0ff0) >> 4;
1116  else
1117  bitmap_rates[1] = mask->control[band].legacy;
1118 
1119  /* Fill MCS rates */
1120  bitmap_rates[2] = mask->control[band].mcs[0];
1121  if (priv->adapter->hw_dev_mcs_support == HT_STREAM_2X2)
1122  bitmap_rates[2] |= mask->control[band].mcs[1] << 8;
1123 
1125  HostCmd_ACT_GEN_SET, 0, bitmap_rates);
1126 }
1127 
1128 /*
1129  * CFG802.11 operation handler for connection quality monitoring.
1130  *
1131  * This function subscribes/unsubscribes HIGH_RSSI and LOW_RSSI
1132  * events to FW.
1133  */
1134 static int mwifiex_cfg80211_set_cqm_rssi_config(struct wiphy *wiphy,
1135  struct net_device *dev,
1136  s32 rssi_thold, u32 rssi_hyst)
1137 {
1138  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1139  struct mwifiex_ds_misc_subsc_evt subsc_evt;
1140 
1141  priv->cqm_rssi_thold = rssi_thold;
1142  priv->cqm_rssi_hyst = rssi_hyst;
1143 
1144  memset(&subsc_evt, 0x00, sizeof(struct mwifiex_ds_misc_subsc_evt));
1145  subsc_evt.events = BITMASK_BCN_RSSI_LOW | BITMASK_BCN_RSSI_HIGH;
1146 
1147  /* Subscribe/unsubscribe low and high rssi events */
1148  if (rssi_thold && rssi_hyst) {
1149  subsc_evt.action = HostCmd_ACT_BITWISE_SET;
1150  subsc_evt.bcn_l_rssi_cfg.abs_value = abs(rssi_thold);
1151  subsc_evt.bcn_h_rssi_cfg.abs_value = abs(rssi_thold);
1152  subsc_evt.bcn_l_rssi_cfg.evt_freq = 1;
1153  subsc_evt.bcn_h_rssi_cfg.evt_freq = 1;
1154  return mwifiex_send_cmd_sync(priv,
1156  0, 0, &subsc_evt);
1157  } else {
1158  subsc_evt.action = HostCmd_ACT_BITWISE_CLR;
1159  return mwifiex_send_cmd_sync(priv,
1161  0, 0, &subsc_evt);
1162  }
1163 
1164  return 0;
1165 }
1166 
1167 /* cfg80211 operation handler for change_beacon.
1168  * Function retrieves and sets modified management IEs to FW.
1169  */
1170 static int mwifiex_cfg80211_change_beacon(struct wiphy *wiphy,
1171  struct net_device *dev,
1172  struct cfg80211_beacon_data *data)
1173 {
1174  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1175 
1176  if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_UAP) {
1177  wiphy_err(wiphy, "%s: bss_type mismatched\n", __func__);
1178  return -EINVAL;
1179  }
1180 
1181  if (!priv->bss_started) {
1182  wiphy_err(wiphy, "%s: bss not started\n", __func__);
1183  return -EINVAL;
1184  }
1185 
1186  if (mwifiex_set_mgmt_ies(priv, data)) {
1187  wiphy_err(wiphy, "%s: setting mgmt ies failed\n", __func__);
1188  return -EFAULT;
1189  }
1190 
1191  return 0;
1192 }
1193 
1194 static int
1195 mwifiex_cfg80211_set_antenna(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant)
1196 {
1197  struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
1198  struct mwifiex_private *priv = mwifiex_get_priv(adapter,
1200  struct mwifiex_ds_ant_cfg ant_cfg;
1201 
1202  if (!tx_ant || !rx_ant)
1203  return -EOPNOTSUPP;
1204 
1205  if (adapter->hw_dev_mcs_support != HT_STREAM_2X2) {
1206  /* Not a MIMO chip. User should provide specific antenna number
1207  * for Tx/Rx path or enable all antennas for diversity
1208  */
1209  if (tx_ant != rx_ant)
1210  return -EOPNOTSUPP;
1211 
1212  if ((tx_ant & (tx_ant - 1)) &&
1213  (tx_ant != BIT(adapter->number_of_antenna) - 1))
1214  return -EOPNOTSUPP;
1215 
1216  if ((tx_ant == BIT(adapter->number_of_antenna) - 1) &&
1217  (priv->adapter->number_of_antenna > 1)) {
1218  tx_ant = RF_ANTENNA_AUTO;
1219  rx_ant = RF_ANTENNA_AUTO;
1220  }
1221  }
1222 
1223  ant_cfg.tx_ant = tx_ant;
1224  ant_cfg.rx_ant = rx_ant;
1225 
1227  HostCmd_ACT_GEN_SET, 0, &ant_cfg);
1228 }
1229 
1230 /* cfg80211 operation handler for stop ap.
1231  * Function stops BSS running at uAP interface.
1232  */
1233 static int mwifiex_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
1234 {
1235  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1236 
1237  if (mwifiex_del_mgmt_ies(priv))
1238  wiphy_err(wiphy, "Failed to delete mgmt IEs!\n");
1239 
1240  priv->ap_11n_enabled = 0;
1241 
1243  HostCmd_ACT_GEN_SET, 0, NULL)) {
1244  wiphy_err(wiphy, "Failed to stop the BSS\n");
1245  return -1;
1246  }
1247 
1248  return 0;
1249 }
1250 
1251 /* cfg80211 operation handler for start_ap.
1252  * Function sets beacon period, DTIM period, SSID and security into
1253  * AP config structure.
1254  * AP is configured with these settings and BSS is started.
1255  */
1256 static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy,
1257  struct net_device *dev,
1258  struct cfg80211_ap_settings *params)
1259 {
1260  struct mwifiex_uap_bss_param *bss_cfg;
1261  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1262  u8 config_bands = 0;
1263 
1264  if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_UAP)
1265  return -1;
1266  if (mwifiex_set_mgmt_ies(priv, &params->beacon))
1267  return -1;
1268 
1269  bss_cfg = kzalloc(sizeof(struct mwifiex_uap_bss_param), GFP_KERNEL);
1270  if (!bss_cfg)
1271  return -ENOMEM;
1272 
1274 
1275  if (params->beacon_interval)
1276  bss_cfg->beacon_period = params->beacon_interval;
1277  if (params->dtim_period)
1278  bss_cfg->dtim_period = params->dtim_period;
1279 
1280  if (params->ssid && params->ssid_len) {
1281  memcpy(bss_cfg->ssid.ssid, params->ssid, params->ssid_len);
1282  bss_cfg->ssid.ssid_len = params->ssid_len;
1283  }
1284 
1285  switch (params->hidden_ssid) {
1287  bss_cfg->bcast_ssid_ctl = 1;
1288  break;
1290  bss_cfg->bcast_ssid_ctl = 0;
1291  break;
1293  /* firmware doesn't support this type of hidden SSID */
1294  default:
1295  kfree(bss_cfg);
1296  return -EINVAL;
1297  }
1298 
1299  bss_cfg->channel =
1300  (u8)ieee80211_frequency_to_channel(params->channel->center_freq);
1301 
1302  /* Set appropriate bands */
1303  if (params->channel->band == IEEE80211_BAND_2GHZ) {
1304  bss_cfg->band_cfg = BAND_CONFIG_BG;
1305 
1306  if (params->channel_type == NL80211_CHAN_NO_HT)
1307  config_bands = BAND_B | BAND_G;
1308  else
1309  config_bands = BAND_B | BAND_G | BAND_GN;
1310  } else {
1311  bss_cfg->band_cfg = BAND_CONFIG_A;
1312 
1313  if (params->channel_type == NL80211_CHAN_NO_HT)
1314  config_bands = BAND_A;
1315  else
1316  config_bands = BAND_AN | BAND_A;
1317  }
1318 
1319  if (!((config_bands | priv->adapter->fw_bands) &
1320  ~priv->adapter->fw_bands))
1321  priv->adapter->config_bands = config_bands;
1322 
1323  mwifiex_set_uap_rates(bss_cfg, params);
1324  mwifiex_send_domain_info_cmd_fw(wiphy);
1325 
1326  if (mwifiex_set_secure_params(priv, bss_cfg, params)) {
1327  kfree(bss_cfg);
1328  wiphy_err(wiphy, "Failed to parse secuirty parameters!\n");
1329  return -1;
1330  }
1331 
1332  mwifiex_set_ht_params(priv, bss_cfg, params);
1333 
1334  if (params->inactivity_timeout > 0) {
1335  /* sta_ao_timer/ps_sta_ao_timer is in unit of 100ms */
1336  bss_cfg->sta_ao_timer = 10 * params->inactivity_timeout;
1337  bss_cfg->ps_sta_ao_timer = 10 * params->inactivity_timeout;
1338  }
1339 
1341  HostCmd_ACT_GEN_SET, 0, NULL)) {
1342  wiphy_err(wiphy, "Failed to stop the BSS\n");
1343  kfree(bss_cfg);
1344  return -1;
1345  }
1346 
1349  UAP_BSS_PARAMS_I, bss_cfg)) {
1350  wiphy_err(wiphy, "Failed to set the SSID\n");
1351  kfree(bss_cfg);
1352  return -1;
1353  }
1354 
1355  kfree(bss_cfg);
1356 
1358  HostCmd_ACT_GEN_SET, 0, NULL)) {
1359  wiphy_err(wiphy, "Failed to start the BSS\n");
1360  return -1;
1361  }
1362 
1363  if (priv->sec_info.wep_enabled)
1365  else
1367 
1370  &priv->curr_pkt_filter))
1371  return -1;
1372 
1373  return 0;
1374 }
1375 
1376 /*
1377  * CFG802.11 operation handler for disconnection request.
1378  *
1379  * This function does not work when there is already a disconnection
1380  * procedure going on.
1381  */
1382 static int
1383 mwifiex_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev,
1384  u16 reason_code)
1385 {
1386  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1387 
1388  if (mwifiex_deauthenticate(priv, NULL))
1389  return -EFAULT;
1390 
1391  wiphy_dbg(wiphy, "info: successfully disconnected from %pM:"
1392  " reason code %d\n", priv->cfg_bssid, reason_code);
1393 
1394  memset(priv->cfg_bssid, 0, ETH_ALEN);
1395 
1396  return 0;
1397 }
1398 
1399 /*
1400  * This function informs the CFG802.11 subsystem of a new IBSS.
1401  *
1402  * The following information are sent to the CFG802.11 subsystem
1403  * to register the new IBSS. If we do not register the new IBSS,
1404  * a kernel panic will result.
1405  * - SSID
1406  * - SSID length
1407  * - BSSID
1408  * - Channel
1409  */
1410 static int mwifiex_cfg80211_inform_ibss_bss(struct mwifiex_private *priv)
1411 {
1412  struct ieee80211_channel *chan;
1413  struct mwifiex_bss_info bss_info;
1414  struct cfg80211_bss *bss;
1415  int ie_len;
1416  u8 ie_buf[IEEE80211_MAX_SSID_LEN + sizeof(struct ieee_types_header)];
1417  enum ieee80211_band band;
1418 
1419  if (mwifiex_get_bss_info(priv, &bss_info))
1420  return -1;
1421 
1422  ie_buf[0] = WLAN_EID_SSID;
1423  ie_buf[1] = bss_info.ssid.ssid_len;
1424 
1425  memcpy(&ie_buf[sizeof(struct ieee_types_header)],
1426  &bss_info.ssid.ssid, bss_info.ssid.ssid_len);
1427  ie_len = ie_buf[1] + sizeof(struct ieee_types_header);
1428 
1429  band = mwifiex_band_to_radio_type(priv->curr_bss_params.band);
1430  chan = __ieee80211_get_channel(priv->wdev->wiphy,
1431  ieee80211_channel_to_frequency(bss_info.bss_chan,
1432  band));
1433 
1434  bss = cfg80211_inform_bss(priv->wdev->wiphy, chan,
1435  bss_info.bssid, 0, WLAN_CAPABILITY_IBSS,
1436  0, ie_buf, ie_len, 0, GFP_KERNEL);
1437  cfg80211_put_bss(bss);
1438  memcpy(priv->cfg_bssid, bss_info.bssid, ETH_ALEN);
1439 
1440  return 0;
1441 }
1442 
1443 /*
1444  * This function connects with a BSS.
1445  *
1446  * This function handles both Infra and Ad-Hoc modes. It also performs
1447  * validity checking on the provided parameters, disconnects from the
1448  * current BSS (if any), sets up the association/scan parameters,
1449  * including security settings, and performs specific SSID scan before
1450  * trying to connect.
1451  *
1452  * For Infra mode, the function returns failure if the specified SSID
1453  * is not found in scan table. However, for Ad-Hoc mode, it can create
1454  * the IBSS if it does not exist. On successful completion in either case,
1455  * the function notifies the CFG802.11 subsystem of the new BSS connection.
1456  */
1457 static int
1458 mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid,
1459  u8 *bssid, int mode, struct ieee80211_channel *channel,
1460  struct cfg80211_connect_params *sme, bool privacy)
1461 {
1462  struct cfg80211_ssid req_ssid;
1463  int ret, auth_type = 0;
1464  struct cfg80211_bss *bss = NULL;
1465  u8 is_scanning_required = 0, config_bands = 0;
1466 
1467  memset(&req_ssid, 0, sizeof(struct cfg80211_ssid));
1468 
1469  req_ssid.ssid_len = ssid_len;
1470  if (ssid_len > IEEE80211_MAX_SSID_LEN) {
1471  dev_err(priv->adapter->dev, "invalid SSID - aborting\n");
1472  return -EINVAL;
1473  }
1474 
1475  memcpy(req_ssid.ssid, ssid, ssid_len);
1476  if (!req_ssid.ssid_len || req_ssid.ssid[0] < 0x20) {
1477  dev_err(priv->adapter->dev, "invalid SSID - aborting\n");
1478  return -EINVAL;
1479  }
1480 
1481  /* disconnect before try to associate */
1483 
1484  if (channel) {
1485  if (mode == NL80211_IFTYPE_STATION) {
1486  if (channel->band == IEEE80211_BAND_2GHZ)
1487  config_bands = BAND_B | BAND_G | BAND_GN;
1488  else
1489  config_bands = BAND_A | BAND_AN;
1490 
1491  if (!((config_bands | priv->adapter->fw_bands) &
1492  ~priv->adapter->fw_bands))
1493  priv->adapter->config_bands = config_bands;
1494  }
1495  }
1496 
1497  /* As this is new association, clear locally stored
1498  * keys and security related flags */
1499  priv->sec_info.wpa_enabled = false;
1500  priv->sec_info.wpa2_enabled = false;
1501  priv->wep_key_curr_index = 0;
1502  priv->sec_info.encryption_mode = 0;
1503  priv->sec_info.is_authtype_auto = 0;
1504  ret = mwifiex_set_encode(priv, NULL, NULL, 0, 0, NULL, 1);
1505 
1506  if (mode == NL80211_IFTYPE_ADHOC) {
1507  /* "privacy" is set only for ad-hoc mode */
1508  if (privacy) {
1509  /*
1510  * Keep WLAN_CIPHER_SUITE_WEP104 for now so that
1511  * the firmware can find a matching network from the
1512  * scan. The cfg80211 does not give us the encryption
1513  * mode at this stage so just setting it to WEP here.
1514  */
1515  priv->sec_info.encryption_mode =
1517  priv->sec_info.authentication_mode =
1519  }
1520 
1521  goto done;
1522  }
1523 
1524  /* Now handle infra mode. "sme" is valid for infra mode only */
1525  if (sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC) {
1526  auth_type = NL80211_AUTHTYPE_OPEN_SYSTEM;
1527  priv->sec_info.is_authtype_auto = 1;
1528  } else {
1529  auth_type = sme->auth_type;
1530  }
1531 
1532  if (sme->crypto.n_ciphers_pairwise) {
1533  priv->sec_info.encryption_mode =
1534  sme->crypto.ciphers_pairwise[0];
1535  priv->sec_info.authentication_mode = auth_type;
1536  }
1537 
1538  if (sme->crypto.cipher_group) {
1539  priv->sec_info.encryption_mode = sme->crypto.cipher_group;
1540  priv->sec_info.authentication_mode = auth_type;
1541  }
1542  if (sme->ie)
1543  ret = mwifiex_set_gen_ie(priv, sme->ie, sme->ie_len);
1544 
1545  if (sme->key) {
1546  if (mwifiex_is_alg_wep(priv->sec_info.encryption_mode)) {
1547  dev_dbg(priv->adapter->dev,
1548  "info: setting wep encryption"
1549  " with key len %d\n", sme->key_len);
1550  priv->wep_key_curr_index = sme->key_idx;
1551  ret = mwifiex_set_encode(priv, NULL, sme->key,
1552  sme->key_len, sme->key_idx,
1553  NULL, 0);
1554  }
1555  }
1556 done:
1557  /*
1558  * Scan entries are valid for some time (15 sec). So we can save one
1559  * active scan time if we just try cfg80211_get_bss first. If it fails
1560  * then request scan and cfg80211_get_bss() again for final output.
1561  */
1562  while (1) {
1563  if (is_scanning_required) {
1564  /* Do specific SSID scanning */
1565  if (mwifiex_request_scan(priv, &req_ssid)) {
1566  dev_err(priv->adapter->dev, "scan error\n");
1567  return -EFAULT;
1568  }
1569  }
1570 
1571  /* Find the BSS we want using available scan results */
1572  if (mode == NL80211_IFTYPE_ADHOC)
1573  bss = cfg80211_get_bss(priv->wdev->wiphy, channel,
1574  bssid, ssid, ssid_len,
1577  else
1578  bss = cfg80211_get_bss(priv->wdev->wiphy, channel,
1579  bssid, ssid, ssid_len,
1582 
1583  if (!bss) {
1584  if (is_scanning_required) {
1585  dev_warn(priv->adapter->dev,
1586  "assoc: requested bss not found in scan results\n");
1587  break;
1588  }
1589  is_scanning_required = 1;
1590  } else {
1591  dev_dbg(priv->adapter->dev,
1592  "info: trying to associate to '%s' bssid %pM\n",
1593  (char *) req_ssid.ssid, bss->bssid);
1594  memcpy(&priv->cfg_bssid, bss->bssid, ETH_ALEN);
1595  break;
1596  }
1597  }
1598 
1599  ret = mwifiex_bss_start(priv, bss, &req_ssid);
1600  if (ret)
1601  return ret;
1602 
1603  if (mode == NL80211_IFTYPE_ADHOC) {
1604  /* Inform the BSS information to kernel, otherwise
1605  * kernel will give a panic after successful assoc */
1606  if (mwifiex_cfg80211_inform_ibss_bss(priv))
1607  return -EFAULT;
1608  }
1609 
1610  return ret;
1611 }
1612 
1613 /*
1614  * CFG802.11 operation handler for association request.
1615  *
1616  * This function does not work when the current mode is set to Ad-Hoc, or
1617  * when there is already an association procedure going on. The given BSS
1618  * information is used to associate.
1619  */
1620 static int
1621 mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
1622  struct cfg80211_connect_params *sme)
1623 {
1624  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1625  int ret = 0;
1626 
1627  if (priv->bss_mode == NL80211_IFTYPE_ADHOC) {
1628  wiphy_err(wiphy, "received infra assoc request "
1629  "when station is in ibss mode\n");
1630  goto done;
1631  }
1632 
1633  if (priv->bss_mode == NL80211_IFTYPE_AP) {
1634  wiphy_err(wiphy, "skip association request for AP interface\n");
1635  goto done;
1636  }
1637 
1638  wiphy_dbg(wiphy, "info: Trying to associate to %s and bssid %pM\n",
1639  (char *) sme->ssid, sme->bssid);
1640 
1641  ret = mwifiex_cfg80211_assoc(priv, sme->ssid_len, sme->ssid, sme->bssid,
1642  priv->bss_mode, sme->channel, sme, 0);
1643 done:
1644  if (!ret) {
1645  cfg80211_connect_result(priv->netdev, priv->cfg_bssid, NULL, 0,
1647  GFP_KERNEL);
1648  dev_dbg(priv->adapter->dev,
1649  "info: associated to bssid %pM successfully\n",
1650  priv->cfg_bssid);
1651  } else {
1652  dev_dbg(priv->adapter->dev,
1653  "info: association to bssid %pM failed\n",
1654  priv->cfg_bssid);
1655  memset(priv->cfg_bssid, 0, ETH_ALEN);
1656 
1657  if (ret > 0)
1659  NULL, 0, NULL, 0, ret,
1660  GFP_KERNEL);
1661  else
1663  NULL, 0, NULL, 0,
1665  GFP_KERNEL);
1666  }
1667 
1668  return 0;
1669 }
1670 
1671 /*
1672  * This function sets following parameters for ibss network.
1673  * - channel
1674  * - start band
1675  * - 11n flag
1676  * - secondary channel offset
1677  */
1678 static int mwifiex_set_ibss_params(struct mwifiex_private *priv,
1679  struct cfg80211_ibss_params *params)
1680 {
1681  struct wiphy *wiphy = priv->wdev->wiphy;
1682  struct mwifiex_adapter *adapter = priv->adapter;
1683  int index = 0, i;
1684  u8 config_bands = 0;
1685 
1686  if (params->channel->band == IEEE80211_BAND_2GHZ) {
1687  if (!params->basic_rates) {
1688  config_bands = BAND_B | BAND_G;
1689  } else {
1690  for (i = 0; i < mwifiex_band_2ghz.n_bitrates; i++) {
1691  /*
1692  * Rates below 6 Mbps in the table are CCK
1693  * rates; 802.11b and from 6 they are OFDM;
1694  * 802.11G
1695  */
1696  if (mwifiex_rates[i].bitrate == 60) {
1697  index = 1 << i;
1698  break;
1699  }
1700  }
1701 
1702  if (params->basic_rates < index) {
1703  config_bands = BAND_B;
1704  } else {
1705  config_bands = BAND_G;
1706  if (params->basic_rates % index)
1707  config_bands |= BAND_B;
1708  }
1709  }
1710 
1711  if (params->channel_type != NL80211_CHAN_NO_HT)
1712  config_bands |= BAND_GN;
1713  } else {
1714  if (params->channel_type == NL80211_CHAN_NO_HT)
1715  config_bands = BAND_A;
1716  else
1717  config_bands = BAND_AN | BAND_A;
1718  }
1719 
1720  if (!((config_bands | adapter->fw_bands) & ~adapter->fw_bands)) {
1721  adapter->config_bands = config_bands;
1722  adapter->adhoc_start_band = config_bands;
1723 
1724  if ((config_bands & BAND_GN) || (config_bands & BAND_AN))
1725  adapter->adhoc_11n_enabled = true;
1726  else
1727  adapter->adhoc_11n_enabled = false;
1728  }
1729 
1730  adapter->sec_chan_offset =
1732  priv->adhoc_channel =
1733  ieee80211_frequency_to_channel(params->channel->center_freq);
1734 
1735  wiphy_dbg(wiphy, "info: set ibss band %d, chan %d, chan offset %d\n",
1736  config_bands, priv->adhoc_channel, adapter->sec_chan_offset);
1737 
1738  return 0;
1739 }
1740 
1741 /*
1742  * CFG802.11 operation handler to join an IBSS.
1743  *
1744  * This function does not work in any mode other than Ad-Hoc, or if
1745  * a join operation is already in progress.
1746  */
1747 static int
1748 mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
1749  struct cfg80211_ibss_params *params)
1750 {
1751  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1752  int ret = 0;
1753 
1754  if (priv->bss_mode != NL80211_IFTYPE_ADHOC) {
1755  wiphy_err(wiphy, "request to join ibss received "
1756  "when station is not in ibss mode\n");
1757  goto done;
1758  }
1759 
1760  wiphy_dbg(wiphy, "info: trying to join to %s and bssid %pM\n",
1761  (char *) params->ssid, params->bssid);
1762 
1763  mwifiex_set_ibss_params(priv, params);
1764 
1765  ret = mwifiex_cfg80211_assoc(priv, params->ssid_len, params->ssid,
1766  params->bssid, priv->bss_mode,
1767  params->channel, NULL, params->privacy);
1768 done:
1769  if (!ret) {
1771  dev_dbg(priv->adapter->dev,
1772  "info: joined/created adhoc network with bssid"
1773  " %pM successfully\n", priv->cfg_bssid);
1774  } else {
1775  dev_dbg(priv->adapter->dev,
1776  "info: failed creating/joining adhoc network\n");
1777  }
1778 
1779  return ret;
1780 }
1781 
1782 /*
1783  * CFG802.11 operation handler to leave an IBSS.
1784  *
1785  * This function does not work if a leave operation is
1786  * already in progress.
1787  */
1788 static int
1789 mwifiex_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
1790 {
1791  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1792 
1793  wiphy_dbg(wiphy, "info: disconnecting from essid %pM\n",
1794  priv->cfg_bssid);
1795  if (mwifiex_deauthenticate(priv, NULL))
1796  return -EFAULT;
1797 
1798  memset(priv->cfg_bssid, 0, ETH_ALEN);
1799 
1800  return 0;
1801 }
1802 
1803 /*
1804  * CFG802.11 operation handler for scan request.
1805  *
1806  * This function issues a scan request to the firmware based upon
1807  * the user specified scan configuration. On successfull completion,
1808  * it also informs the results.
1809  */
1810 static int
1811 mwifiex_cfg80211_scan(struct wiphy *wiphy,
1812  struct cfg80211_scan_request *request)
1813 {
1814  struct net_device *dev = request->wdev->netdev;
1815  struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1816  int i, offset, ret;
1817  struct ieee80211_channel *chan;
1818  struct ieee_types_header *ie;
1819 
1820  wiphy_dbg(wiphy, "info: received scan request on %s\n", dev->name);
1821 
1822  if (atomic_read(&priv->wmm.tx_pkts_queued) >=
1824  dev_dbg(priv->adapter->dev, "scan rejected due to traffic\n");
1825  return -EBUSY;
1826  }
1827 
1828  priv->user_scan_cfg = kzalloc(sizeof(struct mwifiex_user_scan_cfg),
1829  GFP_KERNEL);
1830  if (!priv->user_scan_cfg) {
1831  dev_err(priv->adapter->dev, "failed to alloc scan_req\n");
1832  return -ENOMEM;
1833  }
1834 
1835  priv->scan_request = request;
1836 
1837  priv->user_scan_cfg->num_ssids = request->n_ssids;
1838  priv->user_scan_cfg->ssid_list = request->ssids;
1839 
1840  if (request->ie && request->ie_len) {
1841  offset = 0;
1842  for (i = 0; i < MWIFIEX_MAX_VSIE_NUM; i++) {
1843  if (priv->vs_ie[i].mask != MWIFIEX_VSIE_MASK_CLEAR)
1844  continue;
1845  priv->vs_ie[i].mask = MWIFIEX_VSIE_MASK_SCAN;
1846  ie = (struct ieee_types_header *)(request->ie + offset);
1847  memcpy(&priv->vs_ie[i].ie, ie, sizeof(*ie) + ie->len);
1848  offset += sizeof(*ie) + ie->len;
1849 
1850  if (offset >= request->ie_len)
1851  break;
1852  }
1853  }
1854 
1855  for (i = 0; i < request->n_channels; i++) {
1856  chan = request->channels[i];
1857  priv->user_scan_cfg->chan_list[i].chan_number = chan->hw_value;
1858  priv->user_scan_cfg->chan_list[i].radio_type = chan->band;
1859 
1860  if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)
1861  priv->user_scan_cfg->chan_list[i].scan_type =
1863  else
1864  priv->user_scan_cfg->chan_list[i].scan_type =
1866 
1867  priv->user_scan_cfg->chan_list[i].scan_time = 0;
1868  }
1869 
1870  ret = mwifiex_scan_networks(priv, priv->user_scan_cfg);
1871  if (ret) {
1872  dev_err(priv->adapter->dev, "scan failed: %d\n", ret);
1873  priv->scan_request = NULL;
1874  kfree(priv->user_scan_cfg);
1875  priv->user_scan_cfg = NULL;
1876  return ret;
1877  }
1878 
1879  if (request->ie && request->ie_len) {
1880  for (i = 0; i < MWIFIEX_MAX_VSIE_NUM; i++) {
1881  if (priv->vs_ie[i].mask == MWIFIEX_VSIE_MASK_SCAN) {
1882  priv->vs_ie[i].mask = MWIFIEX_VSIE_MASK_CLEAR;
1883  memset(&priv->vs_ie[i].ie, 0,
1885  }
1886  }
1887  }
1888  return 0;
1889 }
1890 
1891 /*
1892  * This function sets up the CFG802.11 specific HT capability fields
1893  * with default values.
1894  *
1895  * The following default values are set -
1896  * - HT Supported = True
1897  * - Maximum AMPDU length factor = IEEE80211_HT_MAX_AMPDU_64K
1898  * - Minimum AMPDU spacing = IEEE80211_HT_MPDU_DENSITY_NONE
1899  * - HT Capabilities supported by firmware
1900  * - MCS information, Rx mask = 0xff
1901  * - MCD information, Tx parameters = IEEE80211_HT_MCS_TX_DEFINED (0x01)
1902  */
1903 static void
1904 mwifiex_setup_ht_caps(struct ieee80211_sta_ht_cap *ht_info,
1905  struct mwifiex_private *priv)
1906 {
1907  int rx_mcs_supp;
1908  struct ieee80211_mcs_info mcs_set;
1909  u8 *mcs = (u8 *)&mcs_set;
1910  struct mwifiex_adapter *adapter = priv->adapter;
1911 
1912  ht_info->ht_supported = true;
1915 
1916  memset(&ht_info->mcs, 0, sizeof(ht_info->mcs));
1917 
1918  /* Fill HT capability information */
1919  if (ISSUPP_CHANWIDTH40(adapter->hw_dot_11n_dev_cap))
1921  else
1923 
1924  if (ISSUPP_SHORTGI20(adapter->hw_dot_11n_dev_cap))
1925  ht_info->cap |= IEEE80211_HT_CAP_SGI_20;
1926  else
1927  ht_info->cap &= ~IEEE80211_HT_CAP_SGI_20;
1928 
1929  if (ISSUPP_SHORTGI40(adapter->hw_dot_11n_dev_cap))
1930  ht_info->cap |= IEEE80211_HT_CAP_SGI_40;
1931  else
1932  ht_info->cap &= ~IEEE80211_HT_CAP_SGI_40;
1933 
1934  if (ISSUPP_RXSTBC(adapter->hw_dot_11n_dev_cap))
1935  ht_info->cap |= 1 << IEEE80211_HT_CAP_RX_STBC_SHIFT;
1936  else
1937  ht_info->cap &= ~(3 << IEEE80211_HT_CAP_RX_STBC_SHIFT);
1938 
1939  if (ISSUPP_TXSTBC(adapter->hw_dot_11n_dev_cap))
1940  ht_info->cap |= IEEE80211_HT_CAP_TX_STBC;
1941  else
1942  ht_info->cap &= ~IEEE80211_HT_CAP_TX_STBC;
1943 
1944  ht_info->cap &= ~IEEE80211_HT_CAP_MAX_AMSDU;
1945  ht_info->cap |= IEEE80211_HT_CAP_SM_PS;
1946 
1947  rx_mcs_supp = GET_RXMCSSUPP(adapter->hw_dev_mcs_support);
1948  /* Set MCS for 1x1 */
1949  memset(mcs, 0xff, rx_mcs_supp);
1950  /* Clear all the other values */
1951  memset(&mcs[rx_mcs_supp], 0,
1952  sizeof(struct ieee80211_mcs_info) - rx_mcs_supp);
1953  if (priv->bss_mode == NL80211_IFTYPE_STATION ||
1955  /* Set MCS32 for infra mode or ad-hoc mode with 40MHz support */
1956  SETHT_MCS32(mcs_set.rx_mask);
1957 
1958  memcpy((u8 *) &ht_info->mcs, mcs, sizeof(struct ieee80211_mcs_info));
1959 
1960  ht_info->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
1961 }
1962 
1963 /*
1964  * create a new virtual interface with the given name
1965  */
1966 struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
1967  const char *name,
1968  enum nl80211_iftype type,
1969  u32 *flags,
1970  struct vif_params *params)
1971 {
1972  struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
1973  struct mwifiex_private *priv;
1974  struct net_device *dev;
1975  void *mdev_priv;
1976  struct wireless_dev *wdev;
1977 
1978  if (!adapter)
1979  return ERR_PTR(-EFAULT);
1980 
1981  switch (type) {
1984  case NL80211_IFTYPE_ADHOC:
1985  priv = adapter->priv[MWIFIEX_BSS_TYPE_STA];
1986  if (priv->bss_mode) {
1987  wiphy_err(wiphy,
1988  "cannot create multiple sta/adhoc ifaces\n");
1989  return ERR_PTR(-EINVAL);
1990  }
1991 
1992  wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
1993  if (!wdev)
1994  return ERR_PTR(-ENOMEM);
1995 
1996  wdev->wiphy = wiphy;
1997  priv->wdev = wdev;
1999 
2000  if (type == NL80211_IFTYPE_UNSPECIFIED)
2002  else
2003  priv->bss_mode = type;
2004 
2007  priv->bss_priority = 0;
2009  priv->bss_num = 0;
2010 
2011  break;
2012  case NL80211_IFTYPE_AP:
2013  priv = adapter->priv[MWIFIEX_BSS_TYPE_UAP];
2014 
2015  if (priv->bss_mode) {
2016  wiphy_err(wiphy, "Can't create multiple AP interfaces");
2017  return ERR_PTR(-EINVAL);
2018  }
2019 
2020  wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
2021  if (!wdev)
2022  return ERR_PTR(-ENOMEM);
2023 
2024  priv->wdev = wdev;
2025  wdev->wiphy = wiphy;
2026  wdev->iftype = NL80211_IFTYPE_AP;
2027 
2030  priv->bss_priority = 0;
2032  priv->bss_started = 0;
2033  priv->bss_num = 0;
2034  priv->bss_mode = type;
2035 
2036  break;
2038  priv = adapter->priv[MWIFIEX_BSS_TYPE_P2P];
2039 
2040  if (priv->bss_mode) {
2041  wiphy_err(wiphy, "Can't create multiple P2P ifaces");
2042  return ERR_PTR(-EINVAL);
2043  }
2044 
2045  wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
2046  if (!wdev)
2047  return ERR_PTR(-ENOMEM);
2048 
2049  priv->wdev = wdev;
2050  wdev->wiphy = wiphy;
2051 
2052  /* At start-up, wpa_supplicant tries to change the interface
2053  * to NL80211_IFTYPE_STATION if it is not managed mode.
2054  * So, we initialize it to STA mode.
2055  */
2058 
2059  /* Setting bss_type to P2P tells firmware that this interface
2060  * is receiving P2P peers found during find phase and doing
2061  * action frame handshake.
2062  */
2064 
2068  priv->bss_started = 0;
2069  priv->bss_num = 0;
2070 
2071  break;
2072  default:
2073  wiphy_err(wiphy, "type not supported\n");
2074  return ERR_PTR(-EINVAL);
2075  }
2076 
2077  dev = alloc_netdev_mq(sizeof(struct mwifiex_private *), name,
2078  ether_setup, 1);
2079  if (!dev) {
2080  wiphy_err(wiphy, "no memory available for netdevice\n");
2082  return ERR_PTR(-ENOMEM);
2083  }
2084 
2085  mwifiex_init_priv_params(priv, dev);
2086  priv->netdev = dev;
2087 
2088  mwifiex_setup_ht_caps(&wiphy->bands[IEEE80211_BAND_2GHZ]->ht_cap, priv);
2089 
2090  if (adapter->config_bands & BAND_A)
2091  mwifiex_setup_ht_caps(
2092  &wiphy->bands[IEEE80211_BAND_5GHZ]->ht_cap, priv);
2093 
2094  dev_net_set(dev, wiphy_net(wiphy));
2095  dev->ieee80211_ptr = priv->wdev;
2096  dev->ieee80211_ptr->iftype = priv->bss_mode;
2097  memcpy(dev->dev_addr, wiphy->perm_addr, ETH_ALEN);
2098  memcpy(dev->perm_addr, wiphy->perm_addr, ETH_ALEN);
2099  SET_NETDEV_DEV(dev, wiphy_dev(wiphy));
2100 
2101  dev->flags |= IFF_BROADCAST | IFF_MULTICAST;
2104 
2105  mdev_priv = netdev_priv(dev);
2106  *((unsigned long *) mdev_priv) = (unsigned long) priv;
2107 
2108  SET_NETDEV_DEV(dev, adapter->dev);
2109 
2110  /* Register network device */
2111  if (register_netdevice(dev)) {
2112  wiphy_err(wiphy, "cannot register virtual network device\n");
2113  free_netdev(dev);
2115  return ERR_PTR(-EFAULT);
2116  }
2117 
2118  sema_init(&priv->async_sem, 1);
2119  priv->scan_pending_on_block = false;
2120 
2121  dev_dbg(adapter->dev, "info: %s: Marvell 802.11 Adapter\n", dev->name);
2122 
2123 #ifdef CONFIG_DEBUG_FS
2125 #endif
2126  return wdev;
2127 }
2129 
2130 /*
2131  * del_virtual_intf: remove the virtual interface determined by dev
2132  */
2133 int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
2134 {
2135  struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
2136 
2137 #ifdef CONFIG_DEBUG_FS
2139 #endif
2140 
2141  if (!netif_queue_stopped(priv->netdev))
2142  netif_stop_queue(priv->netdev);
2143 
2144  if (netif_carrier_ok(priv->netdev))
2145  netif_carrier_off(priv->netdev);
2146 
2147  if (wdev->netdev->reg_state == NETREG_REGISTERED)
2148  unregister_netdevice(wdev->netdev);
2149 
2150  if (wdev->netdev->reg_state == NETREG_UNREGISTERED)
2151  free_netdev(wdev->netdev);
2152 
2153  /* Clear the priv in adapter */
2154  priv->netdev = NULL;
2155 
2156  priv->media_connected = false;
2157 
2159 
2160  return 0;
2161 }
2163 
2164 /* station cfg80211 operations */
2165 static struct cfg80211_ops mwifiex_cfg80211_ops = {
2166  .add_virtual_intf = mwifiex_add_virtual_intf,
2167  .del_virtual_intf = mwifiex_del_virtual_intf,
2168  .change_virtual_intf = mwifiex_cfg80211_change_virtual_intf,
2169  .scan = mwifiex_cfg80211_scan,
2170  .connect = mwifiex_cfg80211_connect,
2171  .disconnect = mwifiex_cfg80211_disconnect,
2172  .get_station = mwifiex_cfg80211_get_station,
2173  .dump_station = mwifiex_cfg80211_dump_station,
2174  .set_wiphy_params = mwifiex_cfg80211_set_wiphy_params,
2175  .join_ibss = mwifiex_cfg80211_join_ibss,
2176  .leave_ibss = mwifiex_cfg80211_leave_ibss,
2177  .add_key = mwifiex_cfg80211_add_key,
2178  .del_key = mwifiex_cfg80211_del_key,
2179  .mgmt_tx = mwifiex_cfg80211_mgmt_tx,
2180  .mgmt_frame_register = mwifiex_cfg80211_mgmt_frame_register,
2181  .remain_on_channel = mwifiex_cfg80211_remain_on_channel,
2182  .cancel_remain_on_channel = mwifiex_cfg80211_cancel_remain_on_channel,
2183  .set_default_key = mwifiex_cfg80211_set_default_key,
2184  .set_power_mgmt = mwifiex_cfg80211_set_power_mgmt,
2185  .set_tx_power = mwifiex_cfg80211_set_tx_power,
2186  .set_bitrate_mask = mwifiex_cfg80211_set_bitrate_mask,
2187  .start_ap = mwifiex_cfg80211_start_ap,
2188  .stop_ap = mwifiex_cfg80211_stop_ap,
2189  .change_beacon = mwifiex_cfg80211_change_beacon,
2190  .set_cqm_rssi_config = mwifiex_cfg80211_set_cqm_rssi_config,
2191  .set_antenna = mwifiex_cfg80211_set_antenna,
2192 };
2193 
2194 /*
2195  * This function registers the device with CFG802.11 subsystem.
2196  *
2197  * The function creates the wireless device/wiphy, populates it with
2198  * default parameters and handler function pointers, and finally
2199  * registers the device.
2200  */
2201 
2203 {
2204  int ret;
2205  void *wdev_priv;
2206  struct wiphy *wiphy;
2207  struct mwifiex_private *priv = adapter->priv[MWIFIEX_BSS_TYPE_STA];
2208  u8 *country_code;
2209 
2210  /* create a new wiphy for use with cfg80211 */
2211  wiphy = wiphy_new(&mwifiex_cfg80211_ops,
2212  sizeof(struct mwifiex_adapter *));
2213  if (!wiphy) {
2214  dev_err(adapter->dev, "%s: creating new wiphy\n", __func__);
2215  return -ENOMEM;
2216  }
2219  wiphy->mgmt_stypes = mwifiex_mgmt_stypes;
2220  wiphy->max_remain_on_channel_duration = 5000;
2226 
2227  wiphy->bands[IEEE80211_BAND_2GHZ] = &mwifiex_band_2ghz;
2228  if (adapter->config_bands & BAND_A)
2229  wiphy->bands[IEEE80211_BAND_5GHZ] = &mwifiex_band_5ghz;
2230  else
2231  wiphy->bands[IEEE80211_BAND_5GHZ] = NULL;
2232 
2233  wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta;
2234  wiphy->n_iface_combinations = 1;
2235 
2236  /* Initialize cipher suits */
2237  wiphy->cipher_suites = mwifiex_cipher_suites;
2238  wiphy->n_cipher_suites = ARRAY_SIZE(mwifiex_cipher_suites);
2239 
2240  memcpy(wiphy->perm_addr, priv->curr_addr, ETH_ALEN);
2242  wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME |
2246 
2247  wiphy_apply_custom_regulatory(wiphy, &mwifiex_world_regdom_custom);
2248 
2252 
2253  wiphy->available_antennas_tx = BIT(adapter->number_of_antenna) - 1;
2254  wiphy->available_antennas_rx = BIT(adapter->number_of_antenna) - 1;
2255 
2258 
2259  /* Reserve space for mwifiex specific private data for BSS */
2260  wiphy->bss_priv_size = sizeof(struct mwifiex_bss_priv);
2261 
2262  wiphy->reg_notifier = mwifiex_reg_notifier;
2263 
2264  /* Set struct mwifiex_adapter pointer in wiphy_priv */
2265  wdev_priv = wiphy_priv(wiphy);
2266  *(unsigned long *)wdev_priv = (unsigned long)adapter;
2267 
2268  set_wiphy_dev(wiphy, priv->adapter->dev);
2269 
2270  ret = wiphy_register(wiphy);
2271  if (ret < 0) {
2272  dev_err(adapter->dev,
2273  "%s: wiphy_register failed: %d\n", __func__, ret);
2274  wiphy_free(wiphy);
2275  return ret;
2276  }
2277  country_code = mwifiex_11d_code_2_region(priv->adapter->region_code);
2278  if (country_code)
2279  dev_info(adapter->dev,
2280  "ignoring F/W country code %2.2s\n", country_code);
2281 
2282  adapter->wiphy = wiphy;
2283  return ret;
2284 }