}
 
 static int ipoib_get_coalesce(struct net_device *dev,
-                             struct ethtool_coalesce *coal)
+                             struct ethtool_coalesce *coal,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct ipoib_dev_priv *priv = ipoib_priv(dev);
 
 }
 
 static int ipoib_set_coalesce(struct net_device *dev,
-                             struct ethtool_coalesce *coal)
+                             struct ethtool_coalesce *coal,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct ipoib_dev_priv *priv = ipoib_priv(dev);
        int ret;
 
 }
 
 static int ena_get_coalesce(struct net_device *net_dev,
-                           struct ethtool_coalesce *coalesce)
+                           struct ethtool_coalesce *coalesce,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct ena_adapter *adapter = netdev_priv(net_dev);
        struct ena_com_dev *ena_dev = adapter->ena_dev;
 }
 
 static int ena_set_coalesce(struct net_device *net_dev,
-                           struct ethtool_coalesce *coalesce)
+                           struct ethtool_coalesce *coalesce,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct ena_adapter *adapter = netdev_priv(net_dev);
        struct ena_com_dev *ena_dev = adapter->ena_dev;
 
 }
 
 static int xgbe_get_coalesce(struct net_device *netdev,
-                            struct ethtool_coalesce *ec)
+                            struct ethtool_coalesce *ec,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct xgbe_prv_data *pdata = netdev_priv(netdev);
 
 }
 
 static int xgbe_set_coalesce(struct net_device *netdev,
-                            struct ethtool_coalesce *ec)
+                            struct ethtool_coalesce *ec,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct xgbe_prv_data *pdata = netdev_priv(netdev);
        struct xgbe_hw_if *hw_if = &pdata->hw_if;
 
 }
 
 static int aq_ethtool_get_coalesce(struct net_device *ndev,
-                                  struct ethtool_coalesce *coal)
+                                  struct ethtool_coalesce *coal,
+                                  struct kernel_ethtool_coalesce *kernel_coal,
+                                  struct netlink_ext_ack *extack)
 {
        struct aq_nic_s *aq_nic = netdev_priv(ndev);
        struct aq_nic_cfg_s *cfg;
 }
 
 static int aq_ethtool_set_coalesce(struct net_device *ndev,
-                                  struct ethtool_coalesce *coal)
+                                  struct ethtool_coalesce *coal,
+                                  struct kernel_ethtool_coalesce *kernel_coal,
+                                  struct netlink_ext_ack *extack)
 {
        struct aq_nic_s *aq_nic = netdev_priv(ndev);
        struct aq_nic_cfg_s *cfg;
 
 }
 
 static int bcm_sysport_get_coalesce(struct net_device *dev,
-                                   struct ethtool_coalesce *ec)
+                                   struct ethtool_coalesce *ec,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct bcm_sysport_priv *priv = netdev_priv(dev);
        u32 reg;
 }
 
 static int bcm_sysport_set_coalesce(struct net_device *dev,
-                                   struct ethtool_coalesce *ec)
+                                   struct ethtool_coalesce *ec,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct bcm_sysport_priv *priv = netdev_priv(dev);
        struct dim_cq_moder moder;
 
        return rc;
 }
 
-static int
-bnx2_get_coalesce(struct net_device *dev, struct ethtool_coalesce *coal)
+static int bnx2_get_coalesce(struct net_device *dev,
+                            struct ethtool_coalesce *coal,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct bnx2 *bp = netdev_priv(dev);
 
        return 0;
 }
 
-static int
-bnx2_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal)
+static int bnx2_set_coalesce(struct net_device *dev,
+                            struct ethtool_coalesce *coal,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct bnx2 *bp = netdev_priv(dev);
 
 
 }
 
 static int bnx2x_get_coalesce(struct net_device *dev,
-                             struct ethtool_coalesce *coal)
+                             struct ethtool_coalesce *coal,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct bnx2x *bp = netdev_priv(dev);
 
 }
 
 static int bnx2x_set_coalesce(struct net_device *dev,
-                             struct ethtool_coalesce *coal)
+                             struct ethtool_coalesce *coal,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct bnx2x *bp = netdev_priv(dev);
 
 
 }
 
 static int bnxt_get_coalesce(struct net_device *dev,
-                            struct ethtool_coalesce *coal)
+                            struct ethtool_coalesce *coal,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct bnxt *bp = netdev_priv(dev);
        struct bnxt_coal *hw_coal;
 }
 
 static int bnxt_set_coalesce(struct net_device *dev,
-                            struct ethtool_coalesce *coal)
+                            struct ethtool_coalesce *coal,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct bnxt *bp = netdev_priv(dev);
        bool update_stats = false;
 
 }
 
 static int bcmgenet_get_coalesce(struct net_device *dev,
-                                struct ethtool_coalesce *ec)
+                                struct ethtool_coalesce *ec,
+                                struct kernel_ethtool_coalesce *kernel_coal,
+                                struct netlink_ext_ack *extack)
 {
        struct bcmgenet_priv *priv = netdev_priv(dev);
        struct bcmgenet_rx_ring *ring;
 }
 
 static int bcmgenet_set_coalesce(struct net_device *dev,
-                                struct ethtool_coalesce *ec)
+                                struct ethtool_coalesce *ec,
+                                struct kernel_ethtool_coalesce *kernel_coal,
+                                struct netlink_ext_ack *extack)
 {
        struct bcmgenet_priv *priv = netdev_priv(dev);
        unsigned int i;
 
        return -EOPNOTSUPP;
 }
 
-static int tg3_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
+static int tg3_get_coalesce(struct net_device *dev,
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct tg3 *tp = netdev_priv(dev);
 
        return 0;
 }
 
-static int tg3_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
+static int tg3_set_coalesce(struct net_device *dev,
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct tg3 *tp = netdev_priv(dev);
        u32 max_rxcoal_tick_int = 0, max_txcoal_tick_int = 0;
 
        wolinfo->wolopts = 0;
 }
 
-static int
-bnad_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
+static int bnad_get_coalesce(struct net_device *netdev,
+                            struct ethtool_coalesce *coalesce,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct bnad *bnad = netdev_priv(netdev);
        unsigned long flags;
        return 0;
 }
 
-static int
-bnad_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
+static int bnad_set_coalesce(struct net_device *netdev,
+                            struct ethtool_coalesce *coalesce,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct bnad *bnad = netdev_priv(netdev);
        unsigned long flags;
 
 }
 
 static int lio_get_intr_coalesce(struct net_device *netdev,
-                                struct ethtool_coalesce *intr_coal)
+                                struct ethtool_coalesce *intr_coal,
+                                struct kernel_ethtool_coalesce *kernel_coal,
+                                struct netlink_ext_ack *extack)
 {
        struct lio *lio = GET_LIO(netdev);
        struct octeon_device *oct = lio->oct_dev;
 }
 
 static int lio_set_intr_coalesce(struct net_device *netdev,
-                                struct ethtool_coalesce *intr_coal)
+                                struct ethtool_coalesce *intr_coal,
+                                struct kernel_ethtool_coalesce *kernel_coal,
+                                struct netlink_ext_ack *extack)
 {
        struct lio *lio = GET_LIO(netdev);
        int ret;
 
 }
 
 static int nicvf_get_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *cmd)
