static int hns3_check_rl_coalesce_para(struct net_device *netdev, struct ethtool_coalesce *cmd) { u32 rl; if (cmd->tx_coalesce_usecs_high != cmd->rx_coalesce_usecs_high) { netdev_err(netdev, "tx_usecs_high must be same as rx_usecs_high.\n"); return -EINVAL; } if (cmd->rx_coalesce_usecs_high > HNS3_INT_RL_MAX) { netdev_err(netdev, "Invalid usecs_high value, usecs_high range is 0-%d\n", HNS3_INT_RL_MAX); return -EINVAL; } rl = hns3_rl_round_down(cmd->rx_coalesce_usecs_high); if (rl != cmd->rx_coalesce_usecs_high) { netdev_info(netdev, "usecs_high(%d) rounded down to %d, because it must be multiple of 4.\n", cmd->rx_coalesce_usecs_high, rl); } return 0; }
static int hns3_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *cmd) { struct hnae3_handle *h = hns3_get_handle(netdev); u16 queue_num = h->kinfo.num_tqps; int ret; int i; ret = hns3_check_coalesce_para(netdev, cmd); if (ret) return ret; h->kinfo.int_rl_setting = hns3_rl_round_down(cmd->rx_coalesce_usecs_high); for (i = 0; i < queue_num; i++) hns3_set_coalesce_per_queue(netdev, cmd, i); return 0; }