net: hns3: Fix tc setup when netdev is first up
Currently, tc related configuration is not setup when the
netdev is first up, which cause the stack only using tc 0
problem.
This patch fixes it by setting the tc related configuration
using the info from NCL_CONFIG when netdev is first up.
Fixes: 76ad4f0ee7
("net: hns3: Add support of HNS3 Ethernet Driver for hip08 SoC")
Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4fed38cf26
commit
a75a8efa00
@ -239,7 +239,28 @@ static int hns3_nic_set_real_num_queue(struct net_device *netdev)
|
|||||||
struct hnae3_handle *h = hns3_get_handle(netdev);
|
struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||||
struct hnae3_knic_private_info *kinfo = &h->kinfo;
|
struct hnae3_knic_private_info *kinfo = &h->kinfo;
|
||||||
unsigned int queue_size = kinfo->rss_size * kinfo->num_tc;
|
unsigned int queue_size = kinfo->rss_size * kinfo->num_tc;
|
||||||
int ret;
|
int i, ret;
|
||||||
|
|
||||||
|
if (kinfo->num_tc <= 1) {
|
||||||
|
netdev_reset_tc(netdev);
|
||||||
|
} else {
|
||||||
|
ret = netdev_set_num_tc(netdev, kinfo->num_tc);
|
||||||
|
if (ret) {
|
||||||
|
netdev_err(netdev,
|
||||||
|
"netdev_set_num_tc fail, ret=%d!\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < HNAE3_MAX_TC; i++) {
|
||||||
|
if (!kinfo->tc_info[i].enable)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
netdev_set_tc_queue(netdev,
|
||||||
|
kinfo->tc_info[i].tc,
|
||||||
|
kinfo->tc_info[i].tqp_count,
|
||||||
|
kinfo->tc_info[i].tqp_offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ret = netif_set_real_num_tx_queues(netdev, queue_size);
|
ret = netif_set_real_num_tx_queues(netdev, queue_size);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@ -312,7 +333,9 @@ 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 hns3_nic_priv *priv = netdev_priv(netdev);
|
||||||
int ret;
|
struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||||
|
struct hnae3_knic_private_info *kinfo;
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
|
|
||||||
@ -327,6 +350,12 @@ static int hns3_nic_net_open(struct net_device *netdev)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kinfo = &h->kinfo;
|
||||||
|
for (i = 0; i < HNAE3_MAX_USER_PRIO; i++) {
|
||||||
|
netdev_set_prio_tc_map(netdev, i,
|
||||||
|
kinfo->prio_tc[i]);
|
||||||
|
}
|
||||||
|
|
||||||
priv->ae_handle->last_reset_time = jiffies;
|
priv->ae_handle->last_reset_time = jiffies;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1307,7 +1336,6 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data)
|
|||||||
u16 mode = mqprio_qopt->mode;
|
u16 mode = mqprio_qopt->mode;
|
||||||
u8 hw = mqprio_qopt->qopt.hw;
|
u8 hw = mqprio_qopt->qopt.hw;
|
||||||
bool if_running;
|
bool if_running;
|
||||||
unsigned int i;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!((hw == TC_MQPRIO_HW_OFFLOAD_TCS &&
|
if (!((hw == TC_MQPRIO_HW_OFFLOAD_TCS &&
|
||||||
@ -1331,24 +1359,6 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (tc <= 1) {
|
|
||||||
netdev_reset_tc(netdev);
|
|
||||||
} else {
|
|
||||||
ret = netdev_set_num_tc(netdev, tc);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
for (i = 0; i < HNAE3_MAX_TC; i++) {
|
|
||||||
if (!kinfo->tc_info[i].enable)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
netdev_set_tc_queue(netdev,
|
|
||||||
kinfo->tc_info[i].tc,
|
|
||||||
kinfo->tc_info[i].tqp_count,
|
|
||||||
kinfo->tc_info[i].tqp_offset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = hns3_nic_set_real_num_queue(netdev);
|
ret = hns3_nic_set_real_num_queue(netdev);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@ -3202,7 +3212,6 @@ static int hns3_client_setup_tc(struct hnae3_handle *handle, u8 tc)
|
|||||||
struct net_device *ndev = kinfo->netdev;
|
struct net_device *ndev = kinfo->netdev;
|
||||||
bool if_running;
|
bool if_running;
|
||||||
int ret;
|
int ret;
|
||||||
u8 i;
|
|
||||||
|
|
||||||
if (tc > HNAE3_MAX_TC)
|
if (tc > HNAE3_MAX_TC)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -3212,10 +3221,6 @@ static int hns3_client_setup_tc(struct hnae3_handle *handle, u8 tc)
|
|||||||
|
|
||||||
if_running = netif_running(ndev);
|
if_running = netif_running(ndev);
|
||||||
|
|
||||||
ret = netdev_set_num_tc(ndev, tc);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (if_running) {
|
if (if_running) {
|
||||||
(void)hns3_nic_net_stop(ndev);
|
(void)hns3_nic_net_stop(ndev);
|
||||||
msleep(100);
|
msleep(100);
|
||||||
@ -3226,27 +3231,6 @@ static int hns3_client_setup_tc(struct hnae3_handle *handle, u8 tc)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto err_out;
|
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);
|
ret = hns3_nic_set_real_num_queue(ndev);
|
||||||
|
|
||||||
err_out:
|
err_out:
|
||||||
|
Loading…
Reference in New Issue
Block a user