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:
Mohit Khanna
2019-07-28 21:38:05 -07:00
işlemeyi yapan: nshrivas
ebeveyn 9fb7c768c3
işleme 698987c896
4 değiştirilmiş dosya ile 29 ekleme ve 7 silme

Dosyayı Görüntüle

@@ -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;

Dosyayı Görüntüle

@@ -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;

Dosyayı Görüntüle

@@ -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();

Dosyayı Görüntüle

@@ -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 */