2 * Copyright (c) 2012-2012 Quantenna Communications, Inc.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
17 #include <linux/kernel.h>
18 #include <linux/etherdevice.h>
19 #include <linux/vmalloc.h>
20 #include <linux/ieee80211.h>
21 #include <net/cfg80211.h>
22 #include <net/netlink.h>
30 /* Supported rates to be advertised to the cfg80211 */
31 static struct ieee80211_rate qtnf_rates_2g
[] = {
32 {.bitrate
= 10, .hw_value
= 2, },
33 {.bitrate
= 20, .hw_value
= 4, },
34 {.bitrate
= 55, .hw_value
= 11, },
35 {.bitrate
= 110, .hw_value
= 22, },
36 {.bitrate
= 60, .hw_value
= 12, },
37 {.bitrate
= 90, .hw_value
= 18, },
38 {.bitrate
= 120, .hw_value
= 24, },
39 {.bitrate
= 180, .hw_value
= 36, },
40 {.bitrate
= 240, .hw_value
= 48, },
41 {.bitrate
= 360, .hw_value
= 72, },
42 {.bitrate
= 480, .hw_value
= 96, },
43 {.bitrate
= 540, .hw_value
= 108, },
46 /* Supported rates to be advertised to the cfg80211 */
47 static struct ieee80211_rate qtnf_rates_5g
[] = {
48 {.bitrate
= 60, .hw_value
= 12, },
49 {.bitrate
= 90, .hw_value
= 18, },
50 {.bitrate
= 120, .hw_value
= 24, },
51 {.bitrate
= 180, .hw_value
= 36, },
52 {.bitrate
= 240, .hw_value
= 48, },
53 {.bitrate
= 360, .hw_value
= 72, },
54 {.bitrate
= 480, .hw_value
= 96, },
55 {.bitrate
= 540, .hw_value
= 108, },
58 /* Supported crypto cipher suits to be advertised to cfg80211 */
59 static const u32 qtnf_cipher_suites
[] = {
60 WLAN_CIPHER_SUITE_TKIP
,
61 WLAN_CIPHER_SUITE_CCMP
,
62 WLAN_CIPHER_SUITE_AES_CMAC
,
65 /* Supported mgmt frame types to be advertised to cfg80211 */
66 static const struct ieee80211_txrx_stypes
67 qtnf_mgmt_stypes
[NUM_NL80211_IFTYPES
] = {
68 [NL80211_IFTYPE_STATION
] = {
69 .tx
= BIT(IEEE80211_STYPE_ACTION
>> 4),
70 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
71 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4),
73 [NL80211_IFTYPE_AP
] = {
74 .tx
= BIT(IEEE80211_STYPE_ACTION
>> 4),
75 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
76 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4) |
77 BIT(IEEE80211_STYPE_ASSOC_REQ
>> 4) |
78 BIT(IEEE80211_STYPE_REASSOC_REQ
>> 4) |
79 BIT(IEEE80211_STYPE_AUTH
>> 4),
84 qtnf_validate_iface_combinations(struct wiphy
*wiphy
,
85 struct qtnf_vif
*change_vif
,
86 enum nl80211_iftype new_type
)
88 struct qtnf_wmac
*mac
;
92 struct iface_combination_params params
= {
93 .num_different_channels
= 1,
96 mac
= wiphy_priv(wiphy
);
100 for (i
= 0; i
< QTNF_MAX_INTF
; i
++) {
101 vif
= &mac
->iflist
[i
];
102 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_UNSPECIFIED
)
103 params
.iftype_num
[vif
->wdev
.iftype
]++;
107 params
.iftype_num
[new_type
]++;
108 params
.iftype_num
[change_vif
->wdev
.iftype
]--;
110 params
.iftype_num
[new_type
]++;
113 ret
= cfg80211_check_combinations(wiphy
, ¶ms
);
119 qtnf_change_virtual_intf(struct wiphy
*wiphy
,
120 struct net_device
*dev
,
121 enum nl80211_iftype type
,
122 struct vif_params
*params
)
124 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
128 ret
= qtnf_validate_iface_combinations(wiphy
, vif
, type
);
130 pr_err("VIF%u.%u combination check: failed to set type %d\n",
131 vif
->mac
->macid
, vif
->vifid
, type
);
136 mac_addr
= params
->macaddr
;
140 qtnf_scan_done(vif
->mac
, true);
142 ret
= qtnf_cmd_send_change_intf_type(vif
, type
, mac_addr
);
144 pr_err("VIF%u.%u: failed to change VIF type: %d\n",
145 vif
->mac
->macid
, vif
->vifid
, ret
);
149 vif
->wdev
.iftype
= type
;
153 int qtnf_del_virtual_intf(struct wiphy
*wiphy
, struct wireless_dev
*wdev
)
155 struct net_device
*netdev
= wdev
->netdev
;
156 struct qtnf_vif
*vif
;
158 if (WARN_ON(!netdev
))
161 vif
= qtnf_netdev_get_priv(wdev
->netdev
);
163 qtnf_scan_done(vif
->mac
, true);
166 netif_tx_stop_all_queues(netdev
);
167 if (netif_carrier_ok(netdev
))
168 netif_carrier_off(netdev
);
170 if (netdev
->reg_state
== NETREG_REGISTERED
)
171 unregister_netdevice(netdev
);
173 if (qtnf_cmd_send_del_intf(vif
))
174 pr_err("VIF%u.%u: failed to delete VIF\n", vif
->mac
->macid
,
177 vif
->netdev
->ieee80211_ptr
= NULL
;
179 vif
->wdev
.iftype
= NL80211_IFTYPE_UNSPECIFIED
;
180 eth_zero_addr(vif
->mac_addr
);
181 eth_zero_addr(vif
->bssid
);
186 static struct wireless_dev
*qtnf_add_virtual_intf(struct wiphy
*wiphy
,
188 unsigned char name_assign_t
,
189 enum nl80211_iftype type
,
190 struct vif_params
*params
)
192 struct qtnf_wmac
*mac
;
193 struct qtnf_vif
*vif
;
197 mac
= wiphy_priv(wiphy
);
200 return ERR_PTR(-EFAULT
);
202 ret
= qtnf_validate_iface_combinations(wiphy
, NULL
, type
);
204 pr_err("MAC%u invalid combination: failed to add type %d\n",
210 case NL80211_IFTYPE_STATION
:
211 case NL80211_IFTYPE_AP
:
212 vif
= qtnf_mac_get_free_vif(mac
);
214 pr_err("MAC%u: no free VIF available\n", mac
->macid
);
215 return ERR_PTR(-EFAULT
);
218 eth_zero_addr(vif
->mac_addr
);
219 vif
->bss_priority
= QTNF_DEF_BSS_PRIORITY
;
220 vif
->wdev
.wiphy
= wiphy
;
221 vif
->wdev
.iftype
= type
;
222 vif
->sta_state
= QTNF_STA_DISCONNECTED
;
225 pr_err("MAC%u: unsupported IF type %d\n", mac
->macid
, type
);
226 return ERR_PTR(-ENOTSUPP
);
230 mac_addr
= params
->macaddr
;
232 if (qtnf_cmd_send_add_intf(vif
, type
, mac_addr
)) {
233 pr_err("VIF%u.%u: failed to add VIF\n", mac
->macid
, vif
->vifid
);
237 if (!is_valid_ether_addr(vif
->mac_addr
)) {
238 pr_err("VIF%u.%u: FW reported bad MAC: %pM\n",
239 mac
->macid
, vif
->vifid
, vif
->mac_addr
);
243 if (qtnf_core_net_attach(mac
, vif
, name
, name_assign_t
)) {
244 pr_err("VIF%u.%u: failed to attach netdev\n", mac
->macid
,
249 vif
->wdev
.netdev
= vif
->netdev
;
255 qtnf_cmd_send_del_intf(vif
);
257 vif
->wdev
.iftype
= NL80211_IFTYPE_UNSPECIFIED
;
258 eth_zero_addr(vif
->mac_addr
);
259 eth_zero_addr(vif
->bssid
);
261 return ERR_PTR(-EFAULT
);
264 static int qtnf_mgmt_set_appie(struct qtnf_vif
*vif
,
265 const struct cfg80211_beacon_data
*info
)
269 if (!info
->beacon_ies
|| !info
->beacon_ies_len
) {
270 ret
= qtnf_cmd_send_mgmt_set_appie(vif
, QLINK_IE_SET_BEACON_IES
,
273 ret
= qtnf_cmd_send_mgmt_set_appie(vif
, QLINK_IE_SET_BEACON_IES
,
275 info
->beacon_ies_len
);
281 if (!info
->proberesp_ies
|| !info
->proberesp_ies_len
) {
282 ret
= qtnf_cmd_send_mgmt_set_appie(vif
,
283 QLINK_IE_SET_PROBE_RESP_IES
,
286 ret
= qtnf_cmd_send_mgmt_set_appie(vif
,
287 QLINK_IE_SET_PROBE_RESP_IES
,
289 info
->proberesp_ies_len
);
295 if (!info
->assocresp_ies
|| !info
->assocresp_ies_len
) {
296 ret
= qtnf_cmd_send_mgmt_set_appie(vif
,
297 QLINK_IE_SET_ASSOC_RESP
,
300 ret
= qtnf_cmd_send_mgmt_set_appie(vif
,
301 QLINK_IE_SET_ASSOC_RESP
,
303 info
->assocresp_ies_len
);
310 static int qtnf_change_beacon(struct wiphy
*wiphy
, struct net_device
*dev
,
311 struct cfg80211_beacon_data
*info
)
313 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
315 return qtnf_mgmt_set_appie(vif
, info
);
318 static int qtnf_start_ap(struct wiphy
*wiphy
, struct net_device
*dev
,
319 struct cfg80211_ap_settings
*settings
)
321 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
324 ret
= qtnf_cmd_send_start_ap(vif
, settings
);
326 pr_err("VIF%u.%u: failed to start AP\n", vif
->mac
->macid
,
332 static int qtnf_stop_ap(struct wiphy
*wiphy
, struct net_device
*dev
)
334 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
337 qtnf_scan_done(vif
->mac
, true);
339 ret
= qtnf_cmd_send_stop_ap(vif
);
341 pr_err("VIF%u.%u: failed to stop AP operation in FW\n",
342 vif
->mac
->macid
, vif
->vifid
);
344 netif_carrier_off(vif
->netdev
);
350 static int qtnf_set_wiphy_params(struct wiphy
*wiphy
, u32 changed
)
352 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
353 struct qtnf_vif
*vif
;
356 vif
= qtnf_mac_get_base_vif(mac
);
358 pr_err("MAC%u: primary VIF is not configured\n", mac
->macid
);
362 if (changed
& (WIPHY_PARAM_RETRY_LONG
| WIPHY_PARAM_RETRY_SHORT
)) {
363 pr_err("MAC%u: can't modify retry params\n", mac
->macid
);
367 ret
= qtnf_cmd_send_update_phy_params(mac
, changed
);
369 pr_err("MAC%u: failed to update PHY params\n", mac
->macid
);
375 qtnf_mgmt_frame_register(struct wiphy
*wiphy
, struct wireless_dev
*wdev
,
376 u16 frame_type
, bool reg
)
378 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(wdev
->netdev
);
381 u16 qlink_frame_type
= 0;
383 mgmt_type
= (frame_type
& IEEE80211_FCTL_STYPE
) >> 4;
386 new_mask
= vif
->mgmt_frames_bitmask
| BIT(mgmt_type
);
388 new_mask
= vif
->mgmt_frames_bitmask
& ~BIT(mgmt_type
);
390 if (new_mask
== vif
->mgmt_frames_bitmask
)
393 switch (frame_type
& IEEE80211_FCTL_STYPE
) {
394 case IEEE80211_STYPE_REASSOC_REQ
:
395 case IEEE80211_STYPE_ASSOC_REQ
:
396 qlink_frame_type
= QLINK_MGMT_FRAME_ASSOC_REQ
;
398 case IEEE80211_STYPE_AUTH
:
399 qlink_frame_type
= QLINK_MGMT_FRAME_AUTH
;
401 case IEEE80211_STYPE_PROBE_REQ
:
402 qlink_frame_type
= QLINK_MGMT_FRAME_PROBE_REQ
;
404 case IEEE80211_STYPE_ACTION
:
405 qlink_frame_type
= QLINK_MGMT_FRAME_ACTION
;
408 pr_warn("VIF%u.%u: unsupported frame type: %X\n",
409 vif
->mac
->macid
, vif
->vifid
,
410 (frame_type
& IEEE80211_FCTL_STYPE
) >> 4);
414 if (qtnf_cmd_send_register_mgmt(vif
, qlink_frame_type
, reg
)) {
415 pr_warn("VIF%u.%u: failed to %sregister mgmt frame type 0x%x\n",
416 vif
->mac
->macid
, vif
->vifid
, reg
? "" : "un",
421 vif
->mgmt_frames_bitmask
= new_mask
;
422 pr_debug("VIF%u.%u: %sregistered mgmt frame type 0x%x\n",
423 vif
->mac
->macid
, vif
->vifid
, reg
? "" : "un", frame_type
);
427 qtnf_mgmt_tx(struct wiphy
*wiphy
, struct wireless_dev
*wdev
,
428 struct cfg80211_mgmt_tx_params
*params
, u64
*cookie
)
430 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(wdev
->netdev
);
431 const struct ieee80211_mgmt
*mgmt_frame
= (void *)params
->buf
;
432 u32 short_cookie
= prandom_u32();
436 *cookie
= short_cookie
;
439 flags
|= QLINK_MGMT_FRAME_TX_FLAG_OFFCHAN
;
442 flags
|= QLINK_MGMT_FRAME_TX_FLAG_NO_CCK
;
444 if (params
->dont_wait_for_ack
)
445 flags
|= QLINK_MGMT_FRAME_TX_FLAG_ACK_NOWAIT
;
447 /* If channel is not specified, pass "freq = 0" to tell device
448 * firmware to use current channel.
451 freq
= params
->chan
->center_freq
;
455 pr_debug("%s freq:%u; FC:%.4X; DA:%pM; len:%zu; C:%.8X; FL:%.4X\n",
456 wdev
->netdev
->name
, freq
,
457 le16_to_cpu(mgmt_frame
->frame_control
), mgmt_frame
->da
,
458 params
->len
, short_cookie
, flags
);
460 return qtnf_cmd_send_mgmt_frame(vif
, short_cookie
, flags
,
462 params
->buf
, params
->len
);
466 qtnf_get_station(struct wiphy
*wiphy
, struct net_device
*dev
,
467 const u8
*mac
, struct station_info
*sinfo
)
469 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
471 sinfo
->generation
= vif
->generation
;
472 return qtnf_cmd_get_sta_info(vif
, mac
, sinfo
);
476 qtnf_dump_station(struct wiphy
*wiphy
, struct net_device
*dev
,
477 int idx
, u8
*mac
, struct station_info
*sinfo
)
479 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
480 const struct qtnf_sta_node
*sta_node
;
483 sta_node
= qtnf_sta_list_lookup_index(&vif
->sta_list
, idx
);
485 if (unlikely(!sta_node
))
488 ether_addr_copy(mac
, sta_node
->mac_addr
);
490 ret
= qtnf_cmd_get_sta_info(vif
, sta_node
->mac_addr
, sinfo
);
492 if (unlikely(ret
== -ENOENT
)) {
493 qtnf_sta_list_del(vif
, mac
);
494 cfg80211_del_sta(vif
->netdev
, mac
, GFP_KERNEL
);
498 sinfo
->generation
= vif
->generation
;
503 static int qtnf_add_key(struct wiphy
*wiphy
, struct net_device
*dev
,
504 u8 key_index
, bool pairwise
, const u8
*mac_addr
,
505 struct key_params
*params
)
507 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
510 ret
= qtnf_cmd_send_add_key(vif
, key_index
, pairwise
, mac_addr
, params
);
512 pr_err("VIF%u.%u: failed to add key: cipher=%x idx=%u pw=%u\n",
513 vif
->mac
->macid
, vif
->vifid
, params
->cipher
, key_index
,
519 static int qtnf_del_key(struct wiphy
*wiphy
, struct net_device
*dev
,
520 u8 key_index
, bool pairwise
, const u8
*mac_addr
)
522 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
525 ret
= qtnf_cmd_send_del_key(vif
, key_index
, pairwise
, mac_addr
);
527 pr_err("VIF%u.%u: failed to delete key: idx=%u pw=%u\n",
528 vif
->mac
->macid
, vif
->vifid
, key_index
, pairwise
);
533 static int qtnf_set_default_key(struct wiphy
*wiphy
, struct net_device
*dev
,
534 u8 key_index
, bool unicast
, bool multicast
)
536 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
539 ret
= qtnf_cmd_send_set_default_key(vif
, key_index
, unicast
, multicast
);
541 pr_err("VIF%u.%u: failed to set dflt key: idx=%u uc=%u mc=%u\n",
542 vif
->mac
->macid
, vif
->vifid
, key_index
, unicast
,
549 qtnf_set_default_mgmt_key(struct wiphy
*wiphy
, struct net_device
*dev
,
552 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
555 ret
= qtnf_cmd_send_set_default_mgmt_key(vif
, key_index
);
557 pr_err("VIF%u.%u: failed to set default MGMT key: idx=%u\n",
558 vif
->mac
->macid
, vif
->vifid
, key_index
);
564 qtnf_change_station(struct wiphy
*wiphy
, struct net_device
*dev
,
565 const u8
*mac
, struct station_parameters
*params
)
567 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
570 ret
= qtnf_cmd_send_change_sta(vif
, mac
, params
);
572 pr_err("VIF%u.%u: failed to change STA %pM\n",
573 vif
->mac
->macid
, vif
->vifid
, mac
);
579 qtnf_del_station(struct wiphy
*wiphy
, struct net_device
*dev
,
580 struct station_del_parameters
*params
)
582 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
586 (vif
->wdev
.iftype
== NL80211_IFTYPE_AP
) &&
587 !is_broadcast_ether_addr(params
->mac
) &&
588 !qtnf_sta_list_lookup(&vif
->sta_list
, params
->mac
))
591 ret
= qtnf_cmd_send_del_sta(vif
, params
);
593 pr_err("VIF%u.%u: failed to delete STA %pM\n",
594 vif
->mac
->macid
, vif
->vifid
, params
->mac
);
599 qtnf_scan(struct wiphy
*wiphy
, struct cfg80211_scan_request
*request
)
601 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
603 cancel_delayed_work_sync(&mac
->scan_timeout
);
605 mac
->scan_req
= request
;
607 if (qtnf_cmd_send_scan(mac
)) {
608 pr_err("MAC%u: failed to start scan\n", mac
->macid
);
609 mac
->scan_req
= NULL
;
613 queue_delayed_work(mac
->bus
->workqueue
, &mac
->scan_timeout
,
614 QTNF_SCAN_TIMEOUT_SEC
* HZ
);
620 qtnf_connect(struct wiphy
*wiphy
, struct net_device
*dev
,
621 struct cfg80211_connect_params
*sme
)
623 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
626 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_STATION
)
629 if (vif
->sta_state
!= QTNF_STA_DISCONNECTED
)
633 ether_addr_copy(vif
->bssid
, sme
->bssid
);
635 eth_zero_addr(vif
->bssid
);
637 ret
= qtnf_cmd_send_connect(vif
, sme
);
639 pr_err("VIF%u.%u: failed to connect\n", vif
->mac
->macid
,
644 vif
->sta_state
= QTNF_STA_CONNECTING
;
649 qtnf_disconnect(struct wiphy
*wiphy
, struct net_device
*dev
,
652 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
653 struct qtnf_vif
*vif
;
656 vif
= qtnf_mac_get_base_vif(mac
);
658 pr_err("MAC%u: primary VIF is not configured\n", mac
->macid
);
662 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_STATION
)
665 if (vif
->sta_state
== QTNF_STA_DISCONNECTED
)
668 ret
= qtnf_cmd_send_disconnect(vif
, reason_code
);
670 pr_err("VIF%u.%u: failed to disconnect\n", mac
->macid
,
679 qtnf_dump_survey(struct wiphy
*wiphy
, struct net_device
*dev
,
680 int idx
, struct survey_info
*survey
)
682 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
683 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
684 struct ieee80211_supported_band
*sband
;
685 const struct cfg80211_chan_def
*chandef
= &wdev
->chandef
;
686 struct ieee80211_channel
*chan
;
687 struct qtnf_chan_stats stats
;
688 struct qtnf_vif
*vif
;
691 vif
= qtnf_netdev_get_priv(dev
);
693 sband
= wiphy
->bands
[NL80211_BAND_2GHZ
];
694 if (sband
&& idx
>= sband
->n_channels
) {
695 idx
-= sband
->n_channels
;
700 sband
= wiphy
->bands
[NL80211_BAND_5GHZ
];
702 if (!sband
|| idx
>= sband
->n_channels
)
705 chan
= &sband
->channels
[idx
];
706 memset(&stats
, 0, sizeof(stats
));
708 survey
->channel
= chan
;
709 survey
->filled
= 0x0;
712 if (chan
->hw_value
== chandef
->chan
->hw_value
)
713 survey
->filled
= SURVEY_INFO_IN_USE
;
716 ret
= qtnf_cmd_get_chan_stats(mac
, chan
->hw_value
, &stats
);
719 if (unlikely(stats
.chan_num
!= chan
->hw_value
)) {
720 pr_err("received stats for channel %d instead of %d\n",
721 stats
.chan_num
, chan
->hw_value
);
726 survey
->filled
|= SURVEY_INFO_TIME
|
727 SURVEY_INFO_TIME_SCAN
|
728 SURVEY_INFO_TIME_BUSY
|
729 SURVEY_INFO_TIME_RX
|
730 SURVEY_INFO_TIME_TX
|
731 SURVEY_INFO_NOISE_DBM
;
733 survey
->time_scan
= stats
.cca_try
;
734 survey
->time
= stats
.cca_try
;
735 survey
->time_tx
= stats
.cca_tx
;
736 survey
->time_rx
= stats
.cca_rx
;
737 survey
->time_busy
= stats
.cca_busy
;
738 survey
->noise
= stats
.chan_noise
;
741 pr_debug("no stats for channel %u\n", chan
->hw_value
);
745 pr_debug("failed to get chan(%d) stats from card\n",
755 qtnf_get_channel(struct wiphy
*wiphy
, struct wireless_dev
*wdev
,
756 struct cfg80211_chan_def
*chandef
)
758 struct net_device
*ndev
= wdev
->netdev
;
759 struct qtnf_vif
*vif
;
765 vif
= qtnf_netdev_get_priv(wdev
->netdev
);
767 ret
= qtnf_cmd_get_channel(vif
, chandef
);
769 pr_err("%s: failed to get channel: %d\n", ndev
->name
, ret
);
773 if (!cfg80211_chandef_valid(chandef
)) {
774 pr_err("%s: bad channel freq=%u cf1=%u cf2=%u bw=%u\n",
775 ndev
->name
, chandef
->chan
->center_freq
,
776 chandef
->center_freq1
, chandef
->center_freq2
,
785 static int qtnf_channel_switch(struct wiphy
*wiphy
, struct net_device
*dev
,
786 struct cfg80211_csa_settings
*params
)
788 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
791 pr_debug("%s: chan(%u) count(%u) radar(%u) block_tx(%u)\n", dev
->name
,
792 params
->chandef
.chan
->hw_value
, params
->count
,
793 params
->radar_required
, params
->block_tx
);
795 if (!cfg80211_chandef_valid(¶ms
->chandef
)) {
796 pr_err("%s: invalid channel\n", dev
->name
);
800 ret
= qtnf_cmd_send_chan_switch(vif
, params
);
802 pr_warn("%s: failed to switch to channel (%u)\n",
803 dev
->name
, params
->chandef
.chan
->hw_value
);
808 static int qtnf_start_radar_detection(struct wiphy
*wiphy
,
809 struct net_device
*ndev
,
810 struct cfg80211_chan_def
*chandef
,
813 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(ndev
);
816 ret
= qtnf_cmd_start_cac(vif
, chandef
, cac_time_ms
);
818 pr_err("%s: failed to start CAC ret=%d\n", ndev
->name
, ret
);
823 static int qtnf_set_mac_acl(struct wiphy
*wiphy
,
824 struct net_device
*dev
,
825 const struct cfg80211_acl_data
*params
)
827 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
830 ret
= qtnf_cmd_set_mac_acl(vif
, params
);
832 pr_err("%s: failed to set mac ACL ret=%d\n", dev
->name
, ret
);
837 static struct cfg80211_ops qtn_cfg80211_ops
= {
838 .add_virtual_intf
= qtnf_add_virtual_intf
,
839 .change_virtual_intf
= qtnf_change_virtual_intf
,
840 .del_virtual_intf
= qtnf_del_virtual_intf
,
841 .start_ap
= qtnf_start_ap
,
842 .change_beacon
= qtnf_change_beacon
,
843 .stop_ap
= qtnf_stop_ap
,
844 .set_wiphy_params
= qtnf_set_wiphy_params
,
845 .mgmt_frame_register
= qtnf_mgmt_frame_register
,
846 .mgmt_tx
= qtnf_mgmt_tx
,
847 .change_station
= qtnf_change_station
,
848 .del_station
= qtnf_del_station
,
849 .get_station
= qtnf_get_station
,
850 .dump_station
= qtnf_dump_station
,
851 .add_key
= qtnf_add_key
,
852 .del_key
= qtnf_del_key
,
853 .set_default_key
= qtnf_set_default_key
,
854 .set_default_mgmt_key
= qtnf_set_default_mgmt_key
,
856 .connect
= qtnf_connect
,
857 .disconnect
= qtnf_disconnect
,
858 .dump_survey
= qtnf_dump_survey
,
859 .get_channel
= qtnf_get_channel
,
860 .channel_switch
= qtnf_channel_switch
,
861 .start_radar_detection
= qtnf_start_radar_detection
,
862 .set_mac_acl
= qtnf_set_mac_acl
,
865 static void qtnf_cfg80211_reg_notifier(struct wiphy
*wiphy_in
,
866 struct regulatory_request
*req
)
868 struct qtnf_wmac
*mac
= wiphy_priv(wiphy_in
);
869 struct qtnf_bus
*bus
= mac
->bus
;
871 unsigned int mac_idx
;
872 enum nl80211_band band
;
875 pr_debug("MAC%u: initiator=%d alpha=%c%c\n", mac
->macid
, req
->initiator
,
876 req
->alpha2
[0], req
->alpha2
[1]);
878 ret
= qtnf_cmd_reg_notify(bus
, req
);
880 if (ret
!= -EOPNOTSUPP
&& ret
!= -EALREADY
)
881 pr_err("failed to update reg domain to %c%c\n",
882 req
->alpha2
[0], req
->alpha2
[1]);
886 for (mac_idx
= 0; mac_idx
< QTNF_MAX_MAC
; ++mac_idx
) {
887 if (!(bus
->hw_info
.mac_bitmap
& (1 << mac_idx
)))
890 mac
= bus
->mac
[mac_idx
];
894 wiphy
= priv_to_wiphy(mac
);
896 for (band
= 0; band
< NUM_NL80211_BANDS
; ++band
) {
897 if (!wiphy
->bands
[band
])
900 ret
= qtnf_cmd_band_info_get(mac
, wiphy
->bands
[band
]);
902 pr_err("failed to get chan info for mac %u band %u\n",
908 struct wiphy
*qtnf_wiphy_allocate(struct qtnf_bus
*bus
)
912 wiphy
= wiphy_new(&qtn_cfg80211_ops
, sizeof(struct qtnf_wmac
));
916 set_wiphy_dev(wiphy
, bus
->dev
);
922 qtnf_wiphy_setup_if_comb(struct wiphy
*wiphy
, struct qtnf_mac_info
*mac_info
)
924 struct ieee80211_iface_combination
*if_comb
;
926 u16 interface_modes
= 0;
929 if_comb
= mac_info
->if_comb
;
930 n_if_comb
= mac_info
->n_if_comb
;
932 if (!if_comb
|| !n_if_comb
)
935 for (i
= 0; i
< n_if_comb
; i
++) {
936 if_comb
[i
].radar_detect_widths
= mac_info
->radar_detect_widths
;
938 for (j
= 0; j
< if_comb
[i
].n_limits
; j
++)
939 interface_modes
|= if_comb
[i
].limits
[j
].types
;
942 wiphy
->iface_combinations
= if_comb
;
943 wiphy
->n_iface_combinations
= n_if_comb
;
944 wiphy
->interface_modes
= interface_modes
;
949 int qtnf_wiphy_register(struct qtnf_hw_info
*hw_info
, struct qtnf_wmac
*mac
)
951 struct wiphy
*wiphy
= priv_to_wiphy(mac
);
955 pr_err("invalid wiphy pointer\n");
959 wiphy
->frag_threshold
= mac
->macinfo
.frag_thr
;
960 wiphy
->rts_threshold
= mac
->macinfo
.rts_thr
;
961 wiphy
->retry_short
= mac
->macinfo
.sretry_limit
;
962 wiphy
->retry_long
= mac
->macinfo
.lretry_limit
;
963 wiphy
->coverage_class
= mac
->macinfo
.coverage_class
;
965 wiphy
->max_scan_ssids
= QTNF_MAX_SSID_LIST_LENGTH
;
966 wiphy
->max_scan_ie_len
= QTNF_MAX_VSIE_LEN
;
967 wiphy
->mgmt_stypes
= qtnf_mgmt_stypes
;
968 wiphy
->max_remain_on_channel_duration
= 5000;
969 wiphy
->max_acl_mac_addrs
= mac
->macinfo
.max_acl_mac_addrs
;
970 wiphy
->max_num_csa_counters
= 2;
972 ret
= qtnf_wiphy_setup_if_comb(wiphy
, &mac
->macinfo
);
976 /* Initialize cipher suits */
977 wiphy
->cipher_suites
= qtnf_cipher_suites
;
978 wiphy
->n_cipher_suites
= ARRAY_SIZE(qtnf_cipher_suites
);
979 wiphy
->signal_type
= CFG80211_SIGNAL_TYPE_MBM
;
980 wiphy
->flags
|= WIPHY_FLAG_HAVE_AP_SME
|
981 WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD
|
982 WIPHY_FLAG_AP_UAPSD
|
983 WIPHY_FLAG_HAS_CHANNEL_SWITCH
;
985 wiphy
->probe_resp_offload
= NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS
|
986 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2
;
988 wiphy
->available_antennas_tx
= mac
->macinfo
.num_tx_chain
;
989 wiphy
->available_antennas_rx
= mac
->macinfo
.num_rx_chain
;
991 wiphy
->max_ap_assoc_sta
= mac
->macinfo
.max_ap_assoc_sta
;
992 wiphy
->ht_capa_mod_mask
= &mac
->macinfo
.ht_cap_mod_mask
;
993 wiphy
->vht_capa_mod_mask
= &mac
->macinfo
.vht_cap_mod_mask
;
995 ether_addr_copy(wiphy
->perm_addr
, mac
->macaddr
);
997 if (hw_info
->hw_capab
& QLINK_HW_CAPAB_STA_INACT_TIMEOUT
)
998 wiphy
->features
|= NL80211_FEATURE_INACTIVITY_TIMER
;
1000 if (hw_info
->hw_capab
& QLINK_HW_CAPAB_REG_UPDATE
) {
1001 wiphy
->regulatory_flags
|= REGULATORY_STRICT_REG
|
1002 REGULATORY_CUSTOM_REG
;
1003 wiphy
->reg_notifier
= qtnf_cfg80211_reg_notifier
;
1004 wiphy_apply_custom_regulatory(wiphy
, hw_info
->rd
);
1006 wiphy
->regulatory_flags
|= REGULATORY_WIPHY_SELF_MANAGED
;
1009 strlcpy(wiphy
->fw_version
, hw_info
->fw_version
,
1010 sizeof(wiphy
->fw_version
));
1011 wiphy
->hw_version
= hw_info
->hw_version
;
1013 ret
= wiphy_register(wiphy
);
1017 if (wiphy
->regulatory_flags
& REGULATORY_WIPHY_SELF_MANAGED
)
1018 ret
= regulatory_set_wiphy_regd(wiphy
, hw_info
->rd
);
1019 else if (isalpha(hw_info
->rd
->alpha2
[0]) &&
1020 isalpha(hw_info
->rd
->alpha2
[1]))
1021 ret
= regulatory_hint(wiphy
, hw_info
->rd
->alpha2
);
1027 void qtnf_netdev_updown(struct net_device
*ndev
, bool up
)
1029 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(ndev
);
1031 if (qtnf_cmd_send_updown_intf(vif
, up
))
1032 pr_err("failed to send up/down command to FW\n");
1035 void qtnf_virtual_intf_cleanup(struct net_device
*ndev
)
1037 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(ndev
);
1038 struct qtnf_wmac
*mac
= wiphy_priv(vif
->wdev
.wiphy
);
1040 if (vif
->wdev
.iftype
== NL80211_IFTYPE_STATION
) {
1041 switch (vif
->sta_state
) {
1042 case QTNF_STA_DISCONNECTED
:
1044 case QTNF_STA_CONNECTING
:
1045 cfg80211_connect_result(vif
->netdev
,
1046 vif
->bssid
, NULL
, 0,
1048 WLAN_STATUS_UNSPECIFIED_FAILURE
,
1050 qtnf_disconnect(vif
->wdev
.wiphy
, ndev
,
1051 WLAN_REASON_DEAUTH_LEAVING
);
1053 case QTNF_STA_CONNECTED
:
1054 cfg80211_disconnected(vif
->netdev
,
1055 WLAN_REASON_DEAUTH_LEAVING
,
1056 NULL
, 0, 1, GFP_KERNEL
);
1057 qtnf_disconnect(vif
->wdev
.wiphy
, ndev
,
1058 WLAN_REASON_DEAUTH_LEAVING
);
1062 vif
->sta_state
= QTNF_STA_DISCONNECTED
;
1065 qtnf_scan_done(mac
, true);
1068 void qtnf_cfg80211_vif_reset(struct qtnf_vif
*vif
)
1070 if (vif
->wdev
.iftype
== NL80211_IFTYPE_STATION
) {
1071 switch (vif
->sta_state
) {
1072 case QTNF_STA_CONNECTING
:
1073 cfg80211_connect_result(vif
->netdev
,
1074 vif
->bssid
, NULL
, 0,
1076 WLAN_STATUS_UNSPECIFIED_FAILURE
,
1079 case QTNF_STA_CONNECTED
:
1080 cfg80211_disconnected(vif
->netdev
,
1081 WLAN_REASON_DEAUTH_LEAVING
,
1082 NULL
, 0, 1, GFP_KERNEL
);
1084 case QTNF_STA_DISCONNECTED
:
1089 cfg80211_shutdown_all_interfaces(vif
->wdev
.wiphy
);
1090 vif
->sta_state
= QTNF_STA_DISCONNECTED
;
1093 void qtnf_band_init_rates(struct ieee80211_supported_band
*band
)
1095 switch (band
->band
) {
1096 case NL80211_BAND_2GHZ
:
1097 band
->bitrates
= qtnf_rates_2g
;
1098 band
->n_bitrates
= ARRAY_SIZE(qtnf_rates_2g
);
1100 case NL80211_BAND_5GHZ
:
1101 band
->bitrates
= qtnf_rates_5g
;
1102 band
->n_bitrates
= ARRAY_SIZE(qtnf_rates_5g
);
1105 band
->bitrates
= NULL
;
1106 band
->n_bitrates
= 0;