Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b57c1a7 authored by Avinash Patil's avatar Avinash Patil Committed by Kalle Valo
Browse files

mwifiex: handle radar detect event from FW



This patch adds support for radar_detected event from FW.
Driver in turn would stop netdev queues to stop TX traffic and
issue RADAR_DETECT event to cfg80211.

Signed-off-by: default avatarAvinash Patil <patila@marvell.com>
Signed-off-by: default avatarQingshui Gao <gaoqs@marvell.com>
Signed-off-by: default avatarCathy Luo <cluo@marvell.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 0a694d68
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -216,3 +216,27 @@ int mwifiex_11h_handle_chanrpt_ready(struct mwifiex_private *priv,

	return 0;
}

/* Handler for radar detected event from FW.*/
int mwifiex_11h_handle_radar_detected(struct mwifiex_private *priv,
				      struct sk_buff *skb)
{
	struct mwifiex_radar_det_event *rdr_event;

	rdr_event = (void *)(skb->data + sizeof(u32));

	if (le32_to_cpu(rdr_event->passed)) {
		dev_notice(priv->adapter->dev,
			   "radar detected; indicating kernel\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);
	} else {
		dev_dbg(priv->adapter->dev, "false radar detection event!\n");
	}

	return 0;
}
+20 −0
Original line number Diff line number Diff line
@@ -495,6 +495,7 @@ enum P2P_MODES {
#define EVENT_HOSTWAKE_STAIE		0x0000004d
#define EVENT_CHANNEL_SWITCH_ANN        0x00000050
#define EVENT_TDLS_GENERIC_EVENT        0x00000052
#define EVENT_RADAR_DETECTED		0x00000053
#define EVENT_CHANNEL_REPORT_RDY        0x00000054
#define EVENT_EXT_SCAN_REPORT           0x00000058
#define EVENT_REMAIN_ON_CHAN_EXPIRED    0x0000005f
@@ -1813,6 +1814,25 @@ struct mwifiex_ie_types_rssi_threshold {
	u8 evt_freq;
} __packed;

#define MWIFIEX_DFS_REC_HDR_LEN		8
#define MWIFIEX_DFS_REC_HDR_NUM		10
#define MWIFIEX_BIN_COUNTER_LEN		7

struct mwifiex_radar_det_event {
	__le32 detect_count;
	u8 reg_domain;  /*1=fcc, 2=etsi, 3=mic*/
	u8 det_type;  /*0=none, 1=pw(chirp), 2=pri(radar)*/
	__le16 pw_chirp_type;
	u8 pw_chirp_idx;
	u8 pw_value;
	u8 pri_radar_type;
	u8 pri_bincnt;
	u8 bin_counter[MWIFIEX_BIN_COUNTER_LEN];
	u8 num_dfs_records;
	u8 dfs_record_hdr[MWIFIEX_DFS_REC_HDR_NUM][MWIFIEX_DFS_REC_HDR_LEN];
	__le32 passed;
} __packed;

struct meas_rpt_map {
	u8 rssi:3;
	u8 unmeasured:1;
+2 −0
Original line number Diff line number Diff line
@@ -1395,6 +1395,8 @@ mwifiex_clone_skb_for_tx_status(struct mwifiex_private *priv,
				struct sk_buff *skb, u8 flag, u64 *cookie);
void mwifiex_dfs_cac_work_queue(struct work_struct *work);
void mwifiex_abort_cac(struct mwifiex_private *priv);
int mwifiex_11h_handle_radar_detected(struct mwifiex_private *priv,
				      struct sk_buff *skb);

void mwifiex_hist_data_set(struct mwifiex_private *priv, u8 rx_rate, s8 snr,
			   s8 nflr);
+5 −0
Original line number Diff line number Diff line
@@ -521,6 +521,11 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
		ret = mwifiex_11h_handle_chanrpt_ready(priv,
						       adapter->event_skb);
		break;
	case EVENT_RADAR_DETECTED:
		dev_dbg(adapter->dev, "event: Radar detected\n");
		ret = mwifiex_11h_handle_radar_detected(priv,
							adapter->event_skb);
		break;
	default:
		dev_dbg(adapter->dev, "event: unknown event id: %#x\n",
			eventcause);
+4 −0
Original line number Diff line number Diff line
@@ -221,6 +221,10 @@ int mwifiex_process_uap_event(struct mwifiex_private *priv)
		dev_dbg(adapter->dev, "event: Channel Report\n");
		mwifiex_11h_handle_chanrpt_ready(priv, adapter->event_skb);
		break;
	case EVENT_RADAR_DETECTED:
		dev_dbg(adapter->dev, "event: Radar detected\n");
		mwifiex_11h_handle_radar_detected(priv, adapter->event_skb);
		break;
	default:
		dev_dbg(adapter->dev, "event: unknown event id: %#x\n",
			eventcause);