cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ldusb.c (24973B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Generic USB driver for report based interrupt in/out devices
      4 * like LD Didactic's USB devices. LD Didactic's USB devices are
      5 * HID devices which do not use HID report definitons (they use
      6 * raw interrupt in and our reports only for communication).
      7 *
      8 * This driver uses a ring buffer for time critical reading of
      9 * interrupt in reports and provides read and write methods for
     10 * raw interrupt reports (similar to the Windows HID driver).
     11 * Devices based on the book USB COMPLETE by Jan Axelson may need
     12 * such a compatibility to the Windows HID driver.
     13 *
     14 * Copyright (C) 2005 Michael Hund <mhund@ld-didactic.de>
     15 *
     16 * Derived from Lego USB Tower driver
     17 * Copyright (C) 2003 David Glance <advidgsf@sourceforge.net>
     18 *		 2001-2004 Juergen Stuber <starblue@users.sourceforge.net>
     19 */
     20
     21#include <linux/kernel.h>
     22#include <linux/errno.h>
     23#include <linux/slab.h>
     24#include <linux/module.h>
     25#include <linux/mutex.h>
     26
     27#include <linux/uaccess.h>
     28#include <linux/input.h>
     29#include <linux/usb.h>
     30#include <linux/poll.h>
     31
     32/* Define these values to match your devices */
     33#define USB_VENDOR_ID_LD		0x0f11	/* USB Vendor ID of LD Didactic GmbH */
     34#define USB_DEVICE_ID_LD_CASSY		0x1000	/* USB Product ID of CASSY-S modules with 8 bytes endpoint size */
     35#define USB_DEVICE_ID_LD_CASSY2		0x1001	/* USB Product ID of CASSY-S modules with 64 bytes endpoint size */
     36#define USB_DEVICE_ID_LD_POCKETCASSY	0x1010	/* USB Product ID of Pocket-CASSY */
     37#define USB_DEVICE_ID_LD_POCKETCASSY2	0x1011	/* USB Product ID of Pocket-CASSY 2 (reserved) */
     38#define USB_DEVICE_ID_LD_MOBILECASSY	0x1020	/* USB Product ID of Mobile-CASSY */
     39#define USB_DEVICE_ID_LD_MOBILECASSY2	0x1021	/* USB Product ID of Mobile-CASSY 2 (reserved) */
     40#define USB_DEVICE_ID_LD_MICROCASSYVOLTAGE	0x1031	/* USB Product ID of Micro-CASSY Voltage */
     41#define USB_DEVICE_ID_LD_MICROCASSYCURRENT	0x1032	/* USB Product ID of Micro-CASSY Current */
     42#define USB_DEVICE_ID_LD_MICROCASSYTIME		0x1033	/* USB Product ID of Micro-CASSY Time (reserved) */
     43#define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE	0x1035	/* USB Product ID of Micro-CASSY Temperature */
     44#define USB_DEVICE_ID_LD_MICROCASSYPH		0x1038	/* USB Product ID of Micro-CASSY pH */
     45#define USB_DEVICE_ID_LD_POWERANALYSERCASSY	0x1040	/* USB Product ID of Power Analyser CASSY */
     46#define USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY	0x1042	/* USB Product ID of Converter Controller CASSY */
     47#define USB_DEVICE_ID_LD_MACHINETESTCASSY	0x1043	/* USB Product ID of Machine Test CASSY */
     48#define USB_DEVICE_ID_LD_JWM		0x1080	/* USB Product ID of Joule and Wattmeter */
     49#define USB_DEVICE_ID_LD_DMMP		0x1081	/* USB Product ID of Digital Multimeter P (reserved) */
     50#define USB_DEVICE_ID_LD_UMIP		0x1090	/* USB Product ID of UMI P */
     51#define USB_DEVICE_ID_LD_UMIC		0x10A0	/* USB Product ID of UMI C */
     52#define USB_DEVICE_ID_LD_UMIB		0x10B0	/* USB Product ID of UMI B */
     53#define USB_DEVICE_ID_LD_XRAY		0x1100	/* USB Product ID of X-Ray Apparatus 55481 */
     54#define USB_DEVICE_ID_LD_XRAY2		0x1101	/* USB Product ID of X-Ray Apparatus 554800 */
     55#define USB_DEVICE_ID_LD_XRAYCT		0x1110	/* USB Product ID of X-Ray Apparatus CT 554821*/
     56#define USB_DEVICE_ID_LD_VIDEOCOM	0x1200	/* USB Product ID of VideoCom */
     57#define USB_DEVICE_ID_LD_MOTOR		0x1210	/* USB Product ID of Motor (reserved) */
     58#define USB_DEVICE_ID_LD_COM3LAB	0x2000	/* USB Product ID of COM3LAB */
     59#define USB_DEVICE_ID_LD_TELEPORT	0x2010	/* USB Product ID of Terminal Adapter */
     60#define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020	/* USB Product ID of Network Analyser */
     61#define USB_DEVICE_ID_LD_POWERCONTROL	0x2030	/* USB Product ID of Converter Control Unit */
     62#define USB_DEVICE_ID_LD_MACHINETEST	0x2040	/* USB Product ID of Machine Test System */
     63#define USB_DEVICE_ID_LD_MOSTANALYSER	0x2050	/* USB Product ID of MOST Protocol Analyser */
     64#define USB_DEVICE_ID_LD_MOSTANALYSER2	0x2051	/* USB Product ID of MOST Protocol Analyser 2 */
     65#define USB_DEVICE_ID_LD_ABSESP		0x2060	/* USB Product ID of ABS ESP */
     66#define USB_DEVICE_ID_LD_AUTODATABUS	0x2070	/* USB Product ID of Automotive Data Buses */
     67#define USB_DEVICE_ID_LD_MCT		0x2080	/* USB Product ID of Microcontroller technique */
     68#define USB_DEVICE_ID_LD_HYBRID		0x2090	/* USB Product ID of Automotive Hybrid */
     69#define USB_DEVICE_ID_LD_HEATCONTROL	0x20A0	/* USB Product ID of Heat control */
     70
     71#ifdef CONFIG_USB_DYNAMIC_MINORS
     72#define USB_LD_MINOR_BASE	0
     73#else
     74#define USB_LD_MINOR_BASE	176
     75#endif
     76
     77/* table of devices that work with this driver */
     78static const struct usb_device_id ld_usb_table[] = {
     79	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) },
     80	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY2) },
     81	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) },
     82	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY2) },
     83	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY) },
     84	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY2) },
     85	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYVOLTAGE) },
     86	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYCURRENT) },
     87	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) },
     88	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) },
     89	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) },
     90	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERANALYSERCASSY) },
     91	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY) },
     92	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETESTCASSY) },
     93	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) },
     94	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) },
     95	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) },
     96	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIC) },
     97	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIB) },
     98	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY) },
     99	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2) },
    100	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM) },
    101	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOTOR) },
    102	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB) },
    103	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT) },
    104	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER) },
    105	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL) },
    106	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST) },
    107	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER) },
    108	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER2) },
    109	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_ABSESP) },
    110	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_AUTODATABUS) },
    111	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MCT) },
    112	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) },
    113	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) },
    114	{ }					/* Terminating entry */
    115};
    116MODULE_DEVICE_TABLE(usb, ld_usb_table);
    117MODULE_AUTHOR("Michael Hund <mhund@ld-didactic.de>");
    118MODULE_DESCRIPTION("LD USB Driver");
    119MODULE_LICENSE("GPL");
    120
    121/* All interrupt in transfers are collected in a ring buffer to
    122 * avoid racing conditions and get better performance of the driver.
    123 */
    124static int ring_buffer_size = 128;
    125module_param(ring_buffer_size, int, 0000);
    126MODULE_PARM_DESC(ring_buffer_size, "Read ring buffer size in reports");
    127
    128/* The write_buffer can contain more than one interrupt out transfer.
    129 */
    130static int write_buffer_size = 10;
    131module_param(write_buffer_size, int, 0000);
    132MODULE_PARM_DESC(write_buffer_size, "Write buffer size in reports");
    133
    134/* As of kernel version 2.6.4 ehci-hcd uses an
    135 * "only one interrupt transfer per frame" shortcut
    136 * to simplify the scheduling of periodic transfers.
    137 * This conflicts with our standard 1ms intervals for in and out URBs.
    138 * We use default intervals of 2ms for in and 2ms for out transfers,
    139 * which should be fast enough.
    140 * Increase the interval to allow more devices that do interrupt transfers,
    141 * or set to 1 to use the standard interval from the endpoint descriptors.
    142 */
    143static int min_interrupt_in_interval = 2;
    144module_param(min_interrupt_in_interval, int, 0000);
    145MODULE_PARM_DESC(min_interrupt_in_interval, "Minimum interrupt in interval in ms");
    146
    147static int min_interrupt_out_interval = 2;
    148module_param(min_interrupt_out_interval, int, 0000);
    149MODULE_PARM_DESC(min_interrupt_out_interval, "Minimum interrupt out interval in ms");
    150
    151/* Structure to hold all of our device specific stuff */
    152struct ld_usb {
    153	struct mutex		mutex;		/* locks this structure */
    154	struct usb_interface	*intf;		/* save off the usb interface pointer */
    155	unsigned long		disconnected:1;
    156
    157	int			open_count;	/* number of times this port has been opened */
    158
    159	char			*ring_buffer;
    160	unsigned int		ring_head;
    161	unsigned int		ring_tail;
    162
    163	wait_queue_head_t	read_wait;
    164	wait_queue_head_t	write_wait;
    165
    166	char			*interrupt_in_buffer;
    167	struct usb_endpoint_descriptor *interrupt_in_endpoint;
    168	struct urb		*interrupt_in_urb;
    169	int			interrupt_in_interval;
    170	size_t			interrupt_in_endpoint_size;
    171	int			interrupt_in_running;
    172	int			interrupt_in_done;
    173	int			buffer_overflow;
    174	spinlock_t		rbsl;
    175
    176	char			*interrupt_out_buffer;
    177	struct usb_endpoint_descriptor *interrupt_out_endpoint;
    178	struct urb		*interrupt_out_urb;
    179	int			interrupt_out_interval;
    180	size_t			interrupt_out_endpoint_size;
    181	int			interrupt_out_busy;
    182};
    183
    184static struct usb_driver ld_usb_driver;
    185
    186/*
    187 *	ld_usb_abort_transfers
    188 *      aborts transfers and frees associated data structures
    189 */
    190static void ld_usb_abort_transfers(struct ld_usb *dev)
    191{
    192	/* shutdown transfer */
    193	if (dev->interrupt_in_running) {
    194		dev->interrupt_in_running = 0;
    195		usb_kill_urb(dev->interrupt_in_urb);
    196	}
    197	if (dev->interrupt_out_busy)
    198		usb_kill_urb(dev->interrupt_out_urb);
    199}
    200
    201/*
    202 *	ld_usb_delete
    203 */
    204static void ld_usb_delete(struct ld_usb *dev)
    205{
    206	/* free data structures */
    207	usb_free_urb(dev->interrupt_in_urb);
    208	usb_free_urb(dev->interrupt_out_urb);
    209	kfree(dev->ring_buffer);
    210	kfree(dev->interrupt_in_buffer);
    211	kfree(dev->interrupt_out_buffer);
    212	kfree(dev);
    213}
    214
    215/*
    216 *	ld_usb_interrupt_in_callback
    217 */
    218static void ld_usb_interrupt_in_callback(struct urb *urb)
    219{
    220	struct ld_usb *dev = urb->context;
    221	size_t *actual_buffer;
    222	unsigned int next_ring_head;
    223	int status = urb->status;
    224	unsigned long flags;
    225	int retval;
    226
    227	if (status) {
    228		if (status == -ENOENT ||
    229		    status == -ECONNRESET ||
    230		    status == -ESHUTDOWN) {
    231			goto exit;
    232		} else {
    233			dev_dbg(&dev->intf->dev,
    234				"%s: nonzero status received: %d\n", __func__,
    235				status);
    236			spin_lock_irqsave(&dev->rbsl, flags);
    237			goto resubmit; /* maybe we can recover */
    238		}
    239	}
    240
    241	spin_lock_irqsave(&dev->rbsl, flags);
    242	if (urb->actual_length > 0) {
    243		next_ring_head = (dev->ring_head+1) % ring_buffer_size;
    244		if (next_ring_head != dev->ring_tail) {
    245			actual_buffer = (size_t *)(dev->ring_buffer + dev->ring_head * (sizeof(size_t)+dev->interrupt_in_endpoint_size));
    246			/* actual_buffer gets urb->actual_length + interrupt_in_buffer */
    247			*actual_buffer = urb->actual_length;
    248			memcpy(actual_buffer+1, dev->interrupt_in_buffer, urb->actual_length);
    249			dev->ring_head = next_ring_head;
    250			dev_dbg(&dev->intf->dev, "%s: received %d bytes\n",
    251				__func__, urb->actual_length);
    252		} else {
    253			dev_warn(&dev->intf->dev,
    254				 "Ring buffer overflow, %d bytes dropped\n",
    255				 urb->actual_length);
    256			dev->buffer_overflow = 1;
    257		}
    258	}
    259
    260resubmit:
    261	/* resubmit if we're still running */
    262	if (dev->interrupt_in_running && !dev->buffer_overflow) {
    263		retval = usb_submit_urb(dev->interrupt_in_urb, GFP_ATOMIC);
    264		if (retval) {
    265			dev_err(&dev->intf->dev,
    266				"usb_submit_urb failed (%d)\n", retval);
    267			dev->buffer_overflow = 1;
    268		}
    269	}
    270	spin_unlock_irqrestore(&dev->rbsl, flags);
    271exit:
    272	dev->interrupt_in_done = 1;
    273	wake_up_interruptible(&dev->read_wait);
    274}
    275
    276/*
    277 *	ld_usb_interrupt_out_callback
    278 */
    279static void ld_usb_interrupt_out_callback(struct urb *urb)
    280{
    281	struct ld_usb *dev = urb->context;
    282	int status = urb->status;
    283
    284	/* sync/async unlink faults aren't errors */
    285	if (status && !(status == -ENOENT ||
    286			status == -ECONNRESET ||
    287			status == -ESHUTDOWN))
    288		dev_dbg(&dev->intf->dev,
    289			"%s - nonzero write interrupt status received: %d\n",
    290			__func__, status);
    291
    292	dev->interrupt_out_busy = 0;
    293	wake_up_interruptible(&dev->write_wait);
    294}
    295
    296/*
    297 *	ld_usb_open
    298 */
    299static int ld_usb_open(struct inode *inode, struct file *file)
    300{
    301	struct ld_usb *dev;
    302	int subminor;
    303	int retval;
    304	struct usb_interface *interface;
    305
    306	stream_open(inode, file);
    307	subminor = iminor(inode);
    308
    309	interface = usb_find_interface(&ld_usb_driver, subminor);
    310
    311	if (!interface) {
    312		printk(KERN_ERR "%s - error, can't find device for minor %d\n",
    313		       __func__, subminor);
    314		return -ENODEV;
    315	}
    316
    317	dev = usb_get_intfdata(interface);
    318
    319	if (!dev)
    320		return -ENODEV;
    321
    322	/* lock this device */
    323	if (mutex_lock_interruptible(&dev->mutex))
    324		return -ERESTARTSYS;
    325
    326	/* allow opening only once */
    327	if (dev->open_count) {
    328		retval = -EBUSY;
    329		goto unlock_exit;
    330	}
    331	dev->open_count = 1;
    332
    333	/* initialize in direction */
    334	dev->ring_head = 0;
    335	dev->ring_tail = 0;
    336	dev->buffer_overflow = 0;
    337	usb_fill_int_urb(dev->interrupt_in_urb,
    338			 interface_to_usbdev(interface),
    339			 usb_rcvintpipe(interface_to_usbdev(interface),
    340					dev->interrupt_in_endpoint->bEndpointAddress),
    341			 dev->interrupt_in_buffer,
    342			 dev->interrupt_in_endpoint_size,
    343			 ld_usb_interrupt_in_callback,
    344			 dev,
    345			 dev->interrupt_in_interval);
    346
    347	dev->interrupt_in_running = 1;
    348	dev->interrupt_in_done = 0;
    349
    350	retval = usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL);
    351	if (retval) {
    352		dev_err(&interface->dev, "Couldn't submit interrupt_in_urb %d\n", retval);
    353		dev->interrupt_in_running = 0;
    354		dev->open_count = 0;
    355		goto unlock_exit;
    356	}
    357
    358	/* save device in the file's private structure */
    359	file->private_data = dev;
    360
    361unlock_exit:
    362	mutex_unlock(&dev->mutex);
    363
    364	return retval;
    365}
    366
    367/*
    368 *	ld_usb_release
    369 */
    370static int ld_usb_release(struct inode *inode, struct file *file)
    371{
    372	struct ld_usb *dev;
    373	int retval = 0;
    374
    375	dev = file->private_data;
    376
    377	if (dev == NULL) {
    378		retval = -ENODEV;
    379		goto exit;
    380	}
    381
    382	mutex_lock(&dev->mutex);
    383
    384	if (dev->open_count != 1) {
    385		retval = -ENODEV;
    386		goto unlock_exit;
    387	}
    388	if (dev->disconnected) {
    389		/* the device was unplugged before the file was released */
    390		mutex_unlock(&dev->mutex);
    391		/* unlock here as ld_usb_delete frees dev */
    392		ld_usb_delete(dev);
    393		goto exit;
    394	}
    395
    396	/* wait until write transfer is finished */
    397	if (dev->interrupt_out_busy)
    398		wait_event_interruptible_timeout(dev->write_wait, !dev->interrupt_out_busy, 2 * HZ);
    399	ld_usb_abort_transfers(dev);
    400	dev->open_count = 0;
    401
    402unlock_exit:
    403	mutex_unlock(&dev->mutex);
    404
    405exit:
    406	return retval;
    407}
    408
    409/*
    410 *	ld_usb_poll
    411 */
    412static __poll_t ld_usb_poll(struct file *file, poll_table *wait)
    413{
    414	struct ld_usb *dev;
    415	__poll_t mask = 0;
    416
    417	dev = file->private_data;
    418
    419	if (dev->disconnected)
    420		return EPOLLERR | EPOLLHUP;
    421
    422	poll_wait(file, &dev->read_wait, wait);
    423	poll_wait(file, &dev->write_wait, wait);
    424
    425	if (dev->ring_head != dev->ring_tail)
    426		mask |= EPOLLIN | EPOLLRDNORM;
    427	if (!dev->interrupt_out_busy)
    428		mask |= EPOLLOUT | EPOLLWRNORM;
    429
    430	return mask;
    431}
    432
    433/*
    434 *	ld_usb_read
    435 */
    436static ssize_t ld_usb_read(struct file *file, char __user *buffer, size_t count,
    437			   loff_t *ppos)
    438{
    439	struct ld_usb *dev;
    440	size_t *actual_buffer;
    441	size_t bytes_to_read;
    442	int retval = 0;
    443	int rv;
    444
    445	dev = file->private_data;
    446
    447	/* verify that we actually have some data to read */
    448	if (count == 0)
    449		goto exit;
    450
    451	/* lock this object */
    452	if (mutex_lock_interruptible(&dev->mutex)) {
    453		retval = -ERESTARTSYS;
    454		goto exit;
    455	}
    456
    457	/* verify that the device wasn't unplugged */
    458	if (dev->disconnected) {
    459		retval = -ENODEV;
    460		printk(KERN_ERR "ldusb: No device or device unplugged %d\n", retval);
    461		goto unlock_exit;
    462	}
    463
    464	/* wait for data */
    465	spin_lock_irq(&dev->rbsl);
    466	while (dev->ring_head == dev->ring_tail) {
    467		dev->interrupt_in_done = 0;
    468		spin_unlock_irq(&dev->rbsl);
    469		if (file->f_flags & O_NONBLOCK) {
    470			retval = -EAGAIN;
    471			goto unlock_exit;
    472		}
    473		retval = wait_event_interruptible(dev->read_wait, dev->interrupt_in_done);
    474		if (retval < 0)
    475			goto unlock_exit;
    476
    477		spin_lock_irq(&dev->rbsl);
    478	}
    479	spin_unlock_irq(&dev->rbsl);
    480
    481	/* actual_buffer contains actual_length + interrupt_in_buffer */
    482	actual_buffer = (size_t *)(dev->ring_buffer + dev->ring_tail * (sizeof(size_t)+dev->interrupt_in_endpoint_size));
    483	if (*actual_buffer > dev->interrupt_in_endpoint_size) {
    484		retval = -EIO;
    485		goto unlock_exit;
    486	}
    487	bytes_to_read = min(count, *actual_buffer);
    488	if (bytes_to_read < *actual_buffer)
    489		dev_warn(&dev->intf->dev, "Read buffer overflow, %zu bytes dropped\n",
    490			 *actual_buffer-bytes_to_read);
    491
    492	/* copy one interrupt_in_buffer from ring_buffer into userspace */
    493	if (copy_to_user(buffer, actual_buffer+1, bytes_to_read)) {
    494		retval = -EFAULT;
    495		goto unlock_exit;
    496	}
    497	retval = bytes_to_read;
    498
    499	spin_lock_irq(&dev->rbsl);
    500	dev->ring_tail = (dev->ring_tail + 1) % ring_buffer_size;
    501
    502	if (dev->buffer_overflow) {
    503		dev->buffer_overflow = 0;
    504		spin_unlock_irq(&dev->rbsl);
    505		rv = usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL);
    506		if (rv < 0)
    507			dev->buffer_overflow = 1;
    508	} else {
    509		spin_unlock_irq(&dev->rbsl);
    510	}
    511
    512unlock_exit:
    513	/* unlock the device */
    514	mutex_unlock(&dev->mutex);
    515
    516exit:
    517	return retval;
    518}
    519
    520/*
    521 *	ld_usb_write
    522 */
    523static ssize_t ld_usb_write(struct file *file, const char __user *buffer,
    524			    size_t count, loff_t *ppos)
    525{
    526	struct ld_usb *dev;
    527	size_t bytes_to_write;
    528	int retval = 0;
    529
    530	dev = file->private_data;
    531
    532	/* verify that we actually have some data to write */
    533	if (count == 0)
    534		goto exit;
    535
    536	/* lock this object */
    537	if (mutex_lock_interruptible(&dev->mutex)) {
    538		retval = -ERESTARTSYS;
    539		goto exit;
    540	}
    541
    542	/* verify that the device wasn't unplugged */
    543	if (dev->disconnected) {
    544		retval = -ENODEV;
    545		printk(KERN_ERR "ldusb: No device or device unplugged %d\n", retval);
    546		goto unlock_exit;
    547	}
    548
    549	/* wait until previous transfer is finished */
    550	if (dev->interrupt_out_busy) {
    551		if (file->f_flags & O_NONBLOCK) {
    552			retval = -EAGAIN;
    553			goto unlock_exit;
    554		}
    555		retval = wait_event_interruptible(dev->write_wait, !dev->interrupt_out_busy);
    556		if (retval < 0) {
    557			goto unlock_exit;
    558		}
    559	}
    560
    561	/* write the data into interrupt_out_buffer from userspace */
    562	bytes_to_write = min(count, write_buffer_size*dev->interrupt_out_endpoint_size);
    563	if (bytes_to_write < count)
    564		dev_warn(&dev->intf->dev, "Write buffer overflow, %zu bytes dropped\n",
    565			count - bytes_to_write);
    566	dev_dbg(&dev->intf->dev, "%s: count = %zu, bytes_to_write = %zu\n",
    567		__func__, count, bytes_to_write);
    568
    569	if (copy_from_user(dev->interrupt_out_buffer, buffer, bytes_to_write)) {
    570		retval = -EFAULT;
    571		goto unlock_exit;
    572	}
    573
    574	if (dev->interrupt_out_endpoint == NULL) {
    575		/* try HID_REQ_SET_REPORT=9 on control_endpoint instead of interrupt_out_endpoint */
    576		retval = usb_control_msg(interface_to_usbdev(dev->intf),
    577					 usb_sndctrlpipe(interface_to_usbdev(dev->intf), 0),
    578					 9,
    579					 USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
    580					 1 << 8, 0,
    581					 dev->interrupt_out_buffer,
    582					 bytes_to_write,
    583					 USB_CTRL_SET_TIMEOUT);
    584		if (retval < 0)
    585			dev_err(&dev->intf->dev,
    586				"Couldn't submit HID_REQ_SET_REPORT %d\n",
    587				retval);
    588		goto unlock_exit;
    589	}
    590
    591	/* send off the urb */
    592	usb_fill_int_urb(dev->interrupt_out_urb,
    593			 interface_to_usbdev(dev->intf),
    594			 usb_sndintpipe(interface_to_usbdev(dev->intf),
    595					dev->interrupt_out_endpoint->bEndpointAddress),
    596			 dev->interrupt_out_buffer,
    597			 bytes_to_write,
    598			 ld_usb_interrupt_out_callback,
    599			 dev,
    600			 dev->interrupt_out_interval);
    601
    602	dev->interrupt_out_busy = 1;
    603	wmb();
    604
    605	retval = usb_submit_urb(dev->interrupt_out_urb, GFP_KERNEL);
    606	if (retval) {
    607		dev->interrupt_out_busy = 0;
    608		dev_err(&dev->intf->dev,
    609			"Couldn't submit interrupt_out_urb %d\n", retval);
    610		goto unlock_exit;
    611	}
    612	retval = bytes_to_write;
    613
    614unlock_exit:
    615	/* unlock the device */
    616	mutex_unlock(&dev->mutex);
    617
    618exit:
    619	return retval;
    620}
    621
    622/* file operations needed when we register this driver */
    623static const struct file_operations ld_usb_fops = {
    624	.owner =	THIS_MODULE,
    625	.read  =	ld_usb_read,
    626	.write =	ld_usb_write,
    627	.open =		ld_usb_open,
    628	.release =	ld_usb_release,
    629	.poll =		ld_usb_poll,
    630	.llseek =	no_llseek,
    631};
    632
    633/*
    634 * usb class driver info in order to get a minor number from the usb core,
    635 * and to have the device registered with the driver core
    636 */
    637static struct usb_class_driver ld_usb_class = {
    638	.name =		"ldusb%d",
    639	.fops =		&ld_usb_fops,
    640	.minor_base =	USB_LD_MINOR_BASE,
    641};
    642
    643/*
    644 *	ld_usb_probe
    645 *
    646 *	Called by the usb core when a new device is connected that it thinks
    647 *	this driver might be interested in.
    648 */
    649static int ld_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
    650{
    651	struct usb_device *udev = interface_to_usbdev(intf);
    652	struct ld_usb *dev = NULL;
    653	struct usb_host_interface *iface_desc;
    654	char *buffer;
    655	int retval = -ENOMEM;
    656	int res;
    657
    658	/* allocate memory for our device state and initialize it */
    659
    660	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
    661	if (!dev)
    662		goto exit;
    663	mutex_init(&dev->mutex);
    664	spin_lock_init(&dev->rbsl);
    665	dev->intf = intf;
    666	init_waitqueue_head(&dev->read_wait);
    667	init_waitqueue_head(&dev->write_wait);
    668
    669	/* workaround for early firmware versions on fast computers */
    670	if ((le16_to_cpu(udev->descriptor.idVendor) == USB_VENDOR_ID_LD) &&
    671	    ((le16_to_cpu(udev->descriptor.idProduct) == USB_DEVICE_ID_LD_CASSY) ||
    672	     (le16_to_cpu(udev->descriptor.idProduct) == USB_DEVICE_ID_LD_COM3LAB)) &&
    673	    (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x103)) {
    674		buffer = kmalloc(256, GFP_KERNEL);
    675		if (!buffer)
    676			goto error;
    677		/* usb_string makes SETUP+STALL to leave always ControlReadLoop */
    678		usb_string(udev, 255, buffer, 256);
    679		kfree(buffer);
    680	}
    681
    682	iface_desc = intf->cur_altsetting;
    683
    684	res = usb_find_last_int_in_endpoint(iface_desc,
    685			&dev->interrupt_in_endpoint);
    686	if (res) {
    687		dev_err(&intf->dev, "Interrupt in endpoint not found\n");
    688		retval = res;
    689		goto error;
    690	}
    691
    692	res = usb_find_last_int_out_endpoint(iface_desc,
    693			&dev->interrupt_out_endpoint);
    694	if (res)
    695		dev_warn(&intf->dev, "Interrupt out endpoint not found (using control endpoint instead)\n");
    696
    697	dev->interrupt_in_endpoint_size = usb_endpoint_maxp(dev->interrupt_in_endpoint);
    698	dev->ring_buffer = kcalloc(ring_buffer_size,
    699			sizeof(size_t) + dev->interrupt_in_endpoint_size,
    700			GFP_KERNEL);
    701	if (!dev->ring_buffer)
    702		goto error;
    703	dev->interrupt_in_buffer = kmalloc(dev->interrupt_in_endpoint_size, GFP_KERNEL);
    704	if (!dev->interrupt_in_buffer)
    705		goto error;
    706	dev->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL);
    707	if (!dev->interrupt_in_urb)
    708		goto error;
    709	dev->interrupt_out_endpoint_size = dev->interrupt_out_endpoint ? usb_endpoint_maxp(dev->interrupt_out_endpoint) :
    710									 udev->descriptor.bMaxPacketSize0;
    711	dev->interrupt_out_buffer =
    712		kmalloc_array(write_buffer_size,
    713			      dev->interrupt_out_endpoint_size, GFP_KERNEL);
    714	if (!dev->interrupt_out_buffer)
    715		goto error;
    716	dev->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL);
    717	if (!dev->interrupt_out_urb)
    718		goto error;
    719	dev->interrupt_in_interval = min_interrupt_in_interval > dev->interrupt_in_endpoint->bInterval ? min_interrupt_in_interval : dev->interrupt_in_endpoint->bInterval;
    720	if (dev->interrupt_out_endpoint)
    721		dev->interrupt_out_interval = min_interrupt_out_interval > dev->interrupt_out_endpoint->bInterval ? min_interrupt_out_interval : dev->interrupt_out_endpoint->bInterval;
    722
    723	/* we can register the device now, as it is ready */
    724	usb_set_intfdata(intf, dev);
    725
    726	retval = usb_register_dev(intf, &ld_usb_class);
    727	if (retval) {
    728		/* something prevented us from registering this driver */
    729		dev_err(&intf->dev, "Not able to get a minor for this device.\n");
    730		usb_set_intfdata(intf, NULL);
    731		goto error;
    732	}
    733
    734	/* let the user know what node this device is now attached to */
    735	dev_info(&intf->dev, "LD USB Device #%d now attached to major %d minor %d\n",
    736		(intf->minor - USB_LD_MINOR_BASE), USB_MAJOR, intf->minor);
    737
    738exit:
    739	return retval;
    740
    741error:
    742	ld_usb_delete(dev);
    743
    744	return retval;
    745}
    746
    747/*
    748 *	ld_usb_disconnect
    749 *
    750 *	Called by the usb core when the device is removed from the system.
    751 */
    752static void ld_usb_disconnect(struct usb_interface *intf)
    753{
    754	struct ld_usb *dev;
    755	int minor;
    756
    757	dev = usb_get_intfdata(intf);
    758	usb_set_intfdata(intf, NULL);
    759
    760	minor = intf->minor;
    761
    762	/* give back our minor */
    763	usb_deregister_dev(intf, &ld_usb_class);
    764
    765	usb_poison_urb(dev->interrupt_in_urb);
    766	usb_poison_urb(dev->interrupt_out_urb);
    767
    768	mutex_lock(&dev->mutex);
    769
    770	/* if the device is not opened, then we clean up right now */
    771	if (!dev->open_count) {
    772		mutex_unlock(&dev->mutex);
    773		ld_usb_delete(dev);
    774	} else {
    775		dev->disconnected = 1;
    776		/* wake up pollers */
    777		wake_up_interruptible_all(&dev->read_wait);
    778		wake_up_interruptible_all(&dev->write_wait);
    779		mutex_unlock(&dev->mutex);
    780	}
    781
    782	dev_info(&intf->dev, "LD USB Device #%d now disconnected\n",
    783		 (minor - USB_LD_MINOR_BASE));
    784}
    785
    786/* usb specific object needed to register this driver with the usb subsystem */
    787static struct usb_driver ld_usb_driver = {
    788	.name =		"ldusb",
    789	.probe =	ld_usb_probe,
    790	.disconnect =	ld_usb_disconnect,
    791	.id_table =	ld_usb_table,
    792};
    793
    794module_usb_driver(ld_usb_driver);
    795