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
249249 return 0;
250250 }
251251
252+static 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+
252262 static int hns3_nic_net_up(struct net_device *netdev)
253263 {
254264 struct hns3_nic_priv *priv = netdev_priv(netdev);
@@ -3013,7 +3023,7 @@ static int hns3_client_init(struct hnae3_handle *handle) · 2758 unmodified lines
30133023 int ret;
30143024
30153025 netdev = alloc_etherdev_mq(sizeof(struct hns3_nic_priv),
3016− handle->kinfo.num_tqps);
3026+ hns3_get_max_available_channels(handle));
30173027 if (!netdev)
30183028 return -ENOMEM;
30193029
@@ -3336,17 +3346,6 @@ static int hns3_reset_notify(struct hnae3_handle *handle, · 316 unmodified lines
33363346 return ret;
33373347 }
33383348
3339−static 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−
33503349 static int hns3_modify_tqp_num(struct net_device *netdev, u16 new_tqp_num)
33513350 {
33523351 struct hns3_nic_priv *priv = netdev_priv(netdev);
@@ -3397,12 +3396,12 @@ int hns3_set_channels(struct net_device *netdev, · 44 unmodified lines
33973396 if (ch->rx_count || ch->tx_count)
33983397 return -EINVAL;
33993398
3400− if (new_tqp_num > hns3_get_max_available_channels(netdev) ||
3399+ if (new_tqp_num > hns3_get_max_available_channels(h) ||
34013400 new_tqp_num < kinfo->num_tc) {
34023401 dev_err(&netdev->dev,
34033402 "Change tqps fail, the tqp range is from %d to %d",
34043403 kinfo->num_tc,
3405− hns3_get_max_available_channels(netdev));
3404+ hns3_get_max_available_channels(h));
34063405 return -EINVAL;
34073406 }
34083407
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
37173717 {
37183718 struct hclge_vport *vport = hclge_get_vport(handle);
37193719 struct hclge_dev *hdev = vport->back;
3720− int i, queue_id, ret;
3720+ int i, ret;
37213721
3722− for (i = 0; i < vport->alloc_tqps; i++) {
3723− /* todo clear interrupt */
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− }
3722+ for (i = 0; i < vport->alloc_tqps; i++)
3723+ hclge_tqp_enable(hdev, i, 0, true);
37313724
3732− hclge_tqp_enable(hdev, queue_id, 0, true);
3733− }
37343725 /* mac enable */
37353726 hclge_cfg_mac_mode(hdev, true);
37363727 clear_bit(HCLGE_STATE_DOWN, &hdev->state);
@@ -3750,19 +3741,11 @@ static void hclge_ae_stop(struct hnae3_handle *handle) · 13 unmodified lines
37503741 {
37513742 struct hclge_vport *vport = hclge_get_vport(handle);
37523743 struct hclge_dev *hdev = vport->back;
3753− int i, queue_id;
3744+ int i;
37543745
3755− for (i = 0; i < vport->alloc_tqps; i++) {
3756− /* Ring disable */
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− }
3746+ for (i = 0; i < vport->alloc_tqps; i++)
3747+ hclge_tqp_enable(hdev, i, 0, false);
37633748
3764− hclge_tqp_enable(hdev, queue_id, 0, false);
3765− }
37663749 /* Mac disable */
37673750 hclge_cfg_mac_mode(hdev, false);
37683751
@@ -4848,21 +4831,36 @@ static int hclge_get_reset_status(struct hclge_dev *hdev, u16 queue_id) · 1079 unmodified lines
48484831 return hnae_get_bit(req->ready_to_reset, HCLGE_TQP_RESET_B);
48494832 }
48504833
4834+static 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+
48514846 void hclge_reset_tqp(struct hnae3_handle *handle, u16 queue_id)
48524847 {
48534848 struct hclge_vport *vport = hclge_get_vport(handle);
48544849 struct hclge_dev *hdev = vport->back;
48554850 int reset_try_times = 0;
48564851 int reset_status;
4852+ u16 queue_gid;
48574853 int ret;
48584854
4855+ queue_gid = hclge_covert_handle_qid_global(handle, queue_id);
4856+
48594857 ret = hclge_tqp_enable(hdev, queue_id, 0, false);
48604858 if (ret) {
48614859 dev_warn(&hdev->pdev->dev, "Disable tqp fail, ret = %d\n", ret);
48624860 return;
48634861 }
48644862
4865− ret = hclge_send_reset_tqp_cmd(hdev, queue_id, true);
4863+ ret = hclge_send_reset_tqp_cmd(hdev, queue_gid, true);
48664864 if (ret) {
48674865 dev_warn(&hdev->pdev->dev,
48684866 "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
48734871 while (reset_try_times++ < HCLGE_TQP_RESET_TRY_TIMES) {
48744872 /* Wait for tqp hw reset */
48754873 msleep(20);
4876− reset_status = hclge_get_reset_status(hdev, queue_id);
4874+ reset_status = hclge_get_reset_status(hdev, queue_gid);
48774875 if (reset_status)
48784876 break;
48794877 }
@@ -4883,7 +4881,7 @@ void hclge_reset_tqp(struct hnae3_handle *handle, u16 queue_id) · 3 unmodified lines
48834881 return;
48844882 }
48854883
4886− ret = hclge_send_reset_tqp_cmd(hdev, queue_id, false);
4884+ ret = hclge_send_reset_tqp_cmd(hdev, queue_gid, false);
48874885 if (ret) {
48884886 dev_warn(&hdev->pdev->dev,
48894887 "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
291291
292292 /* get the queue related info */
293293 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));
295295 memcpy(&resp_data[4], &hdev->num_desc, sizeof(u16));
296296 memcpy(&resp_data[6], &hdev->rx_buf_len, sizeof(u16));
297297
@@ -333,11 +333,11 @@ void hclge_mbx_handler(struct hclge_dev *hdev) · 35 unmodified lines
333333 struct hclge_mbx_vf_to_pf_cmd *req;
334334 struct hclge_vport *vport;
335335 struct hclge_desc *desc;
336− int ret;
336+ int ret, flag;
337337
338+ flag = le16_to_cpu(crq->desc[crq->next_to_use].flag);
338339 /* handle all the mailbox requests in the queue */
339− while (hnae_get_bit(crq->desc[crq->next_to_use].flag,
340− HCLGE_CMDQ_RX_OUTVLD_B)) {
340+ while (hnae_get_bit(flag, HCLGE_CMDQ_RX_OUTVLD_B)) {
341341 desc = &crq->desc[crq->next_to_use];
342342 req = (struct hclge_mbx_vf_to_pf_cmd *)desc->data;
343343
@@ -410,7 +410,9 @@ void hclge_mbx_handler(struct hclge_dev *hdev) · 66 unmodified lines
410410 req->msg[0]);
411411 break;
412412 }
413+ crq->desc[crq->next_to_use].flag = 0;
413414 hclge_mbx_ring_ptr_move_crq(crq);
415+ flag = le16_to_cpu(crq->desc[crq->next_to_use].flag);
414416 }
415417
416418 /* 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
14471447 ch->combined_count = hdev->num_tqps;
14481448 }
14491449
1450+static 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+
14501459 static const struct hnae3_ae_ops hclgevf_ops = {
14511460 .init_ae_dev = hclgevf_init_ae_dev,
14521461 .uninit_ae_dev = hclgevf_uninit_ae_dev,
@@ -1477,6 +1486,7 @@ static const struct hnae3_ae_ops hclgevf_ops = { · 24 unmodified lines
14771486 .get_fw_version = hclgevf_get_fw_version,
14781487 .set_vlan_filter = hclgevf_set_vlan_filter,
14791488 .get_channels = hclgevf_get_channels,
1489+ .get_tqps_and_rss_info = hclgevf_get_tqps_and_rss_info,
14801490 };
14811491
14821492 static 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
171171 req->msg[0]);
172172 break;
173173 }
174+ crq->desc[crq->next_to_use].flag = 0;
174175 hclge_mbx_ring_ptr_move_crq(crq);
175176 flag = le16_to_cpu(crq->desc[crq->next_to_use].flag);
176177 }