net: atlantic: Implement .ndo_xdp_xmit handler
[platform/kernel/linux-starfive.git] / drivers / net / ethernet / aquantia / atlantic / aq_ring.c
index 9bb9b76..ea74021 100644 (file)
@@ -389,6 +389,29 @@ static void aq_rx_checksum(struct aq_ring_s *self,
                __skb_incr_checksum_unnecessary(skb);
 }
 
+int aq_xdp_xmit(struct net_device *dev, int num_frames,
+               struct xdp_frame **frames, u32 flags)
+{
+       struct aq_nic_s *aq_nic = netdev_priv(dev);
+       unsigned int vec, i, drop = 0;
+       int cpu = smp_processor_id();
+       struct aq_nic_cfg_s *aq_cfg;
+       struct aq_ring_s *ring;
+
+       aq_cfg = aq_nic_get_cfg(aq_nic);
+       vec = cpu % aq_cfg->vecs;
+       ring = aq_nic->aq_ring_tx[AQ_NIC_CFG_TCVEC2RING(aq_cfg, 0, vec)];
+
+       for (i = 0; i < num_frames; i++) {
+               struct xdp_frame *xdpf = frames[i];
+
+               if (aq_nic_xmit_xdpf(aq_nic, ring, xdpf) == NETDEV_TX_BUSY)
+                       drop++;
+       }
+
+       return num_frames - drop;
+}
+
 static struct sk_buff *aq_xdp_run_prog(struct aq_nic_s *aq_nic,
                                       struct xdp_buff *xdp,
                                       struct aq_ring_s *rx_ring,