static int hns3_set_ringparam(struct net_device *ndev, struct ethtool_ringparam *param) { struct hns3_nic_priv *priv = netdev_priv(ndev); struct hnae3_handle *h = priv->ae_handle; bool if_running = netif_running(ndev); u32 old_tx_desc_num, new_tx_desc_num; u32 old_rx_desc_num, new_rx_desc_num; int queue_num = h->kinfo.num_tqps; int ret; if (hns3_nic_resetting(ndev)) return -EBUSY; if (param->rx_mini_pending || param->rx_jumbo_pending) return -EINVAL; if (param->tx_pending > HNS3_RING_MAX_PENDING || param->tx_pending < HNS3_RING_MIN_PENDING || param->rx_pending > HNS3_RING_MAX_PENDING || param->rx_pending < HNS3_RING_MIN_PENDING) { netdev_err(ndev, "Queue depth out of range [%d-%d]\n", HNS3_RING_MIN_PENDING, HNS3_RING_MAX_PENDING); return -EINVAL; } /* Hardware requires that its descriptors must be multiple of eight */ new_tx_desc_num = ALIGN(param->tx_pending, HNS3_RING_BD_MULTIPLE); new_rx_desc_num = ALIGN(param->rx_pending, HNS3_RING_BD_MULTIPLE); old_tx_desc_num = priv->ring_data[0].ring->desc_num; old_rx_desc_num = priv->ring_data[queue_num].ring->desc_num; if (old_tx_desc_num == new_tx_desc_num && old_rx_desc_num == new_rx_desc_num) return 0; netdev_info(ndev, "Changing Tx/Rx ring depth from %d/%d to %d/%d\n", old_tx_desc_num, old_rx_desc_num, new_tx_desc_num, new_rx_desc_num); if (if_running) ndev->netdev_ops->ndo_stop(ndev); ret = hns3_uninit_all_ring(priv); if (ret) return ret; ret = hns3_change_all_ring_bd_num(priv, new_tx_desc_num, new_rx_desc_num); if (ret) { ret = hns3_change_all_ring_bd_num(priv, old_tx_desc_num, old_rx_desc_num); if (ret) { netdev_err(ndev, "Revert to old bd num fail, ret=%d.\n", ret); return ret; } } if (if_running) ret = ndev->netdev_ops->ndo_open(ndev); return ret; }
static int hns3_set_ringparam(struct net_device *ndev, struct ethtool_ringparam *param) { struct hns3_nic_priv *priv = netdev_priv(ndev); struct hnae3_handle *h = priv->ae_handle; bool if_running = netif_running(ndev); u32 old_desc_num, new_desc_num; int ret; if (param->rx_mini_pending || param->rx_jumbo_pending) return -EINVAL; if (param->tx_pending != param->rx_pending) { netdev_err(ndev, "Descriptors of tx and rx must be equal"); return -EINVAL; } if (param->tx_pending > HNS3_RING_MAX_PENDING || param->tx_pending < HNS3_RING_MIN_PENDING) { netdev_err(ndev, "Descriptors requested (Tx/Rx: %d) out of range [%d-%d]\n", param->tx_pending, HNS3_RING_MIN_PENDING, HNS3_RING_MAX_PENDING); return -EINVAL; } new_desc_num = param->tx_pending; /* Hardware requires that its descriptors must be multiple of eight */ new_desc_num = ALIGN(new_desc_num, HNS3_RING_BD_MULTIPLE); old_desc_num = h->kinfo.num_desc; if (old_desc_num == new_desc_num) return 0; netdev_info(ndev, "Changing descriptor count from %d to %d.\n", old_desc_num, new_desc_num); if (if_running) dev_close(ndev); ret = hns3_uninit_all_ring(priv); if (ret) return ret; ret = hns3_change_all_ring_bd_num(priv, new_desc_num); if (ret) { ret = hns3_change_all_ring_bd_num(priv, old_desc_num); if (ret) { netdev_err(ndev, "Revert to old bd num fail, ret=%d.\n", ret); return ret; } } if (if_running) ret = dev_open(ndev); return ret; }