]> git.decadent.org.uk Git - exar-uart-driver.git/blobdiff - vizzini.h
Sync code with cdc-acm.{c,h} in Linux 4.3
[exar-uart-driver.git] / vizzini.h
index 9fe863805187b698cd451f82e2b3c88a053a3271..268d4bb52d695be03eeb316009f7e09f82217227 100644 (file)
--- a/vizzini.h
+++ b/vizzini.h
  * Major and minor numbers.
  */
 
-#define XR21V141X_TTY_MINORS           32
+#define ACM_TTY_MAJOR          166
+#define ACM_TTY_MINORS         256
+
+/*
+ * Requests.
+ */
 
 #define USB_RT_ACM             (USB_TYPE_CLASS | USB_RECIP_INTERFACE)
 
+/*
+ * Output control lines.
+ */
+
 #define ACM_CTRL_DTR           0x01
 #define ACM_CTRL_RTS           0x02
+
+/*
+ * Input control lines and line errors.
+ */
+
 #define ACM_CTRL_DCD           0x01
 #define ACM_CTRL_DSR           0x02
 #define ACM_CTRL_BRK           0x04
  * Internal driver structures.
  */
 
+/*
+ * The only reason to have several buffers is to accommodate assumptions
+ * in line disciplines. They ask for empty space amount, receive our URB size,
+ * and proceed to issue several 1-character writes, assuming they will fit.
+ * The very first write takes a complete URB. Fortunately, this only happens
+ * when processing onlcr, so we only need 2 buffers. These values must be
+ * powers of 2.
+ */
 #define ACM_NW  16
 #define ACM_NR  16
 
-struct xr21v141x_wb {
+struct acm_wb {
        unsigned char *buf;
        dma_addr_t dmah;
        int len;
        int use;
        struct urb              *urb;
-       struct xr21v141x        *instance;
+       struct acm              *instance;
 };
 
-struct xr21v141x_rb {
+struct acm_rb {
        int                     size;
        unsigned char           *base;
        dma_addr_t              dma;
        int                     index;
-       struct xr21v141x        *instance;
+       struct acm              *instance;
 };
 
-struct xr21v141x {
+struct acm {
        struct usb_device *dev;                         /* the corresponding usb device */
        struct usb_interface *control;                  /* control interface */
        struct usb_interface *data;                     /* data interface */
@@ -245,10 +267,10 @@ struct xr21v141x {
        u8 *country_codes;                              /* country codes from device */
        unsigned int country_code_size;                 /* size of this buffer */
        unsigned int country_rel_date;                  /* release date of version */
-       struct xr21v141x_wb wb[ACM_NW];
+       struct acm_wb wb[ACM_NW];
        unsigned long read_urbs_free;
        struct urb *read_urbs[ACM_NR];
-       struct xr21v141x_rb read_buffers[ACM_NR];
+       struct acm_rb read_buffers[ACM_NR];
        int rx_buflimit;
        int rx_endpoint;
        spinlock_t read_lock;
@@ -261,6 +283,9 @@ struct xr21v141x {
        struct work_struct work;                        /* work queue entry for line discipline waking up */
        unsigned int ctrlin;                            /* input control lines (DCD, DSR, RI, break, overruns) */
        unsigned int ctrlout;                           /* output control lines (DTR, RTS) */
+       struct async_icount iocount;                    /* counters for control line changes */
+       struct async_icount oldcount;                   /* for comparison of counter */
+       wait_queue_head_t wioctl;                       /* for ioctl */
        unsigned int writesize;                         /* max packet size for the output bulk endpoint */
        unsigned int readsize,ctrlsize;                 /* buffer sizes for freeing */
        unsigned int minor;                             /* acm minor number */
@@ -272,8 +297,9 @@ struct xr21v141x {
        unsigned int throttled:1;                       /* actually throttled */
        unsigned int throttle_req:1;                    /* throttle requested */
        u8 bInterval;
-       struct xr21v141x_wb *delayed_wb;                        /* write queued for a device about to be woken
- */
+       struct usb_anchor delayed;                      /* writes queued for a device about to be woken */
+       unsigned long quirks;
+
         int           block;
         int           preciseflags; /* USB: wide mode, TTY: flags per character */
         int           trans9;   /* USB: wide mode, serial 9N1 */
@@ -285,11 +311,14 @@ struct xr21v141x {
 };
 
 #define CDC_DATA_INTERFACE_TYPE        0x0a
+
 /* constants describing various quirks and errors */
-#define NO_UNION_NORMAL                        1
-#define SINGLE_RX_URB                  2
-#define NO_CAP_LINE                    4
-#define NOT_A_MODEM                    8
-#define NO_DATA_INTERFACE              16
+#define NO_UNION_NORMAL                        BIT(0)
+#define SINGLE_RX_URB                  BIT(1)
+#define NO_CAP_LINE                    BIT(2)
+#define NO_DATA_INTERFACE              BIT(4)
+#define IGNORE_DEVICE                  BIT(5)
+#define QUIRK_CONTROL_LINE_STATE       BIT(6)
+#define CLEAR_HALT_CONDITIONS          BIT(7)
 
 #endif /*VIZZINI_H*/