+                             struct ethtool_coalesce *cmd,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct nicvf *nic = netdev_priv(netdev);
 
 
        return 0;
 }
 
-static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
+static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c,
+                       struct kernel_ethtool_coalesce *kernel_coal,
+                       struct netlink_ext_ack *extack)
 {
        struct adapter *adapter = dev->ml_priv;
 
        return 0;
 }
 
-static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
+static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c,
+                       struct kernel_ethtool_coalesce *kernel_coal,
+                       struct netlink_ext_ack *extack)
 {
        struct adapter *adapter = dev->ml_priv;
 
 
        return 0;
 }
 
-static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
+static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c,
+                       struct kernel_ethtool_coalesce *kernel_coal,
+                       struct netlink_ext_ack *extack)
 {
        struct port_info *pi = netdev_priv(dev);
        struct adapter *adapter = pi->adapter;
        return 0;
 }
 
-static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
+static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c,
+                       struct kernel_ethtool_coalesce *kernel_coal,
+                       struct netlink_ext_ack *extack)
 {
        struct port_info *pi = netdev_priv(dev);
        struct adapter *adapter = pi->adapter;
 
 }
 
 static int set_coalesce(struct net_device *dev,
-                       struct ethtool_coalesce *coalesce)
+                       struct ethtool_coalesce *coalesce,
+                       struct kernel_ethtool_coalesce *kernel_coal,
+                       struct netlink_ext_ack *extack)
 {
        int ret;
 
                                    coalesce->tx_coalesce_usecs);
 }
 
-static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
+static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c,
+                       struct kernel_ethtool_coalesce *kernel_coal,
+                       struct netlink_ext_ack *extack)
 {
        const struct port_info *pi = netdev_priv(dev);
        const struct adapter *adap = pi->adapter;
 
  * interrupt holdoff timer to be read on all of the device's Queue Sets.
  */
 static int cxgb4vf_get_coalesce(struct net_device *dev,
-                               struct ethtool_coalesce *coalesce)
+                               struct ethtool_coalesce *coalesce,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        const struct port_info *pi = netdev_priv(dev);
        const struct adapter *adapter = pi->adapter;
  * the interrupt holdoff timer on any of the device's Queue Sets.
  */
 static int cxgb4vf_set_coalesce(struct net_device *dev,
-                               struct ethtool_coalesce *coalesce)
+                               struct ethtool_coalesce *coalesce,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        const struct port_info *pi = netdev_priv(dev);
        struct adapter *adapter = pi->adapter;
 
 }
 
 static int enic_get_coalesce(struct net_device *netdev,
-       struct ethtool_coalesce *ecmd)
+                            struct ethtool_coalesce *ecmd,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct enic *enic = netdev_priv(netdev);
        struct enic_rx_coal *rxcoal = &enic->rx_coalesce_setting;
 }
 
 static int enic_set_coalesce(struct net_device *netdev,
-       struct ethtool_coalesce *ecmd)
+                            struct ethtool_coalesce *ecmd,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct enic *enic = netdev_priv(netdev);
        u32 tx_coalesce_usecs;
 
 }
 
 static int gmac_get_coalesce(struct net_device *netdev,
-                            struct ethtool_coalesce *ecmd)
+                            struct ethtool_coalesce *ecmd,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct gemini_ethernet_port *port = netdev_priv(netdev);
 
 }
 
 static int gmac_set_coalesce(struct net_device *netdev,
-                            struct ethtool_coalesce *ecmd)
+                            struct ethtool_coalesce *ecmd,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct gemini_ethernet_port *port = netdev_priv(netdev);
 
 
 }
 
 static int be_get_coalesce(struct net_device *netdev,
-                          struct ethtool_coalesce *et)
+                          struct ethtool_coalesce *et,
+                          struct kernel_ethtool_coalesce *kernel_coal,
+                          struct netlink_ext_ack *extack)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
        struct be_aic_obj *aic = &adapter->aic_obj[0];
  * eqd cmd is issued in the worker thread.
  */
 static int be_set_coalesce(struct net_device *netdev,
-                          struct ethtool_coalesce *et)
+                          struct ethtool_coalesce *et,
+                          struct kernel_ethtool_coalesce *kernel_coal,
+                          struct netlink_ext_ack *extack)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
        struct be_aic_obj *aic = &adapter->aic_obj[0];
 
 }
 
 static int dpaa_get_coalesce(struct net_device *dev,
-                            struct ethtool_coalesce *c)
+                            struct ethtool_coalesce *c,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct qman_portal *portal;
        u32 period;
 }
 
 static int dpaa_set_coalesce(struct net_device *dev,
-                            struct ethtool_coalesce *c)
+                            struct ethtool_coalesce *c,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        const cpumask_t *cpus = qman_affine_cpus();
        bool needs_revert[NR_CPUS] = {false};
 
 }
 
 static int enetc_get_coalesce(struct net_device *ndev,
-                             struct ethtool_coalesce *ic)
+                             struct ethtool_coalesce *ic,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct enetc_ndev_priv *priv = netdev_priv(ndev);
        struct enetc_int_vector *v = priv->int_vector[0];
 }
 
 static int enetc_set_coalesce(struct net_device *ndev,
-                             struct ethtool_coalesce *ic)
+                             struct ethtool_coalesce *ic,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct enetc_ndev_priv *priv = netdev_priv(ndev);
        u32 rx_ictt, tx_ictt;
 
        }
 }
 
-static int
-fec_enet_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *ec)
+static int fec_enet_get_coalesce(struct net_device *ndev,
+                                struct ethtool_coalesce *ec,
+                                struct kernel_ethtool_coalesce *kernel_coal,
+                                struct netlink_ext_ack *extack)
 {
        struct fec_enet_private *fep = netdev_priv(ndev);
 
        return 0;
 }
 
