cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

global2.c (28139B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Marvell 88E6xxx Switch Global 2 Registers support
      4 *
      5 * Copyright (c) 2008 Marvell Semiconductor
      6 *
      7 * Copyright (c) 2016-2017 Savoir-faire Linux Inc.
      8 *	Vivien Didelot <vivien.didelot@savoirfairelinux.com>
      9 */
     10
     11#include <linux/bitfield.h>
     12#include <linux/interrupt.h>
     13#include <linux/irqdomain.h>
     14
     15#include "chip.h"
     16#include "global1.h" /* for MV88E6XXX_G1_STS_IRQ_DEVICE */
     17#include "global2.h"
     18
     19int mv88e6xxx_g2_read(struct mv88e6xxx_chip *chip, int reg, u16 *val)
     20{
     21	return mv88e6xxx_read(chip, chip->info->global2_addr, reg, val);
     22}
     23
     24int mv88e6xxx_g2_write(struct mv88e6xxx_chip *chip, int reg, u16 val)
     25{
     26	return mv88e6xxx_write(chip, chip->info->global2_addr, reg, val);
     27}
     28
     29int mv88e6xxx_g2_wait_bit(struct mv88e6xxx_chip *chip, int reg, int
     30			  bit, int val)
     31{
     32	return mv88e6xxx_wait_bit(chip, chip->info->global2_addr, reg,
     33				  bit, val);
     34}
     35
     36/* Offset 0x00: Interrupt Source Register */
     37
     38static int mv88e6xxx_g2_int_source(struct mv88e6xxx_chip *chip, u16 *src)
     39{
     40	/* Read (and clear most of) the Interrupt Source bits */
     41	return mv88e6xxx_g2_read(chip, MV88E6XXX_G2_INT_SRC, src);
     42}
     43
     44/* Offset 0x01: Interrupt Mask Register */
     45
     46static int mv88e6xxx_g2_int_mask(struct mv88e6xxx_chip *chip, u16 mask)
     47{
     48	return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_INT_MASK, mask);
     49}
     50
     51/* Offset 0x02: Management Enable 2x */
     52
     53static int mv88e6xxx_g2_mgmt_enable_2x(struct mv88e6xxx_chip *chip, u16 en2x)
     54{
     55	return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_MGMT_EN_2X, en2x);
     56}
     57
     58/* Offset 0x03: Management Enable 0x */
     59
     60static int mv88e6xxx_g2_mgmt_enable_0x(struct mv88e6xxx_chip *chip, u16 en0x)
     61{
     62	return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_MGMT_EN_0X, en0x);
     63}
     64
     65/* Offset 0x05: Switch Management Register */
     66
     67static int mv88e6xxx_g2_switch_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip,
     68					     bool enable)
     69{
     70	u16 val;
     71	int err;
     72
     73	err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_SWITCH_MGMT, &val);
     74	if (err)
     75		return err;
     76
     77	if (enable)
     78		val |= MV88E6XXX_G2_SWITCH_MGMT_RSVD2CPU;
     79	else
     80		val &= ~MV88E6XXX_G2_SWITCH_MGMT_RSVD2CPU;
     81
     82	return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SWITCH_MGMT, val);
     83}
     84
     85int mv88e6185_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip)
     86{
     87	int err;
     88
     89	/* Consider the frames with reserved multicast destination
     90	 * addresses matching 01:80:c2:00:00:0x as MGMT.
     91	 */
     92	err = mv88e6xxx_g2_mgmt_enable_0x(chip, 0xffff);
     93	if (err)
     94		return err;
     95
     96	return mv88e6xxx_g2_switch_mgmt_rsvd2cpu(chip, true);
     97}
     98
     99int mv88e6352_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip)
    100{
    101	int err;
    102
    103	/* Consider the frames with reserved multicast destination
    104	 * addresses matching 01:80:c2:00:00:2x as MGMT.
    105	 */
    106	err = mv88e6xxx_g2_mgmt_enable_2x(chip, 0xffff);
    107	if (err)
    108		return err;
    109
    110	return mv88e6185_g2_mgmt_rsvd2cpu(chip);
    111}
    112
    113/* Offset 0x06: Device Mapping Table register */
    114
    115int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip, int target,
    116				      int port)
    117{
    118	u16 val = (target << 8) | (port & 0x1f);
    119	/* Modern chips use 5 bits to define a device mapping port,
    120	 * but bit 4 is reserved on older chips, so it is safe to use.
    121	 */
    122
    123	return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_DEVICE_MAPPING,
    124				  MV88E6XXX_G2_DEVICE_MAPPING_UPDATE | val);
    125}
    126
    127/* Offset 0x07: Trunk Mask Table register */
    128
    129int mv88e6xxx_g2_trunk_mask_write(struct mv88e6xxx_chip *chip, int num,
    130				  bool hash, u16 mask)
    131{
    132	u16 val = (num << 12) | (mask & mv88e6xxx_port_mask(chip));
    133
    134	if (hash)
    135		val |= MV88E6XXX_G2_TRUNK_MASK_HASH;
    136
    137	return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_TRUNK_MASK,
    138				  MV88E6XXX_G2_TRUNK_MASK_UPDATE | val);
    139}
    140
    141/* Offset 0x08: Trunk Mapping Table register */
    142
    143int mv88e6xxx_g2_trunk_mapping_write(struct mv88e6xxx_chip *chip, int id,
    144				     u16 map)
    145{
    146	const u16 port_mask = BIT(mv88e6xxx_num_ports(chip)) - 1;
    147	u16 val = (id << 11) | (map & port_mask);
    148
    149	return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_TRUNK_MAPPING,
    150				  MV88E6XXX_G2_TRUNK_MAPPING_UPDATE | val);
    151}
    152
    153int mv88e6xxx_g2_trunk_clear(struct mv88e6xxx_chip *chip)
    154{
    155	const u16 port_mask = BIT(mv88e6xxx_num_ports(chip)) - 1;
    156	int i, err;
    157
    158	/* Clear all eight possible Trunk Mask vectors */
    159	for (i = 0; i < 8; ++i) {
    160		err = mv88e6xxx_g2_trunk_mask_write(chip, i, false, port_mask);
    161		if (err)
    162			return err;
    163	}
    164
    165	/* Clear all sixteen possible Trunk ID routing vectors */
    166	for (i = 0; i < 16; ++i) {
    167		err = mv88e6xxx_g2_trunk_mapping_write(chip, i, 0);
    168		if (err)
    169			return err;
    170	}
    171
    172	return 0;
    173}
    174
    175/* Offset 0x09: Ingress Rate Command register
    176 * Offset 0x0A: Ingress Rate Data register
    177 */
    178
    179static int mv88e6xxx_g2_irl_wait(struct mv88e6xxx_chip *chip)
    180{
    181	int bit = __bf_shf(MV88E6XXX_G2_IRL_CMD_BUSY);
    182
    183	return mv88e6xxx_g2_wait_bit(chip, MV88E6XXX_G2_IRL_CMD, bit, 0);
    184}
    185
    186static int mv88e6xxx_g2_irl_op(struct mv88e6xxx_chip *chip, u16 op, int port,
    187			       int res, int reg)
    188{
    189	int err;
    190
    191	err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_IRL_CMD,
    192				 MV88E6XXX_G2_IRL_CMD_BUSY | op | (port << 8) |
    193				 (res << 5) | reg);
    194	if (err)
    195		return err;
    196
    197	return mv88e6xxx_g2_irl_wait(chip);
    198}
    199
    200int mv88e6352_g2_irl_init_all(struct mv88e6xxx_chip *chip, int port)
    201{
    202	return mv88e6xxx_g2_irl_op(chip, MV88E6352_G2_IRL_CMD_OP_INIT_ALL, port,
    203				   0, 0);
    204}
    205
    206int mv88e6390_g2_irl_init_all(struct mv88e6xxx_chip *chip, int port)
    207{
    208	return mv88e6xxx_g2_irl_op(chip, MV88E6390_G2_IRL_CMD_OP_INIT_ALL, port,
    209				   0, 0);
    210}
    211
    212/* Offset 0x0B: Cross-chip Port VLAN (Addr) Register
    213 * Offset 0x0C: Cross-chip Port VLAN Data Register
    214 */
    215
    216static int mv88e6xxx_g2_pvt_op_wait(struct mv88e6xxx_chip *chip)
    217{
    218	int bit = __bf_shf(MV88E6XXX_G2_PVT_ADDR_BUSY);
    219
    220	return mv88e6xxx_g2_wait_bit(chip, MV88E6XXX_G2_PVT_ADDR, bit, 0);
    221}
    222
    223static int mv88e6xxx_g2_pvt_op(struct mv88e6xxx_chip *chip, int src_dev,
    224			       int src_port, u16 op)
    225{
    226	int err;
    227
    228	/* 9-bit Cross-chip PVT pointer: with MV88E6XXX_G2_MISC_5_BIT_PORT
    229	 * cleared, source device is 5-bit, source port is 4-bit.
    230	 */
    231	op |= MV88E6XXX_G2_PVT_ADDR_BUSY;
    232	op |= (src_dev & 0x1f) << 4;
    233	op |= (src_port & 0xf);
    234
    235	err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_PVT_ADDR, op);
    236	if (err)
    237		return err;
    238
    239	return mv88e6xxx_g2_pvt_op_wait(chip);
    240}
    241
    242int mv88e6xxx_g2_pvt_read(struct mv88e6xxx_chip *chip, int src_dev,
    243			  int src_port, u16 *data)
    244{
    245	int err;
    246
    247	err = mv88e6xxx_g2_pvt_op_wait(chip);
    248	if (err)
    249		return err;
    250
    251	err = mv88e6xxx_g2_pvt_op(chip, src_dev, src_port,
    252				  MV88E6XXX_G2_PVT_ADDR_OP_READ);
    253	if (err)
    254		return err;
    255
    256	return mv88e6xxx_g2_read(chip, MV88E6XXX_G2_PVT_DATA, data);
    257}
    258
    259int mv88e6xxx_g2_pvt_write(struct mv88e6xxx_chip *chip, int src_dev,
    260			   int src_port, u16 data)
    261{
    262	int err;
    263
    264	err = mv88e6xxx_g2_pvt_op_wait(chip);
    265	if (err)
    266		return err;
    267
    268	err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_PVT_DATA, data);
    269	if (err)
    270		return err;
    271
    272	return mv88e6xxx_g2_pvt_op(chip, src_dev, src_port,
    273				   MV88E6XXX_G2_PVT_ADDR_OP_WRITE_PVLAN);
    274}
    275
    276/* Offset 0x0D: Switch MAC/WoL/WoF register */
    277
    278static int mv88e6xxx_g2_switch_mac_write(struct mv88e6xxx_chip *chip,
    279					 unsigned int pointer, u8 data)
    280{
    281	u16 val = (pointer << 8) | data;
    282
    283	return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SWITCH_MAC,
    284				  MV88E6XXX_G2_SWITCH_MAC_UPDATE | val);
    285}
    286
    287int mv88e6xxx_g2_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr)
    288{
    289	int i, err;
    290
    291	for (i = 0; i < 6; i++) {
    292		err = mv88e6xxx_g2_switch_mac_write(chip, i, addr[i]);
    293		if (err)
    294			break;
    295	}
    296
    297	return err;
    298}
    299
    300/* Offset 0x0E: ATU Statistics */
    301
    302int mv88e6xxx_g2_atu_stats_set(struct mv88e6xxx_chip *chip, u16 kind, u16 bin)
    303{
    304	return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_ATU_STATS,
    305				  kind | bin);
    306}
    307
    308int mv88e6xxx_g2_atu_stats_get(struct mv88e6xxx_chip *chip, u16 *stats)
    309{
    310	return mv88e6xxx_g2_read(chip, MV88E6XXX_G2_ATU_STATS, stats);
    311}
    312
    313/* Offset 0x0F: Priority Override Table */
    314
    315static int mv88e6xxx_g2_pot_write(struct mv88e6xxx_chip *chip, int pointer,
    316				  u8 data)
    317{
    318	u16 val = (pointer << 8) | (data & 0x7);
    319
    320	return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_PRIO_OVERRIDE,
    321				  MV88E6XXX_G2_PRIO_OVERRIDE_UPDATE | val);
    322}
    323
    324int mv88e6xxx_g2_pot_clear(struct mv88e6xxx_chip *chip)
    325{
    326	int i, err;
    327
    328	/* Clear all sixteen possible Priority Override entries */
    329	for (i = 0; i < 16; i++) {
    330		err = mv88e6xxx_g2_pot_write(chip, i, 0);
    331		if (err)
    332			break;
    333	}
    334
    335	return err;
    336}
    337
    338/* Offset 0x14: EEPROM Command
    339 * Offset 0x15: EEPROM Data (for 16-bit data access)
    340 * Offset 0x15: EEPROM Addr (for 8-bit data access)
    341 */
    342
    343static int mv88e6xxx_g2_eeprom_wait(struct mv88e6xxx_chip *chip)
    344{
    345	int bit = __bf_shf(MV88E6XXX_G2_EEPROM_CMD_BUSY);
    346	int err;
    347
    348	err = mv88e6xxx_g2_wait_bit(chip, MV88E6XXX_G2_EEPROM_CMD, bit, 0);
    349	if (err)
    350		return err;
    351
    352	bit = __bf_shf(MV88E6XXX_G2_EEPROM_CMD_RUNNING);
    353
    354	return mv88e6xxx_g2_wait_bit(chip, MV88E6XXX_G2_EEPROM_CMD, bit, 0);
    355}
    356
    357static int mv88e6xxx_g2_eeprom_cmd(struct mv88e6xxx_chip *chip, u16 cmd)
    358{
    359	int err;
    360
    361	err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_EEPROM_CMD,
    362				 MV88E6XXX_G2_EEPROM_CMD_BUSY | cmd);
    363	if (err)
    364		return err;
    365
    366	return mv88e6xxx_g2_eeprom_wait(chip);
    367}
    368
    369static int mv88e6xxx_g2_eeprom_read8(struct mv88e6xxx_chip *chip,
    370				     u16 addr, u8 *data)
    371{
    372	u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_READ;
    373	int err;
    374
    375	err = mv88e6xxx_g2_eeprom_wait(chip);
    376	if (err)
    377		return err;
    378
    379	err = mv88e6xxx_g2_write(chip, MV88E6390_G2_EEPROM_ADDR, addr);
    380	if (err)
    381		return err;
    382
    383	err = mv88e6xxx_g2_eeprom_cmd(chip, cmd);
    384	if (err)
    385		return err;
    386
    387	err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_EEPROM_CMD, &cmd);
    388	if (err)
    389		return err;
    390
    391	*data = cmd & 0xff;
    392
    393	return 0;
    394}
    395
    396static int mv88e6xxx_g2_eeprom_write8(struct mv88e6xxx_chip *chip,
    397				      u16 addr, u8 data)
    398{
    399	u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_WRITE |
    400		MV88E6XXX_G2_EEPROM_CMD_WRITE_EN;
    401	int err;
    402
    403	err = mv88e6xxx_g2_eeprom_wait(chip);
    404	if (err)
    405		return err;
    406
    407	err = mv88e6xxx_g2_write(chip, MV88E6390_G2_EEPROM_ADDR, addr);
    408	if (err)
    409		return err;
    410
    411	return mv88e6xxx_g2_eeprom_cmd(chip, cmd | data);
    412}
    413
    414static int mv88e6xxx_g2_eeprom_read16(struct mv88e6xxx_chip *chip,
    415				      u8 addr, u16 *data)
    416{
    417	u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_READ | addr;
    418	int err;
    419
    420	err = mv88e6xxx_g2_eeprom_wait(chip);
    421	if (err)
    422		return err;
    423
    424	err = mv88e6xxx_g2_eeprom_cmd(chip, cmd);
    425	if (err)
    426		return err;
    427
    428	return mv88e6xxx_g2_read(chip, MV88E6352_G2_EEPROM_DATA, data);
    429}
    430
    431static int mv88e6xxx_g2_eeprom_write16(struct mv88e6xxx_chip *chip,
    432				       u8 addr, u16 data)
    433{
    434	u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_WRITE | addr;
    435	int err;
    436
    437	err = mv88e6xxx_g2_eeprom_wait(chip);
    438	if (err)
    439		return err;
    440
    441	err = mv88e6xxx_g2_write(chip, MV88E6352_G2_EEPROM_DATA, data);
    442	if (err)
    443		return err;
    444
    445	return mv88e6xxx_g2_eeprom_cmd(chip, cmd);
    446}
    447
    448int mv88e6xxx_g2_get_eeprom8(struct mv88e6xxx_chip *chip,
    449			     struct ethtool_eeprom *eeprom, u8 *data)
    450{
    451	unsigned int offset = eeprom->offset;
    452	unsigned int len = eeprom->len;
    453	int err;
    454
    455	eeprom->len = 0;
    456
    457	while (len) {
    458		err = mv88e6xxx_g2_eeprom_read8(chip, offset, data);
    459		if (err)
    460			return err;
    461
    462		eeprom->len++;
    463		offset++;
    464		data++;
    465		len--;
    466	}
    467
    468	return 0;
    469}
    470
    471int mv88e6xxx_g2_set_eeprom8(struct mv88e6xxx_chip *chip,
    472			     struct ethtool_eeprom *eeprom, u8 *data)
    473{
    474	unsigned int offset = eeprom->offset;
    475	unsigned int len = eeprom->len;
    476	int err;
    477
    478	eeprom->len = 0;
    479
    480	while (len) {
    481		err = mv88e6xxx_g2_eeprom_write8(chip, offset, *data);
    482		if (err)
    483			return err;
    484
    485		eeprom->len++;
    486		offset++;
    487		data++;
    488		len--;
    489	}
    490
    491	return 0;
    492}
    493
    494int mv88e6xxx_g2_get_eeprom16(struct mv88e6xxx_chip *chip,
    495			      struct ethtool_eeprom *eeprom, u8 *data)
    496{
    497	unsigned int offset = eeprom->offset;
    498	unsigned int len = eeprom->len;
    499	u16 val;
    500	int err;
    501
    502	eeprom->len = 0;
    503
    504	if (offset & 1) {
    505		err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
    506		if (err)
    507			return err;
    508
    509		*data++ = (val >> 8) & 0xff;
    510
    511		offset++;
    512		len--;
    513		eeprom->len++;
    514	}
    515
    516	while (len >= 2) {
    517		err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
    518		if (err)
    519			return err;
    520
    521		*data++ = val & 0xff;
    522		*data++ = (val >> 8) & 0xff;
    523
    524		offset += 2;
    525		len -= 2;
    526		eeprom->len += 2;
    527	}
    528
    529	if (len) {
    530		err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
    531		if (err)
    532			return err;
    533
    534		*data++ = val & 0xff;
    535
    536		offset++;
    537		len--;
    538		eeprom->len++;
    539	}
    540
    541	return 0;
    542}
    543
    544int mv88e6xxx_g2_set_eeprom16(struct mv88e6xxx_chip *chip,
    545			      struct ethtool_eeprom *eeprom, u8 *data)
    546{
    547	unsigned int offset = eeprom->offset;
    548	unsigned int len = eeprom->len;
    549	u16 val;
    550	int err;
    551
    552	/* Ensure the RO WriteEn bit is set */
    553	err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_EEPROM_CMD, &val);
    554	if (err)
    555		return err;
    556
    557	if (!(val & MV88E6XXX_G2_EEPROM_CMD_WRITE_EN))
    558		return -EROFS;
    559
    560	eeprom->len = 0;
    561
    562	if (offset & 1) {
    563		err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
    564		if (err)
    565			return err;
    566
    567		val = (*data++ << 8) | (val & 0xff);
    568
    569		err = mv88e6xxx_g2_eeprom_write16(chip, offset >> 1, val);
    570		if (err)
    571			return err;
    572
    573		offset++;
    574		len--;
    575		eeprom->len++;
    576	}
    577
    578	while (len >= 2) {
    579		val = *data++;
    580		val |= *data++ << 8;
    581
    582		err = mv88e6xxx_g2_eeprom_write16(chip, offset >> 1, val);
    583		if (err)
    584			return err;
    585
    586		offset += 2;
    587		len -= 2;
    588		eeprom->len += 2;
    589	}
    590
    591	if (len) {
    592		err = mv88e6xxx_g2_eeprom_read16(chip, offset >> 1, &val);
    593		if (err)
    594			return err;
    595
    596		val = (val & 0xff00) | *data++;
    597
    598		err = mv88e6xxx_g2_eeprom_write16(chip, offset >> 1, val);
    599		if (err)
    600			return err;
    601
    602		offset++;
    603		len--;
    604		eeprom->len++;
    605	}
    606
    607	return 0;
    608}
    609
    610/* Offset 0x18: SMI PHY Command Register
    611 * Offset 0x19: SMI PHY Data Register
    612 */
    613
    614static int mv88e6xxx_g2_smi_phy_wait(struct mv88e6xxx_chip *chip)
    615{
    616	int bit = __bf_shf(MV88E6XXX_G2_SMI_PHY_CMD_BUSY);
    617
    618	return mv88e6xxx_g2_wait_bit(chip, MV88E6XXX_G2_SMI_PHY_CMD, bit, 0);
    619}
    620
    621static int mv88e6xxx_g2_smi_phy_cmd(struct mv88e6xxx_chip *chip, u16 cmd)
    622{
    623	int err;
    624
    625	err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SMI_PHY_CMD,
    626				 MV88E6XXX_G2_SMI_PHY_CMD_BUSY | cmd);
    627	if (err)
    628		return err;
    629
    630	return mv88e6xxx_g2_smi_phy_wait(chip);
    631}
    632
    633static int mv88e6xxx_g2_smi_phy_access(struct mv88e6xxx_chip *chip,
    634				       bool external, bool c45, u16 op, int dev,
    635				       int reg)
    636{
    637	u16 cmd = op;
    638
    639	if (external)
    640		cmd |= MV88E6390_G2_SMI_PHY_CMD_FUNC_EXTERNAL;
    641	else
    642		cmd |= MV88E6390_G2_SMI_PHY_CMD_FUNC_INTERNAL; /* empty mask */
    643
    644	if (c45)
    645		cmd |= MV88E6XXX_G2_SMI_PHY_CMD_MODE_45; /* empty mask */
    646	else
    647		cmd |= MV88E6XXX_G2_SMI_PHY_CMD_MODE_22;
    648
    649	dev <<= __bf_shf(MV88E6XXX_G2_SMI_PHY_CMD_DEV_ADDR_MASK);
    650	cmd |= dev & MV88E6XXX_G2_SMI_PHY_CMD_DEV_ADDR_MASK;
    651	cmd |= reg & MV88E6XXX_G2_SMI_PHY_CMD_REG_ADDR_MASK;
    652
    653	return mv88e6xxx_g2_smi_phy_cmd(chip, cmd);
    654}
    655
    656static int mv88e6xxx_g2_smi_phy_access_c22(struct mv88e6xxx_chip *chip,
    657					   bool external, u16 op, int dev,
    658					   int reg)
    659{
    660	return mv88e6xxx_g2_smi_phy_access(chip, external, false, op, dev, reg);
    661}
    662
    663/* IEEE 802.3 Clause 22 Read Data Register */
    664static int mv88e6xxx_g2_smi_phy_read_data_c22(struct mv88e6xxx_chip *chip,
    665					      bool external, int dev, int reg,
    666					      u16 *data)
    667{
    668	u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_22_READ_DATA;
    669	int err;
    670
    671	err = mv88e6xxx_g2_smi_phy_wait(chip);
    672	if (err)
    673		return err;
    674
    675	err = mv88e6xxx_g2_smi_phy_access_c22(chip, external, op, dev, reg);
    676	if (err)
    677		return err;
    678
    679	return mv88e6xxx_g2_read(chip, MV88E6XXX_G2_SMI_PHY_DATA, data);
    680}
    681
    682/* IEEE 802.3 Clause 22 Write Data Register */
    683static int mv88e6xxx_g2_smi_phy_write_data_c22(struct mv88e6xxx_chip *chip,
    684					       bool external, int dev, int reg,
    685					       u16 data)
    686{
    687	u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_22_WRITE_DATA;
    688	int err;
    689
    690	err = mv88e6xxx_g2_smi_phy_wait(chip);
    691	if (err)
    692		return err;
    693
    694	err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SMI_PHY_DATA, data);
    695	if (err)
    696		return err;
    697
    698	return mv88e6xxx_g2_smi_phy_access_c22(chip, external, op, dev, reg);
    699}
    700
    701static int mv88e6xxx_g2_smi_phy_access_c45(struct mv88e6xxx_chip *chip,
    702					   bool external, u16 op, int port,
    703					   int dev)
    704{
    705	return mv88e6xxx_g2_smi_phy_access(chip, external, true, op, port, dev);
    706}
    707
    708/* IEEE 802.3 Clause 45 Write Address Register */
    709static int mv88e6xxx_g2_smi_phy_write_addr_c45(struct mv88e6xxx_chip *chip,
    710					       bool external, int port, int dev,
    711					       int addr)
    712{
    713	u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_45_WRITE_ADDR;
    714	int err;
    715
    716	err = mv88e6xxx_g2_smi_phy_wait(chip);
    717	if (err)
    718		return err;
    719
    720	err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SMI_PHY_DATA, addr);
    721	if (err)
    722		return err;
    723
    724	return mv88e6xxx_g2_smi_phy_access_c45(chip, external, op, port, dev);
    725}
    726
    727/* IEEE 802.3 Clause 45 Read Data Register */
    728static int mv88e6xxx_g2_smi_phy_read_data_c45(struct mv88e6xxx_chip *chip,
    729					      bool external, int port, int dev,
    730					      u16 *data)
    731{
    732	u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_45_READ_DATA;
    733	int err;
    734
    735	err = mv88e6xxx_g2_smi_phy_access_c45(chip, external, op, port, dev);
    736	if (err)
    737		return err;
    738
    739	return mv88e6xxx_g2_read(chip, MV88E6XXX_G2_SMI_PHY_DATA, data);
    740}
    741
    742static int mv88e6xxx_g2_smi_phy_read_c45(struct mv88e6xxx_chip *chip,
    743					 bool external, int port, int reg,
    744					 u16 *data)
    745{
    746	int dev = (reg >> 16) & 0x1f;
    747	int addr = reg & 0xffff;
    748	int err;
    749
    750	err = mv88e6xxx_g2_smi_phy_write_addr_c45(chip, external, port, dev,
    751						  addr);
    752	if (err)
    753		return err;
    754
    755	return mv88e6xxx_g2_smi_phy_read_data_c45(chip, external, port, dev,
    756						  data);
    757}
    758
    759/* IEEE 802.3 Clause 45 Write Data Register */
    760static int mv88e6xxx_g2_smi_phy_write_data_c45(struct mv88e6xxx_chip *chip,
    761					       bool external, int port, int dev,
    762					       u16 data)
    763{
    764	u16 op = MV88E6XXX_G2_SMI_PHY_CMD_OP_45_WRITE_DATA;
    765	int err;
    766
    767	err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SMI_PHY_DATA, data);
    768	if (err)
    769		return err;
    770
    771	return mv88e6xxx_g2_smi_phy_access_c45(chip, external, op, port, dev);
    772}
    773
    774static int mv88e6xxx_g2_smi_phy_write_c45(struct mv88e6xxx_chip *chip,
    775					  bool external, int port, int reg,
    776					  u16 data)
    777{
    778	int dev = (reg >> 16) & 0x1f;
    779	int addr = reg & 0xffff;
    780	int err;
    781
    782	err = mv88e6xxx_g2_smi_phy_write_addr_c45(chip, external, port, dev,
    783						  addr);
    784	if (err)
    785		return err;
    786
    787	return mv88e6xxx_g2_smi_phy_write_data_c45(chip, external, port, dev,
    788						   data);
    789}
    790
    791int mv88e6xxx_g2_smi_phy_read(struct mv88e6xxx_chip *chip, struct mii_bus *bus,
    792			      int addr, int reg, u16 *val)
    793{
    794	struct mv88e6xxx_mdio_bus *mdio_bus = bus->priv;
    795	bool external = mdio_bus->external;
    796
    797	if (reg & MII_ADDR_C45)
    798		return mv88e6xxx_g2_smi_phy_read_c45(chip, external, addr, reg,
    799						     val);
    800
    801	return mv88e6xxx_g2_smi_phy_read_data_c22(chip, external, addr, reg,
    802						  val);
    803}
    804
    805int mv88e6xxx_g2_smi_phy_write(struct mv88e6xxx_chip *chip, struct mii_bus *bus,
    806			       int addr, int reg, u16 val)
    807{
    808	struct mv88e6xxx_mdio_bus *mdio_bus = bus->priv;
    809	bool external = mdio_bus->external;
    810
    811	if (reg & MII_ADDR_C45)
    812		return mv88e6xxx_g2_smi_phy_write_c45(chip, external, addr, reg,
    813						      val);
    814
    815	return mv88e6xxx_g2_smi_phy_write_data_c22(chip, external, addr, reg,
    816						   val);
    817}
    818
    819/* Offset 0x1B: Watchdog Control */
    820static int mv88e6097_watchdog_action(struct mv88e6xxx_chip *chip, int irq)
    821{
    822	u16 reg;
    823
    824	mv88e6xxx_g2_read(chip, MV88E6352_G2_WDOG_CTL, &reg);
    825
    826	dev_info(chip->dev, "Watchdog event: 0x%04x", reg);
    827
    828	return IRQ_HANDLED;
    829}
    830
    831static void mv88e6097_watchdog_free(struct mv88e6xxx_chip *chip)
    832{
    833	u16 reg;
    834
    835	mv88e6xxx_g2_read(chip, MV88E6352_G2_WDOG_CTL, &reg);
    836
    837	reg &= ~(MV88E6352_G2_WDOG_CTL_EGRESS_ENABLE |
    838		 MV88E6352_G2_WDOG_CTL_QC_ENABLE);
    839
    840	mv88e6xxx_g2_write(chip, MV88E6352_G2_WDOG_CTL, reg);
    841}
    842
    843static int mv88e6097_watchdog_setup(struct mv88e6xxx_chip *chip)
    844{
    845	return mv88e6xxx_g2_write(chip, MV88E6352_G2_WDOG_CTL,
    846				  MV88E6352_G2_WDOG_CTL_EGRESS_ENABLE |
    847				  MV88E6352_G2_WDOG_CTL_QC_ENABLE |
    848				  MV88E6352_G2_WDOG_CTL_SWRESET);
    849}
    850
    851const struct mv88e6xxx_irq_ops mv88e6097_watchdog_ops = {
    852	.irq_action = mv88e6097_watchdog_action,
    853	.irq_setup = mv88e6097_watchdog_setup,
    854	.irq_free = mv88e6097_watchdog_free,
    855};
    856
    857static void mv88e6250_watchdog_free(struct mv88e6xxx_chip *chip)
    858{
    859	u16 reg;
    860
    861	mv88e6xxx_g2_read(chip, MV88E6250_G2_WDOG_CTL, &reg);
    862
    863	reg &= ~(MV88E6250_G2_WDOG_CTL_EGRESS_ENABLE |
    864		 MV88E6250_G2_WDOG_CTL_QC_ENABLE);
    865
    866	mv88e6xxx_g2_write(chip, MV88E6250_G2_WDOG_CTL, reg);
    867}
    868
    869static int mv88e6250_watchdog_setup(struct mv88e6xxx_chip *chip)
    870{
    871	return mv88e6xxx_g2_write(chip, MV88E6250_G2_WDOG_CTL,
    872				  MV88E6250_G2_WDOG_CTL_EGRESS_ENABLE |
    873				  MV88E6250_G2_WDOG_CTL_QC_ENABLE |
    874				  MV88E6250_G2_WDOG_CTL_SWRESET);
    875}
    876
    877const struct mv88e6xxx_irq_ops mv88e6250_watchdog_ops = {
    878	.irq_action = mv88e6097_watchdog_action,
    879	.irq_setup = mv88e6250_watchdog_setup,
    880	.irq_free = mv88e6250_watchdog_free,
    881};
    882
    883static int mv88e6390_watchdog_setup(struct mv88e6xxx_chip *chip)
    884{
    885	return mv88e6xxx_g2_write(chip, MV88E6390_G2_WDOG_CTL,
    886				  MV88E6390_G2_WDOG_CTL_UPDATE |
    887				  MV88E6390_G2_WDOG_CTL_PTR_INT_ENABLE |
    888				  MV88E6390_G2_WDOG_CTL_CUT_THROUGH |
    889				  MV88E6390_G2_WDOG_CTL_QUEUE_CONTROLLER |
    890				  MV88E6390_G2_WDOG_CTL_EGRESS |
    891				  MV88E6390_G2_WDOG_CTL_FORCE_IRQ);
    892}
    893
    894static int mv88e6390_watchdog_action(struct mv88e6xxx_chip *chip, int irq)
    895{
    896	u16 reg;
    897
    898	mv88e6xxx_g2_write(chip, MV88E6390_G2_WDOG_CTL,
    899			   MV88E6390_G2_WDOG_CTL_PTR_EVENT);
    900	mv88e6xxx_g2_read(chip, MV88E6390_G2_WDOG_CTL, &reg);
    901
    902	dev_info(chip->dev, "Watchdog event: 0x%04x",
    903		 reg & MV88E6390_G2_WDOG_CTL_DATA_MASK);
    904
    905	mv88e6xxx_g2_write(chip, MV88E6390_G2_WDOG_CTL,
    906			   MV88E6390_G2_WDOG_CTL_PTR_HISTORY);
    907	mv88e6xxx_g2_read(chip, MV88E6390_G2_WDOG_CTL, &reg);
    908
    909	dev_info(chip->dev, "Watchdog history: 0x%04x",
    910		 reg & MV88E6390_G2_WDOG_CTL_DATA_MASK);
    911
    912	/* Trigger a software reset to try to recover the switch */
    913	if (chip->info->ops->reset)
    914		chip->info->ops->reset(chip);
    915
    916	mv88e6390_watchdog_setup(chip);
    917
    918	return IRQ_HANDLED;
    919}
    920
    921static void mv88e6390_watchdog_free(struct mv88e6xxx_chip *chip)
    922{
    923	mv88e6xxx_g2_write(chip, MV88E6390_G2_WDOG_CTL,
    924			   MV88E6390_G2_WDOG_CTL_UPDATE |
    925			   MV88E6390_G2_WDOG_CTL_PTR_INT_ENABLE);
    926}
    927
    928const struct mv88e6xxx_irq_ops mv88e6390_watchdog_ops = {
    929	.irq_action = mv88e6390_watchdog_action,
    930	.irq_setup = mv88e6390_watchdog_setup,
    931	.irq_free = mv88e6390_watchdog_free,
    932};
    933
    934static irqreturn_t mv88e6xxx_g2_watchdog_thread_fn(int irq, void *dev_id)
    935{
    936	struct mv88e6xxx_chip *chip = dev_id;
    937	irqreturn_t ret = IRQ_NONE;
    938
    939	mv88e6xxx_reg_lock(chip);
    940	if (chip->info->ops->watchdog_ops->irq_action)
    941		ret = chip->info->ops->watchdog_ops->irq_action(chip, irq);
    942	mv88e6xxx_reg_unlock(chip);
    943
    944	return ret;
    945}
    946
    947static void mv88e6xxx_g2_watchdog_free(struct mv88e6xxx_chip *chip)
    948{
    949	mv88e6xxx_reg_lock(chip);
    950	if (chip->info->ops->watchdog_ops->irq_free)
    951		chip->info->ops->watchdog_ops->irq_free(chip);
    952	mv88e6xxx_reg_unlock(chip);
    953
    954	free_irq(chip->watchdog_irq, chip);
    955	irq_dispose_mapping(chip->watchdog_irq);
    956}
    957
    958static int mv88e6xxx_g2_watchdog_setup(struct mv88e6xxx_chip *chip)
    959{
    960	int err;
    961
    962	chip->watchdog_irq = irq_find_mapping(chip->g2_irq.domain,
    963					      MV88E6XXX_G2_INT_SOURCE_WATCHDOG);
    964	if (chip->watchdog_irq < 0)
    965		return chip->watchdog_irq;
    966
    967	snprintf(chip->watchdog_irq_name, sizeof(chip->watchdog_irq_name),
    968		 "mv88e6xxx-%s-watchdog", dev_name(chip->dev));
    969
    970	err = request_threaded_irq(chip->watchdog_irq, NULL,
    971				   mv88e6xxx_g2_watchdog_thread_fn,
    972				   IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
    973				   chip->watchdog_irq_name, chip);
    974	if (err)
    975		return err;
    976
    977	mv88e6xxx_reg_lock(chip);
    978	if (chip->info->ops->watchdog_ops->irq_setup)
    979		err = chip->info->ops->watchdog_ops->irq_setup(chip);
    980	mv88e6xxx_reg_unlock(chip);
    981
    982	return err;
    983}
    984
    985/* Offset 0x1D: Misc Register */
    986
    987static int mv88e6xxx_g2_misc_5_bit_port(struct mv88e6xxx_chip *chip,
    988					bool port_5_bit)
    989{
    990	u16 val;
    991	int err;
    992
    993	err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_MISC, &val);
    994	if (err)
    995		return err;
    996
    997	if (port_5_bit)
    998		val |= MV88E6XXX_G2_MISC_5_BIT_PORT;
    999	else
   1000		val &= ~MV88E6XXX_G2_MISC_5_BIT_PORT;
   1001
   1002	return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_MISC, val);
   1003}
   1004
   1005int mv88e6xxx_g2_misc_4_bit_port(struct mv88e6xxx_chip *chip)
   1006{
   1007	return mv88e6xxx_g2_misc_5_bit_port(chip, false);
   1008}
   1009
   1010static void mv88e6xxx_g2_irq_mask(struct irq_data *d)
   1011{
   1012	struct mv88e6xxx_chip *chip = irq_data_get_irq_chip_data(d);
   1013	unsigned int n = d->hwirq;
   1014
   1015	chip->g2_irq.masked |= (1 << n);
   1016}
   1017
   1018static void mv88e6xxx_g2_irq_unmask(struct irq_data *d)
   1019{
   1020	struct mv88e6xxx_chip *chip = irq_data_get_irq_chip_data(d);
   1021	unsigned int n = d->hwirq;
   1022
   1023	chip->g2_irq.masked &= ~(1 << n);
   1024}
   1025
   1026static irqreturn_t mv88e6xxx_g2_irq_thread_fn(int irq, void *dev_id)
   1027{
   1028	struct mv88e6xxx_chip *chip = dev_id;
   1029	unsigned int nhandled = 0;
   1030	unsigned int sub_irq;
   1031	unsigned int n;
   1032	int err;
   1033	u16 reg;
   1034
   1035	mv88e6xxx_reg_lock(chip);
   1036	err = mv88e6xxx_g2_int_source(chip, &reg);
   1037	mv88e6xxx_reg_unlock(chip);
   1038	if (err)
   1039		goto out;
   1040
   1041	for (n = 0; n < 16; ++n) {
   1042		if (reg & (1 << n)) {
   1043			sub_irq = irq_find_mapping(chip->g2_irq.domain, n);
   1044			handle_nested_irq(sub_irq);
   1045			++nhandled;
   1046		}
   1047	}
   1048out:
   1049	return (nhandled > 0 ? IRQ_HANDLED : IRQ_NONE);
   1050}
   1051
   1052static void mv88e6xxx_g2_irq_bus_lock(struct irq_data *d)
   1053{
   1054	struct mv88e6xxx_chip *chip = irq_data_get_irq_chip_data(d);
   1055
   1056	mv88e6xxx_reg_lock(chip);
   1057}
   1058
   1059static void mv88e6xxx_g2_irq_bus_sync_unlock(struct irq_data *d)
   1060{
   1061	struct mv88e6xxx_chip *chip = irq_data_get_irq_chip_data(d);
   1062	int err;
   1063
   1064	err = mv88e6xxx_g2_int_mask(chip, ~chip->g2_irq.masked);
   1065	if (err)
   1066		dev_err(chip->dev, "failed to mask interrupts\n");
   1067
   1068	mv88e6xxx_reg_unlock(chip);
   1069}
   1070
   1071static const struct irq_chip mv88e6xxx_g2_irq_chip = {
   1072	.name			= "mv88e6xxx-g2",
   1073	.irq_mask		= mv88e6xxx_g2_irq_mask,
   1074	.irq_unmask		= mv88e6xxx_g2_irq_unmask,
   1075	.irq_bus_lock		= mv88e6xxx_g2_irq_bus_lock,
   1076	.irq_bus_sync_unlock	= mv88e6xxx_g2_irq_bus_sync_unlock,
   1077};
   1078
   1079static int mv88e6xxx_g2_irq_domain_map(struct irq_domain *d,
   1080				       unsigned int irq,
   1081				       irq_hw_number_t hwirq)
   1082{
   1083	struct mv88e6xxx_chip *chip = d->host_data;
   1084
   1085	irq_set_chip_data(irq, d->host_data);
   1086	irq_set_chip_and_handler(irq, &chip->g2_irq.chip, handle_level_irq);
   1087	irq_set_noprobe(irq);
   1088
   1089	return 0;
   1090}
   1091
   1092static const struct irq_domain_ops mv88e6xxx_g2_irq_domain_ops = {
   1093	.map	= mv88e6xxx_g2_irq_domain_map,
   1094	.xlate	= irq_domain_xlate_twocell,
   1095};
   1096
   1097void mv88e6xxx_g2_irq_free(struct mv88e6xxx_chip *chip)
   1098{
   1099	int irq, virq;
   1100
   1101	mv88e6xxx_g2_watchdog_free(chip);
   1102
   1103	free_irq(chip->device_irq, chip);
   1104	irq_dispose_mapping(chip->device_irq);
   1105
   1106	for (irq = 0; irq < 16; irq++) {
   1107		virq = irq_find_mapping(chip->g2_irq.domain, irq);
   1108		irq_dispose_mapping(virq);
   1109	}
   1110
   1111	irq_domain_remove(chip->g2_irq.domain);
   1112}
   1113
   1114int mv88e6xxx_g2_irq_setup(struct mv88e6xxx_chip *chip)
   1115{
   1116	int err, irq, virq;
   1117
   1118	chip->g2_irq.masked = ~0;
   1119	mv88e6xxx_reg_lock(chip);
   1120	err = mv88e6xxx_g2_int_mask(chip, ~chip->g2_irq.masked);
   1121	mv88e6xxx_reg_unlock(chip);
   1122	if (err)
   1123		return err;
   1124
   1125	chip->g2_irq.domain = irq_domain_add_simple(
   1126		chip->dev->of_node, 16, 0, &mv88e6xxx_g2_irq_domain_ops, chip);
   1127	if (!chip->g2_irq.domain)
   1128		return -ENOMEM;
   1129
   1130	for (irq = 0; irq < 16; irq++)
   1131		irq_create_mapping(chip->g2_irq.domain, irq);
   1132
   1133	chip->g2_irq.chip = mv88e6xxx_g2_irq_chip;
   1134
   1135	chip->device_irq = irq_find_mapping(chip->g1_irq.domain,
   1136					    MV88E6XXX_G1_STS_IRQ_DEVICE);
   1137	if (chip->device_irq < 0) {
   1138		err = chip->device_irq;
   1139		goto out;
   1140	}
   1141
   1142	snprintf(chip->device_irq_name, sizeof(chip->device_irq_name),
   1143		 "mv88e6xxx-%s-g2", dev_name(chip->dev));
   1144
   1145	err = request_threaded_irq(chip->device_irq, NULL,
   1146				   mv88e6xxx_g2_irq_thread_fn,
   1147				   IRQF_ONESHOT, chip->device_irq_name, chip);
   1148	if (err)
   1149		goto out;
   1150
   1151	return mv88e6xxx_g2_watchdog_setup(chip);
   1152
   1153out:
   1154	for (irq = 0; irq < 16; irq++) {
   1155		virq = irq_find_mapping(chip->g2_irq.domain, irq);
   1156		irq_dispose_mapping(virq);
   1157	}
   1158
   1159	irq_domain_remove(chip->g2_irq.domain);
   1160
   1161	return err;
   1162}
   1163
   1164int mv88e6xxx_g2_irq_mdio_setup(struct mv88e6xxx_chip *chip,
   1165				struct mii_bus *bus)
   1166{
   1167	int phy, irq, err, err_phy;
   1168
   1169	for (phy = 0; phy < chip->info->num_internal_phys; phy++) {
   1170		irq = irq_find_mapping(chip->g2_irq.domain, phy);
   1171		if (irq < 0) {
   1172			err = irq;
   1173			goto out;
   1174		}
   1175		bus->irq[chip->info->phy_base_addr + phy] = irq;
   1176	}
   1177	return 0;
   1178out:
   1179	err_phy = phy;
   1180
   1181	for (phy = 0; phy < err_phy; phy++)
   1182		irq_dispose_mapping(bus->irq[phy]);
   1183
   1184	return err;
   1185}
   1186
   1187void mv88e6xxx_g2_irq_mdio_free(struct mv88e6xxx_chip *chip,
   1188				struct mii_bus *bus)
   1189{
   1190	int phy;
   1191
   1192	for (phy = 0; phy < chip->info->num_internal_phys; phy++)
   1193		irq_dispose_mapping(bus->irq[phy]);
   1194}