svn commit: r311838 - head/sys/dev/rtwn/usb

Andriy Voskoboinyk avos at FreeBSD.org
Mon Jan 9 23:42:04 UTC 2017


Author: avos
Date: Mon Jan  9 23:42:02 2017
New Revision: 311838
URL: https://svnweb.freebsd.org/changeset/base/311838

Log:
  rtwn_usb(4): do not try to modify global static structure.
  
  Use a local copy for modifications instead.
  
  Tested with RTL8821AU (AP) + RTL8188EU (STA).
  
  Reported by:	hselasky

Modified:
  head/sys/dev/rtwn/usb/rtwn_usb_ep.c

Modified: head/sys/dev/rtwn/usb/rtwn_usb_ep.c
==============================================================================
--- head/sys/dev/rtwn/usb/rtwn_usb_ep.c	Mon Jan  9 23:41:10 2017	(r311837)
+++ head/sys/dev/rtwn/usb/rtwn_usb_ep.c	Mon Jan  9 23:42:02 2017	(r311838)
@@ -58,7 +58,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/rtwn/rtl8192c/usb/r92cu_reg.h>
 
 
-static struct usb_config rtwn_config[RTWN_N_TRANSFER] = {
+static const struct usb_config rtwn_config_common[RTWN_N_TRANSFER] = {
 	[RTWN_BULK_RX] = {
 		.type = UE_BULK,
 		.endpoint = UE_ADDR_ANY,
@@ -161,6 +161,7 @@ rtwn_usb_setup_queues(struct rtwn_usb_so
 int
 rtwn_usb_setup_endpoints(struct rtwn_usb_softc *uc)
 {
+	struct usb_config *rtwn_config;
 	struct rtwn_softc *sc = &uc->uc_sc;
 	const uint8_t iface_index = RTWN_IFACE_INDEX;
 	struct usb_endpoint *ep, *ep_end;
@@ -197,6 +198,9 @@ rtwn_usb_setup_endpoints(struct rtwn_usb
 		return (EINVAL);
 	}
 
+	rtwn_config = malloc(sizeof(rtwn_config_common), M_TEMP, M_WAITOK);
+	memcpy(rtwn_config, rtwn_config_common, sizeof(rtwn_config_common));
+
 	/* NB: keep in sync with rtwn_dma_init(). */
 	rtwn_config[RTWN_BULK_TX_VO].endpoint = addr[0];
 	switch (uc->ntx) {
@@ -224,6 +228,8 @@ rtwn_usb_setup_endpoints(struct rtwn_usb
 	rtwn_config[RTWN_BULK_RX].bufsize = sc->rx_dma_size + 1024;
 	error = usbd_transfer_setup(uc->uc_udev, &iface_index,
 	    uc->uc_xfer, rtwn_config, RTWN_N_TRANSFER, uc, &sc->sc_mtx);
+	free(rtwn_config, M_TEMP);
+
 	if (error) {
 		device_printf(sc->sc_dev, "could not allocate USB transfers, "
 		    "err=%s\n", usbd_errstr(error));


More information about the svn-src-all mailing list