if (need_reset && prog)
                for (i = 0; i < vsi->num_queue_pairs; i++)
                        if (vsi->xdp_rings[i]->xsk_umem)
-                               (void)i40e_xsk_async_xmit(vsi->netdev, i);
+                               (void)i40e_xsk_wakeup(vsi->netdev, i,
+                                                     XDP_WAKEUP_RX);
 
        return 0;
 }
        .ndo_bridge_setlink     = i40e_ndo_bridge_setlink,
        .ndo_bpf                = i40e_xdp,
        .ndo_xdp_xmit           = i40e_xdp_xmit,
-       .ndo_xsk_async_xmit     = i40e_xsk_async_xmit,
+       .ndo_xsk_wakeup         = i40e_xsk_wakeup,
        .ndo_dfwd_add_station   = i40e_fwd_add,
        .ndo_dfwd_del_station   = i40e_fwd_del,
 };
 
                        return err;
 
                /* Kick start the NAPI context so that receiving will start */
-               err = i40e_xsk_async_xmit(vsi->netdev, qid);
+               err = i40e_xsk_wakeup(vsi->netdev, qid, XDP_WAKEUP_RX);
                if (err)
                        return err;
        }
 }
 
 /**
- * i40e_xsk_async_xmit - Implements the ndo_xsk_async_xmit
+ * i40e_xsk_wakeup - Implements the ndo_xsk_wakeup
  * @dev: the netdevice
  * @queue_id: queue id to wake up
+ * @flags: ignored in our case since we have Rx and Tx in the same NAPI.
  *
  * Returns <0 for errors, 0 otherwise.
  **/
-int i40e_xsk_async_xmit(struct net_device *dev, u32 queue_id)
+int i40e_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags)
 {
        struct i40e_netdev_priv *np = netdev_priv(dev);
        struct i40e_vsi *vsi = np->vsi;
 
 
 bool i40e_clean_xdp_tx_irq(struct i40e_vsi *vsi,
                           struct i40e_ring *tx_ring, int napi_budget);
-int i40e_xsk_async_xmit(struct net_device *dev, u32 queue_id);
+int i40e_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags);
 
 #endif /* _I40E_XSK_H_ */
 
        if (need_reset && prog)
                for (i = 0; i < adapter->num_rx_queues; i++)
                        if (adapter->xdp_ring[i]->xsk_umem)
-                               (void)ixgbe_xsk_async_xmit(adapter->netdev, i);
+                               (void)ixgbe_xsk_wakeup(adapter->netdev, i,
+                                                      XDP_WAKEUP_RX);
 
        return 0;
 }
        .ndo_features_check     = ixgbe_features_check,
        .ndo_bpf                = ixgbe_xdp,
        .ndo_xdp_xmit           = ixgbe_xdp_xmit,
-       .ndo_xsk_async_xmit     = ixgbe_xsk_async_xmit,
+       .ndo_xsk_wakeup         = ixgbe_xsk_wakeup,
 };
 
 static void ixgbe_disable_txr_hw(struct ixgbe_adapter *adapter,
 
 void ixgbe_xsk_clean_rx_ring(struct ixgbe_ring *rx_ring);
 bool ixgbe_clean_xdp_tx_irq(struct ixgbe_q_vector *q_vector,
                            struct ixgbe_ring *tx_ring, int napi_budget);
-int ixgbe_xsk_async_xmit(struct net_device *dev, u32 queue_id);
+int ixgbe_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags);
 void ixgbe_xsk_clean_tx_ring(struct ixgbe_ring *tx_ring);
 
 #endif /* #define _IXGBE_TXRX_COMMON_H_ */
 
                ixgbe_txrx_ring_enable(adapter, qid);
 
                /* Kick start the NAPI context so that receiving will start */
-               err = ixgbe_xsk_async_xmit(adapter->netdev, qid);
+               err = ixgbe_xsk_wakeup(adapter->netdev, qid, XDP_WAKEUP_RX);
                if (err)
                        return err;
        }
        return budget > 0 && xmit_done;
 }
 