-static int
-fec_enet_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *ec)
+static int fec_enet_set_coalesce(struct net_device *ndev,
+                                struct ethtool_coalesce *ec,
+                                struct kernel_ethtool_coalesce *kernel_coal,
+                                struct netlink_ext_ack *extack)
 {
        struct fec_enet_private *fep = netdev_priv(ndev);
        struct device *dev = &fep->pdev->dev;
        ec.tx_coalesce_usecs = FEC_ITR_ICTT_DEFAULT;
        ec.tx_max_coalesced_frames = FEC_ITR_ICFT_DEFAULT;
 
-       fec_enet_set_coalesce(ndev, &ec);
+       fec_enet_set_coalesce(ndev, &ec, NULL, NULL);
 }
 
 static int fec_enet_get_tunable(struct net_device *netdev,
 
 /* Get the coalescing parameters, and put them in the cvals
  * structure.  */
 static int gfar_gcoalesce(struct net_device *dev,
-                         struct ethtool_coalesce *cvals)
+                         struct ethtool_coalesce *cvals,
+                         struct kernel_ethtool_coalesce *kernel_coal,
+                         struct netlink_ext_ack *extack)
 {
        struct gfar_private *priv = netdev_priv(dev);
        struct gfar_priv_rx_q *rx_queue = NULL;
  * in order for coalescing to be active
  */
 static int gfar_scoalesce(struct net_device *dev,
-                         struct ethtool_coalesce *cvals)
+                         struct ethtool_coalesce *cvals,
+                         struct kernel_ethtool_coalesce *kernel_coal,
+                         struct netlink_ext_ack *extack)
 {
        struct gfar_private *priv = netdev_priv(dev);
        int i, err = 0;
 
 }
 
 static int hip04_get_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct hip04_priv *priv = netdev_priv(netdev);
 
 }
 
 static int hip04_set_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct hip04_priv *priv = netdev_priv(netdev);
 
 
  * hns_get_coalesce - get coalesce info.
  * @net_dev: net device
  * @ec: coalesce info.
+ * @kernel_coal: ethtool CQE mode setting structure
+ * @extack: extack for reporting error messages
  *
  * Return 0 on success, negative on failure.
  */
 static int hns_get_coalesce(struct net_device *net_dev,
-                           struct ethtool_coalesce *ec)
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct hns_nic_priv *priv = netdev_priv(net_dev);
        struct hnae_ae_ops *ops;
  * hns_set_coalesce - set coalesce info.
  * @net_dev: net device
  * @ec: coalesce info.
+ * @kernel_coal: ethtool CQE mode setting structure
+ * @extack: extack for reporting error messages
  *
  * Return 0 on success, negative on failure.
  */
 static int hns_set_coalesce(struct net_device *net_dev,
-                           struct ethtool_coalesce *ec)
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct hns_nic_priv *priv = netdev_priv(net_dev);
        struct hnae_ae_ops *ops;
 
 }
 
 static int hns3_get_coalesce(struct net_device *netdev,
-                            struct ethtool_coalesce *cmd)
+                            struct ethtool_coalesce *cmd,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct hns3_nic_priv *priv = netdev_priv(netdev);
        struct hns3_enet_coalesce *tx_coal = &priv->tx_coal;
 }
 
 static int hns3_set_coalesce(struct net_device *netdev,
-                            struct ethtool_coalesce *cmd)
+                            struct ethtool_coalesce *cmd,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct hnae3_handle *h = hns3_get_handle(netdev);
        struct hns3_nic_priv *priv = netdev_priv(netdev);
 
 }
 
 static int hinic_get_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *coal)
+                             struct ethtool_coalesce *coal,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        return __hinic_get_coalesce(netdev, coal, COALESCE_ALL_QUEUE);
 }
 
 static int hinic_set_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *coal)
+                             struct ethtool_coalesce *coal,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        return __hinic_set_coalesce(netdev, coal, COALESCE_ALL_QUEUE);
 }
 
 }
 
 static int e1000_get_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
 
 }
 
 static int e1000_set_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
        struct e1000_hw *hw = &adapter->hw;
 
 }
 
 static int e1000_get_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
 
 }
 
 static int e1000_set_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
 
 
 }
 
 static int fm10k_get_coalesce(struct net_device *dev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct fm10k_intfc *interface = netdev_priv(dev);
 
 }
 
 static int fm10k_set_coalesce(struct net_device *dev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct fm10k_intfc *interface = netdev_priv(dev);
        u16 tx_itr, rx_itr;
 
  * i40e_get_coalesce - get a netdev's coalesce settings
  * @netdev: the netdev to check
  * @ec: ethtool coalesce data structure
+ * @kernel_coal: ethtool CQE mode setting structure
+ * @extack: extack for reporting error messages
  *
  * Gets the coalesce settings for a particular netdev. Note that if user has
  * modified per-queue settings, this only guarantees to represent queue 0. See
  * __i40e_get_coalesce for more details.
  **/
 static int i40e_get_coalesce(struct net_device *netdev,
-                            struct ethtool_coalesce *ec)
+                            struct ethtool_coalesce *ec,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        return __i40e_get_coalesce(netdev, ec, -1);
 }
  * i40e_set_coalesce - set coalesce settings for every queue on the netdev
  * @netdev: the netdev to change
  * @ec: ethtool coalesce settings
+ * @kernel_coal: ethtool CQE mode setting structure
+ * @extack: extack for reporting error messages
  *
  * This will set each queue to the same coalesce settings.
  **/
 static int i40e_set_coalesce(struct net_device *netdev,
-                            struct ethtool_coalesce *ec)
+                            struct ethtool_coalesce *ec,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        return __i40e_set_coalesce(netdev, ec, -1);
 }
 
  * iavf_get_coalesce - Get interrupt coalescing settings
  * @netdev: network interface device structure
  * @ec: ethtool coalesce structure
+ * @kernel_coal: ethtool CQE mode setting structure
+ * @extack: extack for reporting error messages
  *
  * Returns current coalescing settings. This is referred to elsewhere in the
  * driver as Interrupt Throttle Rate, as this is how the hardware describes
  * only represents the settings of queue 0.
  **/
 static int iavf_get_coalesce(struct net_device *netdev,
-                            struct ethtool_coalesce *ec)
+                            struct ethtool_coalesce *ec,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        return __iavf_get_coalesce(netdev, ec, -1);
 }
  * iavf_set_coalesce - Set interrupt coalescing settings
  * @netdev: network interface device structure
  * @ec: ethtool coalesce structure
+ * @kernel_coal: ethtool CQE mode setting structure
+ * @extack: extack for reporting error messages
  *
  * Change current coalescing settings for every queue.
  **/
 static int iavf_set_coalesce(struct net_device *netdev,
-                            struct ethtool_coalesce *ec)
+                            struct ethtool_coalesce *ec,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        return __iavf_set_coalesce(netdev, ec, -1);
 }
 
        return 0;
 }
 
-static int
-ice_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *ec)
+static int ice_get_coalesce(struct net_device *netdev,
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        return __ice_get_coalesce(netdev, ec, -1);
 }
        return 0;
 }
 
