diff options
Diffstat (limited to 'drivers/net/cs89x0.c')
| -rw-r--r-- | drivers/net/cs89x0.c | 162 | 
1 files changed, 38 insertions, 124 deletions
diff --git a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c index 2ccb9f12805..d325e01a53e 100644 --- a/drivers/net/cs89x0.c +++ b/drivers/net/cs89x0.c @@ -170,22 +170,12 @@ static char version[] __initdata =  /* The cs8900 has 4 IRQ pins, software selectable. cs8900_irq_map maps     them to system IRQ numbers. This mapping is card specific and is set to     the configuration of the Cirrus Eval board for this chip. */ -#if defined(CONFIG_SH_HICOSH4) -static unsigned int netcard_portlist[] __used __initdata = -   { 0x0300, 0}; -static unsigned int cs8900_irq_map[] = {1,0,0,0}; -#elif defined(CONFIG_MACH_IXDP2351) +#if defined(CONFIG_MACH_IXDP2351)  static unsigned int netcard_portlist[] __used __initdata = {IXDP2351_VIRT_CS8900_BASE, 0};  static unsigned int cs8900_irq_map[] = {IRQ_IXDP2351_CS8900, 0, 0, 0};  #elif defined(CONFIG_ARCH_IXDP2X01)  static unsigned int netcard_portlist[] __used __initdata = {IXDP2X01_CS8900_VIRT_BASE, 0};  static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0}; -#elif defined(CONFIG_ARCH_PNX010X) -#include <mach/gpio.h> -#define CIRRUS_DEFAULT_BASE	IO_ADDRESS(EXT_STATIC2_s0_BASE + 0x200000)	/* = Physical address 0x48200000 */ -#define CIRRUS_DEFAULT_IRQ	VH_INTC_INT_NUM_CASCADED_INTERRUPT_1 /* Event inputs bank 1 - ID 35/bit 3 */ -static unsigned int netcard_portlist[] __used __initdata = {CIRRUS_DEFAULT_BASE, 0}; -static unsigned int cs8900_irq_map[] = {CIRRUS_DEFAULT_IRQ, 0, 0, 0};  #elif defined(CONFIG_MACH_MX31ADS)  #include <mach/board-mx31ads.h>  static unsigned int netcard_portlist[] __used __initdata = { @@ -218,7 +208,6 @@ static unsigned int net_debug = DEBUGGING;  /* Information that need to be kept for each board. */  struct net_local { -	struct net_device_stats stats;  	int chip_type;		/* one of: CS8900, CS8920, CS8920M */  	char chip_revision;	/* revision letter of the chip ('A'...) */  	int send_cmd;		/* the proper send command: TX_NOW, TX_AFTER_381, or TX_AFTER_ALL */ @@ -257,7 +246,7 @@ static void reset_chip(struct net_device *dev);  static int get_eeprom_data(struct net_device *dev, int off, int len, int *buffer);  static int get_eeprom_cksum(int off, int len, int *buffer);  static int set_mac_address(struct net_device *dev, void *addr); -static void count_rx_errors(int status, struct net_local *lp); +static void count_rx_errors(int status, struct net_device *dev);  #ifdef CONFIG_NET_POLL_CONTROLLER  static void net_poll_controller(struct net_device *dev);  #endif @@ -372,18 +361,6 @@ writeword(unsigned long base_addr, int portno, u16 value)  {  	__raw_writel(value, base_addr + (portno << 1));  } -#elif defined(CONFIG_ARCH_PNX010X) -static u16 -readword(unsigned long base_addr, int portno) -{ -	return inw(base_addr + (portno << 1)); -} - -static void -writeword(unsigned long base_addr, int portno, u16 value) -{ -	outw(value, base_addr + (portno << 1)); -}  #else  static u16  readword(unsigned long base_addr, int portno) @@ -546,30 +523,6 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)  #endif          } -#ifdef CONFIG_ARCH_PNX010X -	initialize_ebi(); - -	/* Map GPIO registers for the pins connected to the CS8900a. */ -	if (map_cirrus_gpio() < 0) -		return -ENODEV; - -	reset_cirrus(); - -	/* Map event-router registers. */ -	if (map_event_router() < 0) -		return -ENODEV; - -	enable_cirrus_irq(); - -	unmap_cirrus_gpio(); -	unmap_event_router(); - -	dev->base_addr = ioaddr; - -	for (i = 0 ; i < 3 ; i++) -		readreg(dev, 0); -#endif -  	/* Grab the region so we can find another board if autoIRQ fails. */  	/* WTF is going on here? */  	if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, DRV_NAME)) { @@ -579,12 +532,6 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)  		goto out1;  	} -#ifdef CONFIG_SH_HICOSH4 -	/* truly reset the chip */ -	writeword(ioaddr, ADD_PORT, 0x0114); -	writeword(ioaddr, DATA_PORT, 0x0040); -#endif -  	/* if they give us an odd I/O address, then do ONE write to             the address port, to get it back to address zero, where we             expect to find the EISA signature word. An IO with a base of 0x3 @@ -650,37 +597,6 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)  	   the driver will always do *something* instead of complain that  	   adapter_cnf is 0. */ -#ifdef CONFIG_SH_HICOSH4 -	if (1) { -		/* For the HiCO.SH4 board, things are different: we don't -		   have EEPROM, but there is some data in flash, so we go -		   get it there directly (MAC). */ -		__u16 *confd; -		short cnt; -		if (((* (volatile __u32 *) 0xa0013ff0) & 0x00ffffff) -			== 0x006c3000) { -			confd = (__u16*) 0xa0013fc0; -		} else { -			confd = (__u16*) 0xa001ffc0; -		} -		cnt = (*confd++ & 0x00ff) >> 1; -		while (--cnt > 0) { -			__u16 j = *confd++; - -			switch (j & 0x0fff) { -			case PP_IA: -				for (i = 0; i < ETH_ALEN/2; i++) { -					dev->dev_addr[i*2] = confd[i] & 0xFF; -					dev->dev_addr[i*2+1] = confd[i] >> 8; -				} -				break; -			} -			j = (j >> 12) + 1; -			confd += j; -			cnt -= j; -		} -	} else -#endif          if ((readreg(dev, PP_SelfST) & (EEPROM_OK | EEPROM_PRESENT)) ==  	      (EEPROM_OK|EEPROM_PRESENT)) { @@ -735,11 +651,7 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)          printk("\n");  	/* First check to see if an EEPROM is attached. */ -#ifdef CONFIG_SH_HICOSH4 /* no EEPROM on HiCO, don't hazzle with it here */ -	if (1) { -		printk(KERN_NOTICE "cs89x0: No EEPROM on HiCO.SH4\n"); -	} else -#endif +  	if ((readreg(dev, PP_SelfST) & EEPROM_PRESENT) == 0)  		printk(KERN_WARNING "cs89x0: No EEPROM, relying on command line....\n");  	else if (get_eeprom_data(dev, START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) { @@ -983,7 +895,7 @@ dma_rx(struct net_device *dev)  			dev->name, (unsigned long)bp, status, length);  	}  	if ((status & RX_OK) == 0) { -		count_rx_errors(status, lp); +		count_rx_errors(status, dev);  		goto skip_this_frame;  	} @@ -992,7 +904,7 @@ dma_rx(struct net_device *dev)  	if (skb == NULL) {  		if (net_debug)	/* I don't think we want to do this to a stressed system */  			printk("%s: Memory squeeze, dropping packet.\n", dev->name); -		lp->stats.rx_dropped++; +		dev->stats.rx_dropped++;  		/* AKPM: advance bp to the next frame */  skip_this_frame: @@ -1022,8 +934,8 @@ skip_this_frame:  	}          skb->protocol=eth_type_trans(skb,dev);  	netif_rx(skb); -	lp->stats.rx_packets++; -	lp->stats.rx_bytes += length; +	dev->stats.rx_packets++; +	dev->stats.rx_bytes += length;  }  #endif	/* ALLOW_DMA */ @@ -1276,7 +1188,6 @@ net_open(struct net_device *dev)  	int i;  	int ret; -#if !defined(CONFIG_SH_HICOSH4) && !defined(CONFIG_ARCH_PNX010X) /* uses irq#1, so this won't work */  	if (dev->irq < 2) {  		/* Allow interrupts to be generated by the chip */  /* Cirrus' release had this: */ @@ -1305,7 +1216,6 @@ net_open(struct net_device *dev)  		}  	}  	else -#endif  	{  #ifndef CONFIG_CS89x0_NONISA_IRQ  		if (((1 << dev->irq) & lp->irq_map) == 0) { @@ -1391,9 +1301,6 @@ net_open(struct net_device *dev)  	case A_CNF_MEDIA_10B_2: result = lp->adapter_cnf & A_CNF_10B_2; break;          default: result = lp->adapter_cnf & (A_CNF_10B_T | A_CNF_AUI | A_CNF_10B_2);          } -#ifdef CONFIG_ARCH_PNX010X -	result = A_CNF_10B_T; -#endif          if (!result) {                  printk(KERN_ERR "%s: EEPROM is configured for unavailable media\n", dev->name);  release_dma: @@ -1552,7 +1459,7 @@ static netdev_tx_t net_send_packet(struct sk_buff *skb,struct net_device *dev)  	/* Write the contents of the packet */  	writewords(dev->base_addr, TX_FRAME_PORT,skb->data,(skb->len+1) >>1);  	spin_unlock_irqrestore(&lp->lock, flags); -	lp->stats.tx_bytes += skb->len; +	dev->stats.tx_bytes += skb->len;  	dev_kfree_skb (skb);  	/* @@ -1598,18 +1505,23 @@ static irqreturn_t net_interrupt(int irq, void *dev_id)  			net_rx(dev);  			break;  		case ISQ_TRANSMITTER_EVENT: -			lp->stats.tx_packets++; +			dev->stats.tx_packets++;  			netif_wake_queue(dev);	/* Inform upper layers. */  			if ((status & (	TX_OK |  					TX_LOST_CRS |  					TX_SQE_ERROR |  					TX_LATE_COL |  					TX_16_COL)) != TX_OK) { -				if ((status & TX_OK) == 0) lp->stats.tx_errors++; -				if (status & TX_LOST_CRS) lp->stats.tx_carrier_errors++; -				if (status & TX_SQE_ERROR) lp->stats.tx_heartbeat_errors++; -				if (status & TX_LATE_COL) lp->stats.tx_window_errors++; -				if (status & TX_16_COL) lp->stats.tx_aborted_errors++; +				if ((status & TX_OK) == 0) +					dev->stats.tx_errors++; +				if (status & TX_LOST_CRS) +					dev->stats.tx_carrier_errors++; +				if (status & TX_SQE_ERROR) +					dev->stats.tx_heartbeat_errors++; +				if (status & TX_LATE_COL) +					dev->stats.tx_window_errors++; +				if (status & TX_16_COL) +					dev->stats.tx_aborted_errors++;  			}  			break;  		case ISQ_BUFFER_EVENT: @@ -1651,10 +1563,10 @@ static irqreturn_t net_interrupt(int irq, void *dev_id)  #endif  			break;  		case ISQ_RX_MISS_EVENT: -			lp->stats.rx_missed_errors += (status >>6); +			dev->stats.rx_missed_errors += (status >> 6);  			break;  		case ISQ_TX_COL_EVENT: -			lp->stats.collisions += (status >>6); +			dev->stats.collisions += (status >> 6);  			break;  		}  	} @@ -1662,22 +1574,24 @@ static irqreturn_t net_interrupt(int irq, void *dev_id)  }  static void -count_rx_errors(int status, struct net_local *lp) +count_rx_errors(int status, struct net_device *dev)  { -	lp->stats.rx_errors++; -	if (status & RX_RUNT) lp->stats.rx_length_errors++; -	if (status & RX_EXTRA_DATA) lp->stats.rx_length_errors++; -	if (status & RX_CRC_ERROR) if (!(status & (RX_EXTRA_DATA|RX_RUNT))) +	dev->stats.rx_errors++; +	if (status & RX_RUNT) +		dev->stats.rx_length_errors++; +	if (status & RX_EXTRA_DATA) +		dev->stats.rx_length_errors++; +	if ((status & RX_CRC_ERROR) && !(status & (RX_EXTRA_DATA|RX_RUNT)))  		/* per str 172 */ -		lp->stats.rx_crc_errors++; -	if (status & RX_DRIBBLE) lp->stats.rx_frame_errors++; +		dev->stats.rx_crc_errors++; +	if (status & RX_DRIBBLE) +		dev->stats.rx_frame_errors++;  }  /* We have a good packet(s), get it/them out of the buffers. */  static void  net_rx(struct net_device *dev)  { -	struct net_local *lp = netdev_priv(dev);  	struct sk_buff *skb;  	int status, length; @@ -1686,7 +1600,7 @@ net_rx(struct net_device *dev)  	length = readword(ioaddr, RX_FRAME_PORT);  	if ((status & RX_OK) == 0) { -		count_rx_errors(status, lp); +		count_rx_errors(status, dev);  		return;  	} @@ -1696,7 +1610,7 @@ net_rx(struct net_device *dev)  #if 0		/* Again, this seems a cruel thing to do */  		printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);  #endif -		lp->stats.rx_dropped++; +		dev->stats.rx_dropped++;  		return;  	}  	skb_reserve(skb, 2);	/* longword align L3 header */ @@ -1713,8 +1627,8 @@ net_rx(struct net_device *dev)          skb->protocol=eth_type_trans(skb,dev);  	netif_rx(skb); -	lp->stats.rx_packets++; -	lp->stats.rx_bytes += length; +	dev->stats.rx_packets++; +	dev->stats.rx_bytes += length;  }  #if ALLOW_DMA @@ -1765,11 +1679,11 @@ net_get_stats(struct net_device *dev)  	spin_lock_irqsave(&lp->lock, flags);  	/* Update the statistics from the device registers. */ -	lp->stats.rx_missed_errors += (readreg(dev, PP_RxMiss) >> 6); -	lp->stats.collisions += (readreg(dev, PP_TxCol) >> 6); +	dev->stats.rx_missed_errors += (readreg(dev, PP_RxMiss) >> 6); +	dev->stats.collisions += (readreg(dev, PP_TxCol) >> 6);  	spin_unlock_irqrestore(&lp->lock, flags); -	return &lp->stats; +	return &dev->stats;  }  static void set_multicast_list(struct net_device *dev)  |