qcacmn: cmn_ops changes in datapath for umac-dp decoupling
Change cmn_ops APIs to replace pdev, vdev and peer dp handles with pdev_id, vdev_id and peer mac address along with dp soc handle Change-Id: I5716a87cad56b1dfe8dd56f193bbb6ff923a6af1
This commit is contained in:
파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
Load Diff
@@ -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)
|
||||
|
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -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)
|
||||
|
@@ -67,15 +67,16 @@ 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,
|
||||
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)
|
||||
@@ -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);
|
||||
|
||||
void (*txrx_peer_setup)
|
||||
(struct cdp_vdev *vdev_hdl, void *peer_hdl);
|
||||
|
||||
void (*txrx_cp_peer_del_response)
|
||||
(ol_txrx_soc_handle soc, struct cdp_vdev *vdev_hdl,
|
||||
(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_setup)(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
||||
uint8_t *peer_mac);
|
||||
|
||||
QDF_STATUS
|
||||
(*txrx_cp_peer_del_response)
|
||||
(ol_txrx_soc_handle soc, uint8_t vdev_id,
|
||||
uint8_t *peer_mac_addr);
|
||||
|
||||
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,52 +190,68 @@ 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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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);
|
||||
@@ -241,16 +271,20 @@ struct cdp_cmn_ops {
|
||||
* Statistics and Debugging Interface (C Interface)
|
||||
********************************************************************/
|
||||
|
||||
int (*txrx_aggr_cfg)(struct cdp_vdev *vdev, int max_subfrms_ampdu,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
|
||||
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,
|
||||
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,
|
||||
|
||||
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,
|
||||
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,
|
||||
QDF_STATUS (*txrx_peer_flush_rate_stats)(struct cdp_soc_t *soc,
|
||||
uint8_t pdev_id,
|
||||
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_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
|
||||
};
|
||||
|
@@ -3957,7 +3957,9 @@ static void dp_htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
|
||||
* using just 8 bits
|
||||
*/
|
||||
if (peer) {
|
||||
status = dp_addba_requestprocess_wifi3(peer,
|
||||
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);
|
||||
|
||||
/*
|
||||
|
@@ -944,29 +944,43 @@ 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 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);
|
||||
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,
|
||||
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);
|
||||
extern 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);
|
||||
/*
|
||||
* 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 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,
|
||||
@@ -1003,8 +1017,9 @@ 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,
|
||||
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);
|
||||
|
@@ -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;
|
||||
}
|
||||
|
파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
Load Diff
@@ -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,
|
||||
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",
|
||||
"%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,7 +3024,8 @@ 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_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,
|
||||
@@ -2939,6 +3033,11 @@ dp_set_pn_check_wifi3(struct cdp_vdev *vdev_handle, struct cdp_peer *peer_handle
|
||||
}
|
||||
qdf_spin_unlock_bh(&rx_tid->tid_lock);
|
||||
}
|
||||
fail:
|
||||
if (peer)
|
||||
dp_peer_unref_delete(peer);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user