History

Merge branch 'hns3-next'

Peng Li says: ==================== fix some bugs for hns3 driver This patchset fix some bugs for hns3 driver. [Patch 1/6 - Patch 3/6] fix bugs related about VF driver. [Patch 3/6 - Patch 6/6] fix the bugs about ethtool_ops.set_channels. ====================

David S. Miller committed 8 years ago

Commit 08a24232 parents 67ae686 cc719215 files · +54 −44Browse files

Unified · Split

5 files
  1. drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +13 −14
  2. drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +24 −26
  3. drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c +6 −4
  4. drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +10 −0
  5. drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c +1 −0
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c+13−14
@@ -249,6 +249,16 @@ static int hns3_nic_set_real_num_queue(struct net_device *netdev) · 248 unmodified lines
249 return 0;249 return 0;
250}250}
251 251
252static u16 hns3_get_max_available_channels(struct hnae3_handle *h)
253{
254 u16 free_tqps, max_rss_size, max_tqps;
255
256 h->ae_algo->ops->get_tqps_and_rss_info(h, &free_tqps, &max_rss_size);
257 max_tqps = h->kinfo.num_tc * max_rss_size;
258
259 return min_t(u16, max_tqps, (free_tqps + h->kinfo.num_tqps));
260}
261
252static int hns3_nic_net_up(struct net_device *netdev)262static int hns3_nic_net_up(struct net_device *netdev)
253{263{
254 struct hns3_nic_priv *priv = netdev_priv(netdev);264 struct hns3_nic_priv *priv = netdev_priv(netdev);
@@ -3013,7 +3023,7 @@ static int hns3_client_init(struct hnae3_handle *handle) · 2758 unmodified lines
3013 int ret;3023 int ret;
3014 3024
3015 netdev = alloc_etherdev_mq(sizeof(struct hns3_nic_priv),3025 netdev = alloc_etherdev_mq(sizeof(struct hns3_nic_priv),
3016 handle->kinfo.num_tqps);3026 hns3_get_max_available_channels(handle));
3017 if (!netdev)3027 if (!netdev)
3018 return -ENOMEM;3028 return -ENOMEM;
3019 3029
@@ -3336,17 +3346,6 @@ static int hns3_reset_notify(struct hnae3_handle *handle, · 316 unmodified lines
3336 return ret;3346 return ret;
3337}3347}
3338 3348
3339static u16 hns3_get_max_available_channels(struct net_device *netdev)
3340{
3341 struct hnae3_handle *h = hns3_get_handle(netdev);
3342 u16 free_tqps, max_rss_size, max_tqps;
3343
3344 h->ae_algo->ops->get_tqps_and_rss_info(h, &free_tqps, &max_rss_size);
3345 max_tqps = h->kinfo.num_tc * max_rss_size;
3346
3347 return min_t(u16, max_tqps, (free_tqps + h->kinfo.num_tqps));
3348}
3349
3350static int hns3_modify_tqp_num(struct net_device *netdev, u16 new_tqp_num)3349static int hns3_modify_tqp_num(struct net_device *netdev, u16 new_tqp_num)
3351{3350{
3352 struct hns3_nic_priv *priv = netdev_priv(netdev);3351 struct hns3_nic_priv *priv = netdev_priv(netdev);
@@ -3397,12 +3396,12 @@ int hns3_set_channels(struct net_device *netdev, · 44 unmodified lines
3397 if (ch->rx_count || ch->tx_count)3396 if (ch->rx_count || ch->tx_count)
3398 return -EINVAL;3397 return -EINVAL;
3399 3398
3400 if (new_tqp_num > hns3_get_max_available_channels(netdev) ||3399 if (new_tqp_num > hns3_get_max_available_channels(h) ||
3401 new_tqp_num < kinfo->num_tc) {3400 new_tqp_num < kinfo->num_tc) {
3402 dev_err(&netdev->dev,3401 dev_err(&netdev->dev,
3403 "Change tqps fail, the tqp range is from %d to %d",3402 "Change tqps fail, the tqp range is from %d to %d",
3404 kinfo->num_tc,3403 kinfo->num_tc,
3405 hns3_get_max_available_channels(netdev));3404 hns3_get_max_available_channels(h));
3406 return -EINVAL;3405 return -EINVAL;
3407 }3406 }
3408 3407
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c+24−26
@@ -3717,20 +3717,11 @@ static int hclge_ae_start(struct hnae3_handle *handle) · 3716 unmodified lines
3717{3717{
3718 struct hclge_vport *vport = hclge_get_vport(handle);3718 struct hclge_vport *vport = hclge_get_vport(handle);
3719 struct hclge_dev *hdev = vport->back;3719 struct hclge_dev *hdev = vport->back;
3720 int i, queue_id, ret;3720 int i, ret;
3721 3721
3722 for (i = 0; i < vport->alloc_tqps; i++) {3722 for (i = 0; i < vport->alloc_tqps; i++)
3723 /* todo clear interrupt */3723 hclge_tqp_enable(hdev, i, 0, true);
3724 /* ring enable */
3725 queue_id = hclge_get_queue_id(handle->kinfo.tqp[i]);
3726 if (queue_id < 0) {
3727 dev_warn(&hdev->pdev->dev,
3728 "Get invalid queue id, ignore it\n");
3729 continue;
3730 }
3731 3724
3732 hclge_tqp_enable(hdev, queue_id, 0, true);
3733 }
3734 /* mac enable */3725 /* mac enable */
3735 hclge_cfg_mac_mode(hdev, true);3726 hclge_cfg_mac_mode(hdev, true);
3736 clear_bit(HCLGE_STATE_DOWN, &hdev->state);3727 clear_bit(HCLGE_STATE_DOWN, &hdev->state);
@@ -3750,19 +3741,11 @@ static void hclge_ae_stop(struct hnae3_handle *handle) · 13 unmodified lines
3750{3741{
3751 struct hclge_vport *vport = hclge_get_vport(handle);3742 struct hclge_vport *vport = hclge_get_vport(handle);
3752 struct hclge_dev *hdev = vport->back;3743 struct hclge_dev *hdev = vport->back;
3753 int i, queue_id;3744 int i;
3754 3745
3755 for (i = 0; i < vport->alloc_tqps; i++) {3746 for (i = 0; i < vport->alloc_tqps; i++)
3756 /* Ring disable */3747 hclge_tqp_enable(hdev, i, 0, false);
3757 queue_id = hclge_get_queue_id(handle->kinfo.tqp[i]);
3758 if (queue_id < 0) {
3759 dev_warn(&hdev->pdev->dev,
3760 "Get invalid queue id, ignore it\n");
3761 continue;
3762 }
3763 3748
3764 hclge_tqp_enable(hdev, queue_id, 0, false);
3765 }
3766 /* Mac disable */3749 /* Mac disable */
3767 hclge_cfg_mac_mode(hdev, false);3750 hclge_cfg_mac_mode(hdev, false);
3768 3751
@@ -4848,21 +4831,36 @@ static int hclge_get_reset_status(struct hclge_dev *hdev, u16 queue_id) · 1079 unmodified lines
4848 return hnae_get_bit(req->ready_to_reset, HCLGE_TQP_RESET_B);4831 return hnae_get_bit(req->ready_to_reset, HCLGE_TQP_RESET_B);
4849}4832}
4850 4833
4834static u16 hclge_covert_handle_qid_global(struct hnae3_handle *handle,
4835 u16 queue_id)
4836{
4837 struct hnae3_queue *queue;
4838 struct hclge_tqp *tqp;
4839
4840 queue = handle->kinfo.tqp[queue_id];
4841 tqp = container_of(queue, struct hclge_tqp, q);
4842
4843 return tqp->index;
4844}
4845
4851void hclge_reset_tqp(struct hnae3_handle *handle, u16 queue_id)4846void hclge_reset_tqp(struct hnae3_handle *handle, u16 queue_id)
4852{4847{
4853 struct hclge_vport *vport = hclge_get_vport(handle);4848 struct hclge_vport *vport = hclge_get_vport(handle);
4854 struct hclge_dev *hdev = vport->back;4849 struct hclge_dev *hdev = vport->back;
4855 int reset_try_times = 0;4850 int reset_try_times = 0;
4856 int reset_status;4851 int reset_status;
4852 u16 queue_gid;
4857 int ret;4853 int ret;
4858 4854
4855 queue_gid = hclge_covert_handle_qid_global(handle, queue_id);
4856
4859 ret = hclge_tqp_enable(hdev, queue_id, 0, false);4857 ret = hclge_tqp_enable(hdev, queue_id, 0, false);
4860 if (ret) {4858 if (ret) {
4861 dev_warn(&hdev->pdev->dev, "Disable tqp fail, ret = %d\n", ret);4859 dev_warn(&hdev->pdev->dev, "Disable tqp fail, ret = %d\n", ret);
4862 return;4860 return;
4863 }4861 }
4864 4862
4865 ret = hclge_send_reset_tqp_cmd(hdev, queue_id, true);4863 ret = hclge_send_reset_tqp_cmd(hdev, queue_gid, true);
4866 if (ret) {4864 if (ret) {
4867 dev_warn(&hdev->pdev->dev,4865 dev_warn(&hdev->pdev->dev,
4868 "Send reset tqp cmd fail, ret = %d\n", ret);4866 "Send reset tqp cmd fail, ret = %d\n", ret);
@@ -4873,7 +4871,7 @@ void hclge_reset_tqp(struct hnae3_handle *handle, u16 queue_id) · 4 unmodified lines
4873 while (reset_try_times++ < HCLGE_TQP_RESET_TRY_TIMES) {4871 while (reset_try_times++ < HCLGE_TQP_RESET_TRY_TIMES) {
4874 /* Wait for tqp hw reset */4872 /* Wait for tqp hw reset */
4875 msleep(20);4873 msleep(20);
4876 reset_status = hclge_get_reset_status(hdev, queue_id);4874 reset_status = hclge_get_reset_status(hdev, queue_gid);
4877 if (reset_status)4875 if (reset_status)
4878 break;4876 break;
4879 }4877 }
@@ -4883,7 +4881,7 @@ void hclge_reset_tqp(struct hnae3_handle *handle, u16 queue_id) · 3 unmodified lines
4883 return;4881 return;
4884 }4882 }
4885 4883
4886 ret = hclge_send_reset_tqp_cmd(hdev, queue_id, false);4884 ret = hclge_send_reset_tqp_cmd(hdev, queue_gid, false);
4887 if (ret) {4885 if (ret) {
4888 dev_warn(&hdev->pdev->dev,4886 dev_warn(&hdev->pdev->dev,
4889 "Deassert the soft reset fail, ret = %d\n", ret);4887 "Deassert the soft reset fail, ret = %d\n", ret);
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c+6−4
@@ -291,7 +291,7 @@ static int hclge_get_vf_queue_info(struct hclge_vport *vport, · 290 unmodified lines
291 291
292 /* get the queue related info */292 /* get the queue related info */
293 memcpy(&resp_data[0], &vport->alloc_tqps, sizeof(u16));293 memcpy(&resp_data[0], &vport->alloc_tqps, sizeof(u16));
294 memcpy(&resp_data[2], &hdev->rss_size_max, sizeof(u16));294 memcpy(&resp_data[2], &vport->nic.kinfo.rss_size, sizeof(u16));
295 memcpy(&resp_data[4], &hdev->num_desc, sizeof(u16));295 memcpy(&resp_data[4], &hdev->num_desc, sizeof(u16));
296 memcpy(&resp_data[6], &hdev->rx_buf_len, sizeof(u16));296 memcpy(&resp_data[6], &hdev->rx_buf_len, sizeof(u16));
297 297
@@ -333,11 +333,11 @@ void hclge_mbx_handler(struct hclge_dev *hdev) · 35 unmodified lines
333 struct hclge_mbx_vf_to_pf_cmd *req;333 struct hclge_mbx_vf_to_pf_cmd *req;
334 struct hclge_vport *vport;334 struct hclge_vport *vport;
335 struct hclge_desc *desc;335 struct hclge_desc *desc;
336 int ret;336 int ret, flag;
337 337
338 flag = le16_to_cpu(crq->desc[crq->next_to_use].flag);
338 /* handle all the mailbox requests in the queue */339 /* handle all the mailbox requests in the queue */
339 while (hnae_get_bit(crq->desc[crq->next_to_use].flag,340 while (hnae_get_bit(flag, HCLGE_CMDQ_RX_OUTVLD_B)) {
340 HCLGE_CMDQ_RX_OUTVLD_B)) {
341 desc = &crq->desc[crq->next_to_use];341 desc = &crq->desc[crq->next_to_use];
342 req = (struct hclge_mbx_vf_to_pf_cmd *)desc->data;342 req = (struct hclge_mbx_vf_to_pf_cmd *)desc->data;
343 343
@@ -410,7 +410,9 @@ void hclge_mbx_handler(struct hclge_dev *hdev) · 66 unmodified lines
410 req->msg[0]);410 req->msg[0]);
411 break;411 break;
412 }412 }
413 crq->desc[crq->next_to_use].flag = 0;
413 hclge_mbx_ring_ptr_move_crq(crq);414 hclge_mbx_ring_ptr_move_crq(crq);
415 flag = le16_to_cpu(crq->desc[crq->next_to_use].flag);
414 }416 }
415 417
416 /* Write back CMDQ_RQ header pointer, M7 need this pointer */418 /* Write back CMDQ_RQ header pointer, M7 need this pointer */
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c+10−0
@@ -1447,6 +1447,15 @@ static void hclgevf_get_channels(struct hnae3_handle *handle, · 1446 unmodified lines
1447 ch->combined_count = hdev->num_tqps;1447 ch->combined_count = hdev->num_tqps;
1448}1448}
1449 1449
1450static void hclgevf_get_tqps_and_rss_info(struct hnae3_handle *handle,
1451 u16 *free_tqps, u16 *max_rss_size)
1452{
1453 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
1454
1455 *free_tqps = 0;
1456 *max_rss_size = hdev->rss_size_max;
1457}
1458
1450static const struct hnae3_ae_ops hclgevf_ops = {1459static const struct hnae3_ae_ops hclgevf_ops = {
1451 .init_ae_dev = hclgevf_init_ae_dev,1460 .init_ae_dev = hclgevf_init_ae_dev,
1452 .uninit_ae_dev = hclgevf_uninit_ae_dev,1461 .uninit_ae_dev = hclgevf_uninit_ae_dev,
@@ -1477,6 +1486,7 @@ static const struct hnae3_ae_ops hclgevf_ops = { · 24 unmodified lines
1477 .get_fw_version = hclgevf_get_fw_version,1486 .get_fw_version = hclgevf_get_fw_version,
1478 .set_vlan_filter = hclgevf_set_vlan_filter,1487 .set_vlan_filter = hclgevf_set_vlan_filter,
1479 .get_channels = hclgevf_get_channels,1488 .get_channels = hclgevf_get_channels,
1489 .get_tqps_and_rss_info = hclgevf_get_tqps_and_rss_info,
1480};1490};
1481 1491
1482static struct hnae3_ae_algo ae_algovf = {1492static struct hnae3_ae_algo ae_algovf = {
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c+1−0
@@ -171,6 +171,7 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev) · 170 unmodified lines
171 req->msg[0]);171 req->msg[0]);
172 break;172 break;
173 }173 }
174 crq->desc[crq->next_to_use].flag = 0;
174 hclge_mbx_ring_ptr_move_crq(crq);175 hclge_mbx_ring_ptr_move_crq(crq);
175 flag = le16_to_cpu(crq->desc[crq->next_to_use].flag);176 flag = le16_to_cpu(crq->desc[crq->next_to_use].flag);
176 }177 }