-static int
-ice_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *ec)
+static int ice_set_coalesce(struct net_device *netdev,
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        return __ice_set_coalesce(netdev, ec, -1);
 }
 
 }
 
 static int igb_set_coalesce(struct net_device *netdev,
-                           struct ethtool_coalesce *ec)
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct igb_adapter *adapter = netdev_priv(netdev);
        int i;
 }
 
 static int igb_get_coalesce(struct net_device *netdev,
-                           struct ethtool_coalesce *ec)
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct igb_adapter *adapter = netdev_priv(netdev);
 
 
 }
 
 static int igbvf_get_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct igbvf_adapter *adapter = netdev_priv(netdev);
 
 }
 
 static int igbvf_set_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct igbvf_adapter *adapter = netdev_priv(netdev);
        struct e1000_hw *hw = &adapter->hw;
 
 }
 
 static int igc_ethtool_get_coalesce(struct net_device *netdev,
-                                   struct ethtool_coalesce *ec)
+                                   struct ethtool_coalesce *ec,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct igc_adapter *adapter = netdev_priv(netdev);
 
 }
 
 static int igc_ethtool_set_coalesce(struct net_device *netdev,
-                                   struct ethtool_coalesce *ec)
+                                   struct ethtool_coalesce *ec,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct igc_adapter *adapter = netdev_priv(netdev);
        int i;
 
 }
 
 static int ixgbe_get_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
 
 }
 
 static int ixgbe_set_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_q_vector *q_vector;
 
 }
 
 static int ixgbevf_get_coalesce(struct net_device *netdev,
-                               struct ethtool_coalesce *ec)
+                               struct ethtool_coalesce *ec,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        struct ixgbevf_adapter *adapter = netdev_priv(netdev);
 
 }
 
 static int ixgbevf_set_coalesce(struct net_device *netdev,
-                               struct ethtool_coalesce *ec)
+                               struct ethtool_coalesce *ec,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        struct ixgbevf_adapter *adapter = netdev_priv(netdev);
        struct ixgbevf_q_vector *q_vector;
 
        mdio_memcpy(jme, p32, JME_PHY_REG_NR);
 }
 
-static int
-jme_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *ecmd)
+static int jme_get_coalesce(struct net_device *netdev,
+                           struct ethtool_coalesce *ecmd,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct jme_adapter *jme = netdev_priv(netdev);
 
        return 0;
 }
 
-static int
-jme_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *ecmd)
+static int jme_set_coalesce(struct net_device *netdev,
+                           struct ethtool_coalesce *ecmd,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct jme_adapter *jme = netdev_priv(netdev);
        struct dynpcc_info *dpi = &(jme->dpi);
 
        strlcpy(drvinfo->bus_info, "platform", sizeof(drvinfo->bus_info));
 }
 
-static int
-mv643xx_eth_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
+static int mv643xx_eth_get_coalesce(struct net_device *dev,
+                                   struct ethtool_coalesce *ec,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct mv643xx_eth_private *mp = netdev_priv(dev);
 
        return 0;
 }
 
-static int
-mv643xx_eth_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
+static int mv643xx_eth_set_coalesce(struct net_device *dev,
+                                   struct ethtool_coalesce *ec,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct mv643xx_eth_private *mp = netdev_priv(dev);
 
 
 }
 
 /* Set interrupt coalescing for ethtools */
-static int mvneta_ethtool_set_coalesce(struct net_device *dev,
-                                      struct ethtool_coalesce *c)
+static int
+mvneta_ethtool_set_coalesce(struct net_device *dev,
+                           struct ethtool_coalesce *c,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct mvneta_port *pp = netdev_priv(dev);
        int queue;
 }
 
 /* get coalescing for ethtools */
-static int mvneta_ethtool_get_coalesce(struct net_device *dev,
-                                      struct ethtool_coalesce *c)
+static int
+mvneta_ethtool_get_coalesce(struct net_device *dev,
+                           struct ethtool_coalesce *c,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct mvneta_port *pp = netdev_priv(dev);
 
 
 }
 
 /* Set interrupt coalescing for ethtools */
-static int mvpp2_ethtool_set_coalesce(struct net_device *dev,
-                                     struct ethtool_coalesce *c)
+static int
+mvpp2_ethtool_set_coalesce(struct net_device *dev,
+                          struct ethtool_coalesce *c,
+                          struct kernel_ethtool_coalesce *kernel_coal,
+                          struct netlink_ext_ack *extack)
 {
        struct mvpp2_port *port = netdev_priv(dev);
        int queue;
 }
 
 /* get coalescing for ethtools */
-static int mvpp2_ethtool_get_coalesce(struct net_device *dev,
-                                     struct ethtool_coalesce *c)
+static int
+mvpp2_ethtool_get_coalesce(struct net_device *dev,
+                          struct ethtool_coalesce *c,
+                          struct kernel_ethtool_coalesce *kernel_coal,
+                          struct netlink_ext_ack *extack)
 {
        struct mvpp2_port *port = netdev_priv(dev);
 
 
 }
 
 static int otx2_get_coalesce(struct net_device *netdev,
-                            struct ethtool_coalesce *cmd)
+                            struct ethtool_coalesce *cmd,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct otx2_nic *pfvf = netdev_priv(netdev);
        struct otx2_hw *hw = &pfvf->hw;
 }
 
 static int otx2_set_coalesce(struct net_device *netdev,
-                            struct ethtool_coalesce *ec)
+                            struct ethtool_coalesce *ec,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct otx2_nic *pfvf = netdev_priv(netdev);
        struct otx2_hw *hw = &pfvf->hw;
 
 }
 
 static int skge_get_coalesce(struct net_device *dev,
-                            struct ethtool_coalesce *ecmd)
+                            struct ethtool_coalesce *ecmd,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct skge_port *skge = netdev_priv(dev);
        struct skge_hw *hw = skge->hw;
 
 /* Note: interrupt timer is per board, but can turn on/off per port */
 static int skge_set_coalesce(struct net_device *dev,
-                            struct ethtool_coalesce *ecmd)
+                            struct ethtool_coalesce *ecmd,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct skge_port *skge = netdev_priv(dev);
        struct skge_hw *hw = skge->hw;
 
 }
 
 static int sky2_get_coalesce(struct net_device *dev,
-                            struct ethtool_coalesce *ecmd)
+                            struct ethtool_coalesce *ecmd,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct sky2_port *sky2 = netdev_priv(dev);
        struct sky2_hw *hw = sky2->hw;
 
 /* Note: this affect both ports */
 static int sky2_set_coalesce(struct net_device *dev,
-                            struct ethtool_coalesce *ecmd)
+                            struct ethtool_coalesce *ecmd,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct sky2_port *sky2 = netdev_priv(dev);
        struct sky2_hw *hw = sky2->hw;
 
 }
 
 static int mlx4_en_get_coalesce(struct net_device *dev,
-                             struct ethtool_coalesce *coal)
+                               struct ethtool_coalesce *coal,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        struct mlx4_en_priv *priv = netdev_priv(dev);
 
 }
 
 static int mlx4_en_set_coalesce(struct net_device *dev,
-                             struct ethtool_coalesce *coal)
+                               struct ethtool_coalesce *coal,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        struct mlx4_en_priv *priv = netdev_priv(dev);
 
 
 }
 
 static int mlx5e_get_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *coal)
