Merge branch 'fix/hda' into for-linus
[pandora-kernel.git] / drivers / net / usb / cdc-phonet.c
1 /*
2  * phonet.c -- USB CDC Phonet host driver
3  *
4  * Copyright (C) 2008-2009 Nokia Corporation. All rights reserved.
5  *
6  * Author: Rémi Denis-Courmont
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * version 2 as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  */
22
23 #include <linux/kernel.h>
24 #include <linux/module.h>
25 #include <linux/usb.h>
26 #include <linux/usb/cdc.h>
27 #include <linux/netdevice.h>
28 #include <linux/if_arp.h>
29 #include <linux/if_phonet.h>
30
31 #define PN_MEDIA_USB    0x1B
32
33 static const unsigned rxq_size = 17;
34
35 struct usbpn_dev {
36         struct net_device       *dev;
37
38         struct usb_interface    *intf, *data_intf;
39         struct usb_device       *usb;
40         unsigned int            tx_pipe, rx_pipe;
41         u8 active_setting;
42         u8 disconnected;
43
44         unsigned                tx_queue;
45         spinlock_t              tx_lock;
46
47         spinlock_t              rx_lock;
48         struct sk_buff          *rx_skb;
49         struct urb              *urbs[0];
50 };
51
52 static void tx_complete(struct urb *req);
53 static void rx_complete(struct urb *req);
54
55 /*
56  * Network device callbacks
57  */
58 static int usbpn_xmit(struct sk_buff *skb, struct net_device *dev)
59 {
60         struct usbpn_dev *pnd = netdev_priv(dev);
61         struct urb *req = NULL;
62         unsigned long flags;
63         int err;
64
65         if (skb->protocol != htons(ETH_P_PHONET))
66                 goto drop;
67
68         req = usb_alloc_urb(0, GFP_ATOMIC);
69         if (!req)
70                 goto drop;
71         usb_fill_bulk_urb(req, pnd->usb, pnd->tx_pipe, skb->data, skb->len,
72                                 tx_complete, skb);
73         req->transfer_flags = URB_ZERO_PACKET;
74         err = usb_submit_urb(req, GFP_ATOMIC);
75         if (err) {
76                 usb_free_urb(req);
77                 goto drop;
78         }
79
80         spin_lock_irqsave(&pnd->tx_lock, flags);
81         pnd->tx_queue++;
82         if (pnd->tx_queue >= dev->tx_queue_len)
83                 netif_stop_queue(dev);
84         spin_unlock_irqrestore(&pnd->tx_lock, flags);
85         return 0;
86
87 drop:
88         dev_kfree_skb(skb);
89         dev->stats.tx_dropped++;
90         return 0;
91 }
92
93 static void tx_complete(struct urb *req)
94 {
95         struct sk_buff *skb = req->context;
96         struct net_device *dev = skb->dev;
97         struct usbpn_dev *pnd = netdev_priv(dev);
98
99         switch (req->status) {
100         case 0:
101                 dev->stats.tx_bytes += skb->len;
102                 break;
103
104         case -ENOENT:
105         case -ECONNRESET:
106         case -ESHUTDOWN:
107                 dev->stats.tx_aborted_errors++;
108         default:
109                 dev->stats.tx_errors++;
110                 dev_dbg(&dev->dev, "TX error (%d)\n", req->status);
111         }
112         dev->stats.tx_packets++;
113
114         spin_lock(&pnd->tx_lock);
115         pnd->tx_queue--;
116         netif_wake_queue(dev);
117         spin_unlock(&pnd->tx_lock);
118
119         dev_kfree_skb_any(skb);
120         usb_free_urb(req);
121 }
122
123 static int rx_submit(struct usbpn_dev *pnd, struct urb *req, gfp_t gfp_flags)
124 {
125         struct net_device *dev = pnd->dev;
126         struct page *page;
127         int err;
128
129         page = __netdev_alloc_page(dev, gfp_flags);
130         if (!page)
131                 return -ENOMEM;
132
133         usb_fill_bulk_urb(req, pnd->usb, pnd->rx_pipe, page_address(page),
134                                 PAGE_SIZE, rx_complete, dev);
135         req->transfer_flags = 0;
136         err = usb_submit_urb(req, gfp_flags);
137         if (unlikely(err)) {
138                 dev_dbg(&dev->dev, "RX submit error (%d)\n", err);
139                 netdev_free_page(dev, page);
140         }
141         return err;
142 }
143
144 static void rx_complete(struct urb *req)
145 {
146         struct net_device *dev = req->context;
147         struct usbpn_dev *pnd = netdev_priv(dev);
148         struct page *page = virt_to_page(req->transfer_buffer);
149         struct sk_buff *skb;
150         unsigned long flags;
151
152         switch (req->status) {
153         case 0:
154                 spin_lock_irqsave(&pnd->rx_lock, flags);
155                 skb = pnd->rx_skb;
156                 if (!skb) {
157                         skb = pnd->rx_skb = netdev_alloc_skb(dev, 12);
158                         if (likely(skb)) {
159                                 /* Can't use pskb_pull() on page in IRQ */
160                                 memcpy(skb_put(skb, 1), page_address(page), 1);
161                                 skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
162                                                 page, 1, req->actual_length);
163                                 page = NULL;
164                         }
165                 } else {
166                         skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
167                                         page, 0, req->actual_length);
168                         page = NULL;
169                 }
170                 if (req->actual_length < PAGE_SIZE)
171                         pnd->rx_skb = NULL; /* Last fragment */
172                 else
173                         skb = NULL;
174                 spin_unlock_irqrestore(&pnd->rx_lock, flags);
175                 if (skb) {
176                         skb->protocol = htons(ETH_P_PHONET);
177                         skb_reset_mac_header(skb);
178                         __skb_pull(skb, 1);
179                         skb->dev = dev;
180                         dev->stats.rx_packets++;
181                         dev->stats.rx_bytes += skb->len;
182
183                         netif_rx(skb);
184                 }
185                 goto resubmit;
186
187         case -ENOENT:
188         case -ECONNRESET:
189         case -ESHUTDOWN:
190                 req = NULL;
191                 break;
192
193         case -EOVERFLOW:
194                 dev->stats.rx_over_errors++;
195                 dev_dbg(&dev->dev, "RX overflow\n");
196                 break;
197
198         case -EILSEQ:
199                 dev->stats.rx_crc_errors++;
200                 break;
201         }
202
203         dev->stats.rx_errors++;
204 resubmit:
205         if (page)
206                 netdev_free_page(dev, page);
207         if (req)
208                 rx_submit(pnd, req, GFP_ATOMIC);
209 }
210
211 static int usbpn_close(struct net_device *dev);
212
213 static int usbpn_open(struct net_device *dev)
214 {
215         struct usbpn_dev *pnd = netdev_priv(dev);
216         int err;
217         unsigned i;
218         unsigned num = pnd->data_intf->cur_altsetting->desc.bInterfaceNumber;
219
220         err = usb_set_interface(pnd->usb, num, pnd->active_setting);
221         if (err)
222                 return err;
223
224         for (i = 0; i < rxq_size; i++) {
225                 struct urb *req = usb_alloc_urb(0, GFP_KERNEL);
226
227                 if (!req || rx_submit(pnd, req, GFP_KERNEL)) {
228                         usbpn_close(dev);
229                         return -ENOMEM;
230                 }
231                 pnd->urbs[i] = req;
232         }
233
234         netif_wake_queue(dev);
235         return 0;
236 }
237
238 static int usbpn_close(struct net_device *dev)
239 {
240         struct usbpn_dev *pnd = netdev_priv(dev);
241         unsigned i;
242         unsigned num = pnd->data_intf->cur_altsetting->desc.bInterfaceNumber;
243
244         netif_stop_queue(dev);
245
246         for (i = 0; i < rxq_size; i++) {
247                 struct urb *req = pnd->urbs[i];
248
249                 if (!req)
250                         continue;
251                 usb_kill_urb(req);
252                 usb_free_urb(req);
253                 pnd->urbs[i] = NULL;
254         }
255
256         return usb_set_interface(pnd->usb, num, !pnd->active_setting);
257 }
258
259 static int usbpn_set_mtu(struct net_device *dev, int new_mtu)
260 {
261         if ((new_mtu < PHONET_MIN_MTU) || (new_mtu > PHONET_MAX_MTU))
262                 return -EINVAL;
263
264         dev->mtu = new_mtu;
265         return 0;
266 }
267
268 static const struct net_device_ops usbpn_ops = {
269         .ndo_open       = usbpn_open,
270         .ndo_stop       = usbpn_close,
271         .ndo_start_xmit = usbpn_xmit,
272         .ndo_change_mtu = usbpn_set_mtu,
273 };
274
275 static void usbpn_setup(struct net_device *dev)
276 {
277         dev->features           = 0;
278         dev->netdev_ops         = &usbpn_ops,
279         dev->header_ops         = &phonet_header_ops;
280         dev->type               = ARPHRD_PHONET;
281         dev->flags              = IFF_POINTOPOINT | IFF_NOARP;
282         dev->mtu                = PHONET_MAX_MTU;
283         dev->hard_header_len    = 1;
284         dev->dev_addr[0]        = PN_MEDIA_USB;
285         dev->addr_len           = 1;
286         dev->tx_queue_len       = 3;
287
288         dev->destructor         = free_netdev;
289 }
290
291 /*
292  * USB driver callbacks
293  */
294 static struct usb_device_id usbpn_ids[] = {
295         {
296                 .match_flags = USB_DEVICE_ID_MATCH_VENDOR
297                         | USB_DEVICE_ID_MATCH_INT_CLASS
298                         | USB_DEVICE_ID_MATCH_INT_SUBCLASS,
299                 .idVendor = 0x0421, /* Nokia */
300                 .bInterfaceClass = USB_CLASS_COMM,
301                 .bInterfaceSubClass = 0xFE,
302         },
303         { },
304 };
305
306 MODULE_DEVICE_TABLE(usb, usbpn_ids);
307
308 static struct usb_driver usbpn_driver;
309
310 int usbpn_probe(struct usb_interface *intf, const struct usb_device_id *id)
311 {
312         static const char ifname[] = "usbpn%d";
313         const struct usb_cdc_union_desc *union_header = NULL;
314         const struct usb_cdc_header_desc *phonet_header = NULL;
315         const struct usb_host_interface *data_desc;
316         struct usb_interface *data_intf;
317         struct usb_device *usbdev = interface_to_usbdev(intf);
318         struct net_device *dev;
319         struct usbpn_dev *pnd;
320         u8 *data;
321         int len, err;
322
323         data = intf->altsetting->extra;
324         len = intf->altsetting->extralen;
325         while (len >= 3) {
326                 u8 dlen = data[0];
327                 if (dlen < 3)
328                         return -EINVAL;
329
330                 /* bDescriptorType */
331                 if (data[1] == USB_DT_CS_INTERFACE) {
332                         /* bDescriptorSubType */
333                         switch (data[2]) {
334                         case USB_CDC_UNION_TYPE:
335                                 if (union_header || dlen < 5)
336                                         break;
337                                 union_header =
338                                         (struct usb_cdc_union_desc *)data;
339                                 break;
340                         case 0xAB:
341                                 if (phonet_header || dlen < 5)
342                                         break;
343                                 phonet_header =
344                                         (struct usb_cdc_header_desc *)data;
345                                 break;
346                         }
347                 }
348                 data += dlen;
349                 len -= dlen;
350         }
351
352         if (!union_header || !phonet_header)
353                 return -EINVAL;
354
355         data_intf = usb_ifnum_to_if(usbdev, union_header->bSlaveInterface0);
356         if (data_intf == NULL)
357                 return -ENODEV;
358         /* Data interface has one inactive and one active setting */
359         if (data_intf->num_altsetting != 2)
360                 return -EINVAL;
361         if (data_intf->altsetting[0].desc.bNumEndpoints == 0
362          && data_intf->altsetting[1].desc.bNumEndpoints == 2)
363                 data_desc = data_intf->altsetting + 1;
364         else
365         if (data_intf->altsetting[0].desc.bNumEndpoints == 2
366          && data_intf->altsetting[1].desc.bNumEndpoints == 0)
367                 data_desc = data_intf->altsetting;
368         else
369                 return -EINVAL;
370
371         dev = alloc_netdev(sizeof(*pnd) + sizeof(pnd->urbs[0]) * rxq_size,
372                                 ifname, usbpn_setup);
373         if (!dev)
374                 return -ENOMEM;
375
376         pnd = netdev_priv(dev);
377         SET_NETDEV_DEV(dev, &intf->dev);
378         netif_stop_queue(dev);
379
380         pnd->dev = dev;
381         pnd->usb = usb_get_dev(usbdev);
382         pnd->intf = intf;
383         pnd->data_intf = data_intf;
384         spin_lock_init(&pnd->tx_lock);
385         spin_lock_init(&pnd->rx_lock);
386         /* Endpoints */
387         if (usb_pipein(data_desc->endpoint[0].desc.bEndpointAddress)) {
388                 pnd->rx_pipe = usb_rcvbulkpipe(usbdev,
389                         data_desc->endpoint[0].desc.bEndpointAddress);
390                 pnd->tx_pipe = usb_sndbulkpipe(usbdev,
391                         data_desc->endpoint[1].desc.bEndpointAddress);
392         } else {
393                 pnd->rx_pipe = usb_rcvbulkpipe(usbdev,
394                         data_desc->endpoint[1].desc.bEndpointAddress);
395                 pnd->tx_pipe = usb_sndbulkpipe(usbdev,
396                         data_desc->endpoint[0].desc.bEndpointAddress);
397         }
398         pnd->active_setting = data_desc - data_intf->altsetting;
399
400         err = usb_driver_claim_interface(&usbpn_driver, data_intf, pnd);
401         if (err)
402                 goto out;
403
404         /* Force inactive mode until the network device is brought UP */
405         usb_set_interface(usbdev, union_header->bSlaveInterface0,
406                                 !pnd->active_setting);
407         usb_set_intfdata(intf, pnd);
408
409         err = register_netdev(dev);
410         if (err) {
411                 usb_driver_release_interface(&usbpn_driver, data_intf);
412                 goto out;
413         }
414
415         dev_dbg(&dev->dev, "USB CDC Phonet device found\n");
416         return 0;
417
418 out:
419         usb_set_intfdata(intf, NULL);
420         free_netdev(dev);
421         return err;
422 }
423
424 static void usbpn_disconnect(struct usb_interface *intf)
425 {
426         struct usbpn_dev *pnd = usb_get_intfdata(intf);
427         struct usb_device *usb = pnd->usb;
428
429         if (pnd->disconnected)
430                 return;
431
432         pnd->disconnected = 1;
433         usb_driver_release_interface(&usbpn_driver,
434                         (pnd->intf == intf) ? pnd->data_intf : pnd->intf);
435         unregister_netdev(pnd->dev);
436         usb_put_dev(usb);
437 }
438
439 static struct usb_driver usbpn_driver = {
440         .name =         "cdc_phonet",
441         .probe =        usbpn_probe,
442         .disconnect =   usbpn_disconnect,
443         .id_table =     usbpn_ids,
444 };
445
446 static int __init usbpn_init(void)
447 {
448         return usb_register(&usbpn_driver);
449 }
450
451 static void __exit usbpn_exit(void)
452 {
453         usb_deregister(&usbpn_driver);
454 }
455
456 module_init(usbpn_init);
457 module_exit(usbpn_exit);
458
459 MODULE_AUTHOR("Remi Denis-Courmont");
460 MODULE_DESCRIPTION("USB CDC Phonet host interface");
461 MODULE_LICENSE("GPL");