14d5f2ba7SVivien Didelot /* 24d5f2ba7SVivien Didelot * Marvell 88E6xxx Ethernet switch single-chip definition 34d5f2ba7SVivien Didelot * 44d5f2ba7SVivien Didelot * Copyright (c) 2008 Marvell Semiconductor 54d5f2ba7SVivien Didelot * 64d5f2ba7SVivien Didelot * This program is free software; you can redistribute it and/or modify 74d5f2ba7SVivien Didelot * it under the terms of the GNU General Public License as published by 84d5f2ba7SVivien Didelot * the Free Software Foundation; either version 2 of the License, or 94d5f2ba7SVivien Didelot * (at your option) any later version. 104d5f2ba7SVivien Didelot */ 114d5f2ba7SVivien Didelot 124d5f2ba7SVivien Didelot #ifndef _MV88E6XXX_CHIP_H 134d5f2ba7SVivien Didelot #define _MV88E6XXX_CHIP_H 144d5f2ba7SVivien Didelot 154d5f2ba7SVivien Didelot #include <linux/if_vlan.h> 164d5f2ba7SVivien Didelot #include <linux/irq.h> 174d5f2ba7SVivien Didelot #include <linux/gpio/consumer.h> 184d5f2ba7SVivien Didelot #include <linux/phy.h> 194d5f2ba7SVivien Didelot #include <net/dsa.h> 204d5f2ba7SVivien Didelot 214d5f2ba7SVivien Didelot #ifndef UINT64_MAX 224d5f2ba7SVivien Didelot #define UINT64_MAX (u64)(~((u64)0)) 234d5f2ba7SVivien Didelot #endif 244d5f2ba7SVivien Didelot 254d5f2ba7SVivien Didelot #define SMI_CMD 0x00 264d5f2ba7SVivien Didelot #define SMI_CMD_BUSY BIT(15) 274d5f2ba7SVivien Didelot #define SMI_CMD_CLAUSE_22 BIT(12) 284d5f2ba7SVivien Didelot #define SMI_CMD_OP_22_WRITE ((1 << 10) | SMI_CMD_BUSY | SMI_CMD_CLAUSE_22) 294d5f2ba7SVivien Didelot #define SMI_CMD_OP_22_READ ((2 << 10) | SMI_CMD_BUSY | SMI_CMD_CLAUSE_22) 304d5f2ba7SVivien Didelot #define SMI_CMD_OP_45_WRITE_ADDR ((0 << 10) | SMI_CMD_BUSY) 314d5f2ba7SVivien Didelot #define SMI_CMD_OP_45_WRITE_DATA ((1 << 10) | SMI_CMD_BUSY) 324d5f2ba7SVivien Didelot #define SMI_CMD_OP_45_READ_DATA ((2 << 10) | SMI_CMD_BUSY) 334d5f2ba7SVivien Didelot #define SMI_CMD_OP_45_READ_DATA_INC ((3 << 10) | SMI_CMD_BUSY) 344d5f2ba7SVivien Didelot #define SMI_DATA 0x01 354d5f2ba7SVivien Didelot 364d5f2ba7SVivien Didelot #define MV88E6XXX_N_FID 4096 374d5f2ba7SVivien Didelot 384d5f2ba7SVivien Didelot /* PVT limits for 4-bit port and 5-bit switch */ 394d5f2ba7SVivien Didelot #define MV88E6XXX_MAX_PVT_SWITCHES 32 404d5f2ba7SVivien Didelot #define MV88E6XXX_MAX_PVT_PORTS 16 414d5f2ba7SVivien Didelot 4231bef4e9SVivien Didelot enum mv88e6xxx_egress_mode { 4331bef4e9SVivien Didelot MV88E6XXX_EGRESS_MODE_UNMODIFIED, 4431bef4e9SVivien Didelot MV88E6XXX_EGRESS_MODE_UNTAGGED, 4531bef4e9SVivien Didelot MV88E6XXX_EGRESS_MODE_TAGGED, 4631bef4e9SVivien Didelot MV88E6XXX_EGRESS_MODE_ETHERTYPE, 4731bef4e9SVivien Didelot }; 4831bef4e9SVivien Didelot 494d5f2ba7SVivien Didelot enum mv88e6xxx_frame_mode { 504d5f2ba7SVivien Didelot MV88E6XXX_FRAME_MODE_NORMAL, 514d5f2ba7SVivien Didelot MV88E6XXX_FRAME_MODE_DSA, 524d5f2ba7SVivien Didelot MV88E6XXX_FRAME_MODE_PROVIDER, 534d5f2ba7SVivien Didelot MV88E6XXX_FRAME_MODE_ETHERTYPE, 544d5f2ba7SVivien Didelot }; 554d5f2ba7SVivien Didelot 564d5f2ba7SVivien Didelot /* List of supported models */ 574d5f2ba7SVivien Didelot enum mv88e6xxx_model { 584d5f2ba7SVivien Didelot MV88E6085, 594d5f2ba7SVivien Didelot MV88E6095, 604d5f2ba7SVivien Didelot MV88E6097, 614d5f2ba7SVivien Didelot MV88E6123, 624d5f2ba7SVivien Didelot MV88E6131, 634d5f2ba7SVivien Didelot MV88E6141, 644d5f2ba7SVivien Didelot MV88E6161, 654d5f2ba7SVivien Didelot MV88E6165, 664d5f2ba7SVivien Didelot MV88E6171, 674d5f2ba7SVivien Didelot MV88E6172, 684d5f2ba7SVivien Didelot MV88E6175, 694d5f2ba7SVivien Didelot MV88E6176, 704d5f2ba7SVivien Didelot MV88E6185, 714d5f2ba7SVivien Didelot MV88E6190, 724d5f2ba7SVivien Didelot MV88E6190X, 734d5f2ba7SVivien Didelot MV88E6191, 744d5f2ba7SVivien Didelot MV88E6240, 754d5f2ba7SVivien Didelot MV88E6290, 764d5f2ba7SVivien Didelot MV88E6320, 774d5f2ba7SVivien Didelot MV88E6321, 784d5f2ba7SVivien Didelot MV88E6341, 794d5f2ba7SVivien Didelot MV88E6350, 804d5f2ba7SVivien Didelot MV88E6351, 814d5f2ba7SVivien Didelot MV88E6352, 824d5f2ba7SVivien Didelot MV88E6390, 834d5f2ba7SVivien Didelot MV88E6390X, 844d5f2ba7SVivien Didelot }; 854d5f2ba7SVivien Didelot 864d5f2ba7SVivien Didelot enum mv88e6xxx_family { 874d5f2ba7SVivien Didelot MV88E6XXX_FAMILY_NONE, 884d5f2ba7SVivien Didelot MV88E6XXX_FAMILY_6065, /* 6031 6035 6061 6065 */ 894d5f2ba7SVivien Didelot MV88E6XXX_FAMILY_6095, /* 6092 6095 */ 904d5f2ba7SVivien Didelot MV88E6XXX_FAMILY_6097, /* 6046 6085 6096 6097 */ 914d5f2ba7SVivien Didelot MV88E6XXX_FAMILY_6165, /* 6123 6161 6165 */ 924d5f2ba7SVivien Didelot MV88E6XXX_FAMILY_6185, /* 6108 6121 6122 6131 6152 6155 6182 6185 */ 934d5f2ba7SVivien Didelot MV88E6XXX_FAMILY_6320, /* 6320 6321 */ 944d5f2ba7SVivien Didelot MV88E6XXX_FAMILY_6341, /* 6141 6341 */ 954d5f2ba7SVivien Didelot MV88E6XXX_FAMILY_6351, /* 6171 6175 6350 6351 */ 964d5f2ba7SVivien Didelot MV88E6XXX_FAMILY_6352, /* 6172 6176 6240 6352 */ 974d5f2ba7SVivien Didelot MV88E6XXX_FAMILY_6390, /* 6190 6190X 6191 6290 6390 6390X */ 984d5f2ba7SVivien Didelot }; 994d5f2ba7SVivien Didelot 1004d5f2ba7SVivien Didelot struct mv88e6xxx_ops; 1014d5f2ba7SVivien Didelot 1024d5f2ba7SVivien Didelot struct mv88e6xxx_info { 1034d5f2ba7SVivien Didelot enum mv88e6xxx_family family; 1044d5f2ba7SVivien Didelot u16 prod_num; 1054d5f2ba7SVivien Didelot const char *name; 1064d5f2ba7SVivien Didelot unsigned int num_databases; 1074d5f2ba7SVivien Didelot unsigned int num_ports; 1084d5f2ba7SVivien Didelot unsigned int max_vid; 1094d5f2ba7SVivien Didelot unsigned int port_base_addr; 1104d5f2ba7SVivien Didelot unsigned int global1_addr; 1119069c13aSVivien Didelot unsigned int global2_addr; 1124d5f2ba7SVivien Didelot unsigned int age_time_coeff; 1134d5f2ba7SVivien Didelot unsigned int g1_irqs; 114d6c5e6afSVivien Didelot unsigned int g2_irqs; 1154d5f2ba7SVivien Didelot bool pvt; 116b3e05aa1SVivien Didelot 117b3e05aa1SVivien Didelot /* Multi-chip Addressing Mode. 118b3e05aa1SVivien Didelot * Some chips respond to only 2 registers of its own SMI device address 119b3e05aa1SVivien Didelot * when it is non-zero, and use indirect access to internal registers. 120b3e05aa1SVivien Didelot */ 121b3e05aa1SVivien Didelot bool multi_chip; 1224d5f2ba7SVivien Didelot enum dsa_tag_protocol tag_protocol; 1234d5f2ba7SVivien Didelot 1244d5f2ba7SVivien Didelot /* Mask for FromPort and ToPort value of PortVec used in ATU Move 1254d5f2ba7SVivien Didelot * operation. 0 means that the ATU Move operation is not supported. 1264d5f2ba7SVivien Didelot */ 1274d5f2ba7SVivien Didelot u8 atu_move_port_mask; 1284d5f2ba7SVivien Didelot const struct mv88e6xxx_ops *ops; 1294d5f2ba7SVivien Didelot }; 1304d5f2ba7SVivien Didelot 1314d5f2ba7SVivien Didelot struct mv88e6xxx_atu_entry { 1324d5f2ba7SVivien Didelot u8 state; 1334d5f2ba7SVivien Didelot bool trunk; 1344d5f2ba7SVivien Didelot u16 portvec; 1354d5f2ba7SVivien Didelot u8 mac[ETH_ALEN]; 1364d5f2ba7SVivien Didelot }; 1374d5f2ba7SVivien Didelot 1384d5f2ba7SVivien Didelot struct mv88e6xxx_vtu_entry { 1394d5f2ba7SVivien Didelot u16 vid; 1404d5f2ba7SVivien Didelot u16 fid; 1414d5f2ba7SVivien Didelot u8 sid; 1424d5f2ba7SVivien Didelot bool valid; 1434d5f2ba7SVivien Didelot u8 member[DSA_MAX_PORTS]; 1444d5f2ba7SVivien Didelot u8 state[DSA_MAX_PORTS]; 1454d5f2ba7SVivien Didelot }; 1464d5f2ba7SVivien Didelot 1474d5f2ba7SVivien Didelot struct mv88e6xxx_bus_ops; 1484d5f2ba7SVivien Didelot struct mv88e6xxx_irq_ops; 1494d5f2ba7SVivien Didelot 1504d5f2ba7SVivien Didelot struct mv88e6xxx_irq { 1514d5f2ba7SVivien Didelot u16 masked; 1524d5f2ba7SVivien Didelot struct irq_chip chip; 1534d5f2ba7SVivien Didelot struct irq_domain *domain; 1544d5f2ba7SVivien Didelot unsigned int nirqs; 1554d5f2ba7SVivien Didelot }; 1564d5f2ba7SVivien Didelot 1574d5f2ba7SVivien Didelot struct mv88e6xxx_chip { 1584d5f2ba7SVivien Didelot const struct mv88e6xxx_info *info; 1594d5f2ba7SVivien Didelot 1604d5f2ba7SVivien Didelot /* The dsa_switch this private structure is related to */ 1614d5f2ba7SVivien Didelot struct dsa_switch *ds; 1624d5f2ba7SVivien Didelot 1634d5f2ba7SVivien Didelot /* The device this structure is associated to */ 1644d5f2ba7SVivien Didelot struct device *dev; 1654d5f2ba7SVivien Didelot 1664d5f2ba7SVivien Didelot /* This mutex protects the access to the switch registers */ 1674d5f2ba7SVivien Didelot struct mutex reg_lock; 1684d5f2ba7SVivien Didelot 1694d5f2ba7SVivien Didelot /* The MII bus and the address on the bus that is used to 1704d5f2ba7SVivien Didelot * communication with the switch 1714d5f2ba7SVivien Didelot */ 1724d5f2ba7SVivien Didelot const struct mv88e6xxx_bus_ops *smi_ops; 1734d5f2ba7SVivien Didelot struct mii_bus *bus; 1744d5f2ba7SVivien Didelot int sw_addr; 1754d5f2ba7SVivien Didelot 1764d5f2ba7SVivien Didelot /* Handles automatic disabling and re-enabling of the PHY 1774d5f2ba7SVivien Didelot * polling unit. 1784d5f2ba7SVivien Didelot */ 1794d5f2ba7SVivien Didelot const struct mv88e6xxx_bus_ops *phy_ops; 1804d5f2ba7SVivien Didelot struct mutex ppu_mutex; 1814d5f2ba7SVivien Didelot int ppu_disabled; 1824d5f2ba7SVivien Didelot struct work_struct ppu_work; 1834d5f2ba7SVivien Didelot struct timer_list ppu_timer; 1844d5f2ba7SVivien Didelot 1854d5f2ba7SVivien Didelot /* This mutex serialises access to the statistics unit. 1864d5f2ba7SVivien Didelot * Hold this mutex over snapshot + dump sequences. 1874d5f2ba7SVivien Didelot */ 1884d5f2ba7SVivien Didelot struct mutex stats_mutex; 1894d5f2ba7SVivien Didelot 1904d5f2ba7SVivien Didelot /* A switch may have a GPIO line tied to its reset pin. Parse 1914d5f2ba7SVivien Didelot * this from the device tree, and use it before performing 1924d5f2ba7SVivien Didelot * switch soft reset. 1934d5f2ba7SVivien Didelot */ 1944d5f2ba7SVivien Didelot struct gpio_desc *reset; 1954d5f2ba7SVivien Didelot 1964d5f2ba7SVivien Didelot /* set to size of eeprom if supported by the switch */ 1974d5f2ba7SVivien Didelot int eeprom_len; 1984d5f2ba7SVivien Didelot 1994d5f2ba7SVivien Didelot /* List of mdio busses */ 2004d5f2ba7SVivien Didelot struct list_head mdios; 2014d5f2ba7SVivien Didelot 2024d5f2ba7SVivien Didelot /* There can be two interrupt controllers, which are chained 2034d5f2ba7SVivien Didelot * off a GPIO as interrupt source 2044d5f2ba7SVivien Didelot */ 2054d5f2ba7SVivien Didelot struct mv88e6xxx_irq g1_irq; 2064d5f2ba7SVivien Didelot struct mv88e6xxx_irq g2_irq; 2074d5f2ba7SVivien Didelot int irq; 2084d5f2ba7SVivien Didelot int device_irq; 2094d5f2ba7SVivien Didelot int watchdog_irq; 2100977644cSAndrew Lunn int atu_prob_irq; 21162eb1162SAndrew Lunn int vtu_prob_irq; 2124d5f2ba7SVivien Didelot }; 2134d5f2ba7SVivien Didelot 2144d5f2ba7SVivien Didelot struct mv88e6xxx_bus_ops { 2154d5f2ba7SVivien Didelot int (*read)(struct mv88e6xxx_chip *chip, int addr, int reg, u16 *val); 2164d5f2ba7SVivien Didelot int (*write)(struct mv88e6xxx_chip *chip, int addr, int reg, u16 val); 2174d5f2ba7SVivien Didelot }; 2184d5f2ba7SVivien Didelot 2194d5f2ba7SVivien Didelot struct mv88e6xxx_mdio_bus { 2204d5f2ba7SVivien Didelot struct mii_bus *bus; 2214d5f2ba7SVivien Didelot struct mv88e6xxx_chip *chip; 2224d5f2ba7SVivien Didelot struct list_head list; 2234d5f2ba7SVivien Didelot bool external; 2244d5f2ba7SVivien Didelot }; 2254d5f2ba7SVivien Didelot 2264d5f2ba7SVivien Didelot struct mv88e6xxx_ops { 227cd8da8bbSVivien Didelot /* Ingress Rate Limit unit (IRL) operations */ 228cd8da8bbSVivien Didelot int (*irl_init_all)(struct mv88e6xxx_chip *chip, int port); 229cd8da8bbSVivien Didelot 2304d5f2ba7SVivien Didelot int (*get_eeprom)(struct mv88e6xxx_chip *chip, 2314d5f2ba7SVivien Didelot struct ethtool_eeprom *eeprom, u8 *data); 2324d5f2ba7SVivien Didelot int (*set_eeprom)(struct mv88e6xxx_chip *chip, 2334d5f2ba7SVivien Didelot struct ethtool_eeprom *eeprom, u8 *data); 2344d5f2ba7SVivien Didelot 2354d5f2ba7SVivien Didelot int (*set_switch_mac)(struct mv88e6xxx_chip *chip, u8 *addr); 2364d5f2ba7SVivien Didelot 2374d5f2ba7SVivien Didelot int (*phy_read)(struct mv88e6xxx_chip *chip, 2384d5f2ba7SVivien Didelot struct mii_bus *bus, 2394d5f2ba7SVivien Didelot int addr, int reg, u16 *val); 2404d5f2ba7SVivien Didelot int (*phy_write)(struct mv88e6xxx_chip *chip, 2414d5f2ba7SVivien Didelot struct mii_bus *bus, 2424d5f2ba7SVivien Didelot int addr, int reg, u16 val); 2434d5f2ba7SVivien Didelot 2449e907d73SVivien Didelot /* Priority Override Table operations */ 2459e907d73SVivien Didelot int (*pot_clear)(struct mv88e6xxx_chip *chip); 2469e907d73SVivien Didelot 2474d5f2ba7SVivien Didelot /* PHY Polling Unit (PPU) operations */ 2484d5f2ba7SVivien Didelot int (*ppu_enable)(struct mv88e6xxx_chip *chip); 2494d5f2ba7SVivien Didelot int (*ppu_disable)(struct mv88e6xxx_chip *chip); 2504d5f2ba7SVivien Didelot 2514d5f2ba7SVivien Didelot /* Switch Software Reset */ 2524d5f2ba7SVivien Didelot int (*reset)(struct mv88e6xxx_chip *chip); 2534d5f2ba7SVivien Didelot 2544d5f2ba7SVivien Didelot /* RGMII Receive/Transmit Timing Control 2554d5f2ba7SVivien Didelot * Add delay on PHY_INTERFACE_MODE_RGMII_*ID, no delay otherwise. 2564d5f2ba7SVivien Didelot */ 2574d5f2ba7SVivien Didelot int (*port_set_rgmii_delay)(struct mv88e6xxx_chip *chip, int port, 2584d5f2ba7SVivien Didelot phy_interface_t mode); 2594d5f2ba7SVivien Didelot 2604d5f2ba7SVivien Didelot #define LINK_FORCED_DOWN 0 2614d5f2ba7SVivien Didelot #define LINK_FORCED_UP 1 2624d5f2ba7SVivien Didelot #define LINK_UNFORCED -2 2634d5f2ba7SVivien Didelot 2644d5f2ba7SVivien Didelot /* Port's MAC link state 2654d5f2ba7SVivien Didelot * Use LINK_FORCED_UP or LINK_FORCED_DOWN to force link up or down, 2664d5f2ba7SVivien Didelot * or LINK_UNFORCED for normal link detection. 2674d5f2ba7SVivien Didelot */ 2684d5f2ba7SVivien Didelot int (*port_set_link)(struct mv88e6xxx_chip *chip, int port, int link); 2694d5f2ba7SVivien Didelot 2704d5f2ba7SVivien Didelot #define DUPLEX_UNFORCED -2 2714d5f2ba7SVivien Didelot 2724d5f2ba7SVivien Didelot /* Port's MAC duplex mode 2734d5f2ba7SVivien Didelot * 2744d5f2ba7SVivien Didelot * Use DUPLEX_HALF or DUPLEX_FULL to force half or full duplex, 2754d5f2ba7SVivien Didelot * or DUPLEX_UNFORCED for normal duplex detection. 2764d5f2ba7SVivien Didelot */ 2774d5f2ba7SVivien Didelot int (*port_set_duplex)(struct mv88e6xxx_chip *chip, int port, int dup); 2784d5f2ba7SVivien Didelot 2794d5f2ba7SVivien Didelot #define SPEED_MAX INT_MAX 2804d5f2ba7SVivien Didelot #define SPEED_UNFORCED -2 2814d5f2ba7SVivien Didelot 2824d5f2ba7SVivien Didelot /* Port's MAC speed (in Mbps) 2834d5f2ba7SVivien Didelot * 2844d5f2ba7SVivien Didelot * Depending on the chip, 10, 100, 200, 1000, 2500, 10000 are valid. 2854d5f2ba7SVivien Didelot * Use SPEED_UNFORCED for normal detection, SPEED_MAX for max value. 2864d5f2ba7SVivien Didelot */ 2874d5f2ba7SVivien Didelot int (*port_set_speed)(struct mv88e6xxx_chip *chip, int port, int speed); 2884d5f2ba7SVivien Didelot 2894d5f2ba7SVivien Didelot int (*port_tag_remap)(struct mv88e6xxx_chip *chip, int port); 2904d5f2ba7SVivien Didelot 2914d5f2ba7SVivien Didelot int (*port_set_frame_mode)(struct mv88e6xxx_chip *chip, int port, 2924d5f2ba7SVivien Didelot enum mv88e6xxx_frame_mode mode); 2934d5f2ba7SVivien Didelot int (*port_set_egress_floods)(struct mv88e6xxx_chip *chip, int port, 2944d5f2ba7SVivien Didelot bool unicast, bool multicast); 2954d5f2ba7SVivien Didelot int (*port_set_ether_type)(struct mv88e6xxx_chip *chip, int port, 2964d5f2ba7SVivien Didelot u16 etype); 297cd782656SVivien Didelot int (*port_set_jumbo_size)(struct mv88e6xxx_chip *chip, int port, 298cd782656SVivien Didelot size_t size); 2994d5f2ba7SVivien Didelot 3004d5f2ba7SVivien Didelot int (*port_egress_rate_limiting)(struct mv88e6xxx_chip *chip, int port); 3010898432cSVivien Didelot int (*port_pause_limit)(struct mv88e6xxx_chip *chip, int port, u8 in, 3020898432cSVivien Didelot u8 out); 3034d5f2ba7SVivien Didelot int (*port_disable_learn_limit)(struct mv88e6xxx_chip *chip, int port); 3044d5f2ba7SVivien Didelot int (*port_disable_pri_override)(struct mv88e6xxx_chip *chip, int port); 3054d5f2ba7SVivien Didelot 3064d5f2ba7SVivien Didelot /* CMODE control what PHY mode the MAC will use, eg. SGMII, RGMII, etc. 3074d5f2ba7SVivien Didelot * Some chips allow this to be configured on specific ports. 3084d5f2ba7SVivien Didelot */ 3094d5f2ba7SVivien Didelot int (*port_set_cmode)(struct mv88e6xxx_chip *chip, int port, 3104d5f2ba7SVivien Didelot phy_interface_t mode); 3114d5f2ba7SVivien Didelot 3124d5f2ba7SVivien Didelot /* Some devices have a per port register indicating what is 3134d5f2ba7SVivien Didelot * the upstream port this port should forward to. 3144d5f2ba7SVivien Didelot */ 3154d5f2ba7SVivien Didelot int (*port_set_upstream_port)(struct mv88e6xxx_chip *chip, int port, 3164d5f2ba7SVivien Didelot int upstream_port); 3174d5f2ba7SVivien Didelot 3184d5f2ba7SVivien Didelot /* Snapshot the statistics for a port. The statistics can then 3194d5f2ba7SVivien Didelot * be read back a leisure but still with a consistent view. 3204d5f2ba7SVivien Didelot */ 3214d5f2ba7SVivien Didelot int (*stats_snapshot)(struct mv88e6xxx_chip *chip, int port); 3224d5f2ba7SVivien Didelot 3234d5f2ba7SVivien Didelot /* Set the histogram mode for statistics, when the control registers 3244d5f2ba7SVivien Didelot * are separated out of the STATS_OP register. 3254d5f2ba7SVivien Didelot */ 3264d5f2ba7SVivien Didelot int (*stats_set_histogram)(struct mv88e6xxx_chip *chip); 3274d5f2ba7SVivien Didelot 3284d5f2ba7SVivien Didelot /* Return the number of strings describing statistics */ 3294d5f2ba7SVivien Didelot int (*stats_get_sset_count)(struct mv88e6xxx_chip *chip); 3304d5f2ba7SVivien Didelot void (*stats_get_strings)(struct mv88e6xxx_chip *chip, uint8_t *data); 3314d5f2ba7SVivien Didelot void (*stats_get_stats)(struct mv88e6xxx_chip *chip, int port, 3324d5f2ba7SVivien Didelot uint64_t *data); 333fa8d1179SVivien Didelot int (*set_cpu_port)(struct mv88e6xxx_chip *chip, int port); 334fa8d1179SVivien Didelot int (*set_egress_port)(struct mv88e6xxx_chip *chip, int port); 3354d5f2ba7SVivien Didelot const struct mv88e6xxx_irq_ops *watchdog_ops; 3364d5f2ba7SVivien Didelot 3374d5f2ba7SVivien Didelot int (*mgmt_rsvd2cpu)(struct mv88e6xxx_chip *chip); 3384d5f2ba7SVivien Didelot 3394d5f2ba7SVivien Didelot /* Power on/off a SERDES interface */ 3404d5f2ba7SVivien Didelot int (*serdes_power)(struct mv88e6xxx_chip *chip, int port, bool on); 3414d5f2ba7SVivien Didelot 3424d5f2ba7SVivien Didelot /* VLAN Translation Unit operations */ 3434d5f2ba7SVivien Didelot int (*vtu_getnext)(struct mv88e6xxx_chip *chip, 3444d5f2ba7SVivien Didelot struct mv88e6xxx_vtu_entry *entry); 3454d5f2ba7SVivien Didelot int (*vtu_loadpurge)(struct mv88e6xxx_chip *chip, 3464d5f2ba7SVivien Didelot struct mv88e6xxx_vtu_entry *entry); 3474d5f2ba7SVivien Didelot }; 3484d5f2ba7SVivien Didelot 3494d5f2ba7SVivien Didelot struct mv88e6xxx_irq_ops { 3504d5f2ba7SVivien Didelot /* Action to be performed when the interrupt happens */ 3514d5f2ba7SVivien Didelot int (*irq_action)(struct mv88e6xxx_chip *chip, int irq); 3524d5f2ba7SVivien Didelot /* Setup the hardware to generate the interrupt */ 3534d5f2ba7SVivien Didelot int (*irq_setup)(struct mv88e6xxx_chip *chip); 3544d5f2ba7SVivien Didelot /* Reset the hardware to stop generating the interrupt */ 3554d5f2ba7SVivien Didelot void (*irq_free)(struct mv88e6xxx_chip *chip); 3564d5f2ba7SVivien Didelot }; 3574d5f2ba7SVivien Didelot 3584d5f2ba7SVivien Didelot #define STATS_TYPE_PORT BIT(0) 3594d5f2ba7SVivien Didelot #define STATS_TYPE_BANK0 BIT(1) 3604d5f2ba7SVivien Didelot #define STATS_TYPE_BANK1 BIT(2) 3614d5f2ba7SVivien Didelot 3624d5f2ba7SVivien Didelot struct mv88e6xxx_hw_stat { 3634d5f2ba7SVivien Didelot char string[ETH_GSTRING_LEN]; 3644d5f2ba7SVivien Didelot int sizeof_stat; 3654d5f2ba7SVivien Didelot int reg; 3664d5f2ba7SVivien Didelot int type; 3674d5f2ba7SVivien Didelot }; 3684d5f2ba7SVivien Didelot 3694d5f2ba7SVivien Didelot static inline bool mv88e6xxx_has_pvt(struct mv88e6xxx_chip *chip) 3704d5f2ba7SVivien Didelot { 3714d5f2ba7SVivien Didelot return chip->info->pvt; 3724d5f2ba7SVivien Didelot } 3734d5f2ba7SVivien Didelot 3744d5f2ba7SVivien Didelot static inline unsigned int mv88e6xxx_num_databases(struct mv88e6xxx_chip *chip) 3754d5f2ba7SVivien Didelot { 3764d5f2ba7SVivien Didelot return chip->info->num_databases; 3774d5f2ba7SVivien Didelot } 3784d5f2ba7SVivien Didelot 3794d5f2ba7SVivien Didelot static inline unsigned int mv88e6xxx_num_ports(struct mv88e6xxx_chip *chip) 3804d5f2ba7SVivien Didelot { 3814d5f2ba7SVivien Didelot return chip->info->num_ports; 3824d5f2ba7SVivien Didelot } 3834d5f2ba7SVivien Didelot 3844d5f2ba7SVivien Didelot static inline u16 mv88e6xxx_port_mask(struct mv88e6xxx_chip *chip) 3854d5f2ba7SVivien Didelot { 3864d5f2ba7SVivien Didelot return GENMASK(mv88e6xxx_num_ports(chip) - 1, 0); 3874d5f2ba7SVivien Didelot } 3884d5f2ba7SVivien Didelot 3894d5f2ba7SVivien Didelot int mv88e6xxx_read(struct mv88e6xxx_chip *chip, int addr, int reg, u16 *val); 3904d5f2ba7SVivien Didelot int mv88e6xxx_write(struct mv88e6xxx_chip *chip, int addr, int reg, u16 val); 3914d5f2ba7SVivien Didelot int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg, 3924d5f2ba7SVivien Didelot u16 update); 3934d5f2ba7SVivien Didelot int mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int addr, int reg, u16 mask); 3944d5f2ba7SVivien Didelot struct mii_bus *mv88e6xxx_default_mdio_bus(struct mv88e6xxx_chip *chip); 3954d5f2ba7SVivien Didelot 3964d5f2ba7SVivien Didelot #endif /* _MV88E6XXX_CHIP_H */ 397