Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 23 Apr 2014 05:50:56 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r264800 - head/sys/dev/usb/serial
Message-ID:  <201404230550.s3N5oue8050469@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Wed Apr 23 05:50:55 2014
New Revision: 264800
URL: http://svnweb.freebsd.org/changeset/base/264800

Log:
  - Get transmit loop more in line with the other serial drivers.
  - Add a comment about FTDI and ZLPs.
  - Correctly check odditiy of baud rate divisor.
  - Correct IOCTL handling for "error" and "event" char.
  
  MFC after:	1 weeks

Modified:
  head/sys/dev/usb/serial/uftdi.c

Modified: head/sys/dev/usb/serial/uftdi.c
==============================================================================
--- head/sys/dev/usb/serial/uftdi.c	Wed Apr 23 05:29:50 2014	(r264799)
+++ head/sys/dev/usb/serial/uftdi.c	Wed Apr 23 05:50:55 2014	(r264800)
@@ -1155,11 +1155,17 @@ uftdi_write_callback(struct usb_xfer *xf
 		 * Otherwise, loop to format packets into the buffer while there
 		 * is data available, and room for a packet header and at least
 		 * one byte of payload.
+		 *
+		 * NOTE: The FTDI chip doesn't accept zero length
+		 * packets. This cannot happen because the "pktlen"
+		 * will always be non-zero when "ucom_get_data()"
+		 * returns non-zero which we check below.
 		 */
 		pc = usbd_xfer_get_frame(xfer, 0);
 		if (sc->sc_hdrlen == 0) {
-			ucom_get_data(&sc->sc_ucom, pc, 0, UFTDI_OBUFSIZE, 
-			    &buflen);
+			if (ucom_get_data(&sc->sc_ucom, pc, 0, UFTDI_OBUFSIZE, 
+			    &buflen) == 0)
+				break;
 		} else {
 			buflen = 0;
 			while (buflen < UFTDI_OBUFSIZE - sc->sc_hdrlen - 1 &&
@@ -1417,7 +1423,7 @@ uftdi_encode_baudrate(struct uftdi_softc
 	 * 8ths by adding 1 and dividing by 2.
 	 */
 	divisor = (clk << 4) / speed;
-	if ((divisor & 0xfffffff0) == 1)
+	if ((divisor & 0xf) == 1)
 		divisor &= 0xfffffff8;
 	else if (sc->sc_devtype == DEVT_232A)
 		divisor += roundoff_232a[divisor & 0x0f];
@@ -1759,10 +1765,11 @@ uftdi_ioctl(struct ucom_softc *ucom, uin
 		err = uftdi_get_latency(ucom, (int *)data);
 		break;
 	case UFTDIIOC_SET_ERROR_CHAR:
-		err = uftdi_set_event_char(ucom, *(int *)data);
+		err = uftdi_set_error_char(ucom, *(int *)data);
 		break;
 	case UFTDIIOC_SET_EVENT_CHAR:
-		err = uftdi_set_error_char(ucom, *(int *)data);
+		err = uftdi_set_event_char(ucom, *(int *)data);
+		break;
 	case UFTDIIOC_GET_HWREV:
 		*(int *)data = sc->sc_bcdDevice;
 		err = 0;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201404230550.s3N5oue8050469>