/* * sja1105.c * * Functions for NXP SJA1105 Ethernet Switch * * Copyright (C) 2018-2019 NetModule AG - http://www.netmodule.com/ * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include #if !defined(CONFIG_SPL_BUILD) #define SJA_NUM_PORTS 5 #define SJA_REG_MST_ADDR 0x0200 #define SJA_REG_MST_INCR 0x02 #define SJA_REG_RXF_ADDR 0x0406 #define SJA_REG_RXF_INCR 0x10 #define SJA_REG_TXF_ADDR 0x0402 #define SJA_REG_TXF_INCR 0x10 struct sja1105_stat { uint32_t mst; uint32_t rxf; uint32_t txf; }; static int read_stat(struct spi_slave *spi, struct sja1105_stat *s, int n) { int ret = 0; if (!ret) ret = sja1105_read_reg(spi, SJA_REG_MST_ADDR + SJA_REG_MST_INCR * n, &s->mst); if (!ret) ret = sja1105_read_reg(spi, SJA_REG_RXF_ADDR + SJA_REG_RXF_INCR * n, &s->txf); if (!ret) ret = sja1105_read_reg(spi, SJA_REG_TXF_ADDR + SJA_REG_TXF_INCR * n, &s->rxf); return ret; } static int do_sjainfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { struct udevice *dev; struct spi_slave *spi; struct sja1105_stat s[SJA_NUM_PORTS] = { 0 }; int i; int ret; /* Get sja1105 device */ ret = uclass_get_device_by_name(UCLASS_MISC, "sja1105", &dev); if (ret) { printf("sjainfo: switch not found\n"); return 1; } /* Try to claim SPI bus */ spi = dev_get_parent_priv(dev); if (!spi) { printf("sja1105: switch SPI bus not found\n"); return 1; } ret = spi_claim_bus(spi); if (ret) { printf("sja1105: unable to claim SPI bus\n"); return 1; } /* Read stats */ for (i = 0; i < SJA_NUM_PORTS && !ret; i++) { ret = read_stat(spi, &s[i], i); } if (ret) { printf("sjainfo: could not read port %d status registers\n", i); goto exit; } printf("Port MAC Stat\t\tRx\tTx\n"); printf("0 (UM) : %08x\t\t%u\t%u\n", s[0].mst, s[0].rxf, s[0].txf); printf("1 (BroadR-0) : %08x\t\t%u\t%u\n", s[1].mst, s[1].rxf, s[1].txf); printf("2 (BroadR-1) : %08x\t\t%u\t%u\n", s[2].mst, s[2].rxf, s[2].txf); printf("3 (100bTx) : %08x\t\t%u\t%u\n", s[3].mst, s[3].rxf, s[3].txf); printf("4 (CPU) : %08x\t\t%u\t%u\n", s[4].mst, s[4].rxf, s[4].txf); /* Done */ exit: /* Release SPI bus */ spi_release_bus(spi); return 0; } U_BOOT_CMD( sjainfo, 1, 1, do_sjainfo, "Show SJA1105 ethernet switch information", "" ); #endif