Title: [6047] trunk: Task [#2471], [#4719], use register bit define instead of arbitrary magic bit, and modified according to Mike suggested
Revision
6047
Author
gyang
Date
2009-02-03 02:33:29 -0600 (Tue, 03 Feb 2009)

Log Message

Task [#2471], [#4719], use register bit define instead of arbitrary magic bit, and modified according to Mike suggested

Modified Paths

Diff

Modified: trunk/arch/blackfin/mach-bf518/boards/ezbrd.c (6046 => 6047)


--- trunk/arch/blackfin/mach-bf518/boards/ezbrd.c	2009-02-02 09:40:25 UTC (rev 6046)
+++ trunk/arch/blackfin/mach-bf518/boards/ezbrd.c	2009-02-03 08:33:29 UTC (rev 6047)
@@ -262,7 +262,7 @@
 #if defined(CONFIG_NET_DSA_KSZ8893M) \
 	|| defined(CONFIG_NET_DSA_KSZ8893M_MODULE)
 	{
-		.modalias = "spi_switch",
+		.modalias = "ksz8893m",
 		.max_speed_hz = 5000000,
 		.bus_num = 0,
 		.chip_select = 1,

Modified: trunk/net/dsa/ksz8893m.c (6046 => 6047)


--- trunk/net/dsa/ksz8893m.c	2009-02-02 09:40:25 UTC (rev 6046)
+++ trunk/net/dsa/ksz8893m.c	2009-02-03 08:33:29 UTC (rev 6047)
@@ -25,28 +25,34 @@
 	struct spi_device *dev;
 } sw;
 
-static int switch_read_spi(unsigned char *din, unsigned char reg, int len)
+static int ksz8893m_read(unsigned char *din, unsigned char reg, int len)
 {
+	int i, ret;
 	struct spi_message message;
 	unsigned char dout[BUF_LEN];
 	struct spi_transfer *t = &sw.xfer;
-	int i;
 
 	t->len = len;
 	t->tx_buf = dout;
 	t->rx_buf = din;
-	((unsigned char *)(t->tx_buf))[0] = SPI_READ;
-	((unsigned char *)(t->tx_buf))[1] = reg;
+	dout[0] = SPI_READ;
+	dout[1] = reg;
 	for (i = 2; i < len; i++)
-		((unsigned char *)(t->tx_buf))[i] = 0;
+		dout[i] = 0;
 
 	spi_message_init(&message);
 	spi_message_add_tail(t, &message);
-	return spi_sync(sw.dev, &message);
+	ret = spi_sync(sw.dev, &message);
+	if (!ret)
+		return message.status;
+
+	printk(KERN_ERR "ksz8893m: read reg%d failed, ret=%d.\n", reg, ret);
+	return ret;
 }
 
-static int switch_write_spi(unsigned char *dout, unsigned char reg, int len)
+static int ksz8893m_write(unsigned char *dout, unsigned char reg, int len)
 {
+	int ret;
 	struct spi_message message;
 	unsigned char din[BUF_LEN];
 	struct spi_transfer *t = &sw.xfer;
@@ -54,17 +60,22 @@
 	t->len = len;
 	t->tx_buf = dout;
 	t->rx_buf = din;
-	((unsigned char *)(t->tx_buf))[0] = SPI_WRITE;
-	((unsigned char *)(t->tx_buf))[1] = reg;
+	dout[0] = SPI_WRITE;
+	dout[1] = reg;
 
 	spi_message_init(&message);
 	spi_message_add_tail(t, &message);
-	return spi_sync(sw.dev, &message);
+	ret = spi_sync(sw.dev, &message);
+	if (!ret)
+		return message.status;
+
+	printk(KERN_ERR "ksz8893m: write reg%d failed, ret=%d.\n", reg, ret);
+	return ret;
 }
 
 static char *ksz8893m_probe(struct mii_bus *bus, int sw_addr)
 {
-	int phyid_low, phyid_high;
+	int ret, phyid_low, phyid_high;
 	unsigned char din[BUF_LEN];
 
 	phyid_high = mdiobus_read(bus, KSZ8893M_CPU_PORT, MII_PHYSID1);
@@ -72,9 +83,9 @@
 	if (phyid_high != PHYID_HIGH || phyid_low != PHYID_LOW)
 		return NULL;
 
-	switch_read_spi(din, ChipID0, 3);
+	ret = ksz8893m_read(din, ChipID0, 3);
 
-	if (FamilyID == din[2])
+	if (!ret && FAMILY_ID == din[2])
 		return "KSZ8893M";
 
 	return NULL;
@@ -87,63 +98,90 @@
 
 static int ksz8893m_setup_global(struct dsa_switch *ds)
 {
+	int ret;
 	unsigned char dout[BUF_LEN];
 	unsigned char din[BUF_LEN];
 
 	/* Set VLAN VID of port1 */
-	switch_read_spi(din, Port1Control3, 3);
+	ret = ksz8893m_read(din, Port1Control3, 3);
+	if (ret)
+		return ret;
 	din[2] &= 0xf0;
 	dout[2] = (DEFAULT_PORT_VID & 0xfff) >> 8 | din[2];
 	dout[3] = DEFAULT_PORT_VID & 0xff;
-	switch_write_spi(dout, Port1Control3, 4);
+	ret = ksz8893m_write(dout, Port1Control3, 4);
+	if (ret)
+		return ret;
 			
 	/* Set VLAN VID of port2 */
-	switch_read_spi(din, Port2Control3, 3);
+	ret = ksz8893m_read(din, Port2Control3, 3);
+	if (ret)
+		return ret;
 	din[2] &= 0xf0;
 	dout[2] = (DEFAULT_PORT_VID & 0xfff) >> 8 | din[2];
 	dout[3] = DEFAULT_PORT_VID & 0xff;
-	switch_write_spi(dout, Port2Control3, 4);
+	ret = ksz8893m_write(dout, Port2Control3, 4);
+	if (ret)
+		return ret;
 			
 	/* Set VLAN VID of port3 */
-	switch_read_spi(din, Port3Control3, 3);
+	ret = ksz8893m_read(din, Port3Control3, 3);
+	if (ret)
+		return ret;
 	din[2] &= 0xf0;
 	dout[2] = (DEFAULT_PORT_VID & 0xfff) >> 8 | din[2];
 	dout[3] = DEFAULT_PORT_VID & 0xff;
-	switch_write_spi(dout, Port3Control3, 4);
+	ret = ksz8893m_write(dout, Port3Control3, 4);
+	if (ret)
+		return ret;
 
 	/* Insert VLAN tag that egress Port3 */
-	switch_read_spi(din, Port3Control0, 3);
-	dout[2] = 0x4 | din[2];
-	switch_write_spi(dout, Port3Control0, 3);
+	ret = ksz8893m_read(din, Port3Control0, 3);
+	if (ret)
+		return ret;
+	dout[2] = TAG_INSERTION | din[2];
+	ret = ksz8893m_write(dout, Port3Control0, 3);
+	if (ret)
+		return ret;
 
 	/* Enable STPID Mode */
-	switch_read_spi(din, GlobalControl9, 3);
-	dout[2] = 0x01 | din[2];
-	switch_write_spi(dout, GlobalControl9, 3);
+	ret = ksz8893m_read(din, GlobalControl9, 3);
+	if (ret)
+		return ret;
+	dout[2] = SPECIAL_TPID_MODE | din[2];
+	ret = ksz8893m_write(dout, GlobalControl9, 3);
+	if (ret)
+		return ret;
 
 	/* Start switch */
-	dout[2] = StartSwitch;
-	switch_write_spi(dout, ChipID1_StartSwitch, 3);
+	dout[2] = START_SWITCH;
+	ret = ksz8893m_write(dout, ChipID1_StartSwitch, 3);
+	if (ret)
+		return ret;
 
 	return 0;
 }
 
 static int ksz8893m_setup_port(struct dsa_switch *ds, int p)
 {
-	int val;
+	int val, ret;
 	val = mdiobus_read(ds->master_mii_bus, p, MII_BMCR);
-	/* bit 12 auto-negotiation enabled */
-	val |= 0x1000;
-	/* bit 13 force 100, bit 8 force full duplex */
-	val |= 0x2100;
-	/* bit 11 power on, bit 3 enable auto MDI-X, bit 2 enble far-end fault detection */
-	val &= ~0x80c;
-	mdiobus_write(ds->master_mii_bus, p, MII_BMCR, val);
+	if (val < 0)
+		return val;
+	val |= AN_ENABLE | FORCE_100 | FORCE_FULL_DUPLEX;
+	val &= ~(POWER_DOWN | DISABLE_MDIX | DIS_FAR_END_FAULT |\
+			DISABLE_TRANSMIT | DISABLE_LED);
+	ret = mdiobus_write(ds->master_mii_bus, p, MII_BMCR, val);
+	if (ret < 0)
+		return ret;
 
 	val = mdiobus_read(ds->master_mii_bus, p, MII_ADVERTISE);
-	/* bit 8/7/6/5 advertise 100full/100half/10full/10half ability */
-	val |= 0x1e0;
-	mdiobus_write(ds->master_mii_bus, p, MII_ADVERTISE, val);
+	if (val < 0)
+		return val;
+	val |= ADV_10_HALF | ADV_10_FULL | ADV_100_HALF | ADV_100_FULL;
+	ret = mdiobus_write(ds->master_mii_bus, p, MII_ADVERTISE, val);
+	if (ret < 0)
+		return ret;
 	return 0;
 }
 
@@ -179,7 +217,7 @@
 	if (port >= 1 && port <= KSZ8893M_PORT_NUM)
 		return port;
 
-	printk(KERN_INFO "ksz8893m: use default phy addr 3\n");
+	printk(KERN_WARNING "ksz8893m: use default phy addr 3\n");
 	return 3;
 }
 
@@ -209,7 +247,6 @@
 		int speed;
 		int duplex;
 		int anc;
-		int fefd;
 
 		dev = ds->ports[i];
 		if (dev == NULL)
@@ -221,12 +258,8 @@
 			if (val < 0)
 				continue;
 
-			/* bit 2 link is up */
-			link = !!(val & 0x04);
-			/* bit 4 far-end fault detected */
-			fefd = !!(val & 0x10);
-			/* bit 5 auto-negotiation complete */
-			anc = !!(val & 0x20);
+			link = !!(val & LINK_STATUS);
+			anc = !!(val & AN_COMPLETE);
 		}
 
 		if (!link) {
@@ -240,15 +273,17 @@
 		speed = 10;
 		duplex = 0;
 		val = mdiobus_read(ds->master_mii_bus, i, MII_BMSR);
-		/* bit 14/13/12/11 capable of 100full/100half/10full/10half */
-		val &= 0x7800;
-		if (val & 0x4000) {
+		if (val < 0)
+			continue;
+		val &= HALF_10_CAPABLE | FULL_10_CAPABLE |\
+		       HALF_100_CAPABLE | FULL_100_CAPABLE;
+		if (val & FULL_100_CAPABLE) {
 			speed = 100;
 			duplex = 1;
-		} else if (val & 0x2000) {
+		} else if (val & HALF_100_CAPABLE) {
 			speed = 100;
 			duplex = 0;
-		} else if (val & 0x1000) {
+		} else if (val & FULL_10_CAPABLE) {
 			speed = 10;
 			duplex = 1;
 		}
@@ -263,7 +298,11 @@
 
 static int __devinit spi_switch_probe(struct spi_device *spi)
 {
-	memset(&(sw.xfer), 0, sizeof(sw.xfer));
+	if (sw.dev) {
+		printk(KERN_ERR "ksz8893m: only one instance supported at a time\n");
+		return 1;
+	}
+	memset(&sw.xfer, 0, sizeof(sw.xfer));
 	sw.dev = spi;
 	return 0;
 }
@@ -271,13 +310,12 @@
 static int __devexit spi_switch_remove(struct spi_device *spi)
 {
 	sw.dev = NULL;
-	printk(KERN_INFO "spi switch exit\n");
 	return 0;
 }
 
 static struct spi_driver spi_switch_driver = {
 	.driver = {
-		.name	= "spi_switch",
+		.name	= "ksz8893m",
 		.bus	= &spi_bus_type,
 		.owner	= THIS_MODULE,
 	},
@@ -300,7 +338,7 @@
 	int ret;
 	ret = spi_register_driver(&spi_switch_driver);
 	if (ret) {
-		printk(KERN_ERR "Can't register spi_switch_driver!\n");
+		printk(KERN_ERR "ksz8893m: Can't register driver!\n");
 		return ret;
 	}
 

Modified: trunk/net/dsa/ksz8893m.h (6046 => 6047)


--- trunk/net/dsa/ksz8893m.h	2009-02-02 09:40:25 UTC (rev 6046)
+++ trunk/net/dsa/ksz8893m.h	2009-02-03 08:33:29 UTC (rev 6047)
@@ -3,25 +3,101 @@
 #include <linux/netdevice.h>
 
 #define KSZ8893M_PORT_NUM 3
-
 #define KSZ8893M_CPU_PORT 3
 
-#define STPID_HLEN        4
-
-#define ETH_P_8021QH      (ETH_P_8021Q >> 8)
-#define ETH_P_8021QL      (ETH_P_8021Q & 0xFF)
-
 #define DEFAULT_PORT_VID  0
 
 #define SPI_READ          3
 #define SPI_WRITE         2
 
+
+/* PHYID High */
 #define PHYID_HIGH        0x22
+/* PHYID Low */
 #define PHYID_LOW         0x1430
-#define FamilyID          0x88
 
-#define StartSwitch       0x1
+/* MII Basic Control */
+#define SOFT_RESET        0x8000
+#define LOOPBACK          0x4000
+#define FORCE_100         0x2000
+#define AN_ENABLE         0x1000
+#define POWER_DOWN        0x0800
+#define ISOLATE           0x0400
+#define RESTART_AN        0x0200
+#define FORCE_FULL_DUPLEX 0x0100
+#define COLLISION_TEST    0x0080
+/* Bit Reserved */
+#define HP_MDIX           0x0020
+#define Force_MDI         0x0010
+#define DISABLE_MDIX      0x0008
+#define DIS_FAR_END_FAULT 0x0004
+#define DISABLE_TRANSMIT  0x0002
+#define DISABLE_LED       0x0001
 
+/* MII Basic Status */
+#define T4_CAPABLE        0x8000
+#define FULL_100_CAPABLE  0x4000
+#define HALF_100_CAPABLE  0x2000
+#define FULL_10_CAPABLE   0x1000
+#define HALF_10_CAPABLE   0x0800
+/* 4 Bits Reserved */
+#define PREAMBLE_SUPPRESS 0x0040
+#define AN_COMPLETE       0x0020
+#define FAR_END_FAULT     0x0010
+#define AN_CAPABLE        0x0008
+#define LINK_STATUS       0x0004
+#define JABBER_TEST       0x0002
+#define EXTENDED_CAPABLE  0x0001
+
+/* Auto-Negotiation Advertisement Ability */
+#define NEXT_PAGE         0x8000
+/* Bit Reserved */
+#define REMOTE_FAULT      0x2000
+/* 2 Bits Reserved */
+#define PAUSE             0x0400
+/* Bit Reserved */
+#define ADV_100_FULL      0x0100
+#define ADV_100_HALF      0x0080
+#define ADV_10_FULL       0x0040
+#define ADV_10_HALF       0x0020
+#define SELECTOR_FIELD    0x001F
+
+/* Auto-Negotiation Link Partner Ability */
+#define NEXT_PAGE         0x8000
+#define LP_ACK            0x4000
+#define REMOTE_FAULT      0x2000
+/* 2 Bits Reserved */
+#define PAUSE             0x0400
+/* Bit Reserved */
+#define ADV_100_FULL      0x0100
+#define ADV_100_HALF      0x0080
+#define ADV_10_FULL       0x0040
+#define ADV_10_HALF       0x0020
+/* 5 Bits Reserved */
+
+/* LinkMD Control/Status */
+#define VCT_ENABLE        0x8000
+#define VCT_RESULT        0x6000
+#define VCT_10M_SHORT     0x1000
+/* 3 Bits Reserved */
+#define VCT_FAULT_COUNT   0x01FF
+
+/* PHY Special Control/Status */
+/* 10 Bits Reserved */
+#define POLRVS            0x0020
+#define MDI_X_STATUS      0x0010
+#define FORCE_LNK         0x0008
+#define PWRSAVE           0x0004
+#define REMOTE_LOOPBACK   0x0002
+/* Bit Reserved */
+
+
+#define FAMILY_ID         0x88
+#define START_SWITCH      0x01
+#define TAG_INSERTION     0x04
+#define SPECIAL_TPID_MODE 0x01
+
+
 enum switch_phy_reg {
 	/* Global Registers: 0-15 */
 	ChipID0 = 0,

Modified: trunk/net/dsa/tag_stpid.c (6046 => 6047)


--- trunk/net/dsa/tag_stpid.c	2009-02-02 09:40:25 UTC (rev 6046)
+++ trunk/net/dsa/tag_stpid.c	2009-02-03 08:33:29 UTC (rev 6047)
@@ -12,8 +12,15 @@
 #include <linux/list.h>
 #include <linux/netdevice.h>
 #include "dsa_priv.h"
-#include "ksz8893m.h"
 
+#define ETH_P_8021QH      (ETH_P_8021Q >> 8)
+#define ETH_P_8021QL      (ETH_P_8021Q & 0xFF)
+#define STPID_HLEN        4
+
+#define ZERO_VID          0
+#define RESERVED_VID      0xFFF
+#define STPID_VID         ZERO_VID
+
 int stpid_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct dsa_slave_priv *p = netdev_priv(dev);
@@ -71,7 +78,7 @@
 		goto out_drop;
 
 	if (((dsa_header[0] & ETH_P_8021QH) == ETH_P_8021QH) &&
-			(vid != DEFAULT_PORT_VID)) {
+			(vid != STPID_VID)) {
 		u8 new_header[STPID_HLEN];
 
 		/* Convert STPID tag to 802.1q tag */
@@ -87,7 +94,7 @@
 		memcpy(dsa_header, new_header, STPID_HLEN / 2);
 
 	} else if ((dsa_header[0] & ETH_P_8021QH) &&
-			(vid == DEFAULT_PORT_VID)) {
+			(vid == STPID_VID)) {
 
 		if (unlikely(!pskb_may_pull(skb, STPID_HLEN)))
 			goto out_drop;
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
http://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to