diff options
Diffstat (limited to 'drivers/net/skge.c')
-rw-r--r-- | drivers/net/skge.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 14bf4cc5b07b..96b661b1f6c0 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
@@ -2192,6 +2192,7 @@ static int skge_up(struct net_device *dev) | |||
2192 | kfree(skge->rx_ring.start); | 2192 | kfree(skge->rx_ring.start); |
2193 | free_pci_mem: | 2193 | free_pci_mem: |
2194 | pci_free_consistent(hw->pdev, skge->mem_size, skge->mem, skge->dma); | 2194 | pci_free_consistent(hw->pdev, skge->mem_size, skge->mem, skge->dma); |
2195 | skge->mem = NULL; | ||
2195 | 2196 | ||
2196 | return err; | 2197 | return err; |
2197 | } | 2198 | } |
@@ -2202,6 +2203,9 @@ static int skge_down(struct net_device *dev) | |||
2202 | struct skge_hw *hw = skge->hw; | 2203 | struct skge_hw *hw = skge->hw; |
2203 | int port = skge->port; | 2204 | int port = skge->port; |
2204 | 2205 | ||
2206 | if (skge->mem == NULL) | ||
2207 | return 0; | ||
2208 | |||
2205 | if (netif_msg_ifdown(skge)) | 2209 | if (netif_msg_ifdown(skge)) |
2206 | printk(KERN_INFO PFX "%s: disabling interface\n", dev->name); | 2210 | printk(KERN_INFO PFX "%s: disabling interface\n", dev->name); |
2207 | 2211 | ||
@@ -2258,6 +2262,7 @@ static int skge_down(struct net_device *dev) | |||
2258 | kfree(skge->rx_ring.start); | 2262 | kfree(skge->rx_ring.start); |
2259 | kfree(skge->tx_ring.start); | 2263 | kfree(skge->tx_ring.start); |
2260 | pci_free_consistent(hw->pdev, skge->mem_size, skge->mem, skge->dma); | 2264 | pci_free_consistent(hw->pdev, skge->mem_size, skge->mem, skge->dma); |
2265 | skge->mem = NULL; | ||
2261 | return 0; | 2266 | return 0; |
2262 | } | 2267 | } |
2263 | 2268 | ||
@@ -2418,18 +2423,23 @@ static void skge_tx_timeout(struct net_device *dev) | |||
2418 | 2423 | ||
2419 | static int skge_change_mtu(struct net_device *dev, int new_mtu) | 2424 | static int skge_change_mtu(struct net_device *dev, int new_mtu) |
2420 | { | 2425 | { |
2421 | int err = 0; | 2426 | int err; |
2422 | int running = netif_running(dev); | ||
2423 | 2427 | ||
2424 | if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU) | 2428 | if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU) |
2425 | return -EINVAL; | 2429 | return -EINVAL; |
2426 | 2430 | ||
2431 | if (!netif_running(dev)) { | ||
2432 | dev->mtu = new_mtu; | ||
2433 | return 0; | ||
2434 | } | ||
2435 | |||
2436 | skge_down(dev); | ||
2427 | 2437 | ||
2428 | if (running) | ||
2429 | skge_down(dev); | ||
2430 | dev->mtu = new_mtu; | 2438 | dev->mtu = new_mtu; |
2431 | if (running) | 2439 | |
2432 | skge_up(dev); | 2440 | err = skge_up(dev); |
2441 | if (err) | ||
2442 | dev_close(dev); | ||
2433 | 2443 | ||
2434 | return err; | 2444 | return err; |
2435 | } | 2445 | } |