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/mm.h> 25 #include <linux/module.h> 26 #include <linux/gfp.h> 27 #include <linux/usb.h> 28 #include <linux/usb/cdc.h> 29 #include <linux/netdevice.h> 30 #include <linux/if_arp.h> 31 #include <linux/if_phonet.h> 32 #include <linux/phonet.h> 33 34 #define PN_MEDIA_USB 0x1B 35 36 static const unsigned rxq_size = 17; 37 38 struct usbpn_dev { 39 struct net_device *dev; 40 41 struct usb_interface *intf, *data_intf; 42 struct usb_device *usb; 43 unsigned int tx_pipe, rx_pipe; 44 u8 active_setting; 45 u8 disconnected; 46 47 unsigned tx_queue; 48 spinlock_t tx_lock; 49 50 spinlock_t rx_lock; 51 struct sk_buff *rx_skb; 52 struct urb *urbs[0]; 53 }; 54 55 static void tx_complete(struct urb *req); 56 static void rx_complete(struct urb *req); 57 58 /* 59 * Network device callbacks 60 */ 61 static netdev_tx_t usbpn_xmit(struct sk_buff *skb, struct net_device *dev) 62 { 63 struct usbpn_dev *pnd = netdev_priv(dev); 64 struct urb *req = NULL; 65 unsigned long flags; 66 int err; 67 68 if (skb->protocol != htons(ETH_P_PHONET)) 69 goto drop; 70 71 req = usb_alloc_urb(0, GFP_ATOMIC); 72 if (!req) 73 goto drop; 74 usb_fill_bulk_urb(req, pnd->usb, pnd->tx_pipe, skb->data, skb->len, 75 tx_complete, skb); 76 req->transfer_flags = URB_ZERO_PACKET; 77 err = usb_submit_urb(req, GFP_ATOMIC); 78 if (err) { 79 usb_free_urb(req); 80 goto drop; 81 } 82 83 spin_lock_irqsave(&pnd->tx_lock, flags); 84 pnd->tx_queue++; 85 if (pnd->tx_queue >= dev->tx_queue_len) 86 netif_stop_queue(dev); 87 spin_unlock_irqrestore(&pnd->tx_lock, flags); 88 return NETDEV_TX_OK; 89 90 drop: 91 dev_kfree_skb(skb); 92 dev->stats.tx_dropped++; 93 return NETDEV_TX_OK; 94 } 95 96 static void tx_complete(struct urb *req) 97 { 98 struct sk_buff *skb = req->context; 99 struct net_device *dev = skb->dev; 100 struct usbpn_dev *pnd = netdev_priv(dev); 101 int status = req->status; 102 unsigned long flags; 103 104 switch (status) { 105 case 0: 106 dev->stats.tx_bytes += skb->len; 107 break; 108 109 case -ENOENT: 110 case -ECONNRESET: 111 case -ESHUTDOWN: 112 dev->stats.tx_aborted_errors++; 113 default: 114 dev->stats.tx_errors++; 115 dev_dbg(&dev->dev, "TX error (%d)\n", status); 116 } 117 dev->stats.tx_packets++; 118 119 spin_lock_irqsave(&pnd->tx_lock, flags); 120 pnd->tx_queue--; 121 netif_wake_queue(dev); 122 spin_unlock_irqrestore(&pnd->tx_lock, flags); 123 124 dev_kfree_skb_any(skb); 125 usb_free_urb(req); 126 } 127 128 static int rx_submit(struct usbpn_dev *pnd, struct urb *req, gfp_t gfp_flags) 129 { 130 struct net_device *dev = pnd->dev; 131 struct page *page; 132 int err; 133 134 page = __dev_alloc_page(gfp_flags | __GFP_NOMEMALLOC); 135 if (!page) 136 return -ENOMEM; 137 138 usb_fill_bulk_urb(req, pnd->usb, pnd->rx_pipe, page_address(page), 139 PAGE_SIZE, rx_complete, dev); 140 req->transfer_flags = 0; 141 err = usb_submit_urb(req, gfp_flags); 142 if (unlikely(err)) { 143 dev_dbg(&dev->dev, "RX submit error (%d)\n", err); 144 put_page(page); 145 } 146 return err; 147 } 148 149 static void rx_complete(struct urb *req) 150 { 151 struct net_device *dev = req->context; 152 struct usbpn_dev *pnd = netdev_priv(dev); 153 struct page *page = virt_to_page(req->transfer_buffer); 154 struct sk_buff *skb; 155 unsigned long flags; 156 int status = req->status; 157 158 switch (status) { 159 case 0: 160 spin_lock_irqsave(&pnd->rx_lock, flags); 161 skb = pnd->rx_skb; 162 if (!skb) { 163 skb = pnd->rx_skb = netdev_alloc_skb(dev, 12); 164 if (likely(skb)) { 165 /* Can't use pskb_pull() on page in IRQ */ 166 skb_put_data(skb, page_address(page), 1); 167 skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, 168 page, 1, req->actual_length, 169 PAGE_SIZE); 170 page = NULL; 171 } 172 } else { 173 skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, 174 page, 0, req->actual_length, 175 PAGE_SIZE); 176 page = NULL; 177 } 178 if (req->actual_length < PAGE_SIZE) 179 pnd->rx_skb = NULL; /* Last fragment */ 180 else 181 skb = NULL; 182 spin_unlock_irqrestore(&pnd->rx_lock, flags); 183 if (skb) { 184 skb->protocol = htons(ETH_P_PHONET); 185 skb_reset_mac_header(skb); 186 __skb_pull(skb, 1); 187 skb->dev = dev; 188 dev->stats.rx_packets++; 189 dev->stats.rx_bytes += skb->len; 190 191 netif_rx(skb); 192 } 193 goto resubmit; 194 195 case -ENOENT: 196 case -ECONNRESET: 197 case -ESHUTDOWN: 198 req = NULL; 199 break; 200 201 case -EOVERFLOW: 202 dev->stats.rx_over_errors++; 203 dev_dbg(&dev->dev, "RX overflow\n"); 204 break; 205 206 case -EILSEQ: 207 dev->stats.rx_crc_errors++; 208 break; 209 } 210 211 dev->stats.rx_errors++; 212 resubmit: 213 if (page) 214 put_page(page); 215 if (req) 216 rx_submit(pnd, req, GFP_ATOMIC); 217 } 218 219 static int usbpn_close(struct net_device *dev); 220 221 static int usbpn_open(struct net_device *dev) 222 { 223 struct usbpn_dev *pnd = netdev_priv(dev); 224 int err; 225 unsigned i; 226 unsigned num = pnd->data_intf->cur_altsetting->desc.bInterfaceNumber; 227 228 err = usb_set_interface(pnd->usb, num, pnd->active_setting); 229 if (err) 230 return err; 231 232 for (i = 0; i < rxq_size; i++) { 233 struct urb *req = usb_alloc_urb(0, GFP_KERNEL); 234 235 if (!req || rx_submit(pnd, req, GFP_KERNEL)) { 236 usb_free_urb(req); 237 usbpn_close(dev); 238 return -ENOMEM; 239 } 240 pnd->urbs[i] = req; 241 } 242 243 netif_wake_queue(dev); 244 return 0; 245 } 246 247 static int usbpn_close(struct net_device *dev) 248 { 249 struct usbpn_dev *pnd = netdev_priv(dev); 250 unsigned i; 251 unsigned num = pnd->data_intf->cur_altsetting->desc.bInterfaceNumber; 252 253 netif_stop_queue(dev); 254 255 for (i = 0; i < rxq_size; i++) { 256 struct urb *req = pnd->urbs[i]; 257 258 if (!req) 259 continue; 260 usb_kill_urb(req); 261 usb_free_urb(req); 262 pnd->urbs[i] = NULL; 263 } 264 265 return usb_set_interface(pnd->usb, num, !pnd->active_setting); 266 } 267 268 static int usbpn_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 269 { 270 struct if_phonet_req *req = (struct if_phonet_req *)ifr; 271 272 switch (cmd) { 273 case SIOCPNGAUTOCONF: 274 req->ifr_phonet_autoconf.device = PN_DEV_PC; 275 return 0; 276 } 277 return -ENOIOCTLCMD; 278 } 279 280 static const struct net_device_ops usbpn_ops = { 281 .ndo_open = usbpn_open, 282 .ndo_stop = usbpn_close, 283 .ndo_start_xmit = usbpn_xmit, 284 .ndo_do_ioctl = usbpn_ioctl, 285 }; 286 287 static void usbpn_setup(struct net_device *dev) 288 { 289 dev->features = 0; 290 dev->netdev_ops = &usbpn_ops, 291 dev->header_ops = &phonet_header_ops; 292 dev->type = ARPHRD_PHONET; 293 dev->flags = IFF_POINTOPOINT | IFF_NOARP; 294 dev->mtu = PHONET_MAX_MTU; 295 dev->min_mtu = PHONET_MIN_MTU; 296 dev->max_mtu = PHONET_MAX_MTU; 297 dev->hard_header_len = 1; 298 dev->dev_addr[0] = PN_MEDIA_USB; 299 dev->addr_len = 1; 300 dev->tx_queue_len = 3; 301 302 dev->needs_free_netdev = true; 303 } 304 305 /* 306 * USB driver callbacks 307 */ 308 static const struct usb_device_id usbpn_ids[] = { 309 { 310 .match_flags = USB_DEVICE_ID_MATCH_VENDOR 311 | USB_DEVICE_ID_MATCH_INT_CLASS 312 | USB_DEVICE_ID_MATCH_INT_SUBCLASS, 313 .idVendor = 0x0421, /* Nokia */ 314 .bInterfaceClass = USB_CLASS_COMM, 315 .bInterfaceSubClass = 0xFE, 316 }, 317 { }, 318 }; 319 320 MODULE_DEVICE_TABLE(usb, usbpn_ids); 321 322 static struct usb_driver usbpn_driver; 323 324 static int usbpn_probe(struct usb_interface *intf, const struct usb_device_id *id) 325 { 326 static const char ifname[] = "usbpn%d"; 327 const struct usb_cdc_union_desc *union_header = NULL; 328 const struct usb_host_interface *data_desc; 329 struct usb_interface *data_intf; 330 struct usb_device *usbdev = interface_to_usbdev(intf); 331 struct net_device *dev; 332 struct usbpn_dev *pnd; 333 u8 *data; 334 int phonet = 0; 335 int len, err; 336 struct usb_cdc_parsed_header hdr; 337 338 data = intf->altsetting->extra; 339 len = intf->altsetting->extralen; 340 cdc_parse_cdc_header(&hdr, intf, data, len); 341 union_header = hdr.usb_cdc_union_desc; 342 phonet = hdr.phonet_magic_present; 343 344 if (!union_header || !phonet) 345 return -EINVAL; 346 347 data_intf = usb_ifnum_to_if(usbdev, union_header->bSlaveInterface0); 348 if (data_intf == NULL) 349 return -ENODEV; 350 /* Data interface has one inactive and one active setting */ 351 if (data_intf->num_altsetting != 2) 352 return -EINVAL; 353 if (data_intf->altsetting[0].desc.bNumEndpoints == 0 && 354 data_intf->altsetting[1].desc.bNumEndpoints == 2) 355 data_desc = data_intf->altsetting + 1; 356 else 357 if (data_intf->altsetting[0].desc.bNumEndpoints == 2 && 358 data_intf->altsetting[1].desc.bNumEndpoints == 0) 359 data_desc = data_intf->altsetting; 360 else 361 return -EINVAL; 362 363 dev = alloc_netdev(sizeof(*pnd) + sizeof(pnd->urbs[0]) * rxq_size, 364 ifname, NET_NAME_UNKNOWN, usbpn_setup); 365 if (!dev) 366 return -ENOMEM; 367 368 pnd = netdev_priv(dev); 369 SET_NETDEV_DEV(dev, &intf->dev); 370 371 pnd->dev = dev; 372 pnd->usb = usbdev; 373 pnd->intf = intf; 374 pnd->data_intf = data_intf; 375 spin_lock_init(&pnd->tx_lock); 376 spin_lock_init(&pnd->rx_lock); 377 /* Endpoints */ 378 if (usb_pipein(data_desc->endpoint[0].desc.bEndpointAddress)) { 379 pnd->rx_pipe = usb_rcvbulkpipe(usbdev, 380 data_desc->endpoint[0].desc.bEndpointAddress); 381 pnd->tx_pipe = usb_sndbulkpipe(usbdev, 382 data_desc->endpoint[1].desc.bEndpointAddress); 383 } else { 384 pnd->rx_pipe = usb_rcvbulkpipe(usbdev, 385 data_desc->endpoint[1].desc.bEndpointAddress); 386 pnd->tx_pipe = usb_sndbulkpipe(usbdev, 387 data_desc->endpoint[0].desc.bEndpointAddress); 388 } 389 pnd->active_setting = data_desc - data_intf->altsetting; 390 391 err = usb_driver_claim_interface(&usbpn_driver, data_intf, pnd); 392 if (err) 393 goto out; 394 395 /* Force inactive mode until the network device is brought UP */ 396 usb_set_interface(usbdev, union_header->bSlaveInterface0, 397 !pnd->active_setting); 398 usb_set_intfdata(intf, pnd); 399 400 err = register_netdev(dev); 401 if (err) { 402 usb_driver_release_interface(&usbpn_driver, data_intf); 403 goto out; 404 } 405 406 dev_dbg(&dev->dev, "USB CDC Phonet device found\n"); 407 return 0; 408 409 out: 410 usb_set_intfdata(intf, NULL); 411 free_netdev(dev); 412 return err; 413 } 414 415 static void usbpn_disconnect(struct usb_interface *intf) 416 { 417 struct usbpn_dev *pnd = usb_get_intfdata(intf); 418 419 if (pnd->disconnected) 420 return; 421 422 pnd->disconnected = 1; 423 usb_driver_release_interface(&usbpn_driver, 424 (pnd->intf == intf) ? pnd->data_intf : pnd->intf); 425 unregister_netdev(pnd->dev); 426 } 427 428 static struct usb_driver usbpn_driver = { 429 .name = "cdc_phonet", 430 .probe = usbpn_probe, 431 .disconnect = usbpn_disconnect, 432 .id_table = usbpn_ids, 433 .disable_hub_initiated_lpm = 1, 434 }; 435 436 module_usb_driver(usbpn_driver); 437 438 MODULE_AUTHOR("Remi Denis-Courmont"); 439 MODULE_DESCRIPTION("USB CDC Phonet host interface"); 440 MODULE_LICENSE("GPL"); 441