diff options
Diffstat (limited to 'drivers/net/ethernet/ibm/ibmvnic.c')
| -rw-r--r-- | drivers/net/ethernet/ibm/ibmvnic.c | 76 | 
1 files changed, 33 insertions, 43 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index 7893beffcc71..ed50b8dee44f 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c @@ -485,8 +485,8 @@ static void release_rx_pools(struct ibmvnic_adapter *adapter)  		for (j = 0; j < rx_pool->size; j++) {  			if (rx_pool->rx_buff[j].skb) { -				dev_kfree_skb_any(rx_pool->rx_buff[i].skb); -				rx_pool->rx_buff[i].skb = NULL; +				dev_kfree_skb_any(rx_pool->rx_buff[j].skb); +				rx_pool->rx_buff[j].skb = NULL;  			}  		} @@ -1103,20 +1103,15 @@ static int ibmvnic_open(struct net_device *netdev)  		return 0;  	} -	mutex_lock(&adapter->reset_lock); -  	if (adapter->state != VNIC_CLOSED) {  		rc = ibmvnic_login(netdev); -		if (rc) { -			mutex_unlock(&adapter->reset_lock); +		if (rc)  			return rc; -		}  		rc = init_resources(adapter);  		if (rc) {  			netdev_err(netdev, "failed to initialize resources\n");  			release_resources(adapter); -			mutex_unlock(&adapter->reset_lock);  			return rc;  		}  	} @@ -1124,8 +1119,6 @@ static int ibmvnic_open(struct net_device *netdev)  	rc = __ibmvnic_open(netdev);  	netif_carrier_on(netdev); -	mutex_unlock(&adapter->reset_lock); -  	return rc;  } @@ -1269,10 +1262,8 @@ static int ibmvnic_close(struct net_device *netdev)  		return 0;  	} -	mutex_lock(&adapter->reset_lock);  	rc = __ibmvnic_close(netdev);  	ibmvnic_cleanup(netdev); -	mutex_unlock(&adapter->reset_lock);  	return rc;  } @@ -1545,7 +1536,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)  	tx_crq.v1.sge_len = cpu_to_be32(skb->len);  	tx_crq.v1.ioba = cpu_to_be64(data_dma_addr); -	if (adapter->vlan_header_insertion) { +	if (adapter->vlan_header_insertion && skb_vlan_tag_present(skb)) {  		tx_crq.v1.flags2 |= IBMVNIC_TX_VLAN_INSERT;  		tx_crq.v1.vlan_id = cpu_to_be16(skb->vlan_tci);  	} @@ -1746,6 +1737,7 @@ static int do_reset(struct ibmvnic_adapter *adapter,  		    struct ibmvnic_rwi *rwi, u32 reset_state)  {  	u64 old_num_rx_queues, old_num_tx_queues; +	u64 old_num_rx_slots, old_num_tx_slots;  	struct net_device *netdev = adapter->netdev;  	int i, rc; @@ -1757,6 +1749,8 @@ static int do_reset(struct ibmvnic_adapter *adapter,  	old_num_rx_queues = adapter->req_rx_queues;  	old_num_tx_queues = adapter->req_tx_queues; +	old_num_rx_slots = adapter->req_rx_add_entries_per_subcrq; +	old_num_tx_slots = adapter->req_tx_entries_per_subcrq;  	ibmvnic_cleanup(netdev); @@ -1819,21 +1813,20 @@ static int do_reset(struct ibmvnic_adapter *adapter,  			if (rc)  				return rc;  		} else if (adapter->req_rx_queues != old_num_rx_queues || -			   adapter->req_tx_queues != old_num_tx_queues) { -			adapter->map_id = 1; +			   adapter->req_tx_queues != old_num_tx_queues || +			   adapter->req_rx_add_entries_per_subcrq != +							old_num_rx_slots || +			   adapter->req_tx_entries_per_subcrq != +							old_num_tx_slots) {  			release_rx_pools(adapter);  			release_tx_pools(adapter); -			rc = init_rx_pools(netdev); -			if (rc) -				return rc; -			rc = init_tx_pools(netdev); -			if (rc) -				return rc; -  			release_napi(adapter); -			rc = init_napi(adapter); +			release_vpd_data(adapter); + +			rc = init_resources(adapter);  			if (rc)  				return rc; +  		} else {  			rc = reset_tx_pools(adapter);  			if (rc) @@ -1866,7 +1859,7 @@ static int do_reset(struct ibmvnic_adapter *adapter,  	if (adapter->reset_reason != VNIC_RESET_FAILOVER &&  	    adapter->reset_reason != VNIC_RESET_CHANGE_PARAM) -		netdev_notify_peers(netdev); +		call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, netdev);  	netif_carrier_on(netdev); @@ -1917,17 +1910,8 @@ static int do_hard_reset(struct ibmvnic_adapter *adapter,  		adapter->state = VNIC_PROBED;  		return 0;  	} -	/* netif_set_real_num_xx_queues needs to take rtnl lock here -	 * unless wait_for_reset is set, in which case the rtnl lock -	 * has already been taken before initializing the reset -	 */ -	if (!adapter->wait_for_reset) { -		rtnl_lock(); -		rc = init_resources(adapter); -		rtnl_unlock(); -	} else { -		rc = init_resources(adapter); -	} + +	rc = init_resources(adapter);  	if (rc)  		return rc; @@ -1986,13 +1970,21 @@ static void __ibmvnic_reset(struct work_struct *work)  	struct ibmvnic_rwi *rwi;  	struct ibmvnic_adapter *adapter;  	struct net_device *netdev; +	bool we_lock_rtnl = false;  	u32 reset_state;  	int rc = 0;  	adapter = container_of(work, struct ibmvnic_adapter, ibmvnic_reset);  	netdev = adapter->netdev; -	mutex_lock(&adapter->reset_lock); +	/* netif_set_real_num_xx_queues needs to take rtnl lock here +	 * unless wait_for_reset is set, in which case the rtnl lock +	 * has already been taken before initializing the reset +	 */ +	if (!adapter->wait_for_reset) { +		rtnl_lock(); +		we_lock_rtnl = true; +	}  	reset_state = adapter->state;  	rwi = get_next_rwi(adapter); @@ -2020,12 +2012,11 @@ static void __ibmvnic_reset(struct work_struct *work)  	if (rc) {  		netdev_dbg(adapter->netdev, "Reset failed\n");  		free_all_rwi(adapter); -		mutex_unlock(&adapter->reset_lock); -		return;  	}  	adapter->resetting = false; -	mutex_unlock(&adapter->reset_lock); +	if (we_lock_rtnl) +		rtnl_unlock();  }  static int ibmvnic_reset(struct ibmvnic_adapter *adapter, @@ -4768,7 +4759,6 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)  	INIT_WORK(&adapter->ibmvnic_reset, __ibmvnic_reset);  	INIT_LIST_HEAD(&adapter->rwi_list); -	mutex_init(&adapter->reset_lock);  	mutex_init(&adapter->rwi_lock);  	adapter->resetting = false; @@ -4840,8 +4830,8 @@ static int ibmvnic_remove(struct vio_dev *dev)  	struct ibmvnic_adapter *adapter = netdev_priv(netdev);  	adapter->state = VNIC_REMOVING; -	unregister_netdev(netdev); -	mutex_lock(&adapter->reset_lock); +	rtnl_lock(); +	unregister_netdevice(netdev);  	release_resources(adapter);  	release_sub_crqs(adapter, 1); @@ -4852,7 +4842,7 @@ static int ibmvnic_remove(struct vio_dev *dev)  	adapter->state = VNIC_REMOVED; -	mutex_unlock(&adapter->reset_lock); +	rtnl_unlock();  	device_remove_file(&dev->dev, &dev_attr_failover);  	free_netdev(netdev);  	dev_set_drvdata(&dev->dev, NULL);  | 
