diff --git a/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c b/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c --- a/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c +++ b/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c @@ -122,6 +122,7 @@ /* USB part. */ uc->uc_align_rx = r92cu_align_rx; uc->tx_agg_desc_num = 6; + uc->uc_write_delay = 1; /* Common part. */ sc->sc_flags = RTWN_FLAG_EXT_HDR; diff --git a/sys/dev/rtwn/rtl8188e/usb/r88eu_init.c b/sys/dev/rtwn/rtl8188e/usb/r88eu_init.c --- a/sys/dev/rtwn/rtl8188e/usb/r88eu_init.c +++ b/sys/dev/rtwn/rtl8188e/usb/r88eu_init.c @@ -50,6 +50,7 @@ #include #include +#include void r88eu_init_bb(struct rtwn_softc *sc) diff --git a/sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c b/sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c --- a/sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c +++ b/sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c @@ -151,6 +151,7 @@ /* USB part. */ uc->uc_align_rx = r92cu_align_rx; uc->tx_agg_desc_num = 6; + uc->uc_write_delay = 1; /* Common part. */ sc->sc_flags = RTWN_FLAG_CAM_FIXED; diff --git a/sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c b/sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c --- a/sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c +++ b/sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c @@ -100,6 +100,7 @@ /* USB part. */ uc->uc_align_rx = r12au_align_rx; uc->tx_agg_desc_num = 3; + uc->uc_write_delay = 1; /* Common part. */ sc->sc_flags = RTWN_FLAG_EXT_HDR; diff --git a/sys/dev/rtwn/usb/rtwn_usb_attach.c b/sys/dev/rtwn/usb/rtwn_usb_attach.c --- a/sys/dev/rtwn/usb/rtwn_usb_attach.c +++ b/sys/dev/rtwn/usb/rtwn_usb_attach.c @@ -377,6 +377,10 @@ uc->uc_rx_buf_size = RTWN_USB_RXBUFSZ_MIN; if (uc->uc_rx_buf_size > RTWN_USB_RXBUFSZ_MAX) uc->uc_rx_buf_size = RTWN_USB_RXBUFSZ_MAX; + + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, + "delay_us", CTLFLAG_RWTUN, &uc->uc_delay_us, + uc->uc_delay_us, "RTWN USB set channel delay microseconds"); } static int @@ -390,6 +394,8 @@ device_set_usb_desc(self); uc->uc_udev = uaa->device; + uc->uc_write_delay = 1; + uc->uc_delay_us = RTWN_USB_DELAY_US_DEF; sc->sc_dev = self; ic->ic_name = device_get_nameunit(self); diff --git a/sys/dev/rtwn/usb/rtwn_usb_reg.c b/sys/dev/rtwn/usb/rtwn_usb_reg.c --- a/sys/dev/rtwn/usb/rtwn_usb_reg.c +++ b/sys/dev/rtwn/usb/rtwn_usb_reg.c @@ -88,12 +88,16 @@ int len) { usb_device_request_t req; + struct rtwn_usb_softc *uc; req.bmRequestType = UT_WRITE_VENDOR_DEVICE; req.bRequest = R92C_REQ_REGS; USETW(req.wValue, addr); USETW(req.wIndex, 0); USETW(req.wLength, len); + uc = RTWN_USB_SOFTC(sc); + if (uc->uc_write_delay == 1) + (sc->sc_delay)(sc,uc->uc_delay_us); return (rtwn_do_request(sc, &req, buf)); } diff --git a/sys/dev/rtwn/usb/rtwn_usb_var.h b/sys/dev/rtwn/usb/rtwn_usb_var.h --- a/sys/dev/rtwn/usb/rtwn_usb_var.h +++ b/sys/dev/rtwn/usb/rtwn_usb_var.h @@ -27,6 +27,7 @@ #define RTWN_USB_RXBUFSZ_DEF (24) #define RTWN_USB_RXBUFSZ_MAX (64) #define RTWN_USB_TXBUFSZ (16 * 1024) +#define RTWN_USB_DELAY_US_DEF 1000 #define RTWN_IFACE_INDEX 0 @@ -82,6 +83,8 @@ int tx_agg_desc_num; uint8_t wme2qid[4]; + int uc_delay_us; + int uc_write_delay; }; #define RTWN_USB_SOFTC(sc) ((struct rtwn_usb_softc *)(sc))