mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
mwifiex: disable CAC upon radar detection event
This patch adds support to disable ongoing CAC in FW upon detecting radar during CAC period. Signed-off-by: Avinash Patil <patila@marvell.com> Signed-off-by: Cathy Luo <cluo@marvell.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
7b7166256d
commit
511c8989fe
@ -161,19 +161,38 @@ int mwifiex_cmd_issue_chan_report_request(struct mwifiex_private *priv,
|
|||||||
cr_req->chan_desc.chan_width = radar_params->chandef->width;
|
cr_req->chan_desc.chan_width = radar_params->chandef->width;
|
||||||
cr_req->msec_dwell_time = cpu_to_le32(radar_params->cac_time_ms);
|
cr_req->msec_dwell_time = cpu_to_le32(radar_params->cac_time_ms);
|
||||||
|
|
||||||
mwifiex_dbg(priv->adapter, MSG,
|
if (radar_params->cac_time_ms)
|
||||||
"11h: issuing DFS Radar check for channel=%d\n",
|
mwifiex_dbg(priv->adapter, MSG,
|
||||||
radar_params->chandef->chan->hw_value);
|
"11h: issuing DFS Radar check for channel=%d\n",
|
||||||
|
radar_params->chandef->chan->hw_value);
|
||||||
|
else
|
||||||
|
mwifiex_dbg(priv->adapter, MSG, "cancelling CAC\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mwifiex_stop_radar_detection(struct mwifiex_private *priv,
|
||||||
|
struct cfg80211_chan_def *chandef)
|
||||||
|
{
|
||||||
|
struct mwifiex_radar_params radar_params;
|
||||||
|
|
||||||
|
memset(&radar_params, 0, sizeof(struct mwifiex_radar_params));
|
||||||
|
radar_params.chandef = chandef;
|
||||||
|
radar_params.cac_time_ms = 0;
|
||||||
|
|
||||||
|
return mwifiex_send_cmd(priv, HostCmd_CMD_CHAN_REPORT_REQUEST,
|
||||||
|
HostCmd_ACT_GEN_SET, 0, &radar_params, true);
|
||||||
|
}
|
||||||
|
|
||||||
/* This function is to abort ongoing CAC upon stopping AP operations
|
/* This function is to abort ongoing CAC upon stopping AP operations
|
||||||
* or during unload.
|
* or during unload.
|
||||||
*/
|
*/
|
||||||
void mwifiex_abort_cac(struct mwifiex_private *priv)
|
void mwifiex_abort_cac(struct mwifiex_private *priv)
|
||||||
{
|
{
|
||||||
if (priv->wdev.cac_started) {
|
if (priv->wdev.cac_started) {
|
||||||
|
if (mwifiex_stop_radar_detection(priv, &priv->dfs_chandef))
|
||||||
|
mwifiex_dbg(priv->adapter, ERROR,
|
||||||
|
"failed to stop CAC in FW\n");
|
||||||
mwifiex_dbg(priv->adapter, MSG,
|
mwifiex_dbg(priv->adapter, MSG,
|
||||||
"Aborting delayed work for CAC.\n");
|
"Aborting delayed work for CAC.\n");
|
||||||
cancel_delayed_work_sync(&priv->dfs_cac_work);
|
cancel_delayed_work_sync(&priv->dfs_cac_work);
|
||||||
@ -245,6 +264,9 @@ int mwifiex_11h_handle_radar_detected(struct mwifiex_private *priv,
|
|||||||
if (le32_to_cpu(rdr_event->passed)) {
|
if (le32_to_cpu(rdr_event->passed)) {
|
||||||
mwifiex_dbg(priv->adapter, MSG,
|
mwifiex_dbg(priv->adapter, MSG,
|
||||||
"radar detected; indicating kernel\n");
|
"radar detected; indicating kernel\n");
|
||||||
|
if (mwifiex_stop_radar_detection(priv, &priv->dfs_chandef))
|
||||||
|
mwifiex_dbg(priv->adapter, ERROR,
|
||||||
|
"Failed to stop CAC in FW\n");
|
||||||
cfg80211_radar_event(priv->adapter->wiphy, &priv->dfs_chandef,
|
cfg80211_radar_event(priv->adapter->wiphy, &priv->dfs_chandef,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
mwifiex_dbg(priv->adapter, MSG, "regdomain: %d\n",
|
mwifiex_dbg(priv->adapter, MSG, "regdomain: %d\n",
|
||||||
@ -252,7 +274,7 @@ int mwifiex_11h_handle_radar_detected(struct mwifiex_private *priv,
|
|||||||
mwifiex_dbg(priv->adapter, MSG, "radar detection type: %d\n",
|
mwifiex_dbg(priv->adapter, MSG, "radar detection type: %d\n",
|
||||||
rdr_event->det_type);
|
rdr_event->det_type);
|
||||||
} else {
|
} else {
|
||||||
mwifiex_dbg(priv->adapter, ERROR,
|
mwifiex_dbg(priv->adapter, MSG,
|
||||||
"false radar detection event!\n");
|
"false radar detection event!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1473,6 +1473,8 @@ mwifiex_clone_skb_for_tx_status(struct mwifiex_private *priv,
|
|||||||
void mwifiex_dfs_cac_work_queue(struct work_struct *work);
|
void mwifiex_dfs_cac_work_queue(struct work_struct *work);
|
||||||
void mwifiex_dfs_chan_sw_work_queue(struct work_struct *work);
|
void mwifiex_dfs_chan_sw_work_queue(struct work_struct *work);
|
||||||
void mwifiex_abort_cac(struct mwifiex_private *priv);
|
void mwifiex_abort_cac(struct mwifiex_private *priv);
|
||||||
|
int mwifiex_stop_radar_detection(struct mwifiex_private *priv,
|
||||||
|
struct cfg80211_chan_def *chandef);
|
||||||
int mwifiex_11h_handle_radar_detected(struct mwifiex_private *priv,
|
int mwifiex_11h_handle_radar_detected(struct mwifiex_private *priv,
|
||||||
struct sk_buff *skb);
|
struct sk_buff *skb);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user