+                             struct ethtool_coalesce *coal,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct mlx5e_priv *priv = netdev_priv(netdev);
 
 }
 
 static int mlx5e_set_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *coal)
+                             struct ethtool_coalesce *coal,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct mlx5e_priv *priv    = netdev_priv(netdev);
 
 
 }
 
 static int mlx5e_rep_get_coalesce(struct net_device *netdev,
-                                 struct ethtool_coalesce *coal)
+                                 struct ethtool_coalesce *coal,
+                                 struct kernel_ethtool_coalesce *kernel_coal,
+                                 struct netlink_ext_ack *extack)
 {
        struct mlx5e_priv *priv = netdev_priv(netdev);
 
 }
 
 static int mlx5e_rep_set_coalesce(struct net_device *netdev,
-                                 struct ethtool_coalesce *coal)
+                                 struct ethtool_coalesce *coal,
+                                 struct kernel_ethtool_coalesce *kernel_coal,
+                                 struct netlink_ext_ack *extack)
 {
        struct mlx5e_priv *priv = netdev_priv(netdev);
 
 
 }
 
 static int mlx5i_set_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *coal)
+                             struct ethtool_coalesce *coal,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct mlx5e_priv *priv = mlx5i_epriv(netdev);
 
 }
 
 static int mlx5i_get_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *coal)
+                             struct ethtool_coalesce *coal,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct mlx5e_priv *priv = mlx5i_epriv(netdev);
 
 
        strlcpy(info->bus_info, pci_name(mgp->pdev), sizeof(info->bus_info));
 }
 
-static int
-myri10ge_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coal)
+static int myri10ge_get_coalesce(struct net_device *netdev,
+                                struct ethtool_coalesce *coal,
+                                struct kernel_ethtool_coalesce *kernel_coal,
+                                struct netlink_ext_ack *extack)
 {
        struct myri10ge_priv *mgp = netdev_priv(netdev);
 
        return 0;
 }
 
-static int
-myri10ge_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coal)
+static int myri10ge_set_coalesce(struct net_device *netdev,
+                                struct ethtool_coalesce *coal,
+                                struct kernel_ethtool_coalesce *kernel_coal,
+                                struct netlink_ext_ack *extack)
 {
        struct myri10ge_priv *mgp = netdev_priv(netdev);
 
 
 }
 
 static int nfp_net_get_coalesce(struct net_device *netdev,
-                               struct ethtool_coalesce *ec)
+                               struct ethtool_coalesce *ec,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        struct nfp_net *nn = netdev_priv(netdev);
 
 }
 
 static int nfp_net_set_coalesce(struct net_device *netdev,
-                               struct ethtool_coalesce *ec)
+                               struct ethtool_coalesce *ec,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        struct nfp_net *nn = netdev_priv(netdev);
        unsigned int factor;
 
        strlcpy(ed->bus_info, "platform", sizeof(ed->bus_info));
 }
 
-static int nixge_ethtools_get_coalesce(struct net_device *ndev,
-                                      struct ethtool_coalesce *ecoalesce)
+static int
+nixge_ethtools_get_coalesce(struct net_device *ndev,
+                           struct ethtool_coalesce *ecoalesce,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct nixge_priv *priv = netdev_priv(ndev);
        u32 regval = 0;
        return 0;
 }
 
-static int nixge_ethtools_set_coalesce(struct net_device *ndev,
-                                      struct ethtool_coalesce *ecoalesce)
+static int
+nixge_ethtools_set_coalesce(struct net_device *ndev,
+                           struct ethtool_coalesce *ecoalesce,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct nixge_priv *priv = netdev_priv(ndev);
 
 
 }
 
 static int ionic_get_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *coalesce)
+                             struct ethtool_coalesce *coalesce,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct ionic_lif *lif = netdev_priv(netdev);
 
 }
 
 static int ionic_set_coalesce(struct net_device *netdev,
-                             struct ethtool_coalesce *coalesce)
+                             struct ethtool_coalesce *coalesce,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct ionic_lif *lif = netdev_priv(netdev);
        struct ionic_identity *ident;
 
  * firmware coalescing to default.
  */
 static int netxen_set_intr_coalesce(struct net_device *netdev,
-                       struct ethtool_coalesce *ethcoal)
+                                   struct ethtool_coalesce *ethcoal,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct netxen_adapter *adapter = netdev_priv(netdev);
 
 }
 
 static int netxen_get_intr_coalesce(struct net_device *netdev,
-                       struct ethtool_coalesce *ethcoal)
+                                   struct ethtool_coalesce *ethcoal,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct netxen_adapter *adapter = netdev_priv(netdev);
 
 
                            struct flow_cls_offload *f);
 
 void qede_forced_speed_maps_init(void);
-int qede_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal);
+int qede_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal,
+                     struct kernel_ethtool_coalesce *kernel_coal,
+                     struct netlink_ext_ack *extack);
 int qede_set_per_coalesce(struct net_device *dev, u32 queue,
                          struct ethtool_coalesce *coal);
 
 
 }
 
 static int qede_get_coalesce(struct net_device *dev,
-                            struct ethtool_coalesce *coal)
+                            struct ethtool_coalesce *coal,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        void *rx_handle = NULL, *tx_handle = NULL;
        struct qede_dev *edev = netdev_priv(dev);
        return rc;
 }
 
-int qede_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal)
+int qede_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal,
+                     struct kernel_ethtool_coalesce *kernel_coal,
+                     struct netlink_ext_ack *extack)
 {
        struct qede_dev *edev = netdev_priv(dev);
        struct qede_fastpath *fp;
 
  * firmware coalescing to default.
  */
 static int qlcnic_set_intr_coalesce(struct net_device *netdev,
-                       struct ethtool_coalesce *ethcoal)
+                                   struct ethtool_coalesce *ethcoal,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct qlcnic_adapter *adapter = netdev_priv(netdev);
        int err;
 }
 
 static int qlcnic_get_intr_coalesce(struct net_device *netdev,
-                       struct ethtool_coalesce *ethcoal)
+                                   struct ethtool_coalesce *ethcoal,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct qlcnic_adapter *adapter = netdev_priv(netdev);
 
 
        return ERR_PTR(-ELNRNG);
 }
 
-static int rtl_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
+static int rtl_get_coalesce(struct net_device *dev,
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
        const struct rtl_coalesce_info *ci;
        return -ERANGE;
 }
 
