Browse Source

qcacld-3.0: Add SSR support for monitor mode

Presently SSR is not supported in the monitor mode, in the debug
builds the device enters bad state when the SSR is triggered
in the monitor mode.

Make changes to support SSR in monitor mode.

Change-Id: Iee88a0c1aca1b093607cea20ee1957be55a33598
CRs-Fixed: 2034240
Arunk Khandavalli 7 năm trước cách đây
mục cha
commit
062fb036ec

+ 2 - 0
core/hdd/inc/wlan_hdd_main.h

@@ -1325,6 +1325,8 @@ struct hdd_adapter {
 	bool con_status;
 	bool con_status;
 	bool dad;
 	bool dad;
 	uint8_t active_ac;
 	uint8_t active_ac;
+	uint32_t mon_chan;
+	uint32_t mon_bandwidth;
 };
 };
 
 
 #define WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) (&(pAdapter)->sessionCtx.station)
 #define WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) (&(pAdapter)->sessionCtx.station)

+ 10 - 0
core/hdd/inc/wlan_hdd_wext.h

@@ -464,4 +464,14 @@ int wlan_hdd_get_peer_info(struct hdd_adapter *adapter,
 			   struct qdf_mac_addr macaddress,
 			   struct qdf_mac_addr macaddress,
 			   struct sir_peer_info_ext *peer_info_ext);
 			   struct sir_peer_info_ext *peer_info_ext);
 
 
+/**
+ * wlan_hdd_set_mon_chan() - Set capture channel on the monitor mode interface.
+ * @adapter: Handle to adapter
+ * @chan: Monitor mode channel
+ * @bandwidth: Capture channel bandwidth
+ *
+ * Return: 0 on success else error code.
+ */
+int wlan_hdd_set_mon_chan(struct hdd_adapter *adapter, uint32_t chan,
+			  uint32_t bandwidth);
 #endif /* __WEXT_IW_H__ */
 #endif /* __WEXT_IW_H__ */

+ 6 - 1
core/hdd/src/wlan_hdd_main.c

@@ -5154,7 +5154,12 @@ QDF_STATUS hdd_start_all_adapters(struct hdd_context *hdd_ctx)
 					 GFP_KERNEL);
 					 GFP_KERNEL);
 #endif
 #endif
 			break;
 			break;
-
+		case QDF_MONITOR_MODE:
+			hdd_init_station_mode(adapter);
+			hdd_set_mon_rx_cb(adapter->dev);
+			wlan_hdd_set_mon_chan(adapter, adapter->mon_chan,
+					      adapter->mon_bandwidth);
+			break;
 		default:
 		default:
 			break;
 			break;
 		}
 		}

+ 4 - 0
core/hdd/src/wlan_hdd_power.c

@@ -1385,8 +1385,12 @@ QDF_STATUS hdd_wlan_re_init(void)
 		pAdapter = hdd_get_adapter(hdd_ctx, QDF_SAP_MODE);
 		pAdapter = hdd_get_adapter(hdd_ctx, QDF_SAP_MODE);
 		if (!pAdapter) {
 		if (!pAdapter) {
 			pAdapter = hdd_get_adapter(hdd_ctx, QDF_IBSS_MODE);
 			pAdapter = hdd_get_adapter(hdd_ctx, QDF_IBSS_MODE);
+			if (!pAdapter) {
+				pAdapter = hdd_get_adapter(hdd_ctx,
+							   QDF_MONITOR_MODE);
 			if (!pAdapter)
 			if (!pAdapter)
 				hdd_err("Failed to get Adapter!");
 				hdd_err("Failed to get Adapter!");
+			}
 
 
 		}
 		}
 	}
 	}

+ 0 - 4
core/hdd/src/wlan_hdd_tx_rx.c

@@ -1693,10 +1693,6 @@ int hdd_set_mon_rx_cb(struct net_device *dev)
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 	void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 
 
-	ret = wlan_hdd_validate_context(hdd_ctx);
-	if (0 != ret)
-		return ret;
-
 	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
 	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
 	txrx_ops.rx.rx = hdd_mon_rx_packet_cbk;
 	txrx_ops.rx.rx = hdd_mon_rx_packet_cbk;
 	hdd_monitor_set_rx_monitor_cb(&txrx_ops, hdd_rx_monitor_callback);
 	hdd_monitor_set_rx_monitor_cb(&txrx_ops, hdd_rx_monitor_callback);

+ 3 - 9
core/hdd/src/wlan_hdd_wext.c

@@ -12907,15 +12907,7 @@ static int iw_set_band_config(struct net_device *dev,
 	return ret;
 	return ret;
 }
 }
 
 
-/**
- * wlan_hdd_set_mon_chan() - Set capture channel on the monitor mode interface.
- * @adapter: Handle to adapter
- * @chan: Monitor mode channel
- * @bandwidth: Capture channel bandwidth
- *
- * Return: 0 on success else error code.
- */
-static int wlan_hdd_set_mon_chan(struct hdd_adapter *adapter, uint32_t chan,
+int wlan_hdd_set_mon_chan(struct hdd_adapter *adapter, uint32_t chan,
 				 uint32_t bandwidth)
 				 uint32_t bandwidth)
 {
 {
 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
@@ -12957,6 +12949,8 @@ static int wlan_hdd_set_mon_chan(struct hdd_adapter *adapter, uint32_t chan,
 			status);
 			status);
 	}
 	}
 
 
+	adapter->mon_chan = chan;
+	adapter->mon_bandwidth = bandwidth;
 	return qdf_status_to_os_return(status);
 	return qdf_status_to_os_return(status);
 }
 }