Skip to content
This repository has been archived by the owner on May 26, 2022. It is now read-only.

Commit

Permalink
ibmvnic: Reset sub-crqs during driver reset
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
nfont authored and davem330 committed May 26, 2017
1 parent 8c0543a commit 57a4943
Showing 1 changed file with 43 additions and 3 deletions.
46 changes: 43 additions & 3 deletions drivers/net/ethernet/ibm/ibmvnic.c
Original file line number Diff line number Diff line change
Expand Up @@ -1320,8 +1320,6 @@ static int do_reset(struct ibmvnic_adapter *adapter,
*/
adapter->state = VNIC_PROBED;

release_sub_crqs(adapter);

rc = ibmvnic_init(adapter);
if (rc)
return 0;
Expand Down Expand Up @@ -1728,6 +1726,45 @@ static const struct ethtool_ops ibmvnic_ethtool_ops = {

/* Routines for managing CRQs/sCRQs */

static int reset_one_sub_crq_queue(struct ibmvnic_adapter *adapter,
struct ibmvnic_sub_crq_queue *scrq)
{
int rc;

if (scrq->irq) {
free_irq(scrq->irq, scrq);
irq_dispose_mapping(scrq->irq);
scrq->irq = 0;
}

memset(scrq->msgs, 0, 2 * PAGE_SIZE);
scrq->cur = 0;

rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token,
4 * PAGE_SIZE, &scrq->crq_num, &scrq->hw_irq);
return rc;
}

static int reset_sub_crq_queues(struct ibmvnic_adapter *adapter)
{
int i, rc;

for (i = 0; i < adapter->req_tx_queues; i++) {
rc = reset_one_sub_crq_queue(adapter, adapter->tx_scrq[i]);
if (rc)
return rc;
}

for (i = 0; i < adapter->req_rx_queues; i++) {
rc = reset_one_sub_crq_queue(adapter, adapter->rx_scrq[i]);
if (rc)
return rc;
}

rc = init_sub_crq_irqs(adapter);
return rc;
}

static void release_sub_crq_queue(struct ibmvnic_adapter *adapter,
struct ibmvnic_sub_crq_queue *scrq)
{
Expand Down Expand Up @@ -3607,7 +3644,10 @@ static int ibmvnic_init(struct ibmvnic_adapter *adapter)
return -1;
}

rc = init_sub_crqs(adapter);
if (adapter->resetting)
rc = reset_sub_crq_queues(adapter);
else
rc = init_sub_crqs(adapter);
if (rc) {
dev_err(dev, "Initialization of sub crqs failed\n");
release_crq_queue(adapter);
Expand Down

0 comments on commit 57a4943

Please sign in to comment.