qcacld-3.0: Implement DP component per packet TX/RX support

Implement per packet TX/RX support in DP componentization model.
This change will help to process per packet TX/RX path in STA interface.

Change-Id: I3fbd8dbe26ccd24fc50c6e67cd1213c72837cf9b
CRs-Fixed: 3173449
This commit is contained in:
Karthik Kantamneni
2022-03-23 09:35:49 +05:30
committed by Madan Koyyalamudi
parent b5d890bd89
commit 5dc87dece5
9 changed files with 4099 additions and 37 deletions

View File

@@ -134,6 +134,31 @@ struct wlan_dp_intf*
dp_get_intf_by_macaddr(struct wlan_dp_psoc_context *dp_ctx, dp_get_intf_by_macaddr(struct wlan_dp_psoc_context *dp_ctx,
struct qdf_mac_addr *addr); struct qdf_mac_addr *addr);
/* MAX iteration count to wait for dp packet process to complete */
#define DP_TASK_MAX_WAIT_CNT 100
/* Milli seconds to wait when packet is getting processed */
#define DP_TASK_WAIT_TIME 200
#define DP_TX_FN_CLR (1 << 0)
#define DP_TX_SAP_STOP (1 << 1)
#define DP_TX_DFS_CAC_BLOCK (1 << 2)
#define WLAN_DP_SUSPEND (1 << 3)
/**
* dp_wait_complete_tasks: Wait for DP tasks to complete
* @dp_ctx: DP context pointer
*
* This function waits for dp tasks like TX to be completed
*
* Return: None
*/
void dp_wait_complete_tasks(struct wlan_dp_psoc_context *dp_ctx);
#define NUM_RX_QUEUES 5
#define dp_enter() QDF_TRACE_ENTER(QDF_MODULE_ID_DP, "enter")
#define dp_exit() QDF_TRACE_EXIT(QDF_MODULE_ID_DP, "exit")
/** /**
* dp_peer_obj_create_notification(): dp peer create handler * dp_peer_obj_create_notification(): dp peer create handler
* @peer: peer which is going to created by objmgr * @peer: peer which is going to created by objmgr
@@ -332,10 +357,12 @@ dp_del_latency_critical_client(struct wlan_objmgr_vdev *vdev,
} }
/** /**
* is_dp_intf_valid() - Check if interface is valid * is_dp_intf_valid() - to check DP interface valid
* @dp_intf: DP interface * @dp_intf: DP interface pointer
* *
* Return: 0 if interface is valid, else error code * API to check whether DP interface is valid
*
* Return: non zero value on interface valid
*/ */
int is_dp_intf_valid(struct wlan_dp_intf *dp_intf); int is_dp_intf_valid(struct wlan_dp_intf *dp_intf);
@@ -551,4 +578,22 @@ void dp_trace_init(struct wlan_objmgr_psoc *psoc);
* Return: None * Return: None
*/ */
void dp_set_dump_dp_trace(uint16_t cmd_type, uint16_t count); void dp_set_dump_dp_trace(uint16_t cmd_type, uint16_t count);
#ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH
#define DP_BUS_BW_CFG(bus_bw_cfg) bus_bw_cfg
#define DP_BUS_BW_GET_RX_LVL(dp_ctx) (dp_ctx)->cur_rx_level
static inline bool
dp_is_low_tput_gro_enable(struct wlan_dp_psoc_context *dp_ctx)
{
return (qdf_atomic_read(&dp_ctx->low_tput_gro_enable)) ? true : false;
}
#else
#define DP_BUS_BW_CFG(bus_bw_cfg) 0
#define DP_BUS_BW_GET_RX_LVL(dp_ctx) 0
static inline bool
dp_is_low_tput_gro_enable(struct wlan_dp_psoc_context *dp_ctx)
{
return false;
}
#endif
#endif #endif

View File

@@ -30,10 +30,13 @@
#include "wlan_dp_cfg.h" #include "wlan_dp_cfg.h"
#include "wlan_dp_objmgr.h" #include "wlan_dp_objmgr.h"
#include <cdp_txrx_misc.h> #include <cdp_txrx_misc.h>
#include <dp_rx_thread.h>
#include "qdf_periodic_work.h" #include "qdf_periodic_work.h"
#include <cds_api.h> #include <cds_api.h>
#include "pld_common.h" #include "pld_common.h"
#include "wlan_dp_nud_tracking.h" #include "wlan_dp_nud_tracking.h"
#include <i_qdf_net_stats.h>
#include <qdf_types.h>
#ifndef NUM_TX_RX_HISTOGRAM #ifndef NUM_TX_RX_HISTOGRAM
#define NUM_TX_RX_HISTOGRAM 128 #define NUM_TX_RX_HISTOGRAM 128
@@ -143,6 +146,9 @@ struct wlan_dp_psoc_cfg {
uint32_t fisa_enable; uint32_t fisa_enable;
int icmp_req_to_fw_mark_interval; int icmp_req_to_fw_mark_interval;
bool lro_enable;
bool gro_enable;
}; };
/** /**
@@ -188,6 +194,60 @@ struct dp_stats {
struct dp_dns_stats dns_stats; struct dp_dns_stats dns_stats;
struct dp_tcp_stats tcp_stats; struct dp_tcp_stats tcp_stats;
struct dp_icmpv4_stats icmpv4_stats; struct dp_icmpv4_stats icmpv4_stats;
struct dp_dhcp_stats dhcp_stats;
struct dp_eapol_stats eapol_stats;
};
/**
* struct dhcp_phase - Per Peer DHCP Phases
* @DHCP_PHASE_ACK: upon receiving DHCP_ACK/NAK message in REQUEST phase or
* DHCP_DELINE message in OFFER phase
* @DHCP_PHASE_DISCOVER: upon receiving DHCP_DISCOVER message in ACK phase
* @DHCP_PHASE_OFFER: upon receiving DHCP_OFFER message in DISCOVER phase
* @DHCP_PHASE_REQUEST: upon receiving DHCP_REQUEST message in OFFER phase or
* ACK phase (Renewal process)
*/
enum dhcp_phase {
DHCP_PHASE_ACK,
DHCP_PHASE_DISCOVER,
DHCP_PHASE_OFFER,
DHCP_PHASE_REQUEST
};
/**
* struct dhcp_nego_status - Per Peer DHCP Negotiation Status
* @DHCP_NEGO_STOP: when the peer is in ACK phase or client disassociated
* @DHCP_NEGO_IN_PROGRESS: when the peer is in DISCOVER or REQUEST
* (Renewal process) phase
*/
enum dhcp_nego_status {
DHCP_NEGO_STOP,
DHCP_NEGO_IN_PROGRESS
};
/**
* Pending frame type of EAP_FAILURE, bit number used in "pending_eap_frm_type"
* of sta_info.
*/
#define DP_PENDING_TYPE_EAP_FAILURE 0
enum bss_intf_state {
BSS_INTF_STOP,
BSS_INTF_START,
};
struct wlan_dp_sta_info {
struct qdf_mac_addr sta_mac;
unsigned long pending_eap_frm_type;
enum dhcp_phase dhcp_phase;
enum dhcp_nego_status dhcp_nego_status;
};
struct wlan_dp_conn_info {
struct qdf_mac_addr bssid;
struct qdf_mac_addr peer_macaddr;
uint8_t proxy_arp_service;
uint8_t is_authenticated;
}; };
/** /**
@@ -197,11 +257,20 @@ struct dp_stats {
* @device_mode: Device Mode * @device_mode: Device Mode
* @intf_id: Interface ID * @intf_id: Interface ID
* @node: list node for membership in the interface list * @node: list node for membership in the interface list
* @tx_rx_disallow_mask: TX/RX disallow mask
* @vdev: object manager vdev context * @vdev: object manager vdev context
* @dev: netdev reference * @dev: netdev reference
* @stats: Netdev stats * @stats: Netdev stats
* @mic_work: Work to handle MIC error * @mic_work: Work to handle MIC error
* @num_active_task: Active task count
* @sap_tx_block_mask: SAP TX block mask
* @gro_disallowed: GRO disallowed flag
* @gro_flushed: GRO flushed flag
* @runtime_disable_rx_thread: Runtime Rx thread flag
* @rx_stack: function pointer Rx packet handover
* @tx_fn: function pointer to send Tx packet
* @conn_info: STA connection information
* @bss_state: AP BSS state
* @qdf_sta_eap_frm_done_event: EAP frame event management
*/ */
struct wlan_dp_intf { struct wlan_dp_intf {
struct wlan_dp_psoc_context *dp_ctx; struct wlan_dp_psoc_context *dp_ctx;
@@ -214,7 +283,6 @@ struct wlan_dp_intf {
qdf_list_node_t node; qdf_list_node_t node;
uint32_t tx_rx_disallow_mask;
struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_vdev *vdev;
qdf_netdev_t dev; qdf_netdev_t dev;
/**Device TX/RX statistics*/ /**Device TX/RX statistics*/
@@ -229,7 +297,6 @@ struct wlan_dp_intf {
qdf_net_dev_stats stats; qdf_net_dev_stats stats;
bool con_status; bool con_status;
bool dad; bool dad;
uint8_t active_ac;
uint32_t pkt_type_bitmap; uint32_t pkt_type_bitmap;
uint32_t track_arp_ip; uint32_t track_arp_ip;
uint8_t dns_payload[256]; uint8_t dns_payload[256];
@@ -244,14 +311,33 @@ struct wlan_dp_intf {
uint64_t prev_fwd_tx_packets; uint64_t prev_fwd_tx_packets;
uint64_t prev_fwd_rx_packets; uint64_t prev_fwd_rx_packets;
#endif /*WLAN_FEATURE_DP_BUS_BANDWIDTH*/ #endif /*WLAN_FEATURE_DP_BUS_BANDWIDTH*/
#ifdef WLAN_FEATURE_MSCS
unsigned long mscs_prev_tx_vo_pkts;
uint32_t mscs_counter;
#endif /* WLAN_FEATURE_MSCS */
struct dp_mic_work mic_work; struct dp_mic_work mic_work;
#ifdef WLAN_NUD_TRACKING #ifdef WLAN_NUD_TRACKING
struct dp_nud_tracking_info nud_tracking; struct dp_nud_tracking_info nud_tracking;
#endif #endif
qdf_atomic_t num_active_task;
uint32_t sap_tx_block_mask;
uint8_t gro_disallowed[DP_MAX_RX_THREADS];
uint8_t gro_flushed[DP_MAX_RX_THREADS];
bool runtime_disable_rx_thread;
ol_txrx_rx_fp rx_stack;
ol_txrx_tx_fp tx_fn;
struct wlan_dp_conn_info conn_info;
enum bss_intf_state bss_state;
qdf_event_t qdf_sta_eap_frm_done_event;
};
/**
* enum RX_OFFLOAD - Receive offload modes
* @CFG_LRO_ENABLED: Large Rx offload
* @CFG_GRO_ENABLED: Generic Rx Offload
*/
enum RX_OFFLOAD {
CFG_LRO_ENABLED = 1,
CFG_GRO_ENABLED,
}; };
/** /**
@@ -296,9 +382,7 @@ struct wlan_dp_psoc_context {
/* For Rx thread non GRO/LRO packet accounting */ /* For Rx thread non GRO/LRO packet accounting */
uint64_t no_rx_offload_pkt_cnt; uint64_t no_rx_offload_pkt_cnt;
uint64_t no_tx_offload_pkt_cnt; uint64_t no_tx_offload_pkt_cnt;
#ifdef QCA_CONFIG_SMP
bool is_ol_rx_thread_suspended;
#endif
bool wlan_suspended; bool wlan_suspended;
/* Flag keeps track of wiphy suspend/resume */ /* Flag keeps track of wiphy suspend/resume */
bool is_wiphy_suspended; bool is_wiphy_suspended;
@@ -329,10 +413,6 @@ struct wlan_dp_psoc_context {
qdf_atomic_t disable_rx_ol_in_concurrency; qdf_atomic_t disable_rx_ol_in_concurrency;
/* disable RX offload (GRO/LRO) in low throughput scenarios */ /* disable RX offload (GRO/LRO) in low throughput scenarios */
qdf_atomic_t disable_rx_ol_in_low_tput; qdf_atomic_t disable_rx_ol_in_low_tput;
#ifdef WLAN_NS_OFFLOAD
/* IPv6 notifier callback for handling NS offload on change in IP */
struct notifier_block ipv6_notifier;
#endif
uint16_t txrx_hist_idx; uint16_t txrx_hist_idx;
struct tx_rx_histogram *txrx_hist; struct tx_rx_histogram *txrx_hist;
@@ -341,5 +421,23 @@ struct wlan_dp_psoc_context {
#ifdef FEATURE_BUS_BANDWIDTH_MGR #ifdef FEATURE_BUS_BANDWIDTH_MGR
struct bbm_context *bbm_ctx; struct bbm_context *bbm_ctx;
#endif #endif
QDF_STATUS(*receive_offload_cb)(struct wlan_dp_intf *, qdf_nbuf_t nbuf);
struct {
qdf_atomic_t rx_aggregation;
uint8_t gro_force_flush[DP_MAX_RX_THREADS];
bool force_gro_enable;
}
dp_agg_param;
qdf_atomic_t rx_skip_qdisc_chk_conc;
uint32_t arp_connectivity_map;
qdf_wake_lock_t rx_wake_lock;
enum RX_OFFLOAD ol_enable;
}; };
#endif /* end of _WLAN_DP_PRIV_STRUCT_H_ */ #endif /* end of _WLAN_DP_PRIV_STRUCT_H_ */

View File

@@ -19,9 +19,131 @@
#ifndef __WLAN_DP_TXRX_H__ #ifndef __WLAN_DP_TXRX_H__
#define __WLAN_DP_TXRX_H__ #define __WLAN_DP_TXRX_H__
#include <wlan_dp_priv.h> #include <cds_api.h>
#include <wlan_dp_main.h> #include <qdf_tracepoint.h>
#include <qdf_types.h> #include <qdf_pkt_add_timestamp.h>
#include <enet.h>
#include <qdf_tracepoint.h>
/** DP Tx Time out value */
#define DP_TX_TIMEOUT qdf_system_msecs_to_ticks(5000)
#define DP_TX_STALL_THRESHOLD 4
#ifdef FEATURE_WLAN_WAPI
#define IS_DP_ETHERTYPE_WAI(_nbuf) (qdf_ntohs(qdf_nbuf_get_protocol(_nbuf)) == \
ETHERTYPE_WAI)
#else
#define IS_DP_ETHERTYPE_WAI(_nbuf) (false)
#endif
#ifdef CFG80211_CTRL_FRAME_SRC_ADDR_TA_ADDR
#define SEND_EAPOL_OVER_NL true
#else
#define SEND_EAPOL_OVER_NL false
#endif
#define DP_CONNECTIVITY_CHECK_SET_ARP 1
#define DP_CONNECTIVITY_CHECK_SET_DNS 2
#define DP_CONNECTIVITY_CHECK_SET_TCP_HANDSHAKE 3
#define DP_CONNECTIVITY_CHECK_SET_ICMPV4 4
#define DP_CONNECTIVITY_CHECK_SET_ICMPV6 5
#define DP_CONNECTIVITY_CHECK_SET_TCP_SYN 6
#define DP_CONNECTIVITY_CHECK_SET_TCP_SYN_ACK 7
#define DP_CONNECTIVITY_CHECK_SET_TCP_ACK 8
/**
* dp_reset_all_intfs_connectivity_stats() - reset connectivity stats
* @dp_ctx: pointer to DP Context
*
* Return: None
*/
void dp_reset_all_intfs_connectivity_stats(struct wlan_dp_psoc_context *dp_ctx);
/**
* dp_softap_check_wait_for_tx_eap_pkt() - Check and wait for eap failure
* pkt completion event
* @dp_intf: pointer to DP interface
* @mac_addr: mac address of peer
*
* Check and wait for eap failure pkt tx completion.
*
* Return: void
*/
void dp_softap_check_wait_for_tx_eap_pkt(struct wlan_dp_intf *dp_intf,
struct qdf_mac_addr *mac_addr);
#ifdef SAP_DHCP_FW_IND
/**
* dp_post_dhcp_ind() - Send DHCP START/STOP indication to FW
* @dp_intf: pointer to dp interface
* @mac_addr: mac address
* @type: WMA message type
*
* Return: error number
*/
int dp_post_dhcp_ind(struct wlan_dp_intf *dp_intf,
uint8_t *mac_addr, bool dhcp_start);
/**
* dp_softap_inspect_dhcp_packet() - Inspect DHCP packet
* @dp_intf: pointer to dp interface
* @skb: pointer to OS packet (sk_buff)
* @dir: direction
*
* Inspect the Tx/Rx frame, and send DHCP START/STOP notification to the FW
* through WMI message, during DHCP based IP address acquisition phase.
*
* - Send DHCP_START notification to FW when SAP gets DHCP Discovery
* - Send DHCP_STOP notification to FW when SAP sends DHCP ACK/NAK
*
* DHCP subtypes are determined by a status octet in the DHCP Message type
* option (option code 53 (0x35)).
*
* Each peer will be in one of 4 DHCP phases, starts from QDF_DHCP_PHASE_ACK,
* and transitioned per DHCP message type as it arrives.
*
* - QDF_DHCP_PHASE_DISCOVER: upon receiving DHCP_DISCOVER message in ACK phase
* - QDF_DHCP_PHASE_OFFER: upon receiving DHCP_OFFER message in DISCOVER phase
* - QDF_DHCP_PHASE_REQUEST: upon receiving DHCP_REQUEST message in OFFER phase
* or ACK phase (Renewal process)
* - QDF_DHCP_PHASE_ACK : upon receiving DHCP_ACK/NAK message in REQUEST phase
* or DHCP_DELINE message in OFFER phase
*
* Return: error number
*/
int dp_softap_inspect_dhcp_packet(struct wlan_dp_intf *dp_intf,
qdf_nbuf_t nbuf,
enum qdf_proto_dir dir);
#else
static inline
int dp_post_dhcp_ind(struct wlan_dp_intf *dp_intf,
uint8_t *mac_addr, bool dhcp_start)
{
return 0;
}
static inline
int dp_softap_inspect_dhcp_packet(struct wlan_dp_intf *dp_intf,
qdf_nbuf_t nbuf,
enum qdf_proto_dir dir)
{
return 0;
}
#endif
/**
* dp_rx_flush_packet_cbk() - flush rx packet handler
* @dp_intf_context: pointer to DP interface context
* @vdev_id: vdev_id of the packets to be flushed
*
* Flush rx packet callback registered with data path. DP will call this to
* notify when packets for a particular vdev is to be flushed out.
*
* Return: QDF_STATUS_E_FAILURE if any errors encountered,
* QDF_STATUS_SUCCESS otherwise
*/
QDF_STATUS dp_rx_flush_packet_cbk(void *dp_intf_ctx, uint8_t vdev_id);
/** /**
* dp_softap_start_xmit() - Transmit a frame for SAP interface * dp_softap_start_xmit() - Transmit a frame for SAP interface
@@ -30,13 +152,24 @@
* *
* Return: QDF_STATUS_SUCCESS on successful transmission * Return: QDF_STATUS_SUCCESS on successful transmission
*/ */
QDF_STATUS QDF_STATUS dp_softap_start_xmit(qdf_nbuf_t nbuf, struct wlan_dp_intf *dp_intf);
dp_softap_start_xmit(qdf_nbuf_t nbuf, struct wlan_dp_intf *dp_intf);
/**
* dp_softap_tx_timeout() - TX timeout handler
* @dp_intf: pointer to DP interface
*
* Timeout API called for mode interfaces (SoftAP/P2P GO)
* when TX transmission takes too long.
* called by the OS_IF layer legacy driver.
*
* Return: None
*/
void dp_softap_tx_timeout(struct wlan_dp_intf *dp_intf);
/** /**
* dp_softap_rx_packet_cbk() - Receive packet handler for SAP * dp_softap_rx_packet_cbk() - Receive packet handler for SAP
* @dp_intf_context: pointer to DP interface context * @dp_intf_context: pointer to DP interface context
* @rxBuf: pointer to rx qdf_nbuf * @rx_buf: pointer to rx qdf_nbuf
* *
* Receive callback registered with data path. DP will call this to notify * Receive callback registered with data path. DP will call this to notify
* when one or more packets were received for a registered * when one or more packets were received for a registered
@@ -58,6 +191,16 @@ dp_softap_rx_packet_cbk(void *intf_ctx, qdf_nbuf_t rx_buf);
QDF_STATUS QDF_STATUS
dp_start_xmit(struct wlan_dp_intf *dp_intf, qdf_nbuf_t nbuf); dp_start_xmit(struct wlan_dp_intf *dp_intf, qdf_nbuf_t nbuf);
/**
* dp_tx_timeout() - DP Tx timeout API
* @dp_intf: Data path interface pointer
*
* Function called by OS_IF there is any timeout during transmission.
*
* Return: none
*/
void dp_tx_timeout(struct wlan_dp_intf *dp_intf);
/** /**
* dp_rx_packet_cbk() - Receive packet handler * dp_rx_packet_cbk() - Receive packet handler
* @dp_intf_context: pointer to DP interface context * @dp_intf_context: pointer to DP interface context
@@ -72,4 +215,414 @@ dp_start_xmit(struct wlan_dp_intf *dp_intf, qdf_nbuf_t nbuf);
*/ */
QDF_STATUS dp_rx_packet_cbk(void *dp_intf_context, qdf_nbuf_t rx_buf); QDF_STATUS dp_rx_packet_cbk(void *dp_intf_context, qdf_nbuf_t rx_buf);
#if defined(WLAN_SUPPORT_RX_FISA)
/**
* wlan_dp_rx_fisa_cbk() - Entry function to FISA to handle aggregation
* @soc: core txrx main context
* @vdev: Handle DP vdev
* @nbuf_list: List nbufs to be aggregated
*
* Return: Success on aggregation
*/
QDF_STATUS wlan_dp_rx_fisa_cbk(void *dp_soc, void *dp_vdev,
qdf_nbuf_t rxbuf_list);
/**
* wlan_dp_rx_fisa_flush_by_ctx_id() - Flush function to end of context
* flushing of aggregates
* @soc: core txrx main context
* @ring_num: REO number to flush the flow Rxed on the REO
*
* Return: Success on flushing the flows for the REO
*/
QDF_STATUS wlan_dp_rx_fisa_flush_by_ctx_id(void *dp_soc, int ring_num);
/**
* wlan_dp_rx_fisa_flush_by_vdev_id() - Flush fisa aggregates per vdev id
* @soc: core txrx main context
* @vdev_id: vdev ID
*
* Return: Success on flushing the flows for the vdev
*/
QDF_STATUS wlan_dp_rx_fisa_flush_by_vdev_id(void *dp_soc, uint8_t vdev_id);
#else
static inline QDF_STATUS wlan_dp_rx_fisa_flush_by_vdev_id(void *dp_soc,
uint8_t vdev_id)
{
return QDF_STATUS_SUCCESS;
}
#endif
/**
* dp_rx_deliver_to_stack() - DP helper function to deliver RX pkts to stack
* @dp_intf_context: pointer to DP interface context
* @nbuf: pointer to nbuf
*
* The function calls the appropriate stack function depending upon the packet
* type and whether GRO/LRO is enabled.
*
* Return: QDF_STATUS_E_FAILURE if any errors encountered,
* QDF_STATUS_SUCCESS otherwise
*/
QDF_STATUS wlan_dp_rx_deliver_to_stack(struct wlan_dp_intf *dp_intf,
qdf_nbuf_t nbuf);
/**
* dp_rx_thread_gro_flush_ind_cbk() - receive handler to flush GRO packets
* @dp_intf_context: pointer to DP interface context
* @rx_ctx_id: RX CTX Id for which flush should happen
*
* Receive callback registered with DP layer which flushes GRO packets
* for a given RX CTX ID (RX Thread)
*
* Return: QDF_STATUS_E_FAILURE if any errors encountered,
* QDF_STATUS_SUCCESS otherwise
*/
QDF_STATUS dp_rx_thread_gro_flush_ind_cbk(void *dp_intf_ctx, int rx_ctx_id);
/**
* dp_rx_pkt_thread_enqueue_cbk() - receive pkt handler to enqueue into thread
* @dp_intf_context: pointer to DP interface context
* @nbuf_list: pointer to qdf_nbuf list
*
* Receive callback registered with DP layer which enqueues packets into dp rx
* thread
*
* Return: QDF_STATUS_E_FAILURE if any errors encountered,
* QDF_STATUS_SUCCESS otherwise
*/
QDF_STATUS dp_rx_pkt_thread_enqueue_cbk(void *dp_intf_ctx,
qdf_nbuf_t nbuf_list);
/**
* dp_disable_rx_ol_for_low_tput() - Disable Rx offload in low TPUT scenario
* @dp_ctx: dp context
* @disable: true/false to disable/enable the Rx offload
*
* Return: none
*/
void dp_disable_rx_ol_for_low_tput(struct wlan_dp_psoc_context *dp_ctx,
bool disable);
/**
* dp_tx_rx_collect_connectivity_stats_info() - collect connectivity stats
* @nbuf: pointer to n/w buffer
* @context: pointer to DP interface
* @action: action done on pkt.
* @pkt_type: data pkt type
*
* Return: None
*/
void
dp_tx_rx_collect_connectivity_stats_info(qdf_nbuf_t nbuf, void *context,
enum connectivity_stats_pkt_status action, uint8_t *pkt_type);
static inline void
dp_nbuf_fill_gso_size(qdf_netdev_t dev, qdf_nbuf_t nbuf)
{
unsigned long val;
if (qdf_nbuf_is_cloned(nbuf) && qdf_nbuf_is_nonlinear(nbuf) &&
qdf_nbuf_get_gso_size(nbuf) == 0 &&
qdf_nbuf_is_ipv4_tcp_pkt(nbuf)) {
val = dev->mtu - ((qdf_nbuf_transport_header(nbuf) -
qdf_nbuf_network_header(nbuf))
+ qdf_nbuf_get_tcp_hdr_len(nbuf));
qdf_nbuf_set_gso_size(nbuf, val);
}
}
#ifdef CONFIG_HL_SUPPORT
static inline QDF_STATUS
dp_nbuf_nontso_linearize(qdf_nbuf_t nbuf)
{
return QDF_STATUS_SUCCESS;
}
#else
static inline QDF_STATUS
dp_nbuf_nontso_linearize(qdf_nbuf_t nbuf)
{
if (qdf_nbuf_is_nonlinear(nbuf) && qdf_nbuf_is_tso(nbuf) == false) {
if (qdf_unlikely(qdf_nbuf_linearize(nbuf)))
return QDF_STATUS_E_NOMEM;
}
return QDF_STATUS_SUCCESS;
}
#endif
#ifdef FEATURE_WLAN_DIAG_SUPPORT
void dp_event_eapol_log(qdf_nbuf_t nbuf, enum qdf_proto_dir dir);
#else
static inline
void dp_event_eapol_log(qdf_nbuf_t nbuf, enum qdf_proto_dir dir)
{}
#endif
#ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL
static inline
qdf_nbuf_t dp_nbuf_orphan(struct wlan_dp_intf *dp_intf,
qdf_nbuf_t nbuf)
{
struct wlan_dp_psoc_context *dp_ctx = dp_intf->dp_ctx;
struct wlan_dp_psoc_callbacks *dp_ops = &dp_ctx->dp_ops;
unsigned int tx_flow_low_watermark;
int need_orphan = 0;
int cpu;
tx_flow_low_watermark =
dp_ops->dp_get_tx_flow_low_watermark(dp_ops->callback_ctx,
dp_intf->intf_id);
if (tx_flow_low_watermark > 0) {
#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 19, 0))
/*
* The TCP TX throttling logic is changed a little after
* 3.19-rc1 kernel, the TCP sending limit will be smaller,
* which will throttle the TCP packets to the host driver.
* The TCP UP LINK throughput will drop heavily. In order to
* fix this issue, need to orphan the socket buffer asap, which
* will call skb's destructor to notify the TCP stack that the
* SKB buffer is unowned. And then the TCP stack will pump more
* packets to host driver.
*
* The TX packets might be dropped for UDP case in the iperf
* testing. So need to be protected by follow control.
*/
need_orphan = 1;
#else
if (dp_ctx->dp_cfg.tx_orphan_enable)
need_orphan = 1;
#endif
} else if (dp_ctx->dp_cfg.tx_orphan_enable) {
if (qdf_nbuf_is_ipv4_tcp_pkt(nbuf) ||
qdf_nbuf_is_ipv6_tcp_pkt(nbuf))
need_orphan = 1;
}
if (need_orphan) {
qdf_nbuf_orphan(nbuf);
cpu = qdf_get_smp_processor_id();
++dp_intf->dp_stats.tx_rx_stats.per_cpu[cpu].tx_orphaned;
} else {
nbuf = __qdf_nbuf_unshare(nbuf);
}
return nbuf;
}
/**
* dp_get_tx_resource() - check tx resources and take action
* @dp_intf: DP interface
* @mac_addr: mac address
*
* Return: none
*/
void dp_get_tx_resource(struct wlan_dp_intf *dp_intf,
struct qdf_mac_addr *mac_addr);
#else
/**
* dp_nbuf_orphan() - skb_unshare a cloned packed else skb_orphan
* @dp_intf: pointer to DP interface
* @nbuf: pointer to nbuf data packet
*
* Return: pointer to nbuf structure
*/
static inline
qdf_nbuf_t dp_nbuf_orphan(struct wlan_dp_intf *dp_intf,
qdf_nbuf_t nbuf)
{
qdf_nbuf_t nskb;
#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 19, 0))
struct wlan_dp_psoc_context *dp_ctx = dp_intf->dp_ctx;
#endif
int cpu;
dp_nbuf_fill_gso_size(dp_intf->dev, nbuf);
nskb = __qdf_nbuf_unshare(nbuf);
#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 19, 0))
if (unlikely(dp_ctx->dp_cfg.tx_orphan_enable) && nskb == nbuf) {
/*
* For UDP packets we want to orphan the packet to allow the app
* to send more packets. The flow would ultimately be controlled
* by the limited number of tx descriptors for the vdev.
*/
cpu = qdf_get_smp_processor_id();
++dp_intf->dp_stats.tx_rx_stats.per_cpu[cpu].tx_orphaned;
qdf_nbuf_orphan(nbuf);
}
#endif
return nskb;
}
/**
* dp_get_tx_resource() - check tx resources and take action
* @dp_intf: DP interface
* @mac_addr: mac address
*
* Return: none
*/
static inline
void dp_get_tx_resource(struct wlan_dp_intf *dp_intf,
struct qdf_mac_addr *mac_addr)
{
}
#endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
/**
* dp_start_xmit() - Transmit a frame
* @dp_intf: pointer to DP interface
* @nbuf: n/w buffer
*
* Function called to Transmit a n/w buffer in STA mode.
*
* Return: Status of the transmission
*/
QDF_STATUS
dp_start_xmit(struct wlan_dp_intf *dp_intf, qdf_nbuf_t nbuf);
#ifdef FEATURE_MONITOR_MODE_SUPPORT
/**
* dp_mon_rx_packet_cbk() - Receive callback registered with OL layer.
* @context: pointer to qdf context
* @rx_buf: pointer to rx qdf_nbuf
*
* TL will call this to notify the HDD when one or more packets were
* received for a registered STA.
*
* Return: QDF_STATUS
*/
QDF_STATUS dp_mon_rx_packet_cbk(void *context, qdf_nbuf_t rxbuf);
/**
* dp_monitor_set_rx_monitor_cb(): Set rx monitor mode callback function
* @txrx: pointer to txrx ops
* @rx_monitor_cb: pointer to callback function
*
* Returns: None
*/
void dp_monitor_set_rx_monitor_cb(struct ol_txrx_ops *txrx,
ol_txrx_rx_mon_fp rx_monitor_cb);
/**
* dp_rx_monitor_callback(): Callback function for receive monitor mode
* @vdev: Handle to vdev object
* @mpdu: pointer to mpdu to be delivered to os
* @rx_status: receive status
*
* Returns: None
*/
void dp_rx_monitor_callback(ol_osif_vdev_handle vdev,
qdf_nbuf_t mpdu,
void *rx_status);
#else
static inline
QDF_STATUS dp_mon_rx_packet_cbk(void *context, qdf_nbuf_t rxbuf)
{
return QDF_STATUS_SUCCESS;
}
static inline
void dp_monitor_set_rx_monitor_cb(struct ol_txrx_ops *txrx,
ol_txrx_rx_mon_fp rx_monitor_cb) { }
static inline
void dp_rx_monitor_callback(ol_osif_vdev_handle vdev, qdf_nbuf_t mpdu,
void *rx_status) { }
#endif
/**
* dp_sta_notify_tx_comp_cb() - notify tx comp callback registered with dp
* @nbuf: pointer to nbuf
* @ctx: osif context
* @flag: tx status flag
*
* Return: None
*/
void dp_sta_notify_tx_comp_cb(qdf_nbuf_t nbuf, void *ctx, uint16_t flag);
/**
* dp_softap_notify_tx_comp_cb() - notify softap tx comp registered with dp
* @nbuf: pointer to nbuf
* @ctx: osif context
* @flag: tx status flag
*
* Return: None
*/
void dp_softap_notify_tx_compl_cbk(qdf_nbuf_t nbuf,
void *context, uint16_t flag);
/**
* dp_rx_pkt_tracepoints_enabled() - Get the state of rx pkt tracepoint
*
* Return: True if any rx pkt tracepoint is enabled else false
*/
static inline bool dp_rx_pkt_tracepoints_enabled(void)
{
return (qdf_trace_dp_rx_tcp_pkt_enabled() ||
qdf_trace_dp_rx_udp_pkt_enabled() ||
qdf_trace_dp_rx_pkt_enabled());
}
#ifdef CONFIG_DP_PKT_ADD_TIMESTAMP
/**
* dp_pkt_add_timestamp() - add timestamp in data payload
*
* @dp_intf - DP interface
* @index - timestamp index which decides offset in payload
* @time - time to update in payload
* @nbuf - Network socket buffer
*
* Return: none
*/
void wlan_dp_pkt_add_timestamp(struct wlan_dp_intf *dp_intf,
enum qdf_pkt_timestamp_index index,
qdf_nbuf_t nbuf);
#else
static inline
void wlan_dp_pkt_add_timestamp(struct wlan_dp_intf *dp_intf,
enum qdf_pkt_timestamp_index index,
qdf_nbuf_t nbuf)
{
}
#endif
#if defined(FEATURE_LRO)
/**
* dp_lro_set_reset() - API for Disable/Enable LRO
* @dp_intf: DP inerface pointer
* @enable_flag: enable or disable LRO.
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS dp_lro_set_reset(struct wlan_dp_intf *dp_intf, uint8_t enable_flag);
#else
static inline
QDF_STATUS dp_lro_set_reset(struct wlan_dp_intf *dp_intf,
uint8_t enable_flag)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif /* FEATURE_LRO */
#ifdef RECEIVE_OFFLOAD
/**
* dp_rx_ol_init() - Initialize Rx offload mode (LRO or GRO)
* @dp_ctx: pointer to DP Context
* @is_wifi3_0_target: true if it wifi3.0 target
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS dp_rx_ol_init(struct wlan_dp_psoc_context *dp_ctx,
bool is_wifi3_0_target);
#else /* RECEIVE_OFFLOAD */
static inline QDF_STATUS
dp_rx_ol_init(struct wlan_dp_psoc_context *dp_ctx,
bool is_wifi3_0_target)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif
#endif #endif

View File

@@ -38,6 +38,7 @@
#include "wlan_dp_periodic_sta_stats.h" #include "wlan_dp_periodic_sta_stats.h"
#include "wlan_mlme_ucfg_api.h" #include "wlan_mlme_ucfg_api.h"
#include <i_qdf_net_stats.h> #include <i_qdf_net_stats.h>
#include "wlan_dp_txrx.h"
#ifdef FEATURE_BUS_BANDWIDTH_MGR #ifdef FEATURE_BUS_BANDWIDTH_MGR
/** /**
@@ -1524,11 +1525,9 @@ static void dp_pld_request_bus_bandwidth(struct wlan_dp_psoc_context *dp_ctx,
rx_packets); rx_packets);
if (rx_packets < dp_ctx->dp_cfg.bus_bw_low_threshold) if (rx_packets < dp_ctx->dp_cfg.bus_bw_low_threshold)
dp_ops->dp_disable_rx_ol_for_low_tput(ctx, dp_disable_rx_ol_for_low_tput(dp_ctx, true);
true);
else else
dp_ops->dp_disable_rx_ol_for_low_tput(ctx, dp_disable_rx_ol_for_low_tput(dp_ctx, false);
false);
/* /*
* force disable pktlog and only re-enable based * force disable pktlog and only re-enable based

View File

@@ -31,6 +31,7 @@
#include <wlan_cm_ucfg_api.h> #include <wlan_cm_ucfg_api.h>
#include "wlan_dp_nud_tracking.h" #include "wlan_dp_nud_tracking.h"
#include "target_if_dp_comp.h" #include "target_if_dp_comp.h"
#include "wlan_dp_txrx.h"
/* Global DP context */ /* Global DP context */
static struct wlan_dp_psoc_context *gp_dp_ctx; static struct wlan_dp_psoc_context *gp_dp_ctx;
@@ -151,9 +152,58 @@ int is_dp_intf_valid(struct wlan_dp_intf *dp_intf)
dp_err("Interface is NULL"); dp_err("Interface is NULL");
return -EINVAL; return -EINVAL;
} }
if (!dp_intf->dev) {
dp_err("DP interface net_device is null");
return -EINVAL;
}
if (!(dp_intf->dev->flags & IFF_UP)) {
dp_info_rl("DP interface '%s' is not up",
dp_intf->dev->name);
return -EAGAIN;
}
return validate_interface_id(dp_intf->intf_id); return validate_interface_id(dp_intf->intf_id);
} }
static QDF_STATUS
dp_intf_wait_for_task_complete(struct wlan_dp_intf *dp_intf)
{
int count = DP_TASK_MAX_WAIT_CNT;
int r;
while (count) {
r = atomic_read(&dp_intf->num_active_task);
if (!r)
return QDF_STATUS_SUCCESS;
if (--count) {
dp_err_rl("Waiting for DP task to complete: %d", count);
qdf_sleep(DP_TASK_WAIT_TIME);
}
}
dp_err("Timed-out waiting for DP task completion");
return QDF_STATUS_E_TIMEOUT;
}
void dp_wait_complete_tasks(struct wlan_dp_psoc_context *dp_ctx)
{
struct wlan_dp_intf *dp_intf, *dp_intf_next = NULL;
dp_for_each_intf_held_safe(dp_ctx, dp_intf, dp_intf_next) {
/*
* If timeout happens for one interface better to bail out
* instead of waiting for other intefaces task completion
*/
if (qdf_atomic_read(&dp_intf->num_active_task))
if (dp_intf_wait_for_task_complete(dp_intf))
break;
}
}
#ifdef CONFIG_DP_TRACE #ifdef CONFIG_DP_TRACE
/** /**
* dp_convert_string_to_u8_array() - used to convert string into u8 array * dp_convert_string_to_u8_array() - used to convert string into u8 array
@@ -297,7 +347,7 @@ void dp_set_dump_dp_trace(uint16_t cmd_type, uint16_t count)
qdf_dp_trace_disable_live_mode(); qdf_dp_trace_disable_live_mode();
} }
#else #else
static void dp_trace_init(struct wlan_dp_psoc_cfg *config) void dp_trace_init(struct wlan_objmgr_psoc *psoc)
{ {
} }
@@ -820,6 +870,7 @@ dp_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev, void *arg)
struct wlan_dp_intf *dp_intf; struct wlan_dp_intf *dp_intf;
QDF_STATUS status = QDF_STATUS_SUCCESS; QDF_STATUS status = QDF_STATUS_SUCCESS;
struct qdf_mac_addr *mac_addr; struct qdf_mac_addr *mac_addr;
struct qdf_mac_addr intf_mac;
dp_info("DP VDEV OBJ create notification"); dp_info("DP VDEV OBJ create notification");
@@ -832,6 +883,14 @@ dp_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev, void *arg)
dp_ctx = dp_psoc_get_priv(psoc); dp_ctx = dp_psoc_get_priv(psoc);
mac_addr = (struct qdf_mac_addr *)wlan_vdev_mlme_get_macaddr(vdev); mac_addr = (struct qdf_mac_addr *)wlan_vdev_mlme_get_macaddr(vdev);
status = dp_ctx->dp_ops.dp_get_nw_intf_mac_by_vdev_mac(mac_addr,
&intf_mac);
if (QDF_IS_STATUS_ERROR(status)) {
dp_err("Failed to get intf mac:" QDF_MAC_ADDR_FMT,
QDF_MAC_ADDR_REF(mac_addr));
return QDF_STATUS_E_INVAL;
}
dp_intf = dp_get_intf_by_macaddr(dp_ctx, mac_addr); dp_intf = dp_get_intf_by_macaddr(dp_ctx, mac_addr);
if (!dp_intf) { if (!dp_intf) {
dp_err("Failed to get dp intf mac:" QDF_MAC_ADDR_FMT, dp_err("Failed to get dp intf mac:" QDF_MAC_ADDR_FMT,
@@ -842,6 +901,18 @@ dp_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev, void *arg)
dp_intf->device_mode = wlan_vdev_mlme_get_opmode(vdev); dp_intf->device_mode = wlan_vdev_mlme_get_opmode(vdev);
dp_intf->intf_id = vdev->vdev_objmgr.vdev_id; dp_intf->intf_id = vdev->vdev_objmgr.vdev_id;
dp_intf->vdev = vdev; dp_intf->vdev = vdev;
qdf_atomic_init(&dp_intf->num_active_task);
if (dp_intf->device_mode == QDF_SAP_MODE ||
dp_intf->device_mode == QDF_P2P_GO_MODE) {
dp_intf->sap_tx_block_mask = DP_TX_FN_CLR | DP_TX_SAP_STOP;
status = qdf_event_create(&dp_intf->qdf_sta_eap_frm_done_event);
if (!QDF_IS_STATUS_SUCCESS(status)) {
dp_err("eap frm done event init failed!!");
return status;
}
}
status = wlan_objmgr_vdev_component_obj_attach(vdev, status = wlan_objmgr_vdev_component_obj_attach(vdev,
WLAN_COMP_DP, WLAN_COMP_DP,
@@ -878,6 +949,21 @@ dp_vdev_obj_destroy_notification(struct wlan_objmgr_vdev *vdev, void *arg)
dp_nud_flush_work(dp_intf); dp_nud_flush_work(dp_intf);
dp_mic_flush_work(dp_intf); dp_mic_flush_work(dp_intf);
status = dp_intf_wait_for_task_complete(dp_intf);
if (QDF_IS_STATUS_ERROR(status))
return status;
if (dp_intf->device_mode == QDF_SAP_MODE ||
dp_intf->device_mode == QDF_P2P_GO_MODE) {
status = qdf_event_destroy(&dp_intf->qdf_sta_eap_frm_done_event);
if (!QDF_IS_STATUS_SUCCESS(status)) {
dp_err("eap frm done event destroy failed!!");
return status;
}
}
qdf_mem_zero(&dp_intf->conn_info, sizeof(struct wlan_dp_conn_info));
dp_intf->intf_id = WLAN_UMAC_VDEV_ID_MAX;
dp_intf->vdev = NULL;
status = wlan_objmgr_vdev_component_obj_detach(vdev, status = wlan_objmgr_vdev_component_obj_detach(vdev,
WLAN_COMP_DP, WLAN_COMP_DP,
(void *)dp_intf); (void *)dp_intf);
@@ -995,6 +1081,8 @@ dp_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc, void *arg)
return status; return status;
} }
dp_reset_all_intfs_connectivity_stats(dp_ctx);
return status; return status;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -32,6 +32,66 @@
#include <ani_system_defs.h> #include <ani_system_defs.h>
#include "cdp_txrx_ops.h" #include "cdp_txrx_ops.h"
#include <qdf_defer.h> #include <qdf_defer.h>
#include <qdf_types.h>
#define DP_MAX_SUBTYPES_TRACKED 4
enum dp_rx_offld_flush_cb {
DP_RX_FLUSH_LRO,
DP_RX_FLUSH_THREAD,
DP_RX_FLUSH_NAPI,
};
enum dp_nbuf_push_type {
DP_NBUF_PUSH_NI,
DP_NBUF_PUSH_NAPI,
DP_NBUF_PUSH_BH_DISABLE,
DP_NBUF_PUSH_SIMPLE,
};
/**
* struct dp_eapol_stats - eapol debug stats count
* @eapol_m1_count: eapol m1 count
* @eapol_m2_count: eapol m2 count
* @eapol_m3_count: eapol m3 count
* @eapol_m4_count: eapol m4 count
* @tx_dropped: no of tx frames dropped by host
* @tx_noack_cnt: no of frames for which there is no ack
* @rx_delivered: no. of frames delivered to network stack
* @rx_refused: no of frames not delivered to network stack
*/
struct dp_eapol_stats {
uint16_t eapol_m1_count;
uint16_t eapol_m2_count;
uint16_t eapol_m3_count;
uint16_t eapol_m4_count;
uint16_t tx_dropped[DP_MAX_SUBTYPES_TRACKED];
uint16_t tx_noack_cnt[DP_MAX_SUBTYPES_TRACKED];
uint16_t rx_delivered[DP_MAX_SUBTYPES_TRACKED];
uint16_t rx_refused[DP_MAX_SUBTYPES_TRACKED];
};
/**
* struct dp_dhcp_stats - dhcp debug stats count
* @dhcp_dis_count: dhcp discovery count
* @dhcp_off_count: dhcp offer count
* @dhcp_req_count: dhcp request count
* @dhcp_ack_count: dhcp ack count
* @tx_dropped: no of tx frames dropped by host
* @tx_noack_cnt: no of frames for which there is no ack
* @rx_delivered: no. of frames delivered to network stack
* @rx_refused: no of frames not delivered to network stack
*/
struct dp_dhcp_stats {
uint16_t dhcp_dis_count;
uint16_t dhcp_off_count;
uint16_t dhcp_req_count;
uint16_t dhcp_ack_count;
uint16_t tx_dropped[DP_MAX_SUBTYPES_TRACKED];
uint16_t tx_noack_cnt[DP_MAX_SUBTYPES_TRACKED];
uint16_t rx_delivered[DP_MAX_SUBTYPES_TRACKED];
uint16_t rx_refused[DP_MAX_SUBTYPES_TRACKED];
};
#ifdef TX_MULTIQ_PER_AC #ifdef TX_MULTIQ_PER_AC
#define TX_GET_QUEUE_IDX(ac, off) (((ac) * TX_QUEUES_PER_AC) + (off)) #define TX_GET_QUEUE_IDX(ac, off) (((ac) * TX_QUEUES_PER_AC) + (off))
@@ -530,10 +590,41 @@ union wlan_tp_data {
* @dp_nud_failure_work: Callback API to handle NUD failuire work * @dp_nud_failure_work: Callback API to handle NUD failuire work
*/ */
struct wlan_dp_psoc_callbacks { struct wlan_dp_psoc_callbacks {
void (*os_if_dp_gro_rx)(struct sk_buff *skb, uint8_t napi_to_use,
bool flush_gro);
hdd_cb_handle callback_ctx; hdd_cb_handle callback_ctx;
QDF_STATUS (*dp_get_nw_intf_mac_by_vdev_mac)(struct qdf_mac_addr *mac_addr,
struct qdf_mac_addr *intf_mac);
unsigned int (*dp_get_tx_flow_low_watermark)(hdd_cb_handle cb_ctx,
uint8_t intf_id);
void (*dp_get_tx_resource)(uint8_t intf_id, struct qdf_mac_addr *mac_addr);
void (*dp_get_tsf_time)(uint8_t intf_id,
uint64_t input_time, uint64_t *tsf_time);
void (*dp_tsf_timestamp_rx)(hdd_cb_handle ctx, qdf_nbuf_t nbuf);
QDF_STATUS (*dp_nbuf_push_pkt)(qdf_nbuf_t nbuf,
enum dp_nbuf_push_type type);
QDF_STATUS (*dp_rx_napi_gro_flush)(qdf_napi_struct *napi_to_use,
qdf_nbuf_t nbuf,
uint8_t *force_flush);
QDF_STATUS (*dp_rx_napi_gro_receive)(qdf_napi_struct *napi_to_use,
qdf_nbuf_t nbuf);
QDF_STATUS (*dp_lro_rx_cb)(qdf_netdev_t netdev, qdf_nbuf_t nbuf);
qdf_napi_struct *(*dp_gro_rx_legacy_get_napi)(qdf_nbuf_t nbuf,
bool enable_rx_thread);
void (*dp_register_rx_offld_flush_cb)(enum dp_rx_offld_flush_cb type);
QDF_STATUS (*dp_rx_check_qdisc_configured)(qdf_netdev_t dev,
uint8_t rx_ctx_id);
bool (*dp_is_gratuitous_arp_unsolicited_na)(qdf_nbuf_t nbuf);
QDF_STATUS (*dp_send_rx_pkt_over_nl)(qdf_netdev_t dev, uint8_t *addr,
qdf_nbuf_t nbuf, bool unecrypted);
bool bool
(*wlan_dp_sta_get_dot11mode)(hdd_cb_handle context, uint8_t vdev_id, (*wlan_dp_sta_get_dot11mode)(hdd_cb_handle context, uint8_t vdev_id,
enum qca_wlan_802_11_mode *dot11_mode); enum qca_wlan_802_11_mode *dot11_mode);
@@ -626,6 +717,7 @@ struct wlan_dp_psoc_nb_ops {
*/ */
struct wlan_dp_user_config { struct wlan_dp_user_config {
bool ipa_enable; bool ipa_enable;
uint32_t arp_connectivity_map;
}; };
#endif /* end of _WLAN_DP_PUBLIC_STRUCT_H_ */ #endif /* end of _WLAN_DP_PUBLIC_STRUCT_H_ */

View File

@@ -138,6 +138,260 @@ void ucfg_dp_resume_wlan(struct wlan_objmgr_psoc *psoc);
QDF_STATUS QDF_STATUS
ucfg_dp_update_config(struct wlan_objmgr_psoc *psoc, ucfg_dp_update_config(struct wlan_objmgr_psoc *psoc,
struct wlan_dp_user_config *req); struct wlan_dp_user_config *req);
/**
* ucfg_dp_wait_complete_tasks() - wait for DP tasks to complete
* Called from legacy layer to wait DP tasks completion
*
* Return: None
*/
void
ucfg_dp_wait_complete_tasks(void);
/**
* ucfg_dp_remove_conn_info() - Remove DP STA intf connection info
* @vdev: vdev mapped to STA DP interface
*
* Return: QDF_STATUS
*/
void
ucfg_dp_remove_conn_info(struct wlan_objmgr_vdev *vdev);
/**
* ucfg_dp_conn_info_set_bssid() - set BSSID info in STA intf
* @vdev: vdev mapped to STA DP interface
* @bssid: BSSID mac
*
* Return: None
*/
void ucfg_dp_conn_info_set_bssid(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *bssid);
/**
* ucfg_dp_conn_info_set_arp_service() - set ARP service info
* @vdev: vdev mapped to STA DP interface
* @proxy_arp_service: ARP service info
*
* Return: None
*/
void ucfg_dp_conn_info_set_arp_service(struct wlan_objmgr_vdev *vdev,
uint8_t proxy_arp_service);
/**
* ucfg_dp_conn_info_set_peer_authenticate() - set Peer authenticated state
* @vdev: vdev mapped to STA DP interface
* is_authenticated: Peer authenticated info
*
* Return: None
*/
void ucfg_dp_conn_info_set_peer_authenticate(struct wlan_objmgr_vdev *vdev,
uint8_t is_authenticated);
/**
* ucfg_dp_conn_info_set_peer_mac() - set peer mac info in DP intf
* @vdev: vdev mapped to STA DP interface
* peer_mac: Peer MAC information
*
* Return: None
*/
void ucfg_dp_conn_info_set_peer_mac(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *peer_mac);
/**
* ucfg_dp_softap_check_wait_for_tx_eap_pkt() - wait for TX EAP pkt in SAP
* @vdev: vdev mapped to SAP DP interface
* mac_addr: Peer MAC address info
*
* Return: None
*/
void ucfg_dp_softap_check_wait_for_tx_eap_pkt(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mac_addr);
/**
* ucfg_dp_update_dhcp_state_on_disassoc() - update DHCP during disassoc
* @vdev: vdev mapped to SAP DP interface
* mac_addr: Peer MAC address info
*
* Return: None
*/
void ucfg_dp_update_dhcp_state_on_disassoc(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mac_addr);
/**
* ucfg_dp_set_dfs_cac_tx() - update DFS CAC TX block info
* @vdev: vdev mapped to SAP DP interface
* tx_block: true if TX need to be blocked
*
* Return: None
*/
void ucfg_dp_set_dfs_cac_tx(struct wlan_objmgr_vdev *vdev,
bool tx_block);
/**
* ucfg_dp_set_bss_state_start() - update BSS state for SAP intf
* @vdev: vdev mapped to SAP DP interface
* start: true if BSS state is started
*
* Return: None
*/
void ucfg_dp_set_bss_state_start(struct wlan_objmgr_vdev *vdev, bool start);
/**
* ucfg_dp_lro_set_reset() - LRO set/reset in DP
* @vdev: vdev mapped to DP interface
* enable_flag: Enable/disable LRO feature
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS ucfg_dp_lro_set_reset(struct wlan_objmgr_vdev *vdev,
uint8_t enable_flag);
/**
* ucfg_dp_is_ol_enabled() - Get ol enable/disable info
* @psoc: PSOC mapped to DP context
*
* Return: true if OL enabled
*/
bool ucfg_dp_is_ol_enabled(struct wlan_objmgr_psoc *psoc);
#ifdef RECEIVE_OFFLOAD
/**
* ucfg_dp_rx_handle_concurrency() - Handle concurrency setting in DP
* @psoc: PSOC mapped to DP context
* @is_wifi3_0_target: true if it is wifi3.0 target
* @is_concurrency: Is concurrency enabled/disabled
*
* Return: None
*/
void ucfg_dp_rx_handle_concurrency(struct wlan_objmgr_psoc *psoc,
bool is_wifi3_0_target,
bool is_concurrency);
#else
static inline
void ucfg_dp_rx_handle_concurrency(struct wlan_objmgr_psoc *psoc,
bool is_wifi3_0_target,
bool is_concurrency) { }
#endif
/**
* ucfg_dp_is_rx_common_thread_enabled() - Get common thread enable/disable info
* @psoc: PSOC mapped to DP context
*
* Return: true if common thread enabled
*/
bool ucfg_dp_is_rx_common_thread_enabled(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_dp_is_rx_threads_enabled() - Get RX DP threads info
* @psoc: PSOC mapped to DP context
*
* Return: true if DP RX threads enabled
*/
bool ucfg_dp_is_rx_threads_enabled(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_dp_rx_ol_init() - Initialize Rx offload mode (LRO or GRO)
* @psoc: PSOC mapped to DP context
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS ucfg_dp_rx_ol_init(struct wlan_objmgr_psoc *psoc,
bool is_wifi3_0_target);
/**
* ucfg_dp_init_txrx() - Initialize STA DP init TX/RX
* @vdev: vdev mapped to STA DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS ucfg_dp_init_txrx(struct wlan_objmgr_vdev *vdev);
/**
* ucfg_dp_deinit_txrx() - Deinitialize STA DP init TX/RX
* @vdev: vdev mapped to STA DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS ucfg_dp_deinit_txrx(struct wlan_objmgr_vdev *vdev);
/**
* ucfg_dp_softap_init_txrx() - Initialize SAP DP init TX/RX
* @vdev: vdev mapped to SAP DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS ucfg_dp_softap_init_txrx(struct wlan_objmgr_vdev *vdev);
/**
* ucfg_dp_softap_deinit_txrx() - Deinitialize SAP DP init TX/RX
* @vdev: vdev mapped to SAP DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS ucfg_dp_softap_deinit_txrx(struct wlan_objmgr_vdev *vdev);
/**
* ucfg_dp_start_xmit() - Transmit packet on STA interface
* @nbuf: n/w buffer to transmitted
* @vdev: vdev mapped to STA DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS
ucfg_dp_start_xmit(qdf_nbuf_t nbuf, struct wlan_objmgr_vdev *vdev);
/**
* ucfg_dp_rx_packet_cbk() - Receive packet on STA interface
* @nbuf: n/w buffer to be received
* @vdev: vdev mapped to STA DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS ucfg_dp_rx_packet_cbk(struct wlan_objmgr_vdev *vdev,
qdf_nbuf_t nbuf);
/**
* ucfg_dp_tx_timeout() - called during transmission timeout on STA
* @vdev: vdev mapped to STA DP interface
*
* Return: None
*/
void ucfg_dp_tx_timeout(struct wlan_objmgr_vdev *vdev);
/**
* ucfg_dp_softap_tx_timeout() - called during transmission timeout on SAP
* @vdev: vdev mapped to SAP DP interface
*
* Return: None
*/
void ucfg_dp_softap_tx_timeout(struct wlan_objmgr_vdev *vdev);
/**
* ucfg_dp_softap_start_xmit() - Transmit packet on SAP interface
* @nbuf: n/w buffer to transmitted
* @vdev: vdev mapped to SAP DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS
ucfg_dp_softap_start_xmit(qdf_nbuf_t nbuf, struct wlan_objmgr_vdev *vdev);
/**
* ucfg_dp_get_dev_stats() - Get netdev stats info
* @intf_addr: DP interface MAC address
*
* Return: qdf_net_dev_stats info
*/
qdf_net_dev_stats *ucfg_dp_get_dev_stats(struct qdf_mac_addr *intf_addr);
/**
* ucfg_dp_inc_rx_pkt_stats() - DP increment RX pkt stats
* @vdev: VDEV mapped to DP interface
* pkt_len: packet length to be incremented in stats
*
* Return: None
*/
void ucfg_dp_inc_rx_pkt_stats(struct wlan_objmgr_vdev *vdev,
uint32_t pkt_len,
bool delivered);
/** /**
* ucfg_dp_get_rx_softirq_yield_duration() - Get rx soft IRQ yield duration * ucfg_dp_get_rx_softirq_yield_duration() - Get rx soft IRQ yield duration
@@ -154,6 +408,72 @@ ucfg_dp_get_rx_softirq_yield_duration(struct wlan_objmgr_psoc *psoc);
*/ */
void ucfg_dp_register_rx_mic_error_ind_handler(void *soc); void ucfg_dp_register_rx_mic_error_ind_handler(void *soc);
/**
* ucfg_dp_sta_register_txrx_ops() - Register ops for TX/RX operations in STA
* @vdev: vdev mapped to STA DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS ucfg_dp_sta_register_txrx_ops(struct wlan_objmgr_vdev *vdev);
#ifdef FEATURE_WLAN_TDLS
/**
* ucfg_dp_tdlsta_register_txrx_ops() - Register ops for TX/RX operations
* @vdev: vdev mapped to TDLS STA DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS ucfg_dp_tdlsta_register_txrx_ops(struct wlan_objmgr_vdev *vdev);
#else
static inline
QDF_STATUS ucfg_dp_tdlsta_register_txrx_ops(struct wlan_objmgr_vdev *vdev)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif
/**
* ucfg_dp_ocb_register_txrx_ops() - Register ops for TX/RX operations
* @vdev: vdev mapped to OCB DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS ucfg_dp_ocb_register_txrx_ops(struct wlan_objmgr_vdev *vdev);
#ifdef FEATURE_MONITOR_MODE_SUPPORT
/**
* ucfg_dp_mon_register_txrx_ops() - Register ops for TX/RX operations
* @vdev: vdev mapped to Monitor mode DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS ucfg_dp_mon_register_txrx_ops(struct wlan_objmgr_vdev *vdev);
#else
static inline
QDF_STATUS ucfg_dp_mon_register_txrx_ops(struct wlan_objmgr_vdev *vdev)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif
/**
* ucfg_dp_softap_register_txrx_ops() - Register ops for TX/RX operations
* @vdev: vdev mapped to SAP mode DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS ucfg_dp_softap_register_txrx_ops(struct wlan_objmgr_vdev *vdev,
struct ol_txrx_ops *txrx_ops);
/**
* ucfg_dp_register_pkt_capture_callbacks() - Register ops for pkt capture operations
* @vdev: vdev mapped to DP interface
*
* Return: 0 on success and non zero on failure.
*/
QDF_STATUS
ucfg_dp_register_pkt_capture_callbacks(struct wlan_objmgr_vdev *vdev);
/** /**
* ucfg_dp_bbm_context_init() - Initialize BBM context * ucfg_dp_bbm_context_init() - Initialize BBM context
* @psoc: psoc handle * @psoc: psoc handle
@@ -497,6 +817,14 @@ void ucfg_dp_clear_dns_payload_value(struct wlan_objmgr_vdev *vdev);
void ucfg_dp_set_pkt_type_bitmap_value(struct wlan_objmgr_vdev *vdev, void ucfg_dp_set_pkt_type_bitmap_value(struct wlan_objmgr_vdev *vdev,
uint32_t value); uint32_t value);
/**
* ucfg_dp_intf_get_pkt_type_bitmap_value() - Get packt type bitmap info
* @intf_ctx: DP interface context
*
* Return: bitmap information
*/
uint32_t ucfg_dp_intf_get_pkt_type_bitmap_value(void *intf_ctx);
/** /**
* ucfg_dp_set_track_dest_ipv4_value() - Set track_dest_ipv4 value * ucfg_dp_set_track_dest_ipv4_value() - Set track_dest_ipv4 value
* @vdev: vdev context * @vdev: vdev context
@@ -732,4 +1060,93 @@ uint32_t ucfg_dp_get_bus_bw_compute_interval(struct wlan_objmgr_psoc *psoc);
* Return: current bandwidth level * Return: current bandwidth level
*/ */
int ucfg_dp_get_current_throughput_level(struct wlan_objmgr_psoc *psoc); int ucfg_dp_get_current_throughput_level(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_dp_get_txrx_stats() - get current bandwidth level
* @vdev: vdev handle
* @dp_stats : dp_stats pointer
*
* This function update dp_stats pointer with DP component
* txrx stats
* Return: 0 on success
*/
QDF_STATUS ucfg_dp_get_txrx_stats(struct wlan_objmgr_vdev *vdev,
struct dp_tx_rx_stats *dp_stats);
/**
* ucfg_dp_reset_cont_txtimeout_cnt() - Reset Tx Timeout count
* @vdev: vdev handle
*
* Return: None
*/
void ucfg_dp_reset_cont_txtimeout_cnt(struct wlan_objmgr_vdev *vdev);
/**
* ucfg_dp_set_rx_thread_affinity() - Set rx thread affinity mask
* @psoc: psoc handle
*
* Return: None
*/
void ucfg_dp_set_rx_thread_affinity(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_dp_get_disable_rx_ol_val() - Get Rx OL concurrency value
* @psoc: psoc handle
* @disable_conc : disable rx OL concurrency value
* @disable_low_tput : disable rx OL low tput value
*
* this function reads and update value in pointer variable
* passed as arguments to function.
*
* Return: None
*/
void ucfg_dp_get_disable_rx_ol_val(struct wlan_objmgr_psoc *psoc,
uint8_t *disable_conc,
uint8_t *disable_low_tput);
/**
* ucfg_dp_get_rx_aggregation_val() - Get Rx aggregation values
* @psoc: psoc handle
*
* Return: Rx aggregation value
*/
uint32_t ucfg_dp_get_rx_aggregation_val(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_dp_set_rx_aggregation_val() - Set rx aggregation value
* @psoc: psoc handle
* @value : value to be set
*
* Return: None
*/
void ucfg_dp_set_rx_aggregation_val(struct wlan_objmgr_psoc *psoc,
uint32_t value);
/**
* ucfg_dp_set_force_gro_enable() - Set force gro enable
* @psoc: psoc handle
* @value : value to be set
*
* Return: None
*/
void ucfg_dp_set_force_gro_enable(struct wlan_objmgr_psoc *psoc, bool value);
/**
* ucfg_dp_runtime_disable_rx_thread() - Disable rx thread
* @psoc: psoc handle
* @value : value to be set (true/false)
*
* Return: None
*/
void ucfg_dp_runtime_disable_rx_thread(struct wlan_objmgr_vdev *vdev,
bool value);
/**
* ucfg_dp_get_napi_enabled() - Get NAPI enabled/disabled info
* @psoc: psoc handle mapped to DP context
*
* Return: true if NAPI enabled
*/
bool ucfg_dp_get_napi_enabled(struct wlan_objmgr_psoc *psoc);
#endif /* _WLAN_DP_UCFG_API_H_ */ #endif /* _WLAN_DP_UCFG_API_H_ */

File diff suppressed because it is too large Load Diff