xref: /openbmc/linux/drivers/usb/atm/usbatm.h (revision ead5d1f4d877e92c051e1a1ade623d0d30e71619)
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