Hi Kevin,
This seems to work fine on my machine. The ure0 is built into my
monitor:
ure0 at uhub9 port 3 configuration 1 interface 0 "Realtek USB 10/100/1000 LAN"
rev 3.20/33.00 addr 4
ure0: RTL8153D (0x7420), address c8:4b:d6:af:a7:8d
I can get both v4 and v6 addresses over this interface and so far
everything seems to work just fine.
Thanks!
Paul
On Thu, May 04, 2023 at 02:28:54PM +0800, Kevin Lo wrote:
| Hi,
|
| This diff adds initial support for RTL8153D to ure(4).
|
| The RTL8153D chipset shares many similarities with the already supported
| RTL8156B chip but additionally requires a few semi-unique configurations.
|
| Tested:
| ure0 at uhub0 port 3 configuration 1 interface 0 "Realtek USB 10/100/1000
LAN" rev 2.10/f3.f0 addr 2
| ure0: RTL8153D (0x7420), address 00:e0:4c:xx:xx:xx
|
| ok?
|
| Index: sys/dev/usb/if_ure.c
| ===================================================================
| RCS file: /cvs/src/sys/dev/usb/if_ure.c,v
| retrieving revision 1.31
| diff -u -p -u -p -r1.31 if_ure.c
| --- sys/dev/usb/if_ure.c 27 Oct 2022 13:21:14 -0000 1.31
| +++ sys/dev/usb/if_ure.c 4 May 2023 06:05:03 -0000
| @@ -270,7 +270,7 @@ ure_read_1(struct ure_softc *sc, uint16_
|
| shift = (reg & 3) << 3;
| reg &= ~3;
| -
| +
| ure_read_mem(sc, reg, index, &temp, 4);
| val = UGETDW(temp);
| val >>= shift;
| @@ -466,8 +466,8 @@ ure_ifmedia_init(struct ifnet *ifp)
|
| reg = sc->ure_rxbufsz - URE_FRAMELEN(ifp->if_mtu) -
| sizeof(struct ure_rxpkt) - URE_RX_BUF_ALIGN;
| - if (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156 |
| - URE_FLAG_8156B)) {
| + if (sc->ure_flags &
| + (URE_FLAG_8153B | URE_FLAG_8156 | URE_FLAG_8156B)) {
| ure_write_2(sc, URE_USB_RX_EARLY_SIZE, URE_MCU_TYPE_USB,
| reg / 8);
|
| @@ -493,6 +493,11 @@ ure_ifmedia_init(struct ifnet *ifp)
| reg);
| }
|
| + if (sc->ure_chip & URE_CHIP_VER_7420) {
| + URE_SETBIT_2(sc, URE_PLA_MAC_PWR_CTRL4,
| + URE_MCU_TYPE_PLA, URE_IDLE_SPDWN_EN);
| + }
| +
| if ((sc->ure_chip & URE_CHIP_VER_6010) ||
| (sc->ure_flags & URE_FLAG_8156B)) {
| URE_CLRBIT_2(sc, URE_USB_FW_TASK, URE_MCU_TYPE_USB,
| @@ -502,7 +507,7 @@ ure_ifmedia_init(struct ifnet *ifp)
| URE_FC_PATCH_TASK);
| }
| }
| -
| +
| /* Reset the packet filter. */
| URE_CLRBIT_2(sc, URE_PLA_FMC, URE_MCU_TYPE_PLA, URE_FMC_FCR_MCU_EN);
| URE_SETBIT_2(sc, URE_PLA_FMC, URE_MCU_TYPE_PLA, URE_FMC_FCR_MCU_EN);
| @@ -530,15 +535,18 @@ ure_ifmedia_upd(struct ifnet *ifp)
| if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
| return (EINVAL);
|
| - reg = ure_ocp_reg_read(sc, 0xa5d4);
| - reg &= ~URE_ADV_2500TFDX;
| + if (!(sc->ure_chip & URE_CHIP_VER_7420)) {
| + reg = ure_ocp_reg_read(sc, URE_OCP_10GBT_CTRL);
| + reg &= ~URE_ADV_2500TFDX;
| + }
|
| anar = gig = 0;
| switch (IFM_SUBTYPE(ifm->ifm_media)) {
| case IFM_AUTO:
| anar |= ANAR_TX_FD | ANAR_TX | ANAR_10_FD | ANAR_10;
| gig |= GTCR_ADV_1000TFDX | GTCR_ADV_1000THDX;
| - reg |= URE_ADV_2500TFDX;
| + if (!(sc->ure_chip & URE_CHIP_VER_7420))
| + reg |= URE_ADV_2500TFDX;
| break;
| case IFM_2500_T:
| anar |= ANAR_TX_FD | ANAR_TX | ANAR_10_FD | ANAR_10;
| @@ -566,9 +574,10 @@ ure_ifmedia_upd(struct ifnet *ifp)
| }
|
| ure_ocp_reg_write(sc, URE_OCP_BASE_MII + MII_ANAR * 2,
| - anar | ANAR_PAUSE_ASYM | ANAR_FC);
| - ure_ocp_reg_write(sc, URE_OCP_BASE_MII + MII_100T2CR * 2, gig);
| - ure_ocp_reg_write(sc, 0xa5d4, reg);
| + anar | ANAR_PAUSE_ASYM | ANAR_FC);
| + ure_ocp_reg_write(sc, URE_OCP_BASE_MII + MII_100T2CR * 2, gig);
| + if (!(sc->ure_chip & URE_CHIP_VER_7420))
| + ure_ocp_reg_write(sc, URE_OCP_10GBT_CTRL, reg);
| ure_ocp_reg_write(sc, URE_OCP_BASE_MII + MII_BMCR,
| BMCR_AUTOEN | BMCR_STARTNEG);
|
| @@ -602,7 +611,7 @@ ure_ifmedia_sts(struct ifnet *ifp, struc
| status = ure_read_2(sc, URE_PLA_PHYSTATUS,
| URE_MCU_TYPE_PLA);
| if ((status & URE_PHYSTATUS_FDX) ||
| - (status & URE_PHYSTATUS_2500MBPS))
| + (status & URE_PHYSTATUS_2500MBPS))
| ifmr->ifm_active |= IFM_FDX;
| else
| ifmr->ifm_active |= IFM_HDX;
| @@ -634,9 +643,11 @@ ure_add_media_types(struct ure_softc *sc
| ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_1000_T, 0, NULL);
| ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_1000_T | IFM_FDX, 0,
| NULL);
| - ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_2500_T, 0, NULL);
| - ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_2500_T | IFM_FDX, 0,
| - NULL);
| + if (!(sc->ure_chip & URE_CHIP_VER_7420)) {
| + ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_2500_T, 0, NULL);
| + ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_2500_T | IFM_FDX,
| + 0, NULL);
| + }
| }
|
| void
| @@ -929,7 +940,7 @@ ure_start(struct ifnet *ifp)
| continue;
| }
|
| - /*
| + /*
| * If packet larger than remaining space, send buffer and
| * continue.
| */
| @@ -1176,12 +1187,12 @@ ure_rtl8153_init(struct ure_softc *sc)
| }
|
| URE_SETBIT_1(sc, URE_USB_CSR_DUMMY2, URE_MCU_TYPE_USB, URE_EP4_FULL_FC);
| -
| +
| URE_CLRBIT_2(sc, URE_USB_WDT11_CTRL, URE_MCU_TYPE_USB, URE_TIMER11_EN);
|
| URE_CLRBIT_2(sc, URE_PLA_LED_FEATURE, URE_MCU_TYPE_PLA,
| URE_LED_MODE_MASK);
| -
| +
| if ((sc->ure_chip & URE_CHIP_VER_5C10) &&
| sc->ure_udev->speed != USB_SPEED_SUPER)
| reg = URE_LPM_TIMER_500MS;
| @@ -1269,7 +1280,7 @@ ure_rtl8153b_init(struct ure_softc *sc)
| URE_CLRBIT_1(sc, URE_USB_POWER_CUT, URE_MCU_TYPE_USB,
| URE_UPS_EN | URE_USP_PREWAKE);
| URE_CLRBIT_1(sc, URE_USB_MISC_2, URE_MCU_TYPE_USB,
| - URE_UPS_FORCE_PWR_DOWN);
| + URE_UPS_FORCE_PWR_DOWN | URE_UPS_NO_UPS);
|
| URE_CLRBIT_1(sc, URE_PLA_INDICATE_FALG, URE_MCU_TYPE_PLA,
| URE_UPCOMING_RUNTIME_D3);
| @@ -1318,7 +1329,7 @@ ure_rtl8153b_init(struct ure_softc *sc)
| URE_SETBIT_2(sc, URE_USB_FW_TASK, URE_MCU_TYPE_USB,
| URE_FC_PATCH_TASK);
| }
| -
| +
| /* MAC clock speed down. */
| if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B)) {
| ure_write_2(sc, URE_PLA_MAC_PWR_CTRL, URE_MCU_TYPE_PLA, 0x0403);
| @@ -1350,6 +1361,17 @@ ure_rtl8153b_init(struct ure_softc *sc)
| URE_SETBIT_1(sc, URE_USB_BMU_CONFIG, URE_MCU_TYPE_USB,
| URE_ACT_ODMA);
|
| + if (!(sc->ure_flags & URE_FLAG_8153B)) {
| + /*
| + * Select force mode through 0xa5b4 bit 15
| + * 0: MDIO force mode
| + * 1: MMD force mode
| + */
| + reg = ure_ocp_reg_read(sc, 0xa5b4);
| + if (reg & 0x8000)
| + ure_ocp_reg_write(sc, 0xa5b4, reg & ~0x8000);
| + }
| +
| URE_SETBIT_2(sc, URE_PLA_RSTTALLY, URE_MCU_TYPE_PLA, URE_TALLY_RESET);
| }
|
| @@ -1523,9 +1545,7 @@ ure_rtl8153_nic_reset(struct ure_softc *
|
| ure_write_4(sc, URE_USB_RX_BUF_TH, URE_MCU_TYPE_USB,
| 0x00600400);
| - }
| -
| - if (!(sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B))) {
| + } else {
| URE_SETBIT_2(sc, URE_PLA_TCR0, URE_MCU_TYPE_PLA,
| URE_TCR0_AUTO_FIFO);
| ure_reset(sc);
| @@ -1611,7 +1631,7 @@ ure_wait_for_flash(struct ure_softc *sc)
| int i;
|
| if ((ure_read_2(sc, URE_PLA_GPHY_CTRL, URE_MCU_TYPE_PLA) &
| - URE_GPHY_FLASH) &&
| + URE_GPHY_FLASH) &&
| !(ure_read_2(sc, URE_USB_GPHY_CTRL, URE_MCU_TYPE_USB) &
| URE_BYPASS_FLASH)) {
| for (i = 0; i < 100; i++) {
| @@ -1712,7 +1732,7 @@ ure_match(struct device *parent, void *m
|
| if (uaa->iface == NULL || uaa->configno != 1)
| return (UMATCH_NONE);
| -
| +
| return (usb_lookup(ure_devs, uaa->vendor, uaa->product) != NULL ?
| UMATCH_VENDOR_PRODUCT_CONF_IFACE : UMATCH_NONE);
| }
| @@ -1811,6 +1831,11 @@ ure_attach(struct device *parent, struct
| sc->ure_flags = URE_FLAG_8156B;
| printf("RTL8156B (0x7410)");
| break;
| + case 0x7420:
| + sc->ure_flags = URE_FLAG_8156B;
| + sc->ure_chip = URE_CHIP_VER_7420;
| + printf("RTL8153D (0x7420)");
| + break;
| default:
| printf(", unknown ver %02x", ver);
| break;
| @@ -1981,7 +2006,7 @@ ure_rxeof(struct usbd_xfer *xfer, void *
| struct mbuf *m;
| int pktlen = 0, s;
| struct ure_rxpkt rxhdr;
| -
| +
| if (usbd_is_dying(sc->ure_udev))
| return;
|
| Index: sys/dev/usb/if_urereg.h
| ===================================================================
| RCS file: /cvs/src/sys/dev/usb/if_urereg.h,v
| retrieving revision 1.11
| diff -u -p -u -p -r1.11 if_urereg.h
| --- sys/dev/usb/if_urereg.h 2 Apr 2022 12:22:56 -0000 1.11
| +++ sys/dev/usb/if_urereg.h 4 May 2023 06:05:03 -0000
| @@ -167,6 +167,7 @@
| #define URE_OCP_EEE_ABLE 0xa5c4
| #define URE_OCP_EEE_ADV 0xa5d0
| #define URE_OCP_EEE_LPABLE 0xa5d2
| +#define URE_OCP_10GBT_CTRL 0xa5d4
| #define URE_OCP_PHY_STATE 0xa708
| #define URE_OCP_ADC_CFG 0xbc06
|
| @@ -248,19 +249,19 @@
| #define URE_CRWECR_CONFIG 0xc0
|
| /* URE_PLA_OOB_CTRL */
| -#define URE_DIS_MCU_CLROOB 0x01
| -#define URE_LINK_LIST_READY 0x02
| -#define URE_RXFIFO_EMPTY 0x10
| -#define URE_TXFIFO_EMPTY 0x20
| -#define URE_NOW_IS_OOB 0x80
| +#define URE_DIS_MCU_CLROOB 0x01
| +#define URE_LINK_LIST_READY 0x02
| +#define URE_RXFIFO_EMPTY 0x10
| +#define URE_TXFIFO_EMPTY 0x20
| +#define URE_NOW_IS_OOB 0x80
| #define URE_FIFO_EMPTY (URE_TXFIFO_EMPTY | URE_RXFIFO_EMPTY)
|
| /* URE_PLA_MISC_1 */
| -#define URE_RXDY_GATED_EN 0x0008
| +#define URE_RXDY_GATED_EN 0x0008
|
| /* URE_PLA_SFF_STS_7 */
| -#define URE_MCU_BORW_EN 0x4000
| -#define URE_RE_INIT_LL 0x8000
| +#define URE_MCU_BORW_EN 0x4000
| +#define URE_RE_INIT_LL 0x8000
|
| /* URE_PLA_CPCR */
| #define URE_FLOW_CTRL_EN 0x0001
| @@ -312,6 +313,7 @@
| #define URE_TP1000_SPDWN_EN 0x0008
| #define URE_TP500_SPDWN_EN 0x0010
| #define URE_TP100_SPDWN_EN 0x0020
| +#define URE_IDLE_SPDWN_EN 0x0040
| #define URE_TX10MIDLE_EN 0x0100
| #define URE_RXDV_SPDWN_EN 0x0800
| #define URE_PWRSAVE_SPDWN_EN 0x1000
| @@ -391,6 +393,7 @@
|
| /* URE_USB_MISC_2 */
| #define URE_UPS_FORCE_PWR_DOWN 0x01
| +#define URE_UPS_NO_UPS 0x80
|
| /* URE_USB_ECM_OPTION */
| #define URE_BYPASS_MAC_RESET 0x0020
| @@ -493,15 +496,15 @@
| #define URE_UPS_FLAGS_MASK 0xffffffff
|
| /* URE_OCP_ALDPS_CONFIG */
| -#define URE_ENPWRSAVE 0x8000
| -#define URE_ENPDNPS 0x0200
| -#define URE_LINKENA 0x0100
| +#define URE_ENPWRSAVE 0x8000
| +#define URE_ENPDNPS 0x0200
| +#define URE_LINKENA 0x0100
| #define URE_DIS_SDSAVE 0x0010
|
| /* URE_OCP_PHY_STATUS */
| #define URE_PHY_STAT_MASK 0x0007
| #define URE_PHY_STAT_EXT_INIT 2
| -#define URE_PHY_STAT_LAN_ON 3
| +#define URE_PHY_STAT_LAN_ON 3
| #define URE_PHY_STAT_PWRDN 5
|
| /* URE_OCP_POWER_CFG */
| @@ -646,4 +649,5 @@ struct ure_softc {
| #define URE_CHIP_VER_5C20 0x10
| #define URE_CHIP_VER_5C30 0x20
| #define URE_CHIP_VER_6010 0x40
| +#define URE_CHIP_VER_7420 0x80
| };
|
--
>++++++++[<++++++++++>-]<+++++++.>+++[<------>-]<.>+++[<+
+++++++++++>-]<.>++[<------------>-]<+.--------------.[-]
http://www.weirdnet.nl/