cdc-phonet.c 9.9 KB

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