aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/ibm/ibmvnic.c
diff options
context:
space:
mode:
authorNathan Fontenot <nfont@linux.vnet.ibm.com>2017-05-26 10:31:12 -0400
committerDavid S. Miller <davem@davemloft.net>2017-05-26 15:32:47 -0400
commit57a49436f4e8a76a9125c44d084d12b2c6e6206c (patch)
tree81fe2c2e092e06277cf91b455591f8290edee0e7 /drivers/net/ethernet/ibm/ibmvnic.c
parent8c0543adca2bb17808e46a24eb6e6247181a10b1 (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.c46
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
1729static 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
1748static 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
1731static void release_sub_crq_queue(struct ibmvnic_adapter *adapter, 1768static 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);