These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / net / wireless / mwifiex / 11h.c
index 3ab87a8..71a1b58 100644 (file)
@@ -134,8 +134,8 @@ void mwifiex_dfs_cac_work_queue(struct work_struct *work)
 
        chandef = priv->dfs_chandef;
        if (priv->wdev.cac_started) {
-               dev_dbg(priv->adapter->dev,
-                       "CAC timer finished; No radar detected\n");
+               mwifiex_dbg(priv->adapter, MSG,
+                           "CAC timer finished; No radar detected\n");
                cfg80211_cac_event(priv->netdev, &chandef,
                                   NL80211_RADAR_CAC_FINISHED,
                                   GFP_KERNEL);
@@ -161,21 +161,40 @@ int mwifiex_cmd_issue_chan_report_request(struct mwifiex_private *priv,
        cr_req->chan_desc.chan_width = radar_params->chandef->width;
        cr_req->msec_dwell_time = cpu_to_le32(radar_params->cac_time_ms);
 
-       dev_dbg(priv->adapter->dev,
-               "11h: issuing DFS Radar check for channel=%d\n",
-               radar_params->chandef->chan->hw_value);
+       if (radar_params->cac_time_ms)
+               mwifiex_dbg(priv->adapter, MSG,
+                           "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;
 }
 
+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
  * or during unload.
  */
 void mwifiex_abort_cac(struct mwifiex_private *priv)
 {
        if (priv->wdev.cac_started) {
-               dev_dbg(priv->adapter->dev,
-                       "Aborting delayed work for CAC.\n");
+               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,
+                           "Aborting delayed work for CAC.\n");
                cancel_delayed_work_sync(&priv->dfs_cac_work);
                cfg80211_cac_event(priv->netdev, &priv->dfs_chandef,
                                   NL80211_RADAR_CAC_ABORTED, GFP_KERNEL);
@@ -199,7 +218,8 @@ int mwifiex_11h_handle_chanrpt_ready(struct mwifiex_private *priv,
                                sizeof(u32));
 
        if (le32_to_cpu(rpt_event->result) != HostCmd_RESULT_OK) {
-               dev_err(priv->adapter->dev, "Error in channel report event\n");
+               mwifiex_dbg(priv->adapter, ERROR,
+                           "Error in channel report event\n");
                return -1;
        }
 
@@ -212,8 +232,8 @@ int mwifiex_11h_handle_chanrpt_ready(struct mwifiex_private *priv,
                switch (le16_to_cpu(rpt->header.type)) {
                case TLV_TYPE_CHANRPT_11H_BASIC:
                        if (rpt->map.radar) {
-                               dev_notice(priv->adapter->dev,
-                                          "RADAR Detected on channel %d!\n",
+                               mwifiex_dbg(priv->adapter, MSG,
+                                           "RADAR Detected on channel %d!\n",
                                            priv->dfs_chandef.chan->hw_value);
                                cancel_delayed_work_sync(&priv->dfs_cac_work);
                                cfg80211_cac_event(priv->netdev,
@@ -242,16 +262,20 @@ int mwifiex_11h_handle_radar_detected(struct mwifiex_private *priv,
        rdr_event = (void *)(skb->data + sizeof(u32));
 
        if (le32_to_cpu(rdr_event->passed)) {
-               dev_notice(priv->adapter->dev,
-                          "radar detected; indicating kernel\n");
+               mwifiex_dbg(priv->adapter, MSG,
+                           "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,
                                     GFP_KERNEL);
-               dev_dbg(priv->adapter->dev, "regdomain: %d\n",
-                       rdr_event->reg_domain);
-               dev_dbg(priv->adapter->dev, "radar detection type: %d\n",
-                       rdr_event->det_type);
+               mwifiex_dbg(priv->adapter, MSG, "regdomain: %d\n",
+                           rdr_event->reg_domain);
+               mwifiex_dbg(priv->adapter, MSG, "radar detection type: %d\n",
+                           rdr_event->det_type);
        } else {
-               dev_dbg(priv->adapter->dev, "false radar detection event!\n");
+               mwifiex_dbg(priv->adapter, MSG,
+                           "false radar detection event!\n");
        }
 
        return 0;
@@ -276,20 +300,20 @@ void mwifiex_dfs_chan_sw_work_queue(struct work_struct *work)
 
        bss_cfg = &priv->bss_cfg;
        if (!bss_cfg->beacon_period) {
-               dev_err(priv->adapter->dev,
-                       "channel switch: AP already stopped\n");
+               mwifiex_dbg(priv->adapter, ERROR,
+                           "channel switch: AP already stopped\n");
                return;
        }
 
-       mwifiex_uap_set_channel(bss_cfg, priv->dfs_chandef);
+       mwifiex_uap_set_channel(priv, bss_cfg, priv->dfs_chandef);
 
        if (mwifiex_config_start_uap(priv, bss_cfg)) {
-               dev_dbg(priv->adapter->dev,
-                       "Failed to start AP after channel switch\n");
+               mwifiex_dbg(priv->adapter, ERROR,
+                           "Failed to start AP after channel switch\n");
                return;
        }
 
-       dev_notice(priv->adapter->dev,
-                  "indicating channel switch completion to kernel\n");
+       mwifiex_dbg(priv->adapter, MSG,
+                   "indicating channel switch completion to kernel\n");
        cfg80211_ch_switch_notify(priv->netdev, &priv->dfs_chandef);
 }