On Thu, 22 Jul 2021 07:55:18 +0200 Marcus Glocker <mar...@nazgul.ch> wrote:
> On Wed, 21 Jul 2021 19:23:18 -0300 > Adrian Ali <adrian...@fortix.com.ar> wrote: > > > > On Wed, 21 Jul 2021 13:46:54 -0300 > > > Adrian Ali <adrian...@fortix.com.ar> wrote: > > > > > > > On Wed, 21 Jul 2021 08:40:34 +0200 > > > > Marcus Glocker <mar...@nazgul.ch> wrote: > > > > > > > > > Does this diff fix the issue? > > > > > > > > > > > > > > > Index: if_ure.c > > > > > =============================================================== > > > > > RCS file: /cvs/src/sys/dev/usb/if_ure.c,v > > > > > retrieving revision 1.24 > > > > > diff -u -p -u -p -r1.24 if_ure.c > > > > > --- if_ure.c 15 Apr 2021 02:23:17 -0000 1.24 > > > > > +++ if_ure.c 21 Jul 2021 14:15:10 -0000 > > > > > @@ -435,6 +435,9 @@ ure_miibus_statchg(struct device *dev) > > > > > /* Lost link, do nothing. */ > > > > > if ((sc->ure_flags & URE_FLAG_LINK) == 0) > > > > > return; > > > > > + > > > > > + /* Enable transmit and receive. */ > > > > > + URE_SETBIT_1(sc, URE_PLA_CR, URE_MCU_TYPE_PLA, > > > > > URE_CR_RE | URE_CR_TE); > > > > > } > > > > > > > > > > int > > > > > > > > No, test steps: > > > > > > > > Start computer: > > > > > > > > # dmesg | grep ure0 > > > > ure0 at uhub0 port 2 configuration 1 interface 0 "TP-LINK USB > > > > 10/100 LAN" rev 2.10/20.00 addr 3 > > > > ure0: RTL8152 (0x4c10), address 7c:c2:c6:1a:37:01 > > > > rlphy0 at ure0 phy 0: RTL8201E 10/100 PHY, rev. 2 > > > > > > > > # ifconfig ure0 > > > > ure0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500 > > > > lladdr 7c:c2:c6:1a:37:01 > > > > index 5 priority 0 llprio 3 > > > > media: Ethernet autoselect (100baseTX > > > >full-duplex) status: active > > > > > > > > Add IP configuration in device: > > > > > > > > # ifconfig ure0 debug > > > > # ifconfig ure0 192.168.47.1/24 > > > > > > > > # ifconfig ure0 > > > > ure0: flags=8847<UP,BROADCAST,DEBUG,RUNNING,SIMPLEX,MULTICAST> > > > > mtu 1500 lladdr 7c:c2:c6:1a:37:01 > > > > index 5 priority 0 llprio 3 > > > > media: Ethernet autoselect (100baseTX > > > >full-duplex) status: active > > > > inet 192.168.47.1 netmask 0xffffff00 broadcast > > > > > > > 192.168.47.255 > > > > > > > > Test ping, it works: > > > > > > > > # ping -c3 192.168.47.2 > > > > PING 192.168.47.2 (192.168.47.2): 56 data bytes > > > > 64 bytes from 192.168.47.2: icmp_seq=0 ttl=255 time=0.749 ms > > > > 64 bytes from 192.168.47.2: icmp_seq=1 ttl=255 time=0.779 ms > > > > 64 bytes from 192.168.47.2: icmp_seq=2 ttl=255 time=0.836 ms > > > > > > > > --- 192.168.47.2 ping statistics --- > > > > 3 packets transmitted, 3 packets received, 0.0% packet loss > > > > round-trip min/avg/max/std-dev = 0.749/0.788/0.836/0.036 ms > > > > > > > > unplug cable: > > > > > > > > # ifconfig ure0 > > > > ure0: flags=8847<UP,BROADCAST,DEBUG,RUNNING,SIMPLEX,MULTICAST> > > > > mtu 1500 lladdr 7c:c2:c6:1a:37:01 > > > > index 5 priority 0 llprio 3 > > > > media: Ethernet autoselect (none) > > > > status: no carrier > > > > inet 192.168.47.1 netmask 0xffffff00 broadcast > > > > > > 192.168.47.255 > > > > > > > > plug in cable: > > > > > > > > # ifconfig ure0 > > > > ure0: flags=8847<UP,BROADCAST,DEBUG,RUNNING,SIMPLEX,MULTICAST> > > > > mtu 1500 lladdr 7c:c2:c6:1a:37:01 > > > > index 5 priority 0 llprio 3 > > > > media: Ethernet autoselect (100baseTX > > > >full-duplex) status: active > > > > inet 192.168.47.1 netmask 0xffffff00 broadcast > > > > > > 192.168.47.255 > > > > > > > > Test ping, does not work: > > > > > > > > # ping -c3 192.168.47.2 > > > > PING 192.168.47.2 (192.168.47.2): 56 data bytes > > > > > > > > --- 192.168.47.2 ping statistics --- > > > > 3 packets transmitted, 0 packets received, 100.0% packet loss > > > > > > > > log: > > > > > > > > Jul 21 13:10:02 neurus /bsd: ure0: usb error on tx: IN_PROGRESS > > > > Jul 21 13:10:02 neurus /bsd: usb_insert_transfer: > > > > xfer=0xfffffd821eeb6c08 not free > > > > > > Um, interesting. I could get my hands on a RTL8153 in the > > > meantime, and there the diff fixes the issue. With the RTL8153 I > > > can see that after the cable gets unplugged, RX/TX is getting > > > disabled on the chip. I have assumed that would also apply to > > > the other RTL815x chip sets. > > > > > > If you want to run this diff (it does basically the same but with > > > more debug output), and send back the dmesg, then we could at > > > least see the RTL8152 behaviour related to the RX/TX register. > > > > Hi, dmesg with this diff : > > > > 1. Start computer: > > > > # dmesg | grep ure0 > > ure0 at uhub0 port 2 configuration 1 interface 0 "TP-LINK USB > > 10/100 LAN" rev 2.10/20.00 addr 3 > > ure0: RTL8152 (0x4c10), address 7c:c2:c6:1a:37:01 > > rlphy0 at ure0 phy 0: RTL8201E 10/100 PHY, rev. 2 > > > > # ifconfig ure0 > > ure0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500 > > lladdr 7c:c2:c6:1a:37:01 > > index 5 priority 0 llprio 3 > > media: Ethernet autoselect (100baseTX full-duplex) > > status: active > > > > 2. Add IP configuration in device: > > > > # ifconfig ure0 debug > > # ifconfig ure0 192.168.47.1/24 > > > > dmesg: > > > > Jul 21 19:00:54 neurus /bsd: ure_check_trx_enabled: val=0xc: RX-ON > > TX-ON Jul 21 19:00:56 neurus last message repeated 2 times > > > > # ifconfig ure0 > > ure0: flags=8847<UP,BROADCAST,DEBUG,RUNNING,SIMPLEX,MULTICAST> mtu > > 1500 lladdr 7c:c2:c6:1a:37:01 > > index 5 priority 0 llprio 3 > > media: Ethernet autoselect (100baseTX full-duplex) > > status: active > > inet 192.168.47.1 netmask 0xffffff00 broadcast > > 192.168.47.255 > > > > 3. Test ping, it works: > > > > # ping -c3 192.168.47.2 > > PING 192.168.47.2 (192.168.47.2): 56 data bytes > > 64 bytes from 192.168.47.2: icmp_seq=0 ttl=255 time=1.594 ms > > 64 bytes from 192.168.47.2: icmp_seq=1 ttl=255 time=0.783 ms > > 64 bytes from 192.168.47.2: icmp_seq=2 ttl=255 time=0.795 ms > > > > --- 192.168.47.2 ping statistics --- > > 3 packets transmitted, 3 packets received, 0.0% packet loss > > round-trip min/avg/max/std-dev = 0.783/1.057/1.594/0.380 ms > > > > 4. Unplug cable: > > > > # ifconfig ure0 > > ure0: flags=8847<UP,BROADCAST,DEBUG,RUNNING,SIMPLEX,MULTICAST> mtu > > 1500 lladdr 7c:c2:c6:1a:37:01 > > index 5 priority 0 llprio 3 > > media: Ethernet autoselect (none) > > status: no carrier > > inet 192.168.47.1 netmask 0xffffff00 broadcast > > 192.168.47.255 > > > > 5. Plug in cable: > > > > dmesg: > > > > Jul 21 19:04:01 neurus /bsd: ure_check_trx_enabled: val=0x0: > > Jul 21 19:04:01 neurus /bsd: ure_check_trx_enabled: val=0xc: RX-ON > > TX-ON > > > > # ifconfig ure0 > > ure0: flags=8847<UP,BROADCAST,DEBUG,RUNNING,SIMPLEX,MULTICAST> mtu > > 1500 lladdr 7c:c2:c6:1a:37:01 > > index 5 priority 0 llprio 3 > > media: Ethernet autoselect (100baseTX full-duplex) > > status: active > > inet 192.168.47.1 netmask 0xffffff00 broadcast > > 192.168.47.255 > > > > 6. Test ping, does not work: > > > > # ping -c3 192.168.47.2 > > PING 192.168.47.2 (192.168.47.2): 56 data bytes > > > > --- 192.168.47.2 ping statistics --- > > 3 packets transmitted, 0 packets received, 100.0% packet loss > > > > dmesg: > > > > Jul 21 19:04:51 neurus /bsd: ure0: usb error on tx: IN_PROGRESS > > Jul 21 19:04:52 neurus /bsd: usb_insert_transfer: > > xfer=0xfffffd821eeb6c08 not free > > Thanks for checking. So you see the same behavior, and the diff also > re-establishes the RX/TX state on the device after the cable re-plug, > but other than on the RTL8153, the RTL8152 still can't send out data > afterwards. > > I'm afraid without having such a device here I won't be able to help > much further. It will be too much try and error ... Last try :-) This diff also applies the RTL8152 specific media settings on the device. It still works fine for the RTL8153. Please only apply this diff when testing. Index: if_ure.c =================================================================== RCS file: /cvs/src/sys/dev/usb/if_ure.c,v retrieving revision 1.24 diff -u -p -u -p -r1.24 if_ure.c --- if_ure.c 15 Apr 2021 02:23:17 -0000 1.24 +++ if_ure.c 22 Jul 2021 07:57:23 -0000 @@ -183,6 +183,7 @@ void ure_xfer_list_free(struct ure_soft void ure_tick_task(void *); void ure_tick(void *); +void ure_ifmedia_init(struct ifnet *); int ure_ifmedia_upd(struct ifnet *); void ure_ifmedia_sts(struct ifnet *, struct ifmediareq *); void ure_add_media_types(struct ure_softc *); @@ -435,6 +436,70 @@ ure_miibus_statchg(struct device *dev) /* Lost link, do nothing. */ if ((sc->ure_flags & URE_FLAG_LINK) == 0) return; + + /* + * After a link change the media settings are getting reset on the + * hardware, and need to be re-initialized again for communication + * to continue work. + */ + ure_ifmedia_init(ifp); +} + +void +ure_ifmedia_init(struct ifnet *ifp) +{ + struct ure_softc *sc = ifp->if_softc; + uint32_t reg = 0; + + /* Set MAC address. */ + ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_CONFIG); + ure_write_mem(sc, URE_PLA_IDR, URE_MCU_TYPE_PLA | URE_BYTE_EN_SIX_BYTES, + sc->ure_ac.ac_enaddr, 8); + ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_NORAML); + + if (!(sc->ure_flags & URE_FLAG_8152)) { + 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_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); + ure_write_2(sc, URE_USB_PM_CTRL_STATUS, + URE_MCU_TYPE_USB, 1875); + } else { + ure_write_2(sc, URE_USB_RX_EARLY_SIZE, URE_MCU_TYPE_USB, + reg / 4); + switch (sc->ure_udev->speed) { + case USB_SPEED_SUPER: + reg = URE_COALESCE_SUPER / 8; + break; + case USB_SPEED_HIGH: + reg = URE_COALESCE_HIGH / 8; + break; + default: + reg = URE_COALESCE_SLOW / 8; + break; + } + ure_write_2(sc, URE_USB_RX_EARLY_AGG, URE_MCU_TYPE_USB, + reg); + } + } + + /* 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); + + /* 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)) { + ure_write_1(sc, URE_USB_UPT_RXDMA_OWN, URE_MCU_TYPE_USB, + URE_OWN_UPDATE | URE_OWN_CLEAR); + } + + URE_CLRBIT_2(sc, URE_PLA_MISC_1, URE_MCU_TYPE_PLA, URE_RXDY_GATED_EN); } int @@ -721,7 +786,6 @@ ure_init(void *xsc) struct ure_chain *c; struct ifnet *ifp = &sc->ure_ac.ac_if; usbd_status err; - uint32_t reg = 0; int s, i; s = splnet(); @@ -754,55 +818,8 @@ ure_init(void *xsc) SLIST_INSERT_HEAD(&sc->ure_cdata.ure_tx_free, &sc->ure_cdata.ure_tx_chain[i], uc_list); - /* Set MAC address. */ - ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_CONFIG); - ure_write_mem(sc, URE_PLA_IDR, URE_MCU_TYPE_PLA | URE_BYTE_EN_SIX_BYTES, - sc->ure_ac.ac_enaddr, 8); - ure_write_1(sc, URE_PLA_CRWECR, URE_MCU_TYPE_PLA, URE_CRWECR_NORAML); - - if (!(sc->ure_flags & URE_FLAG_8152)) { - 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_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); - ure_write_2(sc, URE_USB_PM_CTRL_STATUS, - URE_MCU_TYPE_USB, 1875); - } else { - ure_write_2(sc, URE_USB_RX_EARLY_SIZE, URE_MCU_TYPE_USB, - reg / 4); - switch (sc->ure_udev->speed) { - case USB_SPEED_SUPER: - reg = URE_COALESCE_SUPER / 8; - break; - case USB_SPEED_HIGH: - reg = URE_COALESCE_HIGH / 8; - break; - default: - reg = URE_COALESCE_SLOW / 8; - break; - } - ure_write_2(sc, URE_USB_RX_EARLY_AGG, URE_MCU_TYPE_USB, - reg); - } - } - - /* 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); - - /* 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)) { - ure_write_1(sc, URE_USB_UPT_RXDMA_OWN, URE_MCU_TYPE_USB, - URE_OWN_UPDATE | URE_OWN_CLEAR); - } - - URE_CLRBIT_2(sc, URE_PLA_MISC_1, URE_MCU_TYPE_PLA, URE_RXDY_GATED_EN); + /* Setup MAC address, and enable TX/RX. */ + ure_ifmedia_init(ifp); /* Load the multicast filter. */ ure_iff(sc);