162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Includes for cdc-acm.c 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Mainly take from usbnet's cdc-ether part 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* 1162306a36Sopenharmony_ci * Major and minor numbers. 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define ACM_TTY_MAJOR 166 1562306a36Sopenharmony_ci#define ACM_TTY_MINORS 256 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define ACM_MINOR_INVALID ACM_TTY_MINORS 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* 2062306a36Sopenharmony_ci * Requests. 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define USB_RT_ACM (USB_TYPE_CLASS | USB_RECIP_INTERFACE) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* 2662306a36Sopenharmony_ci * Internal driver structures. 2762306a36Sopenharmony_ci */ 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* 3062306a36Sopenharmony_ci * The only reason to have several buffers is to accommodate assumptions 3162306a36Sopenharmony_ci * in line disciplines. They ask for empty space amount, receive our URB size, 3262306a36Sopenharmony_ci * and proceed to issue several 1-character writes, assuming they will fit. 3362306a36Sopenharmony_ci * The very first write takes a complete URB. Fortunately, this only happens 3462306a36Sopenharmony_ci * when processing onlcr, so we only need 2 buffers. These values must be 3562306a36Sopenharmony_ci * powers of 2. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_ci#define ACM_NW 16 3862306a36Sopenharmony_ci#define ACM_NR 16 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct acm_wb { 4162306a36Sopenharmony_ci u8 *buf; 4262306a36Sopenharmony_ci dma_addr_t dmah; 4362306a36Sopenharmony_ci unsigned int len; 4462306a36Sopenharmony_ci struct urb *urb; 4562306a36Sopenharmony_ci struct acm *instance; 4662306a36Sopenharmony_ci bool use; 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistruct acm_rb { 5062306a36Sopenharmony_ci int size; 5162306a36Sopenharmony_ci unsigned char *base; 5262306a36Sopenharmony_ci dma_addr_t dma; 5362306a36Sopenharmony_ci int index; 5462306a36Sopenharmony_ci struct acm *instance; 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistruct acm { 5862306a36Sopenharmony_ci struct usb_device *dev; /* the corresponding usb device */ 5962306a36Sopenharmony_ci struct usb_interface *control; /* control interface */ 6062306a36Sopenharmony_ci struct usb_interface *data; /* data interface */ 6162306a36Sopenharmony_ci unsigned in, out; /* i/o pipes */ 6262306a36Sopenharmony_ci struct tty_port port; /* our tty port data */ 6362306a36Sopenharmony_ci struct urb *ctrlurb; /* urbs */ 6462306a36Sopenharmony_ci u8 *ctrl_buffer; /* buffers of urbs */ 6562306a36Sopenharmony_ci dma_addr_t ctrl_dma; /* dma handles of buffers */ 6662306a36Sopenharmony_ci u8 *country_codes; /* country codes from device */ 6762306a36Sopenharmony_ci unsigned int country_code_size; /* size of this buffer */ 6862306a36Sopenharmony_ci unsigned int country_rel_date; /* release date of version */ 6962306a36Sopenharmony_ci struct acm_wb wb[ACM_NW]; 7062306a36Sopenharmony_ci unsigned long read_urbs_free; 7162306a36Sopenharmony_ci struct urb *read_urbs[ACM_NR]; 7262306a36Sopenharmony_ci struct acm_rb read_buffers[ACM_NR]; 7362306a36Sopenharmony_ci int rx_buflimit; 7462306a36Sopenharmony_ci spinlock_t read_lock; 7562306a36Sopenharmony_ci u8 *notification_buffer; /* to reassemble fragmented notifications */ 7662306a36Sopenharmony_ci unsigned int nb_index; 7762306a36Sopenharmony_ci unsigned int nb_size; 7862306a36Sopenharmony_ci int transmitting; 7962306a36Sopenharmony_ci spinlock_t write_lock; 8062306a36Sopenharmony_ci struct mutex mutex; 8162306a36Sopenharmony_ci bool disconnected; 8262306a36Sopenharmony_ci unsigned long flags; 8362306a36Sopenharmony_ci# define EVENT_TTY_WAKEUP 0 8462306a36Sopenharmony_ci# define EVENT_RX_STALL 1 8562306a36Sopenharmony_ci# define ACM_THROTTLED 2 8662306a36Sopenharmony_ci# define ACM_ERROR_DELAY 3 8762306a36Sopenharmony_ci unsigned long urbs_in_error_delay; /* these need to be restarted after a delay */ 8862306a36Sopenharmony_ci struct usb_cdc_line_coding line; /* bits, stop, parity */ 8962306a36Sopenharmony_ci struct delayed_work dwork; /* work queue entry for various purposes */ 9062306a36Sopenharmony_ci unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */ 9162306a36Sopenharmony_ci unsigned int ctrlout; /* output control lines (DTR, RTS) */ 9262306a36Sopenharmony_ci struct async_icount iocount; /* counters for control line changes */ 9362306a36Sopenharmony_ci struct async_icount oldcount; /* for comparison of counter */ 9462306a36Sopenharmony_ci wait_queue_head_t wioctl; /* for ioctl */ 9562306a36Sopenharmony_ci unsigned int writesize; /* max packet size for the output bulk endpoint */ 9662306a36Sopenharmony_ci unsigned int readsize,ctrlsize; /* buffer sizes for freeing */ 9762306a36Sopenharmony_ci unsigned int minor; /* acm minor number */ 9862306a36Sopenharmony_ci unsigned char clocal; /* termios CLOCAL */ 9962306a36Sopenharmony_ci unsigned int ctrl_caps; /* control capabilities from the class specific header */ 10062306a36Sopenharmony_ci unsigned int susp_count; /* number of suspended interfaces */ 10162306a36Sopenharmony_ci unsigned int combined_interfaces:1; /* control and data collapsed */ 10262306a36Sopenharmony_ci u8 bInterval; 10362306a36Sopenharmony_ci struct usb_anchor delayed; /* writes queued for a device about to be woken */ 10462306a36Sopenharmony_ci unsigned long quirks; 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci/* constants describing various quirks and errors */ 10862306a36Sopenharmony_ci#define NO_UNION_NORMAL BIT(0) 10962306a36Sopenharmony_ci#define SINGLE_RX_URB BIT(1) 11062306a36Sopenharmony_ci#define NO_CAP_LINE BIT(2) 11162306a36Sopenharmony_ci#define IGNORE_DEVICE BIT(3) 11262306a36Sopenharmony_ci#define QUIRK_CONTROL_LINE_STATE BIT(4) 11362306a36Sopenharmony_ci#define CLEAR_HALT_CONDITIONS BIT(5) 11462306a36Sopenharmony_ci#define SEND_ZERO_PACKET BIT(6) 11562306a36Sopenharmony_ci#define DISABLE_ECHO BIT(7) 116