}
 
 static void mlxsw_pci_cqe_rdq_handle(struct mlxsw_pci *mlxsw_pci,
+                                    struct napi_struct *napi,
                                     struct mlxsw_pci_queue *q,
                                     u16 consumer_counter_limit,
                                     enum mlxsw_pci_cqe_v cqe_v, char *cqe)
        }
 
        mlxsw_pci_skb_cb_ts_set(mlxsw_pci, skb, cqe_v, cqe);
+       mlxsw_skb_cb(skb)->rx_md_info.napi = napi;
 
        mlxsw_core_skb_receive(mlxsw_pci->core, skb, &rx_info);
 
                        continue;
                }
 
-               mlxsw_pci_cqe_rdq_handle(mlxsw_pci, rdq,
+               mlxsw_pci_cqe_rdq_handle(mlxsw_pci, napi, rdq,
                                         wqe_counter, q->u.cq.v, cqe);
 
                if (++work_done == budget)
 
        u64_stats_update_end(&pcpu_stats->syncp);
 
        skb->protocol = eth_type_trans(skb, skb->dev);
-       netif_receive_skb(skb);
+       napi_gro_receive(mlxsw_skb_cb(skb)->rx_md_info.napi, skb);
 }
 
 static void mlxsw_sp_rx_listener_mark_func(struct sk_buff *skb, u16 local_port,
 
        if (err)
                return;
 
-       netif_receive_skb(skb);
+       napi_gro_receive(mlxsw_skb_cb(skb)->rx_md_info.napi, skb);
 }
 
 static void mlxsw_sp_rx_mark_listener(struct sk_buff *skb, u16 local_port,