* Major and minor numbers.
*/
-#define XR21V141X_TTY_MAJOR 166
-#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 */
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;
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 */
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 */
};
#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*/