diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/dsa | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'net/dsa')
-rw-r--r-- | net/dsa/Kconfig | 4 | ||||
-rw-r--r-- | net/dsa/dsa.c | 4 | ||||
-rw-r--r-- | net/dsa/mv88e6060.c | 7 | ||||
-rw-r--r-- | net/dsa/mv88e6131.c | 51 | ||||
-rw-r--r-- | net/dsa/mv88e6xxx.h | 2 | ||||
-rw-r--r-- | net/dsa/slave.c | 1 |
6 files changed, 51 insertions, 18 deletions
diff --git a/net/dsa/Kconfig b/net/dsa/Kconfig index 87bb5f4de0e8..c53ded2a98df 100644 --- a/net/dsa/Kconfig +++ b/net/dsa/Kconfig | |||
@@ -41,12 +41,12 @@ config NET_DSA_MV88E6XXX_NEED_PPU | |||
41 | default n | 41 | default n |
42 | 42 | ||
43 | config NET_DSA_MV88E6131 | 43 | config NET_DSA_MV88E6131 |
44 | bool "Marvell 88E6095/6095F/6131 ethernet switch chip support" | 44 | bool "Marvell 88E6085/6095/6095F/6131 ethernet switch chip support" |
45 | select NET_DSA_MV88E6XXX | 45 | select NET_DSA_MV88E6XXX |
46 | select NET_DSA_MV88E6XXX_NEED_PPU | 46 | select NET_DSA_MV88E6XXX_NEED_PPU |
47 | select NET_DSA_TAG_DSA | 47 | select NET_DSA_TAG_DSA |
48 | ---help--- | 48 | ---help--- |
49 | This enables support for the Marvell 88E6095/6095F/6131 | 49 | This enables support for the Marvell 88E6085/6095/6095F/6131 |
50 | ethernet switch chips. | 50 | ethernet switch chips. |
51 | 51 | ||
52 | config NET_DSA_MV88E6123_61_65 | 52 | config NET_DSA_MV88E6123_61_65 |
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c index 6112a12578b2..3fb14b7c13cf 100644 --- a/net/dsa/dsa.c +++ b/net/dsa/dsa.c | |||
@@ -390,7 +390,7 @@ static int dsa_remove(struct platform_device *pdev) | |||
390 | if (dst->link_poll_needed) | 390 | if (dst->link_poll_needed) |
391 | del_timer_sync(&dst->link_poll_timer); | 391 | del_timer_sync(&dst->link_poll_timer); |
392 | 392 | ||
393 | flush_scheduled_work(); | 393 | flush_work_sync(&dst->link_poll_work); |
394 | 394 | ||
395 | for (i = 0; i < dst->pd->nr_chips; i++) { | 395 | for (i = 0; i < dst->pd->nr_chips; i++) { |
396 | struct dsa_switch *ds = dst->ds[i]; | 396 | struct dsa_switch *ds = dst->ds[i]; |
@@ -428,7 +428,7 @@ static void __exit dsa_cleanup_module(void) | |||
428 | } | 428 | } |
429 | module_exit(dsa_cleanup_module); | 429 | module_exit(dsa_cleanup_module); |
430 | 430 | ||
431 | MODULE_AUTHOR("Lennert Buytenhek <buytenh@wantstofly.org>") | 431 | MODULE_AUTHOR("Lennert Buytenhek <buytenh@wantstofly.org>"); |
432 | MODULE_DESCRIPTION("Driver for Distributed Switch Architecture switch chips"); | 432 | MODULE_DESCRIPTION("Driver for Distributed Switch Architecture switch chips"); |
433 | MODULE_LICENSE("GPL"); | 433 | MODULE_LICENSE("GPL"); |
434 | MODULE_ALIAS("platform:dsa"); | 434 | MODULE_ALIAS("platform:dsa"); |
diff --git a/net/dsa/mv88e6060.c b/net/dsa/mv88e6060.c index 83277f463af7..8f4ff5a2c813 100644 --- a/net/dsa/mv88e6060.c +++ b/net/dsa/mv88e6060.c | |||
@@ -18,7 +18,7 @@ | |||
18 | 18 | ||
19 | static int reg_read(struct dsa_switch *ds, int addr, int reg) | 19 | static int reg_read(struct dsa_switch *ds, int addr, int reg) |
20 | { | 20 | { |
21 | return mdiobus_read(ds->master_mii_bus, addr, reg); | 21 | return mdiobus_read(ds->master_mii_bus, ds->pd->sw_addr + addr, reg); |
22 | } | 22 | } |
23 | 23 | ||
24 | #define REG_READ(addr, reg) \ | 24 | #define REG_READ(addr, reg) \ |
@@ -34,7 +34,8 @@ static int reg_read(struct dsa_switch *ds, int addr, int reg) | |||
34 | 34 | ||
35 | static int reg_write(struct dsa_switch *ds, int addr, int reg, u16 val) | 35 | static int reg_write(struct dsa_switch *ds, int addr, int reg, u16 val) |
36 | { | 36 | { |
37 | return mdiobus_write(ds->master_mii_bus, addr, reg, val); | 37 | return mdiobus_write(ds->master_mii_bus, ds->pd->sw_addr + addr, |
38 | reg, val); | ||
38 | } | 39 | } |
39 | 40 | ||
40 | #define REG_WRITE(addr, reg, val) \ | 41 | #define REG_WRITE(addr, reg, val) \ |
@@ -50,7 +51,7 @@ static char *mv88e6060_probe(struct mii_bus *bus, int sw_addr) | |||
50 | { | 51 | { |
51 | int ret; | 52 | int ret; |
52 | 53 | ||
53 | ret = mdiobus_read(bus, REG_PORT(0), 0x03); | 54 | ret = mdiobus_read(bus, sw_addr + REG_PORT(0), 0x03); |
54 | if (ret >= 0) { | 55 | if (ret >= 0) { |
55 | ret &= 0xfff0; | 56 | ret &= 0xfff0; |
56 | if (ret == 0x0600) | 57 | if (ret == 0x0600) |
diff --git a/net/dsa/mv88e6131.c b/net/dsa/mv88e6131.c index bb2b41bc854e..45f7411e90ba 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 | ||
@@ -194,8 +207,15 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p) | |||
194 | * mode, but do not enable forwarding of unknown unicasts. | 207 | * mode, but do not enable forwarding of unknown unicasts. |
195 | */ | 208 | */ |
196 | val = 0x0433; | 209 | val = 0x0433; |
197 | if (p == dsa_upstream_port(ds)) | 210 | if (p == dsa_upstream_port(ds)) { |
198 | val |= 0x0104; | 211 | val |= 0x0104; |
212 | /* | ||
213 | * On 6085, unknown multicast forward is controlled | ||
214 | * here rather than in Port Control 2 register. | ||
215 | */ | ||
216 | if (ps->id == ID_6085) | ||
217 | val |= 0x0008; | ||
218 | } | ||
199 | if (ds->dsa_port_mask & (1 << p)) | 219 | if (ds->dsa_port_mask & (1 << p)) |
200 | val |= 0x0100; | 220 | val |= 0x0100; |
201 | REG_WRITE(addr, 0x04, val); | 221 | REG_WRITE(addr, 0x04, val); |
@@ -238,10 +258,19 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p) | |||
238 | * If this is the upstream port for this switch, enable | 258 | * If this is the upstream port for this switch, enable |
239 | * forwarding of unknown multicast addresses. | 259 | * forwarding of unknown multicast addresses. |
240 | */ | 260 | */ |
241 | val = 0x0080 | dsa_upstream_port(ds); | 261 | if (ps->id == ID_6085) |
242 | if (p == dsa_upstream_port(ds)) | 262 | /* |
243 | val |= 0x0040; | 263 | * on 6085, bits 3:0 are reserved, bit 6 control ARP |
244 | REG_WRITE(addr, 0x08, val); | 264 | * mirroring, and multicast forward is handled in |
265 | * Port Control register. | ||
266 | */ | ||
267 | REG_WRITE(addr, 0x08, 0x0080); | ||
268 | else { | ||
269 | val = 0x0080 | dsa_upstream_port(ds); | ||
270 | if (p == dsa_upstream_port(ds)) | ||
271 | val |= 0x0040; | ||
272 | REG_WRITE(addr, 0x08, val); | ||
273 | } | ||
245 | 274 | ||
246 | /* | 275 | /* |
247 | * Rate Control: disable ingress rate limiting. | 276 | * Rate Control: disable ingress rate limiting. |
@@ -286,6 +315,8 @@ static int mv88e6131_setup(struct dsa_switch *ds) | |||
286 | mv88e6xxx_ppu_state_init(ds); | 315 | mv88e6xxx_ppu_state_init(ds); |
287 | mutex_init(&ps->stats_mutex); | 316 | mutex_init(&ps->stats_mutex); |
288 | 317 | ||
318 | ps->id = REG_READ(REG_PORT(0), 0x03) & 0xfff0; | ||
319 | |||
289 | ret = mv88e6131_switch_reset(ds); | 320 | ret = mv88e6131_switch_reset(ds); |
290 | if (ret < 0) | 321 | if (ret < 0) |
291 | return ret; | 322 | 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 { |
diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 64ca2a6fa0d4..0a47b6c37038 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c | |||
@@ -288,7 +288,6 @@ static const struct ethtool_ops dsa_slave_ethtool_ops = { | |||
288 | .get_drvinfo = dsa_slave_get_drvinfo, | 288 | .get_drvinfo = dsa_slave_get_drvinfo, |
289 | .nway_reset = dsa_slave_nway_reset, | 289 | .nway_reset = dsa_slave_nway_reset, |
290 | .get_link = dsa_slave_get_link, | 290 | .get_link = dsa_slave_get_link, |
291 | .set_sg = ethtool_op_set_sg, | ||
292 | .get_strings = dsa_slave_get_strings, | 291 | .get_strings = dsa_slave_get_strings, |
293 | .get_ethtool_stats = dsa_slave_get_ethtool_stats, | 292 | .get_ethtool_stats = dsa_slave_get_ethtool_stats, |
294 | .get_sset_count = dsa_slave_get_sset_count, | 293 | .get_sset_count = dsa_slave_get_sset_count, |