serdes.h 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * Marvell 88E6xxx SERDES manipulation, via SMI bus
  3. *
  4. * Copyright (c) 2008 Marvell Semiconductor
  5. *
  6. * Copyright (c) 2016 Andrew Lunn <andrew@lunn.ch>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. */
  13. #ifndef _MV88E6XXX_SERDES_H
  14. #define _MV88E6XXX_SERDES_H
  15. #include "chip.h"
  16. #define MV88E6352_ADDR_SERDES 0x0f
  17. #define MV88E6352_SERDES_PAGE_FIBER 0x01
  18. #define MV88E6341_ADDR_SERDES 0x15
  19. #define MV88E6390_PORT9_LANE0 0x09
  20. #define MV88E6390_PORT9_LANE1 0x12
  21. #define MV88E6390_PORT9_LANE2 0x13
  22. #define MV88E6390_PORT9_LANE3 0x14
  23. #define MV88E6390_PORT10_LANE0 0x0a
  24. #define MV88E6390_PORT10_LANE1 0x15
  25. #define MV88E6390_PORT10_LANE2 0x16
  26. #define MV88E6390_PORT10_LANE3 0x17
  27. /* 10GBASE-R and 10GBASE-X4/X2 */
  28. #define MV88E6390_PCS_CONTROL_1 0x1000
  29. #define MV88E6390_PCS_CONTROL_1_RESET BIT(15)
  30. #define MV88E6390_PCS_CONTROL_1_LOOPBACK BIT(14)
  31. #define MV88E6390_PCS_CONTROL_1_SPEED BIT(13)
  32. #define MV88E6390_PCS_CONTROL_1_PDOWN BIT(11)
  33. /* 1000BASE-X and SGMII */
  34. #define MV88E6390_SGMII_CONTROL 0x2000
  35. #define MV88E6390_SGMII_CONTROL_RESET BIT(15)
  36. #define MV88E6390_SGMII_CONTROL_LOOPBACK BIT(14)
  37. #define MV88E6390_SGMII_CONTROL_PDOWN BIT(11)
  38. #define MV88E6390_SGMII_STATUS 0x2001
  39. #define MV88E6390_SGMII_STATUS_AN_DONE BIT(5)
  40. #define MV88E6390_SGMII_STATUS_REMOTE_FAULT BIT(4)
  41. #define MV88E6390_SGMII_STATUS_LINK BIT(2)
  42. #define MV88E6390_SGMII_INT_ENABLE 0xa001
  43. #define MV88E6390_SGMII_INT_SPEED_CHANGE BIT(14)
  44. #define MV88E6390_SGMII_INT_DUPLEX_CHANGE BIT(13)
  45. #define MV88E6390_SGMII_INT_PAGE_RX BIT(12)
  46. #define MV88E6390_SGMII_INT_AN_COMPLETE BIT(11)
  47. #define MV88E6390_SGMII_INT_LINK_DOWN BIT(10)
  48. #define MV88E6390_SGMII_INT_LINK_UP BIT(9)
  49. #define MV88E6390_SGMII_INT_SYMBOL_ERROR BIT(8)
  50. #define MV88E6390_SGMII_INT_FALSE_CARRIER BIT(7)
  51. #define MV88E6390_SGMII_INT_STATUS 0xa002
  52. int mv88e6390x_serdes_get_lane(struct mv88e6xxx_chip *chip, int port);
  53. int mv88e6341_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on);
  54. int mv88e6352_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on);
  55. int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on);
  56. int mv88e6390x_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on);
  57. int mv88e6390_serdes_irq_setup(struct mv88e6xxx_chip *chip, int port);
  58. void mv88e6390_serdes_irq_free(struct mv88e6xxx_chip *chip, int port);
  59. int mv88e6352_serdes_get_sset_count(struct mv88e6xxx_chip *chip, int port);
  60. int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip,
  61. int port, uint8_t *data);
  62. int mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
  63. uint64_t *data);
  64. int mv88e6390_serdes_irq_enable(struct mv88e6xxx_chip *chip, int port,
  65. int lane);
  66. int mv88e6390_serdes_irq_disable(struct mv88e6xxx_chip *chip, int port,
  67. int lane);
  68. #endif