]> Pileus Git - ~andy/linux/blobdiff - drivers/net/dsa/mv88e6131.c
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
[~andy/linux] / drivers / net / dsa / mv88e6131.c
index 55888b06d8b47af7c90564027db08e2f54bf512d..dadfafba64e9ac0aad3de55d84e5bdea3ceb00a0 100644 (file)
@@ -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);