From 2ddb03c7cb3d78d18a8cb2ef2f5d8c982a9fb73c Mon Sep 17 00:00:00 2001 From: Jeevan Kukkalli Date: Fri, 31 Jul 2020 14:30:26 +0530 Subject: [PATCH] qca-wifi: Send HMWDS ast add status WDI event Function to notify HMWDS ast add status to upper layers via newly added WDI event WDI_EVENT_HMWDS_AST_ADD_STATUS Change-Id: Ib6fad7a48425ce7de16d94bb401af0c428c8e556 CRs-Fixed: 2745460 --- dp/wifi3.0/dp_txrx_wds.c | 53 ++++++++++++++++++++++++++++++++++++++++ dp/wifi3.0/dp_txrx_wds.h | 16 ++++++++++++ 2 files changed, 69 insertions(+) diff --git a/dp/wifi3.0/dp_txrx_wds.c b/dp/wifi3.0/dp_txrx_wds.c index cb16420a30..4167da7920 100644 --- a/dp/wifi3.0/dp_txrx_wds.c +++ b/dp/wifi3.0/dp_txrx_wds.c @@ -1060,3 +1060,56 @@ int dp_peer_find_ast_index_by_flowq_id(struct cdp_soc_t *soc, return ast_index; } #endif + +void dp_hmwds_ast_add_notify(struct dp_peer *peer, + uint8_t *mac_addr, + enum cdp_txrx_ast_entry_type type, + QDF_STATUS err, + bool is_peer_map) +{ + struct dp_vdev *dp_vdev = peer->vdev; + struct dp_pdev *dp_pdev = dp_vdev->pdev; + struct cdp_peer_hmwds_ast_add_status add_status; + + /* Ignore ast types other than HM */ + if ((type != CDP_TXRX_AST_TYPE_WDS_HM) && + (type != CDP_TXRX_AST_TYPE_WDS_HM_SEC)) + return; + + /* existing ast delete in progress, will be attempted + * to add again after delete is complete. Send status then. + */ + if (err == QDF_STATUS_E_AGAIN) + return; + + /* peer map pending, notify actual status + * when peer map is received. + */ + if (!is_peer_map && (err == QDF_STATUS_SUCCESS)) + return; + + qdf_mem_zero(&add_status, sizeof(add_status)); + add_status.vdev_id = dp_vdev->vdev_id; + /* For type CDP_TXRX_AST_TYPE_WDS_HM_SEC dp_peer_add_ast() + * returns QDF_STATUS_E_FAILURE as it is host only entry. + * In such cases set err as success. Also err code set to + * QDF_STATUS_E_ALREADY indicates entry already exist in + * such cases set err as success too. Any other error code + * is actual error. + */ + if (((type == CDP_TXRX_AST_TYPE_WDS_HM_SEC) && + (err == QDF_STATUS_E_FAILURE)) || + (err == QDF_STATUS_E_ALREADY)) { + err = QDF_STATUS_SUCCESS; + } + add_status.status = err; + qdf_mem_copy(add_status.peer_mac, peer->mac_addr.raw, + QDF_MAC_ADDR_SIZE); + qdf_mem_copy(add_status.ast_mac, mac_addr, + QDF_MAC_ADDR_SIZE); +#ifdef WDI_EVENT_ENABLE + dp_wdi_event_handler(WDI_EVENT_HMWDS_AST_ADD_STATUS, dp_pdev->soc, + (void *)&add_status, 0, + WDI_NO_VAL, dp_pdev->pdev_id); +#endif +} diff --git a/dp/wifi3.0/dp_txrx_wds.h b/dp/wifi3.0/dp_txrx_wds.h index 8aa0207341..e9b424fc4f 100644 --- a/dp/wifi3.0/dp_txrx_wds.h +++ b/dp/wifi3.0/dp_txrx_wds.h @@ -66,6 +66,22 @@ dp_txrx_set_wds_rx_policy(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, u_int32_t val); #endif +/** + * dp_hmwds_ast_add_notify() - schedules hmwds ast add status work + * @peer: DP peer + * @mac_addr: ast mac addr + * @type: ast type + * @err: QDF_STATUS error code + * @is_peer_map: notify is from peer map + * + * Return: void + */ +void dp_hmwds_ast_add_notify(struct dp_peer *peer, + uint8_t *mac_addr, + enum cdp_txrx_ast_entry_type type, + QDF_STATUS err, + bool is_peer_map); + /** * dp_rx_wds_add_or_update_ast() - Add or update the ast entry. *