Commit 888f1564 authored by Igor Mitsyanko's avatar Igor Mitsyanko Committed by Kalle Valo

qtnfmac: allow to control DFS slave radar detection

In ETSI region DFS slave device can operate in two modes on DFS channels:
 - do on-channel radar detection and use higher Tx power
 - don't do radar detection and use lower Tx power as a consequence

Allow user to control that behavior through qtnfmac module parameter.
Signed-off-by: default avatarIgor Mitsyanko <igor.mitsyanko.os@quantenna.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 4f87d486
...@@ -1008,7 +1008,7 @@ static void qtnf_cfg80211_reg_notifier(struct wiphy *wiphy, ...@@ -1008,7 +1008,7 @@ static void qtnf_cfg80211_reg_notifier(struct wiphy *wiphy,
pr_debug("MAC%u: initiator=%d alpha=%c%c\n", mac->macid, req->initiator, pr_debug("MAC%u: initiator=%d alpha=%c%c\n", mac->macid, req->initiator,
req->alpha2[0], req->alpha2[1]); req->alpha2[0], req->alpha2[1]);
ret = qtnf_cmd_reg_notify(mac, req); ret = qtnf_cmd_reg_notify(mac, req, qtnf_mac_slave_radar_get(wiphy));
if (ret) { if (ret) {
pr_err("MAC%u: failed to update region to %c%c: %d\n", pr_err("MAC%u: failed to update region to %c%c: %d\n",
mac->macid, req->alpha2[0], req->alpha2[1], ret); mac->macid, req->alpha2[0], req->alpha2[1], ret);
......
...@@ -2367,7 +2367,8 @@ int qtnf_cmd_send_updown_intf(struct qtnf_vif *vif, bool up) ...@@ -2367,7 +2367,8 @@ int qtnf_cmd_send_updown_intf(struct qtnf_vif *vif, bool up)
return ret; return ret;
} }
int qtnf_cmd_reg_notify(struct qtnf_wmac *mac, struct regulatory_request *req) int qtnf_cmd_reg_notify(struct qtnf_wmac *mac, struct regulatory_request *req,
bool slave_radar)
{ {
struct wiphy *wiphy = priv_to_wiphy(mac); struct wiphy *wiphy = priv_to_wiphy(mac);
struct qtnf_bus *bus = mac->bus; struct qtnf_bus *bus = mac->bus;
...@@ -2429,6 +2430,7 @@ int qtnf_cmd_reg_notify(struct qtnf_wmac *mac, struct regulatory_request *req) ...@@ -2429,6 +2430,7 @@ int qtnf_cmd_reg_notify(struct qtnf_wmac *mac, struct regulatory_request *req)
break; break;
} }
cmd->slave_radar = slave_radar;
cmd->num_channels = 0; cmd->num_channels = 0;
for (band = 0; band < NUM_NL80211_BANDS; band++) { for (band = 0; band < NUM_NL80211_BANDS; band++) {
......
...@@ -57,7 +57,8 @@ int qtnf_cmd_send_disconnect(struct qtnf_vif *vif, ...@@ -57,7 +57,8 @@ int qtnf_cmd_send_disconnect(struct qtnf_vif *vif,
u16 reason_code); u16 reason_code);
int qtnf_cmd_send_updown_intf(struct qtnf_vif *vif, int qtnf_cmd_send_updown_intf(struct qtnf_vif *vif,
bool up); bool up);
int qtnf_cmd_reg_notify(struct qtnf_wmac *mac, struct regulatory_request *req); int qtnf_cmd_reg_notify(struct qtnf_wmac *mac, struct regulatory_request *req,
bool slave_radar);
int qtnf_cmd_get_chan_stats(struct qtnf_wmac *mac, u16 channel, int qtnf_cmd_get_chan_stats(struct qtnf_wmac *mac, u16 channel,
struct qtnf_chan_stats *stats); struct qtnf_chan_stats *stats);
int qtnf_cmd_send_chan_switch(struct qtnf_vif *vif, int qtnf_cmd_send_chan_switch(struct qtnf_vif *vif,
......
...@@ -16,6 +16,10 @@ ...@@ -16,6 +16,10 @@
#define QTNF_DMP_MAX_LEN 48 #define QTNF_DMP_MAX_LEN 48
#define QTNF_PRIMARY_VIF_IDX 0 #define QTNF_PRIMARY_VIF_IDX 0
static bool slave_radar = true;
module_param(slave_radar, bool, 0644);
MODULE_PARM_DESC(slave_radar, "set 0 to disable radar detection in slave mode");
struct qtnf_frame_meta_info { struct qtnf_frame_meta_info {
u8 magic_s; u8 magic_s;
u8 ifidx; u8 ifidx;
...@@ -426,6 +430,11 @@ static struct qtnf_wmac *qtnf_core_mac_alloc(struct qtnf_bus *bus, ...@@ -426,6 +430,11 @@ static struct qtnf_wmac *qtnf_core_mac_alloc(struct qtnf_bus *bus,
return mac; return mac;
} }
bool qtnf_mac_slave_radar_get(struct wiphy *wiphy)
{
return slave_radar;
}
static const struct ethtool_ops qtnf_ethtool_ops = { static const struct ethtool_ops qtnf_ethtool_ops = {
.get_drvinfo = cfg80211_get_drvinfo, .get_drvinfo = cfg80211_get_drvinfo,
}; };
......
...@@ -134,6 +134,7 @@ struct qtnf_vif *qtnf_mac_get_free_vif(struct qtnf_wmac *mac); ...@@ -134,6 +134,7 @@ struct qtnf_vif *qtnf_mac_get_free_vif(struct qtnf_wmac *mac);
struct qtnf_vif *qtnf_mac_get_base_vif(struct qtnf_wmac *mac); struct qtnf_vif *qtnf_mac_get_base_vif(struct qtnf_wmac *mac);
void qtnf_mac_iface_comb_free(struct qtnf_wmac *mac); void qtnf_mac_iface_comb_free(struct qtnf_wmac *mac);
void qtnf_mac_ext_caps_free(struct qtnf_wmac *mac); void qtnf_mac_ext_caps_free(struct qtnf_wmac *mac);
bool qtnf_mac_slave_radar_get(struct wiphy *wiphy);
struct wiphy *qtnf_wiphy_allocate(struct qtnf_bus *bus); struct wiphy *qtnf_wiphy_allocate(struct qtnf_bus *bus);
int qtnf_core_net_attach(struct qtnf_wmac *mac, struct qtnf_vif *priv, int qtnf_core_net_attach(struct qtnf_wmac *mac, struct qtnf_vif *priv,
const char *name, unsigned char name_assign_type); const char *name, unsigned char name_assign_type);
......
...@@ -588,6 +588,7 @@ enum qlink_user_reg_hint_type { ...@@ -588,6 +588,7 @@ enum qlink_user_reg_hint_type {
* of &enum qlink_user_reg_hint_type. * of &enum qlink_user_reg_hint_type.
* @num_channels: number of &struct qlink_tlv_channel in a variable portion of a * @num_channels: number of &struct qlink_tlv_channel in a variable portion of a
* payload. * payload.
* @slave_radar: whether slave device should enable radar detection.
* @dfs_region: one of &enum qlink_dfs_regions. * @dfs_region: one of &enum qlink_dfs_regions.
* @info: variable portion of regulatory notifier callback. * @info: variable portion of regulatory notifier callback.
*/ */
...@@ -598,7 +599,8 @@ struct qlink_cmd_reg_notify { ...@@ -598,7 +599,8 @@ struct qlink_cmd_reg_notify {
u8 user_reg_hint_type; u8 user_reg_hint_type;
u8 num_channels; u8 num_channels;
u8 dfs_region; u8 dfs_region;
u8 rsvd[2]; u8 slave_radar;
u8 rsvd[1];
u8 info[0]; u8 info[0];
} __packed; } __packed;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment