tty,serial: Unify UPF_* and ASYNC_* flag definitions
authorPeter Hurley <peter@hurleysoftware.com>
Thu, 16 Oct 2014 20:54:21 +0000 (16:54 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 6 Nov 2014 02:53:54 +0000 (18:53 -0800)
The userspace-defined ASYNC_* flags in include/uapi/linux/tty_flags.h
are the authoritative bit definitions for the serial_struct flags,
and thus for any derivative values or fields.

Although the serial core provides the TIOCSSERIAL and TIOCGSERIAL
ioctls to set and retrieve these flags from userspace, it defines these
bits independently, as UPF_* macros.

Define the UPF_* macros which are userspace-modifiable directly from
the ASYNC_* symbolic constants. Add compile-time test to ensure the
bits changeable by TIOCSSERIAL match the defined range in the uapi
header.

Add ASYNCB_MAGIC_MULTIPLIER to the uapi header since this bit is
programmable by userspace.

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
include/linux/serial_core.h
include/uapi/linux/tty_flags.h

index bccf4bac22f5b5670822d9828cbd566c136cf2b3..ad9329669abad5624c21710906787594365ba1fc 100644 (file)
@@ -160,21 +160,33 @@ struct uart_port {
        /* flags must be updated while holding port mutex */
        upf_t                   flags;
 
-#define UPF_FOURPORT           ((__force upf_t) (1 << 1))
-#define UPF_SAK                        ((__force upf_t) (1 << 2))
-#define UPF_SPD_MASK           ((__force upf_t) (0x1030))
-#define UPF_SPD_HI             ((__force upf_t) (0x0010))
-#define UPF_SPD_VHI            ((__force upf_t) (0x0020))
-#define UPF_SPD_CUST           ((__force upf_t) (0x0030))
-#define UPF_SPD_SHI            ((__force upf_t) (0x1000))
-#define UPF_SPD_WARP           ((__force upf_t) (0x1010))
-#define UPF_SKIP_TEST          ((__force upf_t) (1 << 6))
-#define UPF_AUTO_IRQ           ((__force upf_t) (1 << 7))
-#define UPF_HARDPPS_CD         ((__force upf_t) (1 << 11))
-#define UPF_LOW_LATENCY                ((__force upf_t) (1 << 13))
-#define UPF_BUGGY_UART         ((__force upf_t) (1 << 14))
+       /*
+        * These flags must be equivalent to the flags defined in
+        * include/uapi/linux/tty_flags.h which are the userspace definitions
+        * assigned from the serial_struct flags in uart_set_info()
+        * [for bit definitions in the UPF_CHANGE_MASK]
+        *
+        * Bits [0..UPF_LAST_USER] are userspace defined/visible/changeable
+        * except bit 15 (UPF_NO_TXEN_TEST) which is masked off.
+        * The remaining bits are serial-core specific and not modifiable by
+        * userspace.
+        */
+#define UPF_FOURPORT           ((__force upf_t) ASYNC_FOURPORT       /* 1  */ )
+#define UPF_SAK                        ((__force upf_t) ASYNC_SAK            /* 2  */ )
+#define UPF_SPD_HI             ((__force upf_t) ASYNC_SPD_HI         /* 4  */ )
+#define UPF_SPD_VHI            ((__force upf_t) ASYNC_SPD_VHI        /* 5  */ )
+#define UPF_SPD_CUST           ((__force upf_t) ASYNC_SPD_CUST   /* 0x0030 */ )
+#define UPF_SPD_WARP           ((__force upf_t) ASYNC_SPD_WARP   /* 0x1010 */ )
+#define UPF_SPD_MASK           ((__force upf_t) ASYNC_SPD_MASK   /* 0x1030 */ )
+#define UPF_SKIP_TEST          ((__force upf_t) ASYNC_SKIP_TEST      /* 6  */ )
+#define UPF_AUTO_IRQ           ((__force upf_t) ASYNC_AUTO_IRQ       /* 7  */ )
+#define UPF_HARDPPS_CD         ((__force upf_t) ASYNC_HARDPPS_CD     /* 11 */ )
+#define UPF_SPD_SHI            ((__force upf_t) ASYNC_SPD_SHI        /* 12 */ )
+#define UPF_LOW_LATENCY                ((__force upf_t) ASYNC_LOW_LATENCY    /* 13 */ )
+#define UPF_BUGGY_UART         ((__force upf_t) ASYNC_BUGGY_UART     /* 14 */ )
 #define UPF_NO_TXEN_TEST       ((__force upf_t) (1 << 15))
-#define UPF_MAGIC_MULTIPLIER   ((__force upf_t) (1 << 16))
+#define UPF_MAGIC_MULTIPLIER   ((__force upf_t) ASYNC_MAGIC_MULTIPLIER /* 16 */ )
+
 /* Port has hardware-assisted h/w flow control (iow, auto-RTS *not* auto-CTS) */
 #define UPF_HARD_FLOW          ((__force upf_t) (1 << 21))
 /* Port has hardware-assisted s/w flow control */
@@ -190,9 +202,14 @@ struct uart_port {
 #define UPF_DEAD               ((__force upf_t) (1 << 30))
 #define UPF_IOREMAP            ((__force upf_t) (1 << 31))
 
-#define UPF_CHANGE_MASK                ((__force upf_t) (0x17fff))
+#define __UPF_CHANGE_MASK      0x17fff
+#define UPF_CHANGE_MASK                ((__force upf_t) __UPF_CHANGE_MASK)
 #define UPF_USR_MASK           ((__force upf_t) (UPF_SPD_MASK|UPF_LOW_LATENCY))
 
+#if __UPF_CHANGE_MASK > ASYNC_FLAGS
+#error Change mask not equivalent to userspace-visible bit defines
+#endif
+
        /* status must be updated while holding port lock */
        upstat_t                status;
 
index eefcb483a2c0103e80b8b4b7030fd84d162226ee..7b516f7ee7e6d44feea5fb57681c38f496d30a93 100644 (file)
@@ -6,6 +6,8 @@
  * shared by the tty_port flags structures.
  *
  * Define ASYNCB_* for convenient use with {test,set,clear}_bit.
+ *
+ * Bits [0..ASYNCB_LAST_USER] are userspace defined/visible/changeable
  */
 #define ASYNCB_HUP_NOTIFY       0 /* Notify getty on hangups and closes
                                    * on the callout port */
@@ -26,7 +28,8 @@
 #define ASYNCB_BUGGY_UART      14 /* This is a buggy UART, skip some safety
                                    * checks.  Note: can be dangerous! */
 #define ASYNCB_AUTOPROBE       15 /* Port was autoprobed by PCI or PNP code */
-#define ASYNCB_LAST_USER       15
+#define ASYNCB_MAGIC_MULTIPLIER        16 /* Use special CLK or divisor */
+#define ASYNCB_LAST_USER       16
 
 /* Internal flags used only by kernel */
 #define ASYNCB_INITIALIZED     31 /* Serial port was initialized */
@@ -57,6 +60,7 @@
 #define ASYNC_LOW_LATENCY      (1U << ASYNCB_LOW_LATENCY)
 #define ASYNC_BUGGY_UART       (1U << ASYNCB_BUGGY_UART)
 #define ASYNC_AUTOPROBE                (1U << ASYNCB_AUTOPROBE)
+#define ASYNC_MAGIC_MULTIPLIER (1U << ASYNCB_MAGIC_MULTIPLIER)
 
 #define ASYNC_FLAGS            ((1U << (ASYNCB_LAST_USER + 1)) - 1)
 #define ASYNC_USR_MASK         (ASYNC_SPD_MASK|ASYNC_CALLOUT_NOHUP| \