summaryrefslogtreecommitdiff
path: root/sys/dev/dwc
diff options
context:
space:
mode:
authorOleksandr Tymoshenko <gonzo@FreeBSD.org>2020-08-10 19:37:06 +0000
committerOleksandr Tymoshenko <gonzo@FreeBSD.org>2020-08-10 19:37:06 +0000
commit824cfb472932d2a4c27c601170ec5bd44327aa22 (patch)
tree1428b0c3a6dcbdf3519bb14482fedd61ee551dbc /sys/dev/dwc
parent25e42ee2172b437d2bf833da3c45fb3d426cd3d3 (diff)
Notes
Diffstat (limited to 'sys/dev/dwc')
-rw-r--r--sys/dev/dwc/if_dwc.c24
-rw-r--r--sys/dev/dwc/if_dwc.h4
-rw-r--r--sys/dev/dwc/if_dwc_if.m14
-rw-r--r--sys/dev/dwc/if_dwcvar.h1
4 files changed, 42 insertions, 1 deletions
diff --git a/sys/dev/dwc/if_dwc.c b/sys/dev/dwc/if_dwc.c
index 44350ae087cc..16e26793188a 100644
--- a/sys/dev/dwc/if_dwc.c
+++ b/sys/dev/dwc/if_dwc.c
@@ -1209,14 +1209,22 @@ dwc_clock_init(device_t dev)
hwreset_t rst;
clk_t clk;
int error;
+ int64_t freq;
- /* Enable clock */
+ /* Enable clocks */
if (clk_get_by_ofw_name(dev, 0, "stmmaceth", &clk) == 0) {
error = clk_enable(clk);
if (error != 0) {
device_printf(dev, "could not enable main clock\n");
return (error);
}
+ if (bootverbose) {
+ clk_get_freq(clk, &freq);
+ device_printf(dev, "MAC clock(%s) freq: %ld\n", clk_get_name(clk), freq);
+ }
+ }
+ else {
+ device_printf(dev, "could not find clock stmmaceth\n");
}
/* De-assert reset */
@@ -1254,6 +1262,8 @@ dwc_attach(device_t dev)
struct ifnet *ifp;
int error, i;
uint32_t reg;
+ char *phy_mode;
+ phandle_t node;
sc = device_get_softc(dev);
sc->dev = dev;
@@ -1262,6 +1272,15 @@ dwc_attach(device_t dev)
sc->mii_clk = IF_DWC_MII_CLK(dev);
sc->mactype = IF_DWC_MAC_TYPE(dev);
+ node = ofw_bus_get_node(dev);
+ if (OF_getprop_alloc(node, "phy-mode", (void **)&phy_mode)) {
+ if (strcmp(phy_mode, "rgmii") == 0)
+ sc->phy_mode = PHY_MODE_RGMII;
+ if (strcmp(phy_mode, "rmii") == 0)
+ sc->phy_mode = PHY_MODE_RMII;
+ OF_prop_free(phy_mode);
+ }
+
if (IF_DWC_INIT(dev) != 0)
return (ENXIO);
@@ -1475,6 +1494,9 @@ dwc_miibus_statchg(device_t dev)
else
reg &= ~(CONF_DM);
WRITE4(sc, MAC_CONFIGURATION, reg);
+
+ IF_DWC_SET_SPEED(dev, IFM_SUBTYPE(mii->mii_media_active));
+
}
static device_method_t dwc_methods[] = {
diff --git a/sys/dev/dwc/if_dwc.h b/sys/dev/dwc/if_dwc.h
index d20f35d74ce5..045072abe611 100644
--- a/sys/dev/dwc/if_dwc.h
+++ b/sys/dev/dwc/if_dwc.h
@@ -37,6 +37,10 @@
#ifndef __IF_DWC_H__
#define __IF_DWC_H__
+#define PHY_MODE_UNKNOWN 0x0
+#define PHY_MODE_RMII 0x1
+#define PHY_MODE_RGMII 0x2
+
#define MAC_CONFIGURATION 0x0
#define CONF_JD (1 << 22) /* jabber timer disable */
#define CONF_BE (1 << 21) /* Frame Burst Enable */
diff --git a/sys/dev/dwc/if_dwc_if.m b/sys/dev/dwc/if_dwc_if.m
index 733f83545cf4..dae429c55e8a 100644
--- a/sys/dev/dwc/if_dwc_if.m
+++ b/sys/dev/dwc/if_dwc_if.m
@@ -49,6 +49,12 @@ CODE {
{
return (GMAC_MII_CLK_25_35M_DIV16);
}
+
+ static int
+ if_dwc_default_set_speed(device_t dev, int speed)
+ {
+ return (0);
+ }
};
HEADER {
@@ -74,3 +80,11 @@ METHOD int mac_type {
METHOD int mii_clk {
device_t dev;
} DEFAULT if_dwc_default_mii_clk;
+
+#
+# Signal media change to a specific hardware
+#
+METHOD int set_speed {
+ device_t dev;
+ int speed;
+} DEFAULT if_dwc_default_set_speed;
diff --git a/sys/dev/dwc/if_dwcvar.h b/sys/dev/dwc/if_dwcvar.h
index 9db24c14f328..0470b29cb0e1 100644
--- a/sys/dev/dwc/if_dwcvar.h
+++ b/sys/dev/dwc/if_dwcvar.h
@@ -71,6 +71,7 @@ struct dwc_softc {
boolean_t is_detaching;
int tx_watchdog_count;
int stats_harvest_count;
+ int phy_mode;
/* RX */
bus_dma_tag_t rxdesc_tag;