diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2011-04-26 04:22:15 -0400 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2011-04-26 04:22:59 -0400 |
| commit | 07f9479a40cc778bc1462ada11f95b01360ae4ff (patch) | |
| tree | 0676cf38df3844004bb3ebfd99dfa67a4a8998f5 /net/dsa | |
| parent | 9d5e6bdb3013acfb311ab407eeca0b6a6a3dedbf (diff) | |
| parent | cd2e49e90f1cae7726c9a2c54488d881d7f1cd1c (diff) | |
Merge branch 'master' into for-next
Fast-forwarded to current state of Linus' tree as there are patches to be
applied for files that didn't exist on the old branch.
Diffstat (limited to 'net/dsa')
| -rw-r--r-- | net/dsa/mv88e6131.c | 25 | ||||
| -rw-r--r-- | net/dsa/mv88e6xxx.h | 2 |
2 files changed, 22 insertions, 5 deletions
diff --git a/net/dsa/mv88e6131.c b/net/dsa/mv88e6131.c index bb2b41bc854e..3da418894efc 100644 --- a/net/dsa/mv88e6131.c +++ b/net/dsa/mv88e6131.c | |||
| @@ -14,6 +14,13 @@ | |||
| 14 | #include "dsa_priv.h" | 14 | #include "dsa_priv.h" |
| 15 | #include "mv88e6xxx.h" | 15 | #include "mv88e6xxx.h" |
| 16 | 16 | ||
| 17 | /* | ||
| 18 | * Switch product IDs | ||
| 19 | */ | ||
| 20 | #define ID_6085 0x04a0 | ||
| 21 | #define ID_6095 0x0950 | ||
| 22 | #define ID_6131 0x1060 | ||
| 23 | |||
| 17 | static char *mv88e6131_probe(struct mii_bus *bus, int sw_addr) | 24 | static char *mv88e6131_probe(struct mii_bus *bus, int sw_addr) |
| 18 | { | 25 | { |
| 19 | int ret; | 26 | int ret; |
| @@ -21,9 +28,11 @@ static char *mv88e6131_probe(struct mii_bus *bus, int sw_addr) | |||
| 21 | ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), 0x03); | 28 | ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), 0x03); |
| 22 | if (ret >= 0) { | 29 | if (ret >= 0) { |
| 23 | ret &= 0xfff0; | 30 | ret &= 0xfff0; |
| 24 | if (ret == 0x0950) | 31 | if (ret == ID_6085) |
| 32 | return "Marvell 88E6085"; | ||
| 33 | if (ret == ID_6095) | ||
| 25 | return "Marvell 88E6095/88E6095F"; | 34 | return "Marvell 88E6095/88E6095F"; |
| 26 | if (ret == 0x1060) | 35 | if (ret == ID_6131) |
| 27 | return "Marvell 88E6131"; | 36 | return "Marvell 88E6131"; |
| 28 | } | 37 | } |
| 29 | 38 | ||
| @@ -124,7 +133,7 @@ static int mv88e6131_setup_global(struct dsa_switch *ds) | |||
| 124 | * Ignore removed tag data on doubly tagged packets, disable | 133 | * Ignore removed tag data on doubly tagged packets, disable |
| 125 | * flow control messages, force flow control priority to the | 134 | * flow control messages, force flow control priority to the |
| 126 | * highest, and send all special multicast frames to the CPU | 135 | * highest, and send all special multicast frames to the CPU |
| 127 | * port at the higest priority. | 136 | * port at the highest priority. |
| 128 | */ | 137 | */ |
| 129 | REG_WRITE(REG_GLOBAL2, 0x05, 0x00ff); | 138 | REG_WRITE(REG_GLOBAL2, 0x05, 0x00ff); |
| 130 | 139 | ||
| @@ -164,6 +173,7 @@ static int mv88e6131_setup_global(struct dsa_switch *ds) | |||
| 164 | 173 | ||
| 165 | static int mv88e6131_setup_port(struct dsa_switch *ds, int p) | 174 | static int mv88e6131_setup_port(struct dsa_switch *ds, int p) |
| 166 | { | 175 | { |
| 176 | struct mv88e6xxx_priv_state *ps = (void *)(ds + 1); | ||
| 167 | int addr = REG_PORT(p); | 177 | int addr = REG_PORT(p); |
| 168 | u16 val; | 178 | u16 val; |
| 169 | 179 | ||
| @@ -171,10 +181,13 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p) | |||
| 171 | * MAC Forcing register: don't force link, speed, duplex | 181 | * MAC Forcing register: don't force link, speed, duplex |
| 172 | * or flow control state to any particular values on physical | 182 | * or flow control state to any particular values on physical |
| 173 | * ports, but force the CPU port and all DSA ports to 1000 Mb/s | 183 | * ports, but force the CPU port and all DSA ports to 1000 Mb/s |
| 174 | * full duplex. | 184 | * (100 Mb/s on 6085) full duplex. |
| 175 | */ | 185 | */ |
| 176 | if (dsa_is_cpu_port(ds, p) || ds->dsa_port_mask & (1 << p)) | 186 | if (dsa_is_cpu_port(ds, p) || ds->dsa_port_mask & (1 << p)) |
| 177 | REG_WRITE(addr, 0x01, 0x003e); | 187 | if (ps->id == ID_6085) |
| 188 | REG_WRITE(addr, 0x01, 0x003d); /* 100 Mb/s */ | ||
| 189 | else | ||
| 190 | REG_WRITE(addr, 0x01, 0x003e); /* 1000 Mb/s */ | ||
| 178 | else | 191 | else |
| 179 | REG_WRITE(addr, 0x01, 0x0003); | 192 | REG_WRITE(addr, 0x01, 0x0003); |
| 180 | 193 | ||
| @@ -286,6 +299,8 @@ static int mv88e6131_setup(struct dsa_switch *ds) | |||
| 286 | mv88e6xxx_ppu_state_init(ds); | 299 | mv88e6xxx_ppu_state_init(ds); |
| 287 | mutex_init(&ps->stats_mutex); | 300 | mutex_init(&ps->stats_mutex); |
| 288 | 301 | ||
| 302 | ps->id = REG_READ(REG_PORT(0), 0x03) & 0xfff0; | ||
| 303 | |||
| 289 | ret = mv88e6131_switch_reset(ds); | 304 | ret = mv88e6131_switch_reset(ds); |
| 290 | if (ret < 0) | 305 | if (ret < 0) |
| 291 | return ret; | 306 | return ret; |
diff --git a/net/dsa/mv88e6xxx.h b/net/dsa/mv88e6xxx.h index eb0e0aaa9f1b..61156ca26a0d 100644 --- a/net/dsa/mv88e6xxx.h +++ b/net/dsa/mv88e6xxx.h | |||
| @@ -39,6 +39,8 @@ struct mv88e6xxx_priv_state { | |||
| 39 | * Hold this mutex over snapshot + dump sequences. | 39 | * Hold this mutex over snapshot + dump sequences. |
| 40 | */ | 40 | */ |
| 41 | struct mutex stats_mutex; | 41 | struct mutex stats_mutex; |
| 42 | |||
| 43 | int id; /* switch product id */ | ||
| 42 | }; | 44 | }; |
| 43 | 45 | ||
| 44 | struct mv88e6xxx_hw_stat { | 46 | struct mv88e6xxx_hw_stat { |
