> On Thu, 22 Jul 2021 07:55:18 +0200
> Marcus Glocker <[email protected]> wrote:
>
> > On Wed, 21 Jul 2021 19:23:18 -0300
> > Adrian Ali <[email protected]> wrote:
> >
> > > > On Wed, 21 Jul 2021 13:46:54 -0300
> > > > Adrian Ali <[email protected]> wrote:
> > > >
> > > > > On Wed, 21 Jul 2021 08:40:34 +0200
> > > > > Marcus Glocker <[email protected]> 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);
>
>
>
>

Hi, thank you very much Marcus for your help, I understand that it is very difficult without having the device. Apply the diff and the bug persists:

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 shows nothing.

# 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=58.309 ms
64 bytes from 192.168.47.2: icmp_seq=1 ttl=255 time=0.785 ms
64 bytes from 192.168.47.2: icmp_seq=2 ttl=255 time=0.804 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.785/19.966/58.309/27.112 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

dmesg shows nothing.

5. 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

dmesg shows nothing.

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 show:

Jul 22 11:11:56 neurus /bsd: ure0: usb error on tx: IN_PROGRESS
Jul 22 11:11:56 neurus /bsd: usb_insert_transfer: xfer=0xfffffd821eeb6348 not free


Reply via email to