diff options
Diffstat (limited to 'drivers/net/ethernet/ibm/ibmvnic.c')
| -rw-r--r-- | drivers/net/ethernet/ibm/ibmvnic.c | 19 | 
1 files changed, 14 insertions, 5 deletions
| diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index bda7a2a9d211..dee05a353dbd 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c @@ -110,6 +110,7 @@ static void ibmvnic_tx_scrq_clean_buffer(struct ibmvnic_adapter *adapter,  					 struct ibmvnic_sub_crq_queue *tx_scrq);  static void free_long_term_buff(struct ibmvnic_adapter *adapter,  				struct ibmvnic_long_term_buff *ltb); +static void ibmvnic_disable_irqs(struct ibmvnic_adapter *adapter);  struct ibmvnic_stat {  	char name[ETH_GSTRING_LEN]; @@ -1424,7 +1425,7 @@ static int __ibmvnic_open(struct net_device *netdev)  	rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_UP);  	if (rc) {  		ibmvnic_napi_disable(adapter); -		release_resources(adapter); +		ibmvnic_disable_irqs(adapter);  		return rc;  	} @@ -1474,9 +1475,6 @@ static int ibmvnic_open(struct net_device *netdev)  		rc = init_resources(adapter);  		if (rc) {  			netdev_err(netdev, "failed to initialize resources\n"); -			release_resources(adapter); -			release_rx_pools(adapter); -			release_tx_pools(adapter);  			goto out;  		}  	} @@ -1493,6 +1491,13 @@ out:  		adapter->state = VNIC_OPEN;  		rc = 0;  	} + +	if (rc) { +		release_resources(adapter); +		release_rx_pools(adapter); +		release_tx_pools(adapter); +	} +  	return rc;  } @@ -5912,10 +5917,14 @@ static ssize_t failover_store(struct device *dev, struct device_attribute *attr,  		   be64_to_cpu(session_token));  	rc = plpar_hcall_norets(H_VIOCTL, adapter->vdev->unit_address,  				H_SESSION_ERR_DETECTED, session_token, 0, 0); -	if (rc) +	if (rc) {  		netdev_err(netdev,  			   "H_VIOCTL initiated failover failed, rc %ld\n",  			   rc); +		goto last_resort; +	} + +	return count;  last_resort:  	netdev_dbg(netdev, "Trying to send CRQ_CMD, the last resort\n"); |