Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/usb Fixes:



details:   https://anonhg.NetBSD.org/src/rev/d8636edd7b20
branches:  trunk
changeset: 454339:d8636edd7b20
user:      maxv <maxv%NetBSD.org@localhost>
date:      Sat Sep 14 12:32:08 2019 +0000

description:
Fixes:

 - Insert at the tail and not the head. I just noticed that the packets
   were in inverted order in the fifos when attaching a virtual urtw0.

 - Remove VHCI_DEBUG, which I mistakenly left enabled in rev1.

diffstat:

 sys/dev/usb/vhci.c |  120 ++++++++++++++++++++++++++++++----------------------
 1 files changed, 68 insertions(+), 52 deletions(-)

diffs (truncated from 311 to 300 lines):

diff -r 7eeec72584e5 -r d8636edd7b20 sys/dev/usb/vhci.c
--- a/sys/dev/usb/vhci.c        Sat Sep 14 11:19:38 2019 +0000
+++ b/sys/dev/usb/vhci.c        Sat Sep 14 12:32:08 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vhci.c,v 1.1 2019/09/14 06:57:52 maxv Exp $ */
+/*     $NetBSD: vhci.c,v 1.2 2019/09/14 12:32:08 maxv Exp $ */
 
 /*
  * Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vhci.c,v 1.1 2019/09/14 06:57:52 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vhci.c,v 1.2 2019/09/14 12:32:08 maxv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -62,8 +62,6 @@
 
 #include <dev/usb/usbroothub.h>
 
-#define VHCI_DEBUG
-
 #ifdef VHCI_DEBUG
 #define DPRINTF(fmt, ...)      printf(fmt, __VA_ARGS__)
 #else
@@ -126,15 +124,16 @@
 };
 
 typedef struct vhci_packet {
-       LIST_ENTRY(vhci_packet) portlist;
-       LIST_ENTRY(vhci_packet) xferlist;
+       TAILQ_ENTRY(vhci_packet) portlist;
+       TAILQ_ENTRY(vhci_packet) xferlist;
        struct usbd_xfer *xfer; /* also vxfer */
+       bool utoh;
        uint8_t *buf;
        size_t size;
        size_t cursor;
 } vhci_packet_t;
 
-typedef LIST_HEAD(, vhci_packet) vhci_packet_list_t;
+typedef TAILQ_HEAD(, vhci_packet) vhci_packet_list_t;
 
 typedef struct {
        kmutex_t lock;
@@ -158,10 +157,10 @@
        size_t refcnt;
        vhci_port_t *port;
        vhci_packet_list_t pkts;
-       LIST_ENTRY(vhci_xfer) freelist;
+       TAILQ_ENTRY(vhci_xfer) freelist;
 } vhci_xfer_t;
 
-typedef LIST_HEAD(, vhci_xfer) vhci_xfer_list_t;
+typedef TAILQ_HEAD(, vhci_xfer) vhci_xfer_list_t;
 
 #define VHCI_INDEX2PORT(idx)   (idx)
 #define VHCI_NPORTS            4
