Changeset View
Changeset View
Standalone View
Standalone View
sys/arm64/broadcom/genet/if_genet.c
Show First 20 Lines • Show All 231 Lines • ▼ Show 20 Lines | gen_probe(device_t dev) | ||||
return (BUS_PROBE_DEFAULT); | return (BUS_PROBE_DEFAULT); | ||||
} | } | ||||
static int | static int | ||||
gen_attach(device_t dev) | gen_attach(device_t dev) | ||||
{ | { | ||||
struct ether_addr eaddr; | struct ether_addr eaddr; | ||||
struct gen_softc *sc; | struct gen_softc *sc; | ||||
int major, minor, error; | int major, minor, error, mii_flags; | ||||
bool eaddr_found; | bool eaddr_found; | ||||
sc = device_get_softc(dev); | sc = device_get_softc(dev); | ||||
sc->dev = dev; | sc->dev = dev; | ||||
sc->type = ofw_bus_search_compatible(dev, compat_data)->ocd_data; | sc->type = ofw_bus_search_compatible(dev, compat_data)->ocd_data; | ||||
if (bus_alloc_resources(dev, gen_spec, sc->res) != 0) { | if (bus_alloc_resources(dev, gen_spec, sc->res) != 0) { | ||||
device_printf(dev, "cannot allocate resources for device\n"); | device_printf(dev, "cannot allocate resources for device\n"); | ||||
▲ Show 20 Lines • Show All 61 Lines • ▼ Show 20 Lines | gen_attach(device_t dev) | ||||
if_setsendqready(sc->ifp); | if_setsendqready(sc->ifp); | ||||
#define GEN_CSUM_FEATURES (CSUM_UDP | CSUM_TCP) | #define GEN_CSUM_FEATURES (CSUM_UDP | CSUM_TCP) | ||||
if_sethwassist(sc->ifp, GEN_CSUM_FEATURES); | if_sethwassist(sc->ifp, GEN_CSUM_FEATURES); | ||||
if_setcapabilities(sc->ifp, IFCAP_VLAN_MTU | IFCAP_HWCSUM | | if_setcapabilities(sc->ifp, IFCAP_VLAN_MTU | IFCAP_HWCSUM | | ||||
IFCAP_HWCSUM_IPV6); | IFCAP_HWCSUM_IPV6); | ||||
if_setcapenable(sc->ifp, if_getcapabilities(sc->ifp)); | if_setcapenable(sc->ifp, if_getcapabilities(sc->ifp)); | ||||
/* Attach MII driver */ | /* Attach MII driver */ | ||||
mii_flags = 0; | |||||
karels: Did you experiment with leaving out MIIF_DOPAUSE? I see that NetBSD does not use it, and it is… | |||||
Done Inline ActionsYou are right, it seems to have no effect. I removed it. crowston_protonmail.com: You are right, it seems to have no effect. I removed it. | |||||
Not Done Inline ActionsThanks! karels: Thanks! | |||||
switch (sc->phy_mode) | |||||
{ | |||||
case MII_CONTYPE_RGMII_ID: | |||||
mii_flags |= MIIF_RX_DELAY | MIIF_TX_DELAY; | |||||
break; | |||||
case MII_CONTYPE_RGMII_RXID: | |||||
mii_flags |= MIIF_RX_DELAY; | |||||
break; | |||||
case MII_CONTYPE_RGMII_TXID: | |||||
mii_flags |= MIIF_TX_DELAY; | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
error = mii_attach(dev, &sc->miibus, sc->ifp, gen_media_change, | error = mii_attach(dev, &sc->miibus, sc->ifp, gen_media_change, | ||||
gen_media_status, BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY, | gen_media_status, BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY, | ||||
MIIF_DOPAUSE); | mii_flags); | ||||
if (error != 0) { | if (error != 0) { | ||||
device_printf(dev, "cannot attach PHY\n"); | device_printf(dev, "cannot attach PHY\n"); | ||||
goto fail; | goto fail; | ||||
} | } | ||||
/* If address was not found, create one based on the hostid and name. */ | /* If address was not found, create one based on the hostid and name. */ | ||||
if (eaddr_found == 0) | if (eaddr_found == 0) | ||||
ether_gen_addr(sc->ifp, &eaddr); | ether_gen_addr(sc->ifp, &eaddr); | ||||
Show All 37 Lines | gen_get_phy_mode(device_t dev) | ||||
int error = 0; | int error = 0; | ||||
sc = device_get_softc(dev); | sc = device_get_softc(dev); | ||||
node = ofw_bus_get_node(dev); | node = ofw_bus_get_node(dev); | ||||
type = mii_fdt_get_contype(node); | type = mii_fdt_get_contype(node); | ||||
switch (type) { | switch (type) { | ||||
case MII_CONTYPE_RGMII: | case MII_CONTYPE_RGMII: | ||||
case MII_CONTYPE_RGMII_ID: | |||||
case MII_CONTYPE_RGMII_RXID: | case MII_CONTYPE_RGMII_RXID: | ||||
case MII_CONTYPE_RGMII_TXID: | case MII_CONTYPE_RGMII_TXID: | ||||
sc->phy_mode = type; | sc->phy_mode = type; | ||||
break; | break; | ||||
default: | default: | ||||
device_printf(dev, "unknown phy-mode '%s'\n", | device_printf(dev, "unknown phy-mode '%s'\n", | ||||
mii_fdt_contype_to_name(type)); | mii_fdt_contype_to_name(type)); | ||||
error = ENXIO; | error = ENXIO; | ||||
▲ Show 20 Lines • Show All 404 Lines • ▼ Show 20 Lines | gen_init_locked(struct gen_softc *sc) | ||||
mii = device_get_softc(sc->miibus); | mii = device_get_softc(sc->miibus); | ||||
ifp = sc->ifp; | ifp = sc->ifp; | ||||
GEN_ASSERT_LOCKED(sc); | GEN_ASSERT_LOCKED(sc); | ||||
if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) | if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) | ||||
return; | return; | ||||
if (sc->phy_mode == MII_CONTYPE_RGMII || | switch (sc->phy_mode) | ||||
sc->phy_mode == MII_CONTYPE_RGMII_RXID) | { | ||||
WR4(sc, GENET_SYS_PORT_CTRL, | case MII_CONTYPE_RGMII: | ||||
GENET_SYS_PORT_MODE_EXT_GPHY); | case MII_CONTYPE_RGMII_ID: | ||||
case MII_CONTYPE_RGMII_RXID: | |||||
case MII_CONTYPE_RGMII_TXID: | |||||
WR4(sc, GENET_SYS_PORT_CTRL, GENET_SYS_PORT_MODE_EXT_GPHY); | |||||
break; | |||||
default: | |||||
WR4(sc, GENET_SYS_PORT_CTRL, 0); | |||||
} | |||||
gen_set_enaddr(sc); | gen_set_enaddr(sc); | ||||
/* Setup RX filter */ | /* Setup RX filter */ | ||||
gen_setup_rxfilter(sc); | gen_setup_rxfilter(sc); | ||||
gen_init_txrings(sc); | gen_init_txrings(sc); | ||||
gen_init_rxrings(sc); | gen_init_rxrings(sc); | ||||
▲ Show 20 Lines • Show All 838 Lines • ▼ Show 20 Lines | if (sc->link == 0) | ||||
return; | return; | ||||
val = RD4(sc, GENET_EXT_RGMII_OOB_CTRL); | val = RD4(sc, GENET_EXT_RGMII_OOB_CTRL); | ||||
val &= ~GENET_EXT_RGMII_OOB_OOB_DISABLE; | val &= ~GENET_EXT_RGMII_OOB_OOB_DISABLE; | ||||
val |= GENET_EXT_RGMII_OOB_RGMII_LINK; | val |= GENET_EXT_RGMII_OOB_RGMII_LINK; | ||||
val |= GENET_EXT_RGMII_OOB_RGMII_MODE_EN; | val |= GENET_EXT_RGMII_OOB_RGMII_MODE_EN; | ||||
if (sc->phy_mode == MII_CONTYPE_RGMII) | if (sc->phy_mode == MII_CONTYPE_RGMII) | ||||
val |= GENET_EXT_RGMII_OOB_ID_MODE_DISABLE; | val |= GENET_EXT_RGMII_OOB_ID_MODE_DISABLE; | ||||
else | |||||
val &= ~GENET_EXT_RGMII_OOB_ID_MODE_DISABLE; | |||||
WR4(sc, GENET_EXT_RGMII_OOB_CTRL, val); | WR4(sc, GENET_EXT_RGMII_OOB_CTRL, val); | ||||
val = RD4(sc, GENET_UMAC_CMD); | val = RD4(sc, GENET_UMAC_CMD); | ||||
val &= ~GENET_UMAC_CMD_SPEED; | val &= ~GENET_UMAC_CMD_SPEED; | ||||
val |= speed; | val |= speed; | ||||
WR4(sc, GENET_UMAC_CMD, val); | WR4(sc, GENET_UMAC_CMD, val); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 80 Lines • Show Last 20 Lines |
Did you experiment with leaving out MIIF_DOPAUSE? I see that NetBSD does not use it, and it is only set now because a driver that I copied used it. But I never went back to test it.