diff options
Diffstat (limited to 'drivers/net/ns83820.c')
| -rw-r--r-- | drivers/net/ns83820.c | 55 | 
1 files changed, 26 insertions, 29 deletions
diff --git a/drivers/net/ns83820.c b/drivers/net/ns83820.c index 5a3488f76b3..84134c766f3 100644 --- a/drivers/net/ns83820.c +++ b/drivers/net/ns83820.c @@ -772,7 +772,7 @@ static int ns83820_setup_rx(struct net_device *ndev)  		phy_intr(ndev);  		/* Okay, let it rip */ -		spin_lock_irq(&dev->misc_lock); +		spin_lock(&dev->misc_lock);  		dev->IMR_cache |= ISR_PHY;  		dev->IMR_cache |= ISR_RXRCMP;  		//dev->IMR_cache |= ISR_RXERR; @@ -923,7 +923,7 @@ static void rx_irq(struct net_device *ndev)  			if ((extsts & 0x002a0000) && !(extsts & 0x00540000)) {  				skb->ip_summed = CHECKSUM_UNNECESSARY;  			} else { -				skb->ip_summed = CHECKSUM_NONE; +				skb_checksum_none_assert(skb);  			}  			skb->protocol = eth_type_trans(skb, ndev);  #ifdef NS83820_VLAN_ACCEL_SUPPORT @@ -1246,7 +1246,6 @@ static int ns83820_get_settings(struct net_device *ndev,  {  	struct ns83820 *dev = PRIV(ndev);  	u32 cfg, tanar, tbicr; -	int have_optical = 0;  	int fullduplex   = 0;  	/* @@ -1267,25 +1266,25 @@ static int ns83820_get_settings(struct net_device *ndev,  	tanar = readl(dev->base + TANAR);  	tbicr = readl(dev->base + TBICR); -	if (dev->CFG_cache & CFG_TBI_EN) { -		/* we have an optical interface */ -		have_optical = 1; -		fullduplex = (cfg & CFG_DUPSTS) ? 1 : 0; - -	} else { -		/* We have copper */ -		fullduplex = (cfg & CFG_DUPSTS) ? 1 : 0; -        } +	fullduplex = (cfg & CFG_DUPSTS) ? 1 : 0;  	cmd->supported = SUPPORTED_Autoneg; -	/* we have optical interface */  	if (dev->CFG_cache & CFG_TBI_EN) { +		/* we have optical interface */  		cmd->supported |= SUPPORTED_1000baseT_Half |  					SUPPORTED_1000baseT_Full |  					SUPPORTED_FIBRE;  		cmd->port       = PORT_FIBRE; -	} /* TODO: else copper related  support */ +	} else { +		/* we have copper */ +		cmd->supported |= SUPPORTED_10baseT_Half | +			SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half | +			SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Half | +			SUPPORTED_1000baseT_Full | +			SUPPORTED_MII; +		cmd->port = PORT_MII; +	}  	cmd->duplex = fullduplex ? DUPLEX_FULL : DUPLEX_HALF;  	switch (cfg / CFG_SPDSTS0 & 3) { @@ -1299,7 +1298,8 @@ static int ns83820_get_settings(struct net_device *ndev,  		cmd->speed = SPEED_10;  		break;  	} -	cmd->autoneg = (tbicr & TBICR_MR_AN_ENABLE) ? 1: 0; +	cmd->autoneg = (tbicr & TBICR_MR_AN_ENABLE) +		? AUTONEG_ENABLE : AUTONEG_DISABLE;  	return 0;  } @@ -1405,6 +1405,13 @@ static const struct ethtool_ops ops = {  	.get_link        = ns83820_get_link  }; +static inline void ns83820_disable_interrupts(struct ns83820 *dev) +{ +	writel(0, dev->base + IMR); +	writel(0, dev->base + IER); +	readl(dev->base + IER); +} +  /* this function is called in irq context from the ISR */  static void ns83820_mib_isr(struct ns83820 *dev)  { @@ -1557,10 +1564,7 @@ static int ns83820_stop(struct net_device *ndev)  	/* FIXME: protect against interrupt handler? */  	del_timer_sync(&dev->tx_watchdog); -	/* disable interrupts */ -	writel(0, dev->base + IMR); -	writel(0, dev->base + IER); -	readl(dev->base + IER); +	ns83820_disable_interrupts(dev);  	dev->rx_info.up = 0;  	synchronize_irq(dev->pci_dev->irq); @@ -2023,10 +2027,7 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev,  		dev->tx_descs, (long)dev->tx_phy_descs,  		dev->rx_info.descs, (long)dev->rx_info.phy_descs); -	/* disable interrupts */ -	writel(0, dev->base + IMR); -	writel(0, dev->base + IER); -	readl(dev->base + IER); +	ns83820_disable_interrupts(dev);  	dev->IMR_cache = 0; @@ -2250,9 +2251,7 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev,  	return 0;  out_cleanup: -	writel(0, dev->base + IMR);	/* paranoia */ -	writel(0, dev->base + IER); -	readl(dev->base + IER); +	ns83820_disable_interrupts(dev); /* paranoia */  out_free_irq:  	rtnl_unlock();  	free_irq(pci_dev->irq, ndev); @@ -2277,9 +2276,7 @@ static void __devexit ns83820_remove_one(struct pci_dev *pci_dev)  	if (!ndev)			/* paranoia */  		return; -	writel(0, dev->base + IMR);	/* paranoia */ -	writel(0, dev->base + IER); -	readl(dev->base + IER); +	ns83820_disable_interrupts(dev); /* paranoia */  	unregister_netdev(ndev);  	free_irq(dev->pci_dev->irq, ndev);  |