[arswitch] Implement the switch MAC address fetch API.

The placeholders are here for some future "set" MAC address API.

Tested:

* AR9340 switch
* AR8327 switch
This commit is contained in:
Adrian Chadd 2018-02-06 08:35:49 +00:00
parent 93e98f5f14
commit 2ba4bf8fa5
3 changed files with 65 additions and 0 deletions

View File

@ -483,6 +483,41 @@ ar8xxx_atu_learn_default(struct arswitch_softc *sc)
* between ethernet switches.
*/
/*
* Fetch the configured switch MAC address.
*/
static int
ar8xxx_hw_get_switch_macaddr(struct arswitch_softc *sc, struct ether_addr *ea)
{
uint32_t ret0, ret1;
char *s;
s = (void *) ea;
ret0 = arswitch_readreg(sc->sc_dev, AR8X16_REG_SW_MAC_ADDR0);
ret1 = arswitch_readreg(sc->sc_dev, AR8X16_REG_SW_MAC_ADDR1);
s[5] = MS(ret0, AR8X16_REG_SW_MAC_ADDR0_BYTE5);
s[4] = MS(ret0, AR8X16_REG_SW_MAC_ADDR0_BYTE4);
s[3] = MS(ret1, AR8X16_REG_SW_MAC_ADDR1_BYTE3);
s[2] = MS(ret1, AR8X16_REG_SW_MAC_ADDR1_BYTE2);
s[1] = MS(ret1, AR8X16_REG_SW_MAC_ADDR1_BYTE1);
s[0] = MS(ret1, AR8X16_REG_SW_MAC_ADDR1_BYTE0);
return (0);
}
/*
* Set the switch mac address.
*/
static int
ar8xxx_hw_set_switch_macaddr(struct arswitch_softc *sc,
const struct ether_addr *ea)
{
return (ENXIO);
}
/*
* XXX TODO: this attach routine does NOT free all memory, resources
* upon failure!
@ -527,6 +562,8 @@ arswitch_attach(device_t dev)
sc->hal.arswitch_port_vlan_setup = ar8xxx_port_vlan_setup;
sc->hal.arswitch_port_vlan_get = ar8xxx_port_vlan_get;
sc->hal.arswitch_vlan_init_hw = ar8xxx_reset_vlans;
sc->hal.arswitch_hw_get_switch_macaddr = ar8xxx_hw_get_switch_macaddr;
sc->hal.arswitch_hw_set_switch_macaddr = ar8xxx_hw_set_switch_macaddr;
sc->hal.arswitch_vlan_getvgroup = ar8xxx_getvgroup;
sc->hal.arswitch_vlan_setvgroup = ar8xxx_setvgroup;
@ -1115,6 +1152,7 @@ static int
arswitch_getconf(device_t dev, etherswitch_conf_t *conf)
{
struct arswitch_softc *sc;
int ret;
sc = device_get_softc(dev);
@ -1122,6 +1160,13 @@ arswitch_getconf(device_t dev, etherswitch_conf_t *conf)
conf->cmd = ETHERSWITCH_CONF_VLAN_MODE;
conf->vlan_mode = sc->vlan_mode;
/* Return the switch ethernet address. */
ret = sc->hal.arswitch_hw_get_switch_macaddr(sc,
&conf->switch_macaddr);
if (ret == 0) {
conf->cmd |= ETHERSWITCH_CONF_SWITCH_MACADDR;
}
return (0);
}
@ -1140,6 +1185,8 @@ arswitch_setconf(device_t dev, etherswitch_conf_t *conf)
return (err);
}
/* TODO: Set the switch ethernet address. */
return (0);
}

View File

@ -88,7 +88,20 @@
#define AR8X16_REG_IMR 0x0014
#define AR8X16_REG_SW_MAC_ADDR0 0x0020
#define AR8X16_REG_SW_MAC_ADDR0_BYTE4 BITS(8, 8)
#define AR8X16_REG_SW_MAC_ADDR0_BYTE4_S 8
#define AR8X16_REG_SW_MAC_ADDR0_BYTE5 BITS(0, 8)
#define AR8X16_REG_SW_MAC_ADDR0_BYTE5_S 0
#define AR8X16_REG_SW_MAC_ADDR1 0x0024
#define AR8X16_REG_SW_MAC_ADDR1_BYTE0 BITS(24, 8)
#define AR8X16_REG_SW_MAC_ADDR1_BYTE0_S 24
#define AR8X16_REG_SW_MAC_ADDR1_BYTE1 BITS(16, 8)
#define AR8X16_REG_SW_MAC_ADDR1_BYTE1_S 16
#define AR8X16_REG_SW_MAC_ADDR1_BYTE2 BITS(8, 8)
#define AR8X16_REG_SW_MAC_ADDR1_BYTE2_S 8
#define AR8X16_REG_SW_MAC_ADDR1_BYTE3 BITS(0, 8)
#define AR8X16_REG_SW_MAC_ADDR1_BYTE3_S 0
#define AR8X16_REG_FLOOD_MASK 0x002c
#define AR8X16_FLOOD_MASK_BCAST_TO_CPU (1 << 26)

View File

@ -99,6 +99,11 @@ struct arswitch_softc {
int (* arswitch_hw_setup) (struct arswitch_softc *);
int (* arswitch_hw_global_setup) (struct arswitch_softc *);
int (* arswitch_hw_get_switch_macaddr) (struct arswitch_softc *,
struct ether_addr *sa);
int (* arswitch_hw_set_switch_macaddr) (struct arswitch_softc *,
const struct ether_addr *sa);
/* Port functions */
void (* arswitch_port_init) (struct arswitch_softc *, int);