/* Set no of Tx, Rx queues to be used */ static int nicvf_set_channels(struct net_device *dev, struct ethtool_channels *channel) { struct nicvf *nic = netdev_priv(dev); int err = 0; bool if_up = netif_running(dev); if (!channel->rx_count || !channel->tx_count) return -EINVAL; if (channel->rx_count > MAX_RCV_QUEUES_PER_QS) return -EINVAL; if (channel->tx_count > MAX_SND_QUEUES_PER_QS) return -EINVAL; if (if_up) nicvf_stop(dev); nic->qs->rq_cnt = channel->rx_count; nic->qs->sq_cnt = channel->tx_count; nic->qs->cq_cnt = max(nic->qs->rq_cnt, nic->qs->sq_cnt); err = nicvf_set_real_num_queues(dev, nic->qs->sq_cnt, nic->qs->rq_cnt); if (err) return err; if (if_up) nicvf_open(dev); netdev_info(dev, "Setting num Tx rings to %d, Rx rings to %d success\n", nic->qs->sq_cnt, nic->qs->rq_cnt); return err; }
static int nicvf_set_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring) { struct nicvf *nic = netdev_priv(netdev); struct queue_set *qs = nic->qs; u32 rx_count, tx_count; /* Due to HW errata this is not supported on T88 pass 1.x silicon */ if (pass1_silicon(nic->pdev)) return -EINVAL; if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) return -EINVAL; tx_count = clamp_t(u32, ring->tx_pending, MIN_SND_QUEUE_LEN, MAX_SND_QUEUE_LEN); rx_count = clamp_t(u32, ring->rx_pending, MIN_CMP_QUEUE_LEN, MAX_CMP_QUEUE_LEN); if ((tx_count == qs->sq_len) && (rx_count == qs->cq_len)) return 0; /* Permitted lengths are 1K, 2K, 4K, 8K, 16K, 32K, 64K */ qs->sq_len = rounddown_pow_of_two(tx_count); qs->cq_len = rounddown_pow_of_two(rx_count); if (netif_running(netdev)) { nicvf_stop(netdev); nicvf_open(netdev); } return 0; }
/* Set no of Tx, Rx queues to be used */ static int nicvf_set_channels(struct net_device *dev, struct ethtool_channels *channel) { struct nicvf *nic = netdev_priv(dev); int err = 0; bool if_up = netif_running(dev); u8 cqcount, txq_count; if (!channel->rx_count || !channel->tx_count) return -EINVAL; if (channel->rx_count > nic->max_queues) return -EINVAL; if (channel->tx_count > nic->max_queues) return -EINVAL; if (nic->xdp_prog && ((channel->tx_count + channel->rx_count) > nic->max_queues)) { netdev_err(nic->netdev, "XDP mode, RXQs + TXQs > Max %d\n", nic->max_queues); return -EINVAL; } if (if_up) nicvf_stop(dev); nic->rx_queues = channel->rx_count; nic->tx_queues = channel->tx_count; if (!nic->xdp_prog) nic->xdp_tx_queues = 0; else nic->xdp_tx_queues = channel->rx_count; txq_count = nic->xdp_tx_queues + nic->tx_queues; cqcount = max(nic->rx_queues, txq_count); if (cqcount > MAX_CMP_QUEUES_PER_QS) { nic->sqs_count = roundup(cqcount, MAX_CMP_QUEUES_PER_QS); nic->sqs_count = (nic->sqs_count / MAX_CMP_QUEUES_PER_QS) - 1; } else { nic->sqs_count = 0; } nic->qs->rq_cnt = min_t(u8, nic->rx_queues, MAX_RCV_QUEUES_PER_QS); nic->qs->sq_cnt = min_t(u8, txq_count, MAX_SND_QUEUES_PER_QS); nic->qs->cq_cnt = max(nic->qs->rq_cnt, nic->qs->sq_cnt); err = nicvf_set_real_num_queues(dev, nic->tx_queues, nic->rx_queues); if (err) return err; if (if_up) nicvf_open(dev); netdev_info(dev, "Setting num Tx rings to %d, Rx rings to %d success\n", nic->tx_queues, nic->rx_queues); return err; }
/* Set no of Tx, Rx queues to be used */ static int nicvf_set_channels(struct net_device *dev, struct ethtool_channels *channel) { struct nicvf *nic = netdev_priv(dev); int err = 0; bool if_up = netif_running(dev); int cqcount; if (!channel->rx_count || !channel->tx_count) return -EINVAL; if (channel->rx_count > nic->max_queues) return -EINVAL; if (channel->tx_count > nic->max_queues) return -EINVAL; if (if_up) nicvf_stop(dev); cqcount = max(channel->rx_count, channel->tx_count); if (cqcount > MAX_CMP_QUEUES_PER_QS) { nic->sqs_count = roundup(cqcount, MAX_CMP_QUEUES_PER_QS); nic->sqs_count = (nic->sqs_count / MAX_CMP_QUEUES_PER_QS) - 1; } else { nic->sqs_count = 0; } nic->qs->rq_cnt = min_t(u32, channel->rx_count, MAX_RCV_QUEUES_PER_QS); nic->qs->sq_cnt = min_t(u32, channel->tx_count, MAX_SND_QUEUES_PER_QS); nic->qs->cq_cnt = max(nic->qs->rq_cnt, nic->qs->sq_cnt); nic->rx_queues = channel->rx_count; nic->tx_queues = channel->tx_count; err = nicvf_set_real_num_queues(dev, nic->tx_queues, nic->rx_queues); if (err) return err; if (if_up) nicvf_open(dev); netdev_info(dev, "Setting num Tx rings to %d, Rx rings to %d success\n", nic->tx_queues, nic->rx_queues); return err; }