Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/usb xhci(4): dynamically allocate xhci_xfer->xx_trb ...



details:   https://anonhg.NetBSD.org/src/rev/4026505b1b94
branches:  trunk
changeset: 933194:4026505b1b94
user:      jakllsch <jakllsch%NetBSD.org@localhost>
date:      Thu May 21 13:47:10 2020 +0000

description:
xhci(4): dynamically allocate xhci_xfer->xx_trb buffer

Allocation size remains the same for now.

diffstat:

 sys/dev/usb/xhci.c    |  21 +++++++++++++++++----
 sys/dev/usb/xhcivar.h |   5 +++--
 2 files changed, 20 insertions(+), 6 deletions(-)

diffs (88 lines):

diff -r 6d2ec6ac1ad6 -r 4026505b1b94 sys/dev/usb/xhci.c
--- a/sys/dev/usb/xhci.c        Thu May 21 13:23:38 2020 +0000
+++ b/sys/dev/usb/xhci.c        Thu May 21 13:47:10 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: xhci.c,v 1.127 2020/05/21 13:23:38 jakllsch Exp $      */
+/*     $NetBSD: xhci.c,v 1.128 2020/05/21 13:47:10 jakllsch Exp $      */
 
 /*
  * Copyright (c) 2013 Jonathan A. Kollasch
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.127 2020/05/21 13:23:38 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.128 2020/05/21 13:47:10 jakllsch Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -520,7 +520,7 @@
 xhci_xfer_put_trb(struct xhci_xfer * const xx, u_int idx,
     uint64_t parameter, uint32_t status, uint32_t control)
 {
-       KASSERTMSG(idx < XHCI_XFER_NTRB, "idx=%u", idx);
+       KASSERTMSG(idx < xx->xx_ntrb, "idx=%u xx_ntrb=%u", idx, xx->xx_ntrb);
        xx->xx_trb[idx].trb_0 = parameter;
        xx->xx_trb[idx].trb_2 = status;
        xx->xx_trb[idx].trb_3 = control;
@@ -2241,12 +2241,20 @@
 {
        struct xhci_softc * const sc = XHCI_BUS2SC(bus);
        struct xhci_xfer *xx;
+       u_int ntrbs;
 
        XHCIHIST_FUNC(); XHCIHIST_CALLED();
 
+       ntrbs = XHCI_XFER_NTRB;
+       const size_t trbsz = sizeof(*xx->xx_trb) * ntrbs;
+
        xx = pool_cache_get(sc->sc_xferpool, PR_WAITOK);
        if (xx != NULL) {
                memset(xx, 0, sizeof(*xx));
+               if (ntrbs > 0) {
+                       xx->xx_trb = kmem_alloc(trbsz, KM_SLEEP);
+                       xx->xx_ntrb = ntrbs;
+               }
 #ifdef DIAGNOSTIC
                xx->xx_xfer.ux_state = XFER_BUSY;
 #endif
@@ -2271,6 +2279,11 @@
        }
        xfer->ux_state = XFER_FREE;
 #endif
+       if (xx->xx_ntrb > 0) {
+               kmem_free(xx->xx_trb, xx->xx_ntrb * sizeof(*xx->xx_trb));
+               xx->xx_trb = NULL;
+               xx->xx_ntrb = 0;
+       }
        pool_cache_put(sc->sc_xferpool, xx);
 }
 
@@ -2675,7 +2688,7 @@
 xhci_ring_put_xfer(struct xhci_softc * const sc, struct xhci_ring * const tr,
     struct xhci_xfer *xx, u_int ntrb)
 {
-       KASSERT(ntrb <= XHCI_XFER_NTRB);
+       KASSERT(ntrb <= xx->xx_ntrb);
        xhci_ring_put(sc, tr, xx, xx->xx_trb, ntrb);
 }
 
diff -r 6d2ec6ac1ad6 -r 4026505b1b94 sys/dev/usb/xhcivar.h
--- a/sys/dev/usb/xhcivar.h     Thu May 21 13:23:38 2020 +0000
+++ b/sys/dev/usb/xhcivar.h     Thu May 21 13:47:10 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: xhcivar.h,v 1.14 2020/05/19 18:18:33 jakllsch Exp $    */
+/*     $NetBSD: xhcivar.h,v 1.15 2020/05/21 13:47:10 jakllsch Exp $    */
 
 /*
  * Copyright (c) 2013 Jonathan A. Kollasch
@@ -42,7 +42,8 @@
 
 struct xhci_xfer {
        struct usbd_xfer xx_xfer;
-       struct xhci_soft_trb xx_trb[XHCI_XFER_NTRB];
+       struct xhci_soft_trb *xx_trb;
+       u_int xx_ntrb;
 };
 
 #define XHCI_BUS2SC(bus)       ((bus)->ub_hcpriv)



Home | Main Index | Thread Index | Old Index