Lines Matching +full:get +full:- +full:wiphy

1 // SPDX-License-Identifier: GPL-2.0
6 * Holger Schurig <hs4233@mail.mn-solutions.de>
109 int ret = -ENOTSUPP; in lbs_auth_to_authtype()
132 * the hight-bit set for basic rates
170 * TLV-ID SSID 00 00 in lbs_add_ssid_tlv()
174 ssid_tlv->header.type = cpu_to_le16(TLV_TYPE_SSID); in lbs_add_ssid_tlv()
175 ssid_tlv->header.len = cpu_to_le16(ssid_len); in lbs_add_ssid_tlv()
176 memcpy(ssid_tlv->ssid, ssid, ssid_len); in lbs_add_ssid_tlv()
177 return sizeof(ssid_tlv->header) + ssid_len; in lbs_add_ssid_tlv()
184 * Actual channel data comes from priv->wdev->wiphy->channels.
194 (last_channel - priv->scan_channel); in lbs_add_channel_list_tlv()
199 * TLV-ID CHANLIST 01 01 in lbs_add_channel_list_tlv()
211 header->type = cpu_to_le16(TLV_TYPE_CHANLIST); in lbs_add_channel_list_tlv()
212 header->len = cpu_to_le16(chanscanparamsize); in lbs_add_channel_list_tlv()
215 /* lbs_deb_scan("scan: channels %d to %d\n", priv->scan_channel, in lbs_add_channel_list_tlv()
219 while (priv->scan_channel < last_channel) { in lbs_add_channel_list_tlv()
222 param->radiotype = CMD_SCAN_RADIO_TYPE_BG; in lbs_add_channel_list_tlv()
223 param->channumber = in lbs_add_channel_list_tlv()
224 priv->scan_req->channels[priv->scan_channel]->hw_value; in lbs_add_channel_list_tlv()
226 param->maxscantime = cpu_to_le16(LBS_DWELL_ACTIVE); in lbs_add_channel_list_tlv()
228 param->chanscanmode.passivescan = 1; in lbs_add_channel_list_tlv()
229 param->maxscantime = cpu_to_le16(LBS_DWELL_PASSIVE); in lbs_add_channel_list_tlv()
232 priv->scan_channel++; in lbs_add_channel_list_tlv()
257 * TLV-ID RATES 01 00 in lbs_add_supported_rates_tlv()
261 rate_tlv->header.type = cpu_to_le16(TLV_TYPE_RATES); in lbs_add_supported_rates_tlv()
262 tlv += sizeof(rate_tlv->header); in lbs_add_supported_rates_tlv()
265 rate_tlv->header.len = cpu_to_le16(i); in lbs_add_supported_rates_tlv()
266 return sizeof(rate_tlv->header) + i; in lbs_add_supported_rates_tlv()
315 rate_tlv->header.type = cpu_to_le16(TLV_TYPE_RATES); in lbs_add_common_rates_tlv()
316 tlv += sizeof(rate_tlv->header); in lbs_add_common_rates_tlv()
336 rate_tlv->header.len = cpu_to_le16(n); in lbs_add_common_rates_tlv()
337 return sizeof(rate_tlv->header) + n; in lbs_add_common_rates_tlv()
358 auth->header.type = cpu_to_le16(TLV_TYPE_AUTH_TYPE); in lbs_add_auth_type_tlv()
359 auth->header.len = cpu_to_le16(sizeof(*auth)-sizeof(auth->header)); in lbs_add_auth_type_tlv()
360 auth->auth = cpu_to_le16(lbs_auth_to_authtype(auth_type)); in lbs_add_auth_type_tlv()
380 ds->header.type = cpu_to_le16(TLV_TYPE_PHY_DS); in lbs_add_channel_tlv()
381 ds->header.len = cpu_to_le16(sizeof(*ds)-sizeof(ds->header)); in lbs_add_channel_tlv()
382 ds->channel = channel; in lbs_add_channel_tlv()
405 cf->header.type = cpu_to_le16(TLV_TYPE_CF); in lbs_add_cf_param_tlv()
406 cf->header.len = cpu_to_le16(sizeof(*cf)-sizeof(cf->header)); in lbs_add_cf_param_tlv()
428 if (!wpaie || wpaie->datalen > 128) in lbs_add_wpa_tlv()
441 wpatlv->header.type = cpu_to_le16(wpaie->id); in lbs_add_wpa_tlv()
442 wpatlv->header.len = cpu_to_le16(wpaie->datalen); in lbs_add_wpa_tlv()
443 memcpy(wpatlv->data, wpaie->data, wpaie->datalen); in lbs_add_wpa_tlv()
446 return sizeof(struct mrvl_ie_header) + wpaie->datalen; in lbs_add_wpa_tlv()
476 wpstlv->header.type = cpu_to_le16(TLV_TYPE_WPS_ENROLLEE); in lbs_add_wps_enrollee_tlv()
477 wpstlv->header.len = cpu_to_le16(wpsie->datalen); in lbs_add_wps_enrollee_tlv()
478 memcpy(wpstlv->data, wpsie->data, wpsie->datalen); in lbs_add_wps_enrollee_tlv()
481 return sizeof(struct mrvl_ie_header) + wpsie->datalen; in lbs_add_wps_enrollee_tlv()
488 static int lbs_cfg_set_monitor_channel(struct wiphy *wiphy, in lbs_cfg_set_monitor_channel() argument
492 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_cfg_set_monitor_channel()
493 int ret = -ENOTSUPP; in lbs_cfg_set_monitor_channel()
498 ret = lbs_set_channel(priv, chandef->chan->hw_value); in lbs_cfg_set_monitor_channel()
504 static int lbs_cfg_set_mesh_channel(struct wiphy *wiphy, in lbs_cfg_set_mesh_channel() argument
508 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_cfg_set_mesh_channel()
509 int ret = -ENOTSUPP; in lbs_cfg_set_mesh_channel()
511 if (netdev != priv->mesh_dev) in lbs_cfg_set_mesh_channel()
514 ret = lbs_mesh_set_channel(priv, channel->hw_value); in lbs_cfg_set_mesh_channel()
527 * When scanning, the firmware doesn't send a nul packet with the power-safe
536 * When the firmware reports back a scan-result, it gives us an "u8 rssi",
541 ((-(int)rssi + 3)*100)
553 int ret = -EILSEQ; in lbs_ret_scan()
555 bsssize = get_unaligned_le16(&scanresp->bssdescriptsize); in lbs_ret_scan()
558 scanresp->nr_sets, bsssize, le16_to_cpu(resp->size)); in lbs_ret_scan()
560 if (scanresp->nr_sets == 0) { in lbs_ret_scan()
590 pos = scanresp->bssdesc_and_tlvbuffer; in lbs_ret_scan()
592 lbs_deb_hex(LBS_DEB_SCAN, "SCAN_RSP", scanresp->bssdesc_and_tlvbuffer, in lbs_ret_scan()
596 tsfsize = 4 + 8 * scanresp->nr_sets; in lbs_ret_scan()
599 /* Validity check: we expect a Marvell-Local TLV */ in lbs_ret_scan()
613 if (i / 8 != scanresp->nr_sets) { in lbs_ret_scan()
615 "sets (expected %d got %d)\n", scanresp->nr_sets, in lbs_ret_scan()
620 for (i = 0; i < scanresp->nr_sets; i++) { in lbs_ret_scan()
628 int chan_no = -1; in lbs_ret_scan()
655 ielen = left = len - (6 + 1 + 8 + 2 + 2); in lbs_ret_scan()
660 left -= 2; in lbs_ret_scan()
672 left -= elen; in lbs_ret_scan()
677 if (chan_no != -1) { in lbs_ret_scan()
678 struct wiphy *wiphy = priv->wdev->wiphy; in lbs_ret_scan() local
682 ieee80211_get_channel(wiphy, freq); in lbs_ret_scan()
689 !(channel->flags & IEEE80211_CHAN_DISABLED)) { in lbs_ret_scan()
690 bss = cfg80211_inform_bss(wiphy, channel, in lbs_ret_scan()
696 cfg80211_put_bss(wiphy, bss); in lbs_ret_scan()
722 * Assumes priv->scan_req is initialized and valid
723 * Assumes priv->scan_channel is initialized
739 scan_cmd->bsstype = CMD_BSS_TYPE_ANY; in lbs_scan_worker()
742 running = !netif_queue_stopped(priv->dev); in lbs_scan_worker()
743 carrier = netif_carrier_ok(priv->dev); in lbs_scan_worker()
745 netif_stop_queue(priv->dev); in lbs_scan_worker()
747 netif_carrier_off(priv->dev); in lbs_scan_worker()
750 tlv = scan_cmd->tlvbuffer; in lbs_scan_worker()
753 if (priv->scan_req->n_ssids && priv->scan_req->ssids[0].ssid_len > 0) in lbs_scan_worker()
755 priv->scan_req->ssids[0].ssid, in lbs_scan_worker()
756 priv->scan_req->ssids[0].ssid_len); in lbs_scan_worker()
759 last_channel = priv->scan_channel + LBS_SCAN_BEFORE_NAP; in lbs_scan_worker()
760 if (last_channel > priv->scan_req->n_channels) in lbs_scan_worker()
761 last_channel = priv->scan_req->n_channels; in lbs_scan_worker()
763 priv->scan_req->n_ssids); in lbs_scan_worker()
769 if (priv->scan_req->ie && priv->scan_req->ie_len) in lbs_scan_worker()
770 tlv += lbs_add_wps_enrollee_tlv(tlv, priv->scan_req->ie, in lbs_scan_worker()
771 priv->scan_req->ie_len); in lbs_scan_worker()
773 if (priv->scan_channel < priv->scan_req->n_channels) { in lbs_scan_worker()
774 cancel_delayed_work(&priv->scan_work); in lbs_scan_worker()
775 if (netif_running(priv->dev)) in lbs_scan_worker()
776 queue_delayed_work(priv->work_thread, &priv->scan_work, in lbs_scan_worker()
781 scan_cmd->hdr.size = cpu_to_le16(tlv - (u8 *)scan_cmd); in lbs_scan_worker()
784 lbs_deb_hex(LBS_DEB_SCAN, "SCAN_TLV", scan_cmd->tlvbuffer, in lbs_scan_worker()
785 tlv - scan_cmd->tlvbuffer); in lbs_scan_worker()
787 __lbs_cmd(priv, CMD_802_11_SCAN, &scan_cmd->hdr, in lbs_scan_worker()
788 le16_to_cpu(scan_cmd->hdr.size), in lbs_scan_worker()
791 if (priv->scan_channel >= priv->scan_req->n_channels) { in lbs_scan_worker()
793 cancel_delayed_work(&priv->scan_work); in lbs_scan_worker()
799 netif_carrier_on(priv->dev); in lbs_scan_worker()
800 if (running && !priv->tx_pending_len) in lbs_scan_worker()
801 netif_wake_queue(priv->dev); in lbs_scan_worker()
806 if (priv->scan_req == NULL) { in lbs_scan_worker()
808 wake_up_all(&priv->scan_q); in lbs_scan_worker()
816 request->n_ssids, request->n_channels, request->ie_len); in _internal_start_scan()
818 priv->scan_channel = 0; in _internal_start_scan()
819 priv->scan_req = request; in _internal_start_scan()
820 priv->internal_scan = internal; in _internal_start_scan()
822 queue_delayed_work(priv->work_thread, &priv->scan_work, in _internal_start_scan()
827 * Clean up priv->scan_req. Should be used to handle the allocation details.
831 WARN_ON(!priv->scan_req); in lbs_scan_done()
833 if (priv->internal_scan) { in lbs_scan_done()
834 kfree(priv->scan_req); in lbs_scan_done()
840 cfg80211_scan_done(priv->scan_req, &info); in lbs_scan_done()
843 priv->scan_req = NULL; in lbs_scan_done()
846 static int lbs_cfg_scan(struct wiphy *wiphy, in lbs_cfg_scan() argument
849 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_cfg_scan()
852 if (priv->scan_req || delayed_work_pending(&priv->scan_work)) { in lbs_cfg_scan()
854 ret = -EAGAIN; in lbs_cfg_scan()
860 if (priv->surpriseremoved) in lbs_cfg_scan()
861 ret = -EIO; in lbs_cfg_scan()
877 cfg80211_disconnected(priv->dev, 0, NULL, 0, locally_generated, in lbs_send_disconnect_notification()
883 cfg80211_michael_mic_failure(priv->dev, in lbs_send_mic_failureevent()
884 priv->assoc_bss, in lbs_send_mic_failureevent()
888 -1, in lbs_send_mic_failureevent()
911 cmd.keyindex = cpu_to_le16(priv->wep_tx_key); in lbs_remove_wep_keys()
947 if (priv->wep_key_len[0] || priv->wep_key_len[1] || in lbs_set_wep_keys()
948 priv->wep_key_len[2] || priv->wep_key_len[3]) { in lbs_set_wep_keys()
952 cmd.keyindex = cpu_to_le16(priv->wep_tx_key); in lbs_set_wep_keys()
956 switch (priv->wep_key_len[i]) { in lbs_set_wep_keys()
967 memcpy(cmd.keymaterial[i], priv->wep_key[i], in lbs_set_wep_keys()
968 priv->wep_key_len[i]); in lbs_set_wep_keys()
1014 * get rid of WEXT, this should go into host.h
1050 cmd.param.length = cpu_to_le16(sizeof(cmd.param) - 4); in lbs_set_key_material()
1086 if (sme->bssid) in lbs_set_authtype()
1087 memcpy(cmd.bssid, sme->bssid, ETH_ALEN); in lbs_set_authtype()
1089 ret = lbs_auth_to_authtype(sme->auth_type); in lbs_set_authtype()
1127 ret = -ENOMEM; in lbs_associate()
1130 pos = &cmd->iebuf[0]; in lbs_associate()
1144 cmd->hdr.command = cpu_to_le16(CMD_802_11_ASSOCIATE); in lbs_associate()
1147 memcpy(cmd->bssid, bss->bssid, ETH_ALEN); in lbs_associate()
1148 cmd->listeninterval = cpu_to_le16(MRVDRV_DEFAULT_LISTEN_INTERVAL); in lbs_associate()
1149 cmd->capability = cpu_to_le16(bss->capability); in lbs_associate()
1164 if (bss->channel) in lbs_associate()
1165 pos += lbs_add_channel_tlv(pos, bss->channel->hw_value); in lbs_associate()
1175 lbs_deb_hex(LBS_DEB_ASSOC, "Common Rates", tmp, pos - tmp); in lbs_associate()
1178 if (MRVL_FW_MAJOR_REV(priv->fwrelease) >= 9) in lbs_associate()
1179 pos += lbs_add_auth_type_tlv(pos, sme->auth_type); in lbs_associate()
1182 if (sme->ie && sme->ie_len) in lbs_associate()
1183 pos += lbs_add_wpa_tlv(pos, sme->ie, sme->ie_len); in lbs_associate()
1185 len = sizeof(*cmd) + (u16)(pos - (u8 *) &cmd->iebuf); in lbs_associate()
1186 cmd->hdr.size = cpu_to_le16(len); in lbs_associate()
1189 le16_to_cpu(cmd->hdr.size)); in lbs_associate()
1192 memcpy(priv->assoc_bss, bss->bssid, ETH_ALEN); in lbs_associate()
1201 status = le16_to_cpu(resp->statuscode); in lbs_associate()
1204 * response to the following values returned in resp->statuscode: in lbs_associate()
1207 * 0 -> 0x0000 ASSOC_RESULT_SUCCESS in lbs_associate()
1208 * 13 -> 0x0004 ASSOC_RESULT_AUTH_REFUSED in lbs_associate()
1209 * 14 -> 0x0004 ASSOC_RESULT_AUTH_REFUSED in lbs_associate()
1210 * 15 -> 0x0004 ASSOC_RESULT_AUTH_REFUSED in lbs_associate()
1211 * 16 -> 0x0004 ASSOC_RESULT_AUTH_REFUSED in lbs_associate()
1212 * others -> 0x0003 ASSOC_RESULT_REFUSED in lbs_associate()
1215 * 0x0001 -> ASSOC_RESULT_INVALID_PARAMETERS (unused) in lbs_associate()
1216 * 0x0002 -> ASSOC_RESULT_TIMEOUT (internal timer expired waiting for in lbs_associate()
1219 if (MRVL_FW_MAJOR_REV(priv->fwrelease) <= 8) { in lbs_associate()
1249 "aid 0x%04x\n", status, le16_to_cpu(resp->statuscode), in lbs_associate()
1250 le16_to_cpu(resp->capability), le16_to_cpu(resp->aid)); in lbs_associate()
1252 resp_ie_len = le16_to_cpu(resp->hdr.size) in lbs_associate()
1253 - sizeof(resp->hdr) in lbs_associate()
1254 - 6; in lbs_associate()
1255 cfg80211_connect_result(priv->dev, in lbs_associate()
1256 priv->assoc_bss, in lbs_associate()
1257 sme->ie, sme->ie_len, in lbs_associate()
1258 resp->iebuf, resp_ie_len, in lbs_associate()
1263 /* TODO: get rid of priv->connect_status */ in lbs_associate()
1264 priv->connect_status = LBS_CONNECTED; in lbs_associate()
1265 netif_carrier_on(priv->dev); in lbs_associate()
1266 if (!priv->tx_pending_len) in lbs_associate()
1267 netif_tx_wake_all_queues(priv->dev); in lbs_associate()
1276 _new_connect_scan_req(struct wiphy *wiphy, struct cfg80211_connect_params *sme) in _new_connect_scan_req() argument
1279 int i, n_channels = ieee80211_get_num_supported_channels(wiphy); in _new_connect_scan_req()
1289 creq->ssids = (void *)&creq->channels[n_channels]; in _new_connect_scan_req()
1290 creq->n_channels = n_channels; in _new_connect_scan_req()
1291 creq->n_ssids = 1; in _new_connect_scan_req()
1298 if (!wiphy->bands[band]) in _new_connect_scan_req()
1301 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in _new_connect_scan_req()
1303 if (wiphy->bands[band]->channels[j].flags & in _new_connect_scan_req()
1307 creq->channels[i] = &wiphy->bands[band]->channels[j]; in _new_connect_scan_req()
1312 /* Set real number of channels specified in creq->channels[] */ in _new_connect_scan_req()
1313 creq->n_channels = i; in _new_connect_scan_req()
1316 memcpy(creq->ssids[0].ssid, sme->ssid, sme->ssid_len); in _new_connect_scan_req()
1317 creq->ssids[0].ssid_len = sme->ssid_len; in _new_connect_scan_req()
1327 static int lbs_cfg_connect(struct wiphy *wiphy, struct net_device *dev, in lbs_cfg_connect() argument
1330 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_cfg_connect()
1335 if (dev == priv->mesh_dev) in lbs_cfg_connect()
1336 return -EOPNOTSUPP; in lbs_cfg_connect()
1338 if (!sme->bssid) { in lbs_cfg_connect()
1346 wait_event_interruptible_timeout(priv->scan_q, in lbs_cfg_connect()
1347 (priv->scan_req == NULL), in lbs_cfg_connect()
1350 creq = _new_connect_scan_req(wiphy, sme); in lbs_cfg_connect()
1352 ret = -EINVAL; in lbs_cfg_connect()
1360 wait_event_interruptible_timeout(priv->scan_q, in lbs_cfg_connect()
1361 (priv->scan_req == NULL), in lbs_cfg_connect()
1367 bss = cfg80211_get_bss(wiphy, sme->channel, sme->bssid, in lbs_cfg_connect()
1368 sme->ssid, sme->ssid_len, IEEE80211_BSS_TYPE_ESS, in lbs_cfg_connect()
1371 wiphy_err(wiphy, "assoc: bss %pM not in scan results\n", in lbs_cfg_connect()
1372 sme->bssid); in lbs_cfg_connect()
1373 ret = -ENOENT; in lbs_cfg_connect()
1376 lbs_deb_assoc("trying %pM\n", bss->bssid); in lbs_cfg_connect()
1378 sme->crypto.cipher_group, in lbs_cfg_connect()
1379 sme->key_idx, sme->key_len); in lbs_cfg_connect()
1382 priv->wep_tx_key = 0; in lbs_cfg_connect()
1383 memset(priv->wep_key, 0, sizeof(priv->wep_key)); in lbs_cfg_connect()
1384 memset(priv->wep_key_len, 0, sizeof(priv->wep_key_len)); in lbs_cfg_connect()
1387 switch (sme->crypto.cipher_group) { in lbs_cfg_connect()
1390 /* Store provided WEP keys in priv-> */ in lbs_cfg_connect()
1391 priv->wep_tx_key = sme->key_idx; in lbs_cfg_connect()
1392 priv->wep_key_len[sme->key_idx] = sme->key_len; in lbs_cfg_connect()
1393 memcpy(priv->wep_key[sme->key_idx], sme->key, sme->key_len); in lbs_cfg_connect()
1396 priv->mac_control |= CMD_ACT_MAC_WEP_ENABLE; in lbs_cfg_connect()
1407 * Therefore: fall-through in lbs_cfg_connect()
1413 priv->mac_control &= ~CMD_ACT_MAC_WEP_ENABLE; in lbs_cfg_connect()
1426 lbs_enable_rsn(priv, sme->crypto.cipher_group != 0); in lbs_cfg_connect()
1429 wiphy_err(wiphy, "unsupported cipher group 0x%x\n", in lbs_cfg_connect()
1430 sme->crypto.cipher_group); in lbs_cfg_connect()
1431 ret = -ENOTSUPP; in lbs_cfg_connect()
1436 if (ret == -ENOTSUPP) { in lbs_cfg_connect()
1437 wiphy_err(wiphy, "unsupported authtype 0x%x\n", sme->auth_type); in lbs_cfg_connect()
1448 cfg80211_put_bss(wiphy, bss); in lbs_cfg_connect()
1460 memcpy(cmd.macaddr, &priv->assoc_bss, ETH_ALEN); in lbs_disconnect()
1467 cfg80211_disconnected(priv->dev, in lbs_disconnect()
1471 priv->connect_status = LBS_DISCONNECTED; in lbs_disconnect()
1476 static int lbs_cfg_disconnect(struct wiphy *wiphy, struct net_device *dev, in lbs_cfg_disconnect() argument
1479 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_cfg_disconnect()
1481 if (dev == priv->mesh_dev) in lbs_cfg_disconnect()
1482 return -EOPNOTSUPP; in lbs_cfg_disconnect()
1485 priv->disassoc_reason = reason_code; in lbs_cfg_disconnect()
1490 static int lbs_cfg_set_default_key(struct wiphy *wiphy, in lbs_cfg_set_default_key() argument
1495 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_cfg_set_default_key()
1497 if (netdev == priv->mesh_dev) in lbs_cfg_set_default_key()
1498 return -EOPNOTSUPP; in lbs_cfg_set_default_key()
1500 if (key_index != priv->wep_tx_key) { in lbs_cfg_set_default_key()
1502 priv->wep_tx_key = key_index; in lbs_cfg_set_default_key()
1510 static int lbs_cfg_add_key(struct wiphy *wiphy, struct net_device *netdev, in lbs_cfg_add_key() argument
1514 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_cfg_add_key()
1519 if (netdev == priv->mesh_dev) in lbs_cfg_add_key()
1520 return -EOPNOTSUPP; in lbs_cfg_add_key()
1523 params->cipher, mac_addr); in lbs_cfg_add_key()
1525 idx, params->key_len); in lbs_cfg_add_key()
1526 if (params->key_len) in lbs_cfg_add_key()
1528 params->key, params->key_len); in lbs_cfg_add_key()
1530 lbs_deb_assoc("add_key: seq len %d\n", params->seq_len); in lbs_cfg_add_key()
1531 if (params->seq_len) in lbs_cfg_add_key()
1533 params->seq, params->seq_len); in lbs_cfg_add_key()
1535 switch (params->cipher) { in lbs_cfg_add_key()
1539 if ((priv->wep_key_len[idx] != params->key_len) || in lbs_cfg_add_key()
1540 memcmp(priv->wep_key[idx], in lbs_cfg_add_key()
1541 params->key, params->key_len) != 0) { in lbs_cfg_add_key()
1542 priv->wep_key_len[idx] = params->key_len; in lbs_cfg_add_key()
1543 memcpy(priv->wep_key[idx], in lbs_cfg_add_key()
1544 params->key, params->key_len); in lbs_cfg_add_key()
1553 key_type = (params->cipher == WLAN_CIPHER_SUITE_TKIP) in lbs_cfg_add_key()
1559 params->key, params->key_len); in lbs_cfg_add_key()
1562 wiphy_err(wiphy, "unhandled cipher 0x%x\n", params->cipher); in lbs_cfg_add_key()
1563 ret = -ENOTSUPP; in lbs_cfg_add_key()
1571 static int lbs_cfg_del_key(struct wiphy *wiphy, struct net_device *netdev, in lbs_cfg_del_key() argument
1580 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_cfg_del_key()
1582 * I think can keep this a NO-OP, because: in lbs_cfg_del_key()
1584 * - we clear all keys whenever we do lbs_cfg_connect() anyway in lbs_cfg_del_key()
1585 * - neither "iw" nor "wpa_supplicant" won't call this during in lbs_cfg_del_key()
1587 * - TODO: but I have to check if this is still true when in lbs_cfg_del_key()
1588 * I set the AP to periodic re-keying in lbs_cfg_del_key()
1589 * - we've not kzallec() something when we've added a key at in lbs_cfg_del_key()
1596 if (key_index < 3 && priv->wep_key_len[key_index]) { in lbs_cfg_del_key()
1597 priv->wep_key_len[key_index] = 0; in lbs_cfg_del_key()
1607 * Get station
1610 static int lbs_cfg_get_station(struct wiphy *wiphy, struct net_device *dev, in lbs_cfg_get_station() argument
1613 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_cfg_get_station()
1618 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES) | in lbs_cfg_get_station()
1622 sinfo->tx_bytes = priv->dev->stats.tx_bytes; in lbs_cfg_get_station()
1623 sinfo->tx_packets = priv->dev->stats.tx_packets; in lbs_cfg_get_station()
1624 sinfo->rx_bytes = priv->dev->stats.rx_bytes; in lbs_cfg_get_station()
1625 sinfo->rx_packets = priv->dev->stats.rx_packets; in lbs_cfg_get_station()
1627 /* Get current RSSI */ in lbs_cfg_get_station()
1630 sinfo->signal = signal; in lbs_cfg_get_station()
1631 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in lbs_cfg_get_station()
1634 /* Convert priv->cur_rate from hw_value to NL80211 value */ in lbs_cfg_get_station()
1636 if (priv->cur_rate == lbs_rates[i].hw_value) { in lbs_cfg_get_station()
1637 sinfo->txrate.legacy = lbs_rates[i].bitrate; in lbs_cfg_get_station()
1638 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in lbs_cfg_get_station()
1653 static int lbs_change_intf(struct wiphy *wiphy, struct net_device *dev, in lbs_change_intf() argument
1657 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_change_intf()
1660 if (dev == priv->mesh_dev) in lbs_change_intf()
1661 return -EOPNOTSUPP; in lbs_change_intf()
1669 return -EOPNOTSUPP; in lbs_change_intf()
1672 if (priv->iface_running) in lbs_change_intf()
1676 priv->wdev->iftype = type; in lbs_change_intf()
1684 * IBSS (Ad-Hoc)
1688 * The firmware needs the following bits masked out of the beacon-derived
1708 * For cfg80211_inform_bss, we'll need a fake IE, as we can't get in lbs_join_post()
1714 *fake++ = params->ssid_len; in lbs_join_post()
1715 memcpy(fake, params->ssid, params->ssid_len); in lbs_join_post()
1716 fake += params->ssid_len; in lbs_join_post()
1727 *fake++ = params->chandef.chan->hw_value; in lbs_join_post()
1745 lbs_deb_hex(LBS_DEB_CFG80211, "IE", fake_ie, fake - fake_ie); in lbs_join_post()
1747 bss = cfg80211_inform_bss(priv->wdev->wiphy, in lbs_join_post()
1748 params->chandef.chan, in lbs_join_post()
1753 params->beacon_interval, in lbs_join_post()
1754 fake_ie, fake - fake_ie, in lbs_join_post()
1756 cfg80211_put_bss(priv->wdev->wiphy, bss); in lbs_join_post()
1758 cfg80211_ibss_joined(priv->dev, bssid, params->chandef.chan, in lbs_join_post()
1762 priv->connect_status = LBS_CONNECTED; in lbs_join_post()
1763 netif_carrier_on(priv->dev); in lbs_join_post()
1764 if (!priv->tx_pending_len) in lbs_join_post()
1765 netif_wake_queue(priv->dev); in lbs_join_post()
1818 memcpy(cmd.bss.bssid, bss->bssid, ETH_ALEN); in lbs_ibss_join_existing()
1819 memcpy(cmd.bss.ssid, params->ssid, params->ssid_len); in lbs_ibss_join_existing()
1821 cmd.bss.beaconperiod = cpu_to_le16(params->beacon_interval); in lbs_ibss_join_existing()
1824 cmd.bss.ds.channel = params->chandef.chan->hw_value; in lbs_ibss_join_existing()
1828 cmd.bss.capability = cpu_to_le16(bss->capability & CAPINFO_MASK); in lbs_ibss_join_existing()
1841 ret = -EINVAL; in lbs_ibss_join_existing()
1861 if (MRVL_FW_MAJOR_REV(priv->fwrelease) <= 8) { in lbs_ibss_join_existing()
1878 lbs_join_post(priv, params, bss->bssid, bss->capability); in lbs_ibss_join_existing()
1930 memcpy(cmd.ssid, params->ssid, params->ssid_len); in lbs_ibss_start_new()
1932 cmd.beaconperiod = cpu_to_le16(params->beacon_interval); in lbs_ibss_start_new()
1938 cmd.ds.channel = params->chandef.chan->hw_value; in lbs_ibss_start_new()
1940 if (MRVL_FW_MAJOR_REV(priv->fwrelease) <= 8) in lbs_ibss_start_new()
1962 lbs_join_post(priv, params, resp->bssid, capability); in lbs_ibss_start_new()
1969 static int lbs_join_ibss(struct wiphy *wiphy, struct net_device *dev, in lbs_join_ibss() argument
1972 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_join_ibss()
1976 if (dev == priv->mesh_dev) in lbs_join_ibss()
1977 return -EOPNOTSUPP; in lbs_join_ibss()
1979 if (!params->chandef.chan) { in lbs_join_ibss()
1980 ret = -ENOTSUPP; in lbs_join_ibss()
1984 ret = lbs_set_channel(priv, params->chandef.chan->hw_value); in lbs_join_ibss()
1990 bss = cfg80211_get_bss(wiphy, params->chandef.chan, params->bssid, in lbs_join_ibss()
1991 params->ssid, params->ssid_len, in lbs_join_ibss()
1996 cfg80211_put_bss(wiphy, bss); in lbs_join_ibss()
2006 static int lbs_leave_ibss(struct wiphy *wiphy, struct net_device *dev) in lbs_leave_ibss() argument
2008 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_leave_ibss()
2012 if (dev == priv->mesh_dev) in lbs_leave_ibss()
2013 return -EOPNOTSUPP; in lbs_leave_ibss()
2027 static int lbs_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, in lbs_set_power_mgmt() argument
2030 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_set_power_mgmt()
2032 if (!(priv->fwcapinfo & FW_CAPINFO_PS)) { in lbs_set_power_mgmt()
2036 return -EINVAL; in lbs_set_power_mgmt()
2043 if (priv->is_polling) { in lbs_set_power_mgmt()
2047 return -EINVAL; in lbs_set_power_mgmt()
2050 priv->psmode = LBS802_11POWERMODECAM; in lbs_set_power_mgmt()
2051 if (priv->psstate != PS_STATE_FULL_POWER) in lbs_set_power_mgmt()
2057 if (priv->psmode != LBS802_11POWERMODECAM) in lbs_set_power_mgmt()
2059 priv->psmode = LBS802_11POWERMODEMAX_PSP; in lbs_set_power_mgmt()
2060 if (priv->connect_status == LBS_CONNECTED) in lbs_set_power_mgmt()
2088 * memory and don't initialize the wiphy further. This is postponed until we
2099 return ERR_PTR(-ENOMEM); in lbs_cfg_alloc()
2101 wdev->wiphy = wiphy_new(&lbs_cfg80211_ops, sizeof(struct lbs_private)); in lbs_cfg_alloc()
2102 if (!wdev->wiphy) { in lbs_cfg_alloc()
2103 dev_err(dev, "cannot allocate wiphy\n"); in lbs_cfg_alloc()
2104 ret = -ENOMEM; in lbs_cfg_alloc()
2135 if (regmap[i].code == priv->regioncode) { in lbs_cfg_set_regulatory_hint()
2136 regulatory_hint(priv->wdev->wiphy, regmap[i].cn); in lbs_cfg_set_regulatory_hint()
2141 static void lbs_reg_notifier(struct wiphy *wiphy, in lbs_reg_notifier() argument
2144 struct lbs_private *priv = wiphy_priv(wiphy); in lbs_reg_notifier()
2146 memcpy(priv->country_code, request->alpha2, sizeof(request->alpha2)); in lbs_reg_notifier()
2153 * firmware capabilities. So we can setup the wiphy according to our
2158 struct wireless_dev *wdev = priv->wdev; in lbs_cfg_register()
2161 wdev->wiphy->max_scan_ssids = 1; in lbs_cfg_register()
2162 wdev->wiphy->max_scan_ie_len = 256; in lbs_cfg_register()
2163 wdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; in lbs_cfg_register()
2165 wdev->wiphy->interface_modes = in lbs_cfg_register()
2169 wdev->wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR); in lbs_cfg_register()
2171 wdev->wiphy->interface_modes |= BIT(NL80211_IFTYPE_MESH_POINT); in lbs_cfg_register()
2173 wdev->wiphy->bands[NL80211_BAND_2GHZ] = &lbs_band_2ghz; in lbs_cfg_register()
2176 * We could check priv->fwcapinfo && FW_CAPINFO_WPA, but I have in lbs_cfg_register()
2179 wdev->wiphy->cipher_suites = cipher_suites; in lbs_cfg_register()
2180 wdev->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); in lbs_cfg_register()
2181 wdev->wiphy->reg_notifier = lbs_reg_notifier; in lbs_cfg_register()
2183 ret = wiphy_register(wdev->wiphy); in lbs_cfg_register()
2185 pr_err("cannot register wiphy device\n"); in lbs_cfg_register()
2187 priv->wiphy_registered = true; in lbs_cfg_register()
2189 ret = register_netdev(priv->dev); in lbs_cfg_register()
2193 INIT_DELAYED_WORK(&priv->scan_work, lbs_scan_worker); in lbs_cfg_register()
2202 cancel_delayed_work_sync(&priv->scan_work); in lbs_scan_deinit()
2208 struct wireless_dev *wdev = priv->wdev; in lbs_cfg_free()
2213 if (priv->wiphy_registered) in lbs_cfg_free()
2214 wiphy_unregister(wdev->wiphy); in lbs_cfg_free()
2216 if (wdev->wiphy) in lbs_cfg_free()
2217 wiphy_free(wdev->wiphy); in lbs_cfg_free()