diff options
Diffstat (limited to 'drivers/net/ibmveth.c')
| -rw-r--r-- | drivers/net/ibmveth.c | 32 | 
1 files changed, 15 insertions, 17 deletions
| diff --git a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c index 2602852cc55a..4734c939ad03 100644 --- a/drivers/net/ibmveth.c +++ b/drivers/net/ibmveth.c @@ -1113,7 +1113,8 @@ static int ibmveth_change_mtu(struct net_device *dev, int new_mtu)  	struct ibmveth_adapter *adapter = netdev_priv(dev);  	struct vio_dev *viodev = adapter->vdev;  	int new_mtu_oh = new_mtu + IBMVETH_BUFF_OH; -	int i; +	int i, rc; +	int need_restart = 0;  	if (new_mtu < IBMVETH_MAX_MTU)  		return -EINVAL; @@ -1127,35 +1128,32 @@ static int ibmveth_change_mtu(struct net_device *dev, int new_mtu)  	/* Deactivate all the buffer pools so that the next loop can activate  	   only the buffer pools necessary to hold the new MTU */ -	for (i = 0; i < IbmVethNumBufferPools; i++) -		if (adapter->rx_buff_pool[i].active) { -			ibmveth_free_buffer_pool(adapter, -						 &adapter->rx_buff_pool[i]); -			adapter->rx_buff_pool[i].active = 0; -		} +	if (netif_running(adapter->netdev)) { +		need_restart = 1; +		adapter->pool_config = 1; +		ibmveth_close(adapter->netdev); +		adapter->pool_config = 0; +	}  	/* Look for an active buffer pool that can hold the new MTU */  	for(i = 0; i<IbmVethNumBufferPools; i++) {  		adapter->rx_buff_pool[i].active = 1;  		if (new_mtu_oh < adapter->rx_buff_pool[i].buff_size) { -			if (netif_running(adapter->netdev)) { -				adapter->pool_config = 1; -				ibmveth_close(adapter->netdev); -				adapter->pool_config = 0; -				dev->mtu = new_mtu; -				vio_cmo_set_dev_desired(viodev, -						ibmveth_get_desired_dma -						(viodev)); -				return ibmveth_open(adapter->netdev); -			}  			dev->mtu = new_mtu;  			vio_cmo_set_dev_desired(viodev,  						ibmveth_get_desired_dma  						(viodev)); +			if (need_restart) { +				return ibmveth_open(adapter->netdev); +			}  			return 0;  		}  	} + +	if (need_restart && (rc = ibmveth_open(adapter->netdev))) +		return rc; +  	return -EINVAL;  } | 
