23961f75a6
This patch adds support for Microchip's KSZ8794 DSA device, which for switch and PHY control uses SPI communication. This driver also provides support for handling tail tagging added and decoded in the KSZ8794 device as well as modifying entries in the static MAC address table. It is also possible to use GPIO pin to reset KSZ8794 switch. When the "reset-gpios" property is not defined, software based reset is performed instead. The KSZ8794 can now be used on boards which have SPI CS only available as GPIO pin. Signed-off-by: Stefan Bigler <stefan.bigler@securiton.ch> Signed-off-by: Lukasz Majewski <lukma@denx.de>
292 lines
15 KiB
C
292 lines
15 KiB
C
/*
|
|
* Copyright (c) 2020 DENX Software Engineering GmbH
|
|
* Lukasz Majewski <lukma@denx.de>
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef __DSA_KSZ8794_H__
|
|
#define __DSA_KSZ8794_H__
|
|
|
|
/* SPI commands */
|
|
#define KSZ8794_SPI_CMD_WR (BIT(6))
|
|
#define KSZ8794_SPI_CMD_RD (BIT(6) | BIT(5))
|
|
|
|
/* PHY registers */
|
|
#define KSZ8794_BMCR 0x00
|
|
#define KSZ8794_BMSR 0x01
|
|
#define KSZ8794_PHYID1 0x02
|
|
#define KSZ8794_PHYID2 0x03
|
|
#define KSZ8794_ANAR 0x04
|
|
#define KSZ8794_ANLPAR 0x05
|
|
#define KSZ8794_LINKMD 0x1D
|
|
#define KSZ8794_PHYSCS 0x1F
|
|
|
|
/* SWITCH registers */
|
|
#define KSZ8794_CHIP_ID0 0x00
|
|
#define KSZ8794_CHIP_ID1 0x01
|
|
#define KSZ8794_GLOBAL_CTRL0 0x02
|
|
#define KSZ8794_GLOBAL_CTRL1 0x03
|
|
#define KSZ8794_GLOBAL_CTRL2 0x04
|
|
#define KSZ8794_GLOBAL_CTRL3 0x05
|
|
#define KSZ8794_GLOBAL_CTRL4 0x06
|
|
#define KSZ8794_GLOBAL_CTRL5 0x07
|
|
#define KSZ8794_GLOBAL_CTRL6_MIB_CTRL 0x08
|
|
#define KSZ8794_GLOBAL_CTRL7 0x09
|
|
#define KSZ8794_GLOBAL_CTRL8 0x0A
|
|
#define KSZ8794_GLOBAL_CTRL9 0x0B
|
|
#define KSZ8794_GLOBAL_CTRL10 0x0C
|
|
#define KSZ8794_GLOBAL_CTRL11 0x0D
|
|
#define KSZ8794_PD_MGMT_CTRL1 0x0E
|
|
#define KSZ8794_PD_MGMT_CTRL2 0x0F
|
|
#define KSZ8794_PORT1_CTRL0 0x10
|
|
#define KSZ8794_PORT1_CTRL1 0x11
|
|
#define KSZ8794_PORT1_CTRL2 0x12
|
|
#define KSZ8794_PORT1_CTRL3 0x13
|
|
#define KSZ8794_PORT1_CTRL4 0x14
|
|
#define KSZ8794_PORT1_CTRL5 0x15
|
|
#define KSZ8794_PORT1_CTRL7 0x17
|
|
#define KSZ8794_PORT1_STAT0 0x18
|
|
#define KSZ8794_PORT1_STAT1 0x19
|
|
#define KSZ8794_PORT1_PHY_CTRL8 0x1A
|
|
#define KSZ8794_PORT1_LINKMD 0x1B
|
|
#define KSZ8794_PORT1_PHY_CTRL9 0x1C
|
|
#define KSZ8794_PORT1_PHY_CTRL10 0x1D
|
|
#define KSZ8794_PORT1_STAT2 0x1E
|
|
#define KSZ8794_PORT1_CTRL11_STAT3 0x1F
|
|
#define KSZ8794_PORT2_CTRL0 0x20
|
|
#define KSZ8794_PORT2_CTRL1 0x21
|
|
#define KSZ8794_PORT2_CTRL2 0x22
|
|
#define KSZ8794_PORT2_CTRL3 0x23
|
|
#define KSZ8794_PORT2_CTRL4 0x24
|
|
#define KSZ8794_PORT2_CTRL5 0x25
|
|
#define KSZ8794_PORT2_CTRL7 0x27
|
|
#define KSZ8794_PORT2_STAT0 0x28
|
|
#define KSZ8794_PORT2_STAT1 0x29
|
|
#define KSZ8794_PORT2_PHY_CTRL8 0x2A
|
|
#define KSZ8794_PORT2_LINKMD 0x2B
|
|
#define KSZ8794_PORT2_PHY_CTRL9 0x2C
|
|
#define KSZ8794_PORT2_PHY_CTRL10 0x2D
|
|
#define KSZ8794_PORT2_STAT2 0x2E
|
|
#define KSZ8794_PORT2_CTRL11_STAT3 0x2F
|
|
#define KSZ8794_PORT3_CTRL0 0x30
|
|
#define KSZ8794_PORT3_CTRL1 0x31
|
|
#define KSZ8794_PORT3_CTRL2 0x32
|
|
#define KSZ8794_PORT3_CTRL3 0x33
|
|
#define KSZ8794_PORT3_CTRL4 0x34
|
|
#define KSZ8794_PORT3_CTRL5 0x35
|
|
#define KSZ8794_PORT3_CTRL7 0x37
|
|
#define KSZ8794_PORT3_STAT0 0x38
|
|
#define KSZ8794_PORT3_STAT1 0x39
|
|
#define KSZ8794_PORT3_PHY_CTRL8 0x3A
|
|
#define KSZ8794_PORT3_LINKMD 0x3B
|
|
#define KSZ8794_PORT3_PHY_CTRL9 0x3C
|
|
#define KSZ8794_PORT3_PHY_CTRL10 0x3D
|
|
#define KSZ8794_PORT3_STAT2 0x3E
|
|
#define KSZ8794_PORT3_CTRL11_STAT3 0x3F
|
|
#define KSZ8794_PORT4_CTRL0 0x50
|
|
#define KSZ8794_PORT4_CTRL1 0x51
|
|
#define KSZ8794_PORT4_CTRL2 0x52
|
|
#define KSZ8794_PORT4_CTRL3 0x53
|
|
#define KSZ8794_PORT4_CTRL4 0x54
|
|
#define KSZ8794_PORT4_CTRL5 0x55
|
|
#define KSZ8794_PORT4_IF_CTRL6 0x56
|
|
#define KSZ8794_MAC_ADDR0 0x68
|
|
#define KSZ8794_MAC_ADDR1 0x69
|
|
#define KSZ8794_MAC_ADDR2 0x6A
|
|
#define KSZ8794_MAC_ADDR3 0x6B
|
|
#define KSZ8794_MAC_ADDR4 0x6C
|
|
#define KSZ8794_MAC_ADDR5 0x6D
|
|
#define KSZ8794_IND_ACCESS_CTRL0 0x6E
|
|
#define KSZ8794_IND_ACCESS_CTRL1 0x6F
|
|
#define KSZ8794_IND_DATA8 0x70
|
|
#define KSZ8794_IND_DATA7 0x71
|
|
#define KSZ8794_IND_DATA6 0x72
|
|
#define KSZ8794_IND_DATA5 0x73
|
|
#define KSZ8794_IND_DATA4 0x74
|
|
#define KSZ8794_IND_DATA3 0x75
|
|
#define KSZ8794_IND_DATA2 0x76
|
|
#define KSZ8794_IND_DATA1 0x77
|
|
#define KSZ8794_IND_DATA0 0x78
|
|
#define KSZ8794_INT_STAT 0x7C
|
|
#define KSZ8794_INT_MASK 0x7D
|
|
#define KSZ8794_ACL_INT_STAT 0x7E
|
|
#define KSZ8794_ACL_CTRL 0x7F
|
|
#define KSZ8794_GLOBAL_CTRL12 0x80
|
|
#define KSZ8794_GLOBAL_CTRL13 0x81
|
|
#define KSZ8794_GLOBAL_CTRL14 0x82
|
|
#define KSZ8794_GLOBAL_CTRL15 0x83
|
|
#define KSZ8794_GLOBAL_CTRL16 0x84
|
|
#define KSZ8794_GLOBAL_CTRL17 0x85
|
|
#define KSZ8794_GLOBAL_CTRL18 0x86
|
|
#define KSZ8794_GLOBAL_CTRL19 0x87
|
|
#define KSZ8794_TOS_PRIO_CTRL0 0x90
|
|
#define KSZ8794_TOS_PRIO_CTRL1 0x91
|
|
#define KSZ8794_TOS_PRIO_CTRL2 0x92
|
|
#define KSZ8794_TOS_PRIO_CTRL3 0x93
|
|
#define KSZ8794_TOS_PRIO_CTRL4 0x94
|
|
#define KSZ8794_TOS_PRIO_CTRL5 0x95
|
|
#define KSZ8794_TOS_PRIO_CTRL6 0x96
|
|
#define KSZ8794_TOS_PRIO_CTRL7 0x97
|
|
#define KSZ8794_TOS_PRIO_CTRL8 0x98
|
|
#define KSZ8794_TOS_PRIO_CTRL9 0x99
|
|
#define KSZ8794_TOS_PRIO_CTRL10 0x9A
|
|
#define KSZ8794_TOS_PRIO_CTRL11 0x9B
|
|
#define KSZ8794_TOS_PRIO_CTRL12 0x9C
|
|
#define KSZ8794_TOS_PRIO_CTRL13 0x9D
|
|
#define KSZ8794_TOS_PRIO_CTRL14 0x9E
|
|
#define KSZ8794_TOS_PRIO_CTRL15 0x9F
|
|
#define KSZ8794_IND_BYTE 0xA0
|
|
#define KSZ8794_GLOBAL_CTRL20 0xA3
|
|
#define KSZ8794_GLOBAL_CTRL21 0xA4
|
|
#define KSZ8794_PORT1_CTRL12 0xB0
|
|
#define KSZ8794_PORT1_CTRL13 0xB1
|
|
#define KSZ8794_PORT1_CTRL14 0xB2
|
|
#define KSZ8794_PORT1_CTRL15 0xB3
|
|
#define KSZ8794_PORT1_CTRL16 0xB4
|
|
#define KSZ8794_PORT1_CTRL17 0xB5
|
|
#define KSZ8794_PORT1_RATE_LIMIT_CTRL 0xB6
|
|
#define KSZ8794_PORT1_PRIO0_IG_LIMIT_CTRL1 0xB7
|
|
#define KSZ8794_PORT1_PRIO1_IG_LIMIT_CTRL2 0xB8
|
|
#define KSZ8794_PORT1_PRIO2_IG_LIMIT_CTRL3 0xB9
|
|
#define KSZ8794_PORT1_PRIO3_IG_LIMIT_CTRL4 0xBA
|
|
#define KSZ8794_PORT1_QUEUE0_EG_LIMIT_CTRL1 0xBB
|
|
#define KSZ8794_PORT1_QUEUE1_EG_LIMIT_CTRL2 0xBC
|
|
#define KSZ8794_PORT1_QUEUE2_EG_LIMIT_CTRL3 0xBD
|
|
#define KSZ8794_PORT1_QUEUE3_EG_LIMIT_CTRL4 0xBE
|
|
#define KSZ8794_TEST 0xBF
|
|
#define KSZ8794_PORT2_CTRL12 0xC0
|
|
#define KSZ8794_PORT2_CTRL13 0xC1
|
|
#define KSZ8794_PORT2_CTRL14 0xC2
|
|
#define KSZ8794_PORT2_CTRL15 0xC3
|
|
#define KSZ8794_PORT2_CTRL16 0xC4
|
|
#define KSZ8794_PORT2_CTRL17 0xC5
|
|
#define KSZ8794_PORT2_RATE_LIMIT_CTRL 0xC6
|
|
#define KSZ8794_PORT2_PRIO0_IG_LIMIT_CTRL1 0xC7
|
|
#define KSZ8794_PORT2_PRIO1_IG_LIMIT_CTRL2 0xC8
|
|
#define KSZ8794_PORT2_PRIO2_IG_LIMIT_CTRL3 0xC9
|
|
#define KSZ8794_PORT2_PRIO3_IG_LIMIT_CTRL4 0xCA
|
|
#define KSZ8794_PORT2_QUEUE0_EG_LIMIT_CTRL1 0xCB
|
|
#define KSZ8794_PORT2_QUEUE1_EG_LIMIT_CTRL2 0xCC
|
|
#define KSZ8794_PORT2_QUEUE2_EG_LIMIT_CTRL3 0xCD
|
|
#define KSZ8794_PORT2_QUEUE3_EG_LIMIT_CTRL4 0xCE
|
|
#define KSZ8794_PORT3_CTRL12 0xD0
|
|
#define KSZ8794_PORT3_CTRL13 0xD1
|
|
#define KSZ8794_PORT3_CTRL14 0xD2
|
|
#define KSZ8794_PORT3_CTRL15 0xD3
|
|
#define KSZ8794_PORT3_CTRL16 0xD4
|
|
#define KSZ8794_PORT3_CTRL17 0xD5
|
|
#define KSZ8794_PORT3_RATE_LIMIT_CTRL 0xD6
|
|
#define KSZ8794_PORT3_PRIO0_IG_LIMIT_CTRL1 0xD7
|
|
#define KSZ8794_PORT3_PRIO1_IG_LIMIT_CTRL2 0xD8
|
|
#define KSZ8794_PORT3_PRIO2_IG_LIMIT_CTRL3 0xD9
|
|
#define KSZ8794_PORT3_PRIO3_IG_LIMIT_CTRL4 0xDA
|
|
#define KSZ8794_PORT3_QUEUE0_EG_LIMIT_CTRL1 0xDB
|
|
#define KSZ8794_PORT3_QUEUE1_EG_LIMIT_CTRL2 0xDC
|
|
#define KSZ8794_PORT3_QUEUE2_EG_LIMIT_CTRL3 0xDD
|
|
#define KSZ8794_PORT3_QUEUE3_EG_LIMIT_CTRL4 0xDE
|
|
#define KSZ8794_TEST2 0xDF
|
|
#define KSZ8794_TEST3 0xEF
|
|
#define KSZ8794_PORT4_CTRL12 0xF0
|
|
#define KSZ8794_PORT4_CTRL13 0xF1
|
|
#define KSZ8794_PORT4_CTRL14 0xF2
|
|
#define KSZ8794_PORT4_CTRL15 0xF3
|
|
#define KSZ8794_PORT4_CTRL16 0xF4
|
|
#define KSZ8794_PORT4_CTRL17 0xF5
|
|
#define KSZ8794_PORT4_RATE_LIMIT_CTRL 0xF6
|
|
#define KSZ8794_PORT4_PRIO0_IG_LIMIT_CTRL1 0xF7
|
|
#define KSZ8794_PORT4_PRIO1_IG_LIMIT_CTRL2 0xF8
|
|
#define KSZ8794_PORT4_PRIO2_IG_LIMIT_CTRL3 0xF9
|
|
#define KSZ8794_PORT4_PRIO3_IG_LIMIT_CTRL4 0xFA
|
|
#define KSZ8794_PORT4_QUEUE0_EG_LIMIT_CTRL1 0xFB
|
|
#define KSZ8794_PORT4_QUEUE1_EG_LIMIT_CTRL2 0xFC
|
|
#define KSZ8794_PORT4_QUEUE2_EG_LIMIT_CTRL3 0xFD
|
|
#define KSZ8794_PORT4_QUEUE3_EG_LIMIT_CTRL4 0xFE
|
|
#define KSZ8794_TEST4 0xFF
|
|
|
|
/* Basic Control register */
|
|
#define KSZ8794_BMCR_RESET 0x8000
|
|
#define KSZ8794_BMCR_LOOPBACK 0x4000
|
|
#define KSZ8794_BMCR_FORCE_100 0x2000
|
|
#define KSZ8794_BMCR_AN_EN 0x1000
|
|
#define KSZ8794_BMCR_POWER_DOWN 0x0800
|
|
#define KSZ8794_BMCR_ISOLATE 0x0400
|
|
#define KSZ8794_BMCR_RESTART_AN 0x0200
|
|
#define KSZ8794_BMCR_FORCE_FULL_DUPLEX 0x0100
|
|
#define KSZ8794_BMCR_HP_MDIX 0x0020
|
|
#define KSZ8794_BMCR_FORCE_MDI 0x0010
|
|
#define KSZ8794_BMCR_AUTO_MDIX_DIS 0x0008
|
|
#define KSZ8794_BMCR_FAR_END_FAULT_DIS 0x0004
|
|
#define KSZ8794_BMCR_TRANSMIT_DIS 0x0002
|
|
#define KSZ8794_BMCR_LED_DIS 0x0001
|
|
|
|
/* Basic Status register */
|
|
#define KSZ8794_BMSR_100BT4 0x8000
|
|
#define KSZ8794_BMSR_100BTX_FD 0x4000
|
|
#define KSZ8794_BMSR_100BTX_HD 0x2000
|
|
#define KSZ8794_BMSR_10BT_FD 0x1000
|
|
#define KSZ8794_BMSR_10BT_HD 0x0800
|
|
#define KSZ8794_BMSR_AN_COMPLETE 0x0020
|
|
#define KSZ8794_BMSR_FAR_END_FAULT 0x0010
|
|
#define KSZ8794_BMSR_AN_CAPABLE 0x0008
|
|
#define KSZ8794_BMSR_LINK_STATUS 0x0004
|
|
#define KSZ8794_BMSR_EXTENDED_CAPABLE 0x0001
|
|
|
|
#define KSZ8794_GLOBAL_CTRL10_TAIL_TAG_EN BIT(1)
|
|
#define KSZ8794_GLOBAL_CTRL2_LEG_MAX_PKT_SIZ_CHK_DIS BIT(1)
|
|
|
|
#define KSZ8794_CTRL2_PORTn(n) (0x02 + ((n) * 0x10))
|
|
#define KSZ8794_CTRL2_TRANSMIT_EN BIT(2)
|
|
#define KSZ8794_CTRL2_RECEIVE_EN BIT(1)
|
|
#define KSZ8794_CTRL2_LEARNING_DIS BIT(0)
|
|
|
|
#define KSZ8794_STAT2_PORTn(n) (0x0E + ((n) * 0x10))
|
|
#define KSZ8794_STAT2_LINK_GOOD BIT(5)
|
|
|
|
#define KSZ8794_CHIP_ID0_ID_DEFAULT 0x87
|
|
#define KSZ8794_PWR_MGNT_MODE_SOFT_DOWN BIT(4)
|
|
|
|
#define KSZ8794_GLOBAL_CTRL20_LOWSPEED_MASK 0x07
|
|
#define KSZ8794_GLOBAL_CTRL20_LOWSPEED_2MA 0x00
|
|
#define KSZ8794_GLOBAL_CTRL20_LOWSPEED_4MA 0x01
|
|
#define KSZ8794_GLOBAL_CTRL20_LOWSPEED_8MA 0x02
|
|
#define KSZ8794_GLOBAL_CTRL20_LOWSPEED_12MA 0x03
|
|
#define KSZ8794_GLOBAL_CTRL20_LOWSPEED_16MA 0x04
|
|
#define KSZ8794_GLOBAL_CTRL20_LOWSPEED_20MA 0x05
|
|
#define KSZ8794_GLOBAL_CTRL20_LOWSPEED_24MA 0x06
|
|
#define KSZ8794_GLOBAL_CTRL20_LOWSPEED_28MA 0x07
|
|
|
|
enum {
|
|
/* LAN ports for the ksz8794 switch */
|
|
KSZ8794_PORT1 = 1,
|
|
KSZ8794_PORT2,
|
|
KSZ8794_PORT3,
|
|
/* SWITCH <-> CPU port */
|
|
KSZ8794_PORT4 = 4,
|
|
};
|
|
|
|
#include <drivers/spi.h>
|
|
struct dsa_ksz8794_spi {
|
|
const struct device *spi;
|
|
struct spi_config spi_cfg;
|
|
struct spi_cs_control cs_ctrl;
|
|
bool is_init;
|
|
};
|
|
|
|
#define KSZ8794_REG_IND_DATA_8 0x70
|
|
#define KSZ8794_REG_IND_DATA_7 0x71
|
|
#define KSZ8794_REG_IND_DATA_6 0x72
|
|
#define KSZ8794_REG_IND_DATA_5 0x73
|
|
#define KSZ8794_REG_IND_DATA_4 0x74
|
|
#define KSZ8794_REG_IND_DATA_3 0x75
|
|
#define KSZ8794_REG_IND_DATA_2 0x76
|
|
#define KSZ8794_REG_IND_DATA_1 0x77
|
|
#define KSZ8794_REG_IND_DATA_0 0x78
|
|
|
|
#define KSZ8794_REG_IND_CTRL_0 0x6E
|
|
#define KSZ8794_REG_IND_CTRL_1 0x6F
|
|
|
|
#define KSZ8794_STATIC_MAC_TABLE_VALID BIT(5)
|
|
#define KSZ8794_STATIC_MAC_TABLE_OVERRIDE BIT(6)
|
|
|
|
#endif /* __DSA_KSZ8794_H__ */
|