-static int rtl_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
+static int rtl_set_coalesce(struct net_device *dev,
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
        u32 tx_fr = ec->tx_max_coalesced_frames;
 
 }
 
 static int sxgbe_get_coalesce(struct net_device *dev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct sxgbe_priv_data *priv = netdev_priv(dev);
 
 }
 
 static int sxgbe_set_coalesce(struct net_device *dev,
-                             struct ethtool_coalesce *ec)
+                             struct ethtool_coalesce *ec,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct sxgbe_priv_data *priv = netdev_priv(dev);
        unsigned int rx_riwt;
 
  */
 
 static int efx_ethtool_get_coalesce(struct net_device *net_dev,
-                                   struct ethtool_coalesce *coalesce)
+                                   struct ethtool_coalesce *coalesce,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct efx_nic *efx = netdev_priv(net_dev);
        unsigned int tx_usecs, rx_usecs;
 }
 
 static int efx_ethtool_set_coalesce(struct net_device *net_dev,
-                                   struct ethtool_coalesce *coalesce)
+                                   struct ethtool_coalesce *coalesce,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct efx_nic *efx = netdev_priv(net_dev);
        struct efx_channel *channel;
 
  */
 
 static int ef4_ethtool_get_coalesce(struct net_device *net_dev,
-                                   struct ethtool_coalesce *coalesce)
+                                   struct ethtool_coalesce *coalesce,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct ef4_nic *efx = netdev_priv(net_dev);
        unsigned int tx_usecs, rx_usecs;
 }
 
 static int ef4_ethtool_set_coalesce(struct net_device *net_dev,
-                                   struct ethtool_coalesce *coalesce)
+                                   struct ethtool_coalesce *coalesce,
+                                   struct kernel_ethtool_coalesce *kernel_coal,
+                                   struct netlink_ext_ack *extack)
 {
        struct ef4_nic *efx = netdev_priv(net_dev);
        struct ef4_channel *channel;
 
 }
 
 static int netsec_et_get_coalesce(struct net_device *net_device,
-                                 struct ethtool_coalesce *et_coalesce)
+                                 struct ethtool_coalesce *et_coalesce,
+                                 struct kernel_ethtool_coalesce *kernel_coal,
+                                 struct netlink_ext_ack *extack)
 {
        struct netsec_priv *priv = netdev_priv(net_device);
 
 }
 
 static int netsec_et_set_coalesce(struct net_device *net_device,
-                                 struct ethtool_coalesce *et_coalesce)
+                                 struct ethtool_coalesce *et_coalesce,
+                                 struct kernel_ethtool_coalesce *kernel_coal,
+                                 struct netlink_ext_ack *extack)
 {
        struct netsec_priv *priv = netdev_priv(net_device);
 
        netsec_write(priv, NETSEC_REG_NRM_RX_INTEN_CLR, ~0);
        netsec_write(priv, NETSEC_REG_NRM_TX_INTEN_CLR, ~0);
 
-       netsec_et_set_coalesce(priv->ndev, &priv->et_coalesce);
+       netsec_et_set_coalesce(priv->ndev, &priv->et_coalesce, NULL, NULL);
 
        if (netsec_mac_write(priv, GMAC_REG_OMR, value))
                return -ETIMEDOUT;
 
 }
 
 static int stmmac_get_coalesce(struct net_device *dev,
-                              struct ethtool_coalesce *ec)
+                              struct ethtool_coalesce *ec,
+                              struct kernel_ethtool_coalesce *kernel_coal,
+                              struct netlink_ext_ack *extack)
 {
        return __stmmac_get_coalesce(dev, ec, -1);
 }
 }
 
 static int stmmac_set_coalesce(struct net_device *dev,
-                              struct ethtool_coalesce *ec)
+                              struct ethtool_coalesce *ec,
+                              struct kernel_ethtool_coalesce *kernel_coal,
+                              struct netlink_ext_ack *extack)
 {
        return __stmmac_set_coalesce(dev, ec, -1);
 }
 
        channel->tx_count = pdata->tx_q_count;
 }
 
-static int xlgmac_ethtool_get_coalesce(struct net_device *netdev,
-                                      struct ethtool_coalesce *ec)
+static int
+xlgmac_ethtool_get_coalesce(struct net_device *netdev,
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct xlgmac_pdata *pdata = netdev_priv(netdev);
 
        return 0;
 }
 
-static int xlgmac_ethtool_set_coalesce(struct net_device *netdev,
-                                      struct ethtool_coalesce *ec)
+static int
+xlgmac_ethtool_set_coalesce(struct net_device *netdev,
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct xlgmac_pdata *pdata = netdev_priv(netdev);
        struct xlgmac_hw_ops *hw_ops = &pdata->hw_ops;
 
  * @netdev
  * @ecoal
  */
-static int
-bdx_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *ecoal)
+static int bdx_get_coalesce(struct net_device *netdev,
+                           struct ethtool_coalesce *ecoal,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        u32 rdintcm;
        u32 tdintcm;
  * @netdev
  * @ecoal
  */
-static int
-bdx_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *ecoal)
+static int bdx_set_coalesce(struct net_device *netdev,
+                           struct ethtool_coalesce *ecoal,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        u32 rdintcm;
        u32 tdintcm;
 
                struct ethtool_coalesce coal;
 
                coal.rx_coalesce_usecs = cpsw->coal_intvl;
-               cpsw_set_coalesce(ndev, &coal);
+               cpsw_set_coalesce(ndev, &coal, NULL, NULL);
        }
 
        cpdma_ctlr_start(cpsw->dma);
 
        priv->msg_enable = value;
 }
 
-int cpsw_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *coal)
+int cpsw_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *coal,
+                     struct kernel_ethtool_coalesce *kernel_coal,
+                     struct netlink_ext_ack *extack)
 {
        struct cpsw_common *cpsw = ndev_to_cpsw(ndev);
 
        return 0;
 }
 
-int cpsw_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *coal)
+int cpsw_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *coal,
+                     struct kernel_ethtool_coalesce *kernel_coal,
+                     struct netlink_ext_ack *extack)
 {
        struct cpsw_priv *priv = netdev_priv(ndev);
        u32 int_ctrl;
 
                struct ethtool_coalesce coal;
 
                coal.rx_coalesce_usecs = cpsw->coal_intvl;
-               cpsw_set_coalesce(ndev, &coal);
+               cpsw_set_coalesce(ndev, &coal, NULL, NULL);
        }
 
        cpdma_ctlr_start(cpsw->dma);
 
 /* ethtool */
 u32 cpsw_get_msglevel(struct net_device *ndev);
 void cpsw_set_msglevel(struct net_device *ndev, u32 value);
