net: hns3: Add DCB support when interacting with network stack
When using lldptool to configure DCB parameter, hclge_dcb module call the client_ops->setup_tc to tell network stack which queue and priority is using for specific tc. Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7979a22330
commit
9df8f79a4d
|
@ -196,6 +196,32 @@ static void hns3_vector_gl_rl_init(struct hns3_enet_tqp_vector *tqp_vector)
|
||||||
tqp_vector->tx_group.flow_level = HNS3_FLOW_LOW;
|
tqp_vector->tx_group.flow_level = HNS3_FLOW_LOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hns3_nic_set_real_num_queue(struct net_device *netdev)
|
||||||
|
{
|
||||||
|
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
||||||
|
struct hnae3_handle *h = priv->ae_handle;
|
||||||
|
struct hnae3_knic_private_info *kinfo = &h->kinfo;
|
||||||
|
unsigned int queue_size = kinfo->rss_size * kinfo->num_tc;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = netif_set_real_num_tx_queues(netdev, queue_size);
|
||||||
|
if (ret) {
|
||||||
|
netdev_err(netdev,
|
||||||
|
"netif_set_real_num_tx_queues fail, ret=%d!\n",
|
||||||
|
ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = netif_set_real_num_rx_queues(netdev, queue_size);
|
||||||
|
if (ret) {
|
||||||
|
netdev_err(netdev,
|
||||||
|
"netif_set_real_num_rx_queues fail, ret=%d!\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int hns3_nic_net_up(struct net_device *netdev)
|
static int hns3_nic_net_up(struct net_device *netdev)
|
||||||
{
|
{
|
||||||
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
||||||
|
@ -232,26 +258,13 @@ out_start_err:
|
||||||
|
|
||||||
static int hns3_nic_net_open(struct net_device *netdev)
|
static int hns3_nic_net_open(struct net_device *netdev)
|
||||||
{
|
{
|
||||||
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
|
||||||
struct hnae3_handle *h = priv->ae_handle;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
|
|
||||||
ret = netif_set_real_num_tx_queues(netdev, h->kinfo.num_tqps);
|
ret = hns3_nic_set_real_num_queue(netdev);
|
||||||
if (ret) {
|
if (ret)
|
||||||
netdev_err(netdev,
|
|
||||||
"netif_set_real_num_tx_queues fail, ret=%d!\n",
|
|
||||||
ret);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
ret = netif_set_real_num_rx_queues(netdev, h->kinfo.num_tqps);
|
|
||||||
if (ret) {
|
|
||||||
netdev_err(netdev,
|
|
||||||
"netif_set_real_num_rx_queues fail, ret=%d!\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = hns3_nic_net_up(netdev);
|
ret = hns3_nic_net_up(netdev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -2848,10 +2861,69 @@ static void hns3_link_status_change(struct hnae3_handle *handle, bool linkup)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hns3_client_setup_tc(struct hnae3_handle *handle, u8 tc)
|
||||||
|
{
|
||||||
|
struct hnae3_knic_private_info *kinfo = &handle->kinfo;
|
||||||
|
struct net_device *ndev = kinfo->netdev;
|
||||||
|
bool if_running = netif_running(ndev);
|
||||||
|
int ret;
|
||||||
|
u8 i;
|
||||||
|
|
||||||
|
if (tc > HNAE3_MAX_TC)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (!ndev)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
ret = netdev_set_num_tc(ndev, tc);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (if_running) {
|
||||||
|
(void)hns3_nic_net_stop(ndev);
|
||||||
|
msleep(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = (kinfo->dcb_ops && kinfo->dcb_ops->map_update) ?
|
||||||
|
kinfo->dcb_ops->map_update(handle) : -EOPNOTSUPP;
|
||||||
|
if (ret)
|
||||||
|
goto err_out;
|
||||||
|
|
||||||
|
if (tc <= 1) {
|
||||||
|
netdev_reset_tc(ndev);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < HNAE3_MAX_TC; i++) {
|
||||||
|
struct hnae3_tc_info *tc_info = &kinfo->tc_info[i];
|
||||||
|
|
||||||
|
if (tc_info->enable)
|
||||||
|
netdev_set_tc_queue(ndev,
|
||||||
|
tc_info->tc,
|
||||||
|
tc_info->tqp_count,
|
||||||
|
tc_info->tqp_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < HNAE3_MAX_USER_PRIO; i++) {
|
||||||
|
netdev_set_prio_tc_map(ndev, i,
|
||||||
|
kinfo->prio_tc[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
ret = hns3_nic_set_real_num_queue(ndev);
|
||||||
|
|
||||||
|
err_out:
|
||||||
|
if (if_running)
|
||||||
|
(void)hns3_nic_net_open(ndev);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
const struct hnae3_client_ops client_ops = {
|
const struct hnae3_client_ops client_ops = {
|
||||||
.init_instance = hns3_client_init,
|
.init_instance = hns3_client_init,
|
||||||
.uninit_instance = hns3_client_uninit,
|
.uninit_instance = hns3_client_uninit,
|
||||||
.link_status_change = hns3_link_status_change,
|
.link_status_change = hns3_link_status_change,
|
||||||
|
.setup_tc = hns3_client_setup_tc,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* hns3_init_module - Driver registration routine
|
/* hns3_init_module - Driver registration routine
|
||||||
|
|
Loading…
Reference in New Issue