-int ixgbe_xsk_async_xmit(struct net_device *dev, u32 qid)
+int ixgbe_xsk_wakeup(struct net_device *dev, u32 qid, u32 flags)
 {
        struct ixgbe_adapter *adapter = netdev_priv(dev);
        struct ixgbe_ring *ring;
 
 #include "en/params.h"
 #include <net/xdp_sock.h>
 
-int mlx5e_xsk_async_xmit(struct net_device *dev, u32 qid)
+int mlx5e_xsk_wakeup(struct net_device *dev, u32 qid, u32 flags)
 {
        struct mlx5e_priv *priv = netdev_priv(dev);
        struct mlx5e_params *params = &priv->channels.params;
 
 
 /* TX data path */
 
-int mlx5e_xsk_async_xmit(struct net_device *dev, u32 qid);
+int mlx5e_xsk_wakeup(struct net_device *dev, u32 qid, u32 flags);
 
 bool mlx5e_xsk_tx(struct mlx5e_xdpsq *sq, unsigned int budget);
 
 
        .ndo_tx_timeout          = mlx5e_tx_timeout,
        .ndo_bpf                 = mlx5e_xdp,
        .ndo_xdp_xmit            = mlx5e_xdp_xmit,
-       .ndo_xsk_async_xmit      = mlx5e_xsk_async_xmit,
+       .ndo_xsk_wakeup          = mlx5e_xsk_wakeup,
 #ifdef CONFIG_MLX5_EN_ARFS
        .ndo_rx_flow_steer       = mlx5e_rx_flow_steer,
 #endif
 
        };
 };
 
+/* Flags for ndo_xsk_wakeup. */
+#define XDP_WAKEUP_RX (1 << 0)
+#define XDP_WAKEUP_TX (1 << 1)
+
 #ifdef CONFIG_XFRM_OFFLOAD
 struct xfrmdev_ops {
        int     (*xdo_dev_state_add) (struct xfrm_state *x);
  *     that got dropped are freed/returned via xdp_return_frame().
  *     Returns negative number, means general error invoking ndo, meaning
  *     no frames were xmit'ed and core-caller will free all frames.
+ * int (*ndo_xsk_wakeup)(struct net_device *dev, u32 queue_id, u32 flags);
+ *      This function is used to wake up the softirq, ksoftirqd or kthread
+ *     responsible for sending and/or receiving packets on a specific
+ *     queue id bound to an AF_XDP socket. The flags field specifies if
+ *     only RX, only Tx, or both should be woken up using the flags
+ *     XDP_WAKEUP_RX and XDP_WAKEUP_TX.
  * struct devlink_port *(*ndo_get_devlink_port)(struct net_device *dev);
  *     Get devlink port instance associated with a given netdev.
  *     Called with a reference on the netdevice and devlink locks only,
        int                     (*ndo_xdp_xmit)(struct net_device *dev, int n,
                                                struct xdp_frame **xdp,
                                                u32 flags);
-       int                     (*ndo_xsk_async_xmit)(struct net_device *dev,
-                                                     u32 queue_id);
+       int                     (*ndo_xsk_wakeup)(struct net_device *dev,
+                                                 u32 queue_id, u32 flags);
        struct devlink_port *   (*ndo_get_devlink_port)(struct net_device *dev);
 };
 
 
                /* For copy-mode, we are done. */
                return 0;
 
-       if (!dev->netdev_ops->ndo_bpf ||
-           !dev->netdev_ops->ndo_xsk_async_xmit) {
+       if (!dev->netdev_ops->ndo_bpf || !dev->netdev_ops->ndo_xsk_wakeup) {
                err = -EOPNOTSUPP;
                goto err_unreg_umem;
        }
 
        struct xdp_sock *xs = xdp_sk(sk);
        struct net_device *dev = xs->dev;
 
-       return dev->netdev_ops->ndo_xsk_async_xmit(dev, xs->queue_id);
+       return dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id,
+                                              XDP_WAKEUP_TX);
 }
 
 static void xsk_destruct_skb(struct sk_buff *skb)