From 50141c53a3a95dffda046201526093487a3ef437 Mon Sep 17 00:00:00 2001 From: Dhanashri Atre Date: Thu, 7 Apr 2016 13:15:29 -0700 Subject: [PATCH] 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 --- core/dp/txrx/ol_txrx.c | 5 +++-- core/hdd/src/wlan_hdd_assoc.c | 31 ++++++++++++++-------------- core/hdd/src/wlan_hdd_ocb.c | 14 ++++++------- core/hdd/src/wlan_hdd_softap_tx_rx.c | 16 +++++++------- 4 files changed, 33 insertions(+), 33 deletions(-) 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