@@ -202,39 +201,48 @@
 {
        vhci_xfer_t *vxfer = (vhci_xfer_t *)xfer;
        vhci_packet_list_t *reqlist, *pktlist;
-       vhci_packet_t *req, *pkt;
+       vhci_packet_t *req, *pkt = NULL;
+       size_t refcnt = 0;
 
        /* Setup packet. */
        reqlist = &port->pkts_device_ctrl.host_to_usb;
        req = kmem_zalloc(sizeof(*req), KM_SLEEP);
        req->xfer = xfer;
+       req->utoh = false;
        req->buf = (uint8_t *)&xfer->ux_request;
        req->size = sizeof(xfer->ux_request);
        req->cursor = 0;
+       refcnt++;
 
        /* Data packet. */
-       if (usb_to_host) {
-               pktlist = &port->pkts_device_ctrl.usb_to_host;
-       } else {
-               pktlist = &port->pkts_device_ctrl.host_to_usb;
+       if (xfer->ux_length > 0) {
+               if (usb_to_host) {
+                       pktlist = &port->pkts_device_ctrl.usb_to_host;
+               } else {
+                       pktlist = &port->pkts_device_ctrl.host_to_usb;
+               }
+               pkt = kmem_zalloc(sizeof(*pkt), KM_SLEEP);
+               pkt->xfer = xfer;
+               pkt->utoh = usb_to_host;
+               pkt->buf = xfer->ux_buf;
+               pkt->size = xfer->ux_length;
+               pkt->cursor = 0;
+               refcnt++;
        }
-       pkt = kmem_zalloc(sizeof(*pkt), KM_SLEEP);
-       pkt->xfer = xfer;
-       pkt->buf = xfer->ux_buf;
-       pkt->size = xfer->ux_length;
-       pkt->cursor = 0;
 
        /* Insert in the xfer. */
-       vxfer->refcnt = 2;
+       vxfer->refcnt = refcnt;
        vxfer->port = port;
-       LIST_INIT(&vxfer->pkts);
-       LIST_INSERT_HEAD(&vxfer->pkts, req, xferlist);
-       LIST_INSERT_HEAD(&vxfer->pkts, pkt, xferlist);
+       TAILQ_INIT(&vxfer->pkts);
+       TAILQ_INSERT_TAIL(&vxfer->pkts, req, xferlist);
+       if (pkt != NULL)
+               TAILQ_INSERT_TAIL(&vxfer->pkts, pkt, xferlist);
 
        /* Insert in the port. */
        mutex_enter(&port->lock);
-       LIST_INSERT_HEAD(reqlist, req, portlist);
-       LIST_INSERT_HEAD(pktlist, pkt, portlist);
+       TAILQ_INSERT_TAIL(reqlist, req, portlist);
+       if (pkt != NULL)
+               TAILQ_INSERT_TAIL(pktlist, pkt, portlist);
        mutex_exit(&port->lock);
 }
 
@@ -244,11 +252,18 @@
        struct usbd_xfer *xfer = pkt->xfer;
        vhci_xfer_t *vxfer = (vhci_xfer_t *)xfer;
        vhci_port_t *port = vxfer->port;
+       vhci_packet_list_t *pktlist;
 
        KASSERT(mutex_owned(&port->lock));
 
-       LIST_REMOVE(pkt, portlist);
-       LIST_REMOVE(pkt, xferlist);
+       if (pkt->utoh) {
+               pktlist = &port->pkts_device_ctrl.usb_to_host;
+       } else {
+               pktlist = &port->pkts_device_ctrl.host_to_usb;
+       }
+       TAILQ_REMOVE(pktlist, pkt, portlist);
+
+       TAILQ_REMOVE(&vxfer->pkts, pkt, xferlist);
        kmem_free(pkt, sizeof(*pkt));
 
        KASSERT(vxfer->refcnt > 0);
@@ -256,7 +271,7 @@
        if (vxfer->refcnt > 0)
                return;
 
-       KASSERT(LIST_FIRST(&vxfer->pkts) == NULL);
+       KASSERT(TAILQ_FIRST(&vxfer->pkts) == NULL);
 }
 
 /* -------------------------------------------------------------------------- */
@@ -332,7 +347,7 @@
        vhci_xfer_t *vxfer = (vhci_xfer_t *)xfer;
 
        KASSERT(vxfer->refcnt == 0);
-       KASSERT(LIST_FIRST(&vxfer->pkts) == NULL);
+       KASSERT(TAILQ_FIRST(&vxfer->pkts) == NULL);
 
 #ifdef DIAGNOSTIC
        vxfer->xfer.ux_state = XFER_FREE;
@@ -540,11 +555,11 @@
 
        mutex_enter(&port->lock);
        for (; vxfer->refcnt > 0; vxfer->refcnt--) {
-               pkt = LIST_FIRST(&vxfer->pkts);
+               pkt = TAILQ_FIRST(&vxfer->pkts);
                KASSERT(pkt != NULL);
                vhci_pkt_destroy(sc, pkt);
        }
-       KASSERT(LIST_FIRST(&vxfer->pkts) == NULL);
+       KASSERT(TAILQ_FIRST(&vxfer->pkts) == NULL);
        mutex_exit(&port->lock);
 
        xfer->ux_status = USBD_CANCELLED;
@@ -728,31 +743,31 @@
        KASSERT(mutex_owned(&sc->sc_lock));
        mutex_enter(&port->lock);
 
-       LIST_INIT(&vxferlist);
+       TAILQ_INIT(&vxferlist);
 
        pktlist = &port->pkts_device_ctrl.host_to_usb;
-       LIST_FOREACH_SAFE(pkt, pktlist, portlist, nxt) {
+       TAILQ_FOREACH_SAFE(pkt, pktlist, portlist, nxt) {
                vxfer = (vhci_xfer_t *)pkt->xfer;
                KASSERT(vxfer->xfer.ux_status == USBD_IN_PROGRESS);
                vhci_pkt_destroy(sc, pkt);
                if (vxfer->refcnt == 0)
-                       LIST_INSERT_HEAD(&vxferlist, vxfer, freelist);
+                       TAILQ_INSERT_TAIL(&vxferlist, vxfer, freelist);
        }
-       KASSERT(LIST_FIRST(pktlist) == NULL);
+       KASSERT(TAILQ_FIRST(pktlist) == NULL);
 
        pktlist = &port->pkts_device_ctrl.usb_to_host;
-       LIST_FOREACH_SAFE(pkt, pktlist, portlist, nxt) {
+       TAILQ_FOREACH_SAFE(pkt, pktlist, portlist, nxt) {
                vxfer = (vhci_xfer_t *)pkt->xfer;
                KASSERT(vxfer->xfer.ux_status == USBD_IN_PROGRESS);
                vhci_pkt_destroy(sc, pkt);
                if (vxfer->refcnt == 0)
-                       LIST_INSERT_HEAD(&vxferlist, vxfer, freelist);
+                       TAILQ_INSERT_TAIL(&vxferlist, vxfer, freelist);
        }
-       KASSERT(LIST_FIRST(pktlist) == NULL);
+       KASSERT(TAILQ_FIRST(pktlist) == NULL);
 
-       while ((vxfer = LIST_FIRST(&vxferlist)) != NULL) {
+       while ((vxfer = TAILQ_FIRST(&vxferlist)) != NULL) {
                struct usbd_xfer *xfer = &vxfer->xfer;
-               LIST_REMOVE(vxfer, freelist);
+               TAILQ_REMOVE(&vxferlist, vxfer, freelist);
 
                xfer->ux_actlen = xfer->ux_length;
                xfer->ux_status = USBD_NORMAL_COMPLETION;
@@ -922,7 +937,7 @@
        port = &sc->sc_port[vfd->port];
        pktlist = &port->pkts_device_ctrl.host_to_usb;
 
-       LIST_INIT(&vxferlist);
+       TAILQ_INIT(&vxferlist);
 
        mutex_enter(&port->lock);
 
@@ -931,9 +946,10 @@
                goto out;
        }
 
-       LIST_FOREACH_SAFE(pkt, pktlist, portlist, nxt) {
+       TAILQ_FOREACH_SAFE(pkt, pktlist, portlist, nxt) {
                vxfer = (vhci_xfer_t *)pkt->xfer;
                buf = pkt->buf + pkt->cursor;
+               KASSERT(pkt->size >= pkt->cursor);
                size = uimin(uio->uio_resid, pkt->size - pkt->cursor);
 
                KASSERT(vxfer->xfer.ux_status == USBD_IN_PROGRESS);
@@ -949,7 +965,7 @@
                if (pkt->cursor == pkt->size) {
                        vhci_pkt_destroy(sc, pkt);
                        if (vxfer->refcnt == 0) {
-                               LIST_INSERT_HEAD(&vxferlist, vxfer, freelist);
+                               TAILQ_INSERT_TAIL(&vxferlist, vxfer, freelist);
                        }
                }
                if (uio->uio_resid == 0) {
@@ -960,9 +976,9 @@
 out:
        mutex_exit(&port->lock);
 
-       while ((vxfer = LIST_FIRST(&vxferlist)) != NULL) {
+       while ((vxfer = TAILQ_FIRST(&vxferlist)) != NULL) {
                struct usbd_xfer *xfer = &vxfer->xfer;
-               LIST_REMOVE(vxfer, freelist);
+               TAILQ_REMOVE(&vxferlist, vxfer, freelist);
 
                mutex_enter(&sc->sc_lock);
                xfer->ux_actlen = xfer->ux_length;
@@ -994,7 +1010,7 @@
        port = &sc->sc_port[vfd->port];
        pktlist = &port->pkts_device_ctrl.usb_to_host;
 
-       LIST_INIT(&vxferlist);
+       TAILQ_INIT(&vxferlist);
 
        mutex_enter(&port->lock);
 
@@ -1003,7 +1019,7 @@
                goto out;
        }
 
-       LIST_FOREACH_SAFE(pkt, pktlist, portlist, nxt) {
+       TAILQ_FOREACH_SAFE(pkt, pktlist, portlist, nxt) {
                vxfer = (vhci_xfer_t *)pkt->xfer;
                buf = pkt->buf + pkt->cursor;
                size = uimin(uio->uio_resid, pkt->size - pkt->cursor);
@@ -1021,7 +1037,7 @@
                if (pkt->cursor == pkt->size) {
                        vhci_pkt_destroy(sc, pkt);
                        if (vxfer->refcnt == 0) {
-                               LIST_INSERT_HEAD(&vxferlist, vxfer, freelist);
+                               TAILQ_INSERT_TAIL(&vxferlist, vxfer, freelist);
                        }
                }
                if (uio->uio_resid == 0) {
@@ -1032,9 +1048,9 @@
 out:
        mutex_exit(&port->lock);
 
-       while ((vxfer = LIST_FIRST(&vxferlist)) != NULL) {
+       while ((vxfer = TAILQ_FIRST(&vxferlist)) != NULL) {
                struct usbd_xfer *xfer = &vxfer->xfer;
-               LIST_REMOVE(vxfer, freelist);
+               TAILQ_REMOVE(&vxferlist, vxfer, freelist);
 
                mutex_enter(&sc->sc_lock);
                xfer->ux_actlen = xfer->ux_length;



Home | Main Index | Thread Index | Old Index