diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index b448ab62e7..11dfaf6a67 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -335,7 +335,7 @@ dp_get_vdev_from_peer(struct dp_soc *soc, if (unlikely(!peer)) { if (peer_id != HTT_INVALID_PEER) { - vdev_id = DP_PEER_METADATA_ID_GET( + vdev_id = DP_PEER_METADATA_VDEV_ID_GET( mpdu_desc_info.peer_meta_data); QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, @@ -1593,7 +1593,6 @@ bool dp_is_special_data(qdf_nbuf_t nbuf) static inline void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf) { - uint32_t peer_mdata; uint16_t peer_id; uint8_t vdev_id; struct dp_vdev *vdev; @@ -1602,13 +1601,11 @@ void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf) uint32_t pkt_len = 0; uint8_t *rx_tlv_hdr; - peer_mdata = QDF_NBUF_CB_RX_PEER_ID(nbuf); - - peer_id = DP_PEER_METADATA_PEER_ID_GET(peer_mdata); + peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf); if (peer_id > soc->max_peers) goto deliver_fail; - vdev_id = DP_PEER_METADATA_ID_GET(peer_mdata); + vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf); vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id); if (!vdev || !vdev->osif_rx) goto deliver_fail; @@ -1717,6 +1714,7 @@ uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl, uint32_t l2_hdr_offset = 0; uint16_t msdu_len = 0; uint16_t peer_id; + uint8_t vdev_id; struct dp_peer *peer; struct dp_vdev *vdev; uint32_t pkt_len = 0; @@ -1897,6 +1895,8 @@ more_data: peer_mdata = mpdu_desc_info.peer_meta_data; QDF_NBUF_CB_RX_PEER_ID(rx_desc->nbuf) = DP_PEER_METADATA_PEER_ID_GET(peer_mdata); + QDF_NBUF_CB_RX_VDEV_ID(rx_desc->nbuf) = + DP_PEER_METADATA_VDEV_ID_GET(peer_mdata); /* * save msdu flags first, last and continuation msdu in @@ -1985,12 +1985,20 @@ done: while (nbuf) { next = nbuf->next; rx_tlv_hdr = qdf_nbuf_data(nbuf); + vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf); + + if (deliver_list_head && vdev && (vdev->vdev_id != vdev_id)) { + dp_rx_deliver_to_stack(vdev, peer, deliver_list_head, + deliver_list_tail); + deliver_list_head = NULL; + deliver_list_tail = NULL; + } + /* Get TID from struct cb->tid_val, save to tid */ if (qdf_nbuf_is_rx_chfrag_start(nbuf)) tid = qdf_nbuf_get_tid_val(nbuf); - peer_mdata = QDF_NBUF_CB_RX_PEER_ID(nbuf); - peer_id = DP_PEER_METADATA_PEER_ID_GET(peer_mdata); + peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf); peer = dp_peer_find_by_id(soc, peer_id); if (peer) { @@ -2003,13 +2011,6 @@ done: rx_bufs_used++; - if (deliver_list_head && peer && (vdev != peer->vdev)) { - dp_rx_deliver_to_stack(vdev, peer, deliver_list_head, - deliver_list_tail); - deliver_list_head = NULL; - deliver_list_tail = NULL; - } - if (qdf_likely(peer)) { vdev = peer->vdev; } else { diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index 8b88d886f3..20a308b241 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -47,14 +47,14 @@ #define DP_PEER_METADATA_PEER_ID_MASK 0x0000ffff #define DP_PEER_METADATA_PEER_ID_SHIFT 0 -#define DP_PEER_METADATA_VDEV_ID_MASK 0x00070000 +#define DP_PEER_METADATA_VDEV_ID_MASK 0x003f0000 #define DP_PEER_METADATA_VDEV_ID_SHIFT 16 #define DP_PEER_METADATA_PEER_ID_GET(_peer_metadata) \ (((_peer_metadata) & DP_PEER_METADATA_PEER_ID_MASK) \ >> DP_PEER_METADATA_PEER_ID_SHIFT) -#define DP_PEER_METADATA_ID_GET(_peer_metadata) \ +#define DP_PEER_METADATA_VDEV_ID_GET(_peer_metadata) \ (((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK) \ >> DP_PEER_METADATA_VDEV_ID_SHIFT) diff --git a/qdf/linux/src/i_qdf_nbuf.h b/qdf/linux/src/i_qdf_nbuf.h index bedfc54551..d34dbf3523 100644 --- a/qdf/linux/src/i_qdf_nbuf.h +++ b/qdf/linux/src/i_qdf_nbuf.h @@ -104,24 +104,24 @@ typedef union { * @rx.dev.priv_cb_w.protocol_tag: protocol tag set by app for rcvd packet type * @rx.dev.priv_cb_w.flow_tag: flow tag set by application for 5 tuples rcvd * + * @rx.dev.priv_cb_m.peer_cached_buf_frm: peer cached buffer + * @rx.dev.priv_cb_m.flush_ind: flush indication + * @rx.dev.priv_cb_m.packet_buf_pool: packet buff bool * @rx.dev.priv_cb_m.tcp_seq_num: TCP sequence number * @rx.dev.priv_cb_m.tcp_ack_num: TCP ACK number * @rx.dev.priv_cb_m.lro_ctx: LRO context * @rx.dev.priv_cb_m.dp.wifi3.msdu_len: length of RX packet * @rx.dev.priv_cb_m.dp.wifi3.peer_id: peer_id for RX packet * @rx.dev.priv_cb_m.dp.wifi2.map_index: - * @rx.dev.priv_cb_m.vdev_id: vdev_id for RX pkt * @rx.dev.priv_cb_m.ipa_owned: packet owned by IPA * * @rx.lro_eligible: flag to indicate whether the MSDU is LRO eligible - * @rx.peer_cached_buf_frm: peer cached buffer * @rx.tcp_proto: L4 protocol is TCP * @rx.tcp_pure_ack: A TCP ACK packet with no payload * @rx.ipv6_proto: L3 protocol is IPV6 * @rx.ip_offset: offset to IP header * @rx.tcp_offset: offset to TCP header * @rx_ctx_id: Rx context id - * @flush_ind: flush indication * @num_elements_in_list: number of elements in the nbuf list * * @rx.tcp_udp_chksum: L4 payload checksum @@ -132,7 +132,7 @@ typedef union { * @rx.flag_chfrag_start: first MSDU in an AMSDU * @rx.flag_chfrag_cont: middle or part of MSDU in an AMSDU * @rx.flag_chfrag_end: last MSDU in an AMSDU - * @rx.packet_buff_pool: indicate packet from pre-allocated pool for Rx ring + * @rx.flag_retry: flag to indicate MSDU is retried * @rx.flag_da_mcbc: flag to indicate mulicast or broadcast packets * @rx.flag_da_valid: flag to indicate DA is valid for RX packet * @rx.flag_sa_valid: flag to indicate SA is valid for RX packet @@ -146,12 +146,12 @@ typedef union { * @rx.trace.packet_track: RX_DATA packet * @rx.trace.rsrvd: enable packet logging * - * @rx.ftype: mcast2ucast, TSO, SG, MESH + * @rx.vdev_id: vdev_id for RX pkt * @rx.is_raw_frame: RAW frame * @rx.fcs_err: FCS error * @rx.tid_val: tid value - * @rx.flag_retry: flag to indicate MSDU is retried * @rx.reserved: reserved + * @rx.ftype: mcast2ucast, TSO, SG, MESH * * @tx.dev.priv_cb_w.fctx: ctx to handle special pkts defined by ftype * @tx.dev.priv_cb_w.ext_cb_ptr: extended cb pointer @@ -219,9 +219,11 @@ struct qdf_nbuf_cb { * Do not change location of this bit. */ uint32_t ipa_owned:1, - reserved:15, - vdev_id:8, - reserved1:8; + peer_cached_buf_frm:1, + flush_ind:1, + packet_buf_pool:1, + reserved:12, + reserved1:16; uint32_t tcp_seq_num; uint32_t tcp_ack_num; union { @@ -237,14 +239,14 @@ struct qdf_nbuf_cb { } priv_cb_m; } dev; uint32_t lro_eligible:1, - peer_cached_buf_frm:1, + is_raw_frame:1, tcp_proto:1, tcp_pure_ack:1, ipv6_proto:1, ip_offset:7, tcp_offset:7, rx_ctx_id:4, - flush_ind:1, + fcs_err:1, num_elements_in_list:8; uint32_t tcp_udp_chksum:16, tcp_win:16; @@ -252,7 +254,7 @@ struct qdf_nbuf_cb { uint8_t flag_chfrag_start:1, flag_chfrag_cont:1, flag_chfrag_end:1, - packet_buff_pool:1, + flag_retry:1, flag_da_mcbc:1, flag_da_valid:1, flag_sa_valid:1, @@ -263,12 +265,9 @@ struct qdf_nbuf_cb { packet_track:4, rsrvd:3; } trace; - uint8_t ftype; - uint8_t is_raw_frame:1, - fcs_err:1, - tid_val:4, - flag_retry:1, - reserved:1; + uint16_t vdev_id:8, + tid_val:4, + ftype:4; } rx; /* Note: MAX: 40 bytes */ @@ -347,8 +346,6 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size, #define QDF_NBUF_CB_RX_LRO_ELIGIBLE(skb) \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.lro_eligible) -#define QDF_NBUF_CB_RX_PEER_CACHED_FRM(skb) \ - (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.peer_cached_buf_frm) #define QDF_NBUF_CB_RX_TCP_PROTO(skb) \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_proto) #define QDF_NBUF_CB_RX_TCP_PURE_ACK(skb) \ @@ -361,8 +358,6 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size, (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_offset) #define QDF_NBUF_CB_RX_CTX_ID(skb) \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.rx_ctx_id) -#define QDF_NBUF_CB_RX_FLUSH_IND(skb) \ - (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.flush_ind) #define QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(skb) \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.num_elements_in_list) @@ -382,6 +377,9 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size, #define QDF_NBUF_CB_RX_FTYPE(skb) \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.ftype) +#define QDF_NBUF_CB_RX_VDEV_ID(skb) \ + (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.vdev_id) + #define QDF_NBUF_CB_RX_CHFRAG_START(skb) \ (((struct qdf_nbuf_cb *) \ ((skb)->cb))->u.rx.flag_chfrag_start) @@ -391,9 +389,6 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size, #define QDF_NBUF_CB_RX_CHFRAG_END(skb) \ (((struct qdf_nbuf_cb *) \ ((skb)->cb))->u.rx.flag_chfrag_end) -#define QDF_NBUF_CB_RX_PACKET_BUFF_POOL(skb) \ - (((struct qdf_nbuf_cb *) \ - ((skb)->cb))->u.rx.packet_buff_pool) #define QDF_NBUF_CB_RX_DA_MCBC(skb) \ (((struct qdf_nbuf_cb *) \ diff --git a/qdf/linux/src/i_qdf_nbuf_m.h b/qdf/linux/src/i_qdf_nbuf_m.h index 296494c8ac..4e2484514e 100644 --- a/qdf/linux/src/i_qdf_nbuf_m.h +++ b/qdf/linux/src/i_qdf_nbuf_m.h @@ -34,9 +34,6 @@ #define QDF_NBUF_CB_RX_LRO_CTX(skb) \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.lro_ctx) -#define QDF_NBUF_CB_RX_VDEV_ID(skb) \ - (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.vdev_id) - #define QDF_NBUF_CB_TX_IPA_OWNED(skb) \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m.ipa.owned) #define QDF_NBUF_CB_TX_IPA_PRIV(skb) \ @@ -61,6 +58,17 @@ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.dp. \ wifi2.map_index) +#define QDF_NBUF_CB_RX_PEER_CACHED_FRM(skb) \ + (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \ + peer_cached_buf_frm) + +#define QDF_NBUF_CB_RX_FLUSH_IND(skb) \ + (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.flush_ind) + +#define QDF_NBUF_CB_RX_PACKET_BUFF_POOL(skb) \ + (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \ + packet_buf_pool) + #define __qdf_nbuf_ipa_owned_get(skb) \ QDF_NBUF_CB_TX_IPA_OWNED(skb)