• Home
  • Raw
  • Download

Lines Matching +full:on +full:- +full:chip

18 #include "chip.h"
24 static int mv88e6352_serdes_read(struct mv88e6xxx_chip *chip, int reg, in mv88e6352_serdes_read() argument
27 return mv88e6xxx_phy_page_read(chip, MV88E6352_ADDR_SERDES, in mv88e6352_serdes_read()
32 static int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int reg, in mv88e6352_serdes_write() argument
35 return mv88e6xxx_phy_page_write(chip, MV88E6352_ADDR_SERDES, in mv88e6352_serdes_write()
40 static int mv88e6390_serdes_read(struct mv88e6xxx_chip *chip, in mv88e6390_serdes_read() argument
45 return mv88e6xxx_phy_read(chip, lane, reg_c45, val); in mv88e6390_serdes_read()
48 static int mv88e6390_serdes_write(struct mv88e6xxx_chip *chip, in mv88e6390_serdes_write() argument
53 return mv88e6xxx_phy_write(chip, lane, reg_c45, val); in mv88e6390_serdes_write()
56 static int mv88e6352_serdes_power_set(struct mv88e6xxx_chip *chip, bool on) in mv88e6352_serdes_power_set() argument
61 err = mv88e6352_serdes_read(chip, MII_BMCR, &val); in mv88e6352_serdes_power_set()
65 if (on) in mv88e6352_serdes_power_set()
71 err = mv88e6352_serdes_write(chip, MII_BMCR, new_val); in mv88e6352_serdes_power_set()
76 static bool mv88e6352_port_has_serdes(struct mv88e6xxx_chip *chip, int port) in mv88e6352_port_has_serdes() argument
78 u8 cmode = chip->ports[port].cmode; in mv88e6352_port_has_serdes()
88 int mv88e6352_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on) in mv88e6352_serdes_power() argument
92 if (mv88e6352_port_has_serdes(chip, port)) { in mv88e6352_serdes_power()
93 err = mv88e6352_serdes_power_set(chip, on); in mv88e6352_serdes_power()
112 int mv88e6352_serdes_get_sset_count(struct mv88e6xxx_chip *chip, int port) in mv88e6352_serdes_get_sset_count() argument
114 if (mv88e6352_port_has_serdes(chip, port)) in mv88e6352_serdes_get_sset_count()
120 int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip, in mv88e6352_serdes_get_strings() argument
126 if (!mv88e6352_port_has_serdes(chip, port)) in mv88e6352_serdes_get_strings()
131 memcpy(data + i * ETH_GSTRING_LEN, stat->string, in mv88e6352_serdes_get_strings()
137 static uint64_t mv88e6352_serdes_get_stat(struct mv88e6xxx_chip *chip, in mv88e6352_serdes_get_stat() argument
144 err = mv88e6352_serdes_read(chip, stat->reg, &reg); in mv88e6352_serdes_get_stat()
146 dev_err(chip->dev, "failed to read statistic\n"); in mv88e6352_serdes_get_stat()
152 if (stat->sizeof_stat == 32) { in mv88e6352_serdes_get_stat()
153 err = mv88e6352_serdes_read(chip, stat->reg + 1, &reg); in mv88e6352_serdes_get_stat()
155 dev_err(chip->dev, "failed to read statistic\n"); in mv88e6352_serdes_get_stat()
164 int mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port, in mv88e6352_serdes_get_stats() argument
167 struct mv88e6xxx_port *mv88e6xxx_port = &chip->ports[port]; in mv88e6352_serdes_get_stats()
172 if (!mv88e6352_port_has_serdes(chip, port)) in mv88e6352_serdes_get_stats()
176 ARRAY_SIZE(mv88e6xxx_port->serdes_stats)); in mv88e6352_serdes_get_stats()
180 value = mv88e6352_serdes_get_stat(chip, stat); in mv88e6352_serdes_get_stats()
181 mv88e6xxx_port->serdes_stats[i] += value; in mv88e6352_serdes_get_stats()
182 data[i] = mv88e6xxx_port->serdes_stats[i]; in mv88e6352_serdes_get_stats()
189 * have SERDES lanes. Returns -ENODEV if a port does not have a lane.
191 static int mv88e6390_serdes_get_lane(struct mv88e6xxx_chip *chip, int port) in mv88e6390_serdes_get_lane() argument
193 u8 cmode = chip->ports[port].cmode; in mv88e6390_serdes_get_lane()
201 return -ENODEV; in mv88e6390_serdes_get_lane()
207 return -ENODEV; in mv88e6390_serdes_get_lane()
209 return -ENODEV; in mv88e6390_serdes_get_lane()
215 * Returns -ENODEV if a port does not have a lane.
217 int mv88e6390x_serdes_get_lane(struct mv88e6xxx_chip *chip, int port) in mv88e6390x_serdes_get_lane() argument
221 cmode_port9 = chip->ports[9].cmode; in mv88e6390x_serdes_get_lane()
222 cmode_port10 = chip->ports[10].cmode; in mv88e6390x_serdes_get_lane()
223 cmode_port = chip->ports[port].cmode; in mv88e6390x_serdes_get_lane()
232 return -ENODEV; in mv88e6390x_serdes_get_lane()
240 return -ENODEV; in mv88e6390x_serdes_get_lane()
248 return -ENODEV; in mv88e6390x_serdes_get_lane()
255 return -ENODEV; in mv88e6390x_serdes_get_lane()
263 return -ENODEV; in mv88e6390x_serdes_get_lane()
271 return -ENODEV; in mv88e6390x_serdes_get_lane()
279 return -ENODEV; in mv88e6390x_serdes_get_lane()
287 return -ENODEV; in mv88e6390x_serdes_get_lane()
289 return -ENODEV; in mv88e6390x_serdes_get_lane()
293 /* Set the power on/off for 10GBASE-R and 10GBASE-X4/X2 */
294 static int mv88e6390_serdes_power_10g(struct mv88e6xxx_chip *chip, int lane, in mv88e6390_serdes_power_10g() argument
295 bool on) in mv88e6390_serdes_power_10g() argument
300 err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, in mv88e6390_serdes_power_10g()
306 if (on) in mv88e6390_serdes_power_10g()
314 err = mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, in mv88e6390_serdes_power_10g()
320 /* Set the power on/off for SGMII and 1000Base-X */
321 static int mv88e6390_serdes_power_sgmii(struct mv88e6xxx_chip *chip, int lane, in mv88e6390_serdes_power_sgmii() argument
322 bool on) in mv88e6390_serdes_power_sgmii() argument
327 err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, in mv88e6390_serdes_power_sgmii()
332 if (on) in mv88e6390_serdes_power_sgmii()
340 err = mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, in mv88e6390_serdes_power_sgmii()
346 static int mv88e6390_serdes_power_lane(struct mv88e6xxx_chip *chip, int port, in mv88e6390_serdes_power_lane() argument
347 int lane, bool on) in mv88e6390_serdes_power_lane() argument
349 u8 cmode = chip->ports[port].cmode; in mv88e6390_serdes_power_lane()
355 return mv88e6390_serdes_power_sgmii(chip, lane, on); in mv88e6390_serdes_power_lane()
358 return mv88e6390_serdes_power_10g(chip, lane, on); in mv88e6390_serdes_power_lane()
364 int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on) in mv88e6390_serdes_power() argument
368 lane = mv88e6390_serdes_get_lane(chip, port); in mv88e6390_serdes_power()
369 if (lane == -ENODEV) in mv88e6390_serdes_power()
377 return mv88e6390_serdes_power_lane(chip, port, lane, on); in mv88e6390_serdes_power()
383 int mv88e6390x_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on) in mv88e6390x_serdes_power() argument
387 lane = mv88e6390x_serdes_get_lane(chip, port); in mv88e6390x_serdes_power()
388 if (lane == -ENODEV) in mv88e6390x_serdes_power()
398 return mv88e6390_serdes_power_lane(chip, port, lane, on); in mv88e6390x_serdes_power()
404 static void mv88e6390_serdes_irq_link_sgmii(struct mv88e6xxx_chip *chip, in mv88e6390_serdes_irq_link_sgmii() argument
407 struct dsa_switch *ds = chip->ds; in mv88e6390_serdes_irq_link_sgmii()
411 mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, in mv88e6390_serdes_irq_link_sgmii()
418 mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, in mv88e6390_serdes_irq_link_sgmii()
425 static int mv88e6390_serdes_irq_enable_sgmii(struct mv88e6xxx_chip *chip, in mv88e6390_serdes_irq_enable_sgmii() argument
428 return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, in mv88e6390_serdes_irq_enable_sgmii()
434 static int mv88e6390_serdes_irq_disable_sgmii(struct mv88e6xxx_chip *chip, in mv88e6390_serdes_irq_disable_sgmii() argument
437 return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, in mv88e6390_serdes_irq_disable_sgmii()
441 int mv88e6390_serdes_irq_enable(struct mv88e6xxx_chip *chip, int port, in mv88e6390_serdes_irq_enable() argument
444 u8 cmode = chip->ports[port].cmode; in mv88e6390_serdes_irq_enable()
451 err = mv88e6390_serdes_irq_enable_sgmii(chip, lane); in mv88e6390_serdes_irq_enable()
457 int mv88e6390_serdes_irq_disable(struct mv88e6xxx_chip *chip, int port, in mv88e6390_serdes_irq_disable() argument
460 u8 cmode = chip->ports[port].cmode; in mv88e6390_serdes_irq_disable()
467 err = mv88e6390_serdes_irq_disable_sgmii(chip, lane); in mv88e6390_serdes_irq_disable()
473 static int mv88e6390_serdes_irq_status_sgmii(struct mv88e6xxx_chip *chip, in mv88e6390_serdes_irq_status_sgmii() argument
478 err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, in mv88e6390_serdes_irq_status_sgmii()
487 struct mv88e6xxx_chip *chip = port->chip; in mv88e6390_serdes_thread_fn() local
489 u8 cmode = port->cmode; in mv88e6390_serdes_thread_fn()
494 lane = mv88e6390x_serdes_get_lane(chip, port->port); in mv88e6390_serdes_thread_fn()
496 mutex_lock(&chip->reg_lock); in mv88e6390_serdes_thread_fn()
502 err = mv88e6390_serdes_irq_status_sgmii(chip, lane, &status); in mv88e6390_serdes_thread_fn()
508 mv88e6390_serdes_irq_link_sgmii(chip, port->port, lane); in mv88e6390_serdes_thread_fn()
512 mutex_unlock(&chip->reg_lock); in mv88e6390_serdes_thread_fn()
517 int mv88e6390_serdes_irq_setup(struct mv88e6xxx_chip *chip, int port) in mv88e6390_serdes_irq_setup() argument
526 lane = mv88e6390x_serdes_get_lane(chip, port); in mv88e6390_serdes_irq_setup()
528 if (lane == -ENODEV) in mv88e6390_serdes_irq_setup()
534 chip->ports[port].serdes_irq = irq_find_mapping(chip->g2_irq.domain, in mv88e6390_serdes_irq_setup()
536 if (chip->ports[port].serdes_irq < 0) { in mv88e6390_serdes_irq_setup()
537 dev_err(chip->dev, "Unable to map SERDES irq: %d\n", in mv88e6390_serdes_irq_setup()
538 chip->ports[port].serdes_irq); in mv88e6390_serdes_irq_setup()
539 return chip->ports[port].serdes_irq; in mv88e6390_serdes_irq_setup()
545 mutex_unlock(&chip->reg_lock); in mv88e6390_serdes_irq_setup()
546 err = request_threaded_irq(chip->ports[port].serdes_irq, NULL, in mv88e6390_serdes_irq_setup()
548 IRQF_ONESHOT, "mv88e6xxx-serdes", in mv88e6390_serdes_irq_setup()
549 &chip->ports[port]); in mv88e6390_serdes_irq_setup()
550 mutex_lock(&chip->reg_lock); in mv88e6390_serdes_irq_setup()
553 dev_err(chip->dev, "Unable to request SERDES interrupt: %d\n", in mv88e6390_serdes_irq_setup()
558 return mv88e6390_serdes_irq_enable(chip, port, lane); in mv88e6390_serdes_irq_setup()
561 void mv88e6390_serdes_irq_free(struct mv88e6xxx_chip *chip, int port) in mv88e6390_serdes_irq_free() argument
563 int lane = mv88e6390x_serdes_get_lane(chip, port); in mv88e6390_serdes_irq_free()
571 mv88e6390_serdes_irq_disable(chip, port, lane); in mv88e6390_serdes_irq_free()
576 mutex_unlock(&chip->reg_lock); in mv88e6390_serdes_irq_free()
577 free_irq(chip->ports[port].serdes_irq, &chip->ports[port]); in mv88e6390_serdes_irq_free()
578 mutex_lock(&chip->reg_lock); in mv88e6390_serdes_irq_free()
580 chip->ports[port].serdes_irq = 0; in mv88e6390_serdes_irq_free()
583 int mv88e6341_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on) in mv88e6341_serdes_power() argument
585 u8 cmode = chip->ports[port].cmode; in mv88e6341_serdes_power()
593 return mv88e6390_serdes_power_sgmii(chip, MV88E6341_ADDR_SERDES, in mv88e6341_serdes_power()
594 on); in mv88e6341_serdes_power()