diff options
| author | raghavendra.koushik@neterion.com <raghavendra.koushik@neterion.com> | 2005-08-03 12:33:12 -0700 | 
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-08-11 00:10:45 -0400 | 
| commit | d8892c6ee39614bc6d282dbef0ff9fa461a6467c (patch) | |
| tree | 676ff9cba6f3f8bff8715c7f78cf3d1cea473872 /drivers/net | |
| parent | fe113638328995b69d8797e6466b29661b1602d1 (diff) | |
[PATCH] S2io: Support for runtime MTU change
Hi,
Patch below supports MTU change on-the-fly(without bringing interface
down)
Signed-off-by: Ravinandan Arakali <ravinandan.arakali@neterion.com>
Signed-off-by: Raghavendra Koushik <raghavendra.koushik@neterion.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/s2io.c | 28 | 
1 files changed, 16 insertions, 12 deletions
| diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index 28d6d3746c8..aff1fb74e14 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c @@ -2849,6 +2849,7 @@ int s2io_xmit(struct sk_buff *skb, struct net_device *dev)  	}  	txdp->Control_2 |= config->tx_intr_type; +  	txdp->Control_1 |= (TXD_BUFFER0_SIZE(frg_len) |  			    TXD_GATHER_CODE_FIRST);  	txdp->Control_1 |= TXD_LIST_OWN_XENA; @@ -4246,14 +4247,6 @@ int s2io_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)  int s2io_change_mtu(struct net_device *dev, int new_mtu)  {  	nic_t *sp = dev->priv; -	XENA_dev_config_t __iomem *bar0 = sp->bar0; -	register u64 val64; - -	if (netif_running(dev)) { -		DBG_PRINT(ERR_DBG, "%s: Must be stopped to ", dev->name); -		DBG_PRINT(ERR_DBG, "change its MTU\n"); -		return -EBUSY; -	}  	if ((new_mtu < MIN_MTU) || (new_mtu > S2IO_JUMBO_SIZE)) {  		DBG_PRINT(ERR_DBG, "%s: MTU size is invalid.\n", @@ -4261,11 +4254,22 @@ int s2io_change_mtu(struct net_device *dev, int new_mtu)  		return -EPERM;  	} -	/* Set the new MTU into the PYLD register of the NIC */ -	val64 = new_mtu; -	writeq(vBIT(val64, 2, 14), &bar0->rmac_max_pyld_len); -  	dev->mtu = new_mtu; +	if (netif_running(dev)) { +		s2io_card_down(sp); +		netif_stop_queue(dev); +		if (s2io_card_up(sp)) { +			DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n", +				  __FUNCTION__); +		} +		if (netif_queue_stopped(dev)) +			netif_wake_queue(dev); +	} else { /* Device is down */ +		XENA_dev_config_t __iomem *bar0 = sp->bar0; +		u64 val64 = new_mtu; + +		writeq(vBIT(val64, 2, 14), &bar0->rmac_max_pyld_len); +	}  	return 0;  } | 
