Răsfoiți Sursa

qcacld-3.0: Register vdev before registering peer

Ensure that the per vdev rx callback is registered before
registering the peer. The peer registration function may
try to flush the rx frames so we need to ensure that the rx
callback is registered before it is called.

Change-Id: Ibd1d73d89105bbc3f9d29fa2c64e9f515d4b0da5
CRs-Fixed: 1000834
Dhanashri Atre 9 ani în urmă
părinte
comite
50141c53a3

+ 3 - 2
core/dp/txrx/ol_txrx.c

@@ -1389,7 +1389,7 @@ void ol_txrx_flush_rx_frames(struct ol_txrx_peer_t *peer,
 
 	qdf_spin_lock_bh(&peer->peer_info_lock);
 
-	if (peer->state >= OL_TXRX_PEER_STATE_CONN)
+	if (peer->state >= OL_TXRX_PEER_STATE_CONN && peer->vdev->rx)
 		data_rx = peer->vdev->rx;
 	else
 		drop = true;
@@ -3461,7 +3461,8 @@ static void ol_rx_data_cb(struct ol_txrx_peer_t *peer,
 		goto free_buf;
 
 	qdf_spin_lock_bh(&peer->peer_info_lock);
-	if (qdf_unlikely(!(peer->state >= OL_TXRX_PEER_STATE_CONN))) {
+	if (qdf_unlikely(!(peer->state >= OL_TXRX_PEER_STATE_CONN) ||
+					 !peer->vdev->rx)) {
 		qdf_spin_unlock_bh(&peer->peer_info_lock);
 		goto free_buf;
 	}

+ 15 - 16
core/hdd/src/wlan_hdd_assoc.c

@@ -1303,6 +1303,14 @@ static QDF_STATUS hdd_roam_register_sta(hdd_adapter_t *pAdapter,
 		staDesc.is_wapi_supported = 0;
 #endif /* FEATURE_WLAN_WAPI */
 
+	/* Register the vdev transmit and receive functions */
+	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
+	txrx_ops.rx.rx = hdd_rx_packet_cbk;
+	ol_txrx_vdev_register(
+		 ol_txrx_get_vdev_from_vdev_id(pAdapter->sessionId),
+		 pAdapter, &txrx_ops);
+	pAdapter->tx_fn = txrx_ops.tx.tx;
+
 	qdf_status = ol_txrx_register_peer(&staDesc);
 
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
@@ -1312,14 +1320,6 @@ static QDF_STATUS hdd_roam_register_sta(hdd_adapter_t *pAdapter,
 		return qdf_status;
 	}
 
-	/* Register the vdev transmit and receive functions */
-	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
-	txrx_ops.rx.rx = hdd_rx_packet_cbk;
-	ol_txrx_vdev_register(
-		 ol_txrx_get_vdev_from_vdev_id(pAdapter->sessionId),
-		 pAdapter, &txrx_ops);
-	pAdapter->tx_fn = txrx_ops.tx.tx;
-
 	if (!pRoamInfo->fAuthRequired) {
 		/*
 		 * Connections that do not need Upper layer auth, transition
@@ -2868,6 +2868,13 @@ QDF_STATUS hdd_roam_register_tdlssta(hdd_adapter_t *pAdapter,
 	(hdd_wmm_is_active(pAdapter)) ? (staDesc.is_qos_enabled = 1)
 	: (staDesc.is_qos_enabled = 0);
 
+	/* Register the vdev transmit and receive functions */
+	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
+	txrx_ops.rx.rx = hdd_rx_packet_cbk;
+	ol_txrx_vdev_register(
+		 ol_txrx_get_vdev_from_vdev_id(pAdapter->sessionId),
+		 pAdapter, &txrx_ops);
+	pAdapter->tx_fn = txrx_ops.tx.tx;
 
 	/* Register the Station with TL...  */
 	qdf_status = ol_txrx_register_peer(&staDesc);
@@ -2877,14 +2884,6 @@ QDF_STATUS hdd_roam_register_tdlssta(hdd_adapter_t *pAdapter,
 		return qdf_status;
 	}
 
-	/* Register the vdev transmit and receive functions */
-	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
-	txrx_ops.rx.rx = hdd_rx_packet_cbk;
-	ol_txrx_vdev_register(
-		 ol_txrx_get_vdev_from_vdev_id(pAdapter->sessionId),
-		 pAdapter, &txrx_ops);
-	pAdapter->tx_fn = txrx_ops.tx.tx;
-
 	return qdf_status;
 }
 

+ 7 - 7
core/hdd/src/wlan_hdd_ocb.c

@@ -263,13 +263,6 @@ static int hdd_ocb_register_sta(hdd_adapter_t *adapter)
 	sta_desc.sta_id = peer_id;
 	sta_desc.is_qos_enabled = 1;
 
-	qdf_status = ol_txrx_register_peer(&sta_desc);
-	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
-		hddLog(LOGE, FL("Failed to register. Status= %d [0x%08X]"),
-		       qdf_status, qdf_status);
-		return -EINVAL;
-	}
-
 	/* Register the vdev transmit and receive functions */
 	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
 	txrx_ops.rx.rx = hdd_rx_packet_cbk;
@@ -278,6 +271,13 @@ static int hdd_ocb_register_sta(hdd_adapter_t *adapter)
 		 adapter, &txrx_ops);
 	adapter->tx_fn = txrx_ops.tx.tx;
 
+	qdf_status = ol_txrx_register_peer(&sta_desc);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
+		hddLog(LOGE, FL("Failed to register. Status= %d [0x%08X]"),
+		       qdf_status, qdf_status);
+		return -EINVAL;
+	}
+
 	if (pHddStaCtx->conn_info.staId[0] != 0 &&
 	     pHddStaCtx->conn_info.staId[0] != peer_id) {
 		hddLog(LOGE, FL("The ID for the OCB station has changed."));

+ 8 - 8
core/hdd/src/wlan_hdd_softap_tx_rx.c

@@ -706,14 +706,6 @@ QDF_STATUS hdd_softap_register_sta(hdd_adapter_t *pAdapter,
 		  "HDD SOFTAP register TL QoS_enabled=%d",
 		  staDesc.is_qos_enabled);
 
-	qdf_status = ol_txrx_register_peer(&staDesc);
-	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
-		QDF_TRACE(QDF_MODULE_ID_HDD_SAP_DATA, QDF_TRACE_LEVEL_ERROR,
-			  "SOFTAP ol_txrx_register_peer() failed to register.  Status= %d [0x%08X]",
-			  qdf_status, qdf_status);
-		return qdf_status;
-	}
-
 	/* Register the vdev transmit and receive functions */
 	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
 	txrx_ops.rx.rx = hdd_softap_rx_packet_cbk;
@@ -722,6 +714,14 @@ QDF_STATUS hdd_softap_register_sta(hdd_adapter_t *pAdapter,
 		 pAdapter, &txrx_ops);
 	pAdapter->tx_fn = txrx_ops.tx.tx;
 
+	qdf_status = ol_txrx_register_peer(&staDesc);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
+		QDF_TRACE(QDF_MODULE_ID_HDD_SAP_DATA, QDF_TRACE_LEVEL_ERROR,
+			  "SOFTAP ol_txrx_register_peer() failed to register.  Status= %d [0x%08X]",
+			  qdf_status, qdf_status);
+		return qdf_status;
+	}
+
 	/* if ( WPA ), tell TL to go to 'connected' and after keys come to the
 	 * driver then go to 'authenticated'.  For all other authentication
 	 * types (those that do not require upper layer authentication) we can