1 // SPDX-License-Identifier: GPL-2.0+
2 /* Copyright (c) 2015-2016 Quantenna Communications. All rights reserved. */
4 #include <linux/kernel.h>
5 #include <linux/etherdevice.h>
6 #include <linux/vmalloc.h>
7 #include <linux/ieee80211.h>
8 #include <net/cfg80211.h>
9 #include <net/netlink.h>
17 /* Supported rates to be advertised to the cfg80211 */
18 static struct ieee80211_rate qtnf_rates_2g
[] = {
19 {.bitrate
= 10, .hw_value
= 2, },
20 {.bitrate
= 20, .hw_value
= 4, },
21 {.bitrate
= 55, .hw_value
= 11, },
22 {.bitrate
= 110, .hw_value
= 22, },
23 {.bitrate
= 60, .hw_value
= 12, },
24 {.bitrate
= 90, .hw_value
= 18, },
25 {.bitrate
= 120, .hw_value
= 24, },
26 {.bitrate
= 180, .hw_value
= 36, },
27 {.bitrate
= 240, .hw_value
= 48, },
28 {.bitrate
= 360, .hw_value
= 72, },
29 {.bitrate
= 480, .hw_value
= 96, },
30 {.bitrate
= 540, .hw_value
= 108, },
33 /* Supported rates to be advertised to the cfg80211 */
34 static struct ieee80211_rate qtnf_rates_5g
[] = {
35 {.bitrate
= 60, .hw_value
= 12, },
36 {.bitrate
= 90, .hw_value
= 18, },
37 {.bitrate
= 120, .hw_value
= 24, },
38 {.bitrate
= 180, .hw_value
= 36, },
39 {.bitrate
= 240, .hw_value
= 48, },
40 {.bitrate
= 360, .hw_value
= 72, },
41 {.bitrate
= 480, .hw_value
= 96, },
42 {.bitrate
= 540, .hw_value
= 108, },
45 /* Supported crypto cipher suits to be advertised to cfg80211 */
46 static const u32 qtnf_cipher_suites
[] = {
47 WLAN_CIPHER_SUITE_TKIP
,
48 WLAN_CIPHER_SUITE_CCMP
,
49 WLAN_CIPHER_SUITE_AES_CMAC
,
52 /* Supported mgmt frame types to be advertised to cfg80211 */
53 static const struct ieee80211_txrx_stypes
54 qtnf_mgmt_stypes
[NUM_NL80211_IFTYPES
] = {
55 [NL80211_IFTYPE_STATION
] = {
56 .tx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
57 BIT(IEEE80211_STYPE_AUTH
>> 4),
58 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
59 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4) |
60 BIT(IEEE80211_STYPE_AUTH
>> 4),
62 [NL80211_IFTYPE_AP
] = {
63 .tx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
64 BIT(IEEE80211_STYPE_AUTH
>> 4),
65 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
66 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4) |
67 BIT(IEEE80211_STYPE_ASSOC_REQ
>> 4) |
68 BIT(IEEE80211_STYPE_REASSOC_REQ
>> 4) |
69 BIT(IEEE80211_STYPE_AUTH
>> 4),
74 qtnf_validate_iface_combinations(struct wiphy
*wiphy
,
75 struct qtnf_vif
*change_vif
,
76 enum nl80211_iftype new_type
)
78 struct qtnf_wmac
*mac
;
82 struct iface_combination_params params
= {
83 .num_different_channels
= 1,
86 mac
= wiphy_priv(wiphy
);
90 for (i
= 0; i
< QTNF_MAX_INTF
; i
++) {
91 vif
= &mac
->iflist
[i
];
92 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_UNSPECIFIED
)
93 params
.iftype_num
[vif
->wdev
.iftype
]++;
97 params
.iftype_num
[new_type
]++;
98 params
.iftype_num
[change_vif
->wdev
.iftype
]--;
100 params
.iftype_num
[new_type
]++;
103 ret
= cfg80211_check_combinations(wiphy
, ¶ms
);
108 /* Check repeater interface combination: primary VIF should be STA only.
109 * STA (primary) + AP (secondary) is OK.
110 * AP (primary) + STA (secondary) is not supported.
112 vif
= qtnf_mac_get_base_vif(mac
);
113 if (vif
&& vif
->wdev
.iftype
== NL80211_IFTYPE_AP
&&
114 vif
!= change_vif
&& new_type
== NL80211_IFTYPE_STATION
) {
116 pr_err("MAC%u invalid combination: AP as primary repeater interface is not supported\n",
124 qtnf_change_virtual_intf(struct wiphy
*wiphy
,
125 struct net_device
*dev
,
126 enum nl80211_iftype type
,
127 struct vif_params
*params
)
129 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
134 ret
= qtnf_validate_iface_combinations(wiphy
, vif
, type
);
136 pr_err("VIF%u.%u combination check: failed to set type %d\n",
137 vif
->mac
->macid
, vif
->vifid
, type
);
142 mac_addr
= params
->macaddr
;
143 use4addr
= params
->use_4addr
;
146 qtnf_scan_done(vif
->mac
, true);
148 ret
= qtnf_cmd_send_change_intf_type(vif
, type
, use4addr
, mac_addr
);
150 pr_err("VIF%u.%u: failed to change type to %d\n",
151 vif
->mac
->macid
, vif
->vifid
, type
);
155 vif
->wdev
.iftype
= type
;
159 int qtnf_del_virtual_intf(struct wiphy
*wiphy
, struct wireless_dev
*wdev
)
161 struct net_device
*netdev
= wdev
->netdev
;
162 struct qtnf_vif
*vif
;
165 if (WARN_ON(!netdev
))
168 vif
= qtnf_netdev_get_priv(wdev
->netdev
);
170 qtnf_scan_done(vif
->mac
, true);
173 netif_tx_stop_all_queues(netdev
);
174 if (netif_carrier_ok(netdev
))
175 netif_carrier_off(netdev
);
177 while ((skb
= skb_dequeue(&vif
->high_pri_tx_queue
)))
178 dev_kfree_skb_any(skb
);
180 cancel_work_sync(&vif
->high_pri_tx_work
);
182 if (netdev
->reg_state
== NETREG_REGISTERED
)
183 unregister_netdevice(netdev
);
185 if (qtnf_cmd_send_del_intf(vif
))
186 pr_err("VIF%u.%u: failed to delete VIF\n", vif
->mac
->macid
,
189 vif
->netdev
->ieee80211_ptr
= NULL
;
191 vif
->wdev
.iftype
= NL80211_IFTYPE_UNSPECIFIED
;
196 static struct wireless_dev
*qtnf_add_virtual_intf(struct wiphy
*wiphy
,
198 unsigned char name_assign_t
,
199 enum nl80211_iftype type
,
200 struct vif_params
*params
)
202 struct qtnf_wmac
*mac
;
203 struct qtnf_vif
*vif
;
208 mac
= wiphy_priv(wiphy
);
211 return ERR_PTR(-EFAULT
);
213 ret
= qtnf_validate_iface_combinations(wiphy
, NULL
, type
);
215 pr_err("MAC%u invalid combination: failed to add type %d\n",
221 case NL80211_IFTYPE_STATION
:
222 case NL80211_IFTYPE_AP
:
223 vif
= qtnf_mac_get_free_vif(mac
);
225 pr_err("MAC%u: no free VIF available\n", mac
->macid
);
226 return ERR_PTR(-EFAULT
);
229 eth_zero_addr(vif
->mac_addr
);
230 eth_zero_addr(vif
->bssid
);
231 vif
->bss_priority
= QTNF_DEF_BSS_PRIORITY
;
232 memset(&vif
->wdev
, 0, sizeof(vif
->wdev
));
233 vif
->wdev
.wiphy
= wiphy
;
234 vif
->wdev
.iftype
= type
;
237 pr_err("MAC%u: unsupported IF type %d\n", mac
->macid
, type
);
238 return ERR_PTR(-ENOTSUPP
);
242 mac_addr
= params
->macaddr
;
243 use4addr
= params
->use_4addr
;
246 ret
= qtnf_cmd_send_add_intf(vif
, type
, use4addr
, mac_addr
);
248 pr_err("VIF%u.%u: failed to add VIF %pM\n",
249 mac
->macid
, vif
->vifid
, mac_addr
);
253 if (!is_valid_ether_addr(vif
->mac_addr
)) {
254 pr_err("VIF%u.%u: FW reported bad MAC: %pM\n",
255 mac
->macid
, vif
->vifid
, vif
->mac_addr
);
260 ret
= qtnf_core_net_attach(mac
, vif
, name
, name_assign_t
);
262 pr_err("VIF%u.%u: failed to attach netdev\n", mac
->macid
,
267 if (qtnf_hwcap_is_set(&mac
->bus
->hw_info
, QLINK_HW_CAPAB_HW_BRIDGE
)) {
268 ret
= qtnf_cmd_netdev_changeupper(vif
, vif
->netdev
->ifindex
);
270 unregister_netdevice(vif
->netdev
);
276 vif
->wdev
.netdev
= vif
->netdev
;
280 qtnf_cmd_send_del_intf(vif
);
282 vif
->wdev
.iftype
= NL80211_IFTYPE_UNSPECIFIED
;
287 static int qtnf_mgmt_set_appie(struct qtnf_vif
*vif
,
288 const struct cfg80211_beacon_data
*info
)
292 if (!info
->beacon_ies
|| !info
->beacon_ies_len
) {
293 ret
= qtnf_cmd_send_mgmt_set_appie(vif
, QLINK_IE_SET_BEACON_IES
,
296 ret
= qtnf_cmd_send_mgmt_set_appie(vif
, QLINK_IE_SET_BEACON_IES
,
298 info
->beacon_ies_len
);
304 if (!info
->proberesp_ies
|| !info
->proberesp_ies_len
) {
305 ret
= qtnf_cmd_send_mgmt_set_appie(vif
,
306 QLINK_IE_SET_PROBE_RESP_IES
,
309 ret
= qtnf_cmd_send_mgmt_set_appie(vif
,
310 QLINK_IE_SET_PROBE_RESP_IES
,
312 info
->proberesp_ies_len
);
318 if (!info
->assocresp_ies
|| !info
->assocresp_ies_len
) {
319 ret
= qtnf_cmd_send_mgmt_set_appie(vif
,
320 QLINK_IE_SET_ASSOC_RESP
,
323 ret
= qtnf_cmd_send_mgmt_set_appie(vif
,
324 QLINK_IE_SET_ASSOC_RESP
,
326 info
->assocresp_ies_len
);
333 static int qtnf_change_beacon(struct wiphy
*wiphy
, struct net_device
*dev
,
334 struct cfg80211_beacon_data
*info
)
336 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
338 return qtnf_mgmt_set_appie(vif
, info
);
341 static int qtnf_start_ap(struct wiphy
*wiphy
, struct net_device
*dev
,
342 struct cfg80211_ap_settings
*settings
)
344 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
347 ret
= qtnf_cmd_send_start_ap(vif
, settings
);
349 pr_err("VIF%u.%u: failed to start AP\n", vif
->mac
->macid
,
355 static int qtnf_stop_ap(struct wiphy
*wiphy
, struct net_device
*dev
)
357 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
360 qtnf_scan_done(vif
->mac
, true);
362 ret
= qtnf_cmd_send_stop_ap(vif
);
364 pr_err("VIF%u.%u: failed to stop AP operation in FW\n",
365 vif
->mac
->macid
, vif
->vifid
);
367 netif_carrier_off(vif
->netdev
);
372 static int qtnf_set_wiphy_params(struct wiphy
*wiphy
, u32 changed
)
374 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
375 struct qtnf_vif
*vif
;
378 vif
= qtnf_mac_get_base_vif(mac
);
380 pr_err("MAC%u: primary VIF is not configured\n", mac
->macid
);
384 ret
= qtnf_cmd_send_update_phy_params(mac
, changed
);
386 pr_err("MAC%u: failed to update PHY params\n", mac
->macid
);
392 qtnf_update_mgmt_frame_registrations(struct wiphy
*wiphy
,
393 struct wireless_dev
*wdev
,
394 struct mgmt_frame_regs
*upd
)
396 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(wdev
->netdev
);
397 u16 new_mask
= upd
->interface_stypes
;
398 u16 old_mask
= vif
->mgmt_frames_bitmask
;
399 static const struct {
400 u16 mask
, qlink_type
;
403 .mask
= BIT(IEEE80211_STYPE_REASSOC_REQ
>> 4) |
404 BIT(IEEE80211_STYPE_ASSOC_REQ
>> 4),
405 .qlink_type
= QLINK_MGMT_FRAME_ASSOC_REQ
,
408 .mask
= BIT(IEEE80211_STYPE_AUTH
>> 4),
409 .qlink_type
= QLINK_MGMT_FRAME_AUTH
,
412 .mask
= BIT(IEEE80211_STYPE_PROBE_REQ
>> 4),
413 .qlink_type
= QLINK_MGMT_FRAME_PROBE_REQ
,
416 .mask
= BIT(IEEE80211_STYPE_ACTION
>> 4),
417 .qlink_type
= QLINK_MGMT_FRAME_ACTION
,
422 if (new_mask
== old_mask
)
425 for (i
= 0; i
< ARRAY_SIZE(updates
); i
++) {
426 u16 mask
= updates
[i
].mask
;
427 u16 qlink_frame_type
= updates
[i
].qlink_type
;
430 /* the ! are here due to the assoc/reassoc merge */
431 if (!(new_mask
& mask
) == !(old_mask
& mask
))
434 reg
= new_mask
& mask
;
436 if (qtnf_cmd_send_register_mgmt(vif
, qlink_frame_type
, reg
))
437 pr_warn("VIF%u.%u: failed to %sregister qlink frame type 0x%x\n",
438 vif
->mac
->macid
, vif
->vifid
, reg
? "" : "un",
442 vif
->mgmt_frames_bitmask
= new_mask
;
446 qtnf_mgmt_tx(struct wiphy
*wiphy
, struct wireless_dev
*wdev
,
447 struct cfg80211_mgmt_tx_params
*params
, u64
*cookie
)
449 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(wdev
->netdev
);
450 const struct ieee80211_mgmt
*mgmt_frame
= (void *)params
->buf
;
451 u32 short_cookie
= prandom_u32();
455 *cookie
= short_cookie
;
458 flags
|= QLINK_FRAME_TX_FLAG_OFFCHAN
;
461 flags
|= QLINK_FRAME_TX_FLAG_NO_CCK
;
463 if (params
->dont_wait_for_ack
)
464 flags
|= QLINK_FRAME_TX_FLAG_ACK_NOWAIT
;
466 /* If channel is not specified, pass "freq = 0" to tell device
467 * firmware to use current channel.
470 freq
= params
->chan
->center_freq
;
474 pr_debug("%s freq:%u; FC:%.4X; DA:%pM; len:%zu; C:%.8X; FL:%.4X\n",
475 wdev
->netdev
->name
, freq
,
476 le16_to_cpu(mgmt_frame
->frame_control
), mgmt_frame
->da
,
477 params
->len
, short_cookie
, flags
);
479 return qtnf_cmd_send_frame(vif
, short_cookie
, flags
,
480 freq
, params
->buf
, params
->len
);
484 qtnf_get_station(struct wiphy
*wiphy
, struct net_device
*dev
,
485 const u8
*mac
, struct station_info
*sinfo
)
487 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
489 sinfo
->generation
= vif
->generation
;
490 return qtnf_cmd_get_sta_info(vif
, mac
, sinfo
);
494 qtnf_dump_station(struct wiphy
*wiphy
, struct net_device
*dev
,
495 int idx
, u8
*mac
, struct station_info
*sinfo
)
497 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
498 const struct qtnf_sta_node
*sta_node
;
501 switch (vif
->wdev
.iftype
) {
502 case NL80211_IFTYPE_STATION
:
503 if (idx
!= 0 || !vif
->wdev
.current_bss
)
506 ether_addr_copy(mac
, vif
->bssid
);
508 case NL80211_IFTYPE_AP
:
509 sta_node
= qtnf_sta_list_lookup_index(&vif
->sta_list
, idx
);
510 if (unlikely(!sta_node
))
513 ether_addr_copy(mac
, sta_node
->mac_addr
);
519 ret
= qtnf_cmd_get_sta_info(vif
, mac
, sinfo
);
521 if (vif
->wdev
.iftype
== NL80211_IFTYPE_AP
) {
522 if (ret
== -ENOENT
) {
523 cfg80211_del_sta(vif
->netdev
, mac
, GFP_KERNEL
);
528 sinfo
->generation
= vif
->generation
;
533 static int qtnf_add_key(struct wiphy
*wiphy
, struct net_device
*dev
,
534 u8 key_index
, bool pairwise
, const u8
*mac_addr
,
535 struct key_params
*params
)
537 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
540 ret
= qtnf_cmd_send_add_key(vif
, key_index
, pairwise
, mac_addr
, params
);
542 pr_err("VIF%u.%u: failed to add key: cipher=%x idx=%u pw=%u\n",
543 vif
->mac
->macid
, vif
->vifid
, params
->cipher
, key_index
,
549 static int qtnf_del_key(struct wiphy
*wiphy
, struct net_device
*dev
,
550 u8 key_index
, bool pairwise
, const u8
*mac_addr
)
552 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
555 ret
= qtnf_cmd_send_del_key(vif
, key_index
, pairwise
, mac_addr
);
557 if (ret
== -ENOENT
) {
558 pr_debug("VIF%u.%u: key index %d out of bounds\n",
559 vif
->mac
->macid
, vif
->vifid
, key_index
);
561 pr_err("VIF%u.%u: failed to delete key: idx=%u pw=%u\n",
562 vif
->mac
->macid
, vif
->vifid
,
563 key_index
, pairwise
);
570 static int qtnf_set_default_key(struct wiphy
*wiphy
, struct net_device
*dev
,
571 u8 key_index
, bool unicast
, bool multicast
)
573 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
576 ret
= qtnf_cmd_send_set_default_key(vif
, key_index
, unicast
, multicast
);
578 pr_err("VIF%u.%u: failed to set dflt key: idx=%u uc=%u mc=%u\n",
579 vif
->mac
->macid
, vif
->vifid
, key_index
, unicast
,
586 qtnf_set_default_mgmt_key(struct wiphy
*wiphy
, struct net_device
*dev
,
589 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
592 ret
= qtnf_cmd_send_set_default_mgmt_key(vif
, key_index
);
594 pr_err("VIF%u.%u: failed to set default MGMT key: idx=%u\n",
595 vif
->mac
->macid
, vif
->vifid
, key_index
);
601 qtnf_change_station(struct wiphy
*wiphy
, struct net_device
*dev
,
602 const u8
*mac
, struct station_parameters
*params
)
604 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
607 ret
= qtnf_cmd_send_change_sta(vif
, mac
, params
);
609 pr_err("VIF%u.%u: failed to change STA %pM\n",
610 vif
->mac
->macid
, vif
->vifid
, mac
);
616 qtnf_del_station(struct wiphy
*wiphy
, struct net_device
*dev
,
617 struct station_del_parameters
*params
)
619 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
623 (vif
->wdev
.iftype
== NL80211_IFTYPE_AP
) &&
624 !is_broadcast_ether_addr(params
->mac
) &&
625 !qtnf_sta_list_lookup(&vif
->sta_list
, params
->mac
))
628 ret
= qtnf_cmd_send_del_sta(vif
, params
);
630 pr_err("VIF%u.%u: failed to delete STA %pM\n",
631 vif
->mac
->macid
, vif
->vifid
, params
->mac
);
637 qtnf_scan(struct wiphy
*wiphy
, struct cfg80211_scan_request
*request
)
639 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
642 cancel_delayed_work_sync(&mac
->scan_timeout
);
644 mac
->scan_req
= request
;
646 ret
= qtnf_cmd_send_scan(mac
);
648 pr_err("MAC%u: failed to start scan\n", mac
->macid
);
649 mac
->scan_req
= NULL
;
653 pr_debug("MAC%u: scan started\n", mac
->macid
);
654 queue_delayed_work(mac
->bus
->workqueue
, &mac
->scan_timeout
,
655 QTNF_SCAN_TIMEOUT_SEC
* HZ
);
662 qtnf_connect(struct wiphy
*wiphy
, struct net_device
*dev
,
663 struct cfg80211_connect_params
*sme
)
665 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
668 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_STATION
)
671 if (sme
->auth_type
== NL80211_AUTHTYPE_SAE
&&
672 !(sme
->flags
& CONNECT_REQ_EXTERNAL_AUTH_SUPPORT
)) {
673 pr_err("can not offload authentication to userspace\n");
678 ether_addr_copy(vif
->bssid
, sme
->bssid
);
680 eth_zero_addr(vif
->bssid
);
682 ret
= qtnf_cmd_send_connect(vif
, sme
);
684 pr_err("VIF%u.%u: failed to connect\n",
685 vif
->mac
->macid
, vif
->vifid
);
694 qtnf_external_auth(struct wiphy
*wiphy
, struct net_device
*dev
,
695 struct cfg80211_external_auth_params
*auth
)
697 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
700 if (vif
->wdev
.iftype
== NL80211_IFTYPE_STATION
&&
701 !ether_addr_equal(vif
->bssid
, auth
->bssid
))
702 pr_warn("unexpected bssid: %pM", auth
->bssid
);
704 ret
= qtnf_cmd_send_external_auth(vif
, auth
);
706 pr_err("VIF%u.%u: failed to report external auth\n",
707 vif
->mac
->macid
, vif
->vifid
);
716 qtnf_disconnect(struct wiphy
*wiphy
, struct net_device
*dev
,
719 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
720 struct qtnf_vif
*vif
;
723 vif
= qtnf_mac_get_base_vif(mac
);
725 pr_err("MAC%u: primary VIF is not configured\n", mac
->macid
);
729 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_STATION
) {
734 ret
= qtnf_cmd_send_disconnect(vif
, reason_code
);
736 pr_err("VIF%u.%u: failed to disconnect\n",
737 mac
->macid
, vif
->vifid
);
739 if (vif
->wdev
.current_bss
) {
740 netif_carrier_off(vif
->netdev
);
741 cfg80211_disconnected(vif
->netdev
, reason_code
,
742 NULL
, 0, true, GFP_KERNEL
);
750 qtnf_dump_survey(struct wiphy
*wiphy
, struct net_device
*dev
,
751 int idx
, struct survey_info
*survey
)
753 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
754 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
755 struct ieee80211_supported_band
*sband
;
756 const struct cfg80211_chan_def
*chandef
= &wdev
->chandef
;
757 struct ieee80211_channel
*chan
;
760 sband
= wiphy
->bands
[NL80211_BAND_2GHZ
];
761 if (sband
&& idx
>= sband
->n_channels
) {
762 idx
-= sband
->n_channels
;
767 sband
= wiphy
->bands
[NL80211_BAND_5GHZ
];
769 if (!sband
|| idx
>= sband
->n_channels
)
772 chan
= &sband
->channels
[idx
];
773 survey
->channel
= chan
;
774 survey
->filled
= 0x0;
776 if (chan
== chandef
->chan
)
777 survey
->filled
= SURVEY_INFO_IN_USE
;
779 ret
= qtnf_cmd_get_chan_stats(mac
, chan
->center_freq
, survey
);
781 pr_debug("failed to get chan(%d) stats from card\n",
788 qtnf_get_channel(struct wiphy
*wiphy
, struct wireless_dev
*wdev
,
789 struct cfg80211_chan_def
*chandef
)
791 struct net_device
*ndev
= wdev
->netdev
;
792 struct qtnf_vif
*vif
;
798 vif
= qtnf_netdev_get_priv(wdev
->netdev
);
800 ret
= qtnf_cmd_get_channel(vif
, chandef
);
802 pr_err("%s: failed to get channel: %d\n", ndev
->name
, ret
);
807 if (!cfg80211_chandef_valid(chandef
)) {
808 pr_err("%s: bad channel freq=%u cf1=%u cf2=%u bw=%u\n",
809 ndev
->name
, chandef
->chan
->center_freq
,
810 chandef
->center_freq1
, chandef
->center_freq2
,
820 static int qtnf_channel_switch(struct wiphy
*wiphy
, struct net_device
*dev
,
821 struct cfg80211_csa_settings
*params
)
823 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
826 pr_debug("%s: chan(%u) count(%u) radar(%u) block_tx(%u)\n", dev
->name
,
827 params
->chandef
.chan
->hw_value
, params
->count
,
828 params
->radar_required
, params
->block_tx
);
830 if (!cfg80211_chandef_valid(¶ms
->chandef
)) {
831 pr_err("%s: invalid channel\n", dev
->name
);
835 ret
= qtnf_cmd_send_chan_switch(vif
, params
);
837 pr_warn("%s: failed to switch to channel (%u)\n",
838 dev
->name
, params
->chandef
.chan
->hw_value
);
843 static int qtnf_start_radar_detection(struct wiphy
*wiphy
,
844 struct net_device
*ndev
,
845 struct cfg80211_chan_def
*chandef
,
848 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(ndev
);
851 if (wiphy_ext_feature_isset(wiphy
, NL80211_EXT_FEATURE_DFS_OFFLOAD
))
854 ret
= qtnf_cmd_start_cac(vif
, chandef
, cac_time_ms
);
856 pr_err("%s: failed to start CAC ret=%d\n", ndev
->name
, ret
);
861 static int qtnf_set_mac_acl(struct wiphy
*wiphy
,
862 struct net_device
*dev
,
863 const struct cfg80211_acl_data
*params
)
865 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
868 ret
= qtnf_cmd_set_mac_acl(vif
, params
);
870 pr_err("%s: failed to set mac ACL ret=%d\n", dev
->name
, ret
);
875 static int qtnf_set_power_mgmt(struct wiphy
*wiphy
, struct net_device
*dev
,
876 bool enabled
, int timeout
)
878 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
881 ret
= qtnf_cmd_send_pm_set(vif
, enabled
? QLINK_PM_AUTO_STANDBY
:
882 QLINK_PM_OFF
, timeout
);
884 pr_err("%s: failed to set PM mode ret=%d\n", dev
->name
, ret
);
889 static int qtnf_get_tx_power(struct wiphy
*wiphy
, struct wireless_dev
*wdev
,
892 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(wdev
->netdev
);
895 ret
= qtnf_cmd_get_tx_power(vif
, dbm
);
897 pr_err("MAC%u: failed to get Tx power\n", vif
->mac
->macid
);
902 static int qtnf_set_tx_power(struct wiphy
*wiphy
, struct wireless_dev
*wdev
,
903 enum nl80211_tx_power_setting type
, int mbm
)
905 struct qtnf_vif
*vif
;
909 vif
= qtnf_netdev_get_priv(wdev
->netdev
);
911 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
913 vif
= qtnf_mac_get_base_vif(mac
);
915 pr_err("MAC%u: primary VIF is not configured\n",
921 ret
= qtnf_cmd_set_tx_power(vif
, type
, mbm
);
923 pr_err("MAC%u: failed to set Tx power\n", vif
->mac
->macid
);
928 static int qtnf_update_owe_info(struct wiphy
*wiphy
, struct net_device
*dev
,
929 struct cfg80211_update_owe_info
*owe_info
)
931 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(dev
);
934 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_AP
)
937 ret
= qtnf_cmd_send_update_owe(vif
, owe_info
);
939 pr_err("VIF%u.%u: failed to update owe info\n",
940 vif
->mac
->macid
, vif
->vifid
);
949 static int qtnf_suspend(struct wiphy
*wiphy
, struct cfg80211_wowlan
*wowlan
)
951 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
952 struct qtnf_vif
*vif
;
955 vif
= qtnf_mac_get_base_vif(mac
);
957 pr_err("MAC%u: primary VIF is not configured\n", mac
->macid
);
963 pr_debug("WoWLAN triggers are not enabled\n");
964 qtnf_virtual_intf_cleanup(vif
->netdev
);
968 qtnf_scan_done(vif
->mac
, true);
970 ret
= qtnf_cmd_send_wowlan_set(vif
, wowlan
);
972 pr_err("MAC%u: failed to set WoWLAN triggers\n",
981 static int qtnf_resume(struct wiphy
*wiphy
)
983 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
984 struct qtnf_vif
*vif
;
987 vif
= qtnf_mac_get_base_vif(mac
);
989 pr_err("MAC%u: primary VIF is not configured\n", mac
->macid
);
994 ret
= qtnf_cmd_send_wowlan_set(vif
, NULL
);
996 pr_err("MAC%u: failed to reset WoWLAN triggers\n",
1005 static void qtnf_set_wakeup(struct wiphy
*wiphy
, bool enabled
)
1007 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
1008 struct qtnf_bus
*bus
= mac
->bus
;
1010 device_set_wakeup_enable(bus
->dev
, enabled
);
1014 static struct cfg80211_ops qtn_cfg80211_ops
= {
1015 .add_virtual_intf
= qtnf_add_virtual_intf
,
1016 .change_virtual_intf
= qtnf_change_virtual_intf
,
1017 .del_virtual_intf
= qtnf_del_virtual_intf
,
1018 .start_ap
= qtnf_start_ap
,
1019 .change_beacon
= qtnf_change_beacon
,
1020 .stop_ap
= qtnf_stop_ap
,
1021 .set_wiphy_params
= qtnf_set_wiphy_params
,
1022 .update_mgmt_frame_registrations
=
1023 qtnf_update_mgmt_frame_registrations
,
1024 .mgmt_tx
= qtnf_mgmt_tx
,
1025 .change_station
= qtnf_change_station
,
1026 .del_station
= qtnf_del_station
,
1027 .get_station
= qtnf_get_station
,
1028 .dump_station
= qtnf_dump_station
,
1029 .add_key
= qtnf_add_key
,
1030 .del_key
= qtnf_del_key
,
1031 .set_default_key
= qtnf_set_default_key
,
1032 .set_default_mgmt_key
= qtnf_set_default_mgmt_key
,
1034 .connect
= qtnf_connect
,
1035 .external_auth
= qtnf_external_auth
,
1036 .disconnect
= qtnf_disconnect
,
1037 .dump_survey
= qtnf_dump_survey
,
1038 .get_channel
= qtnf_get_channel
,
1039 .channel_switch
= qtnf_channel_switch
,
1040 .start_radar_detection
= qtnf_start_radar_detection
,
1041 .set_mac_acl
= qtnf_set_mac_acl
,
1042 .set_power_mgmt
= qtnf_set_power_mgmt
,
1043 .get_tx_power
= qtnf_get_tx_power
,
1044 .set_tx_power
= qtnf_set_tx_power
,
1045 .update_owe_info
= qtnf_update_owe_info
,
1047 .suspend
= qtnf_suspend
,
1048 .resume
= qtnf_resume
,
1049 .set_wakeup
= qtnf_set_wakeup
,
1053 static void qtnf_cfg80211_reg_notifier(struct wiphy
*wiphy
,
1054 struct regulatory_request
*req
)
1056 struct qtnf_wmac
*mac
= wiphy_priv(wiphy
);
1057 enum nl80211_band band
;
1060 pr_debug("MAC%u: initiator=%d alpha=%c%c\n", mac
->macid
, req
->initiator
,
1061 req
->alpha2
[0], req
->alpha2
[1]);
1063 ret
= qtnf_cmd_reg_notify(mac
, req
, qtnf_slave_radar_get(),
1064 qtnf_dfs_offload_get());
1066 pr_err("MAC%u: failed to update region to %c%c: %d\n",
1067 mac
->macid
, req
->alpha2
[0], req
->alpha2
[1], ret
);
1071 for (band
= 0; band
< NUM_NL80211_BANDS
; ++band
) {
1072 if (!wiphy
->bands
[band
])
1075 ret
= qtnf_cmd_band_info_get(mac
, wiphy
->bands
[band
]);
1077 pr_err("MAC%u: failed to update band %u\n",
1082 struct wiphy
*qtnf_wiphy_allocate(struct qtnf_bus
*bus
,
1083 struct platform_device
*pdev
)
1085 struct wiphy
*wiphy
;
1087 if (qtnf_dfs_offload_get() &&
1088 qtnf_hwcap_is_set(&bus
->hw_info
, QLINK_HW_CAPAB_DFS_OFFLOAD
))
1089 qtn_cfg80211_ops
.start_radar_detection
= NULL
;
1091 if (!qtnf_hwcap_is_set(&bus
->hw_info
, QLINK_HW_CAPAB_PWR_MGMT
))
1092 qtn_cfg80211_ops
.set_power_mgmt
= NULL
;
1094 wiphy
= wiphy_new(&qtn_cfg80211_ops
, sizeof(struct qtnf_wmac
));
1099 set_wiphy_dev(wiphy
, &pdev
->dev
);
1101 set_wiphy_dev(wiphy
, bus
->dev
);
1107 qtnf_wiphy_setup_if_comb(struct wiphy
*wiphy
, struct qtnf_mac_info
*mac_info
)
1109 struct ieee80211_iface_combination
*if_comb
;
1111 u16 interface_modes
= 0;
1114 if_comb
= mac_info
->if_comb
;
1115 n_if_comb
= mac_info
->n_if_comb
;
1117 if (!if_comb
|| !n_if_comb
)
1120 for (i
= 0; i
< n_if_comb
; i
++) {
1121 if_comb
[i
].radar_detect_widths
= mac_info
->radar_detect_widths
;
1123 for (j
= 0; j
< if_comb
[i
].n_limits
; j
++)
1124 interface_modes
|= if_comb
[i
].limits
[j
].types
;
1127 wiphy
->iface_combinations
= if_comb
;
1128 wiphy
->n_iface_combinations
= n_if_comb
;
1129 wiphy
->interface_modes
= interface_modes
;
1134 int qtnf_wiphy_register(struct qtnf_hw_info
*hw_info
, struct qtnf_wmac
*mac
)
1136 struct wiphy
*wiphy
= priv_to_wiphy(mac
);
1137 struct qtnf_mac_info
*macinfo
= &mac
->macinfo
;
1139 bool regdomain_is_known
;
1142 pr_err("invalid wiphy pointer\n");
1146 wiphy
->frag_threshold
= macinfo
->frag_thr
;
1147 wiphy
->rts_threshold
= macinfo
->rts_thr
;
1148 wiphy
->retry_short
= macinfo
->sretry_limit
;
1149 wiphy
->retry_long
= macinfo
->lretry_limit
;
1150 wiphy
->coverage_class
= macinfo
->coverage_class
;
1152 wiphy
->max_scan_ssids
=
1153 (macinfo
->max_scan_ssids
) ? macinfo
->max_scan_ssids
: 1;
1154 wiphy
->max_scan_ie_len
= QTNF_MAX_VSIE_LEN
;
1155 wiphy
->mgmt_stypes
= qtnf_mgmt_stypes
;
1156 wiphy
->max_remain_on_channel_duration
= 5000;
1157 wiphy
->max_acl_mac_addrs
= macinfo
->max_acl_mac_addrs
;
1158 wiphy
->max_num_csa_counters
= 2;
1160 ret
= qtnf_wiphy_setup_if_comb(wiphy
, macinfo
);
1164 /* Initialize cipher suits */
1165 wiphy
->cipher_suites
= qtnf_cipher_suites
;
1166 wiphy
->n_cipher_suites
= ARRAY_SIZE(qtnf_cipher_suites
);
1167 wiphy
->signal_type
= CFG80211_SIGNAL_TYPE_MBM
;
1168 wiphy
->flags
|= WIPHY_FLAG_HAVE_AP_SME
|
1169 WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD
|
1170 WIPHY_FLAG_AP_UAPSD
|
1171 WIPHY_FLAG_HAS_CHANNEL_SWITCH
|
1172 WIPHY_FLAG_4ADDR_STATION
|
1173 WIPHY_FLAG_NETNS_OK
;
1174 wiphy
->flags
&= ~WIPHY_FLAG_PS_ON_BY_DEFAULT
;
1176 if (qtnf_dfs_offload_get() &&
1177 qtnf_hwcap_is_set(hw_info
, QLINK_HW_CAPAB_DFS_OFFLOAD
))
1178 wiphy_ext_feature_set(wiphy
, NL80211_EXT_FEATURE_DFS_OFFLOAD
);
1180 if (qtnf_hwcap_is_set(hw_info
, QLINK_HW_CAPAB_SCAN_DWELL
))
1181 wiphy_ext_feature_set(wiphy
,
1182 NL80211_EXT_FEATURE_SET_SCAN_DWELL
);
1184 wiphy
->probe_resp_offload
= NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS
|
1185 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2
;
1187 wiphy
->available_antennas_tx
= macinfo
->num_tx_chain
;
1188 wiphy
->available_antennas_rx
= macinfo
->num_rx_chain
;
1190 wiphy
->max_ap_assoc_sta
= macinfo
->max_ap_assoc_sta
;
1191 wiphy
->ht_capa_mod_mask
= &macinfo
->ht_cap_mod_mask
;
1192 wiphy
->vht_capa_mod_mask
= &macinfo
->vht_cap_mod_mask
;
1194 ether_addr_copy(wiphy
->perm_addr
, mac
->macaddr
);
1196 if (qtnf_hwcap_is_set(hw_info
, QLINK_HW_CAPAB_STA_INACT_TIMEOUT
))
1197 wiphy
->features
|= NL80211_FEATURE_INACTIVITY_TIMER
;
1199 if (qtnf_hwcap_is_set(hw_info
, QLINK_HW_CAPAB_SCAN_RANDOM_MAC_ADDR
))
1200 wiphy
->features
|= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR
;
1202 if (!qtnf_hwcap_is_set(hw_info
, QLINK_HW_CAPAB_OBSS_SCAN
))
1203 wiphy
->features
|= NL80211_FEATURE_NEED_OBSS_SCAN
;
1205 if (qtnf_hwcap_is_set(hw_info
, QLINK_HW_CAPAB_SAE
))
1206 wiphy
->features
|= NL80211_FEATURE_SAE
;
1209 if (macinfo
->wowlan
)
1210 wiphy
->wowlan
= macinfo
->wowlan
;
1213 regdomain_is_known
= isalpha(mac
->rd
->alpha2
[0]) &&
1214 isalpha(mac
->rd
->alpha2
[1]);
1216 if (qtnf_hwcap_is_set(hw_info
, QLINK_HW_CAPAB_REG_UPDATE
)) {
1217 wiphy
->reg_notifier
= qtnf_cfg80211_reg_notifier
;
1219 if (mac
->rd
->alpha2
[0] == '9' && mac
->rd
->alpha2
[1] == '9') {
1220 wiphy
->regulatory_flags
|= REGULATORY_CUSTOM_REG
|
1221 REGULATORY_STRICT_REG
;
1222 wiphy_apply_custom_regulatory(wiphy
, mac
->rd
);
1223 } else if (regdomain_is_known
) {
1224 wiphy
->regulatory_flags
|= REGULATORY_STRICT_REG
;
1227 wiphy
->regulatory_flags
|= REGULATORY_WIPHY_SELF_MANAGED
;
1230 if (mac
->macinfo
.extended_capabilities_len
) {
1231 wiphy
->extended_capabilities
=
1232 mac
->macinfo
.extended_capabilities
;
1233 wiphy
->extended_capabilities_mask
=
1234 mac
->macinfo
.extended_capabilities_mask
;
1235 wiphy
->extended_capabilities_len
=
1236 mac
->macinfo
.extended_capabilities_len
;
1239 strlcpy(wiphy
->fw_version
, hw_info
->fw_version
,
1240 sizeof(wiphy
->fw_version
));
1241 wiphy
->hw_version
= hw_info
->hw_version
;
1243 ret
= wiphy_register(wiphy
);
1247 if (wiphy
->regulatory_flags
& REGULATORY_WIPHY_SELF_MANAGED
)
1248 ret
= regulatory_set_wiphy_regd(wiphy
, mac
->rd
);
1249 else if (regdomain_is_known
)
1250 ret
= regulatory_hint(wiphy
, mac
->rd
->alpha2
);
1256 void qtnf_netdev_updown(struct net_device
*ndev
, bool up
)
1258 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(ndev
);
1260 if (qtnf_cmd_send_updown_intf(vif
, up
))
1261 pr_err("failed to send %s command to VIF%u.%u\n",
1262 up
? "UP" : "DOWN", vif
->mac
->macid
, vif
->vifid
);
1265 void qtnf_virtual_intf_cleanup(struct net_device
*ndev
)
1267 struct qtnf_vif
*vif
= qtnf_netdev_get_priv(ndev
);
1268 struct qtnf_wmac
*mac
= wiphy_priv(vif
->wdev
.wiphy
);
1270 if (vif
->wdev
.iftype
== NL80211_IFTYPE_STATION
)
1271 qtnf_disconnect(vif
->wdev
.wiphy
, ndev
,
1272 WLAN_REASON_DEAUTH_LEAVING
);
1274 qtnf_scan_done(mac
, true);
1277 void qtnf_cfg80211_vif_reset(struct qtnf_vif
*vif
)
1279 if (vif
->wdev
.iftype
== NL80211_IFTYPE_STATION
)
1280 cfg80211_disconnected(vif
->netdev
, WLAN_REASON_DEAUTH_LEAVING
,
1281 NULL
, 0, 1, GFP_KERNEL
);
1283 cfg80211_shutdown_all_interfaces(vif
->wdev
.wiphy
);
1286 void qtnf_band_init_rates(struct ieee80211_supported_band
*band
)
1288 switch (band
->band
) {
1289 case NL80211_BAND_2GHZ
:
1290 band
->bitrates
= qtnf_rates_2g
;
1291 band
->n_bitrates
= ARRAY_SIZE(qtnf_rates_2g
);
1293 case NL80211_BAND_5GHZ
:
1294 band
->bitrates
= qtnf_rates_5g
;
1295 band
->n_bitrates
= ARRAY_SIZE(qtnf_rates_5g
);
1298 band
->bitrates
= NULL
;
1299 band
->n_bitrates
= 0;