Exemplo n.º 1
0
static int qtnf_channel_switch(struct wiphy *wiphy, struct net_device *dev,
			       struct cfg80211_csa_settings *params)
{
	struct qtnf_wmac *mac = wiphy_priv(wiphy);
	struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
	int ret;

	pr_debug("%s: chan(%u) count(%u) radar(%u) block_tx(%u)\n", dev->name,
		 params->chandef.chan->hw_value, params->count,
		 params->radar_required, params->block_tx);

	switch (vif->wdev.iftype) {
	case NL80211_IFTYPE_AP:
		if (!(vif->bss_status & QTNF_STATE_AP_START)) {
			pr_warn("AP not started on %s\n", dev->name);
			return -ENOTCONN;
		}
		break;
	default:
		pr_err("unsupported vif type (%d) on %s\n",
		       vif->wdev.iftype, dev->name);
		return -EOPNOTSUPP;
	}

	if (vif->vifid != 0) {
		if (!(mac->status & QTNF_MAC_CSA_ACTIVE))
			return -EOPNOTSUPP;

		if (!cfg80211_chandef_identical(&params->chandef,
						&mac->csa_chandef))
			return -EINVAL;

		return 0;
	}

	if (!cfg80211_chandef_valid(&params->chandef)) {
		pr_err("%s: invalid channel\n", dev->name);
		return -EINVAL;
	}

	if (cfg80211_chandef_identical(&params->chandef, &mac->chandef)) {
		pr_err("%s: switch request to the same channel\n", dev->name);
		return -EALREADY;
	}

	ret = qtnf_cmd_send_chan_switch(mac, params);
	if (ret)
		pr_warn("%s: failed to switch to channel (%u)\n",
			dev->name, params->chandef.chan->hw_value);

	return ret;
}
Exemplo n.º 2
0
static int qtnf_channel_switch(struct wiphy *wiphy, struct net_device *dev,
			       struct cfg80211_csa_settings *params)
{
	struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
	int ret;

	pr_debug("%s: chan(%u) count(%u) radar(%u) block_tx(%u)\n", dev->name,
		 params->chandef.chan->hw_value, params->count,
		 params->radar_required, params->block_tx);

	if (!cfg80211_chandef_valid(&params->chandef)) {
		pr_err("%s: invalid channel\n", dev->name);
		return -EINVAL;
	}

	ret = qtnf_cmd_send_chan_switch(vif, params);
	if (ret)
		pr_warn("%s: failed to switch to channel (%u)\n",
			dev->name, params->chandef.chan->hw_value);

	return ret;
}