-int cpsw_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *coal);
-int cpsw_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *coal);
+int cpsw_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *coal,
+                     struct kernel_ethtool_coalesce *kernel_coal,
+                     struct netlink_ext_ack *extack);
+int cpsw_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *coal,
+                     struct kernel_ethtool_coalesce *kernel_coal,
+                     struct netlink_ext_ack *extack);
 int cpsw_get_sset_count(struct net_device *ndev, int sset);
 void cpsw_get_strings(struct net_device *ndev, u32 stringset, u8 *data);
 void cpsw_get_ethtool_stats(struct net_device *ndev,
 
  * emac_get_coalesce - Get interrupt coalesce settings for this device
  * @ndev : The DaVinci EMAC network adapter
  * @coal : ethtool coalesce settings structure
+ * @kernel_coal: ethtool CQE mode setting structure
+ * @extack: extack for reporting error messages
  *
  * Fetch the current interrupt coalesce settings
  *
  */
 static int emac_get_coalesce(struct net_device *ndev,
-                               struct ethtool_coalesce *coal)
+                            struct ethtool_coalesce *coal,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct emac_priv *priv = netdev_priv(ndev);
 
  * emac_set_coalesce - Set interrupt coalesce settings for this device
  * @ndev : The DaVinci EMAC network adapter
  * @coal : ethtool coalesce settings structure
+ * @kernel_coal: ethtool CQE mode setting structure
+ * @extack: extack for reporting error messages
  *
  * Set interrupt coalesce parameters
  *
  */
 static int emac_set_coalesce(struct net_device *ndev,
-                               struct ethtool_coalesce *coal)
+                            struct ethtool_coalesce *coal,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct emac_priv *priv = netdev_priv(ndev);
        u32 int_ctrl, num_interrupts = 0;
                struct ethtool_coalesce coal;
 
                coal.rx_coalesce_usecs = (priv->coal_intvl << 4);
-               emac_set_coalesce(ndev, &coal);
+               emac_set_coalesce(ndev, &coal, NULL, NULL);
        }
 
        cpdma_ctlr_start(priv->dma);
 
 
 
 static int velocity_get_coalesce(struct net_device *dev,
-               struct ethtool_coalesce *ecmd)
+                                struct ethtool_coalesce *ecmd,
+                                struct kernel_ethtool_coalesce *kernel_coal,
+                                struct netlink_ext_ack *extack)
 {
        struct velocity_info *vptr = netdev_priv(dev);
 
 }
 
 static int velocity_set_coalesce(struct net_device *dev,
-               struct ethtool_coalesce *ecmd)
+                                struct ethtool_coalesce *ecmd,
+                                struct kernel_ethtool_coalesce *kernel_coal,
+                                struct netlink_ext_ack *extack)
 {
        struct velocity_info *vptr = netdev_priv(dev);
        int max_us = 0x3f * 64;
 
        return 0;
 }
 
-static int ll_temac_ethtools_get_coalesce(struct net_device *ndev,
-                                         struct ethtool_coalesce *ec)
+static int
+ll_temac_ethtools_get_coalesce(struct net_device *ndev,
+                              struct ethtool_coalesce *ec,
+                              struct kernel_ethtool_coalesce *kernel_coal,
+                              struct netlink_ext_ack *extack)
 {
        struct temac_local *lp = netdev_priv(ndev);
 
        return 0;
 }
 
-static int ll_temac_ethtools_set_coalesce(struct net_device *ndev,
-                                         struct ethtool_coalesce *ec)
+static int
+ll_temac_ethtools_set_coalesce(struct net_device *ndev,
+                              struct ethtool_coalesce *ec,
+                              struct kernel_ethtool_coalesce *kernel_coal,
+                              struct netlink_ext_ack *extack)
 {
        struct temac_local *lp = netdev_priv(ndev);
 
 
  * axienet_ethtools_get_coalesce - Get DMA interrupt coalescing count.
  * @ndev:      Pointer to net_device structure
  * @ecoalesce: Pointer to ethtool_coalesce structure
+ * @kernel_coal: ethtool CQE mode setting structure
+ * @extack:    extack for reporting error messages
  *
  * This implements ethtool command for getting the DMA interrupt coalescing
  * count on Tx and Rx paths. Issue "ethtool -c ethX" under linux prompt to
  *
  * Return: 0 always
  */
-static int axienet_ethtools_get_coalesce(struct net_device *ndev,
-                                        struct ethtool_coalesce *ecoalesce)
+static int
+axienet_ethtools_get_coalesce(struct net_device *ndev,
+                             struct ethtool_coalesce *ecoalesce,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        u32 regval = 0;
        struct axienet_local *lp = netdev_priv(ndev);
  * axienet_ethtools_set_coalesce - Set DMA interrupt coalescing count.
  * @ndev:      Pointer to net_device structure
  * @ecoalesce: Pointer to ethtool_coalesce structure
+ * @kernel_coal: ethtool CQE mode setting structure
+ * @extack:    extack for reporting error messages
  *
  * This implements ethtool command for setting the DMA interrupt coalescing
  * count on Tx and Rx paths. Issue "ethtool -C ethX rx-frames 5" under linux
  *
  * Return: 0, on success, Non-zero error value on failure.
  */
-static int axienet_ethtools_set_coalesce(struct net_device *ndev,
-                                        struct ethtool_coalesce *ecoalesce)
+static int
+axienet_ethtools_set_coalesce(struct net_device *ndev,
+                             struct ethtool_coalesce *ecoalesce,
+                             struct kernel_ethtool_coalesce *kernel_coal,
+                             struct netlink_ext_ack *extack)
 {
        struct axienet_local *lp = netdev_priv(ndev);
 
 
 }
 
 static int nsim_get_coalesce(struct net_device *dev,
-                            struct ethtool_coalesce *coal)
+                            struct ethtool_coalesce *coal,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct netdevsim *ns = netdev_priv(dev);
 
 }
 
 static int nsim_set_coalesce(struct net_device *dev,
-                            struct ethtool_coalesce *coal)
+                            struct ethtool_coalesce *coal,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct netdevsim *ns = netdev_priv(dev);
 
 
 }
 
 static int tun_get_coalesce(struct net_device *dev,
-                           struct ethtool_coalesce *ec)
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct tun_struct *tun = netdev_priv(dev);
 
 }
 
 static int tun_set_coalesce(struct net_device *dev,
-                           struct ethtool_coalesce *ec)
+                           struct ethtool_coalesce *ec,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct tun_struct *tun = netdev_priv(dev);
 
 
 }
 
 static int rtl8152_get_coalesce(struct net_device *netdev,
-                               struct ethtool_coalesce *coalesce)
+                               struct ethtool_coalesce *coalesce,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        struct r8152 *tp = netdev_priv(netdev);
 
 }
 
 static int rtl8152_set_coalesce(struct net_device *netdev,
-                               struct ethtool_coalesce *coalesce)
+                               struct ethtool_coalesce *coalesce,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        struct r8152 *tp = netdev_priv(netdev);
        int ret;
 
 }
 
 static int virtnet_set_coalesce(struct net_device *dev,
-                               struct ethtool_coalesce *ec)
+                               struct ethtool_coalesce *ec,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        struct virtnet_info *vi = netdev_priv(dev);
        int i, napi_weight;
 }
 
 static int virtnet_get_coalesce(struct net_device *dev,
-                               struct ethtool_coalesce *ec)
+                               struct ethtool_coalesce *ec,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        struct ethtool_coalesce ec_default = {
                .cmd = ETHTOOL_GCOALESCE,
 
 }
 #endif
 
-static int
-vmxnet3_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *ec)
+static int vmxnet3_get_coalesce(struct net_device *netdev,
+                               struct ethtool_coalesce *ec,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        struct vmxnet3_adapter *adapter = netdev_priv(netdev);
 
        return 0;
 }
 
-static int
-vmxnet3_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *ec)
+static int vmxnet3_set_coalesce(struct net_device *netdev,
+                               struct ethtool_coalesce *ec,
+                               struct kernel_ethtool_coalesce *kernel_coal,
+                               struct netlink_ext_ack *extack)
 {
        struct vmxnet3_adapter *adapter = netdev_priv(netdev);
        struct Vmxnet3_DriverShared *shared = adapter->shared;
 
 
 #include "wil6210.h"
 
-static int wil_ethtoolops_get_coalesce(struct net_device *ndev,
-                                      struct ethtool_coalesce *cp)
+static int
+wil_ethtoolops_get_coalesce(struct net_device *ndev,
+                           struct ethtool_coalesce *cp,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct wil6210_priv *wil = ndev_to_wil(ndev);
        u32 tx_itr_en, tx_itr_val = 0;
        return ret;
 }
 
-static int wil_ethtoolops_set_coalesce(struct net_device *ndev,
-                                      struct ethtool_coalesce *cp)
+static int
+wil_ethtoolops_set_coalesce(struct net_device *ndev,
+                           struct ethtool_coalesce *cp,
+                           struct kernel_ethtool_coalesce *kernel_coal,
+                           struct netlink_ext_ack *extack)
 {
        struct wil6210_priv *wil = ndev_to_wil(ndev);
        struct wireless_dev *wdev = ndev->ieee80211_ptr;
 
 }
 
 static int qeth_set_coalesce(struct net_device *dev,
-                            struct ethtool_coalesce *coal)
+                            struct ethtool_coalesce *coal,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct qeth_card *card = dev->ml_priv;
        struct qeth_qdio_out_q *queue;
 
                regs->len = sizeof(struct qlge_reg_dump);
 }
 
-static int qlge_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *c)
+static int qlge_get_coalesce(struct net_device *ndev,
+                            struct ethtool_coalesce *c,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct qlge_adapter *qdev = netdev_to_qdev(ndev);
 
        return 0;
 }
 
-static int qlge_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *c)
+static int qlge_set_coalesce(struct net_device *ndev,
+                            struct ethtool_coalesce *c,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
 {
        struct qlge_adapter *qdev = netdev_to_qdev(ndev);
 
 
 
 #include <linux/bitmap.h>
 #include <linux/compat.h>
+#include <linux/netlink.h>
 #include <uapi/linux/ethtool.h>
 
 struct compat_ethtool_rx_flow_spec {
                              struct ethtool_eeprom *, u8 *);
        int     (*set_eeprom)(struct net_device *,
                              struct ethtool_eeprom *, u8 *);
-       int     (*get_coalesce)(struct net_device *, struct ethtool_coalesce *);
-       int     (*set_coalesce)(struct net_device *, struct ethtool_coalesce *);
+       int     (*get_coalesce)(struct net_device *,
+                               struct ethtool_coalesce *,
+                               struct kernel_ethtool_coalesce *,
+                               struct netlink_ext_ack *);
+       int     (*set_coalesce)(struct net_device *,
+                               struct ethtool_coalesce *,
+                               struct kernel_ethtool_coalesce *,
+                               struct netlink_ext_ack *);
        void    (*get_ringparam)(struct net_device *,
                                 struct ethtool_ringparam *);
        int     (*set_ringparam)(struct net_device *,
 
                                 struct genl_info *info)
 {
        struct coalesce_reply_data *data = COALESCE_REPDATA(reply_base);
+       struct netlink_ext_ack *extack = info ? info->extack : NULL;
        struct net_device *dev = reply_base->dev;
        int ret;
 
        ret = ethnl_ops_begin(dev);
        if (ret < 0)
                return ret;
-       ret = dev->ethtool_ops->get_coalesce(dev, &data->coalesce);
+       ret = dev->ethtool_ops->get_coalesce(dev, &data->coalesce,
+                                            &data->kernel_coalesce, extack);
        ethnl_ops_complete(dev);
 
        return ret;
        ret = ethnl_ops_begin(dev);
        if (ret < 0)
                goto out_rtnl;
-       ret = ops->get_coalesce(dev, &coalesce);
+       ret = ops->get_coalesce(dev, &coalesce, &kernel_coalesce,
+                               info->extack);
        if (ret < 0)
                goto out_ops;
 
        if (!mod)
                goto out_ops;
 
-       ret = dev->ethtool_ops->set_coalesce(dev, &coalesce);
+       ret = dev->ethtool_ops->set_coalesce(dev, &coalesce, &kernel_coalesce,
+                                            info->extack);
        if (ret < 0)
                goto out_ops;
        ethtool_notify(dev, ETHTOOL_MSG_COALESCE_NTF, NULL);
 
                                                   void __user *useraddr)
 {
        struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE };
+       struct kernel_ethtool_coalesce kernel_coalesce = {};
        int ret;
 
        if (!dev->ethtool_ops->get_coalesce)
                return -EOPNOTSUPP;
 
-       ret = dev->ethtool_ops->get_coalesce(dev, &coalesce);
+       ret = dev->ethtool_ops->get_coalesce(dev, &coalesce, &kernel_coalesce,
+                                            NULL);
        if (ret)
                return ret;
 
 static noinline_for_stack int ethtool_set_coalesce(struct net_device *dev,
                                                   void __user *useraddr)
 {
+       struct kernel_ethtool_coalesce kernel_coalesce = {};
        struct ethtool_coalesce coalesce;
        int ret;
 
-       if (!dev->ethtool_ops->set_coalesce)
+       if (!dev->ethtool_ops->set_coalesce && !dev->ethtool_ops->get_coalesce)
                return -EOPNOTSUPP;
 
+       ret = dev->ethtool_ops->get_coalesce(dev, &coalesce, &kernel_coalesce,
+                                            NULL);
+       if (ret)
+               return ret;
+
        if (copy_from_user(&coalesce, useraddr, sizeof(coalesce)))
                return -EFAULT;
 
        if (!ethtool_set_coalesce_supported(dev, &coalesce))
                return -EOPNOTSUPP;
 
-       ret = dev->ethtool_ops->set_coalesce(dev, &coalesce);
+       ret = dev->ethtool_ops->set_coalesce(dev, &coalesce, &kernel_coalesce,
+                                            NULL);
        if (!ret)
                ethtool_notify(dev, ETHTOOL_MSG_COALESCE_NTF, NULL);
        return ret;