14 #include <linux/slab.h>
15 #include <linux/kernel.h>
16 #include <linux/device.h>
18 #include <linux/netdevice.h>
19 #include <linux/if_ether.h>
20 #include <linux/if_phonet.h>
21 #include <linux/if_arp.h>
23 #include <linux/usb/ch9.h>
29 #define PN_MEDIA_USB 0x1B
31 #if (PAGE_SIZE % MAXPACKET)
32 #error MAXPACKET must divide PAGE_SIZE!
55 static int phonet_rxq_size = 17;
64 #define USB_CDC_SUBCLASS_PHONET 0xfe
65 #define USB_CDC_PHONET_TYPE 0xab
68 pn_control_intf_desc = {
69 .bLength =
sizeof pn_control_intf_desc,
79 .bLength =
sizeof pn_header_desc,
87 .bLength =
sizeof pn_phonet_desc,
95 .bLength =
sizeof pn_union_desc,
104 pn_data_nop_intf_desc = {
105 .bLength =
sizeof pn_data_nop_intf_desc,
109 .bAlternateSetting = 0,
115 pn_data_intf_desc = {
116 .bLength =
sizeof pn_data_intf_desc,
120 .bAlternateSetting = 1,
145 pn_fs_source_desc = {
154 pn_hs_source_desc = {
191 netif_wake_queue(dev);
197 netif_stop_queue(dev);
209 dev->
stats.tx_packets++;
215 dev->
stats.tx_aborted_errors++;
217 dev->
stats.tx_errors++;
221 netif_wake_queue(dev);
249 netif_stop_queue(dev);
253 spin_unlock_irqrestore(&port->
lock, flags);
257 dev->
stats.tx_dropped++;
262 static int pn_net_mtu(
struct net_device *dev,
int new_mtu)
271 .ndo_open = pn_net_open,
272 .ndo_stop = pn_net_close,
273 .ndo_start_xmit = pn_net_xmit,
274 .ndo_change_mtu = pn_net_mtu,
277 static void pn_net_setup(
struct net_device *dev)
312 err = usb_ep_queue(fp->
out_ep, req, gfp_flags);
322 struct page *page = req->
context;
332 skb = fp->
rx.skb = netdev_alloc_skb(dev, 12);
335 spin_unlock_irqrestore(&fp->
rx.lock, flags);
342 skb_reset_mac_header(skb);
353 dev->
stats.rx_packets++;
369 dev->
stats.rx_over_errors++;
371 dev->
stats.rx_errors++;
385 struct f_phonet *fp = func_to_pn(f);
392 usb_ep_disable(fp->
out_ep);
393 usb_ep_disable(fp->
in_ep);
402 struct f_phonet *fp = func_to_pn(f);
407 return (alt > 0) ? -
EINVAL : 0;
417 spin_lock(&port->
lock);
426 spin_unlock(&port->
lock);
429 usb_ep_enable(fp->
out_ep);
430 usb_ep_enable(fp->
in_ep);
437 for (i = 0; i < phonet_rxq_size; i++)
440 spin_unlock(&port->
lock);
447 static int pn_get_alt(
struct usb_function *f,
unsigned intf)
449 struct f_phonet *fp = func_to_pn(f);
458 spin_lock(&port->
lock);
460 spin_unlock(&port->
lock);
469 struct f_phonet *fp = func_to_pn(f);
476 spin_unlock_irqrestore(&port->
lock, flags);
486 struct f_phonet *fp = func_to_pn(f);
524 fp->
function.descriptors = fs_pn_function;
525 fp->
function.hs_descriptors = hs_pn_function;
529 for (i = 0; i < phonet_rxq_size; i++) {
545 INFO(cdev,
"USB CDC Phonet function\n");
546 INFO(cdev,
"using %s, OUT %s, IN %s\n", cdev->
gadget->name,
555 ERROR(cdev,
"USB CDC Phonet: cannot autoconfigure\n");
562 struct f_phonet *fp = func_to_pn(f);
568 for (i = 0; i < phonet_rxq_size; i++)
584 size =
sizeof(*fp) + (phonet_rxq_size *
sizeof(
struct usb_request *));
595 fp->
function.disable = pn_disconnect;
611 dev =
alloc_netdev(
sizeof(*port),
"upnlink%d", pn_net_setup);
615 port = netdev_priv(dev);