Marcus Glocker:

> > This constifies the bus method and pipe method tables in our USB
> > host controller drivers.
> 
> dwctwo(4) also exists on arm64.

Oops, right.  That arch I have.

The USB host controller drivers also have another set of tables to
emulate the root hub.  I have extended the diff to constify those
as well.  xhci(4) and dwctwo(4) were already (partially) done.

The *_devd descriptor template poses a problem, because its idVendor
member is modified before the descriptor is memcpy()'ed into a
transmit buffer.  The copy can be truncated, so reordering the
operations would lead to much ugliness.  I have introduced a temporary
variable at the cost of another copy.  The code already does this
for the *_hubd descriptor.

The NetBSD author of dwctwo(4) also ran into this problem, but
didn't solve it, simply never setting idVendor, for which there is
also no ready source absent a PCI bus attachment.  I _think_ the
FreeBSD code for all host controllers doesn't bother setting idVendor
either, so that may be another solution.

Comments, okays?

diff refs/heads/master refs/heads/usb
blob - 9b9d1635f902afef00a4111dfba8f86d13f74b4e
blob + 64dea91909ed4f77f7f24c61dd1c09809d27d031
--- sys/dev/usb/dwc2/dwc2.c
+++ sys/dev/usb/dwc2/dwc2.c
@@ -146,7 +146,7 @@ dwc2_free_bus_bandwidth(struct dwc2_hsotg *hsotg, u16 
 
 #define DWC2_INTR_ENDPT 1
 
-STATIC struct usbd_bus_methods dwc2_bus_methods = {
+STATIC const struct usbd_bus_methods dwc2_bus_methods = {
        .open_pipe =    dwc2_open,
        .dev_setaddr =  dwc2_setaddr,
        .soft_intr =    dwc2_softintr,
@@ -155,7 +155,7 @@ STATIC struct usbd_bus_methods dwc2_bus_methods = {
        .freex =        dwc2_freex,
 };
 
-STATIC struct usbd_pipe_methods dwc2_root_ctrl_methods = {
+STATIC const struct usbd_pipe_methods dwc2_root_ctrl_methods = {
        .transfer =     dwc2_root_ctrl_transfer,
        .start =        dwc2_root_ctrl_start,
        .abort =        dwc2_root_ctrl_abort,
@@ -164,7 +164,7 @@ STATIC struct usbd_pipe_methods dwc2_root_ctrl_methods
        .done =         dwc2_root_ctrl_done,
 };
 
-STATIC struct usbd_pipe_methods dwc2_root_intr_methods = {
+STATIC const struct usbd_pipe_methods dwc2_root_intr_methods = {
        .transfer =     dwc2_root_intr_transfer,
        .start =        dwc2_root_intr_start,
        .abort =        dwc2_root_intr_abort,
@@ -173,7 +173,7 @@ STATIC struct usbd_pipe_methods dwc2_root_intr_methods
        .done =         dwc2_root_intr_done,
 };
 
-STATIC struct usbd_pipe_methods dwc2_device_ctrl_methods = {
+STATIC const struct usbd_pipe_methods dwc2_device_ctrl_methods = {
        .transfer =     dwc2_device_ctrl_transfer,
        .start =        dwc2_device_ctrl_start,
        .abort =        dwc2_device_ctrl_abort,
@@ -182,7 +182,7 @@ STATIC struct usbd_pipe_methods dwc2_device_ctrl_metho
        .done =         dwc2_device_ctrl_done,
 };
 
-STATIC struct usbd_pipe_methods dwc2_device_intr_methods = {
+STATIC const struct usbd_pipe_methods dwc2_device_intr_methods = {
        .transfer =     dwc2_device_intr_transfer,
        .start =        dwc2_device_intr_start,
        .abort =        dwc2_device_intr_abort,
@@ -191,7 +191,7 @@ STATIC struct usbd_pipe_methods dwc2_device_intr_metho
        .done =         dwc2_device_intr_done,
 };
 
-STATIC struct usbd_pipe_methods dwc2_device_bulk_methods = {
+STATIC const struct usbd_pipe_methods dwc2_device_bulk_methods = {
        .transfer =     dwc2_device_bulk_transfer,
        .start =        dwc2_device_bulk_start,
        .abort =        dwc2_device_bulk_abort,
@@ -200,7 +200,7 @@ STATIC struct usbd_pipe_methods dwc2_device_bulk_metho
        .done =         dwc2_device_bulk_done,
 };
 
-STATIC struct usbd_pipe_methods dwc2_device_isoc_methods = {
+STATIC const struct usbd_pipe_methods dwc2_device_isoc_methods = {
        .transfer =     dwc2_device_isoc_transfer,
        .start =        dwc2_device_isoc_start,
        .abort =        dwc2_device_isoc_abort,
@@ -681,7 +681,6 @@ dwc2_root_ctrl_start(struct usbd_xfer *xfer)
                switch (value) {
                case C(0, UDESC_DEVICE):
                        l = min(len, USB_DEVICE_DESCRIPTOR_SIZE);
-//                     USETW(dwc2_devd.idVendor, sc->sc_id_vendor);
                        memcpy(buf, &dwc2_devd, l);
                        buf += l;
                        len -= l;
blob - 350580c00b30f8edcfd5edf8ad8d1734624462c6
blob + 834e97310fb06a73bc569a943e4b0e7906c136d5
--- sys/dev/usb/ehci.c
+++ sys/dev/usb/ehci.c
@@ -218,7 +218,7 @@ void                ehci_dump_exfer(struct ehci_xfer *);
 
 #define EHCI_INTR_ENDPT 1
 
-struct usbd_bus_methods ehci_bus_methods = {
+const struct usbd_bus_methods ehci_bus_methods = {
        .open_pipe = ehci_open,
        .dev_setaddr = ehci_setaddr,
        .soft_intr = ehci_softintr,
@@ -227,7 +227,7 @@ struct usbd_bus_methods ehci_bus_methods = {
        .freex = ehci_freex,
 };
 
-struct usbd_pipe_methods ehci_root_ctrl_methods = {
+const struct usbd_pipe_methods ehci_root_ctrl_methods = {
        .transfer = ehci_root_ctrl_transfer,
        .start = ehci_root_ctrl_start,
        .abort = ehci_root_ctrl_abort,
@@ -235,7 +235,7 @@ struct usbd_pipe_methods ehci_root_ctrl_methods = {
        .done = ehci_root_ctrl_done,
 };
 
-struct usbd_pipe_methods ehci_root_intr_methods = {
+const struct usbd_pipe_methods ehci_root_intr_methods = {
        .transfer = ehci_root_intr_transfer,
        .start = ehci_root_intr_start,
        .abort = ehci_root_intr_abort,
@@ -243,7 +243,7 @@ struct usbd_pipe_methods ehci_root_intr_methods = {
        .done = ehci_root_intr_done,
 };
 
-struct usbd_pipe_methods ehci_device_ctrl_methods = {
+const struct usbd_pipe_methods ehci_device_ctrl_methods = {
        .transfer = ehci_device_ctrl_transfer,
        .start = ehci_device_ctrl_start,
        .abort = ehci_device_ctrl_abort,
@@ -251,7 +251,7 @@ struct usbd_pipe_methods ehci_device_ctrl_methods = {
        .done = ehci_device_ctrl_done,
 };
 
-struct usbd_pipe_methods ehci_device_intr_methods = {
+const struct usbd_pipe_methods ehci_device_intr_methods = {
        .transfer = ehci_device_intr_transfer,
        .start = ehci_device_intr_start,
        .abort = ehci_device_intr_abort,
@@ -260,7 +260,7 @@ struct usbd_pipe_methods ehci_device_intr_methods = {
        .done = ehci_device_intr_done,
 };
 
-struct usbd_pipe_methods ehci_device_bulk_methods = {
+const struct usbd_pipe_methods ehci_device_bulk_methods = {
        .transfer = ehci_device_bulk_transfer,
        .start = ehci_device_bulk_start,
        .abort = ehci_device_bulk_abort,
@@ -269,7 +269,7 @@ struct usbd_pipe_methods ehci_device_bulk_methods = {
        .done = ehci_device_bulk_done,
 };
 
-struct usbd_pipe_methods ehci_device_isoc_methods = {
+const struct usbd_pipe_methods ehci_device_isoc_methods = {
        .transfer = ehci_device_isoc_transfer,
        .start = ehci_device_isoc_start,
        .abort = ehci_device_isoc_abort,
@@ -1705,7 +1705,7 @@ ehci_free_itd_chain(struct ehci_softc *sc, struct ehci
 /*
  * Data structures and routines to emulate the root hub.
  */
-usb_device_descriptor_t ehci_devd = {
+const usb_device_descriptor_t ehci_devd = {
        USB_DEVICE_DESCRIPTOR_SIZE,
        UDESC_DEVICE,           /* type */
        {0x00, 0x02},           /* USB version */
@@ -1718,7 +1718,7 @@ usb_device_descriptor_t ehci_devd = {
        1                       /* # of configurations */
 };
 
-usb_device_qualifier_t ehci_odevd = {
+const usb_device_qualifier_t ehci_odevd = {
        USB_DEVICE_DESCRIPTOR_SIZE,
        UDESC_DEVICE_QUALIFIER, /* type */
        {0x00, 0x02},           /* USB version */
@@ -1730,7 +1730,7 @@ usb_device_qualifier_t ehci_odevd = {
        0
 };
 
-usb_config_descriptor_t ehci_confd = {
+const usb_config_descriptor_t ehci_confd = {
        USB_CONFIG_DESCRIPTOR_SIZE,
        UDESC_CONFIG,
        {USB_CONFIG_DESCRIPTOR_SIZE +
@@ -1743,7 +1743,7 @@ usb_config_descriptor_t ehci_confd = {
        0                       /* max power */
 };
 
-usb_interface_descriptor_t ehci_ifcd = {
+const usb_interface_descriptor_t ehci_ifcd = {
        USB_INTERFACE_DESCRIPTOR_SIZE,
        UDESC_INTERFACE,
        0,
@@ -1755,7 +1755,7 @@ usb_interface_descriptor_t ehci_ifcd = {
        0
 };
 
-usb_endpoint_descriptor_t ehci_endpd = {
+const usb_endpoint_descriptor_t ehci_endpd = {
        USB_ENDPOINT_DESCRIPTOR_SIZE,
        UDESC_ENDPOINT,
        UE_DIR_IN | EHCI_INTR_ENDPT,
@@ -1764,7 +1764,7 @@ usb_endpoint_descriptor_t ehci_endpd = {
        12
 };
 
-usb_hub_descriptor_t ehci_hubd = {
+const usb_hub_descriptor_t ehci_hubd = {
        USB_HUB_DESCRIPTOR_SIZE,
        UDESC_HUB,
        0,
@@ -1800,6 +1800,7 @@ ehci_root_ctrl_start(struct usbd_xfer *xfer)
        int port, i;
        int s, len, value, index, l, totlen = 0;
        usb_port_status_t ps;
+       usb_device_descriptor_t devd;
        usb_hub_descriptor_t hubd;
        usbd_status err;
        u_int32_t v;
@@ -1848,9 +1849,10 @@ ehci_root_ctrl_start(struct usbd_xfer *xfer)
                                err = USBD_IOERROR;
                                goto ret;
                        }
+                       devd = ehci_devd;
+                       USETW(devd.idVendor, sc->sc_id_vendor);
                        totlen = l = min(len, USB_DEVICE_DESCRIPTOR_SIZE);
-                       USETW(ehci_devd.idVendor, sc->sc_id_vendor);
-                       memcpy(buf, &ehci_devd, l);
+                       memcpy(buf, &devd, l);
                        break;
                case UDESC_DEVICE_QUALIFIER:
                        if ((value & 0xff) != 0) {
blob - 041e8328e9a0cd0a644eb45e50bc6ed478656640
blob + 9805c9596a2ab92bb4d13b018ffc4c6f49f2ecae
--- sys/dev/usb/ohci.c
+++ sys/dev/usb/ohci.c
@@ -197,7 +197,7 @@ OREAD4(struct ohci_softc *sc, bus_size_t r)
 }
 
 /* Reverse the bits in a value 0 .. 31 */
-u_int8_t revbits[OHCI_NO_INTRS] =
+const u_int8_t revbits[OHCI_NO_INTRS] =
   { 0x00, 0x10, 0x08, 0x18, 0x04, 0x14, 0x0c, 0x1c,
     0x02, 0x12, 0x0a, 0x1a, 0x06, 0x16, 0x0e, 0x1e,
     0x01, 0x11, 0x09, 0x19, 0x05, 0x15, 0x0d, 0x1d,
@@ -229,7 +229,7 @@ struct ohci_pipe {
 
 #define OHCI_INTR_ENDPT 1
 
-struct usbd_bus_methods ohci_bus_methods = {
+const struct usbd_bus_methods ohci_bus_methods = {
        .open_pipe = ohci_open,
        .dev_setaddr = ohci_setaddr,
        .soft_intr = ohci_softintr,
@@ -238,7 +238,7 @@ struct usbd_bus_methods ohci_bus_methods = {
        .freex = ohci_freex,
 };
 
-struct usbd_pipe_methods ohci_root_ctrl_methods = {
+const struct usbd_pipe_methods ohci_root_ctrl_methods = {
        .transfer = ohci_root_ctrl_transfer,
        .start = ohci_root_ctrl_start,
        .abort = ohci_root_ctrl_abort,
@@ -246,7 +246,7 @@ struct usbd_pipe_methods ohci_root_ctrl_methods = {
        .done = ohci_root_ctrl_done,
 };
 
-struct usbd_pipe_methods ohci_root_intr_methods = {
+const struct usbd_pipe_methods ohci_root_intr_methods = {
        .transfer = ohci_root_intr_transfer,
        .start = ohci_root_intr_start,
        .abort = ohci_root_intr_abort,
@@ -254,7 +254,7 @@ struct usbd_pipe_methods ohci_root_intr_methods = {
        .done = ohci_root_intr_done,
 };
 
-struct usbd_pipe_methods ohci_device_ctrl_methods = {
+const struct usbd_pipe_methods ohci_device_ctrl_methods = {
        .transfer = ohci_device_ctrl_transfer,
        .start = ohci_device_ctrl_start,
        .abort = ohci_device_ctrl_abort,
@@ -262,7 +262,7 @@ struct usbd_pipe_methods ohci_device_ctrl_methods = {
        .done = ohci_device_ctrl_done,
 };
 
-struct usbd_pipe_methods ohci_device_intr_methods = {
+const struct usbd_pipe_methods ohci_device_intr_methods = {
        .transfer = ohci_device_intr_transfer,
        .start = ohci_device_intr_start,
        .abort = ohci_device_intr_abort,
@@ -271,7 +271,7 @@ struct usbd_pipe_methods ohci_device_intr_methods = {
        .done = ohci_device_intr_done,
 };
 
-struct usbd_pipe_methods ohci_device_bulk_methods = {
+const struct usbd_pipe_methods ohci_device_bulk_methods = {
        .transfer = ohci_device_bulk_transfer,
        .start = ohci_device_bulk_start,
        .abort = ohci_device_bulk_abort,
@@ -280,7 +280,7 @@ struct usbd_pipe_methods ohci_device_bulk_methods = {
        .done = ohci_device_bulk_done,
 };
 
-struct usbd_pipe_methods ohci_device_isoc_methods = {
+const struct usbd_pipe_methods ohci_device_isoc_methods = {
        .transfer = ohci_device_isoc_transfer,
        .start = ohci_device_isoc_start,
        .abort = ohci_device_isoc_abort,
@@ -1153,7 +1153,7 @@ ohci_rhsc_enable(void *v_sc)
 }
 
 #ifdef OHCI_DEBUG
-char *ohci_cc_strs[] = {
+const char *ohci_cc_strs[] = {
        "NO_ERROR",
        "CRC",
        "BIT_STUFFING",
@@ -2189,7 +2189,7 @@ ohci_abort_xfer(struct usbd_xfer *xfer, usbd_status st
 /*
  * Data structures and routines to emulate the root hub.
  */
-usb_device_descriptor_t ohci_devd = {
+const usb_device_descriptor_t ohci_devd = {
        USB_DEVICE_DESCRIPTOR_SIZE,
        UDESC_DEVICE,           /* type */
        {0x00, 0x01},           /* USB version */
@@ -2202,7 +2202,7 @@ usb_device_descriptor_t ohci_devd = {
        1                       /* # of configurations */
 };
 
-usb_config_descriptor_t ohci_confd = {
+const usb_config_descriptor_t ohci_confd = {
        USB_CONFIG_DESCRIPTOR_SIZE,
        UDESC_CONFIG,
        {USB_CONFIG_DESCRIPTOR_SIZE +
@@ -2215,7 +2215,7 @@ usb_config_descriptor_t ohci_confd = {
        0                       /* max power */
 };
 
-usb_interface_descriptor_t ohci_ifcd = {
+const usb_interface_descriptor_t ohci_ifcd = {
        USB_INTERFACE_DESCRIPTOR_SIZE,
        UDESC_INTERFACE,
        0,
@@ -2227,7 +2227,7 @@ usb_interface_descriptor_t ohci_ifcd = {
        0
 };
 
-usb_endpoint_descriptor_t ohci_endpd = {
+const usb_endpoint_descriptor_t ohci_endpd = {
        USB_ENDPOINT_DESCRIPTOR_SIZE,
        UDESC_ENDPOINT,
        UE_DIR_IN | OHCI_INTR_ENDPT,
@@ -2236,7 +2236,7 @@ usb_endpoint_descriptor_t ohci_endpd = {
        255
 };
 
-usb_hub_descriptor_t ohci_hubd = {
+const usb_hub_descriptor_t ohci_hubd = {
        USB_HUB_DESCRIPTOR_SIZE,
        UDESC_HUB,
        0,
@@ -2272,6 +2272,7 @@ ohci_root_ctrl_start(struct usbd_xfer *xfer)
        int port, i;
        int s, len, value, index, l, totlen = 0;
        usb_port_status_t ps;
+       usb_device_descriptor_t devd;
        usb_hub_descriptor_t hubd;
        usbd_status err;
        u_int32_t v;
@@ -2320,9 +2321,10 @@ ohci_root_ctrl_start(struct usbd_xfer *xfer)
                                err = USBD_IOERROR;
                                goto ret;
                        }
+                       devd = ohci_devd;
+                       USETW(devd.idVendor, sc->sc_id_vendor);
                        totlen = l = min(len, USB_DEVICE_DESCRIPTOR_SIZE);
-                       USETW(ohci_devd.idVendor, sc->sc_id_vendor);
-                       memcpy(buf, &ohci_devd, l);
+                       memcpy(buf, &devd, l);
                        break;
                case UDESC_CONFIG:
                        if ((value & 0xff) != 0) {
blob - 51fed2c96833b7b67f045db0b2cd938b99e7bec7
blob + 9bbd243cf425f85155a48e2e7e139ea2f5b2c4aa
--- sys/dev/usb/uhci.c
+++ sys/dev/usb/uhci.c
@@ -246,7 +246,7 @@ UREAD4(struct uhci_softc *sc, bus_size_t r)
 
 #define UHCI_INTR_ENDPT 1
 
-struct usbd_bus_methods uhci_bus_methods = {
+const struct usbd_bus_methods uhci_bus_methods = {
        .open_pipe = uhci_open,
        .dev_setaddr = usbd_set_address,
        .soft_intr = uhci_softintr,
@@ -255,7 +255,7 @@ struct usbd_bus_methods uhci_bus_methods = {
        .freex = uhci_freex,
 };
 
-struct usbd_pipe_methods uhci_root_ctrl_methods = {
+const struct usbd_pipe_methods uhci_root_ctrl_methods = {
        .transfer = uhci_root_ctrl_transfer,
        .start = uhci_root_ctrl_start,
        .abort = uhci_root_ctrl_abort,
@@ -263,7 +263,7 @@ struct usbd_pipe_methods uhci_root_ctrl_methods = {
        .done = uhci_root_ctrl_done,
 };
 
-struct usbd_pipe_methods uhci_root_intr_methods = {
+const struct usbd_pipe_methods uhci_root_intr_methods = {
        .transfer = uhci_root_intr_transfer,
        .start = uhci_root_intr_start,
        .abort = uhci_root_intr_abort,
@@ -271,7 +271,7 @@ struct usbd_pipe_methods uhci_root_intr_methods = {
        .done = uhci_root_intr_done,
 };
 
-struct usbd_pipe_methods uhci_device_ctrl_methods = {
+const struct usbd_pipe_methods uhci_device_ctrl_methods = {
        .transfer = uhci_device_ctrl_transfer,
        .start = uhci_device_ctrl_start,
        .abort = uhci_device_ctrl_abort,
@@ -279,7 +279,7 @@ struct usbd_pipe_methods uhci_device_ctrl_methods = {
        .done = uhci_device_ctrl_done,
 };
 
-struct usbd_pipe_methods uhci_device_intr_methods = {
+const struct usbd_pipe_methods uhci_device_intr_methods = {
        .transfer = uhci_device_intr_transfer,
        .start = uhci_device_intr_start,
        .abort = uhci_device_intr_abort,
@@ -288,7 +288,7 @@ struct usbd_pipe_methods uhci_device_intr_methods = {
        .done = uhci_device_intr_done,
 };
 
-struct usbd_pipe_methods uhci_device_bulk_methods = {
+const struct usbd_pipe_methods uhci_device_bulk_methods = {
        .transfer = uhci_device_bulk_transfer,
        .start = uhci_device_bulk_start,
        .abort = uhci_device_bulk_abort,
@@ -297,7 +297,7 @@ struct usbd_pipe_methods uhci_device_bulk_methods = {
        .done = uhci_device_bulk_done,
 };
 
-struct usbd_pipe_methods uhci_device_isoc_methods = {
+const struct usbd_pipe_methods uhci_device_isoc_methods = {
        .transfer = uhci_device_isoc_transfer,
        .start = uhci_device_isoc_start,
        .abort = uhci_device_isoc_abort,
@@ -2702,7 +2702,7 @@ uhci_open(struct usbd_pipe *pipe)
 /*
  * Data structures and routines to emulate the root hub.
  */
-usb_device_descriptor_t uhci_devd = {
+const usb_device_descriptor_t uhci_devd = {
        USB_DEVICE_DESCRIPTOR_SIZE,
        UDESC_DEVICE,           /* type */
        {0x00, 0x01},           /* USB version */
@@ -2715,7 +2715,7 @@ usb_device_descriptor_t uhci_devd = {
        1                       /* # of configurations */
 };
 
-usb_config_descriptor_t uhci_confd = {
+const usb_config_descriptor_t uhci_confd = {
        USB_CONFIG_DESCRIPTOR_SIZE,
        UDESC_CONFIG,
        {USB_CONFIG_DESCRIPTOR_SIZE +
@@ -2728,7 +2728,7 @@ usb_config_descriptor_t uhci_confd = {
        0                       /* max power */
 };
 
-usb_interface_descriptor_t uhci_ifcd = {
+const usb_interface_descriptor_t uhci_ifcd = {
        USB_INTERFACE_DESCRIPTOR_SIZE,
        UDESC_INTERFACE,
        0,
@@ -2740,7 +2740,7 @@ usb_interface_descriptor_t uhci_ifcd = {
        0
 };
 
-usb_endpoint_descriptor_t uhci_endpd = {
+const usb_endpoint_descriptor_t uhci_endpd = {
        USB_ENDPOINT_DESCRIPTOR_SIZE,
        UDESC_ENDPOINT,
        UE_DIR_IN | UHCI_INTR_ENDPT,
@@ -2749,7 +2749,7 @@ usb_endpoint_descriptor_t uhci_endpd = {
        255
 };
 
-usb_hub_descriptor_t uhci_hubd_piix = {
+const usb_hub_descriptor_t uhci_hubd_piix = {
        USB_HUB_DESCRIPTOR_SIZE,
        UDESC_HUB,
        2,
@@ -2883,6 +2883,7 @@ uhci_root_ctrl_start(struct usbd_xfer *xfer)
        int port, x;
        int s, len, value, index, status, change, l, totlen = 0;
        usb_port_status_t ps;
+       usb_device_descriptor_t devd;
        usbd_status err;
 
        if (sc->sc_bus.dying)
@@ -2928,9 +2929,10 @@ uhci_root_ctrl_start(struct usbd_xfer *xfer)
                                err = USBD_IOERROR;
                                goto ret;
                        }
+                       devd = uhci_devd;
+                       USETW(devd.idVendor, sc->sc_id_vendor);
                        totlen = l = min(len, USB_DEVICE_DESCRIPTOR_SIZE);
-                       USETW(uhci_devd.idVendor, sc->sc_id_vendor);
-                       memcpy(buf, &uhci_devd, l);
+                       memcpy(buf, &devd, l);
                        break;
                case UDESC_CONFIG:
                        if ((value & 0xff) != 0) {
blob - 5aa207818f7c956e06d63eaef50ec6d582b68b4f
blob + 7e197ff71c69bab5269d9cf91854b642be3692dd
--- sys/dev/usb/usbdivar.h
+++ sys/dev/usb/usbdivar.h
@@ -105,7 +105,7 @@ struct usbd_hub {
 struct usbd_bus {
        /* Filled by HC driver */
        struct device           bdev; /* base device, host adapter */
-       struct usbd_bus_methods *methods;
+       const struct usbd_bus_methods *methods;
 #if NBPFILTER > 0
        void                    *bpfif;
        caddr_t                 bpf;
@@ -194,7 +194,7 @@ struct usbd_pipe {
        int                     interval;
 
        /* Filled by HC driver. */
-       struct usbd_pipe_methods *methods;
+       const struct usbd_pipe_methods *methods;
 };
 
 struct usbd_xfer {
blob - 71958b064a11d366a1f462b4a30fc2e61bba10e6
blob + a1b017eaa6cca045a0c67b97d5bf03e6ac3276e4
--- sys/dev/usb/xhci.c
+++ sys/dev/usb/xhci.c
@@ -157,7 +157,7 @@ usbd_status   xhci_device_isoc_start(struct usbd_xfer 
 
 #define XHCI_INTR_ENDPT 1
 
-struct usbd_bus_methods xhci_bus_methods = {
+const struct usbd_bus_methods xhci_bus_methods = {
        .open_pipe = xhci_pipe_open,
        .dev_setaddr = xhci_setaddr,
        .soft_intr = xhci_softintr,
@@ -166,7 +166,7 @@ struct usbd_bus_methods xhci_bus_methods = {
        .freex = xhci_freex,
 };
 
-struct usbd_pipe_methods xhci_root_ctrl_methods = {
+const struct usbd_pipe_methods xhci_root_ctrl_methods = {
        .transfer = xhci_root_ctrl_transfer,
        .start = xhci_root_ctrl_start,
        .abort = xhci_noop,
@@ -174,7 +174,7 @@ struct usbd_pipe_methods xhci_root_ctrl_methods = {
        .done = xhci_noop,
 };
 
-struct usbd_pipe_methods xhci_root_intr_methods = {
+const struct usbd_pipe_methods xhci_root_intr_methods = {
        .transfer = xhci_root_intr_transfer,
        .start = xhci_root_intr_start,
        .abort = xhci_root_intr_abort,
@@ -182,7 +182,7 @@ struct usbd_pipe_methods xhci_root_intr_methods = {
        .done = xhci_root_intr_done,
 };
 
-struct usbd_pipe_methods xhci_device_ctrl_methods = {
+const struct usbd_pipe_methods xhci_device_ctrl_methods = {
        .transfer = xhci_device_ctrl_transfer,
        .start = xhci_device_ctrl_start,
        .abort = xhci_device_ctrl_abort,
@@ -190,7 +190,7 @@ struct usbd_pipe_methods xhci_device_ctrl_methods = {
        .done = xhci_noop,
 };
 
-struct usbd_pipe_methods xhci_device_intr_methods = {
+const struct usbd_pipe_methods xhci_device_intr_methods = {
        .transfer = xhci_device_generic_transfer,
        .start = xhci_device_generic_start,
        .abort = xhci_device_generic_abort,
@@ -198,7 +198,7 @@ struct usbd_pipe_methods xhci_device_intr_methods = {
        .done = xhci_device_generic_done,
 };
 
-struct usbd_pipe_methods xhci_device_bulk_methods = {
+const struct usbd_pipe_methods xhci_device_bulk_methods = {
        .transfer = xhci_device_generic_transfer,
        .start = xhci_device_generic_start,
        .abort = xhci_device_generic_abort,
@@ -206,7 +206,7 @@ struct usbd_pipe_methods xhci_device_bulk_methods = {
        .done = xhci_device_generic_done,
 };
 
-struct usbd_pipe_methods xhci_device_isoc_methods = {
+const struct usbd_pipe_methods xhci_device_isoc_methods = {
        .transfer = xhci_device_isoc_transfer,
        .start = xhci_device_isoc_start,
        .abort = xhci_device_generic_abort,
@@ -2165,7 +2165,7 @@ xhci_softdev_free(struct xhci_softc *sc, uint8_t slot)
 }
 
 /* Root hub descriptors. */
-usb_device_descriptor_t xhci_devd = {
+const usb_device_descriptor_t xhci_devd = {
        USB_DEVICE_DESCRIPTOR_SIZE,
        UDESC_DEVICE,           /* type */
        {0x00, 0x03},           /* USB version */
@@ -2348,6 +2348,7 @@ xhci_root_ctrl_start(struct usbd_xfer *xfer)
        usb_port_status_t ps;
        usb_device_request_t *req;
        void *buf = NULL;
+       usb_device_descriptor_t devd;
        usb_hub_descriptor_t hubd;
        usbd_status err;
        int s, len, value, index;
@@ -2396,9 +2397,10 @@ xhci_root_ctrl_start(struct usbd_xfer *xfer)
                                err = USBD_IOERROR;
                                goto ret;
                        }
+                       devd = xhci_devd;
+                       USETW(devd.idVendor, sc->sc_id_vendor);
                        totlen = l = min(len, USB_DEVICE_DESCRIPTOR_SIZE);
-                       USETW(xhci_devd.idVendor, sc->sc_id_vendor);
-                       memcpy(buf, &xhci_devd, l);
+                       memcpy(buf, &devd, l);
                        break;
                /*
                 * We can't really operate at another speed, but the spec says
-- 
Christian "naddy" Weisgerber                          [email protected]

Reply via email to