static int qtnf_change_virtual_intf(struct wiphy *wiphy, struct net_device *dev, enum nl80211_iftype type, struct vif_params *params) { struct qtnf_vif *vif = qtnf_netdev_get_priv(dev); u8 *mac_addr; int ret; if (params) mac_addr = params->macaddr; else mac_addr = NULL; qtnf_scan_done(vif->mac, true); ret = qtnf_cmd_send_change_intf_type(vif, type, mac_addr); if (ret) { pr_err("VIF%u.%u: failed to change VIF type: %d\n", vif->mac->macid, vif->vifid, ret); return ret; } vif->wdev.iftype = type; return 0; }
void qtnf_virtual_intf_cleanup(struct net_device *ndev) { struct qtnf_vif *vif = qtnf_netdev_get_priv(ndev); struct qtnf_wmac *mac = wiphy_priv(vif->wdev.wiphy); if (vif->wdev.iftype == NL80211_IFTYPE_STATION) { switch (vif->sta_state) { case QTNF_STA_DISCONNECTED: break; case QTNF_STA_CONNECTING: cfg80211_connect_result(vif->netdev, vif->bss_cfg.bssid, NULL, 0, NULL, 0, WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_KERNEL); qtnf_disconnect(vif->wdev.wiphy, ndev, WLAN_REASON_DEAUTH_LEAVING); break; case QTNF_STA_CONNECTED: cfg80211_disconnected(vif->netdev, WLAN_REASON_DEAUTH_LEAVING, NULL, 0, 1, GFP_KERNEL); qtnf_disconnect(vif->wdev.wiphy, ndev, WLAN_REASON_DEAUTH_LEAVING); break; } vif->sta_state = QTNF_STA_DISCONNECTED; qtnf_scan_done(mac, true); } }
static void qtnf_scan_timeout(unsigned long data) { struct qtnf_wmac *mac = (struct qtnf_wmac *)data; pr_warn("mac%d scan timed out\n", mac->macid); qtnf_scan_done(mac, true); }
static void qtnf_scan_timeout(struct timer_list *t) { struct qtnf_wmac *mac = from_timer(mac, t, scan_timeout); pr_warn("mac%d scan timed out\n", mac->macid); qtnf_scan_done(mac, true); }
int qtnf_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev) { struct net_device *netdev = wdev->netdev; struct qtnf_vif *vif; if (WARN_ON(!netdev)) return -EFAULT; vif = qtnf_netdev_get_priv(wdev->netdev); qtnf_scan_done(vif->mac, true); if (qtnf_cmd_send_del_intf(vif)) pr_err("VIF%u.%u: failed to delete VIF\n", vif->mac->macid, vif->vifid); /* Stop data */ netif_tx_stop_all_queues(netdev); if (netif_carrier_ok(netdev)) netif_carrier_off(netdev); if (netdev->reg_state == NETREG_REGISTERED) unregister_netdevice(netdev); vif->netdev->ieee80211_ptr = NULL; vif->netdev = NULL; vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED; eth_zero_addr(vif->mac_addr); eth_zero_addr(vif->bssid); return 0; }
static int qtnf_event_handle_scan_complete(struct qtnf_wmac *mac, const struct qlink_event_scan_complete *status, u16 len) { if (len < sizeof(*status)) { pr_err("MAC%u: payload is too short\n", mac->macid); return -EINVAL; } qtnf_scan_done(mac, le32_to_cpu(status->flags) & QLINK_SCAN_ABORTED); return 0; }
static int qtnf_stop_ap(struct wiphy *wiphy, struct net_device *dev) { struct qtnf_vif *vif = qtnf_netdev_get_priv(dev); int ret; qtnf_scan_done(vif->mac, true); ret = qtnf_cmd_send_stop_ap(vif); if (ret) { pr_err("VIF%u.%u: failed to stop AP operation in FW\n", vif->mac->macid, vif->vifid); netif_carrier_off(vif->netdev); } return ret; }
static int qtnf_del_station(struct wiphy *wiphy, struct net_device *dev, struct station_del_parameters *params) { struct qtnf_vif *vif = qtnf_netdev_get_priv(dev); int ret; if (params->mac && (vif->wdev.iftype == NL80211_IFTYPE_AP) && !is_broadcast_ether_addr(params->mac) && !qtnf_sta_list_lookup(&vif->sta_list, params->mac)) return 0; qtnf_scan_done(vif->mac, true); ret = qtnf_cmd_send_del_sta(vif, params); if (ret) pr_err("VIF%u.%u: failed to delete STA %pM\n", vif->mac->macid, vif->vifid, params->mac); return ret; }