Skip to content

Commit 6686c45

Browse files
committed
Merge branch 'hns3-VF-reset'
Salil Mehta says: ==================== Add support of VF Reset to HNS3 VF driver This patch-set adds the support of VF reset to the existing VF driver. VF Reset can be triggered due to TX watchdog firing as a result of TX data-path not working. VF reset could also be a result of some internal configuration changes if that requires reset, or as a result of the PF/Core/Global/IMP(Integrated Management Processor) reset happened in the PF. Summary of Patches: * Watchdog timer trigger chnages are present in Patch 1. * Reset Service Task and related Event handling is present in Patches {2,3} * Changes to send reset request to PF, reset stack and re-initialization of the hclge device is present in Patches {4,5,6} * Changes related to ARQ (Asynchronous Receive Queue) and its event handling are present in Patches {7,8} * Changes required in PF to handle the VF Reset request and actually perform hardware VF reset is there in Patch 9. NOTE: This patch depends upon "[PATCH net-next 00/11] fix some bugs for HNS3 driver" Link: https://lkml.org/lkml/2018/3/21/72 ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 1a2e10a + 2bfbd35 commit 6686c45

File tree

11 files changed

+534
-71
lines changed

11 files changed

+534
-71
lines changed

drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
enum HCLGE_MBX_OPCODE {
1313
HCLGE_MBX_RESET = 0x01, /* (VF -> PF) assert reset */
14+
HCLGE_MBX_ASSERTING_RESET, /* (PF -> VF) PF is asserting reset*/
1415
HCLGE_MBX_SET_UNICAST, /* (VF -> PF) set UC addr */
1516
HCLGE_MBX_SET_MULTICAST, /* (VF -> PF) set MC addr */
1617
HCLGE_MBX_SET_VLAN, /* (VF -> PF) set VLAN */
@@ -85,6 +86,21 @@ struct hclge_mbx_pf_to_vf_cmd {
8586
u16 msg[8];
8687
};
8788

89+
/* used by VF to store the received Async responses from PF */
90+
struct hclgevf_mbx_arq_ring {
91+
#define HCLGE_MBX_MAX_ARQ_MSG_SIZE 8
92+
#define HCLGE_MBX_MAX_ARQ_MSG_NUM 1024
93+
struct hclgevf_dev *hdev;
94+
u32 head;
95+
u32 tail;
96+
u32 count;
97+
u16 msg_q[HCLGE_MBX_MAX_ARQ_MSG_NUM][HCLGE_MBX_MAX_ARQ_MSG_SIZE];
98+
};
99+
88100
#define hclge_mbx_ring_ptr_move_crq(crq) \
89101
(crq->next_to_use = (crq->next_to_use + 1) % crq->desc_num)
102+
#define hclge_mbx_tail_ptr_move_arq(arq) \
103+
(arq.tail = (arq.tail + 1) % HCLGE_MBX_MAX_ARQ_MSG_SIZE)
104+
#define hclge_mbx_head_ptr_move_arq(arq) \
105+
(arq.head = (arq.head + 1) % HCLGE_MBX_MAX_ARQ_MSG_SIZE)
90106
#endif

drivers/net/ethernet/hisilicon/hns3/hnae3.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ enum hnae3_reset_notify_type {
118118
};
119119

120120
enum hnae3_reset_type {
121+
HNAE3_VF_RESET,
122+
HNAE3_VF_FULL_RESET,
121123
HNAE3_FUNC_RESET,
122124
HNAE3_CORE_RESET,
123125
HNAE3_GLOBAL_RESET,
@@ -400,8 +402,7 @@ struct hnae3_ae_ops {
400402
int (*set_vf_vlan_filter)(struct hnae3_handle *handle, int vfid,
401403
u16 vlan, u8 qos, __be16 proto);
402404
int (*enable_hw_strip_rxvtag)(struct hnae3_handle *handle, bool enable);
403-
void (*reset_event)(struct hnae3_handle *handle,
404-
enum hnae3_reset_type reset);
405+
void (*reset_event)(struct hnae3_handle *handle);
405406
void (*get_channels)(struct hnae3_handle *handle,
406407
struct ethtool_channels *ch);
407408
void (*get_tqps_and_rss_info)(struct hnae3_handle *h,
@@ -495,6 +496,9 @@ struct hnae3_handle {
495496
struct hnae3_ae_algo *ae_algo; /* the class who provides this handle */
496497
u64 flags; /* Indicate the capabilities for this handle*/
497498

499+
unsigned long last_reset_time;
500+
enum hnae3_reset_type reset_level;
501+
498502
union {
499503
struct net_device *netdev; /* first member */
500504
struct hnae3_knic_private_info kinfo;

drivers/net/ethernet/hisilicon/hns3/hns3_enet.c

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ static int hns3_nic_net_open(struct net_device *netdev)
320320
return ret;
321321
}
322322

323-
priv->last_reset_time = jiffies;
323+
priv->ae_handle->last_reset_time = jiffies;
324324
return 0;
325325
}
326326

@@ -1543,32 +1543,19 @@ static bool hns3_get_tx_timeo_queue_info(struct net_device *ndev)
15431543
static void hns3_nic_net_timeout(struct net_device *ndev)
15441544
{
15451545
struct hns3_nic_priv *priv = netdev_priv(ndev);
1546-
unsigned long last_reset_time = priv->last_reset_time;
15471546
struct hnae3_handle *h = priv->ae_handle;
15481547

15491548
if (!hns3_get_tx_timeo_queue_info(ndev))
15501549
return;
15511550

15521551
priv->tx_timeout_count++;
15531552

1554-
/* This timeout is far away enough from last timeout,
1555-
* if timeout again,set the reset type to PF reset
1556-
*/
1557-
if (time_after(jiffies, (last_reset_time + 20 * HZ)))
1558-
priv->reset_level = HNAE3_FUNC_RESET;
1559-
1560-
/* Don't do any new action before the next timeout */
1561-
else if (time_before(jiffies, (last_reset_time + ndev->watchdog_timeo)))
1553+
if (time_before(jiffies, (h->last_reset_time + ndev->watchdog_timeo)))
15621554
return;
15631555

1564-
priv->last_reset_time = jiffies;
1565-
1556+
/* request the reset */
15661557
if (h->ae_algo->ops->reset_event)
1567-
h->ae_algo->ops->reset_event(h, priv->reset_level);
1568-
1569-
priv->reset_level++;
1570-
if (priv->reset_level > HNAE3_GLOBAL_RESET)
1571-
priv->reset_level = HNAE3_GLOBAL_RESET;
1558+
h->ae_algo->ops->reset_event(h);
15721559
}
15731560

15741561
static const struct net_device_ops hns3_nic_netdev_ops = {
@@ -3122,8 +3109,8 @@ static int hns3_client_init(struct hnae3_handle *handle)
31223109
priv->dev = &pdev->dev;
31233110
priv->netdev = netdev;
31243111
priv->ae_handle = handle;
3125-
priv->last_reset_time = jiffies;
3126-
priv->reset_level = HNAE3_FUNC_RESET;
3112+
priv->ae_handle->reset_level = HNAE3_NONE_RESET;
3113+
priv->ae_handle->last_reset_time = jiffies;
31273114
priv->tx_timeout_count = 0;
31283115

31293116
handle->kinfo.netdev = netdev;
@@ -3355,7 +3342,6 @@ static int hns3_reset_notify_down_enet(struct hnae3_handle *handle)
33553342
static int hns3_reset_notify_up_enet(struct hnae3_handle *handle)
33563343
{
33573344
struct hnae3_knic_private_info *kinfo = &handle->kinfo;
3358-
struct hns3_nic_priv *priv = netdev_priv(kinfo->netdev);
33593345
int ret = 0;
33603346

33613347
if (netif_running(kinfo->netdev)) {
@@ -3365,8 +3351,7 @@ static int hns3_reset_notify_up_enet(struct hnae3_handle *handle)
33653351
"hns net up fail, ret=%d!\n", ret);
33663352
return ret;
33673353
}
3368-
3369-
priv->last_reset_time = jiffies;
3354+
handle->last_reset_time = jiffies;
33703355
}
33713356

33723357
return ret;
@@ -3378,7 +3363,6 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
33783363
struct hns3_nic_priv *priv = netdev_priv(netdev);
33793364
int ret;
33803365

3381-
priv->reset_level = 1;
33823366
hns3_init_mac_addr(netdev);
33833367
hns3_nic_set_rx_mode(netdev);
33843368
hns3_recover_hw_addr(netdev);

drivers/net/ethernet/hisilicon/hns3/hns3_enet.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,8 +532,6 @@ struct hns3_nic_priv {
532532
/* The most recently read link state */
533533
int link;
534534
u64 tx_timeout_count;
535-
enum hnae3_reset_type reset_level;
536-
unsigned long last_reset_time;
537535

538536
unsigned long state;
539537

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2749,7 +2749,7 @@ static int hclge_reset_wait(struct hclge_dev *hdev)
27492749
return 0;
27502750
}
27512751

2752-
static int hclge_func_reset_cmd(struct hclge_dev *hdev, int func_id)
2752+
int hclge_func_reset_cmd(struct hclge_dev *hdev, int func_id)
27532753
{
27542754
struct hclge_desc desc;
27552755
struct hclge_reset_cmd *req = (struct hclge_reset_cmd *)desc.data;
@@ -2845,27 +2845,31 @@ static void hclge_reset(struct hclge_dev *hdev)
28452845
hclge_notify_client(hdev, HNAE3_UP_CLIENT);
28462846
}
28472847

2848-
static void hclge_reset_event(struct hnae3_handle *handle,
2849-
enum hnae3_reset_type reset)
2848+
static void hclge_reset_event(struct hnae3_handle *handle)
28502849
{
28512850
struct hclge_vport *vport = hclge_get_vport(handle);
28522851
struct hclge_dev *hdev = vport->back;
28532852

2854-
dev_info(&hdev->pdev->dev,
2855-
"Receive reset event , reset_type is %d", reset);
2853+
/* check if this is a new reset request and we are not here just because
2854+
* last reset attempt did not succeed and watchdog hit us again. We will
2855+
* know this if last reset request did not occur very recently (watchdog
2856+
* timer = 5*HZ, let us check after sufficiently large time, say 4*5*Hz)
2857+
* In case of new request we reset the "reset level" to PF reset.
2858+
*/
2859+
if (time_after(jiffies, (handle->last_reset_time + 4 * 5 * HZ)))
2860+
handle->reset_level = HNAE3_FUNC_RESET;
28562861

2857-
switch (reset) {
2858-
case HNAE3_FUNC_RESET:
2859-
case HNAE3_CORE_RESET:
2860-
case HNAE3_GLOBAL_RESET:
2861-
/* request reset & schedule reset task */
2862-
set_bit(reset, &hdev->reset_request);
2863-
hclge_reset_task_schedule(hdev);
2864-
break;
2865-
default:
2866-
dev_warn(&hdev->pdev->dev, "Unsupported reset event:%d", reset);
2867-
break;
2868-
}
2862+
dev_info(&hdev->pdev->dev, "received reset event , reset type is %d",
2863+
handle->reset_level);
2864+
2865+
/* request reset & schedule reset task */
2866+
set_bit(handle->reset_level, &hdev->reset_request);
2867+
hclge_reset_task_schedule(hdev);
2868+
2869+
if (handle->reset_level < HNAE3_GLOBAL_RESET)
2870+
handle->reset_level++;
2871+
2872+
handle->last_reset_time = jiffies;
28692873
}
28702874

28712875
static void hclge_reset_subtask(struct hclge_dev *hdev)

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,4 +657,5 @@ void hclge_mbx_handler(struct hclge_dev *hdev);
657657
void hclge_reset_tqp(struct hnae3_handle *handle, u16 queue_id);
658658
void hclge_reset_vf_queue(struct hclge_vport *vport, u16 queue_id);
659659
int hclge_cfg_flowctrl(struct hclge_dev *hdev);
660+
int hclge_func_reset_cmd(struct hclge_dev *hdev, int func_id);
660661
#endif

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,18 @@ static int hclge_send_mbx_msg(struct hclge_vport *vport, u8 *msg, u16 msg_len,
7979
return status;
8080
}
8181

82+
int hclge_inform_reset_assert_to_vf(struct hclge_vport *vport)
83+
{
84+
u8 msg_data[2];
85+
u8 dest_vfid;
86+
87+
dest_vfid = (u8)vport->vport_id;
88+
89+
/* send this requested info to VF */
90+
return hclge_send_mbx_msg(vport, msg_data, sizeof(u8),
91+
HCLGE_MBX_ASSERTING_RESET, dest_vfid);
92+
}
93+
8294
static void hclge_free_vector_ring_chain(struct hnae3_ring_chain_node *head)
8395
{
8496
struct hnae3_ring_chain_node *chain_tmp, *chain;
@@ -339,6 +351,33 @@ static void hclge_mbx_reset_vf_queue(struct hclge_vport *vport,
339351
hclge_gen_resp_to_vf(vport, mbx_req, 0, NULL, 0);
340352
}
341353

354+
static void hclge_reset_vf(struct hclge_vport *vport,
355+
struct hclge_mbx_vf_to_pf_cmd *mbx_req)
356+
{
357+
struct hclge_dev *hdev = vport->back;
358+
int ret;
359+
360+
dev_warn(&hdev->pdev->dev, "PF received VF reset request from VF %d!",
361+
mbx_req->mbx_src_vfid);
362+
363+
/* Acknowledge VF that PF is now about to assert the reset for the VF.
364+
* On receiving this message VF will get into pending state and will
365+
* start polling for the hardware reset completion status.
366+
*/
367+
ret = hclge_inform_reset_assert_to_vf(vport);
368+
if (ret) {
369+
dev_err(&hdev->pdev->dev,
370+
"PF fail(%d) to inform VF(%d)of reset, reset failed!\n",
371+
ret, vport->vport_id);
372+
return;
373+
}
374+
375+
dev_warn(&hdev->pdev->dev, "PF is now resetting VF %d.\n",
376+
mbx_req->mbx_src_vfid);
377+
/* reset this virtual function */
378+
hclge_func_reset_cmd(hdev, mbx_req->mbx_src_vfid);
379+
}
380+
342381
void hclge_mbx_handler(struct hclge_dev *hdev)
343382
{
344383
struct hclge_cmq_ring *crq = &hdev->hw.cmq.crq;
@@ -416,6 +455,9 @@ void hclge_mbx_handler(struct hclge_dev *hdev)
416455
case HCLGE_MBX_QUEUE_RESET:
417456
hclge_mbx_reset_vf_queue(vport, req);
418457
break;
458+
case HCLGE_MBX_RESET:
459+
hclge_reset_vf(vport, req);
460+
break;
419461
default:
420462
dev_err(&hdev->pdev->dev,
421463
"un-supported mailbox message, code = %d\n",

drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,12 @@ int hclgevf_cmd_init(struct hclgevf_dev *hdev)
315315
goto err_csq;
316316
}
317317

318+
/* initialize the pointers of async rx queue of mailbox */
319+
hdev->arq.hdev = hdev;
320+
hdev->arq.head = 0;
321+
hdev->arq.tail = 0;
322+
hdev->arq.count = 0;
323+
318324
/* get firmware version */
319325
ret = hclgevf_cmd_query_firmware_version(&hdev->hw, &version);
320326
if (ret) {

0 commit comments

Comments
 (0)