diff options
author | Nathan Fontenot <nfont@linux.vnet.ibm.com> | 2017-05-26 10:31:12 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-05-26 15:32:47 -0400 |
commit | 57a49436f4e8a76a9125c44d084d12b2c6e6206c (patch) | |
tree | 81fe2c2e092e06277cf91b455591f8290edee0e7 /drivers/net/ethernet/ibm/ibmvnic.c | |
parent | 8c0543adca2bb17808e46a24eb6e6247181a10b1 (diff) |
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 <nfont@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/ibm/ibmvnic.c')
-rw-r--r-- | drivers/net/ethernet/ibm/ibmvnic.c | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index 5661a043f5e5..8dcf58088178 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c | |||
@@ -1320,8 +1320,6 @@ static int do_reset(struct ibmvnic_adapter *adapter, | |||
1320 | */ | 1320 | */ |
1321 | adapter->state = VNIC_PROBED; | 1321 | adapter->state = VNIC_PROBED; |
1322 | 1322 | ||
1323 | release_sub_crqs(adapter); | ||
1324 | |||
1325 | rc = ibmvnic_init(adapter); | 1323 | rc = ibmvnic_init(adapter); |
1326 | if (rc) | 1324 | if (rc) |
1327 | return 0; | 1325 | return 0; |
@@ -1728,6 +1726,45 @@ static const struct ethtool_ops ibmvnic_ethtool_ops = { | |||
1728 | 1726 | ||
1729 | /* Routines for managing CRQs/sCRQs */ | 1727 | /* Routines for managing CRQs/sCRQs */ |
1730 | 1728 | ||
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 | |||
1731 | static void release_sub_crq_queue(struct ibmvnic_adapter *adapter, | 1768 | static void release_sub_crq_queue(struct ibmvnic_adapter *adapter, |
1732 | struct ibmvnic_sub_crq_queue *scrq) | 1769 | struct ibmvnic_sub_crq_queue *scrq) |
1733 | { | 1770 | { |
@@ -3607,7 +3644,10 @@ static int ibmvnic_init(struct ibmvnic_adapter *adapter) | |||
3607 | return -1; | 3644 | return -1; |
3608 | } | 3645 | } |
3609 | 3646 | ||
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); | ||
3611 | if (rc) { | 3651 | if (rc) { |
3612 | dev_err(dev, "Initialization of sub crqs failed\n"); | 3652 | dev_err(dev, "Initialization of sub crqs failed\n"); |
3613 | release_crq_queue(adapter); | 3653 | release_crq_queue(adapter); |