1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Marvell NFC-over-USB driver: USB interface related functions 4 * 5 * Copyright (C) 2014, Marvell International Ltd. 6 */ 7 8 #include <linux/module.h> 9 #include <linux/usb.h> 10 #include <linux/nfc.h> 11 #include <net/nfc/nci.h> 12 #include <net/nfc/nci_core.h> 13 #include "nfcmrvl.h" 14 15 static struct usb_device_id nfcmrvl_table[] = { 16 { USB_DEVICE_AND_INTERFACE_INFO(0x1286, 0x2046, 17 USB_CLASS_VENDOR_SPEC, 4, 1) }, 18 { } /* Terminating entry */ 19 }; 20 21 MODULE_DEVICE_TABLE(usb, nfcmrvl_table); 22 23 #define NFCMRVL_USB_BULK_RUNNING 1 24 #define NFCMRVL_USB_SUSPENDING 2 25 26 struct nfcmrvl_usb_drv_data { 27 struct usb_device *udev; 28 struct usb_interface *intf; 29 unsigned long flags; 30 struct work_struct waker; 31 struct usb_anchor tx_anchor; 32 struct usb_anchor bulk_anchor; 33 struct usb_anchor deferred; 34 int tx_in_flight; 35 /* protects tx_in_flight */ 36 spinlock_t txlock; 37 struct usb_endpoint_descriptor *bulk_tx_ep; 38 struct usb_endpoint_descriptor *bulk_rx_ep; 39 int suspend_count; 40 struct nfcmrvl_private *priv; 41 }; 42 43 static int nfcmrvl_inc_tx(struct nfcmrvl_usb_drv_data *drv_data) 44 { 45 unsigned long flags; 46 int rv; 47 48 spin_lock_irqsave(&drv_data->txlock, flags); 49 rv = test_bit(NFCMRVL_USB_SUSPENDING, &drv_data->flags); 50 if (!rv) 51 drv_data->tx_in_flight++; 52 spin_unlock_irqrestore(&drv_data->txlock, flags); 53 54 return rv; 55 } 56 57 static void nfcmrvl_bulk_complete(struct urb *urb) 58 { 59 struct nfcmrvl_usb_drv_data *drv_data = urb->context; 60 struct sk_buff *skb; 61 int err; 62 63 dev_dbg(&drv_data->udev->dev, "urb %p status %d count %d\n", 64 urb, urb->status, urb->actual_length); 65 66 if (!test_bit(NFCMRVL_NCI_RUNNING, &drv_data->flags)) 67 return; 68 69 if (!urb->status) { 70 skb = nci_skb_alloc(drv_data->priv->ndev, urb->actual_length, 71 GFP_ATOMIC); 72 if (!skb) { 73 nfc_err(&drv_data->udev->dev, "failed to alloc mem\n"); 74 } else { 75 skb_put_data(skb, urb->transfer_buffer, 76 urb->actual_length); 77 if (nfcmrvl_nci_recv_frame(drv_data->priv, skb) < 0) 78 nfc_err(&drv_data->udev->dev, 79 "corrupted Rx packet\n"); 80 } 81 } 82 83 if (!test_bit(NFCMRVL_USB_BULK_RUNNING, &drv_data->flags)) 84 return; 85 86 usb_anchor_urb(urb, &drv_data->bulk_anchor); 87 usb_mark_last_busy(drv_data->udev); 88 89 err = usb_submit_urb(urb, GFP_ATOMIC); 90 if (err) { 91 /* -EPERM: urb is being killed; 92 * -ENODEV: device got disconnected 93 */ 94 if (err != -EPERM && err != -ENODEV) 95 nfc_err(&drv_data->udev->dev, 96 "urb %p failed to resubmit (%d)\n", urb, -err); 97 usb_unanchor_urb(urb); 98 } 99 } 100 101 static int 102 nfcmrvl_submit_bulk_urb(struct nfcmrvl_usb_drv_data *drv_data, gfp_t mem_flags) 103 { 104 struct urb *urb; 105 unsigned char *buf; 106 unsigned int pipe; 107 int err, size = NFCMRVL_NCI_MAX_EVENT_SIZE; 108 109 if (!drv_data->bulk_rx_ep) 110 return -ENODEV; 111 112 urb = usb_alloc_urb(0, mem_flags); 113 if (!urb) 114 return -ENOMEM; 115 116 buf = kmalloc(size, mem_flags); 117 if (!buf) { 118 usb_free_urb(urb); 119 return -ENOMEM; 120 } 121 122 pipe = usb_rcvbulkpipe(drv_data->udev, 123 drv_data->bulk_rx_ep->bEndpointAddress); 124 125 usb_fill_bulk_urb(urb, drv_data->udev, pipe, buf, size, 126 nfcmrvl_bulk_complete, drv_data); 127 128 urb->transfer_flags |= URB_FREE_BUFFER; 129 130 usb_mark_last_busy(drv_data->udev); 131 usb_anchor_urb(urb, &drv_data->bulk_anchor); 132 133 err = usb_submit_urb(urb, mem_flags); 134 if (err) { 135 if (err != -EPERM && err != -ENODEV) 136 nfc_err(&drv_data->udev->dev, 137 "urb %p submission failed (%d)\n", urb, -err); 138 usb_unanchor_urb(urb); 139 } 140 141 usb_free_urb(urb); 142 143 return err; 144 } 145 146 static void nfcmrvl_tx_complete(struct urb *urb) 147 { 148 struct sk_buff *skb = urb->context; 149 struct nci_dev *ndev = (struct nci_dev *)skb->dev; 150 struct nfcmrvl_private *priv = nci_get_drvdata(ndev); 151 struct nfcmrvl_usb_drv_data *drv_data = priv->drv_data; 152 unsigned long flags; 153 154 nfc_info(priv->dev, "urb %p status %d count %d\n", 155 urb, urb->status, urb->actual_length); 156 157 spin_lock_irqsave(&drv_data->txlock, flags); 158 drv_data->tx_in_flight--; 159 spin_unlock_irqrestore(&drv_data->txlock, flags); 160 161 kfree(urb->setup_packet); 162 kfree_skb(skb); 163 } 164 165 static int nfcmrvl_usb_nci_open(struct nfcmrvl_private *priv) 166 { 167 struct nfcmrvl_usb_drv_data *drv_data = priv->drv_data; 168 int err; 169 170 err = usb_autopm_get_interface(drv_data->intf); 171 if (err) 172 return err; 173 174 drv_data->intf->needs_remote_wakeup = 1; 175 176 err = nfcmrvl_submit_bulk_urb(drv_data, GFP_KERNEL); 177 if (err) 178 goto failed; 179 180 set_bit(NFCMRVL_USB_BULK_RUNNING, &drv_data->flags); 181 nfcmrvl_submit_bulk_urb(drv_data, GFP_KERNEL); 182 183 usb_autopm_put_interface(drv_data->intf); 184 return 0; 185 186 failed: 187 usb_autopm_put_interface(drv_data->intf); 188 return err; 189 } 190 191 static void nfcmrvl_usb_stop_traffic(struct nfcmrvl_usb_drv_data *drv_data) 192 { 193 usb_kill_anchored_urbs(&drv_data->bulk_anchor); 194 } 195 196 static int nfcmrvl_usb_nci_close(struct nfcmrvl_private *priv) 197 { 198 struct nfcmrvl_usb_drv_data *drv_data = priv->drv_data; 199 int err; 200 201 cancel_work_sync(&drv_data->waker); 202 203 clear_bit(NFCMRVL_USB_BULK_RUNNING, &drv_data->flags); 204 205 nfcmrvl_usb_stop_traffic(drv_data); 206 usb_kill_anchored_urbs(&drv_data->tx_anchor); 207 err = usb_autopm_get_interface(drv_data->intf); 208 if (err) 209 goto failed; 210 211 drv_data->intf->needs_remote_wakeup = 0; 212 usb_autopm_put_interface(drv_data->intf); 213 214 failed: 215 usb_scuttle_anchored_urbs(&drv_data->deferred); 216 return 0; 217 } 218 219 static int nfcmrvl_usb_nci_send(struct nfcmrvl_private *priv, 220 struct sk_buff *skb) 221 { 222 struct nfcmrvl_usb_drv_data *drv_data = priv->drv_data; 223 struct urb *urb; 224 unsigned int pipe; 225 int err; 226 227 if (!drv_data->bulk_tx_ep) 228 return -ENODEV; 229 230 urb = usb_alloc_urb(0, GFP_ATOMIC); 231 if (!urb) 232 return -ENOMEM; 233 234 pipe = usb_sndbulkpipe(drv_data->udev, 235 drv_data->bulk_tx_ep->bEndpointAddress); 236 237 usb_fill_bulk_urb(urb, drv_data->udev, pipe, skb->data, skb->len, 238 nfcmrvl_tx_complete, skb); 239 240 err = nfcmrvl_inc_tx(drv_data); 241 if (err) { 242 usb_anchor_urb(urb, &drv_data->deferred); 243 schedule_work(&drv_data->waker); 244 err = 0; 245 goto done; 246 } 247 248 usb_anchor_urb(urb, &drv_data->tx_anchor); 249 250 err = usb_submit_urb(urb, GFP_ATOMIC); 251 if (err) { 252 if (err != -EPERM && err != -ENODEV) 253 nfc_err(&drv_data->udev->dev, 254 "urb %p submission failed (%d)\n", urb, -err); 255 kfree(urb->setup_packet); 256 usb_unanchor_urb(urb); 257 } else { 258 usb_mark_last_busy(drv_data->udev); 259 } 260 261 done: 262 usb_free_urb(urb); 263 return err; 264 } 265 266 static struct nfcmrvl_if_ops usb_ops = { 267 .nci_open = nfcmrvl_usb_nci_open, 268 .nci_close = nfcmrvl_usb_nci_close, 269 .nci_send = nfcmrvl_usb_nci_send, 270 }; 271 272 static void nfcmrvl_waker(struct work_struct *work) 273 { 274 struct nfcmrvl_usb_drv_data *drv_data = 275 container_of(work, struct nfcmrvl_usb_drv_data, waker); 276 int err; 277 278 err = usb_autopm_get_interface(drv_data->intf); 279 if (err) 280 return; 281 282 usb_autopm_put_interface(drv_data->intf); 283 } 284 285 static int nfcmrvl_probe(struct usb_interface *intf, 286 const struct usb_device_id *id) 287 { 288 struct usb_endpoint_descriptor *ep_desc; 289 struct nfcmrvl_usb_drv_data *drv_data; 290 struct nfcmrvl_private *priv; 291 int i; 292 struct usb_device *udev = interface_to_usbdev(intf); 293 struct nfcmrvl_platform_data config; 294 295 /* No configuration for USB */ 296 memset(&config, 0, sizeof(config)); 297 config.reset_n_io = -EINVAL; 298 299 nfc_info(&udev->dev, "intf %p id %p\n", intf, id); 300 301 drv_data = devm_kzalloc(&intf->dev, sizeof(*drv_data), GFP_KERNEL); 302 if (!drv_data) 303 return -ENOMEM; 304 305 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { 306 ep_desc = &intf->cur_altsetting->endpoint[i].desc; 307 308 if (!drv_data->bulk_tx_ep && 309 usb_endpoint_is_bulk_out(ep_desc)) { 310 drv_data->bulk_tx_ep = ep_desc; 311 } else if (!drv_data->bulk_rx_ep && 312 usb_endpoint_is_bulk_in(ep_desc)) { 313 drv_data->bulk_rx_ep = ep_desc; 314 } 315 } 316 317 if (!drv_data->bulk_tx_ep || !drv_data->bulk_rx_ep) 318 return -ENODEV; 319 320 drv_data->udev = udev; 321 drv_data->intf = intf; 322 323 INIT_WORK(&drv_data->waker, nfcmrvl_waker); 324 spin_lock_init(&drv_data->txlock); 325 326 init_usb_anchor(&drv_data->tx_anchor); 327 init_usb_anchor(&drv_data->bulk_anchor); 328 init_usb_anchor(&drv_data->deferred); 329 330 priv = nfcmrvl_nci_register_dev(NFCMRVL_PHY_USB, drv_data, &usb_ops, 331 &intf->dev, &config); 332 if (IS_ERR(priv)) 333 return PTR_ERR(priv); 334 335 drv_data->priv = priv; 336 drv_data->priv->support_fw_dnld = false; 337 338 usb_set_intfdata(intf, drv_data); 339 340 return 0; 341 } 342 343 static void nfcmrvl_disconnect(struct usb_interface *intf) 344 { 345 struct nfcmrvl_usb_drv_data *drv_data = usb_get_intfdata(intf); 346 347 if (!drv_data) 348 return; 349 350 nfc_info(&drv_data->udev->dev, "intf %p\n", intf); 351 352 nfcmrvl_nci_unregister_dev(drv_data->priv); 353 354 usb_set_intfdata(drv_data->intf, NULL); 355 } 356 357 #ifdef CONFIG_PM 358 static int nfcmrvl_suspend(struct usb_interface *intf, pm_message_t message) 359 { 360 struct nfcmrvl_usb_drv_data *drv_data = usb_get_intfdata(intf); 361 362 nfc_info(&drv_data->udev->dev, "intf %p\n", intf); 363 364 if (drv_data->suspend_count++) 365 return 0; 366 367 spin_lock_irq(&drv_data->txlock); 368 if (!(PMSG_IS_AUTO(message) && drv_data->tx_in_flight)) { 369 set_bit(NFCMRVL_USB_SUSPENDING, &drv_data->flags); 370 spin_unlock_irq(&drv_data->txlock); 371 } else { 372 spin_unlock_irq(&drv_data->txlock); 373 drv_data->suspend_count--; 374 return -EBUSY; 375 } 376 377 nfcmrvl_usb_stop_traffic(drv_data); 378 usb_kill_anchored_urbs(&drv_data->tx_anchor); 379 380 return 0; 381 } 382 383 static void nfcmrvl_play_deferred(struct nfcmrvl_usb_drv_data *drv_data) 384 { 385 struct urb *urb; 386 int err; 387 388 while ((urb = usb_get_from_anchor(&drv_data->deferred))) { 389 err = usb_submit_urb(urb, GFP_ATOMIC); 390 if (err) 391 break; 392 393 drv_data->tx_in_flight++; 394 } 395 usb_scuttle_anchored_urbs(&drv_data->deferred); 396 } 397 398 static int nfcmrvl_resume(struct usb_interface *intf) 399 { 400 struct nfcmrvl_usb_drv_data *drv_data = usb_get_intfdata(intf); 401 int err = 0; 402 403 nfc_info(&drv_data->udev->dev, "intf %p\n", intf); 404 405 if (--drv_data->suspend_count) 406 return 0; 407 408 if (!test_bit(NFCMRVL_NCI_RUNNING, &drv_data->flags)) 409 goto done; 410 411 if (test_bit(NFCMRVL_USB_BULK_RUNNING, &drv_data->flags)) { 412 err = nfcmrvl_submit_bulk_urb(drv_data, GFP_NOIO); 413 if (err) { 414 clear_bit(NFCMRVL_USB_BULK_RUNNING, &drv_data->flags); 415 goto failed; 416 } 417 418 nfcmrvl_submit_bulk_urb(drv_data, GFP_NOIO); 419 } 420 421 spin_lock_irq(&drv_data->txlock); 422 nfcmrvl_play_deferred(drv_data); 423 clear_bit(NFCMRVL_USB_SUSPENDING, &drv_data->flags); 424 spin_unlock_irq(&drv_data->txlock); 425 426 return 0; 427 428 failed: 429 usb_scuttle_anchored_urbs(&drv_data->deferred); 430 done: 431 spin_lock_irq(&drv_data->txlock); 432 clear_bit(NFCMRVL_USB_SUSPENDING, &drv_data->flags); 433 spin_unlock_irq(&drv_data->txlock); 434 435 return err; 436 } 437 #endif 438 439 static struct usb_driver nfcmrvl_usb_driver = { 440 .name = "nfcmrvl", 441 .probe = nfcmrvl_probe, 442 .disconnect = nfcmrvl_disconnect, 443 #ifdef CONFIG_PM 444 .suspend = nfcmrvl_suspend, 445 .resume = nfcmrvl_resume, 446 .reset_resume = nfcmrvl_resume, 447 #endif 448 .id_table = nfcmrvl_table, 449 .supports_autosuspend = 1, 450 .disable_hub_initiated_lpm = 1, 451 .soft_unbind = 1, 452 }; 453 module_usb_driver(nfcmrvl_usb_driver); 454 455 MODULE_AUTHOR("Marvell International Ltd."); 456 MODULE_DESCRIPTION("Marvell NFC-over-USB driver"); 457 MODULE_LICENSE("GPL v2"); 458