diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index c79498657c96..11e862e7a821 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/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; } diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 1a7a15758891..07e3f2450cb3 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/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; } diff --git a/core/hdd/src/wlan_hdd_ocb.c b/core/hdd/src/wlan_hdd_ocb.c index ecfa1d6cf39d..0a5c267ea6d9 100644 --- a/core/hdd/src/wlan_hdd_ocb.c +++ b/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.")); diff --git a/core/hdd/src/wlan_hdd_softap_tx_rx.c b/core/hdd/src/wlan_hdd_softap_tx_rx.c index d73f07e8a6f1..faf3fbe53a87 100644 --- a/core/hdd/src/wlan_hdd_softap_tx_rx.c +++ b/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