1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2012 - 2018 Microchip Technology Inc., and its subsidiaries.
9 #define GO_NEG_REQ 0x00
10 #define GO_NEG_RSP 0x01
11 #define GO_NEG_CONF 0x02
12 #define P2P_INV_REQ 0x03
13 #define P2P_INV_RSP 0x04
15 #define WILC_INVALID_CHANNEL 0
17 /* Operation at 2.4 GHz with channels 1-13 */
18 #define WILC_WLAN_OPERATING_CLASS_2_4GHZ 0x51
20 static const struct ieee80211_txrx_stypes
21 wilc_wfi_cfg80211_mgmt_types
[NUM_NL80211_IFTYPES
] = {
22 [NL80211_IFTYPE_STATION
] = {
24 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
25 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4)
27 [NL80211_IFTYPE_AP
] = {
29 .rx
= BIT(IEEE80211_STYPE_ASSOC_REQ
>> 4) |
30 BIT(IEEE80211_STYPE_REASSOC_REQ
>> 4) |
31 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4) |
32 BIT(IEEE80211_STYPE_DISASSOC
>> 4) |
33 BIT(IEEE80211_STYPE_AUTH
>> 4) |
34 BIT(IEEE80211_STYPE_DEAUTH
>> 4) |
35 BIT(IEEE80211_STYPE_ACTION
>> 4)
37 [NL80211_IFTYPE_P2P_CLIENT
] = {
39 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
40 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4) |
41 BIT(IEEE80211_STYPE_ASSOC_REQ
>> 4) |
42 BIT(IEEE80211_STYPE_REASSOC_REQ
>> 4) |
43 BIT(IEEE80211_STYPE_DISASSOC
>> 4) |
44 BIT(IEEE80211_STYPE_AUTH
>> 4) |
45 BIT(IEEE80211_STYPE_DEAUTH
>> 4)
49 static const struct wiphy_wowlan_support wowlan_support
= {
50 .flags
= WIPHY_WOWLAN_ANY
53 struct wilc_p2p_mgmt_data
{
58 struct wilc_p2p_pub_act_frame
{
68 struct wilc_vendor_specific_ie
{
76 struct wilc_attr_entry
{
82 struct wilc_attr_oper_ch
{
85 u8 country_code
[IEEE80211_COUNTRY_STRING_LEN
];
90 struct wilc_attr_ch_list
{
93 u8 country_code
[IEEE80211_COUNTRY_STRING_LEN
];
97 struct wilc_ch_list_elem
{
103 static void cfg_scan_result(enum scan_event scan_event
,
104 struct wilc_rcvd_net_info
*info
, void *user_void
)
106 struct wilc_priv
*priv
= user_void
;
108 if (!priv
->cfg_scanning
)
111 if (scan_event
== SCAN_EVENT_NETWORK_FOUND
) {
113 struct ieee80211_channel
*channel
;
114 struct cfg80211_bss
*bss
;
115 struct wiphy
*wiphy
= priv
->dev
->ieee80211_ptr
->wiphy
;
120 freq
= ieee80211_channel_to_frequency((s32
)info
->ch
,
122 channel
= ieee80211_get_channel(wiphy
, freq
);
126 bss
= cfg80211_inform_bss_frame(wiphy
, channel
, info
->mgmt
,
128 (s32
)info
->rssi
* 100,
131 cfg80211_put_bss(wiphy
, bss
);
132 } else if (scan_event
== SCAN_EVENT_DONE
) {
133 mutex_lock(&priv
->scan_req_lock
);
135 if (priv
->scan_req
) {
136 struct cfg80211_scan_info info
= {
140 cfg80211_scan_done(priv
->scan_req
, &info
);
141 priv
->cfg_scanning
= false;
142 priv
->scan_req
= NULL
;
144 mutex_unlock(&priv
->scan_req_lock
);
145 } else if (scan_event
== SCAN_EVENT_ABORTED
) {
146 mutex_lock(&priv
->scan_req_lock
);
148 if (priv
->scan_req
) {
149 struct cfg80211_scan_info info
= {
153 cfg80211_scan_done(priv
->scan_req
, &info
);
154 priv
->cfg_scanning
= false;
155 priv
->scan_req
= NULL
;
157 mutex_unlock(&priv
->scan_req_lock
);
161 static void cfg_connect_result(enum conn_event conn_disconn_evt
, u8 mac_status
,
164 struct wilc_priv
*priv
= priv_data
;
165 struct net_device
*dev
= priv
->dev
;
166 struct wilc_vif
*vif
= netdev_priv(dev
);
167 struct wilc
*wl
= vif
->wilc
;
168 struct host_if_drv
*wfi_drv
= priv
->hif_drv
;
169 struct wilc_conn_info
*conn_info
= &wfi_drv
->conn_info
;
170 struct wiphy
*wiphy
= dev
->ieee80211_ptr
->wiphy
;
172 vif
->connecting
= false;
174 if (conn_disconn_evt
== CONN_DISCONN_EVENT_CONN_RESP
) {
175 u16 connect_status
= conn_info
->status
;
177 if (mac_status
== WILC_MAC_STATUS_DISCONNECTED
&&
178 connect_status
== WLAN_STATUS_SUCCESS
) {
179 connect_status
= WLAN_STATUS_UNSPECIFIED_FAILURE
;
180 wilc_wlan_set_bssid(priv
->dev
, NULL
, WILC_STATION_MODE
);
182 if (vif
->iftype
!= WILC_CLIENT_MODE
)
183 wl
->sta_ch
= WILC_INVALID_CHANNEL
;
185 netdev_err(dev
, "Unspecified failure\n");
188 if (connect_status
== WLAN_STATUS_SUCCESS
)
189 memcpy(priv
->associated_bss
, conn_info
->bssid
,
192 cfg80211_ref_bss(wiphy
, vif
->bss
);
193 cfg80211_connect_bss(dev
, conn_info
->bssid
, vif
->bss
,
195 conn_info
->req_ies_len
,
197 conn_info
->resp_ies_len
,
198 connect_status
, GFP_KERNEL
,
199 NL80211_TIMEOUT_UNSPECIFIED
);
202 } else if (conn_disconn_evt
== CONN_DISCONN_EVENT_DISCONN_NOTIF
) {
205 eth_zero_addr(priv
->associated_bss
);
206 wilc_wlan_set_bssid(priv
->dev
, NULL
, WILC_STATION_MODE
);
208 if (vif
->iftype
!= WILC_CLIENT_MODE
) {
209 wl
->sta_ch
= WILC_INVALID_CHANNEL
;
217 cfg80211_disconnected(dev
, reason
, NULL
, 0, false, GFP_KERNEL
);
221 struct wilc_vif
*wilc_get_wl_to_vif(struct wilc
*wl
)
223 struct wilc_vif
*vif
;
225 vif
= list_first_or_null_rcu(&wl
->vif_list
, typeof(*vif
), list
);
227 return ERR_PTR(-EINVAL
);
232 static int set_channel(struct wiphy
*wiphy
,
233 struct cfg80211_chan_def
*chandef
)
235 struct wilc
*wl
= wiphy_priv(wiphy
);
236 struct wilc_vif
*vif
;
241 srcu_idx
= srcu_read_lock(&wl
->srcu
);
242 vif
= wilc_get_wl_to_vif(wl
);
244 srcu_read_unlock(&wl
->srcu
, srcu_idx
);
248 channelnum
= ieee80211_frequency_to_channel(chandef
->chan
->center_freq
);
250 wl
->op_ch
= channelnum
;
251 result
= wilc_set_mac_chnl_num(vif
, channelnum
);
253 netdev_err(vif
->ndev
, "Error in setting channel\n");
255 srcu_read_unlock(&wl
->srcu
, srcu_idx
);
259 static int scan(struct wiphy
*wiphy
, struct cfg80211_scan_request
*request
)
261 struct wilc_vif
*vif
= netdev_priv(request
->wdev
->netdev
);
262 struct wilc_priv
*priv
= &vif
->priv
;
265 u8 scan_ch_list
[WILC_MAX_NUM_SCANNED_CH
];
268 if (request
->n_channels
> WILC_MAX_NUM_SCANNED_CH
) {
269 netdev_err(vif
->ndev
, "Requested scanned channels over\n");
273 priv
->scan_req
= request
;
274 priv
->cfg_scanning
= true;
275 for (i
= 0; i
< request
->n_channels
; i
++) {
276 u16 freq
= request
->channels
[i
]->center_freq
;
278 scan_ch_list
[i
] = ieee80211_frequency_to_channel(freq
);
281 if (request
->n_ssids
)
282 scan_type
= WILC_FW_ACTIVE_SCAN
;
284 scan_type
= WILC_FW_PASSIVE_SCAN
;
286 ret
= wilc_scan(vif
, WILC_FW_USER_SCAN
, scan_type
, scan_ch_list
,
287 request
->n_channels
, cfg_scan_result
, (void *)priv
,
291 priv
->scan_req
= NULL
;
292 priv
->cfg_scanning
= false;
298 static int connect(struct wiphy
*wiphy
, struct net_device
*dev
,
299 struct cfg80211_connect_params
*sme
)
301 struct wilc_vif
*vif
= netdev_priv(dev
);
302 struct wilc_priv
*priv
= &vif
->priv
;
303 struct host_if_drv
*wfi_drv
= priv
->hif_drv
;
306 u8 security
= WILC_FW_SEC_NO
;
307 enum authtype auth_type
= WILC_FW_AUTH_ANY
;
309 struct cfg80211_bss
*bss
;
313 vif
->connecting
= true;
315 memset(priv
->wep_key
, 0, sizeof(priv
->wep_key
));
316 memset(priv
->wep_key_len
, 0, sizeof(priv
->wep_key_len
));
318 cipher_group
= sme
->crypto
.cipher_group
;
319 if (cipher_group
!= 0) {
320 if (cipher_group
== WLAN_CIPHER_SUITE_WEP40
) {
321 security
= WILC_FW_SEC_WEP
;
323 priv
->wep_key_len
[sme
->key_idx
] = sme
->key_len
;
324 memcpy(priv
->wep_key
[sme
->key_idx
], sme
->key
,
327 wilc_set_wep_default_keyid(vif
, sme
->key_idx
);
328 wilc_add_wep_key_bss_sta(vif
, sme
->key
, sme
->key_len
,
330 } else if (cipher_group
== WLAN_CIPHER_SUITE_WEP104
) {
331 security
= WILC_FW_SEC_WEP_EXTENDED
;
333 priv
->wep_key_len
[sme
->key_idx
] = sme
->key_len
;
334 memcpy(priv
->wep_key
[sme
->key_idx
], sme
->key
,
337 wilc_set_wep_default_keyid(vif
, sme
->key_idx
);
338 wilc_add_wep_key_bss_sta(vif
, sme
->key
, sme
->key_len
,
340 } else if (sme
->crypto
.wpa_versions
& NL80211_WPA_VERSION_2
) {
341 if (cipher_group
== WLAN_CIPHER_SUITE_TKIP
)
342 security
= WILC_FW_SEC_WPA2_TKIP
;
344 security
= WILC_FW_SEC_WPA2_AES
;
345 } else if (sme
->crypto
.wpa_versions
& NL80211_WPA_VERSION_1
) {
346 if (cipher_group
== WLAN_CIPHER_SUITE_TKIP
)
347 security
= WILC_FW_SEC_WPA_TKIP
;
349 security
= WILC_FW_SEC_WPA_AES
;
352 netdev_err(dev
, "%s: Unsupported cipher\n",
358 if ((sme
->crypto
.wpa_versions
& NL80211_WPA_VERSION_1
) ||
359 (sme
->crypto
.wpa_versions
& NL80211_WPA_VERSION_2
)) {
360 for (i
= 0; i
< sme
->crypto
.n_ciphers_pairwise
; i
++) {
361 u32 ciphers_pairwise
= sme
->crypto
.ciphers_pairwise
[i
];
363 if (ciphers_pairwise
== WLAN_CIPHER_SUITE_TKIP
)
364 security
|= WILC_FW_TKIP
;
366 security
|= WILC_FW_AES
;
370 switch (sme
->auth_type
) {
371 case NL80211_AUTHTYPE_OPEN_SYSTEM
:
372 auth_type
= WILC_FW_AUTH_OPEN_SYSTEM
;
375 case NL80211_AUTHTYPE_SHARED_KEY
:
376 auth_type
= WILC_FW_AUTH_SHARED_KEY
;
383 if (sme
->crypto
.n_akm_suites
) {
384 if (sme
->crypto
.akm_suites
[0] == WLAN_AKM_SUITE_8021X
)
385 auth_type
= WILC_FW_AUTH_IEEE8021
;
388 if (wfi_drv
->usr_scan_req
.scan_result
) {
389 netdev_err(vif
->ndev
, "%s: Scan in progress\n", __func__
);
394 bss
= cfg80211_get_bss(wiphy
, sme
->channel
, sme
->bssid
, sme
->ssid
,
395 sme
->ssid_len
, IEEE80211_BSS_TYPE_ANY
,
396 IEEE80211_PRIVACY(sme
->privacy
));
402 if (ether_addr_equal_unaligned(vif
->bssid
, bss
->bssid
)) {
407 join_params
= wilc_parse_join_bss_param(bss
, &sme
->crypto
);
409 netdev_err(dev
, "%s: failed to construct join param\n",
415 ch
= ieee80211_frequency_to_channel(bss
->channel
->center_freq
);
416 vif
->wilc
->op_ch
= ch
;
417 if (vif
->iftype
!= WILC_CLIENT_MODE
)
418 vif
->wilc
->sta_ch
= ch
;
420 wilc_wlan_set_bssid(dev
, bss
->bssid
, WILC_STATION_MODE
);
422 wfi_drv
->conn_info
.security
= security
;
423 wfi_drv
->conn_info
.auth_type
= auth_type
;
424 wfi_drv
->conn_info
.ch
= ch
;
425 wfi_drv
->conn_info
.conn_result
= cfg_connect_result
;
426 wfi_drv
->conn_info
.arg
= priv
;
427 wfi_drv
->conn_info
.param
= join_params
;
429 ret
= wilc_set_join_req(vif
, bss
->bssid
, sme
->ie
, sme
->ie_len
);
431 netdev_err(dev
, "wilc_set_join_req(): Error\n");
433 if (vif
->iftype
!= WILC_CLIENT_MODE
)
434 vif
->wilc
->sta_ch
= WILC_INVALID_CHANNEL
;
435 wilc_wlan_set_bssid(dev
, NULL
, WILC_STATION_MODE
);
436 wfi_drv
->conn_info
.conn_result
= NULL
;
442 cfg80211_put_bss(wiphy
, bss
);
446 cfg80211_put_bss(wiphy
, bss
);
449 vif
->connecting
= false;
453 static int disconnect(struct wiphy
*wiphy
, struct net_device
*dev
,
456 struct wilc_vif
*vif
= netdev_priv(dev
);
457 struct wilc_priv
*priv
= &vif
->priv
;
458 struct wilc
*wilc
= vif
->wilc
;
461 vif
->connecting
= false;
467 /* already disconnected done */
468 cfg80211_disconnected(dev
, 0, NULL
, 0, true, GFP_KERNEL
);
472 if (vif
->iftype
!= WILC_CLIENT_MODE
)
473 wilc
->sta_ch
= WILC_INVALID_CHANNEL
;
474 wilc_wlan_set_bssid(priv
->dev
, NULL
, WILC_STATION_MODE
);
476 priv
->hif_drv
->p2p_timeout
= 0;
478 ret
= wilc_disconnect(vif
);
480 netdev_err(priv
->dev
, "Error in disconnecting\n");
489 static inline void wilc_wfi_cfg_copy_wep_info(struct wilc_priv
*priv
,
491 struct key_params
*params
)
493 priv
->wep_key_len
[key_index
] = params
->key_len
;
494 memcpy(priv
->wep_key
[key_index
], params
->key
, params
->key_len
);
497 static int wilc_wfi_cfg_allocate_wpa_entry(struct wilc_priv
*priv
, u8 idx
)
499 if (!priv
->wilc_gtk
[idx
]) {
500 priv
->wilc_gtk
[idx
] = kzalloc(sizeof(*priv
->wilc_gtk
[idx
]),
502 if (!priv
->wilc_gtk
[idx
])
506 if (!priv
->wilc_ptk
[idx
]) {
507 priv
->wilc_ptk
[idx
] = kzalloc(sizeof(*priv
->wilc_ptk
[idx
]),
509 if (!priv
->wilc_ptk
[idx
])
516 static int wilc_wfi_cfg_copy_wpa_info(struct wilc_wfi_key
*key_info
,
517 struct key_params
*params
)
519 kfree(key_info
->key
);
521 key_info
->key
= kmemdup(params
->key
, params
->key_len
, GFP_KERNEL
);
525 kfree(key_info
->seq
);
527 if (params
->seq_len
> 0) {
528 key_info
->seq
= kmemdup(params
->seq
, params
->seq_len
,
534 key_info
->cipher
= params
->cipher
;
535 key_info
->key_len
= params
->key_len
;
536 key_info
->seq_len
= params
->seq_len
;
541 static int add_key(struct wiphy
*wiphy
, struct net_device
*netdev
, u8 key_index
,
542 bool pairwise
, const u8
*mac_addr
, struct key_params
*params
)
545 int ret
= 0, keylen
= params
->key_len
;
546 const u8
*rx_mic
= NULL
;
547 const u8
*tx_mic
= NULL
;
548 u8 mode
= WILC_FW_SEC_NO
;
550 struct wilc_vif
*vif
= netdev_priv(netdev
);
551 struct wilc_priv
*priv
= &vif
->priv
;
553 switch (params
->cipher
) {
554 case WLAN_CIPHER_SUITE_WEP40
:
555 case WLAN_CIPHER_SUITE_WEP104
:
556 if (priv
->wdev
.iftype
== NL80211_IFTYPE_AP
) {
557 wilc_wfi_cfg_copy_wep_info(priv
, key_index
, params
);
559 if (params
->cipher
== WLAN_CIPHER_SUITE_WEP40
)
560 mode
= WILC_FW_SEC_WEP
;
562 mode
= WILC_FW_SEC_WEP_EXTENDED
;
564 ret
= wilc_add_wep_key_bss_ap(vif
, params
->key
,
567 WILC_FW_AUTH_OPEN_SYSTEM
);
570 if (memcmp(params
->key
, priv
->wep_key
[key_index
],
572 wilc_wfi_cfg_copy_wep_info(priv
, key_index
, params
);
574 ret
= wilc_add_wep_key_bss_sta(vif
, params
->key
,
581 case WLAN_CIPHER_SUITE_TKIP
:
582 case WLAN_CIPHER_SUITE_CCMP
:
583 if (priv
->wdev
.iftype
== NL80211_IFTYPE_AP
||
584 priv
->wdev
.iftype
== NL80211_IFTYPE_P2P_GO
) {
585 struct wilc_wfi_key
*key
;
587 ret
= wilc_wfi_cfg_allocate_wpa_entry(priv
, key_index
);
591 if (params
->key_len
> 16 &&
592 params
->cipher
== WLAN_CIPHER_SUITE_TKIP
) {
593 tx_mic
= params
->key
+ 24;
594 rx_mic
= params
->key
+ 16;
595 keylen
= params
->key_len
- 16;
599 if (params
->cipher
== WLAN_CIPHER_SUITE_TKIP
)
600 mode
= WILC_FW_SEC_WPA_TKIP
;
602 mode
= WILC_FW_SEC_WPA2_AES
;
604 priv
->wilc_groupkey
= mode
;
606 key
= priv
->wilc_gtk
[key_index
];
608 if (params
->cipher
== WLAN_CIPHER_SUITE_TKIP
)
609 mode
= WILC_FW_SEC_WPA_TKIP
;
611 mode
= priv
->wilc_groupkey
| WILC_FW_AES
;
613 key
= priv
->wilc_ptk
[key_index
];
615 ret
= wilc_wfi_cfg_copy_wpa_info(key
, params
);
619 op_mode
= WILC_AP_MODE
;
621 if (params
->key_len
> 16 &&
622 params
->cipher
== WLAN_CIPHER_SUITE_TKIP
) {
623 rx_mic
= params
->key
+ 24;
624 tx_mic
= params
->key
+ 16;
625 keylen
= params
->key_len
- 16;
628 op_mode
= WILC_STATION_MODE
;
632 ret
= wilc_add_rx_gtk(vif
, params
->key
, keylen
,
633 key_index
, params
->seq_len
,
634 params
->seq
, rx_mic
, tx_mic
,
637 ret
= wilc_add_ptk(vif
, params
->key
, keylen
, mac_addr
,
638 rx_mic
, tx_mic
, op_mode
, mode
,
644 netdev_err(netdev
, "%s: Unsupported cipher\n", __func__
);
651 static int del_key(struct wiphy
*wiphy
, struct net_device
*netdev
,
656 struct wilc_vif
*vif
= netdev_priv(netdev
);
657 struct wilc_priv
*priv
= &vif
->priv
;
659 if (priv
->wilc_gtk
[key_index
]) {
660 kfree(priv
->wilc_gtk
[key_index
]->key
);
661 priv
->wilc_gtk
[key_index
]->key
= NULL
;
662 kfree(priv
->wilc_gtk
[key_index
]->seq
);
663 priv
->wilc_gtk
[key_index
]->seq
= NULL
;
665 kfree(priv
->wilc_gtk
[key_index
]);
666 priv
->wilc_gtk
[key_index
] = NULL
;
669 if (priv
->wilc_ptk
[key_index
]) {
670 kfree(priv
->wilc_ptk
[key_index
]->key
);
671 priv
->wilc_ptk
[key_index
]->key
= NULL
;
672 kfree(priv
->wilc_ptk
[key_index
]->seq
);
673 priv
->wilc_ptk
[key_index
]->seq
= NULL
;
674 kfree(priv
->wilc_ptk
[key_index
]);
675 priv
->wilc_ptk
[key_index
] = NULL
;
678 if (key_index
<= 3 && priv
->wep_key_len
[key_index
]) {
679 memset(priv
->wep_key
[key_index
], 0,
680 priv
->wep_key_len
[key_index
]);
681 priv
->wep_key_len
[key_index
] = 0;
682 wilc_remove_wep_key(vif
, key_index
);
688 static int get_key(struct wiphy
*wiphy
, struct net_device
*netdev
, u8 key_index
,
689 bool pairwise
, const u8
*mac_addr
, void *cookie
,
690 void (*callback
)(void *cookie
, struct key_params
*))
692 struct wilc_vif
*vif
= netdev_priv(netdev
);
693 struct wilc_priv
*priv
= &vif
->priv
;
694 struct key_params key_params
;
697 key_params
.key
= priv
->wilc_gtk
[key_index
]->key
;
698 key_params
.cipher
= priv
->wilc_gtk
[key_index
]->cipher
;
699 key_params
.key_len
= priv
->wilc_gtk
[key_index
]->key_len
;
700 key_params
.seq
= priv
->wilc_gtk
[key_index
]->seq
;
701 key_params
.seq_len
= priv
->wilc_gtk
[key_index
]->seq_len
;
703 key_params
.key
= priv
->wilc_ptk
[key_index
]->key
;
704 key_params
.cipher
= priv
->wilc_ptk
[key_index
]->cipher
;
705 key_params
.key_len
= priv
->wilc_ptk
[key_index
]->key_len
;
706 key_params
.seq
= priv
->wilc_ptk
[key_index
]->seq
;
707 key_params
.seq_len
= priv
->wilc_ptk
[key_index
]->seq_len
;
710 callback(cookie
, &key_params
);
715 static int set_default_key(struct wiphy
*wiphy
, struct net_device
*netdev
,
716 u8 key_index
, bool unicast
, bool multicast
)
718 struct wilc_vif
*vif
= netdev_priv(netdev
);
720 wilc_set_wep_default_keyid(vif
, key_index
);
725 static int get_station(struct wiphy
*wiphy
, struct net_device
*dev
,
726 const u8
*mac
, struct station_info
*sinfo
)
728 struct wilc_vif
*vif
= netdev_priv(dev
);
729 struct wilc_priv
*priv
= &vif
->priv
;
731 u32 associatedsta
= ~0;
732 u32 inactive_time
= 0;
734 if (vif
->iftype
== WILC_AP_MODE
|| vif
->iftype
== WILC_GO_MODE
) {
735 for (i
= 0; i
< NUM_STA_ASSOCIATED
; i
++) {
737 priv
->assoc_stainfo
.sta_associated_bss
[i
],
744 if (associatedsta
== ~0) {
745 netdev_err(dev
, "sta required is not associated\n");
749 sinfo
->filled
|= BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME
);
751 wilc_get_inactive_time(vif
, mac
, &inactive_time
);
752 sinfo
->inactive_time
= 1000 * inactive_time
;
753 } else if (vif
->iftype
== WILC_STATION_MODE
) {
754 struct rf_info stats
;
756 wilc_get_statistics(vif
, &stats
);
758 sinfo
->filled
|= BIT_ULL(NL80211_STA_INFO_SIGNAL
) |
759 BIT_ULL(NL80211_STA_INFO_RX_PACKETS
) |
760 BIT_ULL(NL80211_STA_INFO_TX_PACKETS
) |
761 BIT_ULL(NL80211_STA_INFO_TX_FAILED
) |
762 BIT_ULL(NL80211_STA_INFO_TX_BITRATE
);
764 sinfo
->signal
= stats
.rssi
;
765 sinfo
->rx_packets
= stats
.rx_cnt
;
766 sinfo
->tx_packets
= stats
.tx_cnt
+ stats
.tx_fail_cnt
;
767 sinfo
->tx_failed
= stats
.tx_fail_cnt
;
768 sinfo
->txrate
.legacy
= stats
.link_speed
* 10;
770 if (stats
.link_speed
> TCP_ACK_FILTER_LINK_SPEED_THRESH
&&
771 stats
.link_speed
!= DEFAULT_LINK_SPEED
)
772 wilc_enable_tcp_ack_filter(vif
, true);
773 else if (stats
.link_speed
!= DEFAULT_LINK_SPEED
)
774 wilc_enable_tcp_ack_filter(vif
, false);
779 static int change_bss(struct wiphy
*wiphy
, struct net_device
*dev
,
780 struct bss_parameters
*params
)
785 static int set_wiphy_params(struct wiphy
*wiphy
, u32 changed
)
788 struct cfg_param_attr cfg_param_val
;
789 struct wilc
*wl
= wiphy_priv(wiphy
);
790 struct wilc_vif
*vif
;
791 struct wilc_priv
*priv
;
794 srcu_idx
= srcu_read_lock(&wl
->srcu
);
795 vif
= wilc_get_wl_to_vif(wl
);
800 cfg_param_val
.flag
= 0;
802 if (changed
& WIPHY_PARAM_RETRY_SHORT
) {
803 netdev_dbg(vif
->ndev
,
804 "Setting WIPHY_PARAM_RETRY_SHORT %d\n",
806 cfg_param_val
.flag
|= WILC_CFG_PARAM_RETRY_SHORT
;
807 cfg_param_val
.short_retry_limit
= wiphy
->retry_short
;
809 if (changed
& WIPHY_PARAM_RETRY_LONG
) {
810 netdev_dbg(vif
->ndev
,
811 "Setting WIPHY_PARAM_RETRY_LONG %d\n",
813 cfg_param_val
.flag
|= WILC_CFG_PARAM_RETRY_LONG
;
814 cfg_param_val
.long_retry_limit
= wiphy
->retry_long
;
816 if (changed
& WIPHY_PARAM_FRAG_THRESHOLD
) {
817 if (wiphy
->frag_threshold
> 255 &&
818 wiphy
->frag_threshold
< 7937) {
819 netdev_dbg(vif
->ndev
,
820 "Setting WIPHY_PARAM_FRAG_THRESHOLD %d\n",
821 wiphy
->frag_threshold
);
822 cfg_param_val
.flag
|= WILC_CFG_PARAM_FRAG_THRESHOLD
;
823 cfg_param_val
.frag_threshold
= wiphy
->frag_threshold
;
825 netdev_err(vif
->ndev
,
826 "Fragmentation threshold out of range\n");
831 if (changed
& WIPHY_PARAM_RTS_THRESHOLD
) {
832 if (wiphy
->rts_threshold
> 255) {
833 netdev_dbg(vif
->ndev
,
834 "Setting WIPHY_PARAM_RTS_THRESHOLD %d\n",
835 wiphy
->rts_threshold
);
836 cfg_param_val
.flag
|= WILC_CFG_PARAM_RTS_THRESHOLD
;
837 cfg_param_val
.rts_threshold
= wiphy
->rts_threshold
;
839 netdev_err(vif
->ndev
, "RTS threshold out of range\n");
844 ret
= wilc_hif_set_cfg(vif
, &cfg_param_val
);
846 netdev_err(priv
->dev
, "Error in setting WIPHY PARAMS\n");
849 srcu_read_unlock(&wl
->srcu
, srcu_idx
);
853 static int set_pmksa(struct wiphy
*wiphy
, struct net_device
*netdev
,
854 struct cfg80211_pmksa
*pmksa
)
856 struct wilc_vif
*vif
= netdev_priv(netdev
);
857 struct wilc_priv
*priv
= &vif
->priv
;
862 for (i
= 0; i
< priv
->pmkid_list
.numpmkid
; i
++) {
863 if (!memcmp(pmksa
->bssid
, priv
->pmkid_list
.pmkidlist
[i
].bssid
,
869 if (i
< WILC_MAX_NUM_PMKIDS
) {
870 memcpy(priv
->pmkid_list
.pmkidlist
[i
].bssid
, pmksa
->bssid
,
872 memcpy(priv
->pmkid_list
.pmkidlist
[i
].pmkid
, pmksa
->pmkid
,
874 if (!(flag
== PMKID_FOUND
))
875 priv
->pmkid_list
.numpmkid
++;
877 netdev_err(netdev
, "Invalid PMKID index\n");
882 ret
= wilc_set_pmkid_info(vif
, &priv
->pmkid_list
);
887 static int del_pmksa(struct wiphy
*wiphy
, struct net_device
*netdev
,
888 struct cfg80211_pmksa
*pmksa
)
891 struct wilc_vif
*vif
= netdev_priv(netdev
);
892 struct wilc_priv
*priv
= &vif
->priv
;
894 for (i
= 0; i
< priv
->pmkid_list
.numpmkid
; i
++) {
895 if (!memcmp(pmksa
->bssid
, priv
->pmkid_list
.pmkidlist
[i
].bssid
,
897 memset(&priv
->pmkid_list
.pmkidlist
[i
], 0,
898 sizeof(struct wilc_pmkid
));
903 if (i
== priv
->pmkid_list
.numpmkid
)
906 for (; i
< (priv
->pmkid_list
.numpmkid
- 1); i
++) {
907 memcpy(priv
->pmkid_list
.pmkidlist
[i
].bssid
,
908 priv
->pmkid_list
.pmkidlist
[i
+ 1].bssid
,
910 memcpy(priv
->pmkid_list
.pmkidlist
[i
].pmkid
,
911 priv
->pmkid_list
.pmkidlist
[i
+ 1].pmkid
,
914 priv
->pmkid_list
.numpmkid
--;
919 static int flush_pmksa(struct wiphy
*wiphy
, struct net_device
*netdev
)
921 struct wilc_vif
*vif
= netdev_priv(netdev
);
923 memset(&vif
->priv
.pmkid_list
, 0, sizeof(struct wilc_pmkid_attr
));
928 static inline void wilc_wfi_cfg_parse_ch_attr(u8
*buf
, u32 len
, u8 sta_ch
)
930 struct wilc_attr_entry
*e
;
931 struct wilc_attr_ch_list
*ch_list
;
932 struct wilc_attr_oper_ch
*op_ch
;
937 if (sta_ch
== WILC_INVALID_CHANNEL
)
940 while (index
+ sizeof(*e
) <= len
) {
941 e
= (struct wilc_attr_entry
*)&buf
[index
];
942 if (e
->attr_type
== IEEE80211_P2P_ATTR_CHANNEL_LIST
)
944 else if (e
->attr_type
== IEEE80211_P2P_ATTR_OPER_CHANNEL
)
946 if (ch_list_idx
&& op_ch_idx
)
948 index
+= le16_to_cpu(e
->attr_len
) + sizeof(*e
);
953 struct wilc_ch_list_elem
*e
;
956 ch_list
= (struct wilc_attr_ch_list
*)&buf
[ch_list_idx
];
957 attr_size
= le16_to_cpu(ch_list
->attr_len
);
958 for (i
= 0; i
< attr_size
;) {
959 e
= (struct wilc_ch_list_elem
*)(ch_list
->elem
+ i
);
960 if (e
->op_class
== WILC_WLAN_OPERATING_CLASS_2_4GHZ
) {
961 memset(e
->ch_list
, sta_ch
, e
->no_of_channels
);
964 i
+= e
->no_of_channels
;
969 op_ch
= (struct wilc_attr_oper_ch
*)&buf
[op_ch_idx
];
970 op_ch
->op_class
= WILC_WLAN_OPERATING_CLASS_2_4GHZ
;
971 op_ch
->op_channel
= sta_ch
;
975 void wilc_wfi_p2p_rx(struct wilc_vif
*vif
, u8
*buff
, u32 size
)
977 struct wilc
*wl
= vif
->wilc
;
978 struct wilc_priv
*priv
= &vif
->priv
;
979 struct host_if_drv
*wfi_drv
= priv
->hif_drv
;
980 struct ieee80211_mgmt
*mgmt
;
981 struct wilc_vendor_specific_ie
*p
;
982 struct wilc_p2p_pub_act_frame
*d
;
983 int ie_offset
= offsetof(struct ieee80211_mgmt
, u
) + sizeof(*d
);
985 u32 header
, pkt_offset
;
988 header
= get_unaligned_le32(buff
- HOST_HDR_OFFSET
);
989 pkt_offset
= FIELD_GET(WILC_PKT_HDR_OFFSET_FIELD
, header
);
991 if (pkt_offset
& IS_MANAGMEMENT_CALLBACK
) {
993 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)buff
;
995 if (ieee80211_is_probe_resp(hdr
->frame_control
) ||
996 pkt_offset
& IS_MGMT_STATUS_SUCCES
)
999 cfg80211_mgmt_tx_status(&priv
->wdev
, priv
->tx_cookie
, buff
,
1000 size
, ack
, GFP_KERNEL
);
1004 freq
= ieee80211_channel_to_frequency(wl
->op_ch
, NL80211_BAND_2GHZ
);
1006 mgmt
= (struct ieee80211_mgmt
*)buff
;
1007 if (!ieee80211_is_action(mgmt
->frame_control
))
1010 if (priv
->cfg_scanning
&&
1011 time_after_eq(jiffies
, (unsigned long)wfi_drv
->p2p_timeout
)) {
1012 netdev_dbg(vif
->ndev
, "Receiving action wrong ch\n");
1016 if (!ieee80211_is_public_action((struct ieee80211_hdr
*)buff
, size
))
1019 d
= (struct wilc_p2p_pub_act_frame
*)(&mgmt
->u
.action
);
1020 if (d
->oui_subtype
!= GO_NEG_REQ
&& d
->oui_subtype
!= GO_NEG_RSP
&&
1021 d
->oui_subtype
!= P2P_INV_REQ
&& d
->oui_subtype
!= P2P_INV_RSP
)
1024 vendor_ie
= cfg80211_find_vendor_ie(WLAN_OUI_WFA
, WLAN_OUI_TYPE_WFA_P2P
,
1025 buff
+ ie_offset
, size
- ie_offset
);
1029 p
= (struct wilc_vendor_specific_ie
*)vendor_ie
;
1030 wilc_wfi_cfg_parse_ch_attr(p
->attr
, p
->tag_len
- 4, vif
->wilc
->sta_ch
);
1033 cfg80211_rx_mgmt(&priv
->wdev
, freq
, 0, buff
, size
, 0);
1036 static void wilc_wfi_mgmt_tx_complete(void *priv
, int status
)
1038 struct wilc_p2p_mgmt_data
*pv_data
= priv
;
1040 kfree(pv_data
->buff
);
1044 static void wilc_wfi_remain_on_channel_expired(void *data
, u64 cookie
)
1046 struct wilc_vif
*vif
= data
;
1047 struct wilc_priv
*priv
= &vif
->priv
;
1048 struct wilc_wfi_p2p_listen_params
*params
= &priv
->remain_on_ch_params
;
1050 if (cookie
!= params
->listen_cookie
)
1053 priv
->p2p_listen_state
= false;
1055 cfg80211_remain_on_channel_expired(&priv
->wdev
, params
->listen_cookie
,
1056 params
->listen_ch
, GFP_KERNEL
);
1059 static int remain_on_channel(struct wiphy
*wiphy
,
1060 struct wireless_dev
*wdev
,
1061 struct ieee80211_channel
*chan
,
1062 unsigned int duration
, u64
*cookie
)
1065 struct wilc_vif
*vif
= netdev_priv(wdev
->netdev
);
1066 struct wilc_priv
*priv
= &vif
->priv
;
1069 if (wdev
->iftype
== NL80211_IFTYPE_AP
) {
1070 netdev_dbg(vif
->ndev
, "Required while in AP mode\n");
1074 id
= ++priv
->inc_roc_cookie
;
1076 id
= ++priv
->inc_roc_cookie
;
1078 ret
= wilc_remain_on_channel(vif
, id
, duration
, chan
->hw_value
,
1079 wilc_wfi_remain_on_channel_expired
,
1084 vif
->wilc
->op_ch
= chan
->hw_value
;
1086 priv
->remain_on_ch_params
.listen_ch
= chan
;
1087 priv
->remain_on_ch_params
.listen_cookie
= id
;
1089 priv
->p2p_listen_state
= true;
1090 priv
->remain_on_ch_params
.listen_duration
= duration
;
1092 cfg80211_ready_on_channel(wdev
, *cookie
, chan
, duration
, GFP_KERNEL
);
1093 mod_timer(&vif
->hif_drv
->remain_on_ch_timer
,
1094 jiffies
+ msecs_to_jiffies(duration
+ 1000));
1099 static int cancel_remain_on_channel(struct wiphy
*wiphy
,
1100 struct wireless_dev
*wdev
,
1103 struct wilc_vif
*vif
= netdev_priv(wdev
->netdev
);
1104 struct wilc_priv
*priv
= &vif
->priv
;
1106 if (cookie
!= priv
->remain_on_ch_params
.listen_cookie
)
1109 return wilc_listen_state_expired(vif
, cookie
);
1112 static int mgmt_tx(struct wiphy
*wiphy
,
1113 struct wireless_dev
*wdev
,
1114 struct cfg80211_mgmt_tx_params
*params
,
1117 struct ieee80211_channel
*chan
= params
->chan
;
1118 unsigned int wait
= params
->wait
;
1119 const u8
*buf
= params
->buf
;
1120 size_t len
= params
->len
;
1121 const struct ieee80211_mgmt
*mgmt
;
1122 struct wilc_p2p_mgmt_data
*mgmt_tx
;
1123 struct wilc_vif
*vif
= netdev_priv(wdev
->netdev
);
1124 struct wilc_priv
*priv
= &vif
->priv
;
1125 struct host_if_drv
*wfi_drv
= priv
->hif_drv
;
1126 struct wilc_vendor_specific_ie
*p
;
1127 struct wilc_p2p_pub_act_frame
*d
;
1128 int ie_offset
= offsetof(struct ieee80211_mgmt
, u
) + sizeof(*d
);
1129 const u8
*vendor_ie
;
1132 *cookie
= prandom_u32();
1133 priv
->tx_cookie
= *cookie
;
1134 mgmt
= (const struct ieee80211_mgmt
*)buf
;
1136 if (!ieee80211_is_mgmt(mgmt
->frame_control
))
1139 mgmt_tx
= kmalloc(sizeof(*mgmt_tx
), GFP_KERNEL
);
1145 mgmt_tx
->buff
= kmemdup(buf
, len
, GFP_KERNEL
);
1146 if (!mgmt_tx
->buff
) {
1152 mgmt_tx
->size
= len
;
1154 if (ieee80211_is_probe_resp(mgmt
->frame_control
)) {
1155 wilc_set_mac_chnl_num(vif
, chan
->hw_value
);
1156 vif
->wilc
->op_ch
= chan
->hw_value
;
1157 goto out_txq_add_pkt
;
1160 if (!ieee80211_is_public_action((struct ieee80211_hdr
*)buf
, len
))
1161 goto out_set_timeout
;
1163 d
= (struct wilc_p2p_pub_act_frame
*)(&mgmt
->u
.action
);
1164 if (d
->oui_type
!= WLAN_OUI_TYPE_WFA_P2P
||
1165 d
->oui_subtype
!= GO_NEG_CONF
) {
1166 wilc_set_mac_chnl_num(vif
, chan
->hw_value
);
1167 vif
->wilc
->op_ch
= chan
->hw_value
;
1170 if (d
->oui_subtype
!= P2P_INV_REQ
&& d
->oui_subtype
!= P2P_INV_RSP
)
1171 goto out_set_timeout
;
1173 vendor_ie
= cfg80211_find_vendor_ie(WLAN_OUI_WFA
, WLAN_OUI_TYPE_WFA_P2P
,
1174 mgmt_tx
->buff
+ ie_offset
,
1177 goto out_set_timeout
;
1179 p
= (struct wilc_vendor_specific_ie
*)vendor_ie
;
1180 wilc_wfi_cfg_parse_ch_attr(p
->attr
, p
->tag_len
- 4, vif
->wilc
->sta_ch
);
1183 wfi_drv
->p2p_timeout
= (jiffies
+ msecs_to_jiffies(wait
));
1187 wilc_wlan_txq_add_mgmt_pkt(wdev
->netdev
, mgmt_tx
,
1188 mgmt_tx
->buff
, mgmt_tx
->size
,
1189 wilc_wfi_mgmt_tx_complete
);
1196 static int mgmt_tx_cancel_wait(struct wiphy
*wiphy
,
1197 struct wireless_dev
*wdev
,
1200 struct wilc_vif
*vif
= netdev_priv(wdev
->netdev
);
1201 struct wilc_priv
*priv
= &vif
->priv
;
1202 struct host_if_drv
*wfi_drv
= priv
->hif_drv
;
1204 wfi_drv
->p2p_timeout
= jiffies
;
1206 if (!priv
->p2p_listen_state
) {
1207 struct wilc_wfi_p2p_listen_params
*params
;
1209 params
= &priv
->remain_on_ch_params
;
1211 cfg80211_remain_on_channel_expired(wdev
,
1212 params
->listen_cookie
,
1220 void wilc_mgmt_frame_register(struct wiphy
*wiphy
, struct wireless_dev
*wdev
,
1221 u16 frame_type
, bool reg
)
1223 struct wilc
*wl
= wiphy_priv(wiphy
);
1224 struct wilc_vif
*vif
= netdev_priv(wdev
->netdev
);
1229 switch (frame_type
) {
1230 case IEEE80211_STYPE_PROBE_REQ
:
1231 vif
->frame_reg
[0].type
= frame_type
;
1232 vif
->frame_reg
[0].reg
= reg
;
1235 case IEEE80211_STYPE_ACTION
:
1236 vif
->frame_reg
[1].type
= frame_type
;
1237 vif
->frame_reg
[1].reg
= reg
;
1244 if (!wl
->initialized
)
1246 wilc_frame_register(vif
, frame_type
, reg
);
1249 static int set_cqm_rssi_config(struct wiphy
*wiphy
, struct net_device
*dev
,
1250 s32 rssi_thold
, u32 rssi_hyst
)
1255 static int dump_station(struct wiphy
*wiphy
, struct net_device
*dev
,
1256 int idx
, u8
*mac
, struct station_info
*sinfo
)
1258 struct wilc_vif
*vif
= netdev_priv(dev
);
1264 sinfo
->filled
|= BIT_ULL(NL80211_STA_INFO_SIGNAL
);
1266 ret
= wilc_get_rssi(vif
, &sinfo
->signal
);
1270 memcpy(mac
, vif
->priv
.associated_bss
, ETH_ALEN
);
1274 static int set_power_mgmt(struct wiphy
*wiphy
, struct net_device
*dev
,
1275 bool enabled
, int timeout
)
1277 struct wilc_vif
*vif
= netdev_priv(dev
);
1278 struct wilc_priv
*priv
= &vif
->priv
;
1283 wilc_set_power_mgmt(vif
, enabled
, timeout
);
1288 static int change_virtual_intf(struct wiphy
*wiphy
, struct net_device
*dev
,
1289 enum nl80211_iftype type
,
1290 struct vif_params
*params
)
1292 struct wilc
*wl
= wiphy_priv(wiphy
);
1293 struct wilc_vif
*vif
= netdev_priv(dev
);
1294 struct wilc_priv
*priv
= &vif
->priv
;
1297 case NL80211_IFTYPE_STATION
:
1298 vif
->connecting
= false;
1299 dev
->ieee80211_ptr
->iftype
= type
;
1300 priv
->wdev
.iftype
= type
;
1301 vif
->monitor_flag
= 0;
1302 if (vif
->iftype
== WILC_AP_MODE
|| vif
->iftype
== WILC_GO_MODE
)
1303 wilc_wfi_deinit_mon_interface(wl
, true);
1304 vif
->iftype
= WILC_STATION_MODE
;
1306 if (wl
->initialized
)
1307 wilc_set_operation_mode(vif
, wilc_get_vif_idx(vif
),
1308 WILC_STATION_MODE
, vif
->idx
);
1310 memset(priv
->assoc_stainfo
.sta_associated_bss
, 0,
1311 WILC_MAX_NUM_STA
* ETH_ALEN
);
1314 case NL80211_IFTYPE_P2P_CLIENT
:
1315 vif
->connecting
= false;
1316 dev
->ieee80211_ptr
->iftype
= type
;
1317 priv
->wdev
.iftype
= type
;
1318 vif
->monitor_flag
= 0;
1319 vif
->iftype
= WILC_CLIENT_MODE
;
1321 if (wl
->initialized
)
1322 wilc_set_operation_mode(vif
, wilc_get_vif_idx(vif
),
1323 WILC_STATION_MODE
, vif
->idx
);
1326 case NL80211_IFTYPE_AP
:
1327 dev
->ieee80211_ptr
->iftype
= type
;
1328 priv
->wdev
.iftype
= type
;
1329 vif
->iftype
= WILC_AP_MODE
;
1331 if (wl
->initialized
)
1332 wilc_set_operation_mode(vif
, wilc_get_vif_idx(vif
),
1333 WILC_AP_MODE
, vif
->idx
);
1336 case NL80211_IFTYPE_P2P_GO
:
1337 dev
->ieee80211_ptr
->iftype
= type
;
1338 priv
->wdev
.iftype
= type
;
1339 vif
->iftype
= WILC_GO_MODE
;
1341 if (wl
->initialized
)
1342 wilc_set_operation_mode(vif
, wilc_get_vif_idx(vif
),
1343 WILC_AP_MODE
, vif
->idx
);
1347 netdev_err(dev
, "Unknown interface type= %d\n", type
);
1354 static int start_ap(struct wiphy
*wiphy
, struct net_device
*dev
,
1355 struct cfg80211_ap_settings
*settings
)
1357 struct wilc_vif
*vif
= netdev_priv(dev
);
1360 ret
= set_channel(wiphy
, &settings
->chandef
);
1362 netdev_err(dev
, "Error in setting channel\n");
1364 wilc_wlan_set_bssid(dev
, dev
->dev_addr
, WILC_AP_MODE
);
1366 return wilc_add_beacon(vif
, settings
->beacon_interval
,
1367 settings
->dtim_period
, &settings
->beacon
);
1370 static int change_beacon(struct wiphy
*wiphy
, struct net_device
*dev
,
1371 struct cfg80211_beacon_data
*beacon
)
1373 struct wilc_vif
*vif
= netdev_priv(dev
);
1375 return wilc_add_beacon(vif
, 0, 0, beacon
);
1378 static int stop_ap(struct wiphy
*wiphy
, struct net_device
*dev
)
1381 struct wilc_vif
*vif
= netdev_priv(dev
);
1383 wilc_wlan_set_bssid(dev
, NULL
, WILC_AP_MODE
);
1385 ret
= wilc_del_beacon(vif
);
1388 netdev_err(dev
, "Host delete beacon fail\n");
1393 static int add_station(struct wiphy
*wiphy
, struct net_device
*dev
,
1394 const u8
*mac
, struct station_parameters
*params
)
1397 struct wilc_vif
*vif
= netdev_priv(dev
);
1398 struct wilc_priv
*priv
= &vif
->priv
;
1400 if (vif
->iftype
== WILC_AP_MODE
|| vif
->iftype
== WILC_GO_MODE
) {
1401 memcpy(priv
->assoc_stainfo
.sta_associated_bss
[params
->aid
], mac
,
1404 ret
= wilc_add_station(vif
, mac
, params
);
1406 netdev_err(dev
, "Host add station fail\n");
1412 static int del_station(struct wiphy
*wiphy
, struct net_device
*dev
,
1413 struct station_del_parameters
*params
)
1415 const u8
*mac
= params
->mac
;
1417 struct wilc_vif
*vif
= netdev_priv(dev
);
1418 struct wilc_priv
*priv
= &vif
->priv
;
1419 struct sta_info
*info
;
1421 if (!(vif
->iftype
== WILC_AP_MODE
|| vif
->iftype
== WILC_GO_MODE
))
1424 info
= &priv
->assoc_stainfo
;
1427 ret
= wilc_del_allstation(vif
, info
->sta_associated_bss
);
1429 ret
= wilc_del_station(vif
, mac
);
1431 netdev_err(dev
, "Host delete station fail\n");
1435 static int change_station(struct wiphy
*wiphy
, struct net_device
*dev
,
1436 const u8
*mac
, struct station_parameters
*params
)
1439 struct wilc_vif
*vif
= netdev_priv(dev
);
1441 if (vif
->iftype
== WILC_AP_MODE
|| vif
->iftype
== WILC_GO_MODE
) {
1442 ret
= wilc_edit_station(vif
, mac
, params
);
1444 netdev_err(dev
, "Host edit station fail\n");
1449 static struct wilc_vif
*wilc_get_vif_from_type(struct wilc
*wl
, int type
)
1451 struct wilc_vif
*vif
;
1453 list_for_each_entry_rcu(vif
, &wl
->vif_list
, list
) {
1454 if (vif
->iftype
== type
)
1461 static struct wireless_dev
*add_virtual_intf(struct wiphy
*wiphy
,
1463 unsigned char name_assign_type
,
1464 enum nl80211_iftype type
,
1465 struct vif_params
*params
)
1467 struct wilc
*wl
= wiphy_priv(wiphy
);
1468 struct wilc_vif
*vif
;
1469 struct wireless_dev
*wdev
;
1472 if (type
== NL80211_IFTYPE_MONITOR
) {
1473 struct net_device
*ndev
;
1476 srcu_idx
= srcu_read_lock(&wl
->srcu
);
1477 vif
= wilc_get_vif_from_type(wl
, WILC_AP_MODE
);
1479 vif
= wilc_get_vif_from_type(wl
, WILC_GO_MODE
);
1481 srcu_read_unlock(&wl
->srcu
, srcu_idx
);
1482 goto validate_interface
;
1486 if (vif
->monitor_flag
) {
1487 srcu_read_unlock(&wl
->srcu
, srcu_idx
);
1488 goto validate_interface
;
1491 ndev
= wilc_wfi_init_mon_interface(wl
, name
, vif
->ndev
);
1493 vif
->monitor_flag
= 1;
1495 srcu_read_unlock(&wl
->srcu
, srcu_idx
);
1496 return ERR_PTR(-EINVAL
);
1499 wdev
= &vif
->priv
.wdev
;
1500 srcu_read_unlock(&wl
->srcu
, srcu_idx
);
1505 mutex_lock(&wl
->vif_mutex
);
1506 if (wl
->vif_num
== WILC_NUM_CONCURRENT_IFC
) {
1507 pr_err("Reached maximum number of interface\n");
1508 mutex_unlock(&wl
->vif_mutex
);
1509 return ERR_PTR(-EINVAL
);
1511 mutex_unlock(&wl
->vif_mutex
);
1514 case NL80211_IFTYPE_STATION
:
1515 iftype
= WILC_STATION_MODE
;
1517 case NL80211_IFTYPE_AP
:
1518 iftype
= WILC_AP_MODE
;
1521 return ERR_PTR(-EOPNOTSUPP
);
1524 vif
= wilc_netdev_ifc_init(wl
, name
, iftype
, type
, true);
1526 return ERR_CAST(vif
);
1528 return &vif
->priv
.wdev
;
1531 static int del_virtual_intf(struct wiphy
*wiphy
, struct wireless_dev
*wdev
)
1533 struct wilc
*wl
= wiphy_priv(wiphy
);
1534 struct wilc_vif
*vif
;
1536 if (wdev
->iftype
== NL80211_IFTYPE_AP
||
1537 wdev
->iftype
== NL80211_IFTYPE_P2P_GO
)
1538 wilc_wfi_deinit_mon_interface(wl
, true);
1539 vif
= netdev_priv(wdev
->netdev
);
1540 cfg80211_stop_iface(wiphy
, wdev
, GFP_KERNEL
);
1541 unregister_netdevice(vif
->ndev
);
1542 vif
->monitor_flag
= 0;
1544 wilc_set_operation_mode(vif
, 0, 0, 0);
1545 mutex_lock(&wl
->vif_mutex
);
1546 list_del_rcu(&vif
->list
);
1548 mutex_unlock(&wl
->vif_mutex
);
1549 synchronize_srcu(&wl
->srcu
);
1553 static int wilc_suspend(struct wiphy
*wiphy
, struct cfg80211_wowlan
*wow
)
1555 struct wilc
*wl
= wiphy_priv(wiphy
);
1557 if (!wow
&& wilc_wlan_get_num_conn_ifcs(wl
))
1558 wl
->suspend_event
= true;
1560 wl
->suspend_event
= false;
1565 static int wilc_resume(struct wiphy
*wiphy
)
1570 static void wilc_set_wakeup(struct wiphy
*wiphy
, bool enabled
)
1572 struct wilc
*wl
= wiphy_priv(wiphy
);
1573 struct wilc_vif
*vif
;
1576 srcu_idx
= srcu_read_lock(&wl
->srcu
);
1577 vif
= wilc_get_wl_to_vif(wl
);
1579 srcu_read_unlock(&wl
->srcu
, srcu_idx
);
1583 netdev_info(vif
->ndev
, "cfg set wake up = %d\n", enabled
);
1584 srcu_read_unlock(&wl
->srcu
, srcu_idx
);
1587 static int set_tx_power(struct wiphy
*wiphy
, struct wireless_dev
*wdev
,
1588 enum nl80211_tx_power_setting type
, int mbm
)
1592 s32 tx_power
= MBM_TO_DBM(mbm
);
1593 struct wilc
*wl
= wiphy_priv(wiphy
);
1594 struct wilc_vif
*vif
;
1596 if (!wl
->initialized
)
1599 srcu_idx
= srcu_read_lock(&wl
->srcu
);
1600 vif
= wilc_get_wl_to_vif(wl
);
1602 srcu_read_unlock(&wl
->srcu
, srcu_idx
);
1606 netdev_info(vif
->ndev
, "Setting tx power %d\n", tx_power
);
1609 else if (tx_power
> 18)
1611 ret
= wilc_set_tx_power(vif
, tx_power
);
1613 netdev_err(vif
->ndev
, "Failed to set tx power\n");
1614 srcu_read_unlock(&wl
->srcu
, srcu_idx
);
1619 static int get_tx_power(struct wiphy
*wiphy
, struct wireless_dev
*wdev
,
1623 struct wilc_vif
*vif
= netdev_priv(wdev
->netdev
);
1624 struct wilc
*wl
= vif
->wilc
;
1626 /* If firmware is not started, return. */
1627 if (!wl
->initialized
)
1630 ret
= wilc_get_tx_power(vif
, (u8
*)dbm
);
1632 netdev_err(vif
->ndev
, "Failed to get tx power\n");
1637 static const struct cfg80211_ops wilc_cfg80211_ops
= {
1638 .set_monitor_channel
= set_channel
,
1641 .disconnect
= disconnect
,
1645 .set_default_key
= set_default_key
,
1646 .add_virtual_intf
= add_virtual_intf
,
1647 .del_virtual_intf
= del_virtual_intf
,
1648 .change_virtual_intf
= change_virtual_intf
,
1650 .start_ap
= start_ap
,
1651 .change_beacon
= change_beacon
,
1653 .add_station
= add_station
,
1654 .del_station
= del_station
,
1655 .change_station
= change_station
,
1656 .get_station
= get_station
,
1657 .dump_station
= dump_station
,
1658 .change_bss
= change_bss
,
1659 .set_wiphy_params
= set_wiphy_params
,
1661 .set_pmksa
= set_pmksa
,
1662 .del_pmksa
= del_pmksa
,
1663 .flush_pmksa
= flush_pmksa
,
1664 .remain_on_channel
= remain_on_channel
,
1665 .cancel_remain_on_channel
= cancel_remain_on_channel
,
1666 .mgmt_tx_cancel_wait
= mgmt_tx_cancel_wait
,
1668 .mgmt_frame_register
= wilc_mgmt_frame_register
,
1669 .set_power_mgmt
= set_power_mgmt
,
1670 .set_cqm_rssi_config
= set_cqm_rssi_config
,
1672 .suspend
= wilc_suspend
,
1673 .resume
= wilc_resume
,
1674 .set_wakeup
= wilc_set_wakeup
,
1675 .set_tx_power
= set_tx_power
,
1676 .get_tx_power
= get_tx_power
,
1680 static void wlan_init_locks(struct wilc
*wl
)
1682 mutex_init(&wl
->hif_cs
);
1683 mutex_init(&wl
->rxq_cs
);
1684 mutex_init(&wl
->cfg_cmd_lock
);
1685 mutex_init(&wl
->vif_mutex
);
1687 spin_lock_init(&wl
->txq_spinlock
);
1688 mutex_init(&wl
->txq_add_to_head_cs
);
1690 init_completion(&wl
->txq_event
);
1691 init_completion(&wl
->cfg_event
);
1692 init_completion(&wl
->sync_event
);
1693 init_completion(&wl
->txq_thread_started
);
1694 init_srcu_struct(&wl
->srcu
);
1697 void wlan_deinit_locks(struct wilc
*wilc
)
1699 mutex_destroy(&wilc
->hif_cs
);
1700 mutex_destroy(&wilc
->rxq_cs
);
1701 mutex_destroy(&wilc
->cfg_cmd_lock
);
1702 mutex_destroy(&wilc
->txq_add_to_head_cs
);
1703 mutex_destroy(&wilc
->vif_mutex
);
1704 cleanup_srcu_struct(&wilc
->srcu
);
1707 int wilc_cfg80211_init(struct wilc
**wilc
, struct device
*dev
, int io_type
,
1708 const struct wilc_hif_func
*ops
)
1711 struct wilc_vif
*vif
;
1714 wl
= wilc_create_wiphy(dev
);
1718 wlan_init_locks(wl
);
1720 ret
= wilc_wlan_cfg_init(wl
);
1725 wl
->io_type
= io_type
;
1727 wl
->chip_ps_state
= WILC_CHIP_WAKEDUP
;
1728 INIT_LIST_HEAD(&wl
->txq_head
.list
);
1729 INIT_LIST_HEAD(&wl
->rxq_head
.list
);
1730 INIT_LIST_HEAD(&wl
->vif_list
);
1732 wl
->hif_workqueue
= create_singlethread_workqueue("WILC_wq");
1733 if (!wl
->hif_workqueue
) {
1737 vif
= wilc_netdev_ifc_init(wl
, "wlan%d", WILC_STATION_MODE
,
1738 NL80211_IFTYPE_STATION
, false);
1747 destroy_workqueue(wl
->hif_workqueue
);
1750 wilc_wlan_cfg_deinit(wl
);
1753 wlan_deinit_locks(wl
);
1754 wiphy_unregister(wl
->wiphy
);
1755 wiphy_free(wl
->wiphy
);
1758 EXPORT_SYMBOL_GPL(wilc_cfg80211_init
);
1760 struct wilc
*wilc_create_wiphy(struct device
*dev
)
1762 struct wiphy
*wiphy
;
1766 wiphy
= wiphy_new(&wilc_cfg80211_ops
, sizeof(*wl
));
1770 wl
= wiphy_priv(wiphy
);
1772 memcpy(wl
->bitrates
, wilc_bitrates
, sizeof(wilc_bitrates
));
1773 memcpy(wl
->channels
, wilc_2ghz_channels
, sizeof(wilc_2ghz_channels
));
1774 wl
->band
.bitrates
= wl
->bitrates
;
1775 wl
->band
.n_bitrates
= ARRAY_SIZE(wl
->bitrates
);
1776 wl
->band
.channels
= wl
->channels
;
1777 wl
->band
.n_channels
= ARRAY_SIZE(wilc_2ghz_channels
);
1779 wl
->band
.ht_cap
.ht_supported
= 1;
1780 wl
->band
.ht_cap
.cap
|= (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT
);
1781 wl
->band
.ht_cap
.mcs
.rx_mask
[0] = 0xff;
1782 wl
->band
.ht_cap
.ampdu_factor
= IEEE80211_HT_MAX_AMPDU_8K
;
1783 wl
->band
.ht_cap
.ampdu_density
= IEEE80211_HT_MPDU_DENSITY_NONE
;
1785 wiphy
->bands
[NL80211_BAND_2GHZ
] = &wl
->band
;
1787 wiphy
->max_scan_ssids
= WILC_MAX_NUM_PROBED_SSID
;
1789 wiphy
->wowlan
= &wowlan_support
;
1791 wiphy
->max_num_pmkids
= WILC_MAX_NUM_PMKIDS
;
1792 wiphy
->max_scan_ie_len
= 1000;
1793 wiphy
->signal_type
= CFG80211_SIGNAL_TYPE_MBM
;
1794 memcpy(wl
->cipher_suites
, wilc_cipher_suites
,
1795 sizeof(wilc_cipher_suites
));
1796 wiphy
->cipher_suites
= wl
->cipher_suites
;
1797 wiphy
->n_cipher_suites
= ARRAY_SIZE(wilc_cipher_suites
);
1798 wiphy
->mgmt_stypes
= wilc_wfi_cfg80211_mgmt_types
;
1800 wiphy
->max_remain_on_channel_duration
= 500;
1801 wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
) |
1802 BIT(NL80211_IFTYPE_AP
) |
1803 BIT(NL80211_IFTYPE_MONITOR
) |
1804 BIT(NL80211_IFTYPE_P2P_GO
) |
1805 BIT(NL80211_IFTYPE_P2P_CLIENT
);
1806 wiphy
->flags
|= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
;
1808 set_wiphy_dev(wiphy
, dev
);
1810 ret
= wiphy_register(wiphy
);
1818 int wilc_init_host_int(struct net_device
*net
)
1821 struct wilc_vif
*vif
= netdev_priv(net
);
1822 struct wilc_priv
*priv
= &vif
->priv
;
1824 priv
->p2p_listen_state
= false;
1826 mutex_init(&priv
->scan_req_lock
);
1827 ret
= wilc_init(net
, &priv
->hif_drv
);
1829 netdev_err(net
, "Error while initializing hostinterface\n");
1834 void wilc_deinit_host_int(struct net_device
*net
)
1837 struct wilc_vif
*vif
= netdev_priv(net
);
1838 struct wilc_priv
*priv
= &vif
->priv
;
1840 priv
->p2p_listen_state
= false;
1842 flush_workqueue(vif
->wilc
->hif_workqueue
);
1843 mutex_destroy(&priv
->scan_req_lock
);
1844 ret
= wilc_deinit(vif
);
1847 netdev_err(net
, "Error while deinitializing host interface\n");