Lines Matching +full:rpc +full:- +full:if

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright 2014-2015 Google Inc.
6 * Copyright 2014-2015 Linaro Ltd.
48 * Adjust if we are having stalls in the USB buffer due to not enough urbs in
54 * Adjust if we get messages saying we are out of urbs in the system log.
75 * struct es2_ap_dev - ES2 USB Bridge to AP structure
83 * @cport_out_urb_busy: array of flags to see if the @cport_out_urb is busy or
88 * @cdsi1_in_use: true if cport CDSI1 is in use
95 * @arpc_endpoint_in: bulk in endpoint for APBridgeA RPC
138 return (struct es2_ap_dev *)&hd->hd_priv; in hd_to_es2()
149 struct usb_device *udev = es2->usb_dev; in output_sync()
154 if (!data) in output_sync()
155 return -ENOMEM; in output_sync()
162 if (retval < 0) in output_sync()
163 dev_err(&udev->dev, "%s: return error %d\n", __func__, retval); in output_sync()
173 struct usb_ctrlrequest *dr = urb->context; in ap_urb_complete()
181 struct usb_device *udev = es2->usb_dev; in output_async()
188 if (!urb) in output_async()
189 return -ENOMEM; in output_async()
192 if (!dr) { in output_async()
194 return -ENOMEM; in output_async()
200 dr->bRequest = cmd; in output_async()
201 dr->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE; in output_async()
202 dr->wValue = 0; in output_async()
203 dr->wIndex = 0; in output_async()
204 dr->wLength = cpu_to_le16(size); in output_async()
210 if (retval) { in output_async()
222 if (async) in output()
236 urb = cport_in->urb[i]; in es2_cport_in_enable()
239 if (ret) { in es2_cport_in_enable()
240 dev_err(&es2->usb_dev->dev, in es2_cport_in_enable()
241 "failed to submit in-urb: %d\n", ret); in es2_cport_in_enable()
249 for (--i; i >= 0; --i) { in es2_cport_in_enable()
250 urb = cport_in->urb[i]; in es2_cport_in_enable()
264 urb = cport_in->urb[i]; in es2_cport_in_disable()
276 urb = es2->arpc_urb[i]; in es2_arpc_in_enable()
279 if (ret) { in es2_arpc_in_enable()
280 dev_err(&es2->usb_dev->dev, in es2_arpc_in_enable()
281 "failed to submit arpc in-urb: %d\n", ret); in es2_arpc_in_enable()
289 for (--i; i >= 0; --i) { in es2_arpc_in_enable()
290 urb = es2->arpc_urb[i]; in es2_arpc_in_enable()
303 urb = es2->arpc_urb[i]; in es2_arpc_in_disable()
314 spin_lock_irqsave(&es2->cport_out_urb_lock, flags); in next_free_urb()
318 if (!es2->cport_out_urb_busy[i] && in next_free_urb()
319 !es2->cport_out_urb_cancelled[i]) { in next_free_urb()
320 es2->cport_out_urb_busy[i] = true; in next_free_urb()
321 urb = es2->cport_out_urb[i]; in next_free_urb()
325 spin_unlock_irqrestore(&es2->cport_out_urb_lock, flags); in next_free_urb()
326 if (urb) in next_free_urb()
333 dev_dbg(&es2->usb_dev->dev, in next_free_urb()
343 * See if this was an urb in our pool, if so mark it "free", otherwise in free_urb()
346 spin_lock_irqsave(&es2->cport_out_urb_lock, flags); in free_urb()
348 if (urb == es2->cport_out_urb[i]) { in free_urb()
349 es2->cport_out_urb_busy[i] = false; in free_urb()
354 spin_unlock_irqrestore(&es2->cport_out_urb_lock, flags); in free_urb()
356 /* If urb is not NULL, then we need to free this urb */ in free_urb()
361 * We (ab)use the operation-message header pad bytes to transfer the
367 header->pad[0] = cport_id; in gb_message_cport_pack()
373 header->pad[0] = 0; in gb_message_cport_clear()
379 u16 cport_id = header->pad[0]; in gb_message_cport_unpack()
387 * Returns zero if the message was successfully queued, or a negative errno
394 struct usb_device *udev = es2->usb_dev; in message_send()
405 if (!cport_id_valid(hd, cport_id)) { in message_send()
406 dev_err(&udev->dev, "invalid cport %u\n", cport_id); in message_send()
407 return -EINVAL; in message_send()
412 if (!urb) in message_send()
413 return -ENOMEM; in message_send()
415 spin_lock_irqsave(&es2->cport_out_urb_lock, flags); in message_send()
416 message->hcpriv = urb; in message_send()
417 spin_unlock_irqrestore(&es2->cport_out_urb_lock, flags); in message_send()
420 gb_message_cport_pack(message->header, cport_id); in message_send()
422 buffer_size = sizeof(*message->header) + message->payload_size; in message_send()
426 es2->cport_out_endpoint), in message_send()
427 message->buffer, buffer_size, in message_send()
429 urb->transfer_flags |= URB_ZERO_PACKET; in message_send()
434 if (retval) { in message_send()
435 dev_err(&udev->dev, "failed to submit out-urb: %d\n", retval); in message_send()
437 spin_lock_irqsave(&es2->cport_out_urb_lock, flags); in message_send()
438 message->hcpriv = NULL; in message_send()
439 spin_unlock_irqrestore(&es2->cport_out_urb_lock, flags); in message_send()
442 gb_message_cport_clear(message->header); in message_send()
455 struct gb_host_device *hd = message->operation->connection->hd; in message_cancel()
462 spin_lock_irq(&es2->cport_out_urb_lock); in message_cancel()
463 urb = message->hcpriv; in message_cancel()
468 /* Prevent pre-allocated urb from being reused. */ in message_cancel()
470 if (urb == es2->cport_out_urb[i]) { in message_cancel()
471 es2->cport_out_urb_cancelled[i] = true; in message_cancel()
475 spin_unlock_irq(&es2->cport_out_urb_lock); in message_cancel()
479 if (i < NUM_CPORT_OUT_URB) { in message_cancel()
480 spin_lock_irq(&es2->cport_out_urb_lock); in message_cancel()
481 es2->cport_out_urb_cancelled[i] = false; in message_cancel()
482 spin_unlock_irq(&es2->cport_out_urb_lock); in message_cancel()
492 struct ida *id_map = &hd->cport_id_map; in es2_cport_allocate()
498 dev_err(&hd->dev, "cport %d not available\n", cport_id); in es2_cport_allocate()
499 return -EBUSY; in es2_cport_allocate()
502 if (flags & GB_CONNECTION_FLAG_OFFLOADED && in es2_cport_allocate()
504 if (es2->cdsi1_in_use) { in es2_cport_allocate()
505 dev_err(&hd->dev, "CDSI1 already in use\n"); in es2_cport_allocate()
506 return -EBUSY; in es2_cport_allocate()
509 es2->cdsi1_in_use = true; in es2_cport_allocate()
514 if (cport_id < 0) { in es2_cport_allocate()
516 ida_end = hd->num_cports; in es2_cport_allocate()
517 } else if (cport_id < hd->num_cports) { in es2_cport_allocate()
521 dev_err(&hd->dev, "cport %d not available\n", cport_id); in es2_cport_allocate()
522 return -EINVAL; in es2_cport_allocate()
534 es2->cdsi1_in_use = false; in es2_cport_release()
538 ida_simple_remove(&hd->cport_id_map, cport_id); in es2_cport_release()
545 struct usb_device *udev = es2->usb_dev; in cport_enable()
551 if (!req) in cport_enable()
552 return -ENOMEM; in cport_enable()
555 if (flags & GB_CONNECTION_FLAG_CONTROL) in cport_enable()
557 if (flags & GB_CONNECTION_FLAG_HIGH_PRIO) in cport_enable()
560 req->flags = cpu_to_le32(connection_flags); in cport_enable()
562 dev_dbg(&hd->dev, "%s - cport = %u, flags = %02x\n", __func__, in cport_enable()
570 if (ret < 0) { in cport_enable()
571 dev_err(&udev->dev, "failed to set cport flags for port %d\n", in cport_enable()
586 struct device *dev = &es2->usb_dev->dev; in es2_cport_connected()
593 if (ret) { in es2_cport_connected()
605 struct device *dev = &es2->usb_dev->dev; in es2_cport_flush()
612 if (ret) { in es2_cport_flush()
624 struct device *dev = &es2->usb_dev->dev; in es2_cport_shutdown()
629 if (timeout > U16_MAX) in es2_cport_shutdown()
630 return -EINVAL; in es2_cport_shutdown()
637 if (ret) { in es2_cport_shutdown()
650 struct device *dev = &es2->usb_dev->dev; in es2_cport_quiesce()
655 if (peer_space > U16_MAX) in es2_cport_quiesce()
656 return -EINVAL; in es2_cport_quiesce()
658 if (timeout > U16_MAX) in es2_cport_quiesce()
659 return -EINVAL; in es2_cport_quiesce()
666 if (ret) { in es2_cport_quiesce()
678 struct device *dev = &es2->usb_dev->dev; in es2_cport_clear()
685 if (ret) { in es2_cport_clear()
697 struct usb_device *udev = es2->usb_dev; in latency_tag_enable()
705 if (retval < 0) in latency_tag_enable()
706 dev_err(&udev->dev, "Cannot enable latency tag for cport %d\n", in latency_tag_enable()
715 struct usb_device *udev = es2->usb_dev; in latency_tag_disable()
723 if (retval < 0) in latency_tag_disable()
724 dev_err(&udev->dev, "Cannot disable latency tag for cport %d\n", in latency_tag_disable()
749 struct device *dev = &urb->dev->dev; in check_urb_status()
750 int status = urb->status; in check_urb_status()
756 case -EOVERFLOW: in check_urb_status()
758 __func__, urb->actual_length); in check_urb_status()
760 case -ECONNRESET: in check_urb_status()
761 case -ENOENT: in check_urb_status()
762 case -ESHUTDOWN: in check_urb_status()
763 case -EILSEQ: in check_urb_status()
764 case -EPROTO: in check_urb_status()
770 return -EAGAIN; in check_urb_status()
779 debugfs_remove(es2->apb_log_enable_dentry); in es2_destroy()
784 urb = es2->cport_out_urb[i]; in es2_destroy()
787 es2->cport_out_urb[i] = NULL; in es2_destroy()
788 es2->cport_out_urb_busy[i] = false; /* just to be anal */ in es2_destroy()
792 usb_free_urb(es2->arpc_urb[i]); in es2_destroy()
793 kfree(es2->arpc_buffer[i]); in es2_destroy()
794 es2->arpc_buffer[i] = NULL; in es2_destroy()
798 usb_free_urb(es2->cport_in.urb[i]); in es2_destroy()
799 kfree(es2->cport_in.buffer[i]); in es2_destroy()
800 es2->cport_in.buffer[i] = NULL; in es2_destroy()
804 gb_hd_cport_release_reserved(es2->hd, ES2_CPORT_CDSI1); in es2_destroy()
805 gb_hd_cport_release_reserved(es2->hd, ES2_CPORT_CDSI0); in es2_destroy()
807 udev = es2->usb_dev; in es2_destroy()
808 gb_hd_put(es2->hd); in es2_destroy()
815 struct gb_host_device *hd = urb->context; in cport_in_callback()
816 struct device *dev = &urb->dev->dev; in cport_in_callback()
822 if (status) { in cport_in_callback()
823 if ((status == -EAGAIN) || (status == -EPROTO)) in cport_in_callback()
827 if (status == -ENOENT || status == -ESHUTDOWN) in cport_in_callback()
834 if (urb->actual_length < sizeof(*header)) { in cport_in_callback()
840 header = urb->transfer_buffer; in cport_in_callback()
843 if (cport_id_valid(hd, cport_id)) { in cport_in_callback()
844 greybus_data_rcvd(hd, cport_id, urb->transfer_buffer, in cport_in_callback()
845 urb->actual_length); in cport_in_callback()
852 if (retval) in cport_in_callback()
853 dev_err(dev, "failed to resubmit in-urb: %d\n", retval); in cport_in_callback()
858 struct gb_message *message = urb->context; in cport_out_callback()
859 struct gb_host_device *hd = message->operation->connection->hd; in cport_out_callback()
864 gb_message_cport_clear(message->header); in cport_out_callback()
866 spin_lock_irqsave(&es2->cport_out_urb_lock, flags); in cport_out_callback()
867 message->hcpriv = NULL; in cport_out_callback()
868 spin_unlock_irqrestore(&es2->cport_out_urb_lock, flags); in cport_out_callback()
881 struct arpc *rpc; in arpc_alloc() local
883 if (size + sizeof(*rpc->req) > ARPC_OUT_SIZE_MAX) in arpc_alloc()
886 rpc = kzalloc(sizeof(*rpc), GFP_KERNEL); in arpc_alloc()
887 if (!rpc) in arpc_alloc()
890 INIT_LIST_HEAD(&rpc->list); in arpc_alloc()
891 rpc->req = kzalloc(sizeof(*rpc->req) + size, GFP_KERNEL); in arpc_alloc()
892 if (!rpc->req) in arpc_alloc()
895 rpc->resp = kzalloc(sizeof(*rpc->resp), GFP_KERNEL); in arpc_alloc()
896 if (!rpc->resp) in arpc_alloc()
899 rpc->req->type = type; in arpc_alloc()
900 rpc->req->size = cpu_to_le16(sizeof(*rpc->req) + size); in arpc_alloc()
901 memcpy(rpc->req->data, payload, size); in arpc_alloc()
903 init_completion(&rpc->response_received); in arpc_alloc()
905 return rpc; in arpc_alloc()
908 kfree(rpc->req); in arpc_alloc()
910 kfree(rpc); in arpc_alloc()
915 static void arpc_free(struct arpc *rpc) in arpc_free() argument
917 kfree(rpc->req); in arpc_free()
918 kfree(rpc->resp); in arpc_free()
919 kfree(rpc); in arpc_free()
924 struct arpc *rpc; in arpc_find() local
926 list_for_each_entry(rpc, &es2->arpcs, list) { in arpc_find()
927 if (rpc->req->id == id) in arpc_find()
928 return rpc; in arpc_find()
934 static void arpc_add(struct es2_ap_dev *es2, struct arpc *rpc) in arpc_add() argument
936 rpc->active = true; in arpc_add()
937 rpc->req->id = cpu_to_le16(es2->arpc_id_cycle++); in arpc_add()
938 list_add_tail(&rpc->list, &es2->arpcs); in arpc_add()
941 static void arpc_del(struct es2_ap_dev *es2, struct arpc *rpc) in arpc_del() argument
943 if (rpc->active) { in arpc_del()
944 rpc->active = false; in arpc_del()
945 list_del(&rpc->list); in arpc_del()
949 static int arpc_send(struct es2_ap_dev *es2, struct arpc *rpc, int timeout) in arpc_send() argument
951 struct usb_device *udev = es2->usb_dev; in arpc_send()
959 rpc->req, le16_to_cpu(rpc->req->size), in arpc_send()
961 if (retval < 0) { in arpc_send()
962 dev_err(&udev->dev, in arpc_send()
964 rpc->req->type, retval); in arpc_send()
974 struct arpc *rpc; in arpc_sync() local
978 if (result) in arpc_sync()
981 rpc = arpc_alloc(payload, size, type); in arpc_sync()
982 if (!rpc) in arpc_sync()
983 return -ENOMEM; in arpc_sync()
985 spin_lock_irqsave(&es2->arpc_lock, flags); in arpc_sync()
986 arpc_add(es2, rpc); in arpc_sync()
987 spin_unlock_irqrestore(&es2->arpc_lock, flags); in arpc_sync()
989 retval = arpc_send(es2, rpc, timeout); in arpc_sync()
990 if (retval) in arpc_sync()
994 &rpc->response_received, in arpc_sync()
996 if (retval <= 0) { in arpc_sync()
997 if (!retval) in arpc_sync()
998 retval = -ETIMEDOUT; in arpc_sync()
1002 if (rpc->resp->result) { in arpc_sync()
1003 retval = -EREMOTEIO; in arpc_sync()
1004 if (result) in arpc_sync()
1005 *result = rpc->resp->result; in arpc_sync()
1011 spin_lock_irqsave(&es2->arpc_lock, flags); in arpc_sync()
1012 arpc_del(es2, rpc); in arpc_sync()
1013 spin_unlock_irqrestore(&es2->arpc_lock, flags); in arpc_sync()
1014 arpc_free(rpc); in arpc_sync()
1016 if (retval < 0 && retval != -EREMOTEIO) { in arpc_sync()
1017 dev_err(&es2->usb_dev->dev, in arpc_sync()
1026 struct es2_ap_dev *es2 = urb->context; in arpc_in_callback()
1027 struct device *dev = &urb->dev->dev; in arpc_in_callback()
1029 struct arpc *rpc; in arpc_in_callback() local
1034 if (status) { in arpc_in_callback()
1035 if ((status == -EAGAIN) || (status == -EPROTO)) in arpc_in_callback()
1039 if (status == -ENOENT || status == -ESHUTDOWN) in arpc_in_callback()
1042 dev_err(dev, "arpc in-urb error %d (dropped)\n", status); in arpc_in_callback()
1046 if (urb->actual_length < sizeof(*resp)) { in arpc_in_callback()
1051 resp = urb->transfer_buffer; in arpc_in_callback()
1052 spin_lock_irqsave(&es2->arpc_lock, flags); in arpc_in_callback()
1053 rpc = arpc_find(es2, resp->id); in arpc_in_callback()
1054 if (!rpc) { in arpc_in_callback()
1056 le16_to_cpu(resp->id)); in arpc_in_callback()
1057 spin_unlock_irqrestore(&es2->arpc_lock, flags); in arpc_in_callback()
1061 arpc_del(es2, rpc); in arpc_in_callback()
1062 memcpy(rpc->resp, resp, sizeof(*resp)); in arpc_in_callback()
1063 complete(&rpc->response_received); in arpc_in_callback()
1064 spin_unlock_irqrestore(&es2->arpc_lock, flags); in arpc_in_callback()
1069 if (retval) in arpc_in_callback()
1070 dev_err(dev, "failed to resubmit arpc in-urb: %d\n", retval); in arpc_in_callback()
1079 retval = usb_control_msg(es2->usb_dev, in apb_log_get()
1080 usb_rcvctrlpipe(es2->usb_dev, 0), in apb_log_get()
1088 if (retval > 0) in apb_log_get()
1089 kfifo_in(&es2->apb_log_fifo, buf, retval); in apb_log_get()
1099 if (!buf) in apb_log_poll()
1100 return -ENOMEM; in apb_log_poll()
1115 struct es2_ap_dev *es2 = file_inode(f)->i_private; in apb_log_read()
1120 if (count > APB1_LOG_SIZE) in apb_log_read()
1124 if (!tmp_buf) in apb_log_read()
1125 return -ENOMEM; in apb_log_read()
1127 copied = kfifo_out(&es2->apb_log_fifo, tmp_buf, count); in apb_log_read()
1141 if (!IS_ERR_OR_NULL(es2->apb_log_task)) in usb_log_enable()
1145 es2->apb_log_task = kthread_run(apb_log_poll, es2, "apb_log"); in usb_log_enable()
1146 if (IS_ERR(es2->apb_log_task)) in usb_log_enable()
1149 es2->apb_log_dentry = debugfs_create_file("apb_log", 0444, in usb_log_enable()
1156 if (IS_ERR_OR_NULL(es2->apb_log_task)) in usb_log_disable()
1159 debugfs_remove(es2->apb_log_dentry); in usb_log_disable()
1160 es2->apb_log_dentry = NULL; in usb_log_disable()
1162 kthread_stop(es2->apb_log_task); in usb_log_disable()
1163 es2->apb_log_task = NULL; in usb_log_disable()
1169 struct es2_ap_dev *es2 = file_inode(f)->i_private; in apb_log_enable_read()
1170 int enable = !IS_ERR_OR_NULL(es2->apb_log_task); in apb_log_enable_read()
1182 struct es2_ap_dev *es2 = file_inode(f)->i_private; in apb_log_enable_write()
1185 if (retval) in apb_log_enable_write()
1188 if (enable) in apb_log_enable_write()
1207 if (!cport_count) in apb_get_cport_count()
1208 return -ENOMEM; in apb_get_cport_count()
1215 if (retval != sizeof(*cport_count)) { in apb_get_cport_count()
1216 dev_err(&udev->dev, "Cannot retrieve CPort count: %d\n", in apb_get_cport_count()
1219 if (retval >= 0) in apb_get_cport_count()
1220 retval = -EIO; in apb_get_cport_count()
1228 if (retval > U8_MAX) { in apb_get_cport_count()
1230 dev_warn(&udev->dev, "Limiting number of CPorts to U8_MAX\n"); in apb_get_cport_count()
1240 * 1 Control - usual USB stuff + AP -> APBridgeA messages
1241 * 7 Bulk IN - CPort data in
1242 * 7 Bulk OUT - CPort data out
1263 if (num_cports < 0) { in ap_probe()
1265 dev_err(&udev->dev, "Cannot retrieve CPort count: %d\n", in ap_probe()
1270 hd = gb_hd_create(&es2_driver, &udev->dev, ES2_GBUF_MSG_SIZE_MAX, in ap_probe()
1272 if (IS_ERR(hd)) { in ap_probe()
1278 es2->hd = hd; in ap_probe()
1279 es2->usb_intf = interface; in ap_probe()
1280 es2->usb_dev = udev; in ap_probe()
1281 spin_lock_init(&es2->cport_out_urb_lock); in ap_probe()
1282 INIT_KFIFO(es2->apb_log_fifo); in ap_probe()
1290 if (retval) in ap_probe()
1293 if (retval) in ap_probe()
1297 iface_desc = interface->cur_altsetting; in ap_probe()
1298 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { in ap_probe()
1299 endpoint = &iface_desc->endpoint[i].desc; in ap_probe()
1300 ep_addr = endpoint->bEndpointAddress; in ap_probe()
1302 if (usb_endpoint_is_bulk_in(endpoint)) { in ap_probe()
1303 if (!bulk_in_found) { in ap_probe()
1304 es2->cport_in.endpoint = ep_addr; in ap_probe()
1306 } else if (!arpc_in_found) { in ap_probe()
1307 es2->arpc_endpoint_in = ep_addr; in ap_probe()
1310 dev_warn(&udev->dev, in ap_probe()
1316 if (usb_endpoint_is_bulk_out(endpoint)) { in ap_probe()
1317 if (!bulk_out_found) { in ap_probe()
1318 es2->cport_out_endpoint = ep_addr; in ap_probe()
1321 dev_warn(&udev->dev, in ap_probe()
1327 dev_warn(&udev->dev, in ap_probe()
1331 if (!bulk_in_found || !arpc_in_found || !bulk_out_found) { in ap_probe()
1332 dev_err(&udev->dev, "Not enough endpoints found in device, aborting!\n"); in ap_probe()
1333 retval = -ENODEV; in ap_probe()
1343 if (!urb) { in ap_probe()
1344 retval = -ENOMEM; in ap_probe()
1347 es2->cport_in.urb[i] = urb; in ap_probe()
1350 if (!buffer) { in ap_probe()
1351 retval = -ENOMEM; in ap_probe()
1356 usb_rcvbulkpipe(udev, es2->cport_in.endpoint), in ap_probe()
1360 es2->cport_in.buffer[i] = buffer; in ap_probe()
1369 if (!urb) { in ap_probe()
1370 retval = -ENOMEM; in ap_probe()
1373 es2->arpc_urb[i] = urb; in ap_probe()
1376 if (!buffer) { in ap_probe()
1377 retval = -ENOMEM; in ap_probe()
1383 es2->arpc_endpoint_in), in ap_probe()
1387 es2->arpc_buffer[i] = buffer; in ap_probe()
1395 if (!urb) { in ap_probe()
1396 retval = -ENOMEM; in ap_probe()
1400 es2->cport_out_urb[i] = urb; in ap_probe()
1401 es2->cport_out_urb_busy[i] = false; /* just to be anal */ in ap_probe()
1405 es2->apb_log_enable_dentry = debugfs_create_file("apb_log_enable", in ap_probe()
1410 INIT_LIST_HEAD(&es2->arpcs); in ap_probe()
1411 spin_lock_init(&es2->arpc_lock); in ap_probe()
1414 if (retval) in ap_probe()
1418 if (retval) in ap_probe()
1421 retval = es2_cport_in_enable(es2, &es2->cport_in); in ap_probe()
1422 if (retval) in ap_probe()
1441 gb_hd_del(es2->hd); in ap_disconnect()
1443 es2_cport_in_disable(es2, &es2->cport_in); in ap_disconnect()
1460 MODULE_AUTHOR("Greg Kroah-Hartman <gregkh@linuxfoundation.org>");