Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-9]: src/sys/dev/usb Pull up following revision(s) (requested by m...



details:   https://anonhg.NetBSD.org/src/rev/c6639a034d4f
branches:  netbsd-9
changeset: 1000838:c6639a034d4f
user:      martin <martin%NetBSD.org@localhost>
date:      Fri Sep 13 06:51:58 2019 +0000

description:
Pull up following revision(s) (requested by mrg in ticket #197):

        sys/dev/usb/if_url.c: revision 1.71
        sys/dev/usb/usbnet.h: revision 1.15
        sys/dev/usb/usb_mem.c: revision 1.72
        sys/dev/usb/if_urndis.c: revision 1.24
        sys/dev/usb/if_upl.c: revision 1.67
        sys/dev/usb/usbnet.c: revision 1.25
        sys/dev/usb/usbnet.c: revision 1.26
        sys/dev/usb/usbnet.c: revision 1.27
        sys/dev/usb/usbnet.c: revision 1.28

Teach urndis to handle some REMOTE_NDIS_INDICATE_STATUS_MSG. If the status
is reasonable, don't tell userland we got an error. Stops spurious EIO.
>From openbsd.

Fix bug, remove {0,0} because we switched to usb_lookup().

s/no free/no freelist entry/ in a debug message.

fix a lock hang reported by sc.dying in PR#54495.

remove locking in usbnet_tick().  assume that all locking
needs are handled inside usbnet_tick_task(), which runs in
the usbtask thread.  ensure that usbnet private is valid
before using it.

also check NULL private pointer in usbnet_isdying().
all the other cases should never happen.

don't try to set dying when we haven't usbnet_attach()d yet.
reported by maxv.

- use CALLARGS vs CALLED for better usbhist
- turn off usbnetdebug default
- log for all entry/exit points of usbnet_pipe_intr()
- in usbnet_start_locked() track whether any packet has been
  transmitted for setting the timer.  avoids spurious
  "watchdog timeouts"
- in usbnet_stop() use callout_halt() vs callout_halt, and
  also stop the usb task.  fixes crash of usbtask after the
  phy has detached.
- add a little more defensive checking in the tick task, and
  add some high-log-level logs.
- in usbnet_detach() move the call to usbnet_stop_ifp() above
  the calls to callout/usbtask stopping.
- set ec_mii and unp_pri to NULL when freeing their data

normalise an error message.

document usbnet_private locking.  minor knf.

diffstat:

 sys/dev/usb/if_upl.c    |   7 ++--
 sys/dev/usb/if_url.c    |  12 ++++----
 sys/dev/usb/if_urndis.c |  42 ++++++++++++++++++++++++++++-
 sys/dev/usb/usb_mem.c   |   6 ++--
 sys/dev/usb/usbnet.c    |  70 +++++++++++++++++++++++++++++++++++++-----------
 sys/dev/usb/usbnet.h    |   5 ++-
 6 files changed, 109 insertions(+), 33 deletions(-)

diffs (truncated from 448 to 300 lines):

diff -r 2c2fb8a69627 -r c6639a034d4f sys/dev/usb/if_upl.c
--- a/sys/dev/usb/if_upl.c      Fri Sep 13 06:32:11 2019 +0000
+++ b/sys/dev/usb/if_upl.c      Fri Sep 13 06:51:58 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_upl.c,v 1.64.2.1 2019/09/01 13:00:36 martin Exp $   */
+/*     $NetBSD: if_upl.c,v 1.64.2.2 2019/09/13 06:51:58 martin Exp $   */
 
 /*
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.64.2.1 2019/09/01 13:00:36 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.64.2.2 2019/09/13 06:51:58 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -95,8 +95,7 @@
        { USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2302 },
        { USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL25A1 },
        { USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U258 },
-       { USB_VENDOR_NI, USB_PRODUCT_NI_HTOH_7825 },
-       { 0, 0 }
+       { USB_VENDOR_NI, USB_PRODUCT_NI_HTOH_7825 }
 };
 
 int    upl_match(device_t, cfdata_t, void *);
diff -r 2c2fb8a69627 -r c6639a034d4f sys/dev/usb/if_url.c
--- a/sys/dev/usb/if_url.c      Fri Sep 13 06:32:11 2019 +0000
+++ b/sys/dev/usb/if_url.c      Fri Sep 13 06:51:58 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_url.c,v 1.66.2.1 2019/09/01 13:00:36 martin Exp $   */
+/*     $NetBSD: if_url.c,v 1.66.2.2 2019/09/13 06:51:58 martin Exp $   */
 
 /*
  * Copyright (c) 2001, 2002
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.66.2.1 2019/09/01 13:00:36 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.66.2.2 2019/09/13 06:51:58 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -190,7 +190,7 @@
        if (err) {
                aprint_error_dev(self, "failed to set configuration"
                    ", err=%s\n", usbd_errstr(err));
-               goto bad;
+               return;
        }
 
        /* get control interface */
@@ -198,7 +198,7 @@
        if (err) {
                aprint_error_dev(self, "failed to get interface, err=%s\n",
                       usbd_errstr(err));
-               goto bad;
+               return;
        }
 
        un->un_iface = iface;
@@ -221,7 +221,7 @@
                if (ed == NULL) {
                        aprint_error_dev(self,
                            "couldn't get endpoint %d\n", i);
-                       goto bad;
+                       return;
                }
                if ((ed->bmAttributes & UE_XFERTYPE) == UE_BULK &&
                    UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN)
@@ -238,7 +238,7 @@
            un->un_ed[USBNET_ENDPT_TX] == 0 ||
            un->un_ed[USBNET_ENDPT_INTR] == 0) {
                aprint_error_dev(self, "missing endpoint\n");
-               goto bad;
+               return;
        }
 
        /* Set these up now for url_mem().  */
diff -r 2c2fb8a69627 -r c6639a034d4f sys/dev/usb/if_urndis.c
--- a/sys/dev/usb/if_urndis.c   Fri Sep 13 06:32:11 2019 +0000
+++ b/sys/dev/usb/if_urndis.c   Fri Sep 13 06:51:58 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_urndis.c,v 1.21.4.1 2019/09/01 13:00:36 martin Exp $ */
+/*     $NetBSD: if_urndis.c,v 1.21.4.2 2019/09/13 06:51:58 martin Exp $ */
 /*     $OpenBSD: if_urndis.c,v 1.31 2011/07/03 15:47:17 matthew Exp $ */
 
 /*
@@ -21,7 +21,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_urndis.c,v 1.21.4.1 2019/09/01 13:00:36 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urndis.c,v 1.21.4.2 2019/09/13 06:51:58 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -79,6 +79,8 @@
     const struct rndis_comp_hdr *, void **, size_t *);
 static uint32_t urndis_ctrl_handle_reset(struct usbnet *,
     const struct rndis_comp_hdr *);
+static uint32_t urndis_ctrl_handle_status(struct usbnet *,
+    const struct rndis_comp_hdr *);
 
 static uint32_t urndis_ctrl_set(struct usbnet *, uint32_t, void *,
     size_t);
@@ -207,6 +209,10 @@
                        rval = le32toh(hdr->rm_status);
                        break;
 
+               case REMOTE_NDIS_INDICATE_STATUS_MSG:
+                       rval = urndis_ctrl_handle_status(un, hdr);
+                       break;
+
                default:
                        printf("%s: ctrl message error: unknown event 0x%x\n",
                            DEVNAME(un), le32toh(hdr->rm_type));
@@ -380,6 +386,38 @@
 }
 
 static uint32_t
+urndis_ctrl_handle_status(struct usbnet *un,
+    const struct rndis_comp_hdr *hdr)
+{
+       const struct rndis_status_msg   *msg;
+       uint32_t                        rval;
+
+       msg = (const struct rndis_status_msg *)hdr;
+
+       rval = le32toh(msg->rm_status);
+
+       DPRINTF(("%s: urndis_ctrl_handle_status: len %u status 0x%x "
+           "stbuflen %u\n",
+           DEVNAME(un),
+           le32toh(msg->rm_len),
+           rval,
+           le32toh(msg->rm_stbuflen)));
+
+       switch (rval) {
+               case RNDIS_STATUS_MEDIA_CONNECT:
+               case RNDIS_STATUS_MEDIA_DISCONNECT:
+               case RNDIS_STATUS_OFFLOAD_CURRENT_CONFIG:
+                       rval = RNDIS_STATUS_SUCCESS;
+                       break;
+
+               default:
+                       printf("%s: status 0x%x\n", DEVNAME(un), rval);
+       }
+
+       return rval;
+}
+
+static uint32_t
 urndis_ctrl_init(struct usbnet *un)
 {
        struct rndis_init_req   *msg;
diff -r 2c2fb8a69627 -r c6639a034d4f sys/dev/usb/usb_mem.c
--- a/sys/dev/usb/usb_mem.c     Fri Sep 13 06:32:11 2019 +0000
+++ b/sys/dev/usb/usb_mem.c     Fri Sep 13 06:51:58 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: usb_mem.c,v 1.70.10.1 2019/09/01 13:00:36 martin Exp $ */
+/*     $NetBSD: usb_mem.c,v 1.70.10.2 2019/09/13 06:51:58 martin Exp $ */
 
 /*
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb_mem.c,v 1.70.10.1 2019/09/01 13:00:36 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb_mem.c,v 1.70.10.2 2019/09/13 06:51:58 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -136,7 +136,7 @@
                }
        }
 
-       DPRINTFN(6, "no free", 0, 0, 0, 0);
+       DPRINTFN(6, "no freelist entry", 0, 0, 0, 0);
        mutex_exit(&usb_blk_lock);
 
        b = kmem_zalloc(sizeof(*b), KM_SLEEP);
diff -r 2c2fb8a69627 -r c6639a034d4f sys/dev/usb/usbnet.c
--- a/sys/dev/usb/usbnet.c      Fri Sep 13 06:32:11 2019 +0000
+++ b/sys/dev/usb/usbnet.c      Fri Sep 13 06:51:58 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: usbnet.c,v 1.25.2.2 2019/09/01 13:00:36 martin Exp $   */
+/*     $NetBSD: usbnet.c,v 1.25.2.3 2019/09/13 06:51:58 martin Exp $   */
 
 /*
  * Copyright (c) 2019 Matthew R. Green
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.25.2.2 2019/09/01 13:00:36 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.25.2.3 2019/09/13 06:51:58 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -59,6 +59,11 @@
         * - unp_rxlock protects the rx path and its data
         * - unp_txlock protects the tx path and its data
         * - unp_detachcv handles detach vs open references
+        *
+        * the lock ordering is:
+        *      ifnet lock -> unp_lock -> unp_rxlock -> unp_txlock
+        *      unp_lock -> unp_miilock
+        * and unp_lock may be dropped after taking unp_miilock.
         */
        kmutex_t                unp_lock;
        kmutex_t                unp_miilock;
@@ -101,7 +106,7 @@
 #ifndef USBNET_DEBUG
 #define usbnetdebug 0
 #else
-static int usbnetdebug = 1;
+static int usbnetdebug = 0;
 
 SYSCTL_SETUP(sysctl_hw_usbnet_setup, "sysctl hw.usbnet setup")
 {
@@ -418,6 +423,7 @@
 static void
 usbnet_pipe_intr(struct usbd_xfer *xfer, void *priv, usbd_status status)
 {
+       USBNETHIST_FUNC();
        struct usbnet * const un = priv;
        struct usbnet_private * const unp = un->un_pri;
        struct usbnet_intr * const uni = un->un_intr;
@@ -425,8 +431,12 @@
 
        if (uni == NULL || unp->unp_dying || unp->unp_stopping ||
            status == USBD_INVAL || status == USBD_NOT_STARTED ||
-           status == USBD_CANCELLED || !(ifp->if_flags & IFF_RUNNING))
+           status == USBD_CANCELLED || !(ifp->if_flags & IFF_RUNNING)) {
+               USBNETHIST_CALLARGS("%d: uni %jx d/s %x status %x",
+                   unp->unp_number, (uintptr_t)uni,
+                   (unp->unp_dying << 8) | unp->unp_stopping, status);
                return;
+       }
 
        if (status != USBD_NORMAL_COMPLETION) {
                if (usbd_ratecheck(&unp->unp_intr_notice)) {
@@ -435,6 +445,8 @@
                }
                if (status == USBD_STALLED)
                        usbd_clear_endpoint_stall_async(unp->unp_ep[USBNET_ENDPT_INTR]);
+               USBNETHIST_CALLARGS("%d: not normal status %x",
+                   unp->unp_number, status, 0, 0);
                return;
        }
 
@@ -444,14 +456,19 @@
 static void
 usbnet_start_locked(struct ifnet *ifp)
 {
-       USBNETHIST_FUNC(); USBNETHIST_CALLED();
+       USBNETHIST_FUNC();
        struct usbnet * const un = ifp->if_softc;
        struct usbnet_cdata * const cd = un_cdata(un);
        struct usbnet_private * const unp = un->un_pri;
        struct mbuf *m;
        unsigned length;
+       bool done_transmit = false;
        int idx;
 
+       USBNETHIST_CALLARGS("%d: tx_cnt %d list_cnt %d link %d",
+           unp->unp_number, cd->uncd_tx_cnt, un->un_tx_list_cnt,
+           unp->unp_link);
+
        usbnet_isowned_tx(un);
        KASSERT(cd->uncd_tx_cnt <= un->un_tx_list_cnt);
 
@@ -502,6 +519,7 @@
                        ifp->if_oerrors++;
                        break;
                }
+               done_transmit = true;
 
                IFQ_DEQUEUE(&ifp->if_snd, m);
 
@@ -517,10 +535,14 @@
        }
        cd->uncd_tx_prod = idx;
 
+       DPRINTF("finished with start; tx_cnt %d list_cnt %d link %d",
+           cd->uncd_tx_cnt, un->un_tx_list_cnt, unp->unp_link, 0);
+
        /*
         * Set a timeout in case the chip goes out to lunch.
         */
-       unp->unp_timer = 5;
+       if (done_transmit)
+               unp->unp_timer = 5;
 }
 



Home | Main Index | Thread Index | Old Index