linux/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2012-2012 Quantenna Communications, Inc.
   3 * All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License
   7 * as published by the Free Software Foundation; either version 2
   8 * of the License, or (at your option) any later version.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 */
  16
  17#include <linux/kernel.h>
  18#include <linux/etherdevice.h>
  19#include <linux/vmalloc.h>
  20#include <linux/ieee80211.h>
  21#include <net/cfg80211.h>
  22#include <net/netlink.h>
  23
  24#include "cfg80211.h"
  25#include "commands.h"
  26#include "core.h"
  27#include "util.h"
  28#include "bus.h"
  29
  30/* Supported rates to be advertised to the cfg80211 */
  31static struct ieee80211_rate qtnf_rates_2g[] = {
  32        {.bitrate = 10, .hw_value = 2, },
  33        {.bitrate = 20, .hw_value = 4, },
  34        {.bitrate = 55, .hw_value = 11, },
  35        {.bitrate = 110, .hw_value = 22, },
  36        {.bitrate = 60, .hw_value = 12, },
  37        {.bitrate = 90, .hw_value = 18, },
  38        {.bitrate = 120, .hw_value = 24, },
  39        {.bitrate = 180, .hw_value = 36, },
  40        {.bitrate = 240, .hw_value = 48, },
  41        {.bitrate = 360, .hw_value = 72, },
  42        {.bitrate = 480, .hw_value = 96, },
  43        {.bitrate = 540, .hw_value = 108, },
  44};
  45
  46/* Supported rates to be advertised to the cfg80211 */
  47static struct ieee80211_rate qtnf_rates_5g[] = {
  48        {.bitrate = 60, .hw_value = 12, },
  49        {.bitrate = 90, .hw_value = 18, },
  50        {.bitrate = 120, .hw_value = 24, },
  51        {.bitrate = 180, .hw_value = 36, },
  52        {.bitrate = 240, .hw_value = 48, },
  53        {.bitrate = 360, .hw_value = 72, },
  54        {.bitrate = 480, .hw_value = 96, },
  55        {.bitrate = 540, .hw_value = 108, },
  56};
  57
  58/* Supported crypto cipher suits to be advertised to cfg80211 */
  59static const u32 qtnf_cipher_suites[] = {
  60        WLAN_CIPHER_SUITE_TKIP,
  61        WLAN_CIPHER_SUITE_CCMP,
  62        WLAN_CIPHER_SUITE_AES_CMAC,
  63};
  64
  65/* Supported mgmt frame types to be advertised to cfg80211 */
  66static const struct ieee80211_txrx_stypes
  67qtnf_mgmt_stypes[NUM_NL80211_IFTYPES] = {
  68        [NL80211_IFTYPE_STATION] = {
  69                .tx = BIT(IEEE80211_STYPE_ACTION >> 4),
  70                .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
  71                      BIT(IEEE80211_STYPE_PROBE_REQ >> 4),
  72        },
  73        [NL80211_IFTYPE_AP] = {
  74                .tx = BIT(IEEE80211_STYPE_ACTION >> 4),
  75                .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
  76                      BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
  77                      BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
  78                      BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
  79                      BIT(IEEE80211_STYPE_AUTH >> 4),
  80        },
  81};
  82
  83static int
  84qtnf_validate_iface_combinations(struct wiphy *wiphy,
  85                                 struct qtnf_vif *change_vif,
  86                                 enum nl80211_iftype new_type)
  87{
  88        struct qtnf_wmac *mac;
  89        struct qtnf_vif *vif;
  90        int i;
  91        int ret = 0;
  92        struct iface_combination_params params = {
  93                .num_different_channels = 1,
  94        };
  95
  96        mac = wiphy_priv(wiphy);
  97        if (!mac)
  98                return -EFAULT;
  99
 100        for (i = 0; i < QTNF_MAX_INTF; i++) {
 101                vif = &mac->iflist[i];
 102                if (vif->wdev.iftype != NL80211_IFTYPE_UNSPECIFIED)
 103                        params.iftype_num[vif->wdev.iftype]++;
 104        }
 105
 106        if (change_vif) {
 107                params.iftype_num[new_type]++;
 108                params.iftype_num[change_vif->wdev.iftype]--;
 109        } else {
 110                params.iftype_num[new_type]++;
 111        }
 112
 113        ret = cfg80211_check_combinations(wiphy, &params);
 114
 115        return ret;
 116}
 117
 118static int
 119qtnf_change_virtual_intf(struct wiphy *wiphy,
 120                         struct net_device *dev,
 121                         enum nl80211_iftype type,
 122                         struct vif_params *params)
 123{
 124        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 125        u8 *mac_addr;
 126        int ret;
 127
 128        ret = qtnf_validate_iface_combinations(wiphy, vif, type);
 129        if (ret) {
 130                pr_err("VIF%u.%u combination check: failed to set type %d\n",
 131                       vif->mac->macid, vif->vifid, type);
 132                return ret;
 133        }
 134
 135        if (params)
 136                mac_addr = params->macaddr;
 137        else
 138                mac_addr = NULL;
 139
 140        qtnf_scan_done(vif->mac, true);
 141
 142        ret = qtnf_cmd_send_change_intf_type(vif, type, mac_addr);
 143        if (ret) {
 144                pr_err("VIF%u.%u: failed to change type to %d\n",
 145                       vif->mac->macid, vif->vifid, type);
 146                return ret;
 147        }
 148
 149        vif->wdev.iftype = type;
 150        return 0;
 151}
 152
 153int qtnf_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
 154{
 155        struct net_device *netdev =  wdev->netdev;
 156        struct qtnf_vif *vif;
 157
 158        if (WARN_ON(!netdev))
 159                return -EFAULT;
 160
 161        vif = qtnf_netdev_get_priv(wdev->netdev);
 162
 163        qtnf_scan_done(vif->mac, true);
 164
 165        /* Stop data */
 166        netif_tx_stop_all_queues(netdev);
 167        if (netif_carrier_ok(netdev))
 168                netif_carrier_off(netdev);
 169
 170        if (netdev->reg_state == NETREG_REGISTERED)
 171                unregister_netdevice(netdev);
 172
 173        if (qtnf_cmd_send_del_intf(vif))
 174                pr_err("VIF%u.%u: failed to delete VIF\n", vif->mac->macid,
 175                       vif->vifid);
 176
 177        vif->netdev->ieee80211_ptr = NULL;
 178        vif->netdev = NULL;
 179        vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
 180
 181        return 0;
 182}
 183
 184static struct wireless_dev *qtnf_add_virtual_intf(struct wiphy *wiphy,
 185                                                  const char *name,
 186                                                  unsigned char name_assign_t,
 187                                                  enum nl80211_iftype type,
 188                                                  struct vif_params *params)
 189{
 190        struct qtnf_wmac *mac;
 191        struct qtnf_vif *vif;
 192        u8 *mac_addr = NULL;
 193        int ret;
 194
 195        mac = wiphy_priv(wiphy);
 196
 197        if (!mac)
 198                return ERR_PTR(-EFAULT);
 199
 200        ret = qtnf_validate_iface_combinations(wiphy, NULL, type);
 201        if (ret) {
 202                pr_err("MAC%u invalid combination: failed to add type %d\n",
 203                       mac->macid, type);
 204                return ERR_PTR(ret);
 205        }
 206
 207        switch (type) {
 208        case NL80211_IFTYPE_STATION:
 209        case NL80211_IFTYPE_AP:
 210                vif = qtnf_mac_get_free_vif(mac);
 211                if (!vif) {
 212                        pr_err("MAC%u: no free VIF available\n", mac->macid);
 213                        return ERR_PTR(-EFAULT);
 214                }
 215
 216                eth_zero_addr(vif->mac_addr);
 217                eth_zero_addr(vif->bssid);
 218                vif->bss_priority = QTNF_DEF_BSS_PRIORITY;
 219                memset(&vif->wdev, 0, sizeof(vif->wdev));
 220                vif->wdev.wiphy = wiphy;
 221                vif->wdev.iftype = type;
 222                break;
 223        default:
 224                pr_err("MAC%u: unsupported IF type %d\n", mac->macid, type);
 225                return ERR_PTR(-ENOTSUPP);
 226        }
 227
 228        if (params)
 229                mac_addr = params->macaddr;
 230
 231        ret = qtnf_cmd_send_add_intf(vif, type, mac_addr);
 232        if (ret) {
 233                pr_err("VIF%u.%u: failed to add VIF %pM\n",
 234                       mac->macid, vif->vifid, mac_addr);
 235                goto err_cmd;
 236        }
 237
 238        if (!is_valid_ether_addr(vif->mac_addr)) {
 239                pr_err("VIF%u.%u: FW reported bad MAC: %pM\n",
 240                       mac->macid, vif->vifid, vif->mac_addr);
 241                ret = -EINVAL;
 242                goto err_mac;
 243        }
 244
 245        ret = qtnf_core_net_attach(mac, vif, name, name_assign_t);
 246        if (ret) {
 247                pr_err("VIF%u.%u: failed to attach netdev\n", mac->macid,
 248                       vif->vifid);
 249                goto err_net;
 250        }
 251
 252        vif->wdev.netdev = vif->netdev;
 253        return &vif->wdev;
 254
 255err_net:
 256        vif->netdev = NULL;
 257err_mac:
 258        qtnf_cmd_send_del_intf(vif);
 259err_cmd:
 260        vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
 261
 262        return ERR_PTR(ret);
 263}
 264
 265static int qtnf_mgmt_set_appie(struct qtnf_vif *vif,
 266                               const struct cfg80211_beacon_data *info)
 267{
 268        int ret = 0;
 269
 270        if (!info->beacon_ies || !info->beacon_ies_len) {
 271                ret = qtnf_cmd_send_mgmt_set_appie(vif, QLINK_IE_SET_BEACON_IES,
 272                                                   NULL, 0);
 273        } else {
 274                ret = qtnf_cmd_send_mgmt_set_appie(vif, QLINK_IE_SET_BEACON_IES,
 275                                                   info->beacon_ies,
 276                                                   info->beacon_ies_len);
 277        }
 278
 279        if (ret)
 280                goto out;
 281
 282        if (!info->proberesp_ies || !info->proberesp_ies_len) {
 283                ret = qtnf_cmd_send_mgmt_set_appie(vif,
 284                                                   QLINK_IE_SET_PROBE_RESP_IES,
 285                                                   NULL, 0);
 286        } else {
 287                ret = qtnf_cmd_send_mgmt_set_appie(vif,
 288                                                   QLINK_IE_SET_PROBE_RESP_IES,
 289                                                   info->proberesp_ies,
 290                                                   info->proberesp_ies_len);
 291        }
 292
 293        if (ret)
 294                goto out;
 295
 296        if (!info->assocresp_ies || !info->assocresp_ies_len) {
 297                ret = qtnf_cmd_send_mgmt_set_appie(vif,
 298                                                   QLINK_IE_SET_ASSOC_RESP,
 299                                                   NULL, 0);
 300        } else {
 301                ret = qtnf_cmd_send_mgmt_set_appie(vif,
 302                                                   QLINK_IE_SET_ASSOC_RESP,
 303                                                   info->assocresp_ies,
 304                                                   info->assocresp_ies_len);
 305        }
 306
 307out:
 308        return ret;
 309}
 310
 311static int qtnf_change_beacon(struct wiphy *wiphy, struct net_device *dev,
 312                              struct cfg80211_beacon_data *info)
 313{
 314        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 315
 316        return qtnf_mgmt_set_appie(vif, info);
 317}
 318
 319static int qtnf_start_ap(struct wiphy *wiphy, struct net_device *dev,
 320                         struct cfg80211_ap_settings *settings)
 321{
 322        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 323        int ret;
 324
 325        ret = qtnf_cmd_send_start_ap(vif, settings);
 326        if (ret)
 327                pr_err("VIF%u.%u: failed to start AP\n", vif->mac->macid,
 328                       vif->vifid);
 329
 330        return ret;
 331}
 332
 333static int qtnf_stop_ap(struct wiphy *wiphy, struct net_device *dev)
 334{
 335        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 336        int ret;
 337
 338        qtnf_scan_done(vif->mac, true);
 339
 340        ret = qtnf_cmd_send_stop_ap(vif);
 341        if (ret)
 342                pr_err("VIF%u.%u: failed to stop AP operation in FW\n",
 343                       vif->mac->macid, vif->vifid);
 344
 345        netif_carrier_off(vif->netdev);
 346
 347        return ret;
 348}
 349
 350static int qtnf_set_wiphy_params(struct wiphy *wiphy, u32 changed)
 351{
 352        struct qtnf_wmac *mac = wiphy_priv(wiphy);
 353        struct qtnf_vif *vif;
 354        int ret;
 355
 356        vif = qtnf_mac_get_base_vif(mac);
 357        if (!vif) {
 358                pr_err("MAC%u: primary VIF is not configured\n", mac->macid);
 359                return -EFAULT;
 360        }
 361
 362        if (changed & (WIPHY_PARAM_RETRY_LONG | WIPHY_PARAM_RETRY_SHORT)) {
 363                pr_err("MAC%u: can't modify retry params\n", mac->macid);
 364                return -EOPNOTSUPP;
 365        }
 366
 367        ret = qtnf_cmd_send_update_phy_params(mac, changed);
 368        if (ret)
 369                pr_err("MAC%u: failed to update PHY params\n", mac->macid);
 370
 371        return ret;
 372}
 373
 374static void
 375qtnf_mgmt_frame_register(struct wiphy *wiphy, struct wireless_dev *wdev,
 376                         u16 frame_type, bool reg)
 377{
 378        struct qtnf_vif *vif = qtnf_netdev_get_priv(wdev->netdev);
 379        u16 mgmt_type;
 380        u16 new_mask;
 381        u16 qlink_frame_type = 0;
 382
 383        mgmt_type = (frame_type & IEEE80211_FCTL_STYPE) >> 4;
 384
 385        if (reg)
 386                new_mask = vif->mgmt_frames_bitmask | BIT(mgmt_type);
 387        else
 388                new_mask = vif->mgmt_frames_bitmask & ~BIT(mgmt_type);
 389
 390        if (new_mask == vif->mgmt_frames_bitmask)
 391                return;
 392
 393        switch (frame_type & IEEE80211_FCTL_STYPE) {
 394        case IEEE80211_STYPE_REASSOC_REQ:
 395        case IEEE80211_STYPE_ASSOC_REQ:
 396                qlink_frame_type = QLINK_MGMT_FRAME_ASSOC_REQ;
 397                break;
 398        case IEEE80211_STYPE_AUTH:
 399                qlink_frame_type = QLINK_MGMT_FRAME_AUTH;
 400                break;
 401        case IEEE80211_STYPE_PROBE_REQ:
 402                qlink_frame_type = QLINK_MGMT_FRAME_PROBE_REQ;
 403                break;
 404        case IEEE80211_STYPE_ACTION:
 405                qlink_frame_type = QLINK_MGMT_FRAME_ACTION;
 406                break;
 407        default:
 408                pr_warn("VIF%u.%u: unsupported frame type: %X\n",
 409                        vif->mac->macid, vif->vifid,
 410                        (frame_type & IEEE80211_FCTL_STYPE) >> 4);
 411                return;
 412        }
 413
 414        if (qtnf_cmd_send_register_mgmt(vif, qlink_frame_type, reg)) {
 415                pr_warn("VIF%u.%u: failed to %sregister mgmt frame type 0x%x\n",
 416                        vif->mac->macid, vif->vifid, reg ? "" : "un",
 417                        frame_type);
 418                return;
 419        }
 420
 421        vif->mgmt_frames_bitmask = new_mask;
 422        pr_debug("VIF%u.%u: %sregistered mgmt frame type 0x%x\n",
 423                 vif->mac->macid, vif->vifid, reg ? "" : "un", frame_type);
 424}
 425
 426static int
 427qtnf_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
 428             struct cfg80211_mgmt_tx_params *params, u64 *cookie)
 429{
 430        struct qtnf_vif *vif = qtnf_netdev_get_priv(wdev->netdev);
 431        const struct ieee80211_mgmt *mgmt_frame = (void *)params->buf;
 432        u32 short_cookie = prandom_u32();
 433        u16 flags = 0;
 434        u16 freq;
 435
 436        *cookie = short_cookie;
 437
 438        if (params->offchan)
 439                flags |= QLINK_MGMT_FRAME_TX_FLAG_OFFCHAN;
 440
 441        if (params->no_cck)
 442                flags |= QLINK_MGMT_FRAME_TX_FLAG_NO_CCK;
 443
 444        if (params->dont_wait_for_ack)
 445                flags |= QLINK_MGMT_FRAME_TX_FLAG_ACK_NOWAIT;
 446
 447        /* If channel is not specified, pass "freq = 0" to tell device
 448         * firmware to use current channel.
 449         */
 450        if (params->chan)
 451                freq = params->chan->center_freq;
 452        else
 453                freq = 0;
 454
 455        pr_debug("%s freq:%u; FC:%.4X; DA:%pM; len:%zu; C:%.8X; FL:%.4X\n",
 456                 wdev->netdev->name, freq,
 457                 le16_to_cpu(mgmt_frame->frame_control), mgmt_frame->da,
 458                 params->len, short_cookie, flags);
 459
 460        return qtnf_cmd_send_mgmt_frame(vif, short_cookie, flags,
 461                                        freq,
 462                                        params->buf, params->len);
 463}
 464
 465static int
 466qtnf_get_station(struct wiphy *wiphy, struct net_device *dev,
 467                 const u8 *mac, struct station_info *sinfo)
 468{
 469        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 470
 471        sinfo->generation = vif->generation;
 472        return qtnf_cmd_get_sta_info(vif, mac, sinfo);
 473}
 474
 475static int
 476qtnf_dump_station(struct wiphy *wiphy, struct net_device *dev,
 477                  int idx, u8 *mac, struct station_info *sinfo)
 478{
 479        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 480        const struct qtnf_sta_node *sta_node;
 481        int ret;
 482
 483        switch (vif->wdev.iftype) {
 484        case NL80211_IFTYPE_STATION:
 485                if (idx != 0 || !vif->wdev.current_bss)
 486                        return -ENOENT;
 487
 488                ether_addr_copy(mac, vif->bssid);
 489                break;
 490        case NL80211_IFTYPE_AP:
 491                sta_node = qtnf_sta_list_lookup_index(&vif->sta_list, idx);
 492                if (unlikely(!sta_node))
 493                        return -ENOENT;
 494
 495                ether_addr_copy(mac, sta_node->mac_addr);
 496                break;
 497        default:
 498                return -ENOTSUPP;
 499        }
 500
 501        ret = qtnf_cmd_get_sta_info(vif, mac, sinfo);
 502
 503        if (vif->wdev.iftype == NL80211_IFTYPE_AP) {
 504                if (ret == -ENOENT) {
 505                        cfg80211_del_sta(vif->netdev, mac, GFP_KERNEL);
 506                        sinfo->filled = 0;
 507                }
 508        }
 509
 510        sinfo->generation = vif->generation;
 511
 512        return ret;
 513}
 514
 515static int qtnf_add_key(struct wiphy *wiphy, struct net_device *dev,
 516                        u8 key_index, bool pairwise, const u8 *mac_addr,
 517                        struct key_params *params)
 518{
 519        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 520        int ret;
 521
 522        ret = qtnf_cmd_send_add_key(vif, key_index, pairwise, mac_addr, params);
 523        if (ret)
 524                pr_err("VIF%u.%u: failed to add key: cipher=%x idx=%u pw=%u\n",
 525                       vif->mac->macid, vif->vifid, params->cipher, key_index,
 526                       pairwise);
 527
 528        return ret;
 529}
 530
 531static int qtnf_del_key(struct wiphy *wiphy, struct net_device *dev,
 532                        u8 key_index, bool pairwise, const u8 *mac_addr)
 533{
 534        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 535        int ret;
 536
 537        ret = qtnf_cmd_send_del_key(vif, key_index, pairwise, mac_addr);
 538        if (ret) {
 539                if (ret == -ENOENT) {
 540                        pr_debug("VIF%u.%u: key index %d out of bounds\n",
 541                                 vif->mac->macid, vif->vifid, key_index);
 542                } else {
 543                        pr_err("VIF%u.%u: failed to delete key: idx=%u pw=%u\n",
 544                               vif->mac->macid, vif->vifid,
 545                               key_index, pairwise);
 546                }
 547        }
 548
 549        return ret;
 550}
 551
 552static int qtnf_set_default_key(struct wiphy *wiphy, struct net_device *dev,
 553                                u8 key_index, bool unicast, bool multicast)
 554{
 555        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 556        int ret;
 557
 558        ret = qtnf_cmd_send_set_default_key(vif, key_index, unicast, multicast);
 559        if (ret)
 560                pr_err("VIF%u.%u: failed to set dflt key: idx=%u uc=%u mc=%u\n",
 561                       vif->mac->macid, vif->vifid, key_index, unicast,
 562                       multicast);
 563
 564        return ret;
 565}
 566
 567static int
 568qtnf_set_default_mgmt_key(struct wiphy *wiphy, struct net_device *dev,
 569                          u8 key_index)
 570{
 571        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 572        int ret;
 573
 574        ret = qtnf_cmd_send_set_default_mgmt_key(vif, key_index);
 575        if (ret)
 576                pr_err("VIF%u.%u: failed to set default MGMT key: idx=%u\n",
 577                       vif->mac->macid, vif->vifid, key_index);
 578
 579        return ret;
 580}
 581
 582static int
 583qtnf_change_station(struct wiphy *wiphy, struct net_device *dev,
 584                    const u8 *mac, struct station_parameters *params)
 585{
 586        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 587        int ret;
 588
 589        ret = qtnf_cmd_send_change_sta(vif, mac, params);
 590        if (ret)
 591                pr_err("VIF%u.%u: failed to change STA %pM\n",
 592                       vif->mac->macid, vif->vifid, mac);
 593
 594        return ret;
 595}
 596
 597static int
 598qtnf_del_station(struct wiphy *wiphy, struct net_device *dev,
 599                 struct station_del_parameters *params)
 600{
 601        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 602        int ret;
 603
 604        if (params->mac &&
 605            (vif->wdev.iftype == NL80211_IFTYPE_AP) &&
 606            !is_broadcast_ether_addr(params->mac) &&
 607            !qtnf_sta_list_lookup(&vif->sta_list, params->mac))
 608                return 0;
 609
 610        ret = qtnf_cmd_send_del_sta(vif, params);
 611        if (ret)
 612                pr_err("VIF%u.%u: failed to delete STA %pM\n",
 613                       vif->mac->macid, vif->vifid, params->mac);
 614
 615        return ret;
 616}
 617
 618static int
 619qtnf_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
 620{
 621        struct qtnf_wmac *mac = wiphy_priv(wiphy);
 622        int ret;
 623
 624        cancel_delayed_work_sync(&mac->scan_timeout);
 625
 626        mac->scan_req = request;
 627
 628        ret = qtnf_cmd_send_scan(mac);
 629        if (ret) {
 630                pr_err("MAC%u: failed to start scan\n", mac->macid);
 631                mac->scan_req = NULL;
 632                goto out;
 633        }
 634
 635        pr_debug("MAC%u: scan started\n", mac->macid);
 636        queue_delayed_work(mac->bus->workqueue, &mac->scan_timeout,
 637                           QTNF_SCAN_TIMEOUT_SEC * HZ);
 638
 639out:
 640        return ret;
 641}
 642
 643static int
 644qtnf_connect(struct wiphy *wiphy, struct net_device *dev,
 645             struct cfg80211_connect_params *sme)
 646{
 647        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 648        int ret;
 649
 650        if (vif->wdev.iftype != NL80211_IFTYPE_STATION)
 651                return -EOPNOTSUPP;
 652
 653        if (sme->bssid)
 654                ether_addr_copy(vif->bssid, sme->bssid);
 655        else
 656                eth_zero_addr(vif->bssid);
 657
 658        ret = qtnf_cmd_send_connect(vif, sme);
 659        if (ret) {
 660                pr_err("VIF%u.%u: failed to connect\n",
 661                       vif->mac->macid, vif->vifid);
 662                goto out;
 663        }
 664
 665out:
 666        return ret;
 667}
 668
 669static int
 670qtnf_disconnect(struct wiphy *wiphy, struct net_device *dev,
 671                u16 reason_code)
 672{
 673        struct qtnf_wmac *mac = wiphy_priv(wiphy);
 674        struct qtnf_vif *vif;
 675        int ret = 0;
 676
 677        vif = qtnf_mac_get_base_vif(mac);
 678        if (!vif) {
 679                pr_err("MAC%u: primary VIF is not configured\n", mac->macid);
 680                return -EFAULT;
 681        }
 682
 683        if (vif->wdev.iftype != NL80211_IFTYPE_STATION) {
 684                ret = -EOPNOTSUPP;
 685                goto out;
 686        }
 687
 688        ret = qtnf_cmd_send_disconnect(vif, reason_code);
 689        if (ret)
 690                pr_err("VIF%u.%u: failed to disconnect\n",
 691                       mac->macid, vif->vifid);
 692
 693        if (vif->wdev.current_bss) {
 694                netif_carrier_off(vif->netdev);
 695                cfg80211_disconnected(vif->netdev, reason_code,
 696                                      NULL, 0, true, GFP_KERNEL);
 697        }
 698
 699out:
 700        return ret;
 701}
 702
 703static int
 704qtnf_dump_survey(struct wiphy *wiphy, struct net_device *dev,
 705                 int idx, struct survey_info *survey)
 706{
 707        struct qtnf_wmac *mac = wiphy_priv(wiphy);
 708        struct wireless_dev *wdev = dev->ieee80211_ptr;
 709        struct ieee80211_supported_band *sband;
 710        const struct cfg80211_chan_def *chandef = &wdev->chandef;
 711        struct ieee80211_channel *chan;
 712        struct qtnf_chan_stats stats;
 713        int ret;
 714
 715        sband = wiphy->bands[NL80211_BAND_2GHZ];
 716        if (sband && idx >= sband->n_channels) {
 717                idx -= sband->n_channels;
 718                sband = NULL;
 719        }
 720
 721        if (!sband)
 722                sband = wiphy->bands[NL80211_BAND_5GHZ];
 723
 724        if (!sband || idx >= sband->n_channels)
 725                return -ENOENT;
 726
 727        chan = &sband->channels[idx];
 728        memset(&stats, 0, sizeof(stats));
 729
 730        survey->channel = chan;
 731        survey->filled = 0x0;
 732
 733        if (chandef->chan) {
 734                if (chan->hw_value == chandef->chan->hw_value)
 735                        survey->filled = SURVEY_INFO_IN_USE;
 736        }
 737
 738        ret = qtnf_cmd_get_chan_stats(mac, chan->hw_value, &stats);
 739        switch (ret) {
 740        case 0:
 741                if (unlikely(stats.chan_num != chan->hw_value)) {
 742                        pr_err("received stats for channel %d instead of %d\n",
 743                               stats.chan_num, chan->hw_value);
 744                        ret = -EINVAL;
 745                        break;
 746                }
 747
 748                survey->filled |= SURVEY_INFO_TIME |
 749                                 SURVEY_INFO_TIME_SCAN |
 750                                 SURVEY_INFO_TIME_BUSY |
 751                                 SURVEY_INFO_TIME_RX |
 752                                 SURVEY_INFO_TIME_TX |
 753                                 SURVEY_INFO_NOISE_DBM;
 754
 755                survey->time_scan = stats.cca_try;
 756                survey->time = stats.cca_try;
 757                survey->time_tx = stats.cca_tx;
 758                survey->time_rx = stats.cca_rx;
 759                survey->time_busy = stats.cca_busy;
 760                survey->noise = stats.chan_noise;
 761                break;
 762        case -ENOENT:
 763                pr_debug("no stats for channel %u\n", chan->hw_value);
 764                ret = 0;
 765                break;
 766        default:
 767                pr_debug("failed to get chan(%d) stats from card\n",
 768                         chan->hw_value);
 769                break;
 770        }
 771
 772        return ret;
 773}
 774
 775static int
 776qtnf_get_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
 777                 struct cfg80211_chan_def *chandef)
 778{
 779        struct net_device *ndev = wdev->netdev;
 780        struct qtnf_vif *vif;
 781        int ret;
 782
 783        if (!ndev)
 784                return -ENODEV;
 785
 786        vif = qtnf_netdev_get_priv(wdev->netdev);
 787
 788        ret = qtnf_cmd_get_channel(vif, chandef);
 789        if (ret) {
 790                pr_err("%s: failed to get channel: %d\n", ndev->name, ret);
 791                ret = -ENODATA;
 792                goto out;
 793        }
 794
 795        if (!cfg80211_chandef_valid(chandef)) {
 796                pr_err("%s: bad channel freq=%u cf1=%u cf2=%u bw=%u\n",
 797                       ndev->name, chandef->chan->center_freq,
 798                       chandef->center_freq1, chandef->center_freq2,
 799                       chandef->width);
 800                ret = -ENODATA;
 801                goto out;
 802        }
 803
 804out:
 805        return ret;
 806}
 807
 808static int qtnf_channel_switch(struct wiphy *wiphy, struct net_device *dev,
 809                               struct cfg80211_csa_settings *params)
 810{
 811        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 812        int ret;
 813
 814        pr_debug("%s: chan(%u) count(%u) radar(%u) block_tx(%u)\n", dev->name,
 815                 params->chandef.chan->hw_value, params->count,
 816                 params->radar_required, params->block_tx);
 817
 818        if (!cfg80211_chandef_valid(&params->chandef)) {
 819                pr_err("%s: invalid channel\n", dev->name);
 820                return -EINVAL;
 821        }
 822
 823        ret = qtnf_cmd_send_chan_switch(vif, params);
 824        if (ret)
 825                pr_warn("%s: failed to switch to channel (%u)\n",
 826                        dev->name, params->chandef.chan->hw_value);
 827
 828        return ret;
 829}
 830
 831static int qtnf_start_radar_detection(struct wiphy *wiphy,
 832                                      struct net_device *ndev,
 833                                      struct cfg80211_chan_def *chandef,
 834                                      u32 cac_time_ms)
 835{
 836        struct qtnf_vif *vif = qtnf_netdev_get_priv(ndev);
 837        int ret;
 838
 839        if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD))
 840                return -ENOTSUPP;
 841
 842        ret = qtnf_cmd_start_cac(vif, chandef, cac_time_ms);
 843        if (ret)
 844                pr_err("%s: failed to start CAC ret=%d\n", ndev->name, ret);
 845
 846        return ret;
 847}
 848
 849static int qtnf_set_mac_acl(struct wiphy *wiphy,
 850                            struct net_device *dev,
 851                            const struct cfg80211_acl_data *params)
 852{
 853        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 854        int ret;
 855
 856        ret = qtnf_cmd_set_mac_acl(vif, params);
 857        if (ret)
 858                pr_err("%s: failed to set mac ACL ret=%d\n", dev->name, ret);
 859
 860        return ret;
 861}
 862
 863static int qtnf_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
 864                               bool enabled, int timeout)
 865{
 866        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 867        int ret;
 868
 869        ret = qtnf_cmd_send_pm_set(vif, enabled ? QLINK_PM_AUTO_STANDBY :
 870                                   QLINK_PM_OFF, timeout);
 871        if (ret)
 872                pr_err("%s: failed to set PM mode ret=%d\n", dev->name, ret);
 873
 874        return ret;
 875}
 876
 877#ifdef CONFIG_PM
 878static int qtnf_suspend(struct wiphy *wiphy, struct cfg80211_wowlan *wowlan)
 879{
 880        struct qtnf_wmac *mac = wiphy_priv(wiphy);
 881        struct qtnf_vif *vif;
 882        int ret = 0;
 883
 884        vif = qtnf_mac_get_base_vif(mac);
 885        if (!vif) {
 886                pr_err("MAC%u: primary VIF is not configured\n", mac->macid);
 887                ret = -EFAULT;
 888                goto exit;
 889        }
 890
 891        if (!wowlan) {
 892                pr_debug("WoWLAN triggers are not enabled\n");
 893                qtnf_virtual_intf_cleanup(vif->netdev);
 894                goto exit;
 895        }
 896
 897        qtnf_scan_done(vif->mac, true);
 898
 899        ret = qtnf_cmd_send_wowlan_set(vif, wowlan);
 900        if (ret) {
 901                pr_err("MAC%u: failed to set WoWLAN triggers\n",
 902                       mac->macid);
 903                goto exit;
 904        }
 905
 906exit:
 907        return ret;
 908}
 909
 910static int qtnf_resume(struct wiphy *wiphy)
 911{
 912        struct qtnf_wmac *mac = wiphy_priv(wiphy);
 913        struct qtnf_vif *vif;
 914        int ret = 0;
 915
 916        vif = qtnf_mac_get_base_vif(mac);
 917        if (!vif) {
 918                pr_err("MAC%u: primary VIF is not configured\n", mac->macid);
 919                ret = -EFAULT;
 920                goto exit;
 921        }
 922
 923        ret = qtnf_cmd_send_wowlan_set(vif, NULL);
 924        if (ret) {
 925                pr_err("MAC%u: failed to reset WoWLAN triggers\n",
 926                       mac->macid);
 927                goto exit;
 928        }
 929
 930exit:
 931        return ret;
 932}
 933
 934static void qtnf_set_wakeup(struct wiphy *wiphy, bool enabled)
 935{
 936        struct qtnf_wmac *mac = wiphy_priv(wiphy);
 937        struct qtnf_bus *bus = mac->bus;
 938
 939        device_set_wakeup_enable(bus->dev, enabled);
 940}
 941#endif
 942
 943static struct cfg80211_ops qtn_cfg80211_ops = {
 944        .add_virtual_intf       = qtnf_add_virtual_intf,
 945        .change_virtual_intf    = qtnf_change_virtual_intf,
 946        .del_virtual_intf       = qtnf_del_virtual_intf,
 947        .start_ap               = qtnf_start_ap,
 948        .change_beacon          = qtnf_change_beacon,
 949        .stop_ap                = qtnf_stop_ap,
 950        .set_wiphy_params       = qtnf_set_wiphy_params,
 951        .mgmt_frame_register    = qtnf_mgmt_frame_register,
 952        .mgmt_tx                = qtnf_mgmt_tx,
 953        .change_station         = qtnf_change_station,
 954        .del_station            = qtnf_del_station,
 955        .get_station            = qtnf_get_station,
 956        .dump_station           = qtnf_dump_station,
 957        .add_key                = qtnf_add_key,
 958        .del_key                = qtnf_del_key,
 959        .set_default_key        = qtnf_set_default_key,
 960        .set_default_mgmt_key   = qtnf_set_default_mgmt_key,
 961        .scan                   = qtnf_scan,
 962        .connect                = qtnf_connect,
 963        .disconnect             = qtnf_disconnect,
 964        .dump_survey            = qtnf_dump_survey,
 965        .get_channel            = qtnf_get_channel,
 966        .channel_switch         = qtnf_channel_switch,
 967        .start_radar_detection  = qtnf_start_radar_detection,
 968        .set_mac_acl            = qtnf_set_mac_acl,
 969        .set_power_mgmt         = qtnf_set_power_mgmt,
 970#ifdef CONFIG_PM
 971        .suspend                = qtnf_suspend,
 972        .resume                 = qtnf_resume,
 973        .set_wakeup             = qtnf_set_wakeup,
 974#endif
 975};
 976
 977static void qtnf_cfg80211_reg_notifier(struct wiphy *wiphy_in,
 978                                       struct regulatory_request *req)
 979{
 980        struct qtnf_wmac *mac = wiphy_priv(wiphy_in);
 981        struct qtnf_bus *bus = mac->bus;
 982        struct wiphy *wiphy;
 983        unsigned int mac_idx;
 984        enum nl80211_band band;
 985        int ret;
 986
 987        pr_debug("MAC%u: initiator=%d alpha=%c%c\n", mac->macid, req->initiator,
 988                 req->alpha2[0], req->alpha2[1]);
 989
 990        ret = qtnf_cmd_reg_notify(bus, req);
 991        if (ret) {
 992                if (ret == -EOPNOTSUPP) {
 993                        pr_warn("reg update not supported\n");
 994                } else if (ret == -EALREADY) {
 995                        pr_info("regulatory domain is already set to %c%c",
 996                                req->alpha2[0], req->alpha2[1]);
 997                } else {
 998                        pr_err("failed to update reg domain to %c%c\n",
 999                               req->alpha2[0], req->alpha2[1]);
1000                }
1001
1002                return;
1003        }
1004
1005        for (mac_idx = 0; mac_idx < QTNF_MAX_MAC; ++mac_idx) {
1006                if (!(bus->hw_info.mac_bitmap & (1 << mac_idx)))
1007                        continue;
1008
1009                mac = bus->mac[mac_idx];
1010                if (!mac)
1011                        continue;
1012
1013                wiphy = priv_to_wiphy(mac);
1014
1015                for (band = 0; band < NUM_NL80211_BANDS; ++band) {
1016                        if (!wiphy->bands[band])
1017                                continue;
1018
1019                        ret = qtnf_cmd_band_info_get(mac, wiphy->bands[band]);
1020                        if (ret)
1021                                pr_err("failed to get chan info for mac %u band %u\n",
1022                                       mac_idx, band);
1023                }
1024        }
1025}
1026
1027struct wiphy *qtnf_wiphy_allocate(struct qtnf_bus *bus)
1028{
1029        struct wiphy *wiphy;
1030
1031        if (bus->hw_info.hw_capab & QLINK_HW_CAPAB_DFS_OFFLOAD)
1032                qtn_cfg80211_ops.start_radar_detection = NULL;
1033
1034        if (!(bus->hw_info.hw_capab & QLINK_HW_CAPAB_PWR_MGMT))
1035                qtn_cfg80211_ops.set_power_mgmt = NULL;
1036
1037        wiphy = wiphy_new(&qtn_cfg80211_ops, sizeof(struct qtnf_wmac));
1038        if (!wiphy)
1039                return NULL;
1040
1041        set_wiphy_dev(wiphy, bus->dev);
1042
1043        return wiphy;
1044}
1045
1046static int
1047qtnf_wiphy_setup_if_comb(struct wiphy *wiphy, struct qtnf_mac_info *mac_info)
1048{
1049        struct ieee80211_iface_combination *if_comb;
1050        size_t n_if_comb;
1051        u16 interface_modes = 0;
1052        size_t i, j;
1053
1054        if_comb = mac_info->if_comb;
1055        n_if_comb = mac_info->n_if_comb;
1056
1057        if (!if_comb || !n_if_comb)
1058                return -ENOENT;
1059
1060        for (i = 0; i < n_if_comb; i++) {
1061                if_comb[i].radar_detect_widths = mac_info->radar_detect_widths;
1062
1063                for (j = 0; j < if_comb[i].n_limits; j++)
1064                        interface_modes |= if_comb[i].limits[j].types;
1065        }
1066
1067        wiphy->iface_combinations = if_comb;
1068        wiphy->n_iface_combinations = n_if_comb;
1069        wiphy->interface_modes = interface_modes;
1070
1071        return 0;
1072}
1073
1074int qtnf_wiphy_register(struct qtnf_hw_info *hw_info, struct qtnf_wmac *mac)
1075{
1076        struct wiphy *wiphy = priv_to_wiphy(mac);
1077        struct qtnf_mac_info *macinfo = &mac->macinfo;
1078        int ret;
1079
1080        if (!wiphy) {
1081                pr_err("invalid wiphy pointer\n");
1082                return -EFAULT;
1083        }
1084
1085        wiphy->frag_threshold = macinfo->frag_thr;
1086        wiphy->rts_threshold = macinfo->rts_thr;
1087        wiphy->retry_short = macinfo->sretry_limit;
1088        wiphy->retry_long = macinfo->lretry_limit;
1089        wiphy->coverage_class = macinfo->coverage_class;
1090
1091        wiphy->max_scan_ssids =
1092                (hw_info->max_scan_ssids) ? hw_info->max_scan_ssids : 1;
1093        wiphy->max_scan_ie_len = QTNF_MAX_VSIE_LEN;
1094        wiphy->mgmt_stypes = qtnf_mgmt_stypes;
1095        wiphy->max_remain_on_channel_duration = 5000;
1096        wiphy->max_acl_mac_addrs = macinfo->max_acl_mac_addrs;
1097        wiphy->max_num_csa_counters = 2;
1098
1099        ret = qtnf_wiphy_setup_if_comb(wiphy, macinfo);
1100        if (ret)
1101                goto out;
1102
1103        /* Initialize cipher suits */
1104        wiphy->cipher_suites = qtnf_cipher_suites;
1105        wiphy->n_cipher_suites = ARRAY_SIZE(qtnf_cipher_suites);
1106        wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
1107        wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME |
1108                        WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD |
1109                        WIPHY_FLAG_AP_UAPSD |
1110                        WIPHY_FLAG_HAS_CHANNEL_SWITCH;
1111        wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
1112
1113        if (hw_info->hw_capab & QLINK_HW_CAPAB_DFS_OFFLOAD)
1114                wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD);
1115
1116        if (hw_info->hw_capab & QLINK_HW_CAPAB_SCAN_DWELL)
1117                wiphy_ext_feature_set(wiphy,
1118                                      NL80211_EXT_FEATURE_SET_SCAN_DWELL);
1119
1120        wiphy->probe_resp_offload = NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
1121                                    NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2;
1122
1123        wiphy->available_antennas_tx = macinfo->num_tx_chain;
1124        wiphy->available_antennas_rx = macinfo->num_rx_chain;
1125
1126        wiphy->max_ap_assoc_sta = macinfo->max_ap_assoc_sta;
1127        wiphy->ht_capa_mod_mask = &macinfo->ht_cap_mod_mask;
1128        wiphy->vht_capa_mod_mask = &macinfo->vht_cap_mod_mask;
1129
1130        ether_addr_copy(wiphy->perm_addr, mac->macaddr);
1131
1132        if (hw_info->hw_capab & QLINK_HW_CAPAB_STA_INACT_TIMEOUT)
1133                wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER;
1134
1135        if (hw_info->hw_capab & QLINK_HW_CAPAB_SCAN_RANDOM_MAC_ADDR)
1136                wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
1137
1138        if (!(hw_info->hw_capab & QLINK_HW_CAPAB_OBSS_SCAN))
1139                wiphy->features |= NL80211_FEATURE_NEED_OBSS_SCAN;
1140
1141#ifdef CONFIG_PM
1142        if (macinfo->wowlan)
1143                wiphy->wowlan = macinfo->wowlan;
1144#endif
1145
1146        if (hw_info->hw_capab & QLINK_HW_CAPAB_REG_UPDATE) {
1147                wiphy->regulatory_flags |= REGULATORY_STRICT_REG |
1148                        REGULATORY_CUSTOM_REG;
1149                wiphy->reg_notifier = qtnf_cfg80211_reg_notifier;
1150                wiphy_apply_custom_regulatory(wiphy, hw_info->rd);
1151        } else {
1152                wiphy->regulatory_flags |= REGULATORY_WIPHY_SELF_MANAGED;
1153        }
1154
1155        if (mac->macinfo.extended_capabilities_len) {
1156                wiphy->extended_capabilities =
1157                        mac->macinfo.extended_capabilities;
1158                wiphy->extended_capabilities_mask =
1159                        mac->macinfo.extended_capabilities_mask;
1160                wiphy->extended_capabilities_len =
1161                        mac->macinfo.extended_capabilities_len;
1162        }
1163
1164        strlcpy(wiphy->fw_version, hw_info->fw_version,
1165                sizeof(wiphy->fw_version));
1166        wiphy->hw_version = hw_info->hw_version;
1167
1168        ret = wiphy_register(wiphy);
1169        if (ret < 0)
1170                goto out;
1171
1172        if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
1173                ret = regulatory_set_wiphy_regd(wiphy, hw_info->rd);
1174        else if (isalpha(hw_info->rd->alpha2[0]) &&
1175                 isalpha(hw_info->rd->alpha2[1]))
1176                ret = regulatory_hint(wiphy, hw_info->rd->alpha2);
1177
1178out:
1179        return ret;
1180}
1181
1182void qtnf_netdev_updown(struct net_device *ndev, bool up)
1183{
1184        struct qtnf_vif *vif = qtnf_netdev_get_priv(ndev);
1185
1186        if (qtnf_cmd_send_updown_intf(vif, up))
1187                pr_err("failed to send %s command to VIF%u.%u\n",
1188                       up ? "UP" : "DOWN", vif->mac->macid, vif->vifid);
1189}
1190
1191void qtnf_virtual_intf_cleanup(struct net_device *ndev)
1192{
1193        struct qtnf_vif *vif = qtnf_netdev_get_priv(ndev);
1194        struct qtnf_wmac *mac = wiphy_priv(vif->wdev.wiphy);
1195
1196        if (vif->wdev.iftype == NL80211_IFTYPE_STATION)
1197                qtnf_disconnect(vif->wdev.wiphy, ndev,
1198                                WLAN_REASON_DEAUTH_LEAVING);
1199
1200        qtnf_scan_done(mac, true);
1201}
1202
1203void qtnf_cfg80211_vif_reset(struct qtnf_vif *vif)
1204{
1205        if (vif->wdev.iftype == NL80211_IFTYPE_STATION)
1206                cfg80211_disconnected(vif->netdev, WLAN_REASON_DEAUTH_LEAVING,
1207                                      NULL, 0, 1, GFP_KERNEL);
1208
1209        cfg80211_shutdown_all_interfaces(vif->wdev.wiphy);
1210}
1211
1212void qtnf_band_init_rates(struct ieee80211_supported_band *band)
1213{
1214        switch (band->band) {
1215        case NL80211_BAND_2GHZ:
1216                band->bitrates = qtnf_rates_2g;
1217                band->n_bitrates = ARRAY_SIZE(qtnf_rates_2g);
1218                break;
1219        case NL80211_BAND_5GHZ:
1220                band->bitrates = qtnf_rates_5g;
1221                band->n_bitrates = ARRAY_SIZE(qtnf_rates_5g);
1222                break;
1223        default:
1224                band->bitrates = NULL;
1225                band->n_bitrates = 0;
1226                break;
1227        }
1228}
1229