Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 1 Mar 2017 18:23:30 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r314501 - stable/11/sys/dev/usb/serial
Message-ID:  <201703011823.v21INUNl051196@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Wed Mar  1 18:23:30 2017
New Revision: 314501
URL: https://svnweb.freebsd.org/changeset/base/314501

Log:
  MFC r303347, r303350, r303351, r303353:
  
    Translate modem status reg bits from ns16550 to SER_* values used by the
    tty layer.
  
    Annotate the usb-serial drivers which always return 0 for line status,
    so that it'll be easier to find and fix them in the future.
  
    Also annotate a switch case fall-through per style(9).

Modified:
  stable/11/sys/dev/usb/serial/u3g.c
  stable/11/sys/dev/usb/serial/uark.c
  stable/11/sys/dev/usb/serial/ubsa.c
  stable/11/sys/dev/usb/serial/uchcom.c
  stable/11/sys/dev/usb/serial/ufoma.c
  stable/11/sys/dev/usb/serial/umcs.c
  stable/11/sys/dev/usb/serial/umct.c
  stable/11/sys/dev/usb/serial/umodem.c
  stable/11/sys/dev/usb/serial/uplcom.c
  stable/11/sys/dev/usb/serial/uslcom.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/usb/serial/u3g.c
==============================================================================
--- stable/11/sys/dev/usb/serial/u3g.c	Wed Mar  1 18:19:46 2017	(r314500)
+++ stable/11/sys/dev/usb/serial/u3g.c	Wed Mar  1 18:23:30 2017	(r314501)
@@ -1102,6 +1102,7 @@ u3g_cfg_get_status(struct ucom_softc *uc
 {
 	struct u3g_softc *sc = ucom->sc_parent;
 
+	/* XXX Note: sc_lsr is always zero */
 	*lsr = sc->sc_lsr[ucom->sc_subunit];
 	*msr = sc->sc_msr[ucom->sc_subunit];
 }

Modified: stable/11/sys/dev/usb/serial/uark.c
==============================================================================
--- stable/11/sys/dev/usb/serial/uark.c	Wed Mar  1 18:19:46 2017	(r314500)
+++ stable/11/sys/dev/usb/serial/uark.c	Wed Mar  1 18:23:30 2017	(r314501)
@@ -427,6 +427,7 @@ uark_cfg_get_status(struct ucom_softc *u
 {
 	struct uark_softc *sc = ucom->sc_parent;
 
+	/* XXX Note: sc_lsr is always zero */
 	*lsr = sc->sc_lsr;
 	*msr = sc->sc_msr;
 }

Modified: stable/11/sys/dev/usb/serial/ubsa.c
==============================================================================
--- stable/11/sys/dev/usb/serial/ubsa.c	Wed Mar  1 18:19:46 2017	(r314500)
+++ stable/11/sys/dev/usb/serial/ubsa.c	Wed Mar  1 18:23:30 2017	(r314501)
@@ -650,11 +650,19 @@ ubsa_intr_callback(struct usb_xfer *xfer
 			usbd_copy_out(pc, 0, buf, sizeof(buf));
 
 			/*
-			 * incidentally, Belkin adapter status bits match
-			 * UART 16550 bits
+			 * MSR bits need translation from ns16550 to SER_* values.
+			 * LSR bits are ns16550 in hardware and ucom.
 			 */
+			sc->sc_msr = 0;
+			if (buf[3] & UBSA_MSR_CTS)
+				sc->sc_msr |= SER_CTS;
+			if (buf[3] & UBSA_MSR_DCD)
+				sc->sc_msr |= SER_DCD;
+			if (buf[3] & UBSA_MSR_RI)
+				sc->sc_msr |= SER_RI;
+			if (buf[3] & UBSA_MSR_DSR)
+				sc->sc_msr |= SER_DSR;
 			sc->sc_lsr = buf[2];
-			sc->sc_msr = buf[3];
 
 			DPRINTF("lsr = 0x%02x, msr = 0x%02x\n",
 			    sc->sc_lsr, sc->sc_msr);
@@ -663,7 +671,7 @@ ubsa_intr_callback(struct usb_xfer *xfer
 		} else {
 			DPRINTF("ignoring short packet, %d bytes\n", actlen);
 		}
-
+		/* FALLTHROUGH */
 	case USB_ST_SETUP:
 tr_setup:
 		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));

Modified: stable/11/sys/dev/usb/serial/uchcom.c
==============================================================================
--- stable/11/sys/dev/usb/serial/uchcom.c	Wed Mar  1 18:19:46 2017	(r314500)
+++ stable/11/sys/dev/usb/serial/uchcom.c	Wed Mar  1 18:23:30 2017	(r314501)
@@ -625,6 +625,7 @@ uchcom_cfg_get_status(struct ucom_softc 
 
 	DPRINTF("\n");
 
+	/* XXX Note: sc_lsr is always zero */
 	*lsr = sc->sc_lsr;
 	*msr = sc->sc_msr;
 }

Modified: stable/11/sys/dev/usb/serial/ufoma.c
==============================================================================
--- stable/11/sys/dev/usb/serial/ufoma.c	Wed Mar  1 18:19:46 2017	(r314500)
+++ stable/11/sys/dev/usb/serial/ufoma.c	Wed Mar  1 18:23:30 2017	(r314501)
@@ -900,6 +900,7 @@ ufoma_cfg_get_status(struct ucom_softc *
 {
 	struct ufoma_softc *sc = ucom->sc_parent;
 
+	/* XXX Note: sc_lsr is always zero */
 	*lsr = sc->sc_lsr;
 	*msr = sc->sc_msr;
 }

Modified: stable/11/sys/dev/usb/serial/umcs.c
==============================================================================
--- stable/11/sys/dev/usb/serial/umcs.c	Wed Mar  1 18:19:46 2017	(r314500)
+++ stable/11/sys/dev/usb/serial/umcs.c	Wed Mar  1 18:23:30 2017	(r314501)
@@ -743,15 +743,26 @@ umcs7840_cfg_get_status(struct ucom_soft
 {
 	struct umcs7840_softc *sc = ucom->sc_parent;
 	uint8_t pn = ucom->sc_portno;
-	uint8_t	hw_lsr = 0;	/* local line status register */
 	uint8_t	hw_msr = 0;	/* local modem status register */
 
-	/* Read LSR & MSR */
-	umcs7840_get_UART_reg_sync(sc, pn, MCS7840_UART_REG_LSR, &hw_lsr);
+	/*
+	 * Read status registers.  MSR bits need translation from ns16550 to
+	 * SER_* values.  LSR bits are ns16550 in hardware and ucom.
+	 */
+	umcs7840_get_UART_reg_sync(sc, pn, MCS7840_UART_REG_LSR, lsr);
 	umcs7840_get_UART_reg_sync(sc, pn, MCS7840_UART_REG_MSR, &hw_msr);
 
-	*lsr = hw_lsr;
-	*msr = hw_msr;
+	if (hw_msr & MCS7840_UART_MSR_NEGCTS)
+		*msr |= SER_CTS;
+
+	if (hw_msr & MCS7840_UART_MSR_NEGDCD)
+		*msr |= SER_DCD;
+
+	if (hw_msr & MCS7840_UART_MSR_NEGRI)
+		*msr |= SER_RI;
+
+	if (hw_msr & MCS7840_UART_MSR_NEGDSR)
+		*msr |= SER_DSR;
 
 	DPRINTF("Port %d status: LSR=%02x MSR=%02x\n", ucom->sc_portno, *lsr, *msr);
 }

Modified: stable/11/sys/dev/usb/serial/umct.c
==============================================================================
--- stable/11/sys/dev/usb/serial/umct.c	Wed Mar  1 18:19:46 2017	(r314500)
+++ stable/11/sys/dev/usb/serial/umct.c	Wed Mar  1 18:23:30 2017	(r314501)
@@ -86,6 +86,15 @@ __FBSDID("$FreeBSD$");
 #define	UMCT_SET_MCR		10	/* Set Modem Control Register */
 #define	UMCT_SET_MCR_SIZE	1
 
+#define	UMCT_MSR_CTS_CHG	0x01
+#define	UMCT_MSR_DSR_CHG	0x02
+#define	UMCT_MSR_RI_CHG		0x04
+#define	UMCT_MSR_CD_CHG		0x08
+#define	UMCT_MSR_CTS		0x10
+#define	UMCT_MSR_RTS		0x20
+#define	UMCT_MSR_RI		0x40
+#define	UMCT_MSR_CD		0x80
+
 #define	UMCT_INTR_INTERVAL	100
 #define	UMCT_IFACE_INDEX	0
 #define	UMCT_CONFIG_INDEX	0
@@ -384,11 +393,23 @@ umct_intr_callback_sub(struct usb_xfer *
 		pc = usbd_xfer_get_frame(xfer, 0);
 		usbd_copy_out(pc, 0, buf, sizeof(buf));
 
-		sc->sc_msr = buf[0];
+		/*
+		 * MSR bits need translation from ns16550 to SER_* values.
+		 * LSR bits are ns16550 in hardware and ucom.
+		 */
+		sc->sc_msr = 0;
+		if (buf[0] & UMCT_MSR_CTS)
+			sc->sc_msr |= SER_CTS;
+		if (buf[0] & UMCT_MSR_CD)
+			sc->sc_msr |= SER_DCD;
+		if (buf[0] & UMCT_MSR_RI)
+			sc->sc_msr |= SER_RI;
+		if (buf[0] & UMCT_MSR_RTS)
+			sc->sc_msr |= SER_DSR;
 		sc->sc_lsr = buf[1];
 
 		ucom_status_change(&sc->sc_ucom);
-
+		/* FALLTHROUGH */
 	case USB_ST_SETUP:
 tr_setup:
 		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));

Modified: stable/11/sys/dev/usb/serial/umodem.c
==============================================================================
--- stable/11/sys/dev/usb/serial/umodem.c	Wed Mar  1 18:19:46 2017	(r314500)
+++ stable/11/sys/dev/usb/serial/umodem.c	Wed Mar  1 18:23:30 2017	(r314501)
@@ -558,6 +558,7 @@ umodem_cfg_get_status(struct ucom_softc 
 
 	DPRINTF("\n");
 
+	/* XXX Note: sc_lsr is always zero */
 	*lsr = sc->sc_lsr;
 	*msr = sc->sc_msr;
 }

Modified: stable/11/sys/dev/usb/serial/uplcom.c
==============================================================================
--- stable/11/sys/dev/usb/serial/uplcom.c	Wed Mar  1 18:19:46 2017	(r314500)
+++ stable/11/sys/dev/usb/serial/uplcom.c	Wed Mar  1 18:23:30 2017	(r314501)
@@ -807,6 +807,7 @@ uplcom_cfg_get_status(struct ucom_softc 
 
 	DPRINTF("\n");
 
+	/* XXX Note: sc_lsr is always zero */
 	*lsr = sc->sc_lsr;
 	*msr = sc->sc_msr;
 }

Modified: stable/11/sys/dev/usb/serial/uslcom.c
==============================================================================
--- stable/11/sys/dev/usb/serial/uslcom.c	Wed Mar  1 18:19:46 2017	(r314500)
+++ stable/11/sys/dev/usb/serial/uslcom.c	Wed Mar  1 18:23:30 2017	(r314501)
@@ -704,6 +704,7 @@ uslcom_get_status(struct ucom_softc *uco
 
 	DPRINTF("\n");
 
+	/* XXX Note: sc_lsr is always zero */
 	*lsr = sc->sc_lsr;
 	*msr = sc->sc_msr;
 }



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