1 /****************************************************************************** 2 * usbatm.h - Generic USB xDSL driver core 3 * 4 * Copyright (C) 2001, Alcatel 5 * Copyright (C) 2003, Duncan Sands, SolNegro, Josep Comas 6 * Copyright (C) 2004, David Woodhouse 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the Free 10 * Software Foundation; either version 2 of the License, or (at your option) 11 * any later version. 12 * 13 * This program is distributed in the hope that it will be useful, but WITHOUT 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 16 * more details. 17 * 18 * You should have received a copy of the GNU General Public License along with 19 * this program; if not, write to the Free Software Foundation, Inc., 59 20 * Temple Place - Suite 330, Boston, MA 02111-1307, USA. 21 * 22 ******************************************************************************/ 23 24 #ifndef _USBATM_H_ 25 #define _USBATM_H_ 26 27 #include <linux/atm.h> 28 #include <linux/atmdev.h> 29 #include <linux/completion.h> 30 #include <linux/device.h> 31 #include <linux/kernel.h> 32 #include <linux/kref.h> 33 #include <linux/list.h> 34 #include <linux/stringify.h> 35 #include <linux/usb.h> 36 #include <linux/mutex.h> 37 #include <linux/ratelimit.h> 38 39 /* 40 #define VERBOSE_DEBUG 41 */ 42 43 #define usb_err(instance, format, arg...) \ 44 dev_err(&(instance)->usb_intf->dev , format , ## arg) 45 #define usb_info(instance, format, arg...) \ 46 dev_info(&(instance)->usb_intf->dev , format , ## arg) 47 #define usb_warn(instance, format, arg...) \ 48 dev_warn(&(instance)->usb_intf->dev , format , ## arg) 49 #define usb_dbg(instance, format, arg...) \ 50 dev_dbg(&(instance)->usb_intf->dev , format , ## arg) 51 52 /* FIXME: move to dev_* once ATM is driver model aware */ 53 #define atm_printk(level, instance, format, arg...) \ 54 printk(level "ATM dev %d: " format , \ 55 (instance)->atm_dev->number , ## arg) 56 57 #define atm_err(instance, format, arg...) \ 58 atm_printk(KERN_ERR, instance , format , ## arg) 59 #define atm_info(instance, format, arg...) \ 60 atm_printk(KERN_INFO, instance , format , ## arg) 61 #define atm_warn(instance, format, arg...) \ 62 atm_printk(KERN_WARNING, instance , format , ## arg) 63 #define atm_dbg(instance, format, ...) \ 64 pr_debug("ATM dev %d: " format, \ 65 (instance)->atm_dev->number, ##__VA_ARGS__) 66 #define atm_rldbg(instance, format, ...) \ 67 pr_debug_ratelimited("ATM dev %d: " format, \ 68 (instance)->atm_dev->number, ##__VA_ARGS__) 69 70 /* flags, set by mini-driver in bind() */ 71 72 #define UDSL_SKIP_HEAVY_INIT (1<<0) 73 #define UDSL_USE_ISOC (1<<1) 74 #define UDSL_IGNORE_EILSEQ (1<<2) 75 76 77 /* mini driver */ 78 79 struct usbatm_data; 80 81 /* 82 * Assuming all methods exist and succeed, they are called in this order: 83 * 84 * bind, heavy_init, atm_start, ..., atm_stop, unbind 85 */ 86 87 struct usbatm_driver { 88 const char *driver_name; 89 90 /* init device ... can sleep, or cause probe() failure */ 91 int (*bind) (struct usbatm_data *, struct usb_interface *, 92 const struct usb_device_id *id); 93 94 /* additional device initialization that is too slow to be done in probe() */ 95 int (*heavy_init) (struct usbatm_data *, struct usb_interface *); 96 97 /* cleanup device ... can sleep, but can't fail */ 98 void (*unbind) (struct usbatm_data *, struct usb_interface *); 99 100 /* init ATM device ... can sleep, or cause ATM initialization failure */ 101 int (*atm_start) (struct usbatm_data *, struct atm_dev *); 102 103 /* cleanup ATM device ... can sleep, but can't fail */ 104 void (*atm_stop) (struct usbatm_data *, struct atm_dev *); 105 106 int bulk_in; /* bulk rx endpoint */ 107 int isoc_in; /* isochronous rx endpoint */ 108 int bulk_out; /* bulk tx endpoint */ 109 110 unsigned rx_padding; 111 unsigned tx_padding; 112 }; 113 114 extern int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id, 115 struct usbatm_driver *driver); 116 extern void usbatm_usb_disconnect(struct usb_interface *intf); 117 118 119 struct usbatm_channel { 120 int endpoint; /* usb pipe */ 121 unsigned int stride; /* ATM cell size + padding */ 122 unsigned int buf_size; /* urb buffer size */ 123 unsigned int packet_size; /* endpoint maxpacket */ 124 spinlock_t lock; 125 struct list_head list; 126 struct tasklet_struct tasklet; 127 struct timer_list delay; 128 struct usbatm_data *usbatm; 129 }; 130 131 /* main driver data */ 132 133 struct usbatm_data { 134 /****************** 135 * public fields * 136 ******************/ 137 138 /* mini driver */ 139 struct usbatm_driver *driver; 140 void *driver_data; 141 char driver_name[16]; 142 unsigned int flags; /* set by mini-driver in bind() */ 143 144 /* USB device */ 145 struct usb_device *usb_dev; 146 struct usb_interface *usb_intf; 147 char description[64]; 148 149 /* ATM device */ 150 struct atm_dev *atm_dev; 151 152 /******************************** 153 * private fields - do not use * 154 ********************************/ 155 156 struct kref refcount; 157 struct mutex serialize; 158 int disconnected; 159 160 /* heavy init */ 161 struct task_struct *thread; 162 struct completion thread_started; 163 struct completion thread_exited; 164 165 /* ATM device */ 166 struct list_head vcc_list; 167 168 struct usbatm_channel rx_channel; 169 struct usbatm_channel tx_channel; 170 171 struct sk_buff_head sndqueue; 172 struct sk_buff *current_skb; /* being emptied */ 173 174 struct usbatm_vcc_data *cached_vcc; 175 int cached_vci; 176 short cached_vpi; 177 178 unsigned char *cell_buf; /* holds partial rx cell */ 179 unsigned int buf_usage; 180 181 struct urb *urbs[0]; 182 }; 183 184 static inline void *to_usbatm_driver_data(struct usb_interface *intf) 185 { 186 struct usbatm_data *usbatm_instance; 187 188 if (intf == NULL) 189 return NULL; 190 191 usbatm_instance = usb_get_intfdata(intf); 192 193 if (usbatm_instance == NULL) /* set NULL before unbind() */ 194 return NULL; 195 196 return usbatm_instance->driver_data; /* set NULL after unbind() */ 197 } 198 199 #endif /* _USBATM_H_ */ 200