Author: avos
Date: Sun Jan  8 23:41:17 2017
New Revision: 311707
URL: https://svnweb.freebsd.org/changeset/base/311707

Log:
  rtwn_usb(4): fix Rx buffer size calculation.
  
  Use device-specific Rx buffer size to ensure that data will not be
  truncated + add a warning if truncation was detected (the driver
  cannot handle this case correctly yet).
  
  Tested with:
   - RTL8188CUS, RTL8188EU and RTL8821AU, STA / AP modes.

Modified:
  head/sys/dev/rtwn/if_rtwnvar.h
  head/sys/dev/rtwn/usb/rtwn_usb_attach.c
  head/sys/dev/rtwn/usb/rtwn_usb_ep.c
  head/sys/dev/rtwn/usb/rtwn_usb_rx.c

Modified: head/sys/dev/rtwn/if_rtwnvar.h
==============================================================================
--- head/sys/dev/rtwn/if_rtwnvar.h      Sun Jan  8 23:25:46 2017        
(r311706)
+++ head/sys/dev/rtwn/if_rtwnvar.h      Sun Jan  8 23:41:17 2017        
(r311707)
@@ -25,7 +25,6 @@
 
 #define RTWN_TX_DESC_SIZE      64
 
-#define RTWN_RXBUFSZ           (8 * 1024)
 #define RTWN_TXBUFSZ           (16 * 1024)
 
 #define RTWN_BCN_MAX_SIZE      512

Modified: head/sys/dev/rtwn/usb/rtwn_usb_attach.c
==============================================================================
--- head/sys/dev/rtwn/usb/rtwn_usb_attach.c     Sun Jan  8 23:25:46 2017        
(r311706)
+++ head/sys/dev/rtwn/usb/rtwn_usb_attach.c     Sun Jan  8 23:41:17 2017        
(r311707)
@@ -133,8 +133,9 @@ rtwn_usb_alloc_rx_list(struct rtwn_softc
        struct rtwn_usb_softc *uc = RTWN_USB_SOFTC(sc);
        int error, i;
 
+       /* XXX recheck */
        error = rtwn_usb_alloc_list(sc, uc->uc_rx, RTWN_USB_RX_LIST_COUNT,
-           RTWN_RXBUFSZ);
+           sc->rx_dma_size + 1024);
        if (error != 0)
                return (error);
 

Modified: head/sys/dev/rtwn/usb/rtwn_usb_ep.c
==============================================================================
--- head/sys/dev/rtwn/usb/rtwn_usb_ep.c Sun Jan  8 23:25:46 2017        
(r311706)
+++ head/sys/dev/rtwn/usb/rtwn_usb_ep.c Sun Jan  8 23:41:17 2017        
(r311707)
@@ -63,7 +63,6 @@ static struct usb_config rtwn_config[RTW
                .type = UE_BULK,
                .endpoint = UE_ADDR_ANY,
                .direction = UE_DIR_IN,
-               .bufsize = RTWN_RXBUFSZ,
                .flags = {
                        .pipe_bof = 1,
                        .short_xfer_ok = 1
@@ -222,6 +221,7 @@ rtwn_usb_setup_endpoints(struct rtwn_usb
                break;
        }
 
+       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);
        if (error) {

Modified: head/sys/dev/rtwn/usb/rtwn_usb_rx.c
==============================================================================
--- head/sys/dev/rtwn/usb/rtwn_usb_rx.c Sun Jan  8 23:25:46 2017        
(r311706)
+++ head/sys/dev/rtwn/usb/rtwn_usb_rx.c Sun Jan  8 23:41:17 2017        
(r311707)
@@ -158,8 +158,12 @@ rtwn_rxeof(struct rtwn_softc *sc, uint8_
 
                /* Make sure everything fits in xfer. */
                totlen = sizeof(*stat) + infosz + pktlen;
-               if (totlen > len)
+               if (totlen > len) {
+                       device_printf(sc->sc_dev,
+                           "%s: totlen (%d) > len (%d)!\n",
+                           __func__, totlen, len);
                        break;
+               }
 
                if (m0 == NULL)
                        m0 = m = rtwn_rx_copy_to_mbuf(sc, stat, totlen);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to