1*2274048cSNishad Kamdar /* SPDX-License-Identifier: GPL-2.0+ */
2c59bba75SDuncan Sands /******************************************************************************
3c59bba75SDuncan Sands * usbatm.h - Generic USB xDSL driver core
4c59bba75SDuncan Sands *
5c59bba75SDuncan Sands * Copyright (C) 2001, Alcatel
6c59bba75SDuncan Sands * Copyright (C) 2003, Duncan Sands, SolNegro, Josep Comas
7c59bba75SDuncan Sands * Copyright (C) 2004, David Woodhouse
8c59bba75SDuncan Sands ******************************************************************************/
9c59bba75SDuncan Sands
10c59bba75SDuncan Sands #ifndef _USBATM_H_
11c59bba75SDuncan Sands #define _USBATM_H_
12c59bba75SDuncan Sands
13c59bba75SDuncan Sands #include <linux/atm.h>
14c59bba75SDuncan Sands #include <linux/atmdev.h>
15c59bba75SDuncan Sands #include <linux/completion.h>
16c59bba75SDuncan Sands #include <linux/device.h>
170ec3c7e8SDuncan Sands #include <linux/kernel.h>
18c59bba75SDuncan Sands #include <linux/kref.h>
19c59bba75SDuncan Sands #include <linux/list.h>
20c59bba75SDuncan Sands #include <linux/stringify.h>
21c59bba75SDuncan Sands #include <linux/usb.h>
22ab3c81ffSArjan van de Ven #include <linux/mutex.h>
2332e24930SJoe Perches #include <linux/ratelimit.h>
24c59bba75SDuncan Sands
250ec3c7e8SDuncan Sands /*
260ec3c7e8SDuncan Sands #define VERBOSE_DEBUG
270ec3c7e8SDuncan Sands */
280ec3c7e8SDuncan Sands
29c59bba75SDuncan Sands #define usb_err(instance, format, arg...) \
30c59bba75SDuncan Sands dev_err(&(instance)->usb_intf->dev , format , ## arg)
31c59bba75SDuncan Sands #define usb_info(instance, format, arg...) \
32c59bba75SDuncan Sands dev_info(&(instance)->usb_intf->dev , format , ## arg)
33c59bba75SDuncan Sands #define usb_warn(instance, format, arg...) \
34c59bba75SDuncan Sands dev_warn(&(instance)->usb_intf->dev , format , ## arg)
35c59bba75SDuncan Sands #define usb_dbg(instance, format, arg...) \
36ca4d7013SGreg Kroah-Hartman dev_dbg(&(instance)->usb_intf->dev , format , ## arg)
37c59bba75SDuncan Sands
38c59bba75SDuncan Sands /* FIXME: move to dev_* once ATM is driver model aware */
39c59bba75SDuncan Sands #define atm_printk(level, instance, format, arg...) \
40843c944fSAndrew Morton printk(level "ATM dev %d: " format , \
41843c944fSAndrew Morton (instance)->atm_dev->number , ## arg)
42c59bba75SDuncan Sands
43c59bba75SDuncan Sands #define atm_err(instance, format, arg...) \
44c59bba75SDuncan Sands atm_printk(KERN_ERR, instance , format , ## arg)
45c59bba75SDuncan Sands #define atm_info(instance, format, arg...) \
46c59bba75SDuncan Sands atm_printk(KERN_INFO, instance , format , ## arg)
47c59bba75SDuncan Sands #define atm_warn(instance, format, arg...) \
48c59bba75SDuncan Sands atm_printk(KERN_WARNING, instance , format , ## arg)
4932e24930SJoe Perches #define atm_dbg(instance, format, ...) \
5032e24930SJoe Perches pr_debug("ATM dev %d: " format, \
5132e24930SJoe Perches (instance)->atm_dev->number, ##__VA_ARGS__)
5232e24930SJoe Perches #define atm_rldbg(instance, format, ...) \
5332e24930SJoe Perches pr_debug_ratelimited("ATM dev %d: " format, \
5432e24930SJoe Perches (instance)->atm_dev->number, ##__VA_ARGS__)
55c59bba75SDuncan Sands
5635644b0cSDuncan Sands /* flags, set by mini-driver in bind() */
5735644b0cSDuncan Sands
5835644b0cSDuncan Sands #define UDSL_SKIP_HEAVY_INIT (1<<0)
5980aae7a1SDuncan Sands #define UDSL_USE_ISOC (1<<1)
60a3673d3cSDuncan Sands #define UDSL_IGNORE_EILSEQ (1<<2)
6135644b0cSDuncan Sands
6235644b0cSDuncan Sands
63c59bba75SDuncan Sands /* mini driver */
64c59bba75SDuncan Sands
65c59bba75SDuncan Sands struct usbatm_data;
66c59bba75SDuncan Sands
67c59bba75SDuncan Sands /*
68c59bba75SDuncan Sands * Assuming all methods exist and succeed, they are called in this order:
69c59bba75SDuncan Sands *
70c59bba75SDuncan Sands * bind, heavy_init, atm_start, ..., atm_stop, unbind
71c59bba75SDuncan Sands */
72c59bba75SDuncan Sands
73c59bba75SDuncan Sands struct usbatm_driver {
74c59bba75SDuncan Sands const char *driver_name;
75c59bba75SDuncan Sands
7635644b0cSDuncan Sands /* init device ... can sleep, or cause probe() failure */
77c59bba75SDuncan Sands int (*bind) (struct usbatm_data *, struct usb_interface *,
7835644b0cSDuncan Sands const struct usb_device_id *id);
79c59bba75SDuncan Sands
80c59bba75SDuncan Sands /* additional device initialization that is too slow to be done in probe() */
81c59bba75SDuncan Sands int (*heavy_init) (struct usbatm_data *, struct usb_interface *);
82c59bba75SDuncan Sands
83c59bba75SDuncan Sands /* cleanup device ... can sleep, but can't fail */
84c59bba75SDuncan Sands void (*unbind) (struct usbatm_data *, struct usb_interface *);
85c59bba75SDuncan Sands
86c59bba75SDuncan Sands /* init ATM device ... can sleep, or cause ATM initialization failure */
87c59bba75SDuncan Sands int (*atm_start) (struct usbatm_data *, struct atm_dev *);
88c59bba75SDuncan Sands
89c59bba75SDuncan Sands /* cleanup ATM device ... can sleep, but can't fail */
90c59bba75SDuncan Sands void (*atm_stop) (struct usbatm_data *, struct atm_dev *);
91c59bba75SDuncan Sands
9280aae7a1SDuncan Sands int bulk_in; /* bulk rx endpoint */
9380aae7a1SDuncan Sands int isoc_in; /* isochronous rx endpoint */
9480aae7a1SDuncan Sands int bulk_out; /* bulk tx endpoint */
95c59bba75SDuncan Sands
96c59bba75SDuncan Sands unsigned rx_padding;
97c59bba75SDuncan Sands unsigned tx_padding;
98c59bba75SDuncan Sands };
99c59bba75SDuncan Sands
100c59bba75SDuncan Sands extern int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id,
101c59bba75SDuncan Sands struct usbatm_driver *driver);
102c59bba75SDuncan Sands extern void usbatm_usb_disconnect(struct usb_interface *intf);
103c59bba75SDuncan Sands
104c59bba75SDuncan Sands
105c59bba75SDuncan Sands struct usbatm_channel {
106c59bba75SDuncan Sands int endpoint; /* usb pipe */
107c59bba75SDuncan Sands unsigned int stride; /* ATM cell size + padding */
108c59bba75SDuncan Sands unsigned int buf_size; /* urb buffer size */
10980aae7a1SDuncan Sands unsigned int packet_size; /* endpoint maxpacket */
110c59bba75SDuncan Sands spinlock_t lock;
111c59bba75SDuncan Sands struct list_head list;
112c59bba75SDuncan Sands struct tasklet_struct tasklet;
113c59bba75SDuncan Sands struct timer_list delay;
114c59bba75SDuncan Sands struct usbatm_data *usbatm;
115c59bba75SDuncan Sands };
116c59bba75SDuncan Sands
117c59bba75SDuncan Sands /* main driver data */
118c59bba75SDuncan Sands
119c59bba75SDuncan Sands struct usbatm_data {
120c59bba75SDuncan Sands /******************
121c59bba75SDuncan Sands * public fields *
122c59bba75SDuncan Sands ******************/
123c59bba75SDuncan Sands
124c59bba75SDuncan Sands /* mini driver */
125c59bba75SDuncan Sands struct usbatm_driver *driver;
126c59bba75SDuncan Sands void *driver_data;
127c59bba75SDuncan Sands char driver_name[16];
12835644b0cSDuncan Sands unsigned int flags; /* set by mini-driver in bind() */
129c59bba75SDuncan Sands
130c59bba75SDuncan Sands /* USB device */
131c59bba75SDuncan Sands struct usb_device *usb_dev;
132c59bba75SDuncan Sands struct usb_interface *usb_intf;
133c59bba75SDuncan Sands char description[64];
134c59bba75SDuncan Sands
135c59bba75SDuncan Sands /* ATM device */
136c59bba75SDuncan Sands struct atm_dev *atm_dev;
137c59bba75SDuncan Sands
138c59bba75SDuncan Sands /********************************
139c59bba75SDuncan Sands * private fields - do not use *
140c59bba75SDuncan Sands ********************************/
141c59bba75SDuncan Sands
142c59bba75SDuncan Sands struct kref refcount;
143ab3c81ffSArjan van de Ven struct mutex serialize;
1440e42a627SDuncan Sands int disconnected;
145c59bba75SDuncan Sands
146c59bba75SDuncan Sands /* heavy init */
147c4504a7eSPavel Emelyanov struct task_struct *thread;
148c59bba75SDuncan Sands struct completion thread_started;
149c59bba75SDuncan Sands struct completion thread_exited;
150c59bba75SDuncan Sands
151c59bba75SDuncan Sands /* ATM device */
152c59bba75SDuncan Sands struct list_head vcc_list;
153c59bba75SDuncan Sands
154c59bba75SDuncan Sands struct usbatm_channel rx_channel;
155c59bba75SDuncan Sands struct usbatm_channel tx_channel;
156c59bba75SDuncan Sands
157c59bba75SDuncan Sands struct sk_buff_head sndqueue;
158c59bba75SDuncan Sands struct sk_buff *current_skb; /* being emptied */
159c59bba75SDuncan Sands
160e3fb2f64SDuncan Sands struct usbatm_vcc_data *cached_vcc;
161e3fb2f64SDuncan Sands int cached_vci;
162e3fb2f64SDuncan Sands short cached_vpi;
163e3fb2f64SDuncan Sands
164e3fb2f64SDuncan Sands unsigned char *cell_buf; /* holds partial rx cell */
165e3fb2f64SDuncan Sands unsigned int buf_usage;
166e3fb2f64SDuncan Sands
1676bc3f397SGustavo A. R. Silva struct urb *urbs[];
168c59bba75SDuncan Sands };
169c59bba75SDuncan Sands
to_usbatm_driver_data(struct usb_interface * intf)1709fc950d3SSimon Arlott static inline void *to_usbatm_driver_data(struct usb_interface *intf)
1719fc950d3SSimon Arlott {
1729fc950d3SSimon Arlott struct usbatm_data *usbatm_instance;
1739fc950d3SSimon Arlott
1749fc950d3SSimon Arlott if (intf == NULL)
1759fc950d3SSimon Arlott return NULL;
1769fc950d3SSimon Arlott
1779fc950d3SSimon Arlott usbatm_instance = usb_get_intfdata(intf);
1789fc950d3SSimon Arlott
1799fc950d3SSimon Arlott if (usbatm_instance == NULL) /* set NULL before unbind() */
1809fc950d3SSimon Arlott return NULL;
1819fc950d3SSimon Arlott
1829fc950d3SSimon Arlott return usbatm_instance->driver_data; /* set NULL after unbind() */
1839fc950d3SSimon Arlott }
1849fc950d3SSimon Arlott
185c59bba75SDuncan Sands #endif /* _USBATM_H_ */
186