public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [2.6 PATCH 3/6] CRIS architecture update
@ 2004-08-25  9:13 Mikael Starvik
  2004-08-28 23:08 ` Jeff Garzik
  0 siblings, 1 reply; 2+ messages in thread
From: Mikael Starvik @ 2004-08-25  9:13 UTC (permalink / raw)
  To: linux-kernel; +Cc: jgarzik

This patch contains changes related to ethernet. 

 * Use generic MDIO constants.
 * Solve a potential race-condition that could trigger cache-bug.

diff -urNP --exclude='*.cvsignore'
../linux/arch/cris/arch-v10/drivers/ethernet.c
lx25/arch/cris/arch-v10/drivers/ethernet.c
--- ../linux/arch/cris/arch-v10/drivers/ethernet.c	Sat Aug 14 07:36:57
2004
+++ lx25/arch/cris/arch-v10/drivers/ethernet.c	Tue Aug 24 09:14:05 2004
@@ -1,4 +1,4 @@
-/* $Id: ethernet.c,v 1.22 2004/05/14 07:58:03 starvik Exp $
+/* $Id: ethernet.c,v 1.29 2004/08/24 07:14:05 starvik Exp $
  *
  * e100net.c: A network driver for the ETRAX 100LX network controller.
  *
@@ -7,6 +7,21 @@
  * The outline of this driver comes from skeleton.c.
  *
  * $Log: ethernet.c,v $
+ * Revision 1.29  2004/08/24 07:14:05  starvik
+ * Make use of generic MDIO interface and constants.
+ *
+ * Revision 1.28  2004/08/20 09:37:11  starvik
+ * Added support for Intel LXT972A. Creds to Randy Scarborough.
+ *
+ * Revision 1.27  2004/08/16 12:37:22  starvik
+ * Merge of Linux 2.6.8
+ *
+ * Revision 1.25  2004/06/21 10:29:57  starvik
+ * Merge of Linux 2.6.7
+ *
+ * Revision 1.23  2004/06/09 05:29:22  starvik
+ * Avoid any race where R_DMA_CH1_FIRST is NULL (may trigger cache bug).
+ *
  * Revision 1.22  2004/05/14 07:58:03  starvik
  * Merge of changes from 2.4
  *
@@ -252,6 +267,7 @@
 /* Information that need to be kept for each board. */
 struct net_local {
 	struct net_device_stats stats;
+	struct mii_if_info mii_if;
 
 	/* Tx control lock.  This protects the transmit buffer ring
 	 * state along with the "tx full" state of the driver.  This
@@ -271,8 +287,8 @@
 struct transceiver_ops
 {
 	unsigned int oui;
-	void (*check_speed)(void);
-	void (*check_duplex)(void);
+	void (*check_speed)(struct net_device* dev);
+	void (*check_duplex)(struct net_device* dev);
 };
 
 struct transceiver_ops* transceiver;
@@ -295,25 +311,6 @@
 /* 
 ** MDIO constants.
 */
-#define MDIO_BASE_STATUS_REG                0x1
-#define MDIO_BASE_CONTROL_REG               0x0
-#define MDIO_PHY_ID_HIGH_REG                0x2
-#define MDIO_PHY_ID_LOW_REG                 0x3
-#define MDIO_BC_NEGOTIATE                0x0200
-#define MDIO_BC_FULL_DUPLEX_MASK         0x0100
-#define MDIO_BC_AUTO_NEG_MASK            0x1000
-#define MDIO_BC_SPEED_SELECT_MASK        0x2000
-#define MDIO_STATUS_100_FD               0x4000
-#define MDIO_STATUS_100_HD               0x2000
-#define MDIO_STATUS_10_FD                0x1000
-#define MDIO_STATUS_10_HD                0x0800
-#define MDIO_STATUS_SPEED_DUPLEX_MASK	 0x7800
-#define MDIO_ADVERTISMENT_REG               0x4
-#define MDIO_ADVERT_100_FD                0x100
-#define MDIO_ADVERT_100_HD                0x080
-#define MDIO_ADVERT_10_FD                 0x040
-#define MDIO_ADVERT_10_HD                 0x020
-#define MDIO_LINK_UP_MASK                   0x4
 #define MDIO_START                          0x1
 #define MDIO_READ                           0x2
 #define MDIO_WRITE                          0x1
@@ -329,6 +326,11 @@
 #define MDIO_TDK_DIAGNOSTIC_RATE          0x400
 #define MDIO_TDK_DIAGNOSTIC_DPLX          0x800
 
+/*Intel LXT972A specific*/
+#define MDIO_INT_STATUS_REG_2			0x0011
+#define MDIO_INT_FULL_DUPLEX_IND		( 1 << 9 )
+#define MDIO_INT_SPEED				( 1 << 14 )
+
 /* Network flash constants */
 #define NET_FLASH_TIME                  (HZ/50) /* 20 ms */
 #define NET_FLASH_PAUSE                (HZ/100) /* 10 ms */
@@ -409,36 +411,40 @@
 static void e100_hardware_send_packet(char *buf, int length);
 static void update_rx_stats(struct net_device_stats *);
 static void update_tx_stats(struct net_device_stats *);
-static int e100_probe_transceiver(void);
+static int e100_probe_transceiver(struct net_device* dev);
 
-static void e100_check_speed(unsigned long dummy);
-static void e100_set_speed(unsigned long speed);
-static void e100_check_duplex(unsigned long dummy);
-static void e100_set_duplex(enum duplex);
-static void e100_negotiate(void);
+static void e100_check_speed(unsigned long priv);
+static void e100_set_speed(struct net_device* dev, unsigned long speed);
+static void e100_check_duplex(unsigned long priv);
+static void e100_set_duplex(struct net_device* dev, enum duplex);
+static void e100_negotiate(struct net_device* dev);
+
+static int e100_get_mdio_reg(struct net_device *dev, int phy_id, int
location);
+static void e100_set_mdio_reg(struct net_device *dev, int phy_id, int
location, int value);
 
-static unsigned short e100_get_mdio_reg(unsigned char reg_num);
-static void e100_set_mdio_reg(unsigned char reg, unsigned short data);
 static void e100_send_mdio_cmd(unsigned short cmd, int write_cmd);
 static void e100_send_mdio_bit(unsigned char bit);
 static unsigned char e100_receive_mdio_bit(void);
-static void e100_reset_transceiver(void);
+static void e100_reset_transceiver(struct net_device* net);
 
 static void e100_clear_network_leds(unsigned long dummy);
 static void e100_set_network_leds(int active);
 
-static void broadcom_check_speed(void);
-static void broadcom_check_duplex(void);
-static void tdk_check_speed(void);
-static void tdk_check_duplex(void);
-static void generic_check_speed(void);
-static void generic_check_duplex(void);
+static void broadcom_check_speed(struct net_device* dev);
+static void broadcom_check_duplex(struct net_device* dev);
+static void tdk_check_speed(struct net_device* dev);
+static void tdk_check_duplex(struct net_device* dev);
+static void intel_check_speed(struct net_device* dev);
+static void intel_check_duplex(struct net_device* dev);
+static void generic_check_speed(struct net_device* dev);
+static void generic_check_duplex(struct net_device* dev);
 
-struct transceiver_ops transceivers[] =
+struct transceiver_ops transceivers[] = 
 {
 	{0x1018, broadcom_check_speed, broadcom_check_duplex},  /* Broadcom
*/
 	{0xC039, tdk_check_speed, tdk_check_duplex},            /* TDK 2120
*/
 	{0x039C, tdk_check_speed, tdk_check_duplex},            /* TDK 2120C
*/
+        {0x04de, intel_check_speed, intel_check_duplex},     	/* Intel
LXT972A*/
 	{0x0000, generic_check_speed, generic_check_duplex}     /* Generic,
must be last */
 };
 
@@ -456,12 +462,15 @@
 etrax_ethernet_init(void)
 {
 	struct net_device *dev;
+        struct net_local* np;
 	int i, err;
 
-	printk(KERN_INFO
+	printk(KERN_INFO 
 	       "ETRAX 100LX 10/100MBit ethernet v2.0 (c) 2000-2003 Axis
Communications AB\n");
 
 	dev = alloc_etherdev(sizeof(struct net_local));
+	np = dev->priv;
+
 	if (!dev)
 		return -ENOMEM;
 
@@ -545,6 +554,7 @@
 	current_speed = 10;
 	current_speed_selection = 0; /* Auto */
 	speed_timer.expires = jiffies + NET_LINK_UP_CHECK_INTERVAL;
+        duplex_timer.data = (unsigned long)dev;
 	speed_timer.function = e100_check_speed;
         
 	clear_led_timer.function = e100_clear_network_leds;
@@ -552,8 +562,17 @@
 	full_duplex = 0;
 	current_duplex = autoneg;
 	duplex_timer.expires = jiffies + NET_DUPLEX_CHECK_INTERVAL;

+        duplex_timer.data = (unsigned long)dev;
 	duplex_timer.function = e100_check_duplex;
 
+        /* Initialize mii interface */
+	np->mii_if.phy_id = mdio_phy_addr;
+	np->mii_if.phy_id_mask = 0x1f;
+	np->mii_if.reg_num_mask = 0x1f;
+	np->mii_if.dev = dev;
+	np->mii_if.mdio_read = e100_get_mdio_reg;
+	np->mii_if.mdio_write = e100_set_mdio_reg;
+
 	/* Initialize group address registers to make sure that no */
 	/* unwanted addresses are matched */
 	*R_NETWORK_GA_0 = 0x00000000;
@@ -591,12 +610,14 @@
 
 	/* show it in the log as well */
 
+#if 0
 	printk(KERN_INFO "%s: changed MAC to ", dev->name);
 
 	for (i = 0; i < 5; i++)
 		printk("%02X:", dev->dev_addr[i]);
 
 	printk("%02X\n", dev->dev_addr[i]);
+#endif
 
 	spin_unlock(&np->lock);
 
@@ -733,7 +754,7 @@
 	restore_flags(flags);
 	
 	/* Probe for transceiver */
-	if (e100_probe_transceiver())
+	if (e100_probe_transceiver(dev))
 		goto grace_exit3;
 
 	/* Start duplex/speed timers */
@@ -759,45 +780,54 @@
 
 
 static void
-generic_check_speed(void)
+generic_check_speed(struct net_device* dev)
 {
 	unsigned long data;
-	data = e100_get_mdio_reg(MDIO_ADVERTISMENT_REG);
-	if ((data & MDIO_ADVERT_100_FD) ||
-	    (data & MDIO_ADVERT_100_HD))
+	data = e100_get_mdio_reg(dev, mdio_phy_addr, MII_ADVERTISE);
+	if ((data & ADVERTISE_100FULL) ||
+	    (data & ADVERTISE_100HALF))
 		current_speed = 100;
 	else
 		current_speed = 10;
 }
 
 static void
-tdk_check_speed(void)
+tdk_check_speed(struct net_device* dev)
 {
 	unsigned long data;
-	data = e100_get_mdio_reg(MDIO_TDK_DIAGNOSTIC_REG);
+	data = e100_get_mdio_reg(dev, mdio_phy_addr,
MDIO_TDK_DIAGNOSTIC_REG);
 	current_speed = (data & MDIO_TDK_DIAGNOSTIC_RATE ? 100 : 10);
 }
 
 static void
-broadcom_check_speed(void)
+broadcom_check_speed(struct net_device* dev)
 {
 	unsigned long data;
-	data = e100_get_mdio_reg(MDIO_AUX_CTRL_STATUS_REG);
+	data = e100_get_mdio_reg(dev, mdio_phy_addr,
MDIO_AUX_CTRL_STATUS_REG);
 	current_speed = (data & MDIO_BC_SPEED ? 100 : 10);
 }
 
 static void
-e100_check_speed(unsigned long dummy)
+intel_check_speed(struct net_device* dev)
+{
+	unsigned long data;
+	data = e100_get_mdio_reg(dev, mdio_phy_addr, MDIO_INT_STATUS_REG_2);
+	current_speed = (data & MDIO_INT_SPEED ? 100 : 10);
+}
+
+static void
+e100_check_speed(unsigned long priv)
 {
+	struct net_device* dev = (struct net_device*)priv;
 	static int led_initiated = 0;
 	unsigned long data;
 	int old_speed = current_speed;
 
-	data = e100_get_mdio_reg(MDIO_BASE_STATUS_REG);
-	if (!(data & MDIO_LINK_UP_MASK)) {
+	data = e100_get_mdio_reg(dev, mdio_phy_addr, MII_BMSR);
+	if (!(data & BMSR_LSTATUS)) {
 		current_speed = 0;
 	} else {
-		transceiver->check_speed();
+		transceiver->check_speed(dev);
 	}
 	
 	if ((old_speed != current_speed) || !led_initiated) {
@@ -811,71 +841,74 @@
 }
 
 static void
-e100_negotiate(void)
+e100_negotiate(struct net_device* dev)
 {
-	unsigned short data = e100_get_mdio_reg(MDIO_ADVERTISMENT_REG);
+	unsigned short data = e100_get_mdio_reg(dev, mdio_phy_addr,
MII_ADVERTISE);
 
 	/* Discard old speed and duplex settings */
-	data &= ~(MDIO_ADVERT_100_HD | MDIO_ADVERT_100_FD | 
-	          MDIO_ADVERT_10_FD | MDIO_ADVERT_10_HD);
+	data &= ~(ADVERTISE_100HALF | ADVERTISE_100FULL | 
+	          ADVERTISE_10HALF | ADVERTISE_10FULL);
   
 	switch (current_speed_selection) {
 		case 10 :
 			if (current_duplex == full)
-				data |= MDIO_ADVERT_10_FD;
+				data |= ADVERTISE_10FULL;
 			else if (current_duplex == half)
-				data |= MDIO_ADVERT_10_HD;
+				data |= ADVERTISE_10HALF;
 			else
-				data |= MDIO_ADVERT_10_HD |
MDIO_ADVERT_10_FD;
+				data |= ADVERTISE_10HALF | ADVERTISE_10FULL;
 			break;
 
 		case 100 :
 			 if (current_duplex == full)
-				data |= MDIO_ADVERT_100_FD;
+				data |= ADVERTISE_100FULL;
 			else if (current_duplex == half)
-				data |= MDIO_ADVERT_100_HD;
+				data |= ADVERTISE_100HALF;
 			else
-				data |= MDIO_ADVERT_100_HD |
MDIO_ADVERT_100_FD;
+				data |= ADVERTISE_100HALF |
ADVERTISE_100FULL;
 			break;
 
 		case 0 : /* Auto */
 			 if (current_duplex == full)
-				data |= MDIO_ADVERT_100_FD |
MDIO_ADVERT_10_FD;
+				data |= ADVERTISE_100FULL |
ADVERTISE_10FULL;
 			else if (current_duplex == half)
-				data |= MDIO_ADVERT_100_HD |
MDIO_ADVERT_10_HD;
+				data |= ADVERTISE_100HALF |
ADVERTISE_10HALF;
 			else
-				data |= MDIO_ADVERT_100_HD |
MDIO_ADVERT_100_FD | MDIO_ADVERT_10_FD | MDIO_ADVERT_10_HD;
+				data |= ADVERTISE_10HALF | ADVERTISE_10FULL
|
+				  ADVERTISE_100HALF | ADVERTISE_100FULL;
 			break;
 
 		default : /* assume autoneg speed and duplex */
-			data |= MDIO_ADVERT_100_HD | MDIO_ADVERT_100_FD | 
-			        MDIO_ADVERT_10_FD | MDIO_ADVERT_10_HD;
+			data |= ADVERTISE_10HALF | ADVERTISE_10FULL |
+				  ADVERTISE_100HALF | ADVERTISE_100FULL;
 	}
 
-	e100_set_mdio_reg(MDIO_ADVERTISMENT_REG, data);
+	e100_set_mdio_reg(dev, mdio_phy_addr, MII_ADVERTISE, data);
 
 	/* Renegotiate with link partner */
-	data = e100_get_mdio_reg(MDIO_BASE_CONTROL_REG);
-	data |= MDIO_BC_NEGOTIATE;
+	data = e100_get_mdio_reg(dev, mdio_phy_addr, MII_BMCR);
+	data |= BMCR_ANENABLE | BMCR_ANRESTART;
 
-	e100_set_mdio_reg(MDIO_BASE_CONTROL_REG, data);
+	e100_set_mdio_reg(dev, mdio_phy_addr, MII_BMCR, data);
 }
 
 static void
-e100_set_speed(unsigned long speed)
+e100_set_speed(struct net_device* dev, unsigned long speed)
 {
 	if (speed != current_speed_selection) {
 		current_speed_selection = speed;
-		e100_negotiate();
+		e100_negotiate(dev);
 	}
 }
 
 static void
-e100_check_duplex(unsigned long dummy)
+e100_check_duplex(unsigned long priv)
 {
+	struct net_device *dev = (struct net_device *)priv;
+	struct net_local *np = (struct net_local *)dev->priv;
 	int old_duplex = full_duplex;
-	transceiver->check_duplex();
-	if (old_duplex != full_duplex) {
+	transceiver->check_duplex(dev);
+	if (old_duplex != full_duplex) { 
 		/* Duplex changed */
 		SETF(network_rec_config_shadow, R_NETWORK_REC_CONFIG,
duplex, full_duplex);
 		*R_NETWORK_REC_CONFIG = network_rec_config_shadow;
@@ -884,47 +917,56 @@
 	/* Reinitialize the timer. */
 	duplex_timer.expires = jiffies + NET_DUPLEX_CHECK_INTERVAL;
 	add_timer(&duplex_timer);
+	np->mii_if.full_duplex = full_duplex;
 }
 
 static void
-generic_check_duplex(void)
+generic_check_duplex(struct net_device* dev)
 {
 	unsigned long data;
-	data = e100_get_mdio_reg(MDIO_ADVERTISMENT_REG);
-	if ((data & MDIO_ADVERT_100_FD) ||
-	    (data & MDIO_ADVERT_10_FD))
+	data = e100_get_mdio_reg(dev, mdio_phy_addr, MII_ADVERTISE);
+	if ((data & ADVERTISE_10FULL) ||
+	    (data & ADVERTISE_100FULL))
 		full_duplex = 1;
 	else
 		full_duplex = 0;
 }
 
 static void
-tdk_check_duplex(void)
+tdk_check_duplex(struct net_device* dev)
 {
 	unsigned long data;
-	data = e100_get_mdio_reg(MDIO_TDK_DIAGNOSTIC_REG);
+	data = e100_get_mdio_reg(dev, mdio_phy_addr,
MDIO_TDK_DIAGNOSTIC_REG);
 	full_duplex = (data & MDIO_TDK_DIAGNOSTIC_DPLX) ? 1 : 0;
 }
 
 static void
-broadcom_check_duplex(void)
+broadcom_check_duplex(struct net_device* dev)
 {
 	unsigned long data;
-	data = e100_get_mdio_reg(MDIO_AUX_CTRL_STATUS_REG);
+	data = e100_get_mdio_reg(dev, mdio_phy_addr,
MDIO_AUX_CTRL_STATUS_REG);        
 	full_duplex = (data & MDIO_BC_FULL_DUPLEX_IND) ? 1 : 0;
 }
 
+static void
+intel_check_duplex(struct net_device* dev)
+{
+	unsigned long data;
+	data = e100_get_mdio_reg(dev, mdio_phy_addr, MDIO_INT_STATUS_REG_2);

+	full_duplex = (data & MDIO_INT_FULL_DUPLEX_IND) ? 1 : 0;
+}
+
 static void 
-e100_set_duplex(enum duplex new_duplex)
+e100_set_duplex(struct net_device* dev, enum duplex new_duplex)
 {
 	if (new_duplex != current_duplex) {
 		current_duplex = new_duplex;
-		e100_negotiate();
+		e100_negotiate(dev);
 	}
 }
 
-static int
-e100_probe_transceiver(void)
+static int 
+e100_probe_transceiver(struct net_device* dev)
 {
 	unsigned int phyid_high;
 	unsigned int phyid_low;
@@ -933,17 +975,17 @@
 
 	/* Probe MDIO physical address */
 	for (mdio_phy_addr = 0; mdio_phy_addr <= 31; mdio_phy_addr++) {
-		if (e100_get_mdio_reg(MDIO_BASE_STATUS_REG) != 0xffff)
+		if (e100_get_mdio_reg(dev, mdio_phy_addr, MII_BMSR) !=
0xffff)
 			break;
 	}
 	if (mdio_phy_addr == 32)
 		 return -ENODEV;
 
 	/* Get manufacturer */
-	phyid_high = e100_get_mdio_reg(MDIO_PHY_ID_HIGH_REG);
-	phyid_low = e100_get_mdio_reg(MDIO_PHY_ID_LOW_REG);
+	phyid_high = e100_get_mdio_reg(dev, mdio_phy_addr, MII_PHYSID1);
+	phyid_low = e100_get_mdio_reg(dev, mdio_phy_addr, MII_PHYSID2);
 	oui = (phyid_high << 6) | (phyid_low >> 10);
-
+	
 	for (ops = &transceivers[0]; ops->oui; ops++) {
 		if (ops->oui == oui)
 			break;
@@ -953,16 +995,16 @@
 	return 0;
 }
 
-static unsigned short
-e100_get_mdio_reg(unsigned char reg_num)
+static int
+e100_get_mdio_reg(struct net_device *dev, int phy_id, int location)
 {
 	unsigned short cmd;    /* Data to be sent on MDIO port */
-	unsigned short data;   /* Data read from MDIO */
+	int data;   /* Data read from MDIO */
 	int bitCounter;
 	
 	/* Start of frame, OP Code, Physical Address, Register Address */
-	cmd = (MDIO_START << 14) | (MDIO_READ << 12) | (mdio_phy_addr << 7)
|
-		(reg_num << 2);
+	cmd = (MDIO_START << 14) | (MDIO_READ << 12) | (phy_id << 7) |
+		(location << 2);
 	
 	e100_send_mdio_cmd(cmd, 0);
 	
@@ -977,19 +1019,19 @@
 }
 
 static void
-e100_set_mdio_reg(unsigned char reg, unsigned short data)
+e100_set_mdio_reg(struct net_device *dev, int phy_id, int location, int
value)
 {
 	int bitCounter;
 	unsigned short cmd;
 
-	cmd = (MDIO_START << 14) | (MDIO_WRITE << 12) | (mdio_phy_addr << 7)
|
-	      (reg << 2);
+	cmd = (MDIO_START << 14) | (MDIO_WRITE << 12) | (phy_id << 7) |
+	      (location << 2);
 
 	e100_send_mdio_cmd(cmd, 1);
 
 	/* Data... */
 	for (bitCounter=15; bitCounter>=0 ; bitCounter--) {
-		e100_send_mdio_bit(GET_BIT(bitCounter, data));
+		e100_send_mdio_bit(GET_BIT(bitCounter, value));
 	}
 
 }
@@ -1042,15 +1084,15 @@
 }
 
 static void 
-e100_reset_transceiver(void)
+e100_reset_transceiver(struct net_device* dev)
 {
 	unsigned short cmd;
 	unsigned short data;
 	int bitCounter;
 
-	data = e100_get_mdio_reg(MDIO_BASE_CONTROL_REG);
+	data = e100_get_mdio_reg(dev, mdio_phy_addr, MII_BMCR);
 
-	cmd = (MDIO_START << 14) | (MDIO_WRITE << 12) | (mdio_phy_addr << 7)
| (MDIO_BASE_CONTROL_REG << 2);
+	cmd = (MDIO_START << 14) | (MDIO_WRITE << 12) | (mdio_phy_addr << 7)
| (MII_BMCR << 2);
 
 	e100_send_mdio_cmd(cmd, 1);
 	
@@ -1087,7 +1129,7 @@
 	
 	/* Reset the transceiver. */
 	
-	e100_reset_transceiver();
+	e100_reset_transceiver(dev);
 	
 	/* and get rid of the packets that never got an interrupt */
 	while (myFirstTxDesc != myNextTxDesc)
@@ -1157,7 +1199,7 @@
 	unsigned long irqbits = *R_IRQ_MASK2_RD;
  
 	/* Disable RX/TX IRQs to avoid reentrancy */
-	*R_IRQ_MASK2_CLR =
+	*R_IRQ_MASK2_CLR = 
 	  IO_STATE(R_IRQ_MASK2_CLR, dma0_eop, clr) |
 	  IO_STATE(R_IRQ_MASK2_CLR, dma1_eop, clr);
 
@@ -1169,7 +1211,8 @@
 
 		/* check if one or more complete packets were indeed
received */
 
-		while (*R_DMA_CH1_FIRST != virt_to_phys(myNextRxDesc)) {
+		while ((*R_DMA_CH1_FIRST != virt_to_phys(myNextRxDesc)) &&
+		       (myNextRxDesc != myLastRxDesc)) {
 			/* Take out the buffer and give it to the OS, then
 			 * allocate a new buffer to put a packet in.
 			 */
@@ -1208,7 +1251,7 @@
 	}
 
 	/* Enable RX/TX IRQs again */
-	*R_IRQ_MASK2_SET =
+	*R_IRQ_MASK2_SET = 
 	  IO_STATE(R_IRQ_MASK2_SET, dma0_eop, set) |
 	  IO_STATE(R_IRQ_MASK2_SET, dma1_eop, set);
 
@@ -1224,7 +1267,7 @@
 
 	/* check for underrun irq */
 	if (irqbits & IO_STATE(R_IRQ_MASK0_RD, underrun, active)) { 
-		SETS(network_tr_ctrl_shadow, R_NETWORK_TR_CTRL, clr_error,
clr);
+		SETS(network_tr_ctrl_shadow, R_NETWORK_TR_CTRL, clr_error,
clr);	
 		*R_NETWORK_TR_CTRL = network_tr_ctrl_shadow;
 		SETS(network_tr_ctrl_shadow, R_NETWORK_TR_CTRL, clr_error,
nop);
 		np->stats.tx_errors++;
@@ -1238,7 +1281,7 @@
 	}
 	/* check for excessive collision irq */
 	if (irqbits & IO_STATE(R_IRQ_MASK0_RD, excessive_col, active)) { 
-		SETS(network_tr_ctrl_shadow, R_NETWORK_TR_CTRL, clr_error,
clr);
+		SETS(network_tr_ctrl_shadow, R_NETWORK_TR_CTRL, clr_error,
clr);	
 		*R_NETWORK_TR_CTRL = network_tr_ctrl_shadow;
 		SETS(network_tr_ctrl_shadow, R_NETWORK_TR_CTRL, clr_error,
nop);
 		*R_NETWORK_TR_CTRL = IO_STATE(R_NETWORK_TR_CTRL, clr_error,
clr);
@@ -1407,30 +1450,30 @@
 			data->phy_id = mdio_phy_addr;
 			break;
 		case SIOCGMIIREG: /* Read MII register */
-			data->val_out = e100_get_mdio_reg(data->reg_num);
+			data->val_out = e100_get_mdio_reg(dev,
mdio_phy_addr, data->reg_num);
 			break;
 		case SIOCSMIIREG: /* Write MII register */
-			e100_set_mdio_reg(data->reg_num, data->val_in);
+			e100_set_mdio_reg(dev, mdio_phy_addr, data->reg_num,
data->val_in);
 			break;
 		/* The ioctls below should be considered obsolete but are */
 		/* still present for compatability with old scripts/apps  */

 		case SET_ETH_SPEED_10:                  /* 10 Mbps */
-			e100_set_speed(10);
+			e100_set_speed(dev, 10);
 			break;
 		case SET_ETH_SPEED_100:                /* 100 Mbps */
-			e100_set_speed(100);
+			e100_set_speed(dev, 100);
 			break;
 		case SET_ETH_SPEED_AUTO:              /* Auto negotiate
speed */
-			e100_set_speed(0);
+			e100_set_speed(dev, 0);
 			break;
 		case SET_ETH_DUPLEX_HALF:              /* Half duplex. */
-			e100_set_duplex(half);
+			e100_set_duplex(dev, half);
 			break;
 		case SET_ETH_DUPLEX_FULL:              /* Full duplex. */
-			e100_set_duplex(full);
+			e100_set_duplex(dev, full);
 			break;
 		case SET_ETH_DUPLEX_AUTO:             /* Autonegotiate
duplex*/
-			e100_set_duplex(autoneg);
+			e100_set_duplex(dev, autoneg);
 			break;
 		default:
 			return -EINVAL;
@@ -1487,11 +1530,11 @@
 				return -EPERM;
 			}
 			if (ecmd.autoneg == AUTONEG_ENABLE) {
-				e100_set_duplex(autoneg);
-				e100_set_speed(0);
+				e100_set_duplex(dev, autoneg);
+				e100_set_speed(dev, 0);
 			} else {
-				e100_set_duplex(ecmd.duplex == DUPLEX_HALF ?
half : full);
-				e100_set_speed(ecmd.speed == SPEED_10 ? 10:
100);
+				e100_set_duplex(dev, ecmd.duplex ==
DUPLEX_HALF ? half : full);
+				e100_set_speed(dev, ecmd.speed == SPEED_10 ?
10: 100);
 			}
 		}
 		break;
@@ -1500,7 +1543,7 @@
 			struct ethtool_drvinfo info;
 			memset((void *) &info, 0, sizeof (info));
 			strncpy(info.driver, "ETRAX 100LX",
sizeof(info.driver) - 1);
-			strncpy(info.version, "$Revision: 1.22 $",
sizeof(info.version) - 1);
+			strncpy(info.version, "$Revision: 1.29 $",
sizeof(info.version) - 1);
 			strncpy(info.fw_version, "N/A",
sizeof(info.fw_version) - 1);
 			strncpy(info.bus_info, "N/A", sizeof(info.bus_info)
- 1);
 			info.regdump_len = 0;
@@ -1512,7 +1555,7 @@
 		break;
 		case ETHTOOL_NWAY_RST:
 			if (current_duplex == autoneg &&
current_speed_selection == 0)
-				e100_negotiate();
+				e100_negotiate(dev);
 		break;
 		default:
 			return -EOPNOTSUPP;
@@ -1530,17 +1573,17 @@
 	switch(map->port) {
 		case IF_PORT_UNKNOWN:
 			/* Use autoneg */
-			e100_set_speed(0);
-			e100_set_duplex(autoneg);
+			e100_set_speed(dev, 0);
+			e100_set_duplex(dev, autoneg);
 			break;
 		case IF_PORT_10BASET:
-			e100_set_speed(10);
-			e100_set_duplex(autoneg);
+			e100_set_speed(dev, 10);
+			e100_set_duplex(dev, autoneg);
 			break;
 		case IF_PORT_100BASET:
 		case IF_PORT_100BASETX:
-			e100_set_speed(100);
-			e100_set_duplex(autoneg);
+			e100_set_speed(dev, 100);
+			e100_set_duplex(dev, autoneg);
 			break;
 		case IF_PORT_100BASEFX:
 		case IF_PORT_10BASE2:
@@ -1742,9 +1785,9 @@
 		/* Make LED red, link is down */
 #if defined(CONFIG_ETRAX_NETWORK_RED_ON_NO_CONNECTION)
 		LED_NETWORK_SET(LED_RED);
-#else
+#else		
 		LED_NETWORK_SET(LED_OFF);
-#endif
+#endif		
 	}
 	else if (light_leds) {
 		if (current_speed == 10) {
@@ -1778,7 +1821,7 @@
 			return 0;
 		}
 		sa.sa_data[i] = (char)tmp;
-	}
+	}	
 
 	default_mac = sa;
 	return 1;


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2004-08-28 23:08 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-08-25  9:13 [2.6 PATCH 3/6] CRIS architecture update Mikael Starvik
2004-08-28 23:08 ` Jeff Garzik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox