diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-06-12 20:35:10 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-06-12 20:35:10 -0700 |
commit | a0e1d1d075cc0efe9a3ac8579bce9393d070e09f (patch) | |
tree | 92964216b94d2f9753c2ec043ab5a121f22bbd6d /drivers/net/ibmveth.c | |
parent | dd14cbc994709a1c5a64ed3621f583c49a27e521 (diff) | |
parent | b232923966f1210e1183353bbd1d52ee53b79fbf (diff) |
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6: (89 commits)
myri10ge: update driver version
myri10ge: report when the link partner is running in Myrinet mode
myri10ge: limit the number of recoveries
NetXen: Fix link status messages
Revert "[netdrvr e100] experiment with doing RX in a similar manner to eepro100"
[PATCH] libertas: convert libertas_mpp into anycast_mask
[PATCH] libertas: actually send mesh frames to mesh netdev
[PATCH] libertas: deauthenticate from AP in channel switch
[PATCH] libertas: pull current channel from firmware on mesh autostart
[PATCH] libertas: reduce SSID and BSSID mixed-case abuse
[PATCH] libertas: remove WPA_SUPPLICANT structure
[PATCH] libertas: remove structure WLAN_802_11_SSID and libertas_escape_essid
[PATCH] libertas: tweak association debug output
[PATCH] libertas: fix big-endian associate command.
[PATCH] libertas: don't byte-swap firmware version number. It's a byte array.
[PATCH] libertas: more endianness fixes, in tx.c this time
[PATCH] libertas: More endianness fixes.
[PATCH] libertas: first pass at fixing up endianness issues
[PATCH] libertas: sparse fixes
[PATCH] libertas: fix character set in README
...
Diffstat (limited to 'drivers/net/ibmveth.c')
-rw-r--r-- | drivers/net/ibmveth.c | 80 |
1 files changed, 54 insertions, 26 deletions
diff --git a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c index 3bec0f733f0..6ec3d500f33 100644 --- a/drivers/net/ibmveth.c +++ b/drivers/net/ibmveth.c @@ -915,17 +915,36 @@ static int ibmveth_change_mtu(struct net_device *dev, int new_mtu) { struct ibmveth_adapter *adapter = dev->priv; int new_mtu_oh = new_mtu + IBMVETH_BUFF_OH; - int i; + int reinit = 0; + int i, rc; if (new_mtu < IBMVETH_MAX_MTU) return -EINVAL; + for (i = 0; i < IbmVethNumBufferPools; i++) + if (new_mtu_oh < adapter->rx_buff_pool[i].buff_size) + break; + + if (i == IbmVethNumBufferPools) + return -EINVAL; + /* Look for an active buffer pool that can hold the new MTU */ for(i = 0; i<IbmVethNumBufferPools; i++) { - if (!adapter->rx_buff_pool[i].active) - continue; + if (!adapter->rx_buff_pool[i].active) { + adapter->rx_buff_pool[i].active = 1; + reinit = 1; + } + if (new_mtu_oh < adapter->rx_buff_pool[i].buff_size) { - dev->mtu = new_mtu; + if (reinit && netif_running(adapter->netdev)) { + adapter->pool_config = 1; + ibmveth_close(adapter->netdev); + adapter->pool_config = 0; + dev->mtu = new_mtu; + if ((rc = ibmveth_open(adapter->netdev))) + return rc; + } else + dev->mtu = new_mtu; return 0; } } @@ -1243,16 +1262,19 @@ const char * buf, size_t count) if (attr == &veth_active_attr) { if (value && !pool->active) { - if(ibmveth_alloc_buffer_pool(pool)) { - ibmveth_error_printk("unable to alloc pool\n"); - return -ENOMEM; - } - pool->active = 1; - adapter->pool_config = 1; - ibmveth_close(netdev); - adapter->pool_config = 0; - if ((rc = ibmveth_open(netdev))) - return rc; + if (netif_running(netdev)) { + if(ibmveth_alloc_buffer_pool(pool)) { + ibmveth_error_printk("unable to alloc pool\n"); + return -ENOMEM; + } + pool->active = 1; + adapter->pool_config = 1; + ibmveth_close(netdev); + adapter->pool_config = 0; + if ((rc = ibmveth_open(netdev))) + return rc; + } else + pool->active = 1; } else if (!value && pool->active) { int mtu = netdev->mtu + IBMVETH_BUFF_OH; int i; @@ -1281,23 +1303,29 @@ const char * buf, size_t count) if (value <= 0 || value > IBMVETH_MAX_POOL_COUNT) return -EINVAL; else { - adapter->pool_config = 1; - ibmveth_close(netdev); - adapter->pool_config = 0; - pool->size = value; - if ((rc = ibmveth_open(netdev))) - return rc; + if (netif_running(netdev)) { + adapter->pool_config = 1; + ibmveth_close(netdev); + adapter->pool_config = 0; + pool->size = value; + if ((rc = ibmveth_open(netdev))) + return rc; + } else + pool->size = value; } } else if (attr == &veth_size_attr) { if (value <= IBMVETH_BUFF_OH || value > IBMVETH_MAX_BUF_SIZE) return -EINVAL; else { - adapter->pool_config = 1; - ibmveth_close(netdev); - adapter->pool_config = 0; - pool->buff_size = value; - if ((rc = ibmveth_open(netdev))) - return rc; + if (netif_running(netdev)) { + adapter->pool_config = 1; + ibmveth_close(netdev); + adapter->pool_config = 0; + pool->buff_size = value; + if ((rc = ibmveth_open(netdev))) + return rc; + } else + pool->buff_size = value; } } |