Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  *
  3  * Includes for cdc-acm.c
  4  *
  5  * Mainly take from usbnet's cdc-ether part
  6  *
  7  */
  8 
  9 /*
 10  * CMSPAR, some architectures can't have space and mark parity.
 11  */
 12 
 13 #ifndef CMSPAR
 14 #define CMSPAR                  0
 15 #endif
 16 
 17 /*
 18  * Major and minor numbers.
 19  */
 20 
 21 #define ACM_TTY_MAJOR           166
 22 #define ACM_TTY_MINORS          32
 23 
 24 /*
 25  * Requests.
 26  */
 27 
 28 #define USB_RT_ACM              (USB_TYPE_CLASS | USB_RECIP_INTERFACE)
 29 
 30 /*
 31  * Output control lines.
 32  */
 33 
 34 #define ACM_CTRL_DTR            0x01
 35 #define ACM_CTRL_RTS            0x02
 36 
 37 /*
 38  * Input control lines and line errors.
 39  */
 40 
 41 #define ACM_CTRL_DCD            0x01
 42 #define ACM_CTRL_DSR            0x02
 43 #define ACM_CTRL_BRK            0x04
 44 #define ACM_CTRL_RI             0x08
 45 
 46 #define ACM_CTRL_FRAMING        0x10
 47 #define ACM_CTRL_PARITY         0x20
 48 #define ACM_CTRL_OVERRUN        0x40
 49 
 50 /*
 51  * Internal driver structures.
 52  */
 53 
 54 /*
 55  * The only reason to have several buffers is to accomodate assumptions
 56  * in line disciplines. They ask for empty space amount, receive our URB size,
 57  * and proceed to issue several 1-character writes, assuming they will fit.
 58  * The very first write takes a complete URB. Fortunately, this only happens
 59  * when processing onlcr, so we only need 2 buffers. These values must be
 60  * powers of 2.
 61  */
 62 #define ACM_NW  2
 63 #define ACM_NR  16
 64 
 65 struct acm_wb {
 66         unsigned char *buf;
 67         dma_addr_t dmah;
 68         int len;
 69         int use;
 70 };
 71 
 72 struct acm_rb {
 73         struct list_head        list;
 74         int                     size;
 75         unsigned char           *base;
 76         dma_addr_t              dma;
 77 };
 78 
 79 struct acm_ru {
 80         struct list_head        list;
 81         struct acm_rb           *buffer;
 82         struct urb              *urb;
 83         struct acm              *instance;
 84 };
 85 
 86 struct acm {
 87         struct usb_device *dev;                         /* the corresponding usb device */
 88         struct usb_interface *control;                  /* control interface */
 89         struct usb_interface *data;                     /* data interface */
 90         struct tty_struct *tty;                         /* the corresponding tty */
 91         struct urb *ctrlurb, *writeurb;                 /* urbs */
 92         u8 *ctrl_buffer;                                /* buffers of urbs */
 93         dma_addr_t ctrl_dma;                            /* dma handles of buffers */
 94         u8 *country_codes;                              /* country codes from device */
 95         unsigned int country_code_size;                 /* size of this buffer */
 96         unsigned int country_rel_date;                  /* release date of version */
 97         struct acm_wb wb[ACM_NW];
 98         struct acm_ru ru[ACM_NR];
 99         struct acm_rb rb[ACM_NR];
100         int rx_buflimit;
101         int rx_endpoint;
102         spinlock_t read_lock;
103         struct list_head spare_read_urbs;
104         struct list_head spare_read_bufs;
105         struct list_head filled_read_bufs;
106         int write_current;                              /* current write buffer */
107         int write_used;                                 /* number of non-empty write buffers */
108         int write_ready;                                /* write urb is not running */
109         spinlock_t write_lock;
110         struct mutex mutex;
111         struct usb_cdc_line_coding line;                /* bits, stop, parity */
112         struct work_struct work;                        /* work queue entry for line discipline waking up */
113         struct tasklet_struct urb_task;                 /* rx processing */
114         spinlock_t throttle_lock;                       /* synchronize throtteling and read callback */
115         unsigned int ctrlin;                            /* input control lines (DCD, DSR, RI, break, overruns) */
116         unsigned int ctrlout;                           /* output control lines (DTR, RTS) */
117         unsigned int writesize;                         /* max packet size for the output bulk endpoint */
118         unsigned int readsize,ctrlsize;                 /* buffer sizes for freeing */
119         unsigned int used;                              /* someone has this acm's device open */
120         unsigned int minor;                             /* acm minor number */
121         unsigned char throttle;                         /* throttled by tty layer */
122         unsigned char clocal;                           /* termios CLOCAL */
123         unsigned int ctrl_caps;                         /* control capabilities from the class specific header */
124         unsigned int susp_count;                        /* number of suspended interfaces */
125 };
126 
127 #define CDC_DATA_INTERFACE_TYPE 0x0a
128 
129 /* constants describing various quirks and errors */
130 #define NO_UNION_NORMAL                 1
131 #define SINGLE_RX_URB                   2
132 
  This page was automatically generated by the LXR engine.