diff options
Diffstat (limited to 'drivers/net/dsa/mv88e6131.c')
| -rw-r--r-- | drivers/net/dsa/mv88e6131.c | 114 | 
1 files changed, 38 insertions, 76 deletions
diff --git a/drivers/net/dsa/mv88e6131.c b/drivers/net/dsa/mv88e6131.c index 55888b06d8b..dadfafba64e 100644 --- a/drivers/net/dsa/mv88e6131.c +++ b/drivers/net/dsa/mv88e6131.c @@ -8,6 +8,8 @@   * (at your option) any later version.   */ +#include <linux/delay.h> +#include <linux/jiffies.h>  #include <linux/list.h>  #include <linux/module.h>  #include <linux/netdevice.h> @@ -15,9 +17,7 @@  #include <net/dsa.h>  #include "mv88e6xxx.h" -/* - * Switch product IDs - */ +/* Switch product IDs */  #define ID_6085		0x04a0  #define ID_6095		0x0950  #define ID_6131		0x1060 @@ -44,36 +44,30 @@ static int mv88e6131_switch_reset(struct dsa_switch *ds)  {  	int i;  	int ret; +	unsigned long timeout; -	/* -	 * Set all ports to the disabled state. -	 */ +	/* Set all ports to the disabled state. */  	for (i = 0; i < 11; i++) {  		ret = REG_READ(REG_PORT(i), 0x04);  		REG_WRITE(REG_PORT(i), 0x04, ret & 0xfffc);  	} -	/* -	 * Wait for transmit queues to drain. -	 */ -	msleep(2); +	/* Wait for transmit queues to drain. */ +	usleep_range(2000, 4000); -	/* -	 * Reset the switch. -	 */ +	/* Reset the switch. */  	REG_WRITE(REG_GLOBAL, 0x04, 0xc400); -	/* -	 * Wait up to one second for reset to complete. -	 */ -	for (i = 0; i < 1000; i++) { +	/* Wait up to one second for reset to complete. */ +	timeout = jiffies + 1 * HZ; +	while (time_before(jiffies, timeout)) {  		ret = REG_READ(REG_GLOBAL, 0x00);  		if ((ret & 0xc800) == 0xc800)  			break; -		msleep(1); +		usleep_range(1000, 2000);  	} -	if (i == 1000) +	if (time_after(jiffies, timeout))  		return -ETIMEDOUT;  	return 0; @@ -84,42 +78,34 @@ static int mv88e6131_setup_global(struct dsa_switch *ds)  	int ret;  	int i; -	/* -	 * Enable the PHY polling unit, don't discard packets with +	/* Enable the PHY polling unit, don't discard packets with  	 * excessive collisions, use a weighted fair queueing scheme  	 * to arbitrate between packet queues, set the maximum frame  	 * size to 1632, and mask all interrupt sources.  	 */  	REG_WRITE(REG_GLOBAL, 0x04, 0x4400); -	/* -	 * Set the default address aging time to 5 minutes, and +	/* Set the default address aging time to 5 minutes, and  	 * enable address learn messages to be sent to all message  	 * ports.  	 */  	REG_WRITE(REG_GLOBAL, 0x0a, 0x0148); -	/* -	 * Configure the priority mapping registers. -	 */ +	/* Configure the priority mapping registers. */  	ret = mv88e6xxx_config_prio(ds);  	if (ret < 0)  		return ret; -	/* -	 * Set the VLAN ethertype to 0x8100. -	 */ +	/* Set the VLAN ethertype to 0x8100. */  	REG_WRITE(REG_GLOBAL, 0x19, 0x8100); -	/* -	 * Disable ARP mirroring, and configure the upstream port as +	/* Disable ARP mirroring, and configure the upstream port as  	 * the port to which ingress and egress monitor frames are to  	 * be sent.  	 */  	REG_WRITE(REG_GLOBAL, 0x1a, (dsa_upstream_port(ds) * 0x1100) | 0x00f0); -	/* -	 * Disable cascade port functionality unless this device +	/* Disable cascade port functionality unless this device  	 * is used in a cascade configuration, and set the switch's  	 * DSA device number.  	 */ @@ -128,23 +114,19 @@ static int mv88e6131_setup_global(struct dsa_switch *ds)  	else  		REG_WRITE(REG_GLOBAL, 0x1c, 0xe000 | (ds->index & 0x1f)); -	/* -	 * Send all frames with destination addresses matching +	/* Send all frames with destination addresses matching  	 * 01:80:c2:00:00:0x to the CPU port.  	 */  	REG_WRITE(REG_GLOBAL2, 0x03, 0xffff); -	/* -	 * Ignore removed tag data on doubly tagged packets, disable +	/* Ignore removed tag data on doubly tagged packets, disable  	 * flow control messages, force flow control priority to the  	 * highest, and send all special multicast frames to the CPU  	 * port at the highest priority.  	 */  	REG_WRITE(REG_GLOBAL2, 0x05, 0x00ff); -	/* -	 * Program the DSA routing table. -	 */ +	/* Program the DSA routing table. */  	for (i = 0; i < 32; i++) {  		int nexthop; @@ -155,20 +137,15 @@ static int mv88e6131_setup_global(struct dsa_switch *ds)  		REG_WRITE(REG_GLOBAL2, 0x06, 0x8000 | (i << 8) | nexthop);  	} -	/* -	 * Clear all trunk masks. -	 */ +	/* Clear all trunk masks. */  	for (i = 0; i < 8; i++)  		REG_WRITE(REG_GLOBAL2, 0x07, 0x8000 | (i << 12) | 0x7ff); -	/* -	 * Clear all trunk mappings. -	 */ +	/* Clear all trunk mappings. */  	for (i = 0; i < 16; i++)  		REG_WRITE(REG_GLOBAL2, 0x08, 0x8000 | (i << 11)); -	/* -	 * Force the priority of IGMP/MLD snoop frames and ARP frames +	/* Force the priority of IGMP/MLD snoop frames and ARP frames  	 * to the highest setting.  	 */  	REG_WRITE(REG_GLOBAL2, 0x0f, 0x00ff); @@ -182,8 +159,7 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)  	int addr = REG_PORT(p);  	u16 val; -	/* -	 * MAC Forcing register: don't force link, speed, duplex +	/* MAC Forcing register: don't force link, speed, duplex  	 * or flow control state to any particular values on physical  	 * ports, but force the CPU port and all DSA ports to 1000 Mb/s  	 * (100 Mb/s on 6085) full duplex. @@ -196,8 +172,7 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)  	else  		REG_WRITE(addr, 0x01, 0x0003); -	/* -	 * Port Control: disable Core Tag, disable Drop-on-Lock, +	/* Port Control: disable Core Tag, disable Drop-on-Lock,  	 * transmit frames unmodified, disable Header mode,  	 * enable IGMP/MLD snoop, disable DoubleTag, disable VLAN  	 * tunneling, determine priority by looking at 802.1p and @@ -214,8 +189,7 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)  	val = 0x0433;  	if (p == dsa_upstream_port(ds)) {  		val |= 0x0104; -		/* -		 * On 6085, unknown multicast forward is controlled +		/* On 6085, unknown multicast forward is controlled  		 * here rather than in Port Control 2 register.  		 */  		if (ps->id == ID_6085) @@ -225,14 +199,12 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)  		val |= 0x0100;  	REG_WRITE(addr, 0x04, val); -	/* -	 * Port Control 1: disable trunking.  Also, if this is the +	/* Port Control 1: disable trunking.  Also, if this is the  	 * CPU port, enable learn messages to be sent to this port.  	 */  	REG_WRITE(addr, 0x05, dsa_is_cpu_port(ds, p) ? 0x8000 : 0x0000); -	/* -	 * Port based VLAN map: give each port its own address +	/* Port based VLAN map: give each port its own address  	 * database, allow the CPU port to talk to each of the 'real'  	 * ports, and allow each of the 'real' ports to only talk to  	 * the upstream port. @@ -244,14 +216,12 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)  		val |= 1 << dsa_upstream_port(ds);  	REG_WRITE(addr, 0x06, val); -	/* -	 * Default VLAN ID and priority: don't set a default VLAN +	/* Default VLAN ID and priority: don't set a default VLAN  	 * ID, and set the default packet priority to zero.  	 */  	REG_WRITE(addr, 0x07, 0x0000); -	/* -	 * Port Control 2: don't force a good FCS, don't use +	/* Port Control 2: don't force a good FCS, don't use  	 * VLAN-based, source address-based or destination  	 * address-based priority overrides, don't let the switch  	 * add or strip 802.1q tags, don't discard tagged or @@ -264,8 +234,7 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)  	 * forwarding of unknown multicast addresses.  	 */  	if (ps->id == ID_6085) -		/* -		 * on 6085, bits 3:0 are reserved, bit 6 control ARP +		/* on 6085, bits 3:0 are reserved, bit 6 control ARP  		 * mirroring, and multicast forward is handled in  		 * Port Control register.  		 */ @@ -277,32 +246,25 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)  		REG_WRITE(addr, 0x08, val);  	} -	/* -	 * Rate Control: disable ingress rate limiting. -	 */ +	/* Rate Control: disable ingress rate limiting. */  	REG_WRITE(addr, 0x09, 0x0000); -	/* -	 * Rate Control 2: disable egress rate limiting. -	 */ +	/* Rate Control 2: disable egress rate limiting. */  	REG_WRITE(addr, 0x0a, 0x0000); -	/* -	 * Port Association Vector: when learning source addresses +	/* Port Association Vector: when learning source addresses  	 * of packets, add the address to the address database using  	 * a port bitmap that has only the bit for this port set and  	 * the other bits clear.  	 */  	REG_WRITE(addr, 0x0b, 1 << p); -	/* -	 * Tag Remap: use an identity 802.1p prio -> switch prio +	/* Tag Remap: use an identity 802.1p prio -> switch prio  	 * mapping.  	 */  	REG_WRITE(addr, 0x18, 0x3210); -	/* -	 * Tag Remap 2: use an identity 802.1p prio -> switch prio +	/* Tag Remap 2: use an identity 802.1p prio -> switch prio  	 * mapping.  	 */  	REG_WRITE(addr, 0x19, 0x7654);  |