qcacmn: Send GRO flush indication at end of dp_rx_process
In case of TCP packets being processed by dp_rx_process, send out GRO flush indication to the thread. CRs-Fixed: 2500152 Change-Id: I4f464456d423e4680955992c0acf0ed5f4e618b8
Bu işleme şunda yer alıyor:

işlemeyi yapan:
nshrivas

ebeveyn
9fb7c768c3
işleme
698987c896
@@ -649,6 +649,15 @@ typedef bool (*ol_txrx_tx_flow_control_is_pause_fp)(void *osif_dev);
|
||||
*/
|
||||
typedef QDF_STATUS(*ol_txrx_rx_fp)(void *osif_dev, qdf_nbuf_t msdu_list);
|
||||
|
||||
/**
|
||||
* ol_txrx_rx_gro_flush_ind - function to send GRO flush indication to stack
|
||||
* for a given RX Context Id.
|
||||
* @osif_dev - handle to the OSIF virtual device object
|
||||
* @rx_ctx_id - Rx context Id for which gro flush should happen
|
||||
*/
|
||||
typedef QDF_STATUS(*ol_txrx_rx_gro_flush_ind_fp)(void *osif_dev,
|
||||
int rx_ctx_id);
|
||||
|
||||
/**
|
||||
* ol_txrx_stats_rx_fp - receive function to hand batches of data
|
||||
* frames from txrx to OS shim
|
||||
@@ -768,6 +777,7 @@ typedef void (*ol_txrx_pktdump_cb)(ol_txrx_soc_handle soc,
|
||||
* @rx.stack - function to give packets to the stack. Differs from @rx.rx.
|
||||
* In case RX Threads are enabled, this pointer holds the callback to give
|
||||
* packets to the stack.
|
||||
* @rx.rx_gro_flush - GRO flush indication to stack for a given RX CTX ID
|
||||
* @rx.wai_check - the tx function pointer for WAPI frames
|
||||
* @rx.mon - the OS shim rx monitor function to deliver
|
||||
* monitor data to Though in practice, it is probable
|
||||
@@ -800,6 +810,7 @@ struct ol_txrx_ops {
|
||||
struct {
|
||||
ol_txrx_rx_fp rx;
|
||||
ol_txrx_rx_fp rx_stack;
|
||||
ol_txrx_rx_gro_flush_ind_fp rx_gro_flush;
|
||||
ol_txrx_rx_check_wai_fp wai_check;
|
||||
ol_txrx_rx_mon_fp mon;
|
||||
ol_txrx_stats_rx_fp stats_rx;
|
||||
|
@@ -4800,6 +4800,7 @@ static void dp_vdev_register_wifi3(struct cdp_vdev *vdev_handle,
|
||||
vdev->ctrl_vdev = ctrl_vdev;
|
||||
vdev->osif_rx = txrx_ops->rx.rx;
|
||||
vdev->osif_rx_stack = txrx_ops->rx.rx_stack;
|
||||
vdev->osif_gro_flush = txrx_ops->rx.rx_gro_flush;
|
||||
vdev->osif_rsim_rx_decap = txrx_ops->rx.rsim_rx_decap;
|
||||
vdev->osif_get_key = txrx_ops->get_key;
|
||||
vdev->osif_rx_mon = txrx_ops->rx.mon;
|
||||
|
@@ -911,12 +911,13 @@ static void dp_rx_print_offload_info(uint8_t *rx_tlv)
|
||||
* @soc: DP SOC handle
|
||||
* @rx_tlv: RX TLV received for the msdu
|
||||
* @msdu: msdu for which GRO info needs to be filled
|
||||
* @rx_ol_pkt_cnt: counter to be incremented for GRO eligible packets
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
static
|
||||
void dp_rx_fill_gro_info(struct dp_soc *soc, uint8_t *rx_tlv,
|
||||
qdf_nbuf_t msdu)
|
||||
qdf_nbuf_t msdu, uint32_t *rx_ol_pkt_cnt)
|
||||
{
|
||||
if (!wlan_cfg_is_gro_enabled(soc->wlan_cfg_ctx))
|
||||
return;
|
||||
@@ -925,6 +926,8 @@ void dp_rx_fill_gro_info(struct dp_soc *soc, uint8_t *rx_tlv,
|
||||
if (!HAL_RX_TLV_GET_TCP_PROTO(rx_tlv))
|
||||
return;
|
||||
|
||||
*rx_ol_pkt_cnt = *rx_ol_pkt_cnt + 1;
|
||||
|
||||
QDF_NBUF_CB_RX_LRO_ELIGIBLE(msdu) =
|
||||
HAL_RX_TLV_GET_LRO_ELIGIBLE(rx_tlv);
|
||||
QDF_NBUF_CB_RX_TCP_PURE_ACK(msdu) =
|
||||
@@ -950,7 +953,7 @@ void dp_rx_fill_gro_info(struct dp_soc *soc, uint8_t *rx_tlv,
|
||||
}
|
||||
#else
|
||||
static void dp_rx_fill_gro_info(struct dp_soc *soc, uint8_t *rx_tlv,
|
||||
qdf_nbuf_t msdu)
|
||||
qdf_nbuf_t msdu, uint32_t *rx_ol_pkt_cnt)
|
||||
{
|
||||
}
|
||||
#endif /* RECEIVE_OFFLOAD */
|
||||
@@ -1661,6 +1664,7 @@ uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl,
|
||||
int32_t tid = 0;
|
||||
bool is_prev_msdu_last = true;
|
||||
uint32_t num_entries_avail = 0;
|
||||
uint32_t rx_ol_pkt_cnt = 0;
|
||||
|
||||
DP_HIST_INIT();
|
||||
|
||||
@@ -1862,9 +1866,6 @@ more_data:
|
||||
done:
|
||||
dp_srng_access_end(int_ctx, soc, hal_ring_hdl);
|
||||
|
||||
if (nbuf_tail)
|
||||
QDF_NBUF_CB_RX_FLUSH_IND(nbuf_tail) = 1;
|
||||
|
||||
for (mac_id = 0; mac_id < MAX_PDEV_CNT; mac_id++) {
|
||||
/*
|
||||
* continue with next mac_id if no pkts were reaped
|
||||
@@ -2129,7 +2130,8 @@ done:
|
||||
}
|
||||
}
|
||||
|
||||
dp_rx_fill_gro_info(soc, rx_tlv_hdr, nbuf);
|
||||
dp_rx_fill_gro_info(soc, rx_tlv_hdr, nbuf, &rx_ol_pkt_cnt);
|
||||
|
||||
qdf_nbuf_cb_update_peer_local_id(nbuf, peer->local_id);
|
||||
|
||||
DP_RX_LIST_APPEND(deliver_list_head,
|
||||
@@ -2147,7 +2149,7 @@ done:
|
||||
dp_rx_deliver_to_stack(vdev, peer, deliver_list_head,
|
||||
deliver_list_tail);
|
||||
|
||||
if (dp_rx_enable_eol_data_check(soc)) {
|
||||
if (dp_rx_enable_eol_data_check(soc) && rx_bufs_used) {
|
||||
if (quota &&
|
||||
hal_srng_dst_peek_sync_locked(soc->hal_soc,
|
||||
hal_ring_hdl)) {
|
||||
@@ -2155,7 +2157,13 @@ done:
|
||||
if (!hif_exec_should_yield(scn, intr_id))
|
||||
goto more_data;
|
||||
}
|
||||
|
||||
if (vdev->osif_gro_flush && rx_ol_pkt_cnt) {
|
||||
vdev->osif_gro_flush(vdev->osif_vdev,
|
||||
reo_ring_num);
|
||||
}
|
||||
}
|
||||
|
||||
/* Update histogram statistics by looping through pdev's */
|
||||
DP_RX_HIST_STATS_PER_PDEV();
|
||||
|
||||
|
@@ -1704,6 +1704,8 @@ struct dp_vdev {
|
||||
/* dp_peer list */
|
||||
TAILQ_HEAD(, dp_peer) peer_list;
|
||||
|
||||
/* RX call back function to flush GRO packets*/
|
||||
ol_txrx_rx_gro_flush_ind_fp osif_gro_flush;
|
||||
/* default RX call back function called by dp */
|
||||
ol_txrx_rx_fp osif_rx;
|
||||
/* callback to deliver rx frames to the OS */
|
||||
|
Yeni konuda referans
Bir kullanıcı engelle