Skip to content

Commit 57a4943

Browse files
nfontdavem330
authored andcommitted
ibmvnic: Reset sub-crqs during driver reset
When the ibmvnic driver is resetting, we can just reset the sub crqs instead of releasing all of their resources and re-allocting them. Signed-off-by: Nathan Fontenot <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 8c0543a commit 57a4943

File tree

1 file changed

+43
-3
lines changed

1 file changed

+43
-3
lines changed

drivers/net/ethernet/ibm/ibmvnic.c

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,8 +1320,6 @@ static int do_reset(struct ibmvnic_adapter *adapter,
13201320
*/
13211321
adapter->state = VNIC_PROBED;
13221322

1323-
release_sub_crqs(adapter);
1324-
13251323
rc = ibmvnic_init(adapter);
13261324
if (rc)
13271325
return 0;
@@ -1728,6 +1726,45 @@ static const struct ethtool_ops ibmvnic_ethtool_ops = {
17281726

17291727
/* Routines for managing CRQs/sCRQs */
17301728

1729+
static int reset_one_sub_crq_queue(struct ibmvnic_adapter *adapter,
1730+
struct ibmvnic_sub_crq_queue *scrq)
1731+
{
1732+
int rc;
1733+
1734+
if (scrq->irq) {
1735+
free_irq(scrq->irq, scrq);
1736+
irq_dispose_mapping(scrq->irq);
1737+
scrq->irq = 0;
1738+
}
1739+
1740+
memset(scrq->msgs, 0, 2 * PAGE_SIZE);
1741+
scrq->cur = 0;
1742+
1743+
rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token,
1744+
4 * PAGE_SIZE, &scrq->crq_num, &scrq->hw_irq);
1745+
return rc;
1746+
}
1747+
1748+
static int reset_sub_crq_queues(struct ibmvnic_adapter *adapter)
1749+
{
1750+
int i, rc;
1751+
1752+
for (i = 0; i < adapter->req_tx_queues; i++) {
1753+
rc = reset_one_sub_crq_queue(adapter, adapter->tx_scrq[i]);
1754+
if (rc)
1755+
return rc;
1756+
}
1757+
1758+
for (i = 0; i < adapter->req_rx_queues; i++) {
1759+
rc = reset_one_sub_crq_queue(adapter, adapter->rx_scrq[i]);
1760+
if (rc)
1761+
return rc;
1762+
}
1763+
1764+
rc = init_sub_crq_irqs(adapter);
1765+
return rc;
1766+
}
1767+
17311768
static void release_sub_crq_queue(struct ibmvnic_adapter *adapter,
17321769
struct ibmvnic_sub_crq_queue *scrq)
17331770
{
@@ -3607,7 +3644,10 @@ static int ibmvnic_init(struct ibmvnic_adapter *adapter)
36073644
return -1;
36083645
}
36093646

3610-
rc = init_sub_crqs(adapter);
3647+
if (adapter->resetting)
3648+
rc = reset_sub_crq_queues(adapter);
3649+
else
3650+
rc = init_sub_crqs(adapter);
36113651
if (rc) {
36123652
dev_err(dev, "Initialization of sub crqs failed\n");
36133653
release_crq_queue(adapter);

0 commit comments

Comments
 (0)