Print this page
3419 usbftdi needs to support the BeagleBone
        
*** 23,32 ****
--- 23,36 ----
   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
  
  /*
+  * Copyright 2012 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
+  */
+ 
+ /*
   * FTDI FT232R USB UART device-specific driver
   *
   * May work on the (many) devices based on earlier versions of the chip.
   */
  
*** 218,227 ****
--- 222,232 ----
          recognized = B_TRUE;
          dd = uf->uf_dev_data->dev_descr;
          switch (dd->idVendor) {
          case USB_VENDOR_FTDI:
                  switch (dd->idProduct) {
+                 case USB_PRODUCT_FTDI_SERIAL_2232C:
                  case USB_PRODUCT_FTDI_SERIAL_8U232AM:
                  case USB_PRODUCT_FTDI_SEMC_DSS20:
                  case USB_PRODUCT_FTDI_CFA_631:
                  case USB_PRODUCT_FTDI_CFA_632:
                  case USB_PRODUCT_FTDI_CFA_633:
*** 326,352 ****
              uf->uf_usb_events, 0) != USB_SUCCESS) {
                  uftdi_cleanup(uf, 4);
                  return (USB_FAILURE);
          }
  
-         if (usb_pipe_get_max_bulk_transfer_size(uf->uf_dip,
-             &uf->uf_xfer_sz) != USB_SUCCESS) {
-                 uftdi_cleanup(uf, 5);
-                 return (USB_FAILURE);
-         }
- 
-         /*
-          * TODO: modern ftdi devices have deeper (and asymmetric)
-          * fifos than this minimal 64 bytes .. but how to tell
-          * -safely- ?
-          */
- 
- #define FTDI_MAX_XFERSIZE       64
- 
-         if (uf->uf_xfer_sz > FTDI_MAX_XFERSIZE)
-                 uf->uf_xfer_sz = FTDI_MAX_XFERSIZE;
- 
          if (uftdi_dev_attach(uf) != USB_SUCCESS) {
                  uftdi_cleanup(uf, 5);
                  return (USB_FAILURE);
          }
  
--- 331,340 ----
*** 1499,1509 ****
--- 1487,1503 ----
  uftdi_open_pipes(uftdi_state_t *uf)
  {
          int ifc, alt;
          usb_pipe_policy_t policy;
          usb_ep_data_t *in_data, *out_data;
+         size_t max_xfer_sz;
  
+         /* get max transfer size */
+         if (usb_pipe_get_max_bulk_transfer_size(uf->uf_dip, &max_xfer_sz)
+             != USB_SUCCESS)
+                 return (USB_FAILURE);
+ 
          /* get ep data */
          ifc = uf->uf_dev_data->dev_curr_if;
          alt = 0;
  
          in_data = usb_lookup_ep_data(uf->uf_dip, uf->uf_dev_data, ifc, alt,
*** 1516,1525 ****
--- 1510,1534 ----
                  USB_DPRINTF_L2(DPRINT_ATTACH, uf->uf_lh,
                      "uftdi_open_pipes: can't get ep data");
                  return (USB_FAILURE);
          }
  
+         /*
+          * Set buffer sizes. Default to UFTDI_XFER_SZ_MAX.
+          * Use wMaxPacketSize from endpoint descriptor if it is nonzero..
+          * Cap at a max transfer size of host controller.
+          */
+         uf->uf_ibuf_sz = uf->uf_obuf_sz = UFTDI_XFER_SZ_MAX;
+ 
+         if (in_data->ep_descr.wMaxPacketSize)
+                 uf->uf_ibuf_sz = in_data->ep_descr.wMaxPacketSize;
+         uf->uf_ibuf_sz = min(uf->uf_ibuf_sz, max_xfer_sz);
+ 
+         if (out_data->ep_descr.wMaxPacketSize)
+                 uf->uf_obuf_sz = out_data->ep_descr.wMaxPacketSize;
+         uf->uf_obuf_sz = min(uf->uf_obuf_sz, max_xfer_sz);
+ 
          /* open pipes */
          policy.pp_max_async_reqs = 2;
  
          if (usb_pipe_open(uf->uf_dip, &in_data->ep_descr, &policy,
              USB_FLAGS_SLEEP, &uf->uf_bulkin_ph) != USB_SUCCESS)
*** 1804,1815 ****
          ASSERT(mutex_owned(&uf->uf_lock));
  
          uf->uf_bulkin_state = UFTDI_PIPE_BUSY;
          mutex_exit(&uf->uf_lock);
  
!         br = usb_alloc_bulk_req(uf->uf_dip, uf->uf_xfer_sz, USB_FLAGS_SLEEP);
!         br->bulk_len = uf->uf_xfer_sz;
          br->bulk_timeout = UFTDI_BULKIN_TIMEOUT;
          br->bulk_cb = uftdi_bulkin_cb;
          br->bulk_exc_cb = uftdi_bulkin_cb;
          br->bulk_client_private = (usb_opaque_t)uf;
          br->bulk_attributes = USB_ATTRS_AUTOCLEARING | USB_ATTRS_SHORT_XFER_OK;
--- 1813,1824 ----
          ASSERT(mutex_owned(&uf->uf_lock));
  
          uf->uf_bulkin_state = UFTDI_PIPE_BUSY;
          mutex_exit(&uf->uf_lock);
  
!         br = usb_alloc_bulk_req(uf->uf_dip, uf->uf_ibuf_sz, USB_FLAGS_SLEEP);
!         br->bulk_len = uf->uf_ibuf_sz;
          br->bulk_timeout = UFTDI_BULKIN_TIMEOUT;
          br->bulk_cb = uftdi_bulkin_cb;
          br->bulk_exc_cb = uftdi_bulkin_cb;
          br->bulk_client_private = (usb_opaque_t)uf;
          br->bulk_attributes = USB_ATTRS_AUTOCLEARING | USB_ATTRS_SHORT_XFER_OK;
*** 1859,1869 ****
                  return;
          }
          ASSERT(MBLKL(uf->uf_tx_mp) > 0);
  
          /* send as much data as port can receive */
!         len = min(msgdsize(uf->uf_tx_mp), uf->uf_xfer_sz);
  
          if (len <= 0)
                  return;
          if ((data = allocb(len, BPRI_LO)) == NULL)
                  return;
--- 1868,1878 ----
                  return;
          }
          ASSERT(MBLKL(uf->uf_tx_mp) > 0);
  
          /* send as much data as port can receive */
!         len = min(msgdsize(uf->uf_tx_mp), uf->uf_obuf_sz);
  
          if (len <= 0)
                  return;
          if ((data = allocb(len, BPRI_LO)) == NULL)
                  return;