diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index 3235b8044e..bb40b1c733 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -162,7 +162,7 @@ cdp_soc_set_nss_cfg(ol_txrx_soc_handle soc, uint32_t config) } static inline struct cdp_vdev * -cdp_vdev_attach(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, +cdp_vdev_attach(ol_txrx_soc_handle soc, uint8_t pdev_id, uint8_t *vdev_mac_addr, uint8_t vdev_id, enum wlan_op_mode op_mode, enum wlan_op_subtype subtype) { @@ -177,8 +177,9 @@ cdp_vdev_attach(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, !soc->ops->cmn_drv_ops->txrx_vdev_attach) return NULL; - return soc->ops->cmn_drv_ops->txrx_vdev_attach(pdev, - vdev_mac_addr, vdev_id, op_mode, subtype); + return soc->ops->cmn_drv_ops->txrx_vdev_attach(soc, pdev_id, + vdev_mac_addr, vdev_id, + op_mode, subtype); } #ifdef DP_FLOW_CTL @@ -239,27 +240,27 @@ static inline void cdp_flow_pool_unmap(ol_txrx_soc_handle soc, } #endif -static inline void -cdp_vdev_detach(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, - ol_txrx_vdev_delete_cb callback, void *cb_context) +static inline QDF_STATUS +cdp_vdev_detach(ol_txrx_soc_handle soc, uint8_t vdev_id, + ol_txrx_vdev_delete_cb callback, void *cb_context) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->txrx_vdev_detach) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->txrx_vdev_detach(vdev, - callback, cb_context); + return soc->ops->cmn_drv_ops->txrx_vdev_detach(soc, vdev_id, + callback, cb_context); } static inline int -cdp_pdev_attach_target(ol_txrx_soc_handle soc, struct cdp_pdev *pdev) +cdp_pdev_attach_target(ol_txrx_soc_handle soc, uint8_t pdev_id) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -272,7 +273,7 @@ cdp_pdev_attach_target(ol_txrx_soc_handle soc, struct cdp_pdev *pdev) !soc->ops->cmn_drv_ops->txrx_pdev_attach_target) return 0; - return soc->ops->cmn_drv_ops->txrx_pdev_attach_target(pdev); + return soc->ops->cmn_drv_ops->txrx_pdev_attach_target(soc, pdev_id); } static inline struct cdp_pdev *cdp_pdev_attach @@ -328,25 +329,25 @@ cdp_pdev_pre_detach(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, int force) soc->ops->cmn_drv_ops->txrx_pdev_pre_detach(pdev, force); } -static inline void -cdp_pdev_detach(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, int force) +static inline QDF_STATUS +cdp_pdev_detach(ol_txrx_soc_handle soc, uint8_t pdev_id, int force) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->txrx_pdev_detach) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->txrx_pdev_detach(pdev, force); + return soc->ops->cmn_drv_ops->txrx_pdev_detach(soc, pdev_id, force); } static inline void -cdp_pdev_deinit(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, int force) +cdp_pdev_deinit(ol_txrx_soc_handle soc, uint8_t pdev_id, int force) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -359,11 +360,11 @@ cdp_pdev_deinit(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, int force) !soc->ops->cmn_drv_ops->txrx_pdev_deinit) return; - soc->ops->cmn_drv_ops->txrx_pdev_deinit(pdev, force); + soc->ops->cmn_drv_ops->txrx_pdev_deinit(soc, pdev_id, force); } static inline void *cdp_peer_create - (ol_txrx_soc_handle soc, struct cdp_vdev *vdev, + (ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac_addr) { if (!soc || !soc->ops) { @@ -377,12 +378,12 @@ static inline void *cdp_peer_create !soc->ops->cmn_drv_ops->txrx_peer_create) return NULL; - return soc->ops->cmn_drv_ops->txrx_peer_create(vdev, + return soc->ops->cmn_drv_ops->txrx_peer_create(soc, vdev_id, peer_mac_addr); } static inline void cdp_peer_setup - (ol_txrx_soc_handle soc, struct cdp_vdev *vdev, void *peer) + (ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -395,36 +396,36 @@ static inline void cdp_peer_setup !soc->ops->cmn_drv_ops->txrx_peer_setup) return; - soc->ops->cmn_drv_ops->txrx_peer_setup(vdev, - peer); + soc->ops->cmn_drv_ops->txrx_peer_setup(soc, vdev_id, + peer_mac); } /* * cdp_cp_peer_del_response - Call the peer delete response handler * @soc: Datapath SOC handle - * @vdev_hdl: virtual device object + * @vdev_id: id of virtual device object * @peer_mac_addr: Mac address of the peer * * Return: void */ -static inline void cdp_cp_peer_del_response +static inline QDF_STATUS cdp_cp_peer_del_response (ol_txrx_soc_handle soc, - struct cdp_vdev *vdev_hdl, + uint8_t vdev_id, uint8_t *peer_mac_addr) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->txrx_cp_peer_del_response) - return; + return QDF_STATUS_E_FAILURE; return soc->ops->cmn_drv_ops->txrx_cp_peer_del_response(soc, - vdev_hdl, + vdev_id, peer_mac_addr); } /** @@ -571,8 +572,9 @@ static inline QDF_STATUS cdp_peer_ast_delete_by_pdev } static inline int cdp_peer_add_ast - (ol_txrx_soc_handle soc, struct cdp_peer *peer_handle, - uint8_t *mac_addr, enum cdp_txrx_ast_entry_type type, uint32_t flags) + (ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac, + uint8_t *mac_addr, + enum cdp_txrx_ast_entry_type type, uint32_t flags) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -586,46 +588,47 @@ static inline int cdp_peer_add_ast return 0; return soc->ops->cmn_drv_ops->txrx_peer_add_ast(soc, - peer_handle, + vdev_id, + peer_mac, mac_addr, type, flags); } -static inline void cdp_peer_reset_ast +static inline QDF_STATUS cdp_peer_reset_ast (ol_txrx_soc_handle soc, uint8_t *wds_macaddr, uint8_t *peer_macaddr, - void *vdev_hdl) + uint8_t vdev_id) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->txrx_peer_reset_ast) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->txrx_peer_reset_ast(soc, wds_macaddr, - peer_macaddr, vdev_hdl); + return soc->ops->cmn_drv_ops->txrx_peer_reset_ast(soc, wds_macaddr, + peer_macaddr, vdev_id); } -static inline void cdp_peer_reset_ast_table - (ol_txrx_soc_handle soc, void *vdev_hdl) +static inline QDF_STATUS cdp_peer_reset_ast_table + (ol_txrx_soc_handle soc, uint8_t vdev_id) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->txrx_peer_reset_ast_table) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->txrx_peer_reset_ast_table(soc, vdev_hdl); + return soc->ops->cmn_drv_ops->txrx_peer_reset_ast_table(soc, vdev_id); } static inline void cdp_peer_flush_ast_table @@ -646,8 +649,8 @@ static inline void cdp_peer_flush_ast_table } static inline int cdp_peer_update_ast - (ol_txrx_soc_handle soc, uint8_t *wds_macaddr, - struct cdp_peer *peer_handle, uint32_t flags) + (ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac, + uint8_t *wds_macaddr, uint32_t flags) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -662,13 +665,14 @@ static inline int cdp_peer_update_ast return soc->ops->cmn_drv_ops->txrx_peer_update_ast(soc, - peer_handle, + vdev_id, + peer_mac, wds_macaddr, flags); } static inline void cdp_peer_teardown - (ol_txrx_soc_handle soc, struct cdp_vdev *vdev, void *peer) + (ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -681,29 +685,12 @@ static inline void cdp_peer_teardown !soc->ops->cmn_drv_ops->txrx_peer_teardown) return; - soc->ops->cmn_drv_ops->txrx_peer_teardown(vdev, peer); + soc->ops->cmn_drv_ops->txrx_peer_teardown(soc, vdev_id, peer_mac); } static inline void -cdp_vdev_flush_peers(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, - bool unmap_only) -{ - if (!soc || !soc->ops) { - QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, - "%s: Invalid Instance:", __func__); - QDF_BUG(0); - return; - } - - if (!soc->ops->cmn_drv_ops || - !soc->ops->cmn_drv_ops->txrx_vdev_flush_peers) - return; - - soc->ops->cmn_drv_ops->txrx_vdev_flush_peers(vdev, unmap_only); -} - -static inline void -cdp_peer_delete(ol_txrx_soc_handle soc, void *peer, uint32_t bitmap) +cdp_peer_delete(ol_txrx_soc_handle soc, uint8_t vdev_id, + uint8_t *peer_mac, uint32_t bitmap) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -716,7 +703,7 @@ cdp_peer_delete(ol_txrx_soc_handle soc, void *peer, uint32_t bitmap) !soc->ops->cmn_drv_ops->txrx_peer_delete) return; - soc->ops->cmn_drv_ops->txrx_peer_delete(peer, bitmap); + soc->ops->cmn_drv_ops->txrx_peer_delete(soc, vdev_id, peer_mac, bitmap); } static inline void @@ -744,8 +731,8 @@ cdp_peer_delete_sync(ol_txrx_soc_handle soc, void *peer, } static inline int -cdp_set_monitor_mode(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, - uint8_t smart_monitor) +cdp_set_monitor_mode(ol_txrx_soc_handle soc, uint8_t vdev_id, + uint8_t smart_monitor) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -758,45 +745,45 @@ cdp_set_monitor_mode(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, !soc->ops->cmn_drv_ops->txrx_set_monitor_mode) return 0; - return soc->ops->cmn_drv_ops->txrx_set_monitor_mode(vdev, + return soc->ops->cmn_drv_ops->txrx_set_monitor_mode(soc, vdev_id, smart_monitor); } -static inline void +static inline QDF_STATUS cdp_set_curchan(ol_txrx_soc_handle soc, - struct cdp_pdev *pdev, + uint8_t pdev_id, uint32_t chan_mhz) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->txrx_set_curchan) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->txrx_set_curchan(pdev, chan_mhz); + return soc->ops->cmn_drv_ops->txrx_set_curchan(soc, pdev_id, chan_mhz); } -static inline void -cdp_set_privacy_filters(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, - void *filter, uint32_t num) +static inline QDF_STATUS +cdp_set_privacy_filters(ol_txrx_soc_handle soc, uint8_t vdev_id, + void *filter, uint32_t num) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->txrx_set_privacy_filters) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->txrx_set_privacy_filters(vdev, + return soc->ops->cmn_drv_ops->txrx_set_privacy_filters(soc, vdev_id, filter, num); } @@ -815,9 +802,9 @@ cdp_set_monitor_filter(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, * Data Interface (B Interface) *****************************************************************************/ static inline void -cdp_vdev_register(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, - void *osif_vdev, - struct ol_txrx_ops *txrx_ops) +cdp_vdev_register(ol_txrx_soc_handle soc, uint8_t vdev_id, + ol_osif_vdev_handle osif_vdev, + struct ol_txrx_ops *txrx_ops) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -830,13 +817,13 @@ cdp_vdev_register(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, !soc->ops->cmn_drv_ops->txrx_vdev_register) return; - soc->ops->cmn_drv_ops->txrx_vdev_register(vdev, + soc->ops->cmn_drv_ops->txrx_vdev_register(soc, vdev_id, osif_vdev, txrx_ops); } static inline int -cdp_mgmt_send(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, - qdf_nbuf_t tx_mgmt_frm, uint8_t type) +cdp_mgmt_send(ol_txrx_soc_handle soc, uint8_t vdev_id, + qdf_nbuf_t tx_mgmt_frm, uint8_t type) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -849,14 +836,14 @@ cdp_mgmt_send(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, !soc->ops->cmn_drv_ops->txrx_mgmt_send) return 0; - return soc->ops->cmn_drv_ops->txrx_mgmt_send(vdev, + return soc->ops->cmn_drv_ops->txrx_mgmt_send(soc, vdev_id, tx_mgmt_frm, type); } static inline int -cdp_mgmt_send_ext(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, - qdf_nbuf_t tx_mgmt_frm, uint8_t type, - uint8_t use_6mbps, uint16_t chanfreq) +cdp_mgmt_send_ext(ol_txrx_soc_handle soc, uint8_t vdev_id, + qdf_nbuf_t tx_mgmt_frm, uint8_t type, + uint8_t use_6mbps, uint16_t chanfreq) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -870,12 +857,12 @@ cdp_mgmt_send_ext(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, return 0; return soc->ops->cmn_drv_ops->txrx_mgmt_send_ext - (vdev, tx_mgmt_frm, type, use_6mbps, chanfreq); + (soc, vdev_id, tx_mgmt_frm, type, use_6mbps, chanfreq); } -static inline void -cdp_mgmt_tx_cb_set(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, +static inline QDF_STATUS +cdp_mgmt_tx_cb_set(ol_txrx_soc_handle soc, uint8_t pdev_id, uint8_t type, ol_txrx_mgmt_tx_cb download_cb, ol_txrx_mgmt_tx_cb ota_ack_cb, void *ctxt) { @@ -883,15 +870,15 @@ cdp_mgmt_tx_cb_set(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->txrx_mgmt_tx_cb_set) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->txrx_mgmt_tx_cb_set - (pdev, type, download_cb, ota_ack_cb, ctxt); + return soc->ops->cmn_drv_ops->txrx_mgmt_tx_cb_set + (soc, pdev_id, type, download_cb, ota_ack_cb, ctxt); } static inline void @@ -975,9 +962,9 @@ typedef uint32_t target_paddr_t; #endif /*HTT_PADDR64 */ static inline int -cdp_aggr_cfg(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, - int max_subfrms_ampdu, - int max_subfrms_amsdu) +cdp_aggr_cfg(ol_txrx_soc_handle soc, uint8_t vdev_id, + int max_subfrms_ampdu, + int max_subfrms_amsdu) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -990,14 +977,14 @@ cdp_aggr_cfg(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, !soc->ops->cmn_drv_ops->txrx_aggr_cfg) return 0; - return soc->ops->cmn_drv_ops->txrx_aggr_cfg(vdev, + return soc->ops->cmn_drv_ops->txrx_aggr_cfg(soc, vdev_id, max_subfrms_ampdu, max_subfrms_amsdu); } static inline int -cdp_fw_stats_get(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, - struct ol_txrx_stats_req *req, bool per_vdev, - bool response_expected) +cdp_fw_stats_get(ol_txrx_soc_handle soc, uint8_t vdev_id, + struct ol_txrx_stats_req *req, bool per_vdev, + bool response_expected) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -1010,12 +997,12 @@ cdp_fw_stats_get(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, !soc->ops->cmn_drv_ops->txrx_fw_stats_get) return 0; - return soc->ops->cmn_drv_ops->txrx_fw_stats_get(vdev, req, + return soc->ops->cmn_drv_ops->txrx_fw_stats_get(soc, vdev_id, req, per_vdev, response_expected); } static inline int -cdp_debug(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, int debug_specs) +cdp_debug(ol_txrx_soc_handle soc, uint8_t vdev_id, int debug_specs) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -1028,25 +1015,26 @@ cdp_debug(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, int debug_specs) !soc->ops->cmn_drv_ops->txrx_debug) return 0; - return soc->ops->cmn_drv_ops->txrx_debug(vdev, debug_specs); + return soc->ops->cmn_drv_ops->txrx_debug(soc, vdev_id, debug_specs); } -static inline void cdp_fw_stats_cfg(ol_txrx_soc_handle soc, - struct cdp_vdev *vdev, uint8_t cfg_stats_type, uint32_t cfg_val) +static inline QDF_STATUS +cdp_fw_stats_cfg(ol_txrx_soc_handle soc, + uint8_t vdev_id, uint8_t cfg_stats_type, uint32_t cfg_val) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->txrx_fw_stats_cfg) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->txrx_fw_stats_cfg(vdev, - cfg_stats_type, cfg_val); + return soc->ops->cmn_drv_ops->txrx_fw_stats_cfg(soc, vdev_id, + cfg_stats_type, cfg_val); } static inline void cdp_print_level_set(ol_txrx_soc_handle soc, unsigned level) @@ -1187,25 +1175,6 @@ cdp_get_ctrl_pdev_from_vdev(ol_txrx_soc_handle soc, struct cdp_vdev *vdev) (vdev); } -static inline struct cdp_vdev * -cdp_get_vdev_from_vdev_id(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, - uint8_t vdev_id) -{ - if (!soc || !soc->ops) { - QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, - "%s: Invalid Instance:", __func__); - QDF_BUG(0); - return NULL; - } - - if (!soc->ops->cmn_drv_ops || - !soc->ops->cmn_drv_ops->txrx_get_vdev_from_vdev_id) - return NULL; - - return soc->ops->cmn_drv_ops->txrx_get_vdev_from_vdev_id - (pdev, vdev_id); -} - static inline struct cdp_vdev * cdp_get_mon_vdev_from_pdev(ol_txrx_soc_handle soc, struct cdp_pdev *pdev) { @@ -1238,7 +1207,7 @@ cdp_soc_detach(ol_txrx_soc_handle soc) !soc->ops->cmn_drv_ops->txrx_soc_detach) return; - soc->ops->cmn_drv_ops->txrx_soc_detach((void *)soc); + soc->ops->cmn_drv_ops->txrx_soc_detach(soc); } /** @@ -1254,8 +1223,10 @@ cdp_soc_detach(ol_txrx_soc_handle soc) * Return: DP SOC handle on success, NULL on failure */ static inline ol_txrx_soc_handle -cdp_soc_init(ol_txrx_soc_handle soc, u_int16_t devid, void *hif_handle, - void *psoc, HTC_HANDLE htc_handle, qdf_device_t qdf_dev, +cdp_soc_init(ol_txrx_soc_handle soc, u_int16_t devid, + void *hif_handle, + struct cdp_ctrl_objmgr_psoc *psoc, + HTC_HANDLE htc_handle, qdf_device_t qdf_dev, struct ol_if_ops *dp_ol_if_ops) { if (!soc || !soc->ops) { @@ -1295,7 +1266,7 @@ cdp_soc_deinit(ol_txrx_soc_handle soc) !soc->ops->cmn_drv_ops->txrx_soc_deinit) return; - soc->ops->cmn_drv_ops->txrx_soc_deinit((void *)soc); + soc->ops->cmn_drv_ops->txrx_soc_deinit(soc); } /** @@ -1321,7 +1292,7 @@ cdp_tso_soc_attach(ol_txrx_soc_handle soc) !soc->ops->cmn_drv_ops->txrx_tso_soc_attach) return 0; - return soc->ops->cmn_drv_ops->txrx_tso_soc_attach((void *)soc); + return soc->ops->cmn_drv_ops->txrx_tso_soc_attach(soc); } /** @@ -1347,21 +1318,23 @@ cdp_tso_soc_detach(ol_txrx_soc_handle soc) !soc->ops->cmn_drv_ops->txrx_tso_soc_detach) return 0; - return soc->ops->cmn_drv_ops->txrx_tso_soc_detach((void *)soc); + return soc->ops->cmn_drv_ops->txrx_tso_soc_detach(soc); } /** * cdp_addba_resp_tx_completion() - Indicate addba response tx * completion to dp to change tid state. * @soc: soc handle - * @peer_handle: peer handle + * @peer_mac: mac address of peer handle + * @vdev_id: id of vdev handle * @tid: tid * @status: Tx completion status * * Return: success/failure of tid update */ static inline int cdp_addba_resp_tx_completion(ol_txrx_soc_handle soc, - void *peer_handle, + uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, int status) { if (!soc || !soc->ops) { @@ -1375,12 +1348,12 @@ static inline int cdp_addba_resp_tx_completion(ol_txrx_soc_handle soc, !soc->ops->cmn_drv_ops->addba_resp_tx_completion) return 0; - return soc->ops->cmn_drv_ops->addba_resp_tx_completion(peer_handle, tid, - status); + return soc->ops->cmn_drv_ops->addba_resp_tx_completion(soc, peer_mac, + vdev_id, tid, status); } static inline int cdp_addba_requestprocess(ol_txrx_soc_handle soc, - void *peer_handle, uint8_t dialogtoken, uint16_t tid, + uint8_t *peer_mac, uint16_t vdev_id, uint8_t dialogtoken, uint16_t tid, uint16_t batimeout, uint16_t buffersize, uint16_t startseqnum) { if (!soc || !soc->ops) { @@ -1394,31 +1367,37 @@ static inline int cdp_addba_requestprocess(ol_txrx_soc_handle soc, !soc->ops->cmn_drv_ops->addba_requestprocess) return 0; - return soc->ops->cmn_drv_ops->addba_requestprocess(peer_handle, - dialogtoken, tid, batimeout, buffersize, startseqnum); + return soc->ops->cmn_drv_ops->addba_requestprocess(soc, peer_mac, + vdev_id, dialogtoken, tid, batimeout, buffersize, + startseqnum); } -static inline void cdp_addba_responsesetup(ol_txrx_soc_handle soc, - void *peer_handle, uint8_t tid, uint8_t *dialogtoken, - uint16_t *statuscode, uint16_t *buffersize, uint16_t *batimeout) +static inline QDF_STATUS +cdp_addba_responsesetup(ol_txrx_soc_handle soc, + uint8_t *peer_mac, uint16_t vdev_id, + uint8_t tid, uint8_t *dialogtoken, + uint16_t *statuscode, uint16_t *buffersize, + uint16_t *batimeout) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->addba_responsesetup) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->addba_responsesetup(peer_handle, tid, - dialogtoken, statuscode, buffersize, batimeout); + return soc->ops->cmn_drv_ops->addba_responsesetup(soc, peer_mac, + vdev_id, tid, dialogtoken, statuscode, buffersize, + batimeout); } -static inline int cdp_delba_process(ol_txrx_soc_handle soc, - void *peer_handle, int tid, uint16_t reasoncode) +static inline int cdp_delba_process(ol_txrx_soc_handle soc, uint8_t *peer_mac, + uint16_t vdev_id, int tid, + uint16_t reasoncode) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -1431,15 +1410,16 @@ static inline int cdp_delba_process(ol_txrx_soc_handle soc, !soc->ops->cmn_drv_ops->delba_process) return 0; - return soc->ops->cmn_drv_ops->delba_process(peer_handle, - tid, reasoncode); + return soc->ops->cmn_drv_ops->delba_process(soc, peer_mac, + vdev_id, tid, reasoncode); } /** * cdp_delba_tx_completion() - Handle delba tx completion * to update stats and retry transmission if failed. * @soc: soc handle - * @peer_handle: peer handle + * @peer_mac: peer mac address + * @vdev_id: id of vdev handle * @tid: Tid number * @status: Tx completion status * @@ -1447,7 +1427,8 @@ static inline int cdp_delba_process(ol_txrx_soc_handle soc, */ static inline int cdp_delba_tx_completion(ol_txrx_soc_handle soc, - void *peer_handle, + uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, int status) { if (!soc || !soc->ops) { @@ -1461,78 +1442,55 @@ static inline int cdp_delba_tx_completion(ol_txrx_soc_handle soc, !soc->ops->cmn_drv_ops->delba_tx_completion) return 0; - return soc->ops->cmn_drv_ops->delba_tx_completion(peer_handle, + return soc->ops->cmn_drv_ops->delba_tx_completion(soc, peer_mac, + vdev_id, tid, status); } -static inline void cdp_set_addbaresponse(ol_txrx_soc_handle soc, - void *peer_handle, int tid, uint16_t statuscode) +static inline QDF_STATUS +cdp_set_addbaresponse(ol_txrx_soc_handle soc, + uint8_t *peer_mac, uint16_t vdev_id, int tid, + uint16_t statuscode) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->set_addba_response) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->set_addba_response(peer_handle, tid, statuscode); -} - -/** - * cdp_get_peer_mac_addr_frm_id: function to return vdev id and and peer - * mac address - * @soc: SOC handle - * @peer_id: peer id of the peer for which mac_address is required - * @mac_addr: reference to mac address - * - * reutm: vdev_id of the vap - */ -static inline uint8_t -cdp_get_peer_mac_addr_frm_id(ol_txrx_soc_handle soc, uint16_t peer_id, - uint8_t *mac_addr) -{ - if (!soc || !soc->ops) { - QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, - "%s: Invalid Instance:", __func__); - QDF_BUG(0); - return CDP_INVALID_VDEV_ID; - } - - if (!soc->ops->cmn_drv_ops || - !soc->ops->cmn_drv_ops->get_peer_mac_addr_frm_id) - return CDP_INVALID_VDEV_ID; - - return soc->ops->cmn_drv_ops->get_peer_mac_addr_frm_id(soc, - peer_id, mac_addr); + return soc->ops->cmn_drv_ops->set_addba_response(soc, peer_mac, vdev_id, + tid, statuscode); } /** * cdp_set_vdev_dscp_tid_map(): function to set DSCP-tid map in the vap * @soc : soc handle - * @vdev: vdev handle + * @vdev_id: id of vdev handle * @map_id: id of the tid map * - * Return: void + * Return: QDF_STATUS */ -static inline void cdp_set_vdev_dscp_tid_map(ol_txrx_soc_handle soc, - struct cdp_vdev *vdev, uint8_t map_id) +static inline QDF_STATUS +cdp_set_vdev_dscp_tid_map(ol_txrx_soc_handle soc, + uint8_t vdev_id, uint8_t map_id) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->set_vdev_dscp_tid_map) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->set_vdev_dscp_tid_map(vdev, + return soc->ops->cmn_drv_ops->set_vdev_dscp_tid_map(soc, vdev_id, map_id); } @@ -1540,14 +1498,14 @@ static inline void cdp_set_vdev_dscp_tid_map(ol_txrx_soc_handle soc, /** * cdp_set_vlan_groupkey(): function to set vlan ID - group key map in the vap * @soc : soc handle - * @vdev: vdev handle + * @vdev_id: id of vdev handle * @vlan_id: vlan id * @group_key: corresponding group key to vlan ID * * Return: void */ static inline -QDF_STATUS cdp_set_vlan_groupkey(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, +QDF_STATUS cdp_set_vlan_groupkey(ol_txrx_soc_handle soc, uint8_t vdev_id, uint16_t vlan_id, uint16_t group_key) { if (!soc || !soc->ops) { @@ -1561,7 +1519,7 @@ QDF_STATUS cdp_set_vlan_groupkey(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, !soc->ops->cmn_drv_ops->set_vlan_groupkey) return 0; - return soc->ops->cmn_drv_ops->set_vlan_groupkey(vdev, vlan_id, + return soc->ops->cmn_drv_ops->set_vlan_groupkey(soc, vdev_id, vlan_id, group_key); } #endif @@ -1569,13 +1527,12 @@ QDF_STATUS cdp_set_vlan_groupkey(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, /** * cdp_ath_get_total_per(): function to get hw retries * @soc : soc handle - * @pdev: pdev handle + * @pdev_id: id of pdev handle * * Return: get hw retries */ static inline -int cdp_ath_get_total_per(ol_txrx_soc_handle soc, - struct cdp_pdev *pdev) +int cdp_ath_get_total_per(ol_txrx_soc_handle soc, uint8_t pdev_id) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -1588,12 +1545,12 @@ int cdp_ath_get_total_per(ol_txrx_soc_handle soc, !soc->ops->cmn_drv_ops->txrx_get_total_per) return 0; - return soc->ops->cmn_drv_ops->txrx_get_total_per(pdev); + return soc->ops->cmn_drv_ops->txrx_get_total_per(soc, pdev_id); } /** * cdp_set_pdev_dscp_tid_map(): function to change tid values in DSCP-tid map - * @pdev: pdev handle + * @pdev_id: id of pdev handle * @map_id: id of the tid map * @tos: index value in map that needs to be changed * @tid: tid value passed by user @@ -1601,7 +1558,7 @@ int cdp_ath_get_total_per(ol_txrx_soc_handle soc, * Return: void */ static inline void cdp_set_pdev_dscp_tid_map(ol_txrx_soc_handle soc, - struct cdp_pdev *pdev, uint8_t map_id, uint8_t tos, uint8_t tid) + uint8_t pdev_id, uint8_t map_id, uint8_t tos, uint8_t tid) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -1614,7 +1571,7 @@ static inline void cdp_set_pdev_dscp_tid_map(ol_txrx_soc_handle soc, !soc->ops->cmn_drv_ops->set_pdev_dscp_tid_map) return; - soc->ops->cmn_drv_ops->set_pdev_dscp_tid_map(pdev, + soc->ops->cmn_drv_ops->set_pdev_dscp_tid_map(soc, pdev_id, map_id, tos, tid); } @@ -1781,11 +1738,14 @@ cdp_display_stats(ol_txrx_soc_handle soc, uint16_t value, /** * cdp_set_pn_check(): function to set pn check * @soc: soc handle + * @vdev_id: id of virtual device + * @peer_mac: mac address of peer * @sec_type: security type - * #rx_pn: receive pn + * @rx_pn: receive pn */ static inline int cdp_set_pn_check(ol_txrx_soc_handle soc, - struct cdp_vdev *vdev, struct cdp_peer *peer_handle, enum cdp_sec_type sec_type, uint32_t *rx_pn) + uint8_t vdev_id, uint8_t *peer_mac, + enum cdp_sec_type sec_type, uint32_t *rx_pn) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -1798,7 +1758,7 @@ static inline int cdp_set_pn_check(ol_txrx_soc_handle soc, !soc->ops->cmn_drv_ops->set_pn_check) return 0; - soc->ops->cmn_drv_ops->set_pn_check(vdev, peer_handle, + soc->ops->cmn_drv_ops->set_pn_check(soc, vdev_id, peer_mac, sec_type, rx_pn); return 0; } @@ -1855,12 +1815,12 @@ QDF_STATUS cdp_update_config_parameters(ol_txrx_soc_handle soc, /** * cdp_pdev_get_dp_txrx_handle() - get advanced dp handle from pdev * @soc: opaque soc handle - * @pdev: data path pdev handle + * @pdev_id: id of data path pdev handle * * Return: opaque dp handle */ static inline void * -cdp_pdev_get_dp_txrx_handle(ol_txrx_soc_handle soc, void *pdev) +cdp_pdev_get_dp_txrx_handle(ol_txrx_soc_handle soc, uint8_t pdev_id) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -1870,7 +1830,7 @@ cdp_pdev_get_dp_txrx_handle(ol_txrx_soc_handle soc, void *pdev) } if (soc->ops->cmn_drv_ops->get_dp_txrx_handle) - return soc->ops->cmn_drv_ops->get_dp_txrx_handle(pdev); + return soc->ops->cmn_drv_ops->get_dp_txrx_handle(soc, pdev_id); return 0; } @@ -1878,13 +1838,14 @@ cdp_pdev_get_dp_txrx_handle(ol_txrx_soc_handle soc, void *pdev) /** * cdp_pdev_set_dp_txrx_handle() - set advanced dp handle in pdev * @soc: opaque soc handle - * @pdev: data path pdev handle + * @pdev_id: id of data path pdev handle * @dp_hdl: opaque pointer for dp_txrx_handle * * Return: void */ static inline void -cdp_pdev_set_dp_txrx_handle(ol_txrx_soc_handle soc, void *pdev, void *dp_hdl) +cdp_pdev_set_dp_txrx_handle(ol_txrx_soc_handle soc, uint8_t pdev_id, + void *dp_hdl) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -1897,7 +1858,7 @@ cdp_pdev_set_dp_txrx_handle(ol_txrx_soc_handle soc, void *pdev, void *dp_hdl) !soc->ops->cmn_drv_ops->set_dp_txrx_handle) return; - soc->ops->cmn_drv_ops->set_dp_txrx_handle(pdev, dp_hdl); + soc->ops->cmn_drv_ops->set_dp_txrx_handle(soc, pdev_id, dp_hdl); } /* @@ -1951,60 +1912,62 @@ cdp_soc_set_dp_txrx_handle(ol_txrx_soc_handle soc, void *dp_handle) /** * cdp_soc_map_pdev_to_lmac() - Save pdev_id to lmac_id mapping * @soc: opaque soc handle - * @pdev_handle: data path pdev handle + * @pdev_id: id of data path pdev handle * @lmac_id: lmac id * - * Return: void + * Return: QDF_STATUS */ -static inline void -cdp_soc_map_pdev_to_lmac(ol_txrx_soc_handle soc, void *pdev_handle, +static inline QDF_STATUS +cdp_soc_map_pdev_to_lmac(ol_txrx_soc_handle soc, uint8_t pdev_id, uint32_t lmac_id) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->map_pdev_to_lmac) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->map_pdev_to_lmac((struct cdp_pdev *)pdev_handle, + return soc->ops->cmn_drv_ops->map_pdev_to_lmac(soc, pdev_id, lmac_id); } /** * cdp_txrx_set_pdev_status_down() - set pdev down/up status * @soc: soc opaque handle - * @pdev_handle: data path pdev handle + * @pdev_id: id of data path pdev handle * @is_pdev_down: pdev down/up status * - * return: void + * return: QDF_STATUS */ -static inline void cdp_txrx_set_pdev_status_down(ol_txrx_soc_handle soc, - struct cdp_pdev *pdev_handle, - bool is_pdev_down) +static inline QDF_STATUS +cdp_txrx_set_pdev_status_down(ol_txrx_soc_handle soc, + uint8_t pdev_id, + bool is_pdev_down) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->set_pdev_status_down) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->set_pdev_status_down(pdev_handle, is_pdev_down); + return soc->ops->cmn_drv_ops->set_pdev_status_down(soc, pdev_id, + is_pdev_down); } /** * cdp_tx_send() - enqueue frame for transmission * @soc: soc opaque handle - * @vdev: VAP device + * @vdev_id: id of VAP device * @nbuf: nbuf to be enqueued * * This API is used by Extended Datapath modules to enqueue frame for @@ -2013,7 +1976,7 @@ static inline void cdp_txrx_set_pdev_status_down(ol_txrx_soc_handle soc, * Return: void */ static inline void -cdp_tx_send(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, qdf_nbuf_t nbuf) +cdp_tx_send(ol_txrx_soc_handle soc, uint8_t vdev_id, qdf_nbuf_t nbuf) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -2026,7 +1989,7 @@ cdp_tx_send(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, qdf_nbuf_t nbuf) !soc->ops->cmn_drv_ops->tx_send) return; - soc->ops->cmn_drv_ops->tx_send(vdev, nbuf); + soc->ops->cmn_drv_ops->tx_send(soc, vdev_id, nbuf); } /* @@ -2083,15 +2046,15 @@ void cdp_pdev_set_chan_noise_floor(ol_txrx_soc_handle soc, /** * cdp_set_nac() - set nac * @soc: opaque soc handle - * @peer: data path peer handle + * @vdev_id: id of vdev handle + * @peer_mac: mac of data path peer handle * */ static inline -void cdp_set_nac(ol_txrx_soc_handle soc, - struct cdp_peer *peer) +void cdp_set_nac(ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac) { if (soc->ops->cmn_drv_ops->txrx_set_nac) - soc->ops->cmn_drv_ops->txrx_set_nac(peer); + soc->ops->cmn_drv_ops->txrx_set_nac(soc, vdev_id, peer_mac); } /** @@ -2115,7 +2078,7 @@ QDF_STATUS cdp_set_pdev_tx_capture(ol_txrx_soc_handle soc, /** * cdp_set_pdev_pcp_tid_map() - set pdev pcp-tid-map * @soc: opaque soc handle - * @pdev: data path pdev handle + * @pdev_id: id of data path pdev handle * @pcp: pcp value * @tid: tid value * @@ -2126,7 +2089,7 @@ QDF_STATUS cdp_set_pdev_tx_capture(ol_txrx_soc_handle soc, */ static inline QDF_STATUS cdp_set_pdev_pcp_tid_map(ol_txrx_soc_handle soc, - struct cdp_pdev *pdev, + uint8_t pdev_id, uint32_t pcp, uint32_t tid) { if (!soc || !soc->ops) { @@ -2139,7 +2102,8 @@ QDF_STATUS cdp_set_pdev_pcp_tid_map(ol_txrx_soc_handle soc, !soc->ops->cmn_drv_ops->set_pdev_pcp_tid_map) return QDF_STATUS_E_INVAL; - return soc->ops->cmn_drv_ops->set_pdev_pcp_tid_map(pdev, pcp, tid); + return soc->ops->cmn_drv_ops->set_pdev_pcp_tid_map(soc, pdev_id, + pcp, tid); } /** @@ -2176,20 +2140,21 @@ QDF_STATUS cdp_set_pdev_tidmap_prty(ol_txrx_soc_handle soc, /** * cdp_get_peer_mac_from_peer_id() - get peer mac addr from peer id * @soc: opaque soc handle - * @pdev: data path pdev handle + * @pdev_id: id of data path pdev handle * @peer_id: data path peer id * @peer_mac: peer_mac * - * Return: void + * Return: QDF_STATUS */ static inline -void cdp_get_peer_mac_from_peer_id(ol_txrx_soc_handle soc, - struct cdp_pdev *pdev_handle, - uint32_t peer_id, uint8_t *peer_mac) +QDF_STATUS cdp_get_peer_mac_from_peer_id(ol_txrx_soc_handle soc, + uint32_t peer_id, uint8_t *peer_mac) { if (soc->ops->cmn_drv_ops->txrx_get_peer_mac_from_peer_id) - soc->ops->cmn_drv_ops->txrx_get_peer_mac_from_peer_id( - pdev_handle, peer_id, peer_mac); + return soc->ops->cmn_drv_ops->txrx_get_peer_mac_from_peer_id( + soc, peer_id, peer_mac); + + return QDF_STATUS_E_INVAL; } /** @@ -2201,90 +2166,97 @@ void cdp_get_peer_mac_from_peer_id(ol_txrx_soc_handle soc, */ static inline void cdp_vdev_tx_lock(ol_txrx_soc_handle soc, - struct cdp_vdev *vdev) + uint8_t vdev_id) { if (soc->ops->cmn_drv_ops->txrx_vdev_tx_lock) - soc->ops->cmn_drv_ops->txrx_vdev_tx_lock(vdev); + soc->ops->cmn_drv_ops->txrx_vdev_tx_lock(soc, vdev_id); } /** * cdp_vdev_tx_unlock() - release lock * @soc: opaque soc handle - * @vdev: data path vdev handle + * @vdev_id: id of data path vdev handle * * Return: void */ static inline void cdp_vdev_tx_unlock(ol_txrx_soc_handle soc, - struct cdp_vdev *vdev) + uint8_t vdev_id) { if (soc->ops->cmn_drv_ops->txrx_vdev_tx_unlock) - soc->ops->cmn_drv_ops->txrx_vdev_tx_unlock(vdev); + soc->ops->cmn_drv_ops->txrx_vdev_tx_unlock(soc, vdev_id); } /** * cdp_ath_getstats() - get updated athstats * @soc: opaque soc handle - * @dev: dp interface handle + * @id: vdev_id/pdev_id based on type * @stats: cdp network device stats structure * @type: device type pdev/vdev * - * Return: void + * Return: QDF_STATUS */ -static inline void cdp_ath_getstats(ol_txrx_soc_handle soc, - void *dev, struct cdp_dev_stats *stats, - uint8_t type) +static inline QDF_STATUS +cdp_ath_getstats(ol_txrx_soc_handle soc, + uint8_t id, struct cdp_dev_stats *stats, + uint8_t type) { if (soc && soc->ops && soc->ops->cmn_drv_ops->txrx_ath_getstats) - soc->ops->cmn_drv_ops->txrx_ath_getstats(dev, stats, type); + return soc->ops->cmn_drv_ops->txrx_ath_getstats(soc, id, + stats, type); + + return QDF_STATUS_E_FAILURE; } /** * cdp_set_gid_flag() - set groupid flag * @soc: opaque soc handle - * @pdev: data path pdev handle + * @pdev_id: id of data path pdev handle * @mem_status: member status from grp management frame * @user_position: user position from grp management frame * - * Return: void + * Return: QDF_STATUS */ -static inline -void cdp_set_gid_flag(ol_txrx_soc_handle soc, - struct cdp_pdev *pdev, u_int8_t *mem_status, - u_int8_t *user_position) +static inline QDF_STATUS +cdp_set_gid_flag(ol_txrx_soc_handle soc, + uint8_t pdev_id, u_int8_t *mem_status, + u_int8_t *user_position) { if (soc->ops->cmn_drv_ops->txrx_set_gid_flag) - soc->ops->cmn_drv_ops->txrx_set_gid_flag(pdev, mem_status, user_position); + return soc->ops->cmn_drv_ops->txrx_set_gid_flag(soc, pdev_id, + mem_status, + user_position); + return QDF_STATUS_E_FAILURE; } /** * cdp_fw_supported_enh_stats_version() - returns the fw enhanced stats version * @soc: opaque soc handle - * @pdev: data path pdev handle + * @pdev_id: id of data path pdev handle * */ static inline uint32_t cdp_fw_supported_enh_stats_version(ol_txrx_soc_handle soc, - struct cdp_pdev *pdev) + uint8_t pdev_id) { if (soc->ops->cmn_drv_ops->txrx_fw_supported_enh_stats_version) - return soc->ops->cmn_drv_ops->txrx_fw_supported_enh_stats_version(pdev); + return soc->ops->cmn_drv_ops->txrx_fw_supported_enh_stats_version(soc, pdev_id); return 0; } /** * cdp_get_pdev_id_frm_pdev() - return pdev_id from pdev * @soc: opaque soc handle - * @ni: associated node + * @vdev_id: id of vdev device * @force: number of frame in SW queue * Return: void */ static inline void cdp_if_mgmt_drain(ol_txrx_soc_handle soc, - void *ni, int force) + uint8_t vdev_id, int force) { if (soc->ops->cmn_drv_ops->txrx_if_mgmt_drain) - soc->ops->cmn_drv_ops->txrx_if_mgmt_drain(ni, force); + soc->ops->cmn_drv_ops->txrx_if_mgmt_drain(soc, vdev_id, force); } /* cdp_peer_map_attach() - CDP API to allocate PEER map memory @@ -2321,7 +2293,7 @@ cdp_peer_map_attach(ol_txrx_soc_handle soc, uint32_t max_peers, */ static inline int cdp_txrx_classify_and_update(ol_txrx_soc_handle soc, - struct cdp_vdev *vdev, qdf_nbuf_t skb, + uint8_t vdev_id, qdf_nbuf_t skb, enum txrx_direction dir, struct ol_txrx_nbuf_classify *nbuf_class) { @@ -2336,7 +2308,7 @@ cdp_txrx_classify_and_update(ol_txrx_soc_handle soc, !soc->ops->cmn_drv_ops->txrx_classify_update) return 0; - return soc->ops->cmn_drv_ops->txrx_classify_update(vdev, + return soc->ops->cmn_drv_ops->txrx_classify_update(soc, vdev_id, skb, dir, nbuf_class); } @@ -2484,7 +2456,8 @@ static inline uint32_t cdp_cfg_get(ol_txrx_soc_handle soc, enum cdp_dp_cfg cfg) * Return: void */ static inline void -cdp_soc_set_rate_stats_ctx(ol_txrx_soc_handle soc, void *ctx) +cdp_soc_set_rate_stats_ctx(ol_txrx_soc_handle soc, + void *ctx) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -2527,11 +2500,11 @@ cdp_soc_get_rate_stats_ctx(ol_txrx_soc_handle soc) /** * cdp_peer_flush_rate_stats() - flush peer rate statistics * @soc: opaque soc handle - * @pdev: pdev handle + * @pdev_id: id of pdev handle * @buf: stats buffer */ static inline void -cdp_peer_flush_rate_stats(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, +cdp_peer_flush_rate_stats(ol_txrx_soc_handle soc, uint8_t pdev_id, void *buf) { if (!soc || !soc->ops) { @@ -2545,35 +2518,36 @@ cdp_peer_flush_rate_stats(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, !soc->ops->cmn_drv_ops->txrx_peer_flush_rate_stats) return; - soc->ops->cmn_drv_ops->txrx_peer_flush_rate_stats(soc, pdev, buf); + soc->ops->cmn_drv_ops->txrx_peer_flush_rate_stats(soc, pdev_id, buf); } /** * cdp_flush_rate_stats_request() - request flush rate statistics * @soc: opaque soc handle - * @pdev: pdev handle + * @pdev_id: id of pdev handle */ -static inline void -cdp_flush_rate_stats_request(struct cdp_soc_t *soc, struct cdp_pdev *pdev) +static inline QDF_STATUS +cdp_flush_rate_stats_request(struct cdp_soc_t *soc, uint8_t pdev_id) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid Instance:", __func__); QDF_BUG(0); - return; + return QDF_STATUS_E_FAILURE; } if (!soc->ops->cmn_drv_ops || !soc->ops->cmn_drv_ops->txrx_flush_rate_stats_request) - return; + return QDF_STATUS_E_FAILURE; - soc->ops->cmn_drv_ops->txrx_flush_rate_stats_request(soc, pdev); + return soc->ops->cmn_drv_ops->txrx_flush_rate_stats_request(soc, + pdev_id); } /** * cdp_set_vdev_pcp_tid_map() - set vdev pcp-tid-map * @soc: opaque soc handle - * @vdev: data path vdev handle + * @vdev: id of data path vdev handle * @pcp: pcp value * @tid: tid value * @@ -2584,7 +2558,7 @@ cdp_flush_rate_stats_request(struct cdp_soc_t *soc, struct cdp_pdev *pdev) */ static inline QDF_STATUS cdp_set_vdev_pcp_tid_map(ol_txrx_soc_handle soc, - struct cdp_vdev *vdev_handle, + uint8_t vdev_id, uint8_t pcp, uint8_t tid) { if (!soc || !soc->ops) { @@ -2597,7 +2571,7 @@ QDF_STATUS cdp_set_vdev_pcp_tid_map(ol_txrx_soc_handle soc, !soc->ops->cmn_drv_ops->set_vdev_pcp_tid_map) return QDF_STATUS_E_INVAL; - return soc->ops->cmn_drv_ops->set_vdev_pcp_tid_map(vdev_handle, + return soc->ops->cmn_drv_ops->set_vdev_pcp_tid_map(soc, vdev_id, pcp, tid); } diff --git a/dp/inc/cdp_txrx_cmn_reg.h b/dp/inc/cdp_txrx_cmn_reg.h index 1bcb1c8237..337c548b29 100644 --- a/dp/inc/cdp_txrx_cmn_reg.h +++ b/dp/inc/cdp_txrx_cmn_reg.h @@ -71,7 +71,8 @@ dp_soc_attach_wifi3(struct cdp_ctrl_objmgr_psoc *ctrl_psoc, struct hif_opaque_softc *hif_handle, HTC_HANDLE htc_handle, qdf_device_t qdf_osdev, struct ol_if_ops *ol_ops, uint16_t device_id); -void *dp_soc_init_wifi3(void *soc, struct cdp_ctrl_objmgr_psoc *ctrl_psoc, +void *dp_soc_init_wifi3(struct cdp_soc_t *soc, + struct cdp_ctrl_objmgr_psoc *ctrl_psoc, struct hif_opaque_softc *hif_handle, HTC_HANDLE htc_handle, qdf_device_t qdf_osdev, struct ol_if_ops *ol_ops, uint16_t device_id); @@ -88,7 +89,8 @@ struct cdp_soc_t *dp_soc_attach_wifi3(struct cdp_ctrl_objmgr_psoc *ctrl_psoc, } static inline -void *dp_soc_init_wifi3(void *soc, struct cdp_ctrl_objmgr_psoc *ctrl_psoc, +void *dp_soc_init_wifi3(struct cdp_soc_t *soc, + struct cdp_ctrl_objmgr_psoc *ctrl_psoc, struct hif_opaque_softc *hif_handle, HTC_HANDLE htc_handle, qdf_device_t qdf_osdev, struct ol_if_ops *ol_ops, uint16_t device_id) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index f7684c702b..4877e9a480 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -676,10 +676,11 @@ typedef void /** * ol_txrx_tx_fp - top-level transmit function - * @data_vdev - handle to the virtual device object + * @soc - dp soc handle + * @vdev_id - handle to the virtual device object * @msdu_list - list of network buffers */ -typedef qdf_nbuf_t (*ol_txrx_tx_fp)(struct cdp_vdev *data_vdev, +typedef qdf_nbuf_t (*ol_txrx_tx_fp)(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_t msdu_list); /** @@ -2026,17 +2027,18 @@ enum cdp_dp_cfg { /** * struct cdp_peer_cookie - cookie used when creating peer + * @ctx: context passed to be used by consumer + * @mac_addr: MAC address of peer * @peer_id: peer id * @pdev_id: pdev_id - * @mac_addr: MAC address of peer * @cookie: cookie to be used by consumer - * @ctx: context passed to be used by consumer */ struct cdp_peer_cookie { + struct cdp_stats_cookie *ctx; uint8_t mac_addr[QDF_MAC_ADDR_SIZE]; uint8_t peer_id; + uint8_t pdev_id; uint8_t cookie; - struct cdp_stats_cookie *ctx; }; /** diff --git a/dp/inc/cdp_txrx_ctrl_def.h b/dp/inc/cdp_txrx_ctrl_def.h index a0811af57a..1a922f6b7e 100644 --- a/dp/inc/cdp_txrx_ctrl_def.h +++ b/dp/inc/cdp_txrx_ctrl_def.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2016,2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2016,2018-2019 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -73,9 +73,9 @@ void ol_ll_pdev_tx_unlock(void *); #else #define OSIF_VAP_TX_LOCK(_y, _x) cdp_vdev_tx_lock( \ - _y, wlan_vdev_get_dp_handle((_x)->ctrl_vdev)) + _y, wlan_vdev_get_id((_x)->ctrl_vdev)) #define OSIF_VAP_TX_UNLOCK(_y, _x) cdp_vdev_tx_unlock( \ - _y, wlan_vdev_get_dp_handle((_x)->ctrl_vdev)) + _y, wlan_vdev_get_id((_x)->ctrl_vdev)) #define OL_TX_FLOW_CTRL_LOCK(_x) #define OL_TX_FLOW_CTRL_UNLOCK(_x) diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 265e5eaa72..ca1c33c8f4 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -67,16 +67,17 @@ struct cdp_cmn_ops { QDF_STATUS (*txrx_soc_attach_target)(ol_txrx_soc_handle soc); - int (*txrx_pdev_attach_target)(struct cdp_pdev *pdev); + int (*txrx_pdev_attach_target)(ol_txrx_soc_handle soc, uint8_t pdev_id); struct cdp_vdev *(*txrx_vdev_attach) - (struct cdp_pdev *pdev, uint8_t *vdev_mac_addr, + (struct cdp_soc_t *soc, uint8_t pdev_id, uint8_t *mac, uint8_t vdev_id, enum wlan_op_mode op_mode, enum wlan_op_subtype subtype); - void (*txrx_vdev_detach) - (struct cdp_vdev *vdev, ol_txrx_vdev_delete_cb callback, - void *cb_context); + QDF_STATUS + (*txrx_vdev_detach)(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, + ol_txrx_vdev_delete_cb callback, + void *cb_context); struct cdp_pdev *(*txrx_pdev_attach) (ol_txrx_soc_handle soc, HTC_HANDLE htc_pdev, @@ -84,39 +85,49 @@ struct cdp_cmn_ops { int (*txrx_pdev_post_attach)(struct cdp_pdev *pdev); - void (*txrx_pdev_pre_detach)(struct cdp_pdev *pdev, int force); + void + (*txrx_pdev_pre_detach)(struct cdp_pdev *pdev, int force); - void (*txrx_pdev_detach)(struct cdp_pdev *pdev, int force); + QDF_STATUS + (*txrx_pdev_detach)(struct cdp_soc_t *psoc, uint8_t pdev_id, + int force); /** * txrx_pdev_deinit() - Deinitialize pdev and dp ring memory - * @pdev: Dp pdev handle + * @soc: soc dp handle + * @pdev_id: id of Dp pdev handle * @force: Force deinit or not * - * Return: None + * Return: QDF_STATUS */ - void (*txrx_pdev_deinit)(struct cdp_pdev *pdev, int force); + QDF_STATUS + (*txrx_pdev_deinit)(struct cdp_soc_t *soc, uint8_t pdev_id, + int force); void *(*txrx_peer_create) - (struct cdp_vdev *vdev, uint8_t *peer_mac_addr); + (ol_txrx_soc_handle soc, uint8_t vdev_id, + uint8_t *peer_mac_addr); - void (*txrx_peer_setup) - (struct cdp_vdev *vdev_hdl, void *peer_hdl); + QDF_STATUS + (*txrx_peer_setup)(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, + uint8_t *peer_mac); - void (*txrx_cp_peer_del_response) - (ol_txrx_soc_handle soc, struct cdp_vdev *vdev_hdl, + QDF_STATUS + (*txrx_cp_peer_del_response) + (ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac_addr); - void (*txrx_peer_teardown) - (struct cdp_vdev *vdev_hdl, void *peer_hdl); + QDF_STATUS + (*txrx_peer_teardown) + (struct cdp_soc_t *soc, uint8_t vdev_id, uint8_t *peer_mac); int (*txrx_peer_add_ast) - (ol_txrx_soc_handle soc, struct cdp_peer *peer_hdl, + (ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac, uint8_t *mac_addr, enum cdp_txrx_ast_entry_type type, uint32_t flags); int (*txrx_peer_update_ast) - (ol_txrx_soc_handle soc, struct cdp_peer *peer_hdl, + (ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac, uint8_t *mac_addr, uint32_t flags); bool (*txrx_peer_get_ast_info_by_soc) @@ -139,11 +150,12 @@ struct cdp_cmn_ops { txrx_ast_free_cb callback, void *cookie); - void (*txrx_peer_delete)(void *peer, uint32_t bitmap); + QDF_STATUS + (*txrx_peer_delete)(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_mac, uint32_t bitmap); - void (*txrx_vdev_flush_peers)(struct cdp_vdev *vdev, bool unmap_only); - - QDF_STATUS (*txrx_set_monitor_mode)(struct cdp_vdev *vdev, + QDF_STATUS (*txrx_set_monitor_mode)(struct cdp_soc_t *soc, + uint8_t vdev_id, uint8_t smart_monitor); void (*txrx_peer_delete_sync)(void *peer, QDF_STATUS(*delete_cb)( @@ -164,7 +176,9 @@ struct cdp_cmn_ops { void (*txrx_pdev_set_chan_noise_floor)(struct cdp_pdev *pdev, int16_t chan_noise_floor); - void (*txrx_set_nac)(struct cdp_peer *peer); + void + (*txrx_set_nac)(ol_txrx_soc_handle soc, uint8_t vdev_id, + uint8_t *peer_mac); /** * txrx_set_pdev_tx_capture() - callback to set pdev tx_capture @@ -176,55 +190,71 @@ struct cdp_cmn_ops { */ QDF_STATUS (*txrx_set_pdev_tx_capture)(struct cdp_pdev *pdev, int val); - void (*txrx_get_peer_mac_from_peer_id) - (struct cdp_pdev *pdev_handle, + QDF_STATUS + (*txrx_get_peer_mac_from_peer_id) + (struct cdp_soc_t *cdp_soc, uint32_t peer_id, uint8_t *peer_mac); - void (*txrx_vdev_tx_lock)(struct cdp_vdev *vdev); + void + (*txrx_vdev_tx_lock)(struct cdp_soc_t *soc, uint8_t vdev_id); - void (*txrx_vdev_tx_unlock)(struct cdp_vdev *vdev); + void + (*txrx_vdev_tx_unlock)(struct cdp_soc_t *soc, uint8_t vdev_id); - void (*txrx_ath_getstats)(void *pdev, - struct cdp_dev_stats *stats, uint8_t type); + QDF_STATUS + (*txrx_ath_getstats)(struct cdp_soc_t *soc, uint8_t id, + struct cdp_dev_stats *stats, uint8_t type); - void (*txrx_set_gid_flag)(struct cdp_pdev *pdev, u_int8_t *mem_status, - u_int8_t *user_position); + QDF_STATUS + (*txrx_set_gid_flag)(struct cdp_soc_t *soc, uint8_t pdev_id, + u_int8_t *mem_status, + u_int8_t *user_position); - uint32_t (*txrx_fw_supported_enh_stats_version)(struct cdp_pdev *pdev); + uint32_t (*txrx_fw_supported_enh_stats_version)(struct cdp_soc_t *soc, + uint8_t pdev_id); - void (*txrx_if_mgmt_drain)(void *ni, int force); + QDF_STATUS + (*txrx_if_mgmt_drain)(struct cdp_soc_t *soc, uint8_t pdev_id, + int force); - void (*txrx_set_curchan)(struct cdp_pdev *pdev, uint32_t chan_mhz); + QDF_STATUS + (*txrx_set_curchan)(struct cdp_soc_t *soc, uint8_t pdev_id, + uint32_t chan_mhz); - void (*txrx_set_privacy_filters) - (struct cdp_vdev *vdev, void *filter, uint32_t num); + QDF_STATUS + (*txrx_set_privacy_filters) + (struct cdp_soc_t *soc, uint8_t vdev_id, void *filter, + uint32_t num); - uint32_t (*txrx_get_cfg)(void *soc, enum cdp_dp_cfg cfg); + uint32_t (*txrx_get_cfg)(struct cdp_soc_t *soc, enum cdp_dp_cfg cfg); /******************************************************************** * Data Interface (B Interface) ********************************************************************/ - void (*txrx_vdev_register)(struct cdp_vdev *vdev, - void *osif_vdev, - struct ol_txrx_ops *txrx_ops); + QDF_STATUS + (*txrx_vdev_register)(struct cdp_soc_t *soc, uint8_t vdev_id, + ol_osif_vdev_handle osif_vdev, + struct ol_txrx_ops *txrx_ops); - int (*txrx_mgmt_send)(struct cdp_vdev *vdev, - qdf_nbuf_t tx_mgmt_frm, uint8_t type); + int (*txrx_mgmt_send)(struct cdp_soc_t *soc, uint8_t vdev_id, + qdf_nbuf_t tx_mgmt_frm, uint8_t type); - int (*txrx_mgmt_send_ext)(struct cdp_vdev *vdev, - qdf_nbuf_t tx_mgmt_frm, uint8_t type, uint8_t use_6mbps, - uint16_t chanfreq); + int (*txrx_mgmt_send_ext)(struct cdp_soc_t *soc, uint8_t vdev_id, + qdf_nbuf_t tx_mgmt_frm, uint8_t type, + uint8_t use_6mbps, uint16_t chanfreq); /** * ol_txrx_mgmt_tx_cb - tx management delivery notification * callback function */ - void (*txrx_mgmt_tx_cb_set)(struct cdp_pdev *pdev, uint8_t type, - ol_txrx_mgmt_tx_cb download_cb, - ol_txrx_mgmt_tx_cb ota_ack_cb, - void *ctxt); + QDF_STATUS + (*txrx_mgmt_tx_cb_set)(struct cdp_soc_t *soc, uint8_t pdev_id, + uint8_t type, + ol_txrx_mgmt_tx_cb download_cb, + ol_txrx_mgmt_tx_cb ota_ack_cb, + void *ctxt); int (*txrx_get_tx_pending)(struct cdp_pdev *pdev); @@ -241,17 +271,21 @@ struct cdp_cmn_ops { * Statistics and Debugging Interface (C Interface) ********************************************************************/ - int (*txrx_aggr_cfg)(struct cdp_vdev *vdev, int max_subfrms_ampdu, - int max_subfrms_amsdu); + int (*txrx_aggr_cfg)(struct cdp_soc_t *soc, uint8_t vdev_id, + int max_subfrms_ampdu, + int max_subfrms_amsdu); - A_STATUS (*txrx_fw_stats_get)(struct cdp_vdev *vdev, - struct ol_txrx_stats_req *req, - bool per_vdev, bool response_expected); + A_STATUS + (*txrx_fw_stats_get)(struct cdp_soc_t *soc, uint8_t vdev_id, + struct ol_txrx_stats_req *req, + bool per_vdev, bool response_expected); - int (*txrx_debug)(struct cdp_vdev *vdev, int debug_specs); + int (*txrx_debug)(struct cdp_soc_t *soc, uint8_t vdev_id, + int debug_specs); - void (*txrx_fw_stats_cfg)(struct cdp_vdev *vdev, - uint8_t cfg_stats_type, uint32_t cfg_val); + QDF_STATUS + (*txrx_fw_stats_cfg)(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t cfg_stats_type, uint32_t cfg_val); void (*txrx_print_level_set)(unsigned level); @@ -300,29 +334,26 @@ struct cdp_cmn_ops { struct cdp_vdev * (*txrx_get_mon_vdev_from_pdev)(struct cdp_pdev *pdev); - struct cdp_vdev * - (*txrx_get_vdev_from_vdev_id)(struct cdp_pdev *pdev, - uint8_t vdev_id); - - void (*txrx_soc_detach)(void *soc); + void (*txrx_soc_detach)(struct cdp_soc_t *soc); /** * txrx_soc_deinit() - Deinitialize dp soc and dp ring memory * @soc: Opaque Dp handle * - * Return: None + * Return None */ - void (*txrx_soc_deinit)(void *soc); + void (*txrx_soc_deinit)(struct cdp_soc_t *soc); /** * txrx_soc_init() - Initialize dp soc and dp ring memory * @soc: Opaque Dp handle + * @ctrl_psoc: Opaque Cp handle * @htchdl: Opaque htc handle * @hifhdl: Opaque hif handle * * Return: None */ - void *(*txrx_soc_init)(void *soc, + void *(*txrx_soc_init)(struct cdp_soc_t *soc, struct cdp_ctrl_objmgr_psoc *ctrl_psoc, struct hif_opaque_softc *hif_handle, HTC_HANDLE htc_handle, qdf_device_t qdf_osdev, @@ -335,7 +366,7 @@ struct cdp_cmn_ops { * * Return: QDF status */ - QDF_STATUS (*txrx_tso_soc_attach)(void *soc); + QDF_STATUS (*txrx_tso_soc_attach)(struct cdp_soc_t *soc); /** * txrx_tso_soc_detach() - TSO detach handler triggered during @@ -344,85 +375,103 @@ struct cdp_cmn_ops { * * Return: QDF status */ - QDF_STATUS (*txrx_tso_soc_detach)(void *soc); - int (*addba_resp_tx_completion)(void *peer_handle, uint8_t tid, + QDF_STATUS (*txrx_tso_soc_detach)(struct cdp_soc_t *soc); + int (*addba_resp_tx_completion)(struct cdp_soc_t *cdp_soc, + uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, int status); - int (*addba_requestprocess)(void *peer_handle, uint8_t dialogtoken, - uint16_t tid, uint16_t batimeout, - uint16_t buffersize, - uint16_t startseqnum); + int (*addba_requestprocess)(struct cdp_soc_t *cdp_soc, + uint8_t *peer_mac, + uint16_t vdev_id, + uint8_t dialogtoken, + uint16_t tid, uint16_t batimeout, + uint16_t buffersize, + uint16_t startseqnum); - void (*addba_responsesetup)(void *peer_handle, uint8_t tid, - uint8_t *dialogtoken, uint16_t *statuscode, - uint16_t *buffersize, uint16_t *batimeout); + QDF_STATUS + (*addba_responsesetup)(struct cdp_soc_t *cdp_soc, + uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, + uint8_t *dialogtoken, uint16_t *statuscode, + uint16_t *buffersize, uint16_t *batimeout); - int (*delba_process)(void *peer_handle, - int tid, uint16_t reasoncode); + int (*delba_process)(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, + uint16_t vdev_id, int tid, uint16_t reasoncode); /** * delba_tx_completion() - Indicate delba tx status - * @peer_handle: Peer handle + * @cdp_soc: soc handle + * @peer_mac: Peer mac address + * @vdev_id: vdev id * @tid: Tid number * @status: Tx completion status * * Return: 0 on Success, 1 on failure */ - int (*delba_tx_completion)(void *peer_handle, + int (*delba_tx_completion)(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, int status); - void (*set_addba_response)(void *peer_handle, - uint8_t tid, uint16_t statuscode); + QDF_STATUS + (*set_addba_response)(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, + uint16_t statuscode); - uint8_t (*get_peer_mac_addr_frm_id)(struct cdp_soc_t *soc_handle, - uint16_t peer_id, uint8_t *mac_addr); - - void (*set_vdev_dscp_tid_map)(struct cdp_vdev *vdev_handle, - uint8_t map_id); - int (*txrx_get_total_per)(struct cdp_pdev *pdev_handle); + QDF_STATUS + (*set_vdev_dscp_tid_map)(struct cdp_soc_t *soc_handle, + uint8_t vdev_id, uint8_t map_id); + int (*txrx_get_total_per)(struct cdp_soc_t *soc, uint8_t pdev_id); void (*flush_cache_rx_queue)(void); - void (*set_pdev_dscp_tid_map)(struct cdp_pdev *pdev, uint8_t map_id, - uint8_t tos, uint8_t tid); + + QDF_STATUS (*set_pdev_dscp_tid_map)(struct cdp_soc_t *soc_handle, + uint8_t pdev_id, + uint8_t map_id, + uint8_t tos, uint8_t tid); + void (*hmmc_tid_override_en)(struct cdp_pdev *pdev, bool val); void (*set_hmmc_tid_val)(struct cdp_pdev *pdev, uint8_t tid); - QDF_STATUS(*txrx_stats_request)(struct cdp_soc_t *soc_handle, - uint8_t vdev_id, - struct cdp_txrx_stats_req *req); + QDF_STATUS (*txrx_stats_request)(struct cdp_soc_t *soc_handle, + uint8_t vdev_id, + struct cdp_txrx_stats_req *req); - QDF_STATUS (*display_stats)(void *psoc, uint16_t value, + QDF_STATUS (*display_stats)(struct cdp_soc_t *psoc, uint16_t value, enum qdf_stats_verbosity_level level); void (*txrx_soc_set_nss_cfg)(ol_txrx_soc_handle soc, int config); int(*txrx_soc_get_nss_cfg)(ol_txrx_soc_handle soc); - QDF_STATUS (*txrx_intr_attach)(void *soc); - void (*txrx_intr_detach)(void *soc); - void (*set_pn_check)(struct cdp_vdev *vdev, - struct cdp_peer *peer_handle, enum cdp_sec_type sec_type, - uint32_t *rx_pn); + + QDF_STATUS (*txrx_intr_attach)(struct cdp_soc_t *soc_handle); + void (*txrx_intr_detach)(struct cdp_soc_t *soc_handle); + QDF_STATUS (*set_pn_check)(struct cdp_soc_t *soc_handle, + uint8_t vdev_id, uint8_t *peermac, + enum cdp_sec_type sec_type, + uint32_t *rx_pn); QDF_STATUS (*update_config_parameters)(struct cdp_soc *psoc, struct cdp_config_params *params); - void *(*get_dp_txrx_handle)(struct cdp_pdev *pdev_hdl); - void (*set_dp_txrx_handle)(struct cdp_pdev *pdev_hdl, - void *dp_txrx_hdl); + void *(*get_dp_txrx_handle)(ol_txrx_soc_handle soc, uint8_t pdev_id); + void (*set_dp_txrx_handle)(ol_txrx_soc_handle soc, uint8_t pdev_id, + void *dp_hdl); void *(*get_soc_dp_txrx_handle)(struct cdp_soc *soc_handle); void (*set_soc_dp_txrx_handle)(struct cdp_soc *soc_handle, void *dp_txrx_handle); - void (*map_pdev_to_lmac)(struct cdp_pdev *pdev_hdl, - uint32_t lmac_id); + QDF_STATUS (*map_pdev_to_lmac)(ol_txrx_soc_handle soc, uint8_t pdev_id, + uint32_t lmac_id); - void (*set_pdev_status_down)(struct cdp_pdev *pdev_hdl, bool is_pdev_down); + QDF_STATUS (*set_pdev_status_down)(struct cdp_soc_t *soc_handle, + uint8_t pdev_id, bool is_pdev_down); - void (*txrx_peer_reset_ast) + QDF_STATUS (*txrx_peer_reset_ast) (ol_txrx_soc_handle soc, uint8_t *ast_macaddr, - uint8_t *peer_macaddr, void *vdev_hdl); + uint8_t *peer_macaddr, uint8_t vdev_id); - void (*txrx_peer_reset_ast_table)(ol_txrx_soc_handle soc, - void *vdev_hdl); + QDF_STATUS (*txrx_peer_reset_ast_table)(ol_txrx_soc_handle soc, + uint8_t vdev_id); void (*txrx_peer_flush_ast_table)(ol_txrx_soc_handle soc); void (*txrx_set_ba_aging_timeout)(struct cdp_soc_t *soc_handle, @@ -448,28 +497,31 @@ struct cdp_cmn_ops { ol_txrx_rx_fp *stack_fn, ol_osif_vdev_handle *osif_vdev); int (*txrx_classify_update) - (struct cdp_vdev *vdev, qdf_nbuf_t skb, + (struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_t skb, enum txrx_direction, struct ol_txrx_nbuf_classify *nbuf_class); bool (*get_dp_capabilities)(struct cdp_soc_t *soc, enum cdp_capabilities dp_caps); void (*set_rate_stats_ctx)(struct cdp_soc_t *soc, void *ctx); void* (*get_rate_stats_ctx)(struct cdp_soc_t *soc); - void (*txrx_peer_flush_rate_stats)(struct cdp_soc_t *soc, - struct cdp_pdev *pdev, - void *buf); - void (*txrx_flush_rate_stats_request)(struct cdp_soc_t *soc, - struct cdp_pdev *pdev); - QDF_STATUS (*set_pdev_pcp_tid_map)(struct cdp_pdev *pdev, + QDF_STATUS (*txrx_peer_flush_rate_stats)(struct cdp_soc_t *soc, + uint8_t pdev_id, + void *buf); + + QDF_STATUS (*txrx_flush_rate_stats_request)(struct cdp_soc_t *soc, + uint8_t pdev_id); + QDF_STATUS (*set_pdev_pcp_tid_map)(struct cdp_soc_t *soc, + uint8_t pdev_id, uint8_t pcp, uint8_t tid); QDF_STATUS (*set_pdev_tidmap_prty)(struct cdp_pdev *pdev, uint8_t prty); - QDF_STATUS (*set_vdev_pcp_tid_map)(struct cdp_vdev *vdev, + QDF_STATUS (*set_vdev_pcp_tid_map)(struct cdp_soc_t *soc, + uint8_t vdev_id, uint8_t pcp, uint8_t tid); QDF_STATUS (*set_vdev_tidmap_prty)(struct cdp_vdev *vdev, uint8_t prty); QDF_STATUS (*set_vdev_tidmap_tbl_id)(struct cdp_vdev *vdev, uint8_t mapid); #ifdef QCA_MULTIPASS_SUPPORT - QDF_STATUS (*set_vlan_groupkey)(struct cdp_vdev *vdev_handle, + QDF_STATUS (*set_vlan_groupkey)(struct cdp_soc_t *soc, uint8_t vdev_id, uint16_t vlan_id, uint16_t group_key); #endif }; diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 4df6c81b33..1af3b8b7a7 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -3957,8 +3957,10 @@ static void dp_htt_t2h_msg_handler(void *context, HTC_PACKET *pkt) * using just 8 bits */ if (peer) { - status = dp_addba_requestprocess_wifi3(peer, - 0, tid, 0, win_sz + 1, 0xffff); + status = dp_addba_requestprocess_wifi3( + (struct cdp_soc_t *)soc->dp_soc, + peer->mac_addr.raw, peer->vdev->vdev_id, + 0, tid, 0, win_sz + 1, 0xffff); /* * If PEER_LOCK_REF_PROTECT enbled dec ref diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index a1f9c9ecc2..1f0a84510c 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -944,30 +944,44 @@ void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer) { } #endif -int dp_addba_resp_tx_completion_wifi3(void *peer_handle, uint8_t tid, - int status); -extern int dp_addba_requestprocess_wifi3(void *peer_handle, - uint8_t dialogtoken, uint16_t tid, uint16_t batimeout, - uint16_t buffersize, uint16_t startseqnum); -extern void dp_addba_responsesetup_wifi3(void *peer_handle, uint8_t tid, - uint8_t *dialogtoken, uint16_t *statuscode, - uint16_t *buffersize, uint16_t *batimeout); -extern void dp_set_addba_response(void *peer_handle, uint8_t tid, - uint16_t statuscode); -extern int dp_delba_process_wifi3(void *peer_handle, - int tid, uint16_t reasoncode); +int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, + uint8_t *peer_mac, uint16_t vdev_id, + uint8_t tid, + int status); +int dp_addba_requestprocess_wifi3(struct cdp_soc_t *cdp_soc, + uint8_t *peer_mac, uint16_t vdev_id, + uint8_t dialogtoken, uint16_t tid, + uint16_t batimeout, + uint16_t buffersize, + uint16_t startseqnum); +QDF_STATUS dp_addba_responsesetup_wifi3(struct cdp_soc_t *cdp_soc, + uint8_t *peer_mac, uint16_t vdev_id, + uint8_t tid, uint8_t *dialogtoken, + uint16_t *statuscode, + uint16_t *buffersize, + uint16_t *batimeout); +QDF_STATUS dp_set_addba_response(struct cdp_soc_t *cdp_soc, + uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, + uint16_t statuscode); +int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, + uint16_t vdev_id, int tid, + uint16_t reasoncode); /* * dp_delba_tx_completion_wifi3() - Handle delba tx completion * - * @peer_handle: Peer handle + * @cdp_soc: soc handle + * @vdev_id: id of the vdev handle + * @peer_mac: peer mac address * @tid: Tid number * @status: Tx completion status * Indicate status of delba Tx to DP for stats update and retry * delba if tx failed. * */ -int dp_delba_tx_completion_wifi3(void *peer_handle, uint8_t tid, - int status); +int dp_delba_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, + int status); extern QDF_STATUS dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid, uint32_t ba_window_size, uint32_t start_seq); @@ -1003,9 +1017,10 @@ void dp_htt_stats_print_tag(struct dp_pdev *pdev, void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf); void dp_peer_rxtid_stats(struct dp_peer *peer, void (*callback_fn), void *cb_ctxt); -void dp_set_pn_check_wifi3(struct cdp_vdev *vdev_handle, - struct cdp_peer *peer_handle, enum cdp_sec_type sec_type, - uint32_t *rx_pn); +QDF_STATUS +dp_set_pn_check_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_mac, enum cdp_sec_type sec_type, + uint32_t *rx_pn); void *dp_get_pdev_for_mac_id(struct dp_soc *soc, uint32_t mac_id); void dp_set_michael_key(struct cdp_peer *peer_handle, diff --git a/dp/wifi3.0/dp_ipa.c b/dp/wifi3.0/dp_ipa.c index 75f9600a09..980e99e69b 100644 --- a/dp/wifi3.0/dp_ipa.c +++ b/dp/wifi3.0/dp_ipa.c @@ -770,22 +770,22 @@ QDF_STATUS dp_ipa_get_stat(struct cdp_soc_t *soc_hdl, uint8_t pdev_id) return QDF_STATUS_SUCCESS; } +/** + * dp_tx_send_ipa_data_frame() - send IPA data frame + * @soc_hdl: datapath soc handle + * @vdev_id: id of the virtual device + * @skb: skb to transmit + * + * Return: skb/ NULL is for success + */ qdf_nbuf_t dp_tx_send_ipa_data_frame(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, qdf_nbuf_t skb) { - struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); - struct dp_vdev *vdev = - dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id); qdf_nbuf_t ret; - if (!vdev) { - dp_err("%s invalid instance", __func__); - return skb; - } - /* Terminate the (single-element) list of tx frames */ qdf_nbuf_set_next(skb, NULL); - ret = dp_tx_send(dp_vdev_to_cdp_vdev(vdev), skb); + ret = dp_tx_send(soc_hdl, vdev_id, skb); if (ret) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s: Failed to tx", __func__); @@ -1699,7 +1699,7 @@ static qdf_nbuf_t dp_ipa_intrabss_send(struct dp_pdev *pdev, qdf_mem_zero(nbuf->cb, sizeof(nbuf->cb)); len = qdf_nbuf_len(nbuf); - if (dp_tx_send(dp_vdev_to_cdp_vdev(vdev), nbuf)) { + if (dp_tx_send((struct cdp_soc_t *)pdev->soc, vdev->vdev_id, nbuf)) { DP_STATS_INC_PKT(vdev_peer, rx.intra_bss.fail, 1, len); return nbuf; } diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 932cb3c961..a3873a71e1 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -130,7 +130,7 @@ dp_config_enh_tx_capture(struct cdp_pdev *pdev_handle, uint8_t val) } #endif -void *dp_soc_init(void *dpsoc, HTC_HANDLE htc_handle, +void *dp_soc_init(struct dp_soc *soc, HTC_HANDLE htc_handle, struct hif_opaque_softc *hif_handle); static void dp_pdev_detach(struct cdp_pdev *txrx_pdev, int force); static struct dp_soc * @@ -138,9 +138,11 @@ dp_soc_attach(struct cdp_ctrl_objmgr_psoc *ctrl_psoc, HTC_HANDLE htc_handle, qdf_device_t qdf_osdev, struct ol_if_ops *ol_ops, uint16_t device_id); static void dp_pktlogmod_exit(struct dp_pdev *handle); -static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle, - uint8_t *peer_mac_addr); -static void dp_peer_delete_wifi3(void *peer_handle, uint32_t bitmap); +static inline void *dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, + uint8_t vdev_id, + uint8_t *peer_mac_addr); +static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_mac, uint32_t bitmap); static void dp_ppdu_ring_reset(struct dp_pdev *pdev); static void dp_ppdu_ring_cfg(struct dp_pdev *pdev); static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, @@ -480,27 +482,51 @@ struct dp_vdev *dp_get_dp_vdev_from_cdp_vdev(struct cdp_vdev *cdp_opaque_vdev) static int dp_peer_add_ast_wifi3(struct cdp_soc_t *soc_hdl, - struct cdp_peer *peer_hdl, - uint8_t *mac_addr, - enum cdp_txrx_ast_entry_type type, - uint32_t flags) + uint8_t vdev_id, + uint8_t *peer_mac, + uint8_t *mac_addr, + enum cdp_txrx_ast_entry_type type, + uint32_t flags) { - return dp_peer_add_ast((struct dp_soc *)soc_hdl, - (struct dp_peer *)peer_hdl, - mac_addr, - type, - flags); + int ret = -1; + struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)soc_hdl, + peer_mac, 0, vdev_id); + + if (!peer || peer->delete_in_progress) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, + "%s: Peer is NULL!\n", __func__); + goto fail; + } + + ret = dp_peer_add_ast((struct dp_soc *)soc_hdl, + peer, + mac_addr, + type, + flags); +fail: + if (peer) + dp_peer_unref_delete(peer); + + return ret; } static int dp_peer_update_ast_wifi3(struct cdp_soc_t *soc_hdl, - struct cdp_peer *peer_hdl, + uint8_t vdev_id, + uint8_t *peer_mac, uint8_t *wds_macaddr, uint32_t flags) { int status = -1; struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_ast_entry *ast_entry = NULL; - struct dp_peer *peer = (struct dp_peer *)peer_hdl; + struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)soc_hdl, + peer_mac, 0, vdev_id); + + if (!peer || peer->delete_in_progress) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, + "%s: Peer is NULL!\n", __func__); + goto fail; + } qdf_spin_lock_bh(&soc->ast_lock); ast_entry = dp_peer_ast_hash_find_by_pdevid(soc, wds_macaddr, @@ -511,9 +537,12 @@ static int dp_peer_update_ast_wifi3(struct cdp_soc_t *soc_hdl, peer, ast_entry, flags); } - qdf_spin_unlock_bh(&soc->ast_lock); +fail: + if (peer) + dp_peer_unref_delete(peer); + return status; } @@ -521,30 +550,39 @@ static int dp_peer_update_ast_wifi3(struct cdp_soc_t *soc_hdl, * dp_wds_reset_ast_wifi3() - Reset the is_active param for ast entry * @soc_handle: Datapath SOC handle * @wds_macaddr: WDS entry MAC Address - * Return: None + * @peer_macaddr: WDS entry MAC Address + * @vdev_id: id of vdev handle + * Return: QDF_STATUS */ -static void dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl, - uint8_t *wds_macaddr, - uint8_t *peer_mac_addr, - void *vdev_handle) +static QDF_STATUS dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl, + uint8_t *wds_macaddr, + uint8_t *peer_mac_addr, + uint8_t vdev_id) { struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_ast_entry *ast_entry = NULL; struct dp_ast_entry *tmp_ast_entry; struct dp_peer *peer; - struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle; struct dp_pdev *pdev; + struct dp_vdev *vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id); if (!vdev) - return; + return QDF_STATUS_E_FAILURE; pdev = vdev->pdev; if (peer_mac_addr) { peer = dp_peer_find_hash_find(soc, peer_mac_addr, 0, vdev->vdev_id); - if (!peer) - return; + if (!peer) { + return QDF_STATUS_E_FAILURE; + } + + if (peer->delete_in_progress) { + dp_peer_unref_delete(peer); + return QDF_STATUS_E_FAILURE; + } + qdf_spin_lock_bh(&soc->ast_lock); DP_PEER_ITERATE_ASE_LIST(peer, ast_entry, tmp_ast_entry) { if ((ast_entry->type == CDP_TXRX_AST_TYPE_WDS_HM) || @@ -554,6 +592,7 @@ static void dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl, qdf_spin_unlock_bh(&soc->ast_lock); dp_peer_unref_delete(peer); + return QDF_STATUS_SUCCESS; } else if (wds_macaddr) { qdf_spin_lock_bh(&soc->ast_lock); ast_entry = dp_peer_ast_hash_find_by_pdevid(soc, wds_macaddr, @@ -566,16 +605,19 @@ static void dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl, } qdf_spin_unlock_bh(&soc->ast_lock); } + + return QDF_STATUS_SUCCESS; } /* * dp_wds_reset_ast_table_wifi3() - Reset the is_active param for all ast entry * @soc: Datapath SOC handle * - * Return: None + * Return: QDF_STATUS */ -static void dp_wds_reset_ast_table_wifi3(struct cdp_soc_t *soc_hdl, - void *vdev_hdl) +static QDF_STATUS +dp_wds_reset_ast_table_wifi3(struct cdp_soc_t *soc_hdl, + uint8_t vdev_id) { struct dp_soc *soc = (struct dp_soc *) soc_hdl; struct dp_pdev *pdev; @@ -604,6 +646,8 @@ static void dp_wds_reset_ast_table_wifi3(struct cdp_soc_t *soc_hdl, } qdf_spin_unlock_bh(&soc->ast_lock); + + return QDF_STATUS_SUCCESS; } /* @@ -1614,7 +1658,7 @@ static void dp_interrupt_timer(void *arg) * * Return: 0 for success, nonzero for failure. */ -static QDF_STATUS dp_soc_attach_poll(void *txrx_soc) +static QDF_STATUS dp_soc_attach_poll(struct cdp_soc_t *txrx_soc) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; int i; @@ -1677,7 +1721,7 @@ static void dp_soc_set_interrupt_mode(struct dp_soc *soc) } } -static QDF_STATUS dp_soc_interrupt_attach(void *txrx_soc); +static QDF_STATUS dp_soc_interrupt_attach(struct cdp_soc_t *txrx_soc); #if defined(DP_INTR_POLL_BOTH) /* * dp_soc_interrupt_attach_wrapper() - Register handlers for DP interrupts @@ -1688,7 +1732,7 @@ static QDF_STATUS dp_soc_interrupt_attach(void *txrx_soc); * * Return: 0 for success. nonzero for failure. */ -static QDF_STATUS dp_soc_interrupt_attach_wrapper(void *txrx_soc) +static QDF_STATUS dp_soc_interrupt_attach_wrapper(struct cdp_soc_t *txrx_soc) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; @@ -1705,12 +1749,12 @@ static QDF_STATUS dp_soc_interrupt_attach_wrapper(void *txrx_soc) } #else #if defined(DP_INTR_POLL_BASED) && DP_INTR_POLL_BASED -static QDF_STATUS dp_soc_interrupt_attach_wrapper(void *txrx_soc) +static QDF_STATUS dp_soc_interrupt_attach_wrapper(struct cdp_soc_t *txrx_soc) { return dp_soc_attach_poll(txrx_soc); } #else -static QDF_STATUS dp_soc_interrupt_attach_wrapper(void *txrx_soc) +static QDF_STATUS dp_soc_interrupt_attach_wrapper(struct cdp_soc_t *txrx_soc) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; @@ -1864,7 +1908,7 @@ static void dp_soc_interrupt_map_calculate(struct dp_soc *soc, int intr_ctx_num, * * Return: 0 for success. nonzero for failure. */ -static QDF_STATUS dp_soc_interrupt_attach(void *txrx_soc) +static QDF_STATUS dp_soc_interrupt_attach(struct cdp_soc_t *txrx_soc) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; @@ -1939,9 +1983,9 @@ static QDF_STATUS dp_soc_interrupt_attach(void *txrx_soc) * dp_soc_interrupt_detach() - Deregister any allocations done for interrupts * @txrx_soc: DP SOC handle * - * Return: void + * Return: none */ -static void dp_soc_interrupt_detach(void *txrx_soc) +static void dp_soc_interrupt_detach(struct cdp_soc_t *txrx_soc) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; int i; @@ -3065,7 +3109,9 @@ static void dp_soc_cmn_cleanup(struct dp_soc *soc) qdf_spinlock_destroy(&soc->rx.reo_cmd_lock); } -static void dp_pdev_detach_wifi3(struct cdp_pdev *txrx_pdev, int force); +static QDF_STATUS +dp_pdev_detach_wifi3(struct cdp_soc_t *psoc, uint8_t pdev_id, + int force); static QDF_STATUS dp_lro_hash_setup(struct dp_soc *soc, struct dp_pdev *pdev) { @@ -3977,19 +4023,29 @@ static void dp_pdev_deinit(struct cdp_pdev *txrx_pdev, int force) /** * dp_pdev_deinit_wifi3() - Deinit txrx pdev - * @txrx_pdev: Datapath PDEV handle + * @psoc: Datapath psoc handle + * @pdev_id: Id of datapath PDEV handle * @force: Force deinit * - * Return: None + * Return: QDF_STATUS */ -static void dp_pdev_deinit_wifi3(struct cdp_pdev *txrx_pdev, int force) +static QDF_STATUS +dp_pdev_deinit_wifi3(struct cdp_soc_t *psoc, uint8_t pdev_id, + int force) { - struct dp_pdev *pdev = (struct dp_pdev *)txrx_pdev; - struct dp_soc *soc = pdev->soc; + struct dp_soc *soc = (struct dp_soc *)psoc; + struct dp_pdev *txrx_pdev = + dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)psoc, + pdev_id); + + if (!txrx_pdev) + return QDF_STATUS_E_FAILURE; soc->dp_soc_reinit = TRUE; - dp_pdev_deinit(txrx_pdev, force); + dp_pdev_deinit((struct cdp_pdev *)txrx_pdev, force); + + return QDF_STATUS_SUCCESS; } /* @@ -4052,22 +4108,33 @@ static void dp_pdev_detach(struct cdp_pdev *txrx_pdev, int force) /* * dp_pdev_detach_wifi3() - detach txrx pdev - * @txrx_pdev: Datapath PDEV handle + * @psoc: Datapath soc handle + * @pdev_id: pdev id of pdev * @force: Force detach * - * Return: None + * Return: QDF_STATUS */ -static void dp_pdev_detach_wifi3(struct cdp_pdev *txrx_pdev, int force) +static QDF_STATUS dp_pdev_detach_wifi3(struct cdp_soc_t *psoc, uint8_t pdev_id, + int force) { - struct dp_pdev *pdev = (struct dp_pdev *)txrx_pdev; - struct dp_soc *soc = pdev->soc; + struct dp_soc *soc = (struct dp_soc *)psoc; + struct dp_pdev *txrx_pdev = + dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)psoc, + pdev_id); + + if (!txrx_pdev) { + dp_err("Couldn't find dp pdev"); + return QDF_STATUS_E_FAILURE; + } if (dp_is_soc_reinit(soc)) { - dp_pdev_detach(txrx_pdev, force); + dp_pdev_detach((struct cdp_pdev *)txrx_pdev, force); } else { - dp_pdev_deinit(txrx_pdev, force); - dp_pdev_detach(txrx_pdev, force); + dp_pdev_deinit((struct cdp_pdev *)txrx_pdev, force); + dp_pdev_detach((struct cdp_pdev *)txrx_pdev, force); } + + return QDF_STATUS_SUCCESS; } /* @@ -4209,7 +4276,7 @@ static void dp_soc_deinit(void *txrx_soc) * * Return: None */ -static void dp_soc_deinit_wifi3(void *txrx_soc) +static void dp_soc_deinit_wifi3(struct cdp_soc_t *txrx_soc) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; @@ -4223,7 +4290,7 @@ static void dp_soc_deinit_wifi3(void *txrx_soc) * * Return: None */ -static void dp_soc_detach(void *txrx_soc) +static void dp_soc_detach(struct cdp_soc_t *txrx_soc) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; int i; @@ -4308,7 +4375,7 @@ static void dp_soc_detach(void *txrx_soc) * * Return: None */ -static void dp_soc_detach_wifi3(void *txrx_soc) +static void dp_soc_detach_wifi3(struct cdp_soc_t *txrx_soc) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; @@ -4318,7 +4385,6 @@ static void dp_soc_detach_wifi3(void *txrx_soc) dp_soc_deinit(txrx_soc); dp_soc_detach(txrx_soc); } - } #if !defined(DISABLE_MON_CONFIG) @@ -4771,14 +4837,26 @@ static void dp_soc_set_nss_cfg_wifi3(struct cdp_soc_t *cdp_soc, int config) * * Return: DP VDEV handle on success, NULL on failure */ -static struct cdp_vdev *dp_vdev_attach_wifi3(struct cdp_pdev *txrx_pdev, - uint8_t *vdev_mac_addr, uint8_t vdev_id, enum wlan_op_mode op_mode, - enum wlan_op_subtype subtype) +static struct cdp_vdev *dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc, + uint8_t pdev_id, + uint8_t *vdev_mac_addr, + uint8_t vdev_id, + enum wlan_op_mode op_mode, + enum wlan_op_subtype subtype) { - struct dp_pdev *pdev = (struct dp_pdev *)txrx_pdev; - struct dp_soc *soc = pdev->soc; + struct dp_soc *soc = (struct dp_soc *)cdp_soc; + struct dp_pdev *pdev = + dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, + pdev_id); struct dp_vdev *vdev = qdf_mem_malloc(sizeof(*vdev)); + if (!pdev) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("DP PDEV is Null for pdev id %d"), pdev_id); + qdf_mem_free(vdev); + goto fail0; + } + if (!vdev) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, FL("DP VDEV memory allocation failed")); @@ -4861,8 +4939,8 @@ static struct cdp_vdev *dp_vdev_attach_wifi3(struct cdp_pdev *txrx_pdev, DP_STATS_INIT(vdev); if (wlan_op_mode_sta == vdev->opmode) - dp_peer_create_wifi3((struct cdp_vdev *)vdev, - vdev->mac_addr.raw); + dp_peer_create_wifi3((struct cdp_soc_t *)soc, vdev_id, + vdev->mac_addr.raw); return (struct cdp_vdev *)vdev; @@ -4872,17 +4950,25 @@ fail0: /** * dp_vdev_register_wifi3() - Register VDEV operations from osif layer - * @vdev: Datapath VDEV handle + * @soc: Datapath soc handle + * @vdev_id: id of Datapath VDEV handle * @osif_vdev: OSIF vdev handle - * @ctrl_vdev: UMAC vdev handle * @txrx_ops: Tx and Rx operations * * Return: DP VDEV handle on success, NULL on failure */ -static void dp_vdev_register_wifi3(struct cdp_vdev *vdev_handle, - void *osif_vdev, struct ol_txrx_ops *txrx_ops) +static QDF_STATUS dp_vdev_register_wifi3(struct cdp_soc_t *soc, + uint8_t vdev_id, + ol_osif_vdev_handle osif_vdev, + struct ol_txrx_ops *txrx_ops) { - struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle; + struct dp_vdev *vdev = + dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, + vdev_id); + + if (!vdev) + return QDF_STATUS_E_FAILURE; + vdev->osif_vdev = osif_vdev; vdev->osif_rx = txrx_ops->rx.rx; vdev->osif_rx_stack = txrx_ops->rx.rx_stack; @@ -4913,6 +4999,8 @@ static void dp_vdev_register_wifi3(struct cdp_vdev *vdev_handle, QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_LOW, "DP Vdev Register success"); + + return QDF_STATUS_SUCCESS; } /** @@ -5000,7 +5088,9 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, bool unmap_only) peer->mac_addr.raw); /* only if peer valid is true */ if (peer->valid) - dp_peer_delete_wifi3(peer, 0); + dp_peer_delete_wifi3((struct cdp_soc_t *)soc, + vdev->vdev_id, + peer->mac_addr.raw, 0); } qdf_mem_free(peer_array); } @@ -5029,29 +5119,33 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, bool unmap_only) /* * dp_vdev_detach_wifi3() - Detach txrx vdev - * @txrx_vdev: Datapath VDEV handle - * @callback: Callback OL_IF on completion of detach + * @cdp_soc: Datapath soc handle + * @vdev_id: VDEV Id + * @callback: Callback OL_IF on completion of detach * @cb_context: Callback context * */ -static void dp_vdev_detach_wifi3(struct cdp_vdev *vdev_handle, - ol_txrx_vdev_delete_cb callback, void *cb_context) +static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc, + uint8_t vdev_id, + ol_txrx_vdev_delete_cb callback, + void *cb_context) { - struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle; + struct dp_soc *soc = (struct dp_soc *)cdp_soc; struct dp_pdev *pdev; - struct dp_soc *soc; struct dp_neighbour_peer *peer = NULL; struct dp_neighbour_peer *temp_peer = NULL; + struct dp_vdev *vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id); + + if (!vdev) + return QDF_STATUS_E_FAILURE; - /* preconditions */ - qdf_assert_always(vdev); pdev = vdev->pdev; - soc = pdev->soc; soc->vdev_id_map[vdev->vdev_id] = NULL; if (wlan_op_mode_sta == vdev->opmode) - dp_peer_delete_wifi3(vdev->vap_self_peer, 0); + dp_peer_delete_wifi3((struct cdp_soc_t *)soc, vdev->vdev_id, + vdev->vap_self_peer->mac_addr.raw, 0); /* * If Target is hung, flush all peers before detaching vdev @@ -5076,7 +5170,7 @@ static void dp_vdev_detach_wifi3(struct cdp_vdev *vdev_handle, vdev->delete.callback = callback; vdev->delete.context = cb_context; qdf_spin_unlock_bh(&soc->peer_ref_mutex); - return; + return QDF_STATUS_E_FAILURE; } qdf_spin_unlock_bh(&soc->peer_ref_mutex); @@ -5117,6 +5211,8 @@ free_vdev: if (callback) callback(cb_context); + + return QDF_STATUS_SUCCESS; } #ifdef FEATURE_AST @@ -5215,25 +5311,25 @@ static inline void dp_peer_rx_bufq_resources_init(struct dp_peer *peer) /* * dp_peer_create_wifi3() - attach txrx peer - * @txrx_vdev: Datapath VDEV handle + * @soc_hdl: Datapath soc handle + * @vdev_id: id of vdev * @peer_mac_addr: Peer MAC address * * Return: DP peeer handle on success, NULL on failure */ -static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle, - uint8_t *peer_mac_addr) +static void *dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, + uint8_t *peer_mac_addr) { struct dp_peer *peer; int i; - struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle; + struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_pdev *pdev; - struct dp_soc *soc; struct cdp_peer_cookie peer_cookie; enum cdp_txrx_ast_entry_type ast_type = CDP_TXRX_AST_TYPE_STATIC; + struct dp_vdev *vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id); - /* preconditions */ - qdf_assert(vdev); - qdf_assert(peer_mac_addr); + if (!vdev || !peer_mac_addr) + return NULL; pdev = vdev->pdev; soc = pdev->soc; @@ -5380,6 +5476,7 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle, qdf_mem_copy(peer_cookie.mac_addr, peer->mac_addr.raw, QDF_MAC_ADDR_SIZE); peer_cookie.ctx = NULL; + peer_cookie.pdev_id = pdev->pdev_id; peer_cookie.cookie = pdev->next_peer_cookie++; #if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE dp_wdi_event_handler(WDI_EVENT_PEER_CREATE, pdev->soc, @@ -5518,27 +5615,32 @@ static void dp_peer_setup_get_reo_hash(struct dp_vdev *vdev, /* * dp_peer_setup_wifi3() - initialize the peer - * @vdev_hdl: virtual device object - * @peer: Peer object + * @soc_hdl: soc handle object + * @vdev_id : vdev_id of vdev object + * @peer_mac: Peer's mac address * - * Return: void + * Return: QDF_STATUS */ -static void dp_peer_setup_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl) +static QDF_STATUS +dp_peer_setup_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, + uint8_t *peer_mac) { - struct dp_peer *peer = (struct dp_peer *)peer_hdl; - struct dp_vdev *vdev = (struct dp_vdev *)vdev_hdl; + struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_pdev *pdev; - struct dp_soc *soc; bool hash_based = 0; enum cdp_host_reo_dest_ring reo_dest; + QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_vdev *vdev = + dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id); + struct dp_peer *peer = + dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id); - /* preconditions */ - qdf_assert(vdev); - qdf_assert(peer); + if (!vdev || !peer || peer->delete_in_progress) { + status = QDF_STATUS_E_FAILURE; + goto fail; + } pdev = vdev->pdev; - soc = pdev->soc; - dp_peer_setup_get_reo_hash(vdev, &reo_dest, &hash_based); dp_info("pdev: %d vdev :%d opmode:%u hash-based-steering:%d default-reo_dest:%u", @@ -5553,8 +5655,10 @@ static void dp_peer_setup_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl) * which is REO2TCL ring. for this reason we should * not setup reo_queues and default route for bss_peer. */ - if (peer->bss_peer && vdev->opmode == wlan_op_mode_ap) - return; + if (peer->bss_peer && vdev->opmode == wlan_op_mode_ap) { + status = QDF_STATUS_E_FAILURE; + goto fail; + } if (soc->cdp_soc.ol_ops->peer_set_default_routing) { /* TODO: Check the destination ring number to be passed to FW */ @@ -5572,26 +5676,32 @@ static void dp_peer_setup_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl) dp_peer_ppdu_delayed_ba_init(peer); - return; +fail: + if (peer) + dp_peer_unref_delete(peer); + return status; } /* * dp_cp_peer_del_resp_handler - Handle the peer delete response * @soc_hdl: Datapath SOC handle - * @vdev_hdl: virtual device object + * @vdev_id: id of virtual device object * @mac_addr: Mac address of the peer * - * Return: void + * Return: QDF_STATUS */ -static void dp_cp_peer_del_resp_handler(struct cdp_soc_t *soc_hdl, - struct cdp_vdev *vdev_hdl, - uint8_t *mac_addr) +static QDF_STATUS dp_cp_peer_del_resp_handler(struct cdp_soc_t *soc_hdl, + uint8_t vdev_id, + uint8_t *mac_addr) { struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_ast_entry *ast_entry = NULL; - struct dp_vdev *vdev = (struct dp_vdev *)vdev_hdl; txrx_ast_free_cb cb = NULL; void *cookie; + struct dp_vdev *vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id); + + if (!vdev) + return QDF_STATUS_E_FAILURE; qdf_spin_lock_bh(&soc->ast_lock); @@ -5610,7 +5720,7 @@ static void dp_cp_peer_del_resp_handler(struct cdp_soc_t *soc_hdl, */ if (!ast_entry || ast_entry->peer || !ast_entry->delete_in_progress) { qdf_spin_unlock_bh(&soc->ast_lock); - return; + return QDF_STATUS_E_FAILURE; } if (ast_entry->is_mapped) @@ -5634,6 +5744,8 @@ static void dp_cp_peer_del_resp_handler(struct cdp_soc_t *soc_hdl, CDP_TXRX_AST_DELETED); } qdf_mem_free(ast_entry); + + return QDF_STATUS_SUCCESS; } /* @@ -6108,13 +6220,24 @@ static inline void dp_peer_rx_bufq_resources_deinit(struct dp_peer *peer) /* * dp_peer_detach_wifi3() – Detach txrx peer - * @peer_handle: Datapath peer handle + * @soc: soc handle + * @vdev_id: id of dp handle + * @peer_mac: mac of datapath PEER handle * @bitmap: bitmap indicating special handling of request. * */ -static void dp_peer_delete_wifi3(void *peer_handle, uint32_t bitmap) +static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_mac, uint32_t bitmap) { - struct dp_peer *peer = (struct dp_peer *)peer_handle; + struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)soc, + peer_mac, 0, vdev_id); + + /* Peer can be null for monitor vap mac address */ + if (!peer) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, + "%s: Invalid peer\n", __func__); + return QDF_STATUS_E_FAILURE; + } peer->valid = 0; @@ -6134,7 +6257,13 @@ static void dp_peer_delete_wifi3(void *peer_handle, uint32_t bitmap) * PEER_UNMAP message arrives to remove the other * reference, added by the PEER_MAP message. */ - dp_peer_unref_delete(peer_handle); + dp_peer_unref_delete(peer); + /* + * Remove the reference taken above + */ + dp_peer_unref_delete(peer); + + return QDF_STATUS_SUCCESS; } /* @@ -6169,33 +6298,6 @@ static int dp_vdev_set_wds(struct cdp_soc_t *soc, uint8_t vdev_id, uint32_t val) return QDF_STATUS_SUCCESS; } -/* - * dp_get_vdev_from_vdev_id_wifi3() – Detach txrx peer - * @peer_handle: Datapath peer handle - * - */ -static struct cdp_vdev *dp_get_vdev_from_vdev_id_wifi3(struct cdp_pdev *dev, - uint8_t vdev_id) -{ - struct dp_pdev *pdev = (struct dp_pdev *)dev; - struct dp_vdev *vdev = NULL; - - if (qdf_unlikely(!pdev)) - return NULL; - - qdf_spin_lock_bh(&pdev->vdev_list_lock); - TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) { - if (vdev->delete.pending) - continue; - - if (vdev->vdev_id == vdev_id) - break; - } - qdf_spin_unlock_bh(&pdev->vdev_list_lock); - - return (struct cdp_vdev *)vdev; -} - /* * dp_get_mon_vdev_from_pdev_wifi3() - Get vdev handle of monitor mode * @dev: PDEV handle @@ -6340,15 +6442,28 @@ QDF_STATUS dp_reset_monitor_mode(struct cdp_pdev *pdev_handle) /** * dp_set_nac() - set peer_nac - * @peer_handle: Datapath PEER handle + * @soc: soc handle + * @vdev_id: id of dp handle + * @peer_mac: mac of datapath PEER handle * * Return: void */ -static void dp_set_nac(struct cdp_peer *peer_handle) +static void dp_set_nac(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_mac) { - struct dp_peer *peer = (struct dp_peer *)peer_handle; + struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)soc, + peer_mac, 0, vdev_id); + + if (!peer || peer->delete_in_progress) + goto fail; peer->nac = 1; + +fail: + if (peer) + dp_peer_unref_delete(peer); + + return; } /** @@ -6370,22 +6485,26 @@ static int dp_get_tx_pending(struct cdp_pdev *pdev_handle) * @peer_id: Peer ID * @peer_mac: MAC addr of PEER * - * Return: void + * Return: QDF_STATUS */ -static void dp_get_peer_mac_from_peer_id(struct cdp_pdev *pdev_handle, - uint32_t peer_id, uint8_t *peer_mac) +static QDF_STATUS dp_get_peer_mac_from_peer_id(struct cdp_soc_t *soc, + uint32_t peer_id, + uint8_t *peer_mac) { - struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; struct dp_peer *peer; - if (pdev && peer_mac) { - peer = dp_peer_find_by_id(pdev->soc, (uint16_t)peer_id); + if (soc && peer_mac) { + peer = dp_peer_find_by_id((struct dp_soc *)soc, + (uint16_t)peer_id); if (peer) { qdf_mem_copy(peer_mac, peer->mac_addr.raw, QDF_MAC_ADDR_SIZE); dp_peer_unref_del_find_by_id(peer); + return QDF_STATUS_SUCCESS; } } + + return QDF_STATUS_E_FAILURE; } /** @@ -6535,13 +6654,17 @@ QDF_STATUS dp_pdev_configure_monitor_rings(struct dp_pdev *pdev) * * Return: 0 on success, not 0 on failure */ -static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_vdev *vdev_handle, +static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *soc, + uint8_t vdev_id, uint8_t special_monitor) { - struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle; struct dp_pdev *pdev; + struct dp_vdev *vdev = + dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, + vdev_id); - qdf_assert(vdev); + if (!vdev) + return QDF_STATUS_E_FAILURE; pdev = vdev->pdev; pdev->monitor_vdev = vdev; @@ -7015,10 +7138,10 @@ void dp_aggregate_pdev_stats(struct dp_pdev *pdev) * @vdev_handle: Datapath VDEV handle * @stats: cdp network device stats structure * - * Return: void + * Return: QDF_STATUS */ -static void dp_vdev_getstats(struct cdp_vdev *vdev_handle, - struct cdp_dev_stats *stats) +static QDF_STATUS dp_vdev_getstats(struct cdp_vdev *vdev_handle, + struct cdp_dev_stats *stats) { struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle; struct dp_pdev *pdev; @@ -7026,11 +7149,11 @@ static void dp_vdev_getstats(struct cdp_vdev *vdev_handle, struct cdp_vdev_stats *vdev_stats; if (!vdev) - return; + return QDF_STATUS_E_FAILURE; pdev = vdev->pdev; if (!pdev) - return; + return QDF_STATUS_E_FAILURE; soc = pdev->soc; @@ -7039,7 +7162,7 @@ static void dp_vdev_getstats(struct cdp_vdev *vdev_handle, if (!vdev_stats) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "DP alloc failure - unable to get alloc vdev stats"); - return; + return QDF_STATUS_E_FAILURE; } qdf_spin_lock_bh(&soc->peer_ref_mutex); @@ -7062,6 +7185,7 @@ static void dp_vdev_getstats(struct cdp_vdev *vdev_handle, qdf_mem_free(vdev_stats); + return QDF_STATUS_SUCCESS; } @@ -7070,7 +7194,7 @@ static void dp_vdev_getstats(struct cdp_vdev *vdev_handle, * @pdev_handle: Datapath PDEV handle * @stats: cdp network device stats structure * - * Return: void + * Return: QDF_STATUS */ static void dp_pdev_getstats(struct cdp_pdev *pdev_handle, struct cdp_dev_stats *stats) @@ -7109,21 +7233,34 @@ static void dp_pdev_getstats(struct cdp_pdev *pdev_handle, /** * dp_get_device_stats() - get interface level packet stats - * @handle: device handle + * @soc: soc handle + * @id : vdev_id or pdev_id based on type * @stats: cdp network device stats structure * @type: device type pdev/vdev * - * Return: void + * Return: QDF_STATUS */ -static void dp_get_device_stats(void *handle, - struct cdp_dev_stats *stats, uint8_t type) +static QDF_STATUS dp_get_device_stats(struct cdp_soc_t *soc, uint8_t id, + struct cdp_dev_stats *stats, + uint8_t type) { switch (type) { case UPDATE_VDEV_STATS: - dp_vdev_getstats(handle, stats); - break; + return dp_vdev_getstats( + (struct cdp_vdev *)dp_get_vdev_from_soc_vdev_id_wifi3( + (struct dp_soc *)soc, id), stats); case UPDATE_PDEV_STATS: - dp_pdev_getstats(handle, stats); + { + struct dp_pdev *pdev = + dp_get_pdev_from_soc_pdev_id_wifi3( + (struct dp_soc *)soc, + id); + if (pdev) { + dp_pdev_getstats((struct cdp_pdev *)pdev, + stats); + return QDF_STATUS_SUCCESS; + } + } break; default: QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, @@ -7132,6 +7269,7 @@ static void dp_get_device_stats(void *handle, break; } + return QDF_STATUS_E_FAILURE; } const @@ -7466,10 +7604,8 @@ static inline bool is_ppdu_txrx_capture_enabled(struct dp_pdev *pdev) *Return: 0 for success. nonzero for failure. */ static QDF_STATUS -dp_set_bpr_enable(struct cdp_pdev *pdev_handle, int val) +dp_set_bpr_enable(struct dp_pdev *pdev, int val) { - struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; - switch (val) { case CDP_BPR_DISABLE: pdev->bpr_enable = CDP_BPR_DISABLE; @@ -7539,7 +7675,7 @@ dp_pdev_tid_stats_osif_drop(struct dp_pdev *pdev, uint32_t val) /* * dp_config_debug_sniffer()- API to enable/disable debug sniffer - * @pdev_handle: DP_PDEV handle + * @pdev: DP_PDEV handle * @val: user provided value * * Return: 0 for success. nonzero for failure. @@ -7807,7 +7943,7 @@ static QDF_STATUS dp_set_pdev_param(struct cdp_pdev *pdev_handle, case CDP_CONFIG_DEBUG_SNIFFER: return dp_config_debug_sniffer(pdev_handle, val); case CDP_CONFIG_BPR_ENABLE: - return dp_set_bpr_enable(pdev_handle, val); + return dp_set_bpr_enable(pdev, val); case CDP_CONFIG_PRIMARY_RADIO: pdev->is_primary = val; break; @@ -8032,17 +8168,25 @@ dp_peer_update_pkt_capture_params(struct cdp_pdev *pdev, /* * dp_set_vdev_dscp_tid_map_wifi3(): Update Map ID selected for particular vdev - * @vdev_handle: DP_VDEV handle + * @soc: DP_SOC handle + * @vdev_id: id of DP_VDEV handle * @map_id:ID of map that needs to be updated * - * Return: void + * Return: QDF_STATUS */ -static void dp_set_vdev_dscp_tid_map_wifi3(struct cdp_vdev *vdev_handle, - uint8_t map_id) +static QDF_STATUS dp_set_vdev_dscp_tid_map_wifi3(ol_txrx_soc_handle soc, + uint8_t vdev_id, + uint8_t map_id) { - struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle; - vdev->dscp_tid_map_id = map_id; - return; + struct dp_vdev *vdev = + dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, + vdev_id); + if (vdev) { + vdev->dscp_tid_map_id = map_id; + return QDF_STATUS_SUCCESS; + } + + return QDF_STATUS_E_FAILURE; } #ifdef DP_RATETABLE_SUPPORT @@ -8220,14 +8364,14 @@ fail: * * return : int */ -static int dp_txrx_get_vdev_stats(struct cdp_soc_t *soc, uint8_t vdev_id, +static int dp_txrx_get_vdev_stats(struct cdp_soc_t *soc, uint8_t vdev_id, void *buf, bool is_aggregate) { + struct cdp_vdev_stats *vdev_stats; + struct dp_pdev *pdev; struct dp_vdev *vdev = dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, vdev_id); - struct cdp_vdev_stats *vdev_stats; - struct dp_pdev *pdev; if (!vdev) return 1; @@ -8251,13 +8395,19 @@ static int dp_txrx_get_vdev_stats(struct cdp_soc_t *soc, uint8_t vdev_id, /* * dp_get_total_per(): get total per - * @pdev_handle: DP_PDEV handle + * @soc: DP soc handle + * @pdev_id: id of DP_PDEV handle * * Return: % error rate using retries per packet and success packets */ -static int dp_get_total_per(struct cdp_pdev *pdev_handle) +static int dp_get_total_per(struct cdp_soc_t *soc, uint8_t pdev_id) { - struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; + struct dp_pdev *pdev = + dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, + pdev_id); + + if (!pdev) + return 0; dp_aggregate_pdev_stats(pdev); if ((pdev->stats.tx.tx_success.num + pdev->stats.tx.retries) == 0) @@ -8268,7 +8418,7 @@ static int dp_get_total_per(struct cdp_pdev *pdev_handle) /* * dp_txrx_stats_publish(): publish pdev stats into a buffer - * @pdev_handle: DP soc handle + * @soc: DP soc handle * @pdev_id: id of DP_PDEV handle * @buf: to hold pdev_stats * @@ -8309,22 +8459,26 @@ dp_txrx_stats_publish(struct cdp_soc_t *soc, uint8_t pdev_id, /** * dp_set_pdev_dscp_tid_map_wifi3(): update dscp tid map in pdev - * @pdev: DP_PDEV handle + * @soc: soc handle + * @pdev_id: id of DP_PDEV handle * @map_id: ID of map that needs to be updated * @tos: index value in map * @tid: tid value passed by the user * - * Return: void + * Return: QDF_STATUS */ -static void dp_set_pdev_dscp_tid_map_wifi3(struct cdp_pdev *pdev_handle, - uint8_t map_id, uint8_t tos, uint8_t tid) +static QDF_STATUS +dp_set_pdev_dscp_tid_map_wifi3(struct cdp_soc_t *soc_handle, + uint8_t pdev_id, + uint8_t map_id, + uint8_t tos, uint8_t tid) { uint8_t dscp; - struct dp_pdev *pdev = (struct dp_pdev *) pdev_handle; - struct dp_soc *soc = pdev->soc; + struct dp_soc *soc = (struct dp_soc *)soc_handle; + struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); - if (!soc) - return; + if (!pdev) + return QDF_STATUS_E_FAILURE; dscp = (tos >> DP_IP_DSCP_SHIFT) & DP_IP_DSCP_MASK; pdev->dscp_tid_map[map_id][dscp] = tid; @@ -8332,7 +8486,10 @@ static void dp_set_pdev_dscp_tid_map_wifi3(struct cdp_pdev *pdev_handle, if (map_id < soc->num_hw_dscp_tid_map) hal_tx_update_dscp_tid(soc->hal_soc, tid, map_id, dscp); - return; + else + return QDF_STATUS_E_FAILURE; + + return QDF_STATUS_SUCCESS; } /** @@ -8423,14 +8580,13 @@ QDF_STATUS dp_txrx_stats_request(struct cdp_soc_t *soc_handle, struct cdp_txrx_stats_req *req) { struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_handle); - struct cdp_vdev *vdev; int host_stats; int fw_stats; enum cdp_stats stats; int num_stats; + struct dp_vdev *vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, + vdev_id); - vdev = dp_vdev_to_cdp_vdev(dp_get_vdev_from_soc_vdev_id_wifi3(soc, - vdev_id)); if (!vdev || !req) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "Invalid vdev/req instance"); @@ -8471,12 +8627,12 @@ QDF_STATUS dp_txrx_stats_request(struct cdp_soc_t *soc_handle, if (fw_stats != TXRX_FW_STATS_INVALID) { /* update request with FW stats type */ req->stats = fw_stats; - return dp_fw_stats_process((struct dp_vdev *)vdev, req); + return dp_fw_stats_process(vdev, req); } if ((host_stats != TXRX_HOST_STATS_INVALID) && (host_stats <= TXRX_HOST_STATS_MAX)) - return dp_print_host_stats((struct dp_vdev *)vdev, req); + return dp_print_host_stats(vdev, req); else QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, "Wrong Input for TxRx Stats"); @@ -8488,7 +8644,7 @@ QDF_STATUS dp_txrx_stats_request(struct cdp_soc_t *soc_handle, * dp_txrx_dump_stats() - Dump statistics * @value - Statistics option */ -static QDF_STATUS dp_txrx_dump_stats(void *psoc, uint16_t value, +static QDF_STATUS dp_txrx_dump_stats(struct cdp_soc_t *psoc, uint16_t value, enum qdf_stats_verbosity_level level) { struct dp_soc *soc = @@ -8701,28 +8857,40 @@ dp_txrx_data_tx_cb_set(struct cdp_vdev *vdev_handle, /** * dp_pdev_get_dp_txrx_handle() - get dp handle from pdev - * @pdev_hdl: datapath pdev handle + * @soc: datapath soc handle + * @pdev_id: id of datapath pdev handle * * Return: opaque pointer to dp txrx handle */ -static void *dp_pdev_get_dp_txrx_handle(struct cdp_pdev *pdev_hdl) +static void *dp_pdev_get_dp_txrx_handle(struct cdp_soc_t *soc, uint8_t pdev_id) { - struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl; + struct dp_pdev *pdev = + dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, + pdev_id); + if (qdf_unlikely(!pdev)) + return NULL; return pdev->dp_txrx_handle; } /** * dp_pdev_set_dp_txrx_handle() - set dp handle in pdev - * @pdev_hdl: datapath pdev handle + * @soc: datapath soc handle + * @pdev_id: id of datapath pdev handle * @dp_txrx_hdl: opaque pointer for dp_txrx_handle * * Return: void */ static void -dp_pdev_set_dp_txrx_handle(struct cdp_pdev *pdev_hdl, void *dp_txrx_hdl) +dp_pdev_set_dp_txrx_handle(struct cdp_soc_t *soc, uint8_t pdev_id, + void *dp_txrx_hdl) { - struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl; + struct dp_pdev *pdev = + dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, + pdev_id); + + if (!pdev) + return; pdev->dp_txrx_handle = dp_txrx_hdl; } @@ -8757,36 +8925,51 @@ dp_soc_set_dp_txrx_handle(struct cdp_soc *soc_handle, void *txrx_handle) /** * dp_soc_map_pdev_to_lmac() - Save pdev_id to lmac_id mapping - * @pdev_hdl: datapath pdev handle + * @soc_hdl: datapath soc handle + * @pdev_id: id of the datapath pdev handle * @lmac_id: lmac id * - * Return: void + * Return: QDF_STATUS */ -static void -dp_soc_map_pdev_to_lmac(struct cdp_pdev *pdev_hdl, uint32_t lmac_id) +static QDF_STATUS +dp_soc_map_pdev_to_lmac(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, + uint32_t lmac_id) { - struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl; - struct dp_soc *soc = pdev->soc; + struct dp_soc *soc = (struct dp_soc *)soc_hdl; + struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, + pdev_id); + + if (qdf_unlikely(!pdev)) + return QDF_STATUS_E_FAILURE; pdev->lmac_id = lmac_id; wlan_cfg_set_hw_macid(soc->wlan_cfg_ctx, - pdev->pdev_id, + pdev_id, (lmac_id + 1)); + + return QDF_STATUS_SUCCESS; } /** * dp_soc_set_pdev_status_down() - set pdev down/up status - * @pdev_hdl: datapath pdev handle + * @soc: datapath soc handle + * @pdev_id: id of datapath pdev handle * @is_pdev_down: pdev down/up status * - * Return: void + * Return: QDF_STATUS */ -static void -dp_soc_set_pdev_status_down(struct cdp_pdev *pdev_hdl, bool is_pdev_down) +static QDF_STATUS +dp_soc_set_pdev_status_down(struct cdp_soc_t *soc, uint8_t pdev_id, + bool is_pdev_down) { - struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl; + struct dp_pdev *pdev = + dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, + pdev_id); + if (!pdev) + return QDF_STATUS_E_FAILURE; pdev->is_pdev_down = is_pdev_down; + return QDF_STATUS_SUCCESS; } /** @@ -8806,28 +8989,45 @@ dp_get_cfg_capabilities(struct cdp_soc_t *soc_handle, } #ifdef FEATURE_AST -static void dp_peer_teardown_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl) +static QDF_STATUS +dp_peer_teardown_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, + uint8_t *peer_mac) { - struct dp_vdev *vdev = (struct dp_vdev *)vdev_hdl; - struct dp_peer *peer = (struct dp_peer *)peer_hdl; - struct dp_soc *soc = (struct dp_soc *)vdev->pdev->soc; + struct dp_soc *soc = (struct dp_soc *)soc_hdl; + QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_peer *peer = + dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id); + /* Peer can be null for monitor vap mac address */ + if (!peer || peer->delete_in_progress) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, + "%s: Invalid peer\n", __func__); + status = QDF_STATUS_E_FAILURE; + goto fail; + } /* * For BSS peer, new peer is not created on alloc_node if the * peer with same address already exists , instead refcnt is * increased for existing peer. Correspondingly in delete path, * only refcnt is decreased; and peer is only deleted , when all * references are deleted. So delete_in_progress should not be set - * for bss_peer, unless only 2 reference remains (peer map reference - * and peer hash table reference). + * for bss_peer, unless only 3 reference remains (peer map reference, + * peer hash table reference and above local reference). */ - if (peer->bss_peer && (qdf_atomic_read(&peer->ref_cnt) > 2)) - return; + if (peer->bss_peer && (qdf_atomic_read(&peer->ref_cnt) > 3)) { + status = QDF_STATUS_E_FAILURE; + goto fail; + } qdf_spin_lock_bh(&soc->ast_lock); peer->delete_in_progress = true; dp_peer_delete_ast_entries(soc, peer); qdf_spin_unlock_bh(&soc->ast_lock); + +fail: + if (peer) + dp_peer_unref_delete(peer); + return status; } #endif @@ -8839,10 +9039,8 @@ static void dp_peer_teardown_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl) * * Return: 0 for success. nonzero for failure. */ -static QDF_STATUS dp_vdev_get_neighbour_rssi(struct cdp_vdev *vdev_hdl, - char *mac_addr, - uint8_t *rssi) -{ +static QDF_STATUS dp_vdev_get_neighbour_rssi(struct cdp_vdev *vdev_hdl, + char *mac_addr, uint8_t *rssi) { struct dp_vdev *vdev = (struct dp_vdev *)vdev_hdl; struct dp_pdev *pdev = vdev->pdev; struct dp_neighbour_peer *peer = NULL; @@ -9030,17 +9228,22 @@ static void dp_soc_set_rate_stats_ctx(struct cdp_soc_t *soc_handle, { struct dp_soc *soc = (struct dp_soc *)soc_handle; - soc->rate_stats_ctx = stats_ctx; + soc->rate_stats_ctx = (struct cdp_soc_rate_stats_ctx *)stats_ctx; } #if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE -static void dp_flush_rate_stats_req(struct cdp_soc_t *soc_hdl, - struct cdp_pdev *pdev_hdl) +static QDF_STATUS dp_flush_rate_stats_req(struct cdp_soc_t *soc_hdl, + uint8_t pdev_id) { - struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl; - struct dp_soc *soc = (struct dp_soc *)pdev->soc; + struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_vdev *vdev = NULL; struct dp_peer *peer = NULL; + struct dp_pdev *pdev = + dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, + pdev_id); + + if (!pdev) + return QDF_STATUS_E_FAILURE; qdf_spin_lock_bh(&soc->peer_ref_mutex); qdf_spin_lock_bh(&pdev->vdev_list_lock); @@ -9049,39 +9252,42 @@ static void dp_flush_rate_stats_req(struct cdp_soc_t *soc_hdl, if (peer && !peer->bss_peer) dp_wdi_event_handler( WDI_EVENT_FLUSH_RATE_STATS_REQ, - pdev->soc, peer->wlanstats_ctx, + soc, peer->wlanstats_ctx, peer->peer_ids[0], - WDI_NO_VAL, pdev->pdev_id); + WDI_NO_VAL, pdev_id); } } qdf_spin_unlock_bh(&pdev->vdev_list_lock); qdf_spin_unlock_bh(&soc->peer_ref_mutex); + + return QDF_STATUS_SUCCESS; } #else -static inline void +static inline QDF_STATUS dp_flush_rate_stats_req(struct cdp_soc_t *soc_hdl, - struct cdp_pdev *pdev_hdl) + uint8_t pdev_id) { + return QDF_STATUS_SUCCESS; } #endif #if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE -static void dp_peer_flush_rate_stats(struct cdp_soc_t *soc, - struct cdp_pdev *pdev_handle, - void *buf) +static QDF_STATUS dp_peer_flush_rate_stats(struct cdp_soc_t *soc, + uint8_t pdev_id, + void *buf) { - struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; - dp_wdi_event_handler(WDI_EVENT_PEER_FLUSH_RATE_STATS, - pdev->soc, buf, HTT_INVALID_PEER, - WDI_NO_VAL, pdev->pdev_id); + (struct dp_soc *)soc, buf, HTT_INVALID_PEER, + WDI_NO_VAL, pdev_id); + return QDF_STATUS_SUCCESS; } #else -static inline void +static inline QDF_STATUS dp_peer_flush_rate_stats(struct cdp_soc_t *soc, - struct cdp_pdev *pdev_handle, + uint8_t pdev_id, void *buf) { + return QDF_STATUS_SUCCESS; } #endif @@ -9099,7 +9305,7 @@ static void *dp_soc_get_rate_stats_ctx(struct cdp_soc_t *soc_handle) * * Return: cfg value */ -static uint32_t dp_get_cfg(void *soc, enum cdp_dp_cfg cfg) +static uint32_t dp_get_cfg(struct cdp_soc_t *soc, enum cdp_dp_cfg cfg) { struct dp_soc *dpsoc = (struct dp_soc *)soc; uint32_t value = 0; @@ -9216,17 +9422,18 @@ static uint32_t dp_tx_flow_ctrl_configure_pdev(struct cdp_soc_t *soc_handle, /** * dp_set_pdev_pcp_tid_map_wifi3(): update pcp tid map in pdev - * @vdev: DP_PDEV handle + * @psoc: dp soc handle + * @pdev_id: id of DP_PDEV handle * @pcp: pcp value * @tid: tid value passed by the user * * Return: QDF_STATUS_SUCCESS on success */ -static QDF_STATUS dp_set_pdev_pcp_tid_map_wifi3(struct cdp_pdev *pdev_handle, +static QDF_STATUS dp_set_pdev_pcp_tid_map_wifi3(ol_txrx_soc_handle psoc, + uint8_t pdev_id, uint8_t pcp, uint8_t tid) { - struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; - struct dp_soc *soc = pdev->soc; + struct dp_soc *soc = (struct dp_soc *)psoc; soc->pcp_tid_map[pcp] = tid; @@ -9255,16 +9462,23 @@ static QDF_STATUS dp_set_pdev_tidmap_prty_wifi3(struct cdp_pdev *pdev_handle, /** * dp_set_vdev_pcp_tid_map_wifi3(): update pcp tid map in vdev - * @vdev: DP_VDEV handle + * @soc: DP soc handle + * @vdev_id: id of DP_VDEV handle * @pcp: pcp value * @tid: tid value passed by the user * * Return: QDF_STATUS_SUCCESS on success */ -static QDF_STATUS dp_set_vdev_pcp_tid_map_wifi3(struct cdp_vdev *vdev_handle, +static QDF_STATUS dp_set_vdev_pcp_tid_map_wifi3(struct cdp_soc_t *soc, + uint8_t vdev_id, uint8_t pcp, uint8_t tid) { - struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle; + struct dp_vdev *vdev = + dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, + vdev_id); + + if (!vdev) + return QDF_STATUS_E_FAILURE; vdev->pcp_tid_map[pcp] = tid; @@ -9330,14 +9544,12 @@ static struct cdp_cmn_ops dp_ops_cmn = { dp_peer_ast_entry_del_by_pdev, .txrx_peer_delete = dp_peer_delete_wifi3, .txrx_vdev_register = dp_vdev_register_wifi3, - .txrx_vdev_flush_peers = dp_vdev_flush_peers, .txrx_soc_detach = dp_soc_detach_wifi3, .txrx_soc_deinit = dp_soc_deinit_wifi3, .txrx_soc_init = dp_soc_init_wifi3, .txrx_tso_soc_attach = dp_tso_soc_attach, .txrx_tso_soc_detach = dp_tso_soc_detach, .txrx_get_vdev_mac_addr = dp_get_vdev_mac_addr_wifi3, - .txrx_get_vdev_from_vdev_id = dp_get_vdev_from_vdev_id_wifi3, .txrx_get_mon_vdev_from_pdev = dp_get_mon_vdev_from_pdev_wifi3, .txrx_get_ctrl_pdev_from_vdev = dp_get_ctrl_pdev_from_vdev_wifi3, .txrx_ath_getstats = dp_get_device_stats, @@ -9346,7 +9558,6 @@ static struct cdp_cmn_ops dp_ops_cmn = { .addba_resp_tx_completion = dp_addba_resp_tx_completion_wifi3, .delba_process = dp_delba_process_wifi3, .set_addba_response = dp_set_addba_response, - .get_peer_mac_addr_frm_id = dp_get_peer_mac_addr_frm_id, .flush_cache_rx_queue = NULL, /* TODO: get API's for dscp-tid need to be added*/ .set_vdev_dscp_tid_map = dp_set_vdev_dscp_tid_map_wifi3, @@ -9602,11 +9813,11 @@ static uint32_t dp_tx_get_success_ack_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) { struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); + struct cdp_vdev_stats *vdev_stats = NULL; + uint32_t tx_success; struct dp_vdev *vdev = (struct dp_vdev *)dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id); - struct cdp_vdev_stats *vdev_stats = NULL; - uint32_t tx_success; if (!vdev) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -10086,7 +10297,7 @@ fail0: * * Return: DP SOC handle on success, NULL on failure */ -void *dp_soc_init(void *dpsoc, HTC_HANDLE htc_handle, +void *dp_soc_init(struct dp_soc *dpsoc, HTC_HANDLE htc_handle, struct hif_opaque_softc *hif_handle) { int target_type; @@ -10218,12 +10429,13 @@ void *dp_soc_init(void *dpsoc, HTC_HANDLE htc_handle, * * Return: DP SOC handle on success, NULL on failure */ -void *dp_soc_init_wifi3(void *dpsoc, struct cdp_ctrl_objmgr_psoc *ctrl_psoc, +void *dp_soc_init_wifi3(struct cdp_soc_t *soc, + struct cdp_ctrl_objmgr_psoc *ctrl_psoc, struct hif_opaque_softc *hif_handle, HTC_HANDLE htc_handle, qdf_device_t qdf_osdev, struct ol_if_ops *ol_ops, uint16_t device_id) { - return dp_soc_init(dpsoc, htc_handle, hif_handle); + return dp_soc_init((struct dp_soc *)soc, htc_handle, hif_handle); } #endif diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index d43995e6f3..1d44e96c4a 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -2518,21 +2518,26 @@ static void dp_teardown_256_ba_sessions(struct dp_peer *peer) /* * dp_rx_addba_resp_tx_completion_wifi3() – Update Rx Tid State * -* @peer: Datapath peer handle +* @soc: Datapath soc handle +* @peer_mac: Datapath peer mac address +* @vdev_id: id of atapath vdev * @tid: TID number * @status: tx completion status * Return: 0 on success, error code on failure */ -int dp_addba_resp_tx_completion_wifi3(void *peer_handle, +int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, + uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, int status) { - struct dp_peer *peer = (struct dp_peer *)peer_handle; + struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)cdp_soc, + peer_mac, 0, vdev_id); struct dp_rx_tid *rx_tid = NULL; if (!peer || peer->delete_in_progress) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, "%s: Peer is NULL!\n", __func__); - return QDF_STATUS_E_FAILURE; + goto fail; } rx_tid = &peer->rx_tid[tid]; qdf_spin_lock_bh(&rx_tid->tid_lock); @@ -2543,7 +2548,8 @@ int dp_addba_resp_tx_completion_wifi3(void *peer_handle, rx_tid->ba_status = DP_RX_BA_INACTIVE; qdf_spin_unlock_bh(&rx_tid->tid_lock); dp_err("RxTid- %d addba rsp tx completion failed", tid); - return QDF_STATUS_SUCCESS; + + goto success; } rx_tid->num_addba_rsp_success++; @@ -2552,7 +2558,7 @@ int dp_addba_resp_tx_completion_wifi3(void *peer_handle, QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "%s: Rx Tid- %d hw qdesc is not in IN_PROGRESS", __func__, tid); - return QDF_STATUS_E_FAILURE; + goto fail; } if (!qdf_atomic_read(&peer->is_default_route_set)) { @@ -2560,7 +2566,7 @@ int dp_addba_resp_tx_completion_wifi3(void *peer_handle, QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, "%s: default route is not set for peer: %pM", __func__, peer->mac_addr.raw); - return QDF_STATUS_E_FAILURE; + goto fail; } /* First Session */ @@ -2585,30 +2591,46 @@ int dp_addba_resp_tx_completion_wifi3(void *peer_handle, dp_teardown_256_ba_sessions(peer); peer->kill_256_sessions = 0; } + +success: + dp_peer_unref_delete(peer); return QDF_STATUS_SUCCESS; + +fail: + if (peer) + dp_peer_unref_delete(peer); + + return QDF_STATUS_E_FAILURE; } /* * dp_rx_addba_responsesetup_wifi3() – Process ADDBA request from peer * -* @peer: Datapath peer handle +* @soc: Datapath soc handle +* @peer_mac: Datapath peer mac address +* @vdev_id: id of atapath vdev * @tid: TID number * @dialogtoken: output dialogtoken * @statuscode: output dialogtoken * @buffersize: Output BA window size * @batimeout: Output BA timeout */ -void dp_addba_responsesetup_wifi3(void *peer_handle, uint8_t tid, - uint8_t *dialogtoken, uint16_t *statuscode, - uint16_t *buffersize, uint16_t *batimeout) +QDF_STATUS +dp_addba_responsesetup_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, + uint8_t *dialogtoken, uint16_t *statuscode, + uint16_t *buffersize, uint16_t *batimeout) { - struct dp_peer *peer = (struct dp_peer *)peer_handle; struct dp_rx_tid *rx_tid = NULL; + QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)cdp_soc, + peer_mac, 0, vdev_id); if (!peer || peer->delete_in_progress) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, "%s: Peer is NULL!\n", __func__); - return; + status = QDF_STATUS_E_FAILURE; + goto fail; } rx_tid = &peer->rx_tid[tid]; qdf_spin_lock_bh(&rx_tid->tid_lock); @@ -2619,6 +2641,12 @@ void dp_addba_responsesetup_wifi3(void *peer_handle, uint8_t tid, *buffersize = rx_tid->ba_win_size; *batimeout = 0; qdf_spin_unlock_bh(&rx_tid->tid_lock); + +fail: + if (peer) + dp_peer_unref_delete(peer); + + return status; } /* dp_check_ba_buffersize() - Check buffer size in request @@ -2666,7 +2694,9 @@ static void dp_check_ba_buffersize(struct dp_peer *peer, /* * dp_addba_requestprocess_wifi3() - Process ADDBA request from peer * - * @peer: Datapath peer handle + * @soc: Datapath soc handle + * @peer_mac: Datapath peer mac address + * @vdev_id: id of atapath vdev * @dialogtoken: dialogtoken from ADDBA frame * @tid: TID number * @batimeout: BA timeout @@ -2675,19 +2705,24 @@ static void dp_check_ba_buffersize(struct dp_peer *peer, * * Return: 0 on success, error code on failure */ -int dp_addba_requestprocess_wifi3(void *peer_handle, +int dp_addba_requestprocess_wifi3(struct cdp_soc_t *cdp_soc, + uint8_t *peer_mac, + uint16_t vdev_id, uint8_t dialogtoken, uint16_t tid, uint16_t batimeout, uint16_t buffersize, uint16_t startseqnum) { - struct dp_peer *peer = (struct dp_peer *)peer_handle; + QDF_STATUS status = QDF_STATUS_SUCCESS; struct dp_rx_tid *rx_tid = NULL; + struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)cdp_soc, + peer_mac, 0, vdev_id); if (!peer || peer->delete_in_progress) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, "%s: Peer is NULL!\n", __func__); - return QDF_STATUS_E_FAILURE; + status = QDF_STATUS_E_FAILURE; + goto fail; } rx_tid = &peer->rx_tid[tid]; qdf_spin_lock_bh(&rx_tid->tid_lock); @@ -2698,13 +2733,14 @@ int dp_addba_requestprocess_wifi3(void *peer_handle, rx_tid->ba_status = DP_RX_BA_INACTIVE; peer->active_ba_session_cnt--; QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, - "%s: Addba recvd for Rx Tid-%d hw qdesc is already setup", - __func__, tid); + "%s: Rx Tid- %d hw qdesc is already setup", + __func__, tid); } if (rx_tid->ba_status == DP_RX_BA_IN_PROGRESS) { qdf_spin_unlock_bh(&rx_tid->tid_lock); - return QDF_STATUS_E_FAILURE; + status = QDF_STATUS_E_FAILURE; + goto fail; } dp_check_ba_buffersize(peer, tid, buffersize); @@ -2712,7 +2748,8 @@ int dp_addba_requestprocess_wifi3(void *peer_handle, rx_tid->ba_win_size, startseqnum)) { rx_tid->ba_status = DP_RX_BA_INACTIVE; qdf_spin_unlock_bh(&rx_tid->tid_lock); - return QDF_STATUS_E_FAILURE; + status = QDF_STATUS_E_FAILURE; + goto fail; } rx_tid->ba_status = DP_RX_BA_IN_PROGRESS; @@ -2726,46 +2763,80 @@ int dp_addba_requestprocess_wifi3(void *peer_handle, qdf_spin_unlock_bh(&rx_tid->tid_lock); - return QDF_STATUS_SUCCESS; +fail: + if (peer) + dp_peer_unref_delete(peer); + + return status; } /* * dp_set_addba_response() – Set a user defined ADDBA response status code * -* @peer: Datapath peer handle +* @soc: Datapath soc handle +* @peer_mac: Datapath peer mac address +* @vdev_id: id of atapath vdev * @tid: TID number * @statuscode: response status code to be set */ -void dp_set_addba_response(void *peer_handle, uint8_t tid, - uint16_t statuscode) +QDF_STATUS +dp_set_addba_response(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, uint16_t statuscode) { - struct dp_peer *peer = (struct dp_peer *)peer_handle; - struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; + struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)cdp_soc, + peer_mac, 0, vdev_id); + struct dp_rx_tid *rx_tid; + QDF_STATUS status = QDF_STATUS_SUCCESS; + if (!peer || peer->delete_in_progress) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, + "%s: Peer is NULL!\n", __func__); + status = QDF_STATUS_E_FAILURE; + goto fail; + } + + rx_tid = &peer->rx_tid[tid]; qdf_spin_lock_bh(&rx_tid->tid_lock); rx_tid->userstatuscode = statuscode; qdf_spin_unlock_bh(&rx_tid->tid_lock); +fail: + if (peer) + dp_peer_unref_delete(peer); + + return status; } /* * dp_rx_delba_process_wifi3() – Process DELBA from peer -* @peer: Datapath peer handle +* @soc: Datapath soc handle +* @peer_mac: Datapath peer mac address +* @vdev_id: id of atapath vdev * @tid: TID number * @reasoncode: Reason code received in DELBA frame * * Return: 0 on success, error code on failure */ -int dp_delba_process_wifi3(void *peer_handle, - int tid, uint16_t reasoncode) +int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, + uint16_t vdev_id, int tid, uint16_t reasoncode) { - struct dp_peer *peer = (struct dp_peer *)peer_handle; - struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; + QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_rx_tid *rx_tid; + struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)cdp_soc, + peer_mac, 0, vdev_id); + if (!peer || peer->delete_in_progress) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, + "%s: Peer is NULL!\n", __func__); + status = QDF_STATUS_E_FAILURE; + goto fail; + } + rx_tid = &peer->rx_tid[tid]; qdf_spin_lock_bh(&rx_tid->tid_lock); if (rx_tid->ba_status == DP_RX_BA_INACTIVE || rx_tid->ba_status == DP_RX_BA_IN_PROGRESS) { qdf_spin_unlock_bh(&rx_tid->tid_lock); - return QDF_STATUS_E_FAILURE; + status = QDF_STATUS_E_FAILURE; + goto fail; } /* TODO: See if we can delete the existing REO queue descriptor and * replace with a new one without queue extenstion descript to save @@ -2778,28 +2849,38 @@ int dp_delba_process_wifi3(void *peer_handle, rx_tid->ba_status = DP_RX_BA_INACTIVE; peer->active_ba_session_cnt--; qdf_spin_unlock_bh(&rx_tid->tid_lock); - return 0; +fail: + if (peer) + dp_peer_unref_delete(peer); + + return status; } /* * dp_rx_delba_tx_completion_wifi3() – Send Delba Request * - * @peer: Datapath peer handle + * @soc: Datapath soc handle + * @peer_mac: Datapath peer mac address + * @vdev_id: id of atapath vdev * @tid: TID number * @status: tx completion status * Return: 0 on success, error code on failure */ -int dp_delba_tx_completion_wifi3(void *peer_handle, +int dp_delba_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, int status) { - struct dp_peer *peer = (struct dp_peer *)peer_handle; + QDF_STATUS ret = QDF_STATUS_SUCCESS; struct dp_rx_tid *rx_tid = NULL; + struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)cdp_soc, + peer_mac, 0, vdev_id); if (!peer || peer->delete_in_progress) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, "%s: Peer is NULL!", __func__); - return QDF_STATUS_E_FAILURE; + ret = QDF_STATUS_E_FAILURE; + goto end; } rx_tid = &peer->rx_tid[tid]; qdf_spin_lock_bh(&rx_tid->tid_lock); @@ -2820,7 +2901,7 @@ int dp_delba_tx_completion_wifi3(void *peer_handle, peer->mac_addr.raw, tid, rx_tid->delba_rcode); } - return QDF_STATUS_SUCCESS; + goto end; } else { rx_tid->delba_tx_success_cnt++; rx_tid->delba_tx_retry = 0; @@ -2837,12 +2918,18 @@ int dp_delba_tx_completion_wifi3(void *peer_handle, } qdf_spin_unlock_bh(&rx_tid->tid_lock); - return QDF_STATUS_SUCCESS; +end: + if (peer) + dp_peer_unref_delete(peer); + + return ret; } /** * dp_set_pn_check_wifi3() - enable PN check in REO for security - * @peer: Datapath peer handle + * @soc: Datapath soc handle + * @peer_mac: Datapath peer mac address + * @vdev_id: id of atapath vdev * @vdev: Datapath vdev * @pdev - data path device instance * @sec_type - security type @@ -2850,24 +2937,30 @@ int dp_delba_tx_completion_wifi3(void *peer_handle, * */ -void -dp_set_pn_check_wifi3(struct cdp_vdev *vdev_handle, struct cdp_peer *peer_handle, enum cdp_sec_type sec_type, uint32_t *rx_pn) +QDF_STATUS +dp_set_pn_check_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_mac, enum cdp_sec_type sec_type, + uint32_t *rx_pn) { - struct dp_peer *peer = (struct dp_peer *)peer_handle; - struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle; struct dp_pdev *pdev; - struct dp_soc *soc; int i; uint8_t pn_size; struct hal_reo_cmd_params params; + QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)soc, + peer_mac, 0, vdev_id); + struct dp_vdev *vdev = + dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, + vdev_id); - /* preconditions */ - qdf_assert(vdev); + if (!vdev || !peer || peer->delete_in_progress) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, + "%s: Peer is NULL!\n", __func__); + status = QDF_STATUS_E_FAILURE; + goto fail; + } pdev = vdev->pdev; - soc = pdev->soc; - - qdf_mem_zero(¶ms, sizeof(params)); params.std.need_status = 1; @@ -2931,14 +3024,20 @@ dp_set_pn_check_wifi3(struct cdp_vdev *vdev_handle, struct cdp_peer *peer_handle params.u.upd_queue_params.pn_127_96 = rx_pn[3]; } rx_tid->pn_size = pn_size; - dp_reo_send_cmd(soc, CMD_UPDATE_RX_REO_QUEUE, ¶ms, - dp_rx_tid_update_cb, rx_tid); + dp_reo_send_cmd((struct dp_soc *)soc, + CMD_UPDATE_RX_REO_QUEUE, ¶ms, + dp_rx_tid_update_cb, rx_tid); } else { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, "PN Check not setup for TID :%d ", i); } qdf_spin_unlock_bh(&rx_tid->tid_lock); } +fail: + if (peer) + dp_peer_unref_delete(peer); + + return status; } diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index ed1fb94911..16e3f2e1d4 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -193,14 +193,15 @@ void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc, /** * dp_set_vlan_groupkey: set vlan map for vdev - * @vdev_handle: pointer to vdev - * @vlan_id: vlan_id + * @cdp_soc: soc handle + * @vdev_id: vdev_id + * @vlan_id: vlan_id of peer * @group_key: group key for vlan * * return: set success/failure */ static inline -QDF_STATUS dp_set_vlan_groupkey(struct cdp_vdev *vdev_handle, +QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id, uint16_t vlan_id, uint16_t group_key) { return QDF_STATUS_SUCCESS; @@ -231,7 +232,7 @@ void dp_peer_multipass_list_remove(struct dp_peer *peer) void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc, struct cdp_vdev *vdev_handle, uint8_t *peer_mac, uint16_t vlan_id); -QDF_STATUS dp_set_vlan_groupkey(struct cdp_vdev *vdev_handle, +QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id, uint16_t vlan_id, uint16_t group_key); void dp_peer_multipass_list_init(struct dp_vdev *vdev); void dp_peer_multipass_list_remove(struct dp_peer *peer); diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 8a720f4bdc..b448ab62e7 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -342,7 +342,7 @@ dp_get_vdev_from_peer(struct dp_soc *soc, FL("PeerID %d not found use vdevID %d"), peer_id, vdev_id); vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, - vdev_id); + vdev_id); } else { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, @@ -466,8 +466,8 @@ dp_rx_intrabss_fwd(struct dp_soc *soc, } } - if (!dp_tx_send(dp_vdev_to_cdp_vdev(ta_peer->vdev), - nbuf)) { + if (!dp_tx_send((struct cdp_soc_t *)soc, + ta_peer->vdev->vdev_id, nbuf)) { DP_STATS_INC_PKT(ta_peer, rx.intra_bss.pkts, 1, len); return true; @@ -501,7 +501,8 @@ dp_rx_intrabss_fwd(struct dp_soc *soc, /* Set cb->ftype to intrabss FWD */ qdf_nbuf_set_tx_ftype(nbuf_copy, CB_FTYPE_INTRABSS_FWD); - if (dp_tx_send(dp_vdev_to_cdp_vdev(ta_peer->vdev), nbuf_copy)) { + if (dp_tx_send((struct cdp_soc_t *)soc, + ta_peer->vdev->vdev_id, nbuf_copy)) { DP_STATS_INC_PKT(ta_peer, rx.intra_bss.fail, 1, len); tid_stats->fail_cnt[INTRABSS_DROP]++; qdf_nbuf_free(nbuf_copy); diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 3f7d61188f..03739c811c 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -2158,7 +2158,8 @@ fail: /** * dp_tx_send_mesh() - Transmit mesh frame on a given VAP - * @vap_dev: DP vdev handle + * @soc: DP soc handle + * @vdev_id: DP vdev handle * @nbuf: skb * * Entry point for Core Tx layer (DP_TX) invoked from @@ -2168,12 +2169,13 @@ fail: * nbuf when it fails to send */ #ifdef MESH_MODE_SUPPORT -qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf) +qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc, uint8_t vdev_id, + qdf_nbuf_t nbuf) { struct meta_hdr_s *mhdr; qdf_nbuf_t nbuf_mesh = NULL; qdf_nbuf_t nbuf_clone = NULL; - struct dp_vdev *vdev = (struct dp_vdev *) vap_dev; + struct dp_vdev *vdev; uint8_t no_enc_frame = 0; nbuf_mesh = qdf_nbuf_unshare(nbuf); @@ -2182,6 +2184,15 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf) "qdf_nbuf_unshare failed"); return nbuf; } + + vdev = dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, + vdev_id); + if (!vdev) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "vdev is NULL for vdev_id %d", vdev_id); + return nbuf; + } + nbuf = nbuf_mesh; mhdr = (struct meta_hdr_s *)qdf_nbuf_data(nbuf); @@ -2205,7 +2216,7 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf) } if (nbuf_clone) { - if (!dp_tx_send(vap_dev, nbuf_clone)) { + if (!dp_tx_send(soc, vdev_id, nbuf_clone)) { DP_STATS_INC(vdev, tx_i.mesh.exception_fw, 1); } else { qdf_nbuf_free(nbuf_clone); @@ -2217,7 +2228,7 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf) else qdf_nbuf_set_tx_ftype(nbuf, CB_FTYPE_INVALID); - nbuf = dp_tx_send(vap_dev, nbuf); + nbuf = dp_tx_send(soc, vdev_id, nbuf); if ((!nbuf) && no_enc_frame) { DP_STATS_INC(vdev, tx_i.mesh.exception_fw, 1); } @@ -2227,16 +2238,18 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf) #else -qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf) +qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc, uint8_t vdev_id, + qdf_nbuf_t nbuf) { - return dp_tx_send(vap_dev, nbuf); + return dp_tx_send(soc, vdev_id, nbuf); } #endif /** * dp_tx_send() - Transmit a frame on a given VAP - * @vap_dev: DP vdev handle + * @soc: DP soc handle + * @vdev_id: id of DP vdev handle * @nbuf: skb * * Entry point for Core Tx layer (DP_TX) invoked from @@ -2246,14 +2259,19 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf) * Return: NULL on success, * nbuf when it fails to send */ -qdf_nbuf_t dp_tx_send(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf) +qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_t nbuf) { qdf_ether_header_t *eh = NULL; struct dp_tx_msdu_info_s msdu_info; struct dp_tx_seg_info_s seg_info; - struct dp_vdev *vdev = (struct dp_vdev *) vap_dev; uint16_t peer_id = HTT_INVALID_PEER; qdf_nbuf_t nbuf_mesh = NULL; + struct dp_vdev *vdev = + dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, + vdev_id); + + if (qdf_unlikely(!vdev)) + return nbuf; qdf_mem_zero(&msdu_info, sizeof(msdu_info)); qdf_mem_zero(&seg_info, sizeof(seg_info)); @@ -3691,7 +3709,7 @@ qdf_nbuf_t dp_tx_non_std(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, if (tx_spec & OL_TX_SPEC_NO_FREE) vdev->is_tdls_frame = true; - return dp_tx_send(dp_vdev_to_cdp_vdev(vdev), msdu_list); + return dp_tx_send(soc_hdl, vdev_id, msdu_list); } #endif @@ -4099,7 +4117,7 @@ QDF_STATUS dp_tso_detach_wifi3(void *txrx_soc) } #endif -QDF_STATUS dp_tso_soc_detach(void *txrx_soc) +QDF_STATUS dp_tso_soc_detach(struct cdp_soc_t *txrx_soc) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; uint8_t i; @@ -4133,7 +4151,7 @@ QDF_STATUS dp_tso_soc_detach(void *txrx_soc) * Return: QDF_STATUS_E_FAILURE on failure or * QDF_STATUS_SUCCESS on success */ -QDF_STATUS dp_tso_soc_attach(void *txrx_soc) +QDF_STATUS dp_tso_soc_attach(struct cdp_soc_t *txrx_soc) { struct dp_soc *soc = (struct dp_soc *)txrx_soc; uint8_t i; diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index b58ac82388..ec1498b223 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -169,7 +169,7 @@ QDF_STATUS dp_tx_soc_detach(struct dp_soc *soc); * Return: QDF_STATUS_E_FAILURE on failure or * QDF_STATUS_SUCCESS on success */ -QDF_STATUS dp_tso_soc_attach(void *txrx_soc); +QDF_STATUS dp_tso_soc_attach(struct cdp_soc_t *txrx_soc); /** * dp_tso_detach() - TSO Detach handler @@ -180,15 +180,16 @@ QDF_STATUS dp_tso_soc_attach(void *txrx_soc); * Return: QDF_STATUS_E_FAILURE on failure or * QDF_STATUS_SUCCESS on success */ -QDF_STATUS dp_tso_soc_detach(void *txrx_soc); +QDF_STATUS dp_tso_soc_detach(struct cdp_soc_t *txrx_soc); QDF_STATUS dp_tx_pdev_detach(struct dp_pdev *pdev); QDF_STATUS dp_tx_pdev_attach(struct dp_pdev *pdev); -qdf_nbuf_t dp_tx_send(struct cdp_vdev *data_vdev, qdf_nbuf_t nbuf); +qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_t nbuf); qdf_nbuf_t dp_tx_send_exception(struct cdp_vdev *data_vdev, qdf_nbuf_t nbuf, struct cdp_tx_exception_metadata *tx_exc); -qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *data_vdev, qdf_nbuf_t nbuf); +qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc, uint8_t vdev_id, + qdf_nbuf_t nbuf); qdf_nbuf_t dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf, struct dp_tx_msdu_info_s *msdu_info, uint16_t peer_id,