Hi,
This diff adds preliminary support for RTL8156B to ure(4) and
bug fixes for RTL8153/RTL8156.
Tested:
ure0 at uhub0 port 12 configuration 1 interface 0 "Realtek USB 10/100/1G/2.5G
LAN" rev 3.20/31.00 addr 3
ure0: RTL8156B (0x7410), address 00:e0:4c:xx:xx:xx
Index: sys/dev/usb/if_ure.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_ure.c,v
retrieving revision 1.28
diff -u -p -u -p -r1.28 if_ure.c
--- sys/dev/usb/if_ure.c 20 Aug 2021 04:54:10 -0000 1.28
+++ sys/dev/usb/if_ure.c 31 Mar 2022 08:35:04 -0000
@@ -197,7 +197,8 @@ void ure_rtl8153_init(struct ure_softc
void ure_rtl8153b_init(struct ure_softc *);
void ure_rtl8152_nic_reset(struct ure_softc *);
void ure_rtl8153_nic_reset(struct ure_softc *);
-void ure_rtl8153_phy_status(struct ure_softc *, int);
+uint16_t ure_rtl8153_phy_status(struct ure_softc *, int);
+void ure_wait_for_flash(struct ure_softc *);
void ure_reset_bmu(struct ure_softc *);
void ure_disable_teredo(struct ure_softc *);
@@ -458,14 +459,19 @@ ure_ifmedia_init(struct ifnet *ifp)
ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_NORAML);
if (!(sc->ure_flags & URE_FLAG_8152)) {
+ if (sc->ure_flags & URE_FLAG_8156B)
+ URE_CLRBIT_2(sc, URE_USB_RX_AGGR_NUM, URE_MCU_TYPE_USB,
+ URE_RX_AGGR_NUM_MASK);
+
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)) {
+ 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);
ure_write_2(sc, URE_USB_RX_EARLY_AGG, URE_MCU_TYPE_USB,
- (sc->ure_flags & URE_FLAG_8153B) ? 16 : 80);
+ (sc->ure_flags & URE_FLAG_8153B) ? 158 : 80);
ure_write_2(sc, URE_USB_PM_CTRL_STATUS,
URE_MCU_TYPE_USB, 1875);
} else {
@@ -485,6 +491,15 @@ ure_ifmedia_init(struct ifnet *ifp)
ure_write_2(sc, URE_USB_RX_EARLY_AGG, URE_MCU_TYPE_USB,
reg);
}
+
+ 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,
+ URE_FC_PATCH_TASK);
+ usbd_delay_ms(sc->ure_udev, 1);
+ URE_SETBIT_2(sc, URE_USB_FW_TASK, URE_MCU_TYPE_USB,
+ URE_FC_PATCH_TASK);
+ }
}
/* Reset the packet filter. */
@@ -494,7 +509,7 @@ ure_ifmedia_init(struct ifnet *ifp)
/* Enable transmit and receive. */
URE_SETBIT_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, URE_CR_RE | URE_CR_TE);
- if (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156)) {
+ if (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156 | URE_FLAG_8156B)) {
ure_write_1(sc, URE_USB_UPT_RXDMA_OWN, URE_MCU_TYPE_USB,
URE_OWN_UPDATE | URE_OWN_CLEAR);
}
@@ -510,7 +525,7 @@ ure_ifmedia_upd(struct ifnet *ifp)
struct ifmedia *ifm = &sc->ure_ifmedia;
int anar, gig, err, reg;
- if (sc->ure_flags & URE_FLAG_8156) {
+ if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B)) {
if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
return (EINVAL);
@@ -579,7 +594,7 @@ ure_ifmedia_sts(struct ifnet *ifp, struc
struct mii_data *mii = &sc->ure_mii;
uint16_t status = 0;
- if (sc->ure_flags & URE_FLAG_8156) {
+ if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B)) {
ifmr->ifm_status = IFM_AVALID;
if (ure_get_link_status(sc)) {
ifmr->ifm_status |= IFM_ACTIVE;
@@ -711,12 +726,12 @@ ure_rxvlan(struct ure_softc *sc)
struct ifnet *ifp = &sc->ure_ac.ac_if;
uint16_t reg;
- if (sc->ure_flags & URE_FLAG_8156) {
- reg = ure_read_2(sc, 0xc012, URE_MCU_TYPE_PLA);
- reg &= ~0x00c0;
+ if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B)) {
+ reg = ure_read_2(sc, URE_PLA_RCR1, URE_MCU_TYPE_PLA);
+ reg &= ~(URE_INNER_VLAN | URE_OUTER_VLAN);
if (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING)
- reg |= 0x00c0;
- ure_write_2(sc, 0xc012, URE_MCU_TYPE_PLA, reg);
+ reg |= (URE_INNER_VLAN | URE_OUTER_VLAN);
+ ure_write_2(sc, URE_PLA_RCR1, URE_MCU_TYPE_PLA, reg);
} else {
reg = ure_read_2(sc, URE_PLA_CPCR, URE_MCU_TYPE_PLA);
reg &= ~URE_CPCR_RX_VLAN;
@@ -731,16 +746,30 @@ ure_reset(struct ure_softc *sc)
{
int i;
- ure_write_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, URE_CR_RST);
+ if (sc->ure_flags & URE_FLAG_8156) {
+ URE_CLRBIT_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, URE_CR_TE);
+ URE_CLRBIT_2(sc, URE_USB_BMU_RESET, URE_MCU_TYPE_USB,
+ BMU_RESET_EP_IN);
+ URE_SETBIT_2(sc, URE_USB_USB_CTRL, URE_MCU_TYPE_USB,
+ URE_CDC_ECM_EN);
+ URE_CLRBIT_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, URE_CR_RE);
+ URE_SETBIT_2(sc, URE_USB_BMU_RESET, URE_MCU_TYPE_USB,
+ BMU_RESET_EP_IN);
+ URE_CLRBIT_2(sc, URE_USB_USB_CTRL, URE_MCU_TYPE_USB,
+ URE_CDC_ECM_EN);
+ } else {
+ ure_write_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, URE_CR_RST);
- for (i = 0; i < URE_TIMEOUT; i++) {
- if (!(ure_read_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA) &
- URE_CR_RST))
- break;
- DELAY(100);
+ for (i = 0; i < URE_TIMEOUT; i++) {
+ if (!(ure_read_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA) &
+ URE_CR_RST))
+ break;
+ DELAY(100);
+ }
+ if (i == URE_TIMEOUT)
+ printf("%s: reset never completed\n",
+ sc->ure_dev.dv_xname);
}
- if (i == URE_TIMEOUT)
- printf("%s: reset never completed\n", sc->ure_dev.dv_xname);
}
void
@@ -1120,7 +1149,7 @@ ure_rtl8153_init(struct ure_softc *sc)
URE_CKADSEL_L | URE_ADC_EN | URE_EN_EMI_L);
}
- ure_rtl8153_phy_status(sc, 1);
+ ure_rtl8153_phy_status(sc, URE_PHY_STAT_LAN_ON);
URE_CLRBIT_2(sc, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB, URE_U2P3_ENABLE);
@@ -1193,14 +1222,23 @@ ure_rtl8153b_init(struct ure_softc *sc)
uint16_t reg;
int i;
- if (sc->ure_flags & URE_FLAG_8156) {
- URE_CLRBIT_1(sc, 0xd26b, URE_MCU_TYPE_USB, 0x01);
- ure_write_2(sc, 0xd32a, URE_MCU_TYPE_USB, 0);
- URE_SETBIT_2(sc, 0xcfee, URE_MCU_TYPE_USB, 0x0020);
+ if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B)) {
+ URE_CLRBIT_1(sc, URE_USB_ECM_OP, URE_MCU_TYPE_USB,
+ URE_EN_ALL_SPEED);
+ ure_write_2(sc, URE_USB_SPEED_OPTION, URE_MCU_TYPE_USB, 0);
+ URE_SETBIT_2(sc, URE_USB_ECM_OPTION, URE_MCU_TYPE_USB,
+ URE_BYPASS_MAC_RESET);
+
+ if (sc->ure_flags & URE_FLAG_8156B)
+ URE_SETBIT_2(sc, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB,
+ URE_RX_DETECT8);
}
URE_CLRBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB, LPM_U1U2_EN);
+ if (sc->ure_flags & URE_FLAG_8156B)
+ ure_wait_for_flash(sc);
+
for (i = 0; i < 500; i++) {
if (ure_read_2(sc, URE_PLA_BOOT_CTRL, URE_MCU_TYPE_PLA) &
URE_AUTOLOAD_DONE)
@@ -1212,28 +1250,25 @@ ure_rtl8153b_init(struct ure_softc *sc)
sc->ure_dev.dv_xname);
ure_rtl8153_phy_status(sc, 0);
- ure_rtl8153_phy_status(sc, 1);
+ ure_rtl8153_phy_status(sc, URE_PHY_STAT_LAN_ON);
URE_CLRBIT_2(sc, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB, URE_U2P3_ENABLE);
/* MSC timer, 32760 ms. */
- ure_write_2(sc, URE_USB_MSC_TIMER, URE_MCU_TYPE_USB, 0x0fff);
+ ure_write_2(sc, URE_USB_MSC_TIMER, URE_MCU_TYPE_USB, 4095);
- /* U1/U2/L1 idle timer, 500 us. */
- ure_write_2(sc, URE_USB_U1U2_TIMER, URE_MCU_TYPE_USB, 500);
+ if (!(sc->ure_flags & URE_FLAG_8153B)) {
+ /* U1/U2/L1 idle timer, 500 us. */
+ ure_write_2(sc, URE_USB_U1U2_TIMER, URE_MCU_TYPE_USB, 500);
+ }
URE_CLRBIT_2(sc, URE_USB_POWER_CUT, URE_MCU_TYPE_USB, URE_PWR_EN);
URE_CLRBIT_2(sc, URE_USB_MISC_0, URE_MCU_TYPE_USB, URE_PCUT_STATUS);
URE_CLRBIT_1(sc, URE_USB_POWER_CUT, URE_MCU_TYPE_USB,
URE_UPS_EN | URE_USP_PREWAKE);
- URE_CLRBIT_1(sc, 0xcfff, URE_MCU_TYPE_USB, 0x01);
-
- if (!(sc->ure_flags & URE_FLAG_8156)) {
- URE_CLRBIT_2(sc, URE_USB_MISC_0, URE_MCU_TYPE_USB,
- URE_PCUT_STATUS);
- ure_rtl8153_phy_status(sc, 0);
- }
+ URE_CLRBIT_1(sc, URE_USB_MISC_2, URE_MCU_TYPE_USB,
+ URE_UPS_FORCE_PWR_DOWN);
URE_CLRBIT_1(sc, URE_PLA_INDICATE_FALG, URE_MCU_TYPE_PLA,
URE_UPCOMING_RUNTIME_D3);
@@ -1246,27 +1281,62 @@ ure_rtl8153b_init(struct ure_softc *sc)
URE_CLRBIT_2(sc, URE_PLA_CONFIG34, URE_MCU_TYPE_PLA,
URE_LINK_OFF_WAKE_EN);
ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_NORAML);
-
- URE_SETBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB, LPM_U1U2_EN);
+ if (sc->ure_flags & URE_FLAG_8153B) {
+ reg = ure_read_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA);
+ if (ure_read_2(sc, URE_PLA_PHYSTATUS, URE_MCU_TYPE_PLA) &
+ URE_PHYSTATUS_LINK)
+ reg |= URE_CUR_LINK_OK;
+ else
+ reg &= ~URE_CUR_LINK_OK;
+ ure_write_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA,
+ reg | URE_POLL_LINK_CHG);
+ }
+
+ if (sc->ure_udev->speed == USB_SPEED_SUPER) {
+ URE_SETBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB,
+ LPM_U1U2_EN);
+ }
+
+ if (sc->ure_flags & URE_FLAG_8156B) {
+ URE_CLRBIT_2(sc, URE_PLA_RCR, URE_MCU_TYPE_PLA, URE_SLOT_EN);
+ URE_SETBIT_2(sc, URE_PLA_CPCR, URE_MCU_TYPE_PLA,
+ URE_FLOW_CTRL_EN);
+
+ /* Enable fc timer and set timer to 600 ms. */
+ ure_write_2(sc, URE_USB_FC_TIMER, URE_MCU_TYPE_USB,
+ URE_CTRL_TIMER_EN | 75);
+
+ reg = ure_read_2(sc, URE_USB_FW_CTRL, URE_MCU_TYPE_USB);
+ if (!(ure_read_2(sc, URE_PLA_POL_GPIO_CTRL, URE_MCU_TYPE_PLA) &
+ URE_DACK_DET_EN))
+ reg |= URE_FLOW_CTRL_PATCH_2;
+ reg &= ~URE_AUTO_SPEEDUP;
+ ure_write_2(sc, URE_USB_FW_CTRL, URE_MCU_TYPE_USB, reg);
+
+ 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) {
+ if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B)) {
ure_write_2(sc, URE_PLA_MAC_PWR_CTRL, URE_MCU_TYPE_PLA, 0x0403);
- reg = ure_read_2(sc, URE_PLA_MAC_PWR_CTRL2, URE_MCU_TYPE_PLA) &
- ~0xff;
+ reg = ure_read_2(sc, URE_PLA_MAC_PWR_CTRL2, URE_MCU_TYPE_PLA);
+ reg &= ~URE_EEE_SPDWN_RATIO_MASK;
reg |= URE_MAC_CLK_SPDWN_EN | 0x0003;
ure_write_2(sc, URE_PLA_MAC_PWR_CTRL2, URE_MCU_TYPE_PLA, reg);
URE_CLRBIT_2(sc, URE_PLA_MAC_PWR_CTRL3, URE_MCU_TYPE_PLA,
- 0x4000);
+ URE_PLA_MCU_SPDWN_EN);
reg = ure_read_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA);
- if (ure_get_link_status(sc))
- reg |= 0x8000;
+ if (ure_read_2(sc, URE_PLA_PHYSTATUS, URE_MCU_TYPE_PLA) &
+ URE_PHYSTATUS_LINK)
+ reg |= URE_CUR_LINK_OK;
else
- reg &= ~0x8000;
- reg |= 0x0001;
- ure_write_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA, reg);
+ reg &= ~URE_CUR_LINK_OK;
+ ure_write_2(sc, URE_PLA_EXTRA_STATUS, URE_MCU_TYPE_PLA,
+ reg | URE_POLL_LINK_CHG);
} else
URE_SETBIT_2(sc, URE_PLA_MAC_PWR_CTRL2, URE_MCU_TYPE_PLA,
URE_MAC_CLK_SPDWN_EN);
@@ -1276,7 +1346,8 @@ ure_rtl8153b_init(struct ure_softc *sc)
URE_RX_AGG_DISABLE | URE_RX_ZERO_EN);
if (sc->ure_flags & URE_FLAG_8156)
- URE_SETBIT_1(sc, 0xcfd9, URE_MCU_TYPE_USB, 0x04);
+ URE_SETBIT_1(sc, URE_USB_BMU_CONFIG, URE_MCU_TYPE_USB,
+ URE_ACT_ODMA);
URE_SETBIT_2(sc, URE_PLA_RSTTALLY, URE_MCU_TYPE_PLA, URE_TALLY_RESET);
}
@@ -1364,7 +1435,7 @@ ure_rtl8153_nic_reset(struct ure_softc *
uint8_t u1u2[8] = { 0 };
int i;
- if (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156)) {
+ if (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156 | URE_FLAG_8156B)) {
URE_CLRBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB,
LPM_U1U2_EN);
} else {
@@ -1382,33 +1453,19 @@ ure_rtl8153_nic_reset(struct ure_softc *
if (ure_read_2(sc, 0xe000, URE_MCU_TYPE_PLA) & 0x0100)
break;
}
- if (sc->ure_flags & URE_FLAG_8153B) {
- URE_CLRBIT_4(sc, URE_USB_UPS_FLAGS, URE_MCU_TYPE_USB,
- URE_UPS_FLAGS_EN_ALDPS);
- }
- if (!(sc->ure_flags & URE_FLAG_8156)) {
- ure_write_2(sc, URE_PLA_MAC_PWR_CTRL, URE_MCU_TYPE_PLA, 0);
- ure_write_2(sc, URE_PLA_MAC_PWR_CTRL2, URE_MCU_TYPE_PLA, 0);
- ure_write_2(sc, URE_PLA_MAC_PWR_CTRL3, URE_MCU_TYPE_PLA, 0);
- ure_write_2(sc, URE_PLA_MAC_PWR_CTRL4, URE_MCU_TYPE_PLA, 0);
- }
URE_SETBIT_2(sc, URE_PLA_MISC_1, URE_MCU_TYPE_PLA, URE_RXDY_GATED_EN);
ure_disable_teredo(sc);
URE_CLRBIT_4(sc, URE_PLA_RCR, URE_MCU_TYPE_PLA, URE_RCR_ACPT_ALL);
- if (sc->ure_flags & URE_FLAG_8156)
- ure_write_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, 0);
- else
- ure_reset(sc);
-
+ ure_reset(sc);
ure_reset_bmu(sc);
URE_CLRBIT_1(sc, URE_PLA_OOB_CTRL, URE_MCU_TYPE_PLA, URE_NOW_IS_OOB);
URE_CLRBIT_2(sc, URE_PLA_SFF_STS_7, URE_MCU_TYPE_PLA, URE_MCU_BORW_EN);
- if (!(sc->ure_flags & URE_FLAG_8156)) {
+ if (!(sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B))) {
for (i = 0; i < URE_TIMEOUT; i++) {
if (ure_read_1(sc, URE_PLA_OOB_CTRL, URE_MCU_TYPE_PLA) &
URE_LINK_LIST_READY)
@@ -1430,65 +1487,89 @@ ure_rtl8153_nic_reset(struct ure_softc *
printf("%s: timeout waiting for OOB control\n",
sc->ure_dev.dv_xname);
}
+
ure_rxvlan(sc);
+
ure_write_2(sc, URE_PLA_RMS, URE_MCU_TYPE_PLA,
URE_FRAMELEN(ifp->if_mtu));
ure_write_1(sc, URE_PLA_MTPS, URE_MCU_TYPE_PLA, MTPS_JUMBO);
- if (!(sc->ure_flags & URE_FLAG_8156)) {
+ if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B)) {
+ ure_write_2(sc, URE_PLA_RX_FIFO_FULL, URE_MCU_TYPE_PLA,
+ (sc->ure_flags & URE_FLAG_8156) ? 1024 : 512);
+ ure_write_2(sc, URE_PLA_RX_FIFO_EMPTY, URE_MCU_TYPE_PLA,
+ (sc->ure_flags & URE_FLAG_8156) ? 2048 : 1024);
+
+ /* Tx share fifo free credit full threshold. */
+ ure_write_2(sc, URE_PLA_TXFIFO_CTRL, URE_MCU_TYPE_PLA, 8);
+ ure_write_2(sc, URE_PLA_TXFIFO_FULL, URE_MCU_TYPE_PLA, 128);
+
+ if (sc->ure_flags & URE_FLAG_8156)
+ URE_SETBIT_2(sc, URE_USB_BMU_CONFIG, URE_MCU_TYPE_USB,
+ URE_ACT_ODMA);
+
+ /* FIFO settings */
+ reg = ure_read_2(sc, URE_PLA_RXFIFO_FULL, URE_MCU_TYPE_PLA);
+ reg &= ~URE_RXFIFO_FULL_MASK;
+ ure_write_2(sc, URE_PLA_RXFIFO_FULL, URE_MCU_TYPE_PLA,
+ reg | 0x0008);
+
+ URE_CLRBIT_2(sc, URE_PLA_MAC_PWR_CTRL3, URE_MCU_TYPE_PLA,
+ URE_PLA_MCU_SPDWN_EN);
+
+ URE_CLRBIT_2(sc, URE_USB_SPEED_OPTION, URE_MCU_TYPE_USB,
+ URE_RG_PWRDN_EN | URE_ALL_SPEED_OFF);
+
+ ure_write_4(sc, URE_USB_RX_BUF_TH, URE_MCU_TYPE_USB,
+ 0x00600400);
+ }
+
+ if (!(sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B))) {
URE_SETBIT_2(sc, URE_PLA_TCR0, URE_MCU_TYPE_PLA,
URE_TCR0_AUTO_FIFO);
ure_reset(sc);
- }
- /* Configure Rx FIFO threshold. */
- if (sc->ure_flags & URE_FLAG_8156) {
- ure_write_2(sc, URE_PLA_RXFIFO_CTRL0 + 2, URE_MCU_TYPE_PLA,
- 0x0008);
- ure_write_2(sc, URE_PLA_RXFIFO_CTRL1 + 2, URE_MCU_TYPE_PLA,
- 0x0100);
- ure_write_2(sc, URE_PLA_RXFIFO_CTRL2, URE_MCU_TYPE_PLA, 0);
- } else {
+ /* Configure Rx FIFO threshold. */
ure_write_4(sc, URE_PLA_RXFIFO_CTRL0, URE_MCU_TYPE_PLA,
URE_RXFIFO_THR1_NORMAL);
ure_write_2(sc, URE_PLA_RXFIFO_CTRL1, URE_MCU_TYPE_PLA,
URE_RXFIFO_THR2_NORMAL);
ure_write_2(sc, URE_PLA_RXFIFO_CTRL2, URE_MCU_TYPE_PLA,
URE_RXFIFO_THR3_NORMAL);
- }
- /* Configure Tx FIFO threshold. */
- ure_write_4(sc, URE_PLA_TXFIFO_CTRL, URE_MCU_TYPE_PLA,
- URE_TXFIFO_THR_NORMAL2);
+ /* Configure Tx FIFO threshold. */
+ ure_write_4(sc, URE_PLA_TXFIFO_CTRL, URE_MCU_TYPE_PLA,
+ URE_TXFIFO_THR_NORMAL2);
+
+ if (sc->ure_flags & URE_FLAG_8153B) {
+ ure_write_4(sc, URE_USB_RX_BUF_TH, URE_MCU_TYPE_USB,
+ URE_RX_THR_B);
- if (sc->ure_flags & URE_FLAG_8156) {
- URE_CLRBIT_2(sc, URE_PLA_MAC_PWR_CTRL3, URE_MCU_TYPE_PLA,
- 0x4000);
- ure_write_4(sc, URE_USB_RX_BUF_TH, URE_MCU_TYPE_USB,
- 0x00600400);
- } else if (sc->ure_flags & URE_FLAG_8153B) {
- ure_write_4(sc, URE_USB_RX_BUF_TH, URE_MCU_TYPE_USB,
- URE_RX_THR_B);
+ URE_CLRBIT_2(sc, URE_PLA_MAC_PWR_CTRL3,
+ URE_MCU_TYPE_PLA, URE_PLA_MCU_SPDWN_EN);
+ } else {
+ URE_SETBIT_1(sc, URE_PLA_CONFIG6, URE_MCU_TYPE_PLA,
+ URE_LANWAKE_CLR_EN);
+ URE_CLRBIT_1(sc, URE_PLA_LWAKE_CTRL_REG,
+ URE_MCU_TYPE_PLA, URE_LANWAKE_PIN);
+ URE_CLRBIT_2(sc, URE_USB_SSPHYLINK1, URE_MCU_TYPE_USB,
+ URE_DELAY_PHY_PWR_CHG);
+ }
}
/* Enable ALDPS. */
ure_ocp_reg_write(sc, URE_OCP_POWER_CFG,
ure_ocp_reg_read(sc, URE_OCP_POWER_CFG) | URE_EN_ALDPS);
- if (sc->ure_flags & URE_FLAG_8153B) {
- reg = ure_read_4(sc, URE_USB_UPS_FLAGS, URE_MCU_TYPE_USB) &
- URE_UPS_FLAGS_MASK;
- ure_write_4(sc, URE_USB_UPS_FLAGS, URE_MCU_TYPE_USB,
- reg | URE_UPS_FLAGS_EN_ALDPS);
- }
if ((sc->ure_chip & (URE_CHIP_VER_5C20 | URE_CHIP_VER_5C30)) ||
- (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156)))
+ (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B)))
URE_SETBIT_2(sc, URE_USB_U2P3_CTRL, URE_MCU_TYPE_USB,
URE_U2P3_ENABLE);
- if (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156)) {
- URE_SETBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB,
- LPM_U1U2_EN);
+ if (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156 | URE_FLAG_8156B)) {
+ if (sc->ure_udev->speed == USB_SPEED_SUPER)
+ URE_SETBIT_2(sc, URE_USB_LPM_CONFIG, URE_MCU_TYPE_USB,
+ LPM_U1U2_EN);
} else {
memset(u1u2, 0xff, sizeof(u1u2));
ure_write_mem(sc, URE_USB_TOLERANCE, URE_BYTE_EN_SIX_BYTES,
@@ -1496,8 +1577,8 @@ ure_rtl8153_nic_reset(struct ure_softc *
}
}
-void
-ure_rtl8153_phy_status(struct ure_softc *sc, int enable)
+uint16_t
+ure_rtl8153_phy_status(struct ure_softc *sc, int desired)
{
uint16_t reg;
int i;
@@ -1505,8 +1586,8 @@ ure_rtl8153_phy_status(struct ure_softc
for (i = 0; i < 500; i++) {
reg = ure_ocp_reg_read(sc, URE_OCP_PHY_STATUS) &
URE_PHY_STAT_MASK;
- if (enable) {
- if (reg == URE_PHY_STAT_LAN_ON)
+ if (desired) {
+ if (reg == desired)
break;
} else {
if (reg == URE_PHY_STAT_LAN_ON ||
@@ -1519,21 +1600,47 @@ ure_rtl8153_phy_status(struct ure_softc
if (i == 500)
printf("%s: timeout waiting for phy to stabilize\n",
sc->ure_dev.dv_xname);
+
+ return reg;
}
-
+
+void
+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_read_2(sc, URE_USB_GPHY_CTRL, URE_MCU_TYPE_USB) &
+ URE_BYPASS_FLASH)) {
+ for (i = 0; i < 100; i++) {
+ if (ure_read_2(sc, URE_USB_GPHY_CTRL,
+ URE_MCU_TYPE_USB) & URE_GPHY_PATCH_DONE)
+ break;
+ DELAY(1000);
+ }
+ if (i == 100)
+ printf("%s: timeout waiting for loading flash\n",
+ sc->ure_dev.dv_xname);
+ }
+}
+
void
ure_reset_bmu(struct ure_softc *sc)
{
- URE_CLRBIT_1(sc, URE_USB_BMU_RESET, URE_MCU_TYPE_USB,
- BMU_RESET_EP_IN | BMU_RESET_EP_OUT);
- URE_SETBIT_1(sc, URE_USB_BMU_RESET, URE_MCU_TYPE_USB,
- BMU_RESET_EP_IN | BMU_RESET_EP_OUT);
+ uint8_t reg;
+
+ reg = ure_read_1(sc, URE_USB_BMU_RESET, URE_MCU_TYPE_USB);
+ reg &= ~(BMU_RESET_EP_IN | BMU_RESET_EP_OUT);
+ ure_write_1(sc, URE_USB_BMU_RESET, URE_MCU_TYPE_USB, reg);
+ reg |= BMU_RESET_EP_IN | BMU_RESET_EP_OUT;
+ ure_write_1(sc, URE_USB_BMU_RESET, URE_MCU_TYPE_USB, reg);
}
void
ure_disable_teredo(struct ure_softc *sc)
{
- if (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156))
+ if (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156 | URE_FLAG_8156B))
ure_write_1(sc, URE_PLA_TEREDO_CFG, URE_MCU_TYPE_PLA, 0xff);
else {
URE_CLRBIT_2(sc, URE_PLA_TEREDO_CFG, URE_MCU_TYPE_PLA,
@@ -1575,7 +1682,7 @@ ure_ioctl(struct ifnet *ifp, u_long cmd,
case SIOCGIFMEDIA:
case SIOCSIFMEDIA:
- if (sc->ure_flags & URE_FLAG_8156)
+ if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B))
error = ifmedia_ioctl(ifp, ifr, &sc->ure_ifmedia, cmd);
else
error = ifmedia_ioctl(ifp, ifr, &sc->ure_mii.mii_media,
@@ -1699,6 +1806,10 @@ ure_attach(struct device *parent, struct
sc->ure_flags = URE_FLAG_8156;
printf("RTL8156 (0x7030)");
break;
+ case 0x7410:
+ sc->ure_flags = URE_FLAG_8156B;
+ printf("RTL8156B (0x7410)");
+ break;
default:
printf(", unknown ver %02x", ver);
break;
@@ -1706,7 +1817,8 @@ ure_attach(struct device *parent, struct
if (sc->ure_flags & URE_FLAG_8152)
ure_rtl8152_init(sc);
- else if (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156))
+ else if (sc->ure_flags & (URE_FLAG_8153B | URE_FLAG_8156 |
+ URE_FLAG_8156B))
ure_rtl8153b_init(sc);
else
ure_rtl8153_init(sc);
@@ -1737,7 +1849,7 @@ ure_attach(struct device *parent, struct
ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
#endif
- if (sc->ure_flags & URE_FLAG_8156) {
+ if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B)) {
ifmedia_init(&sc->ure_ifmedia, IFM_IMASK, ure_ifmedia_upd,
ure_ifmedia_sts);
ure_add_media_types(sc);
@@ -1830,7 +1942,7 @@ ure_tick_task(void *xsc)
mii = &sc->ure_mii;
s = splnet();
- if (sc->ure_flags & URE_FLAG_8156)
+ if (sc->ure_flags & (URE_FLAG_8156 | URE_FLAG_8156B))
ure_link_state(sc);
else {
mii_tick(mii);
@@ -1914,7 +2026,7 @@ ure_rxeof(struct usbd_xfer *xfer, void *
total_len -= roundup(pktlen, URE_RX_BUF_ALIGN);
buf += sizeof(rxhdr);
- m = m_devget(buf, pktlen, ETHER_ALIGN);
+ m = m_devget(buf, pktlen - ETHER_CRC_LEN, ETHER_ALIGN);
if (m == NULL) {
DPRINTF(("unable to allocate mbuf for next packet\n"));
ifp->if_ierrors++;
Index: sys/dev/usb/if_urereg.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_urereg.h,v
retrieving revision 1.10
diff -u -p -u -p -r1.10 if_urereg.h
--- sys/dev/usb/if_urereg.h 13 Aug 2021 01:24:22 -0000 1.10
+++ sys/dev/usb/if_urereg.h 31 Mar 2022 08:35:04 -0000
@@ -50,10 +50,14 @@
#define URE_PLA_IDR 0xc000
#define URE_PLA_RCR 0xc010
+#define URE_PLA_RCR1 0xc012
#define URE_PLA_RMS 0xc016
#define URE_PLA_RXFIFO_CTRL0 0xc0a0
+#define URE_PLA_RXFIFO_FULL 0xc0a2
#define URE_PLA_RXFIFO_CTRL1 0xc0a4
+#define URE_PLA_RX_FIFO_FULL 0xc0a6
#define URE_PLA_RXFIFO_CTRL2 0xc0a8
+#define URE_PLA_RX_FIFO_EMPTY 0xc0aa
#define URE_PLA_DMY_REG0 0xc0b0
#define URE_PLA_FMC 0xc0b4
#define URE_PLA_CFG_WOL 0xc0b6
@@ -66,10 +70,13 @@
#define URE_PLA_SUSPEND_FLAG 0xd38a
#define URE_PLA_INDICATE_FALG 0xd38c
#define URE_PLA_EXTRA_STATUS 0xd398
+#define URE_PLA_GPHY_CTRL 0xd3ae
+#define URE_PLA_POL_GPIO_CTRL 0xdc6a
#define URE_PLA_LEDSEL 0xdd90
#define URE_PLA_LED_FEATURE 0xdd92
#define URE_PLA_PHYAR 0xde00
#define URE_PLA_BOOT_CTRL 0xe004
+#define URE_PLA_LWAKE_CTRL_REG 0xe007
#define URE_PLA_GPHY_INTR_IMR 0xe022
#define URE_PLA_EEE_CR 0xe040
#define URE_PLA_EEEP_CR 0xe080
@@ -82,6 +89,7 @@
#define URE_PLA_TCR1 0xe612
#define URE_PLA_MTPS 0xe615
#define URE_PLA_TXFIFO_CTRL 0xe618
+#define URE_PLA_TXFIFO_FULL 0xe61a
#define URE_PLA_RSTTALLY 0xe800
#define URE_PLA_CR 0xe813
#define URE_PLA_CRWECR 0xe81c
@@ -96,8 +104,11 @@
#define URE_PLA_TELLYCNT 0xe890
#define URE_PLA_SFF_STS_7 0xe8de
#define URE_PLA_PHYSTATUS 0xe908
+#define URE_PLA_CONFIG6 0xe90a
+#define URE_PLA_USB_CFG 0xe952
#define URE_USB_USB2PHY 0xb41e
+#define URE_USB_SSPHYLINK1 0xb426
#define URE_USB_SSPHYLINK2 0xb428
#define URE_USB_U2P3_CTRL 0xb460
#define URE_USB_CSR_DUMMY1 0xb464
@@ -107,6 +118,13 @@
#define URE_USB_MSC_TIMER 0xcbfc
#define URE_USB_BURST_SIZE 0xcfc0
#define URE_USB_LPM_CONFIG 0xcfd8
+#define URE_USB_ECM_OPTION 0xcfee
+#define URE_USB_MISC_2 0xcfff
+#define URE_USB_ECM_OP 0xd26b
+#define URE_USB_GPHY_CTRL 0xd284
+#define URE_USB_SPEED_OPTION 0xd32a
+#define URE_USB_FW_CTRL 0xd334
+#define URE_USB_FC_TIMER 0xd340
#define URE_USB_USB_CTRL 0xd406
#define URE_USB_PHY_CTRL 0xd408
#define URE_USB_TX_AGG 0xd40a
@@ -120,7 +138,10 @@
#define URE_USB_UPT_RXDMA_OWN 0xd437
#define URE_USB_TOLERANCE 0xd490
#define URE_USB_BMU_RESET 0xd4b0
+#define URE_USB_BMU_CONFIG 0xd4b4
#define URE_USB_U1U2_TIMER 0xd4da
+#define URE_USB_FW_TASK 0xd4e8
+#define URE_USB_RX_AGGR_NUM 0xd4ee
#define URE_USB_UPS_CTRL 0xd800
#define URE_USB_POWER_CUT 0xd80a
#define URE_USB_MISC_0 0xd81a
@@ -162,11 +183,19 @@
#define URE_RCR_AB 0x00000008
#define URE_RCR_ACPT_ALL \
(URE_RCR_AAP | URE_RCR_APM | URE_RCR_AM | URE_RCR_AB)
+#define URE_SLOT_EN 0x00000800
+
+/* URE_PLA_RCR1 */
+#define URE_INNER_VLAN 0x0040
+#define URE_OUTER_VLAN 0x0080
/* URE_PLA_RXFIFO_CTRL0 */
#define URE_RXFIFO_THR1_NORMAL 0x00080002
#define URE_RXFIFO_THR1_OOB 0x01800003
+/* URE_PLA_RXFIFO_FULL */
+#define URE_RXFIFO_FULL_MASK 0x0fff
+
/* URE_PLA_RXFIFO_CTRL1 */
#define URE_RXFIFO_THR2_FULL 0x00000060
#define URE_RXFIFO_THR2_HIGH 0x00000038
@@ -234,6 +263,7 @@
#define URE_RE_INIT_LL 0x8000
/* URE_PLA_CPCR */
+#define URE_FLOW_CTRL_EN 0x0001
#define URE_CPCR_RX_VLAN 0x0040
/* URE_PLA_TEREDO_CFG */
@@ -266,14 +296,16 @@
#define URE_ALDPS_SPDWN_RATIO 0x0f87
/* URE_PLA_MAC_PWR_CTRL2 */
-#define URE_MAC_CLK_SPDWN_EN 0x8000
-#define URE_EEE_SPDWN_RATIO 0x8007
+#define URE_MAC_CLK_SPDWN_EN 0x8000
+#define URE_EEE_SPDWN_RATIO 0x8007
+#define URE_EEE_SPDWN_RATIO_MASK 0x00ff
/* URE_PLA_MAC_PWR_CTRL3 */
#define URE_L1_SPDWN_EN 0x0001
#define URE_U1U2_SPDWN_EN 0x0002
#define URE_SUSPEND_SPDWN_EN 0x0004
#define URE_PKT_AVAIL_SPDWN_EN 0x0100
+#define URE_PLA_MCU_SPDWN_EN 0x4000
/* URE_PLA_MAC_PWR_CTRL4 */
#define URE_EEE_SPDWN_EN 0x0001
@@ -301,6 +333,9 @@
/* URE_PLA_BOOT_CTRL */
#define URE_AUTOLOAD_DONE 0x0002
+/* URE_PLA_LWAKE_CTRL_REG */
+#define URE_LANWAKE_PIN 0x80
+
/* URE_PLA_SUSPEND_FLAG */
#define URE_LINK_CHG_EVENT 0x01
@@ -308,7 +343,15 @@
#define URE_UPCOMING_RUNTIME_D3 0x01
/* URE_PLA_EXTRA_STATUS */
+#define URE_POLL_LINK_CHG 0x0001
#define URE_LINK_CHANGE_FLAG 0x0100
+#define URE_CUR_LINK_OK 0x8000
+
+/* URE_PLA_GPHY_CTRL */
+#define URE_GPHY_FLASH 0x0002
+
+/* URE_PLA_POL_GPIO_CTRL */
+#define URE_DACK_DET_EN 0x8000
/* URE_PLA_PHYSTATUS */
#define URE_PHYSTATUS_FDX 0x0001
@@ -318,10 +361,16 @@
#define URE_PHYSTATUS_1000MBPS 0x0010
#define URE_PHYSTATUS_2500MBPS 0x0400
+/* URE_PLA_CONFIG6 */
+#define URE_LANWAKE_CLR_EN 0x01
+
/* URE_USB_USB2PHY */
#define URE_USB2PHY_SUSPEND 0x0001
#define URE_USB2PHY_L1 0x0002
+/* URE_USB_SSPHYLINK1 */
+#define URE_DELAY_PHY_PWR_CHG 0x0002
+
/* URE_USB_SSPHYLINK2 */
#define URE_PWD_DN_SCALE_MASK 0x3ffe
#define URE_PWD_DN_SCALE(x) ((x) << 1)
@@ -340,6 +389,31 @@
/* URE_USB_LPM_CONFIG */
#define LPM_U1U2_EN 0x0001
+/* URE_USB_MISC_2 */
+#define URE_UPS_FORCE_PWR_DOWN 0x01
+
+/* URE_USB_ECM_OPTION */
+#define URE_BYPASS_MAC_RESET 0x0020
+
+/* URE_USB_GPHY_CTRL */
+#define URE_GPHY_PATCH_DONE 0x0004
+#define URE_BYPASS_FLASH 0x0020
+
+/* URE_USB_SPEED_OPTION */
+#define URE_RG_PWRDN_EN 0x0100
+#define URE_ALL_SPEED_OFF 0x0200
+
+/* URE_USB_FW_CTRL */
+#define URE_FLOW_CTRL_PATCH_OPT 0x0002
+#define URE_AUTO_SPEEDUP 0x0008
+#define URE_FLOW_CTRL_PATCH_2 0x0100
+
+/* URE_URE_USB_FC_TIMER */
+#define URE_CTRL_TIMER_EN 0x8000
+
+/* URE_USB_USB_ECM_OP */
+#define URE_EN_ALL_SPEED 0x0001
+
/* URE_USB_TX_AGG */
#define URE_TX_AGG_MAX_THRESHOLD 0x03
@@ -361,6 +435,15 @@
#define BMU_RESET_EP_IN 0x01
#define BMU_RESET_EP_OUT 0x02
+/* URE_USB_BMU_CONFIG */
+#define URE_ACT_ODMA 0x02
+
+/* URE_USB_FW_TASK */
+#define URE_FC_PATCH_TASK 0x0002
+
+/* URE_USB_RX_AGGR_NUM */
+#define URE_RX_AGGR_NUM_MASK 0x1ff
+
/* URE_USB_UPS_CTRL */
#define URE_POWER_CUT 0x0100
@@ -368,11 +451,13 @@
#define URE_RESUME_INDICATE 0x0001
/* URE_USB_USB_CTRL */
+#define URE_CDC_ECM_EN 0x0008
#define URE_RX_AGG_DISABLE 0x0010
#define URE_RX_ZERO_EN 0x0080
/* URE_USB_U2P3_CTRL */
#define URE_U2P3_ENABLE 0x0001
+#define URE_RX_DETECT8 0x0008
/* URE_USB_POWER_CUT */
#define URE_PWR_EN 0x0001
@@ -551,6 +636,7 @@ struct ure_softc {
#define URE_FLAG_8152 0x1000 /* RTL8152 */
#define URE_FLAG_8153B 0x2000 /* RTL8153B */
#define URE_FLAG_8156 0x4000 /* RTL8156 */
+#define URE_FLAG_8156B 0x8000 /* RTL8156B */
u_int ure_chip;
#define URE_CHIP_VER_4C00 0x01
@@ -559,4 +645,5 @@ struct ure_softc {
#define URE_CHIP_VER_5C10 0x08
#define URE_CHIP_VER_5C20 0x10
#define URE_CHIP_VER_5C30 0x20
+#define URE_CHIP_VER_6010 0x40
};