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

driver.c (21806B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Line 6 Linux USB driver
      4 *
      5 * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
      6 */
      7
      8#include <linux/kernel.h>
      9#include <linux/module.h>
     10#include <linux/export.h>
     11#include <linux/slab.h>
     12#include <linux/usb.h>
     13
     14#include <sound/core.h>
     15#include <sound/initval.h>
     16#include <sound/hwdep.h>
     17
     18#include "capture.h"
     19#include "driver.h"
     20#include "midi.h"
     21#include "playback.h"
     22
     23#define DRIVER_AUTHOR  "Markus Grabner <grabner@icg.tugraz.at>"
     24#define DRIVER_DESC    "Line 6 USB Driver"
     25
     26/*
     27	This is Line 6's MIDI manufacturer ID.
     28*/
     29const unsigned char line6_midi_id[3] = {
     30	0x00, 0x01, 0x0c
     31};
     32EXPORT_SYMBOL_GPL(line6_midi_id);
     33
     34/*
     35	Code to request version of POD, Variax interface
     36	(and maybe other devices).
     37*/
     38static const char line6_request_version[] = {
     39	0xf0, 0x7e, 0x7f, 0x06, 0x01, 0xf7
     40};
     41
     42/*
     43	 Class for asynchronous messages.
     44*/
     45struct message {
     46	struct usb_line6 *line6;
     47	const char *buffer;
     48	int size;
     49	int done;
     50};
     51
     52/*
     53	Forward declarations.
     54*/
     55static void line6_data_received(struct urb *urb);
     56static int line6_send_raw_message_async_part(struct message *msg,
     57					     struct urb *urb);
     58
     59/*
     60	Start to listen on endpoint.
     61*/
     62static int line6_start_listen(struct usb_line6 *line6)
     63{
     64	int err;
     65
     66	if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
     67		usb_fill_int_urb(line6->urb_listen, line6->usbdev,
     68			usb_rcvintpipe(line6->usbdev, line6->properties->ep_ctrl_r),
     69			line6->buffer_listen, LINE6_BUFSIZE_LISTEN,
     70			line6_data_received, line6, line6->interval);
     71	} else {
     72		usb_fill_bulk_urb(line6->urb_listen, line6->usbdev,
     73			usb_rcvbulkpipe(line6->usbdev, line6->properties->ep_ctrl_r),
     74			line6->buffer_listen, LINE6_BUFSIZE_LISTEN,
     75			line6_data_received, line6);
     76	}
     77
     78	/* sanity checks of EP before actually submitting */
     79	if (usb_urb_ep_type_check(line6->urb_listen)) {
     80		dev_err(line6->ifcdev, "invalid control EP\n");
     81		return -EINVAL;
     82	}
     83
     84	line6->urb_listen->actual_length = 0;
     85	err = usb_submit_urb(line6->urb_listen, GFP_ATOMIC);
     86	return err;
     87}
     88
     89/*
     90	Stop listening on endpoint.
     91*/
     92static void line6_stop_listen(struct usb_line6 *line6)
     93{
     94	usb_kill_urb(line6->urb_listen);
     95}
     96
     97/*
     98	Send raw message in pieces of wMaxPacketSize bytes.
     99*/
    100int line6_send_raw_message(struct usb_line6 *line6, const char *buffer,
    101				  int size)
    102{
    103	int i, done = 0;
    104	const struct line6_properties *properties = line6->properties;
    105
    106	for (i = 0; i < size; i += line6->max_packet_size) {
    107		int partial;
    108		const char *frag_buf = buffer + i;
    109		int frag_size = min(line6->max_packet_size, size - i);
    110		int retval;
    111
    112		if (properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
    113			retval = usb_interrupt_msg(line6->usbdev,
    114						usb_sndintpipe(line6->usbdev, properties->ep_ctrl_w),
    115						(char *)frag_buf, frag_size,
    116						&partial, LINE6_TIMEOUT);
    117		} else {
    118			retval = usb_bulk_msg(line6->usbdev,
    119						usb_sndbulkpipe(line6->usbdev, properties->ep_ctrl_w),
    120						(char *)frag_buf, frag_size,
    121						&partial, LINE6_TIMEOUT);
    122		}
    123
    124		if (retval) {
    125			dev_err(line6->ifcdev,
    126				"usb_bulk_msg failed (%d)\n", retval);
    127			break;
    128		}
    129
    130		done += frag_size;
    131	}
    132
    133	return done;
    134}
    135EXPORT_SYMBOL_GPL(line6_send_raw_message);
    136
    137/*
    138	Notification of completion of asynchronous request transmission.
    139*/
    140static void line6_async_request_sent(struct urb *urb)
    141{
    142	struct message *msg = (struct message *)urb->context;
    143
    144	if (msg->done >= msg->size) {
    145		usb_free_urb(urb);
    146		kfree(msg);
    147	} else
    148		line6_send_raw_message_async_part(msg, urb);
    149}
    150
    151/*
    152	Asynchronously send part of a raw message.
    153*/
    154static int line6_send_raw_message_async_part(struct message *msg,
    155					     struct urb *urb)
    156{
    157	int retval;
    158	struct usb_line6 *line6 = msg->line6;
    159	int done = msg->done;
    160	int bytes = min(msg->size - done, line6->max_packet_size);
    161
    162	if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
    163		usb_fill_int_urb(urb, line6->usbdev,
    164			usb_sndintpipe(line6->usbdev, line6->properties->ep_ctrl_w),
    165			(char *)msg->buffer + done, bytes,
    166			line6_async_request_sent, msg, line6->interval);
    167	} else {
    168		usb_fill_bulk_urb(urb, line6->usbdev,
    169			usb_sndbulkpipe(line6->usbdev, line6->properties->ep_ctrl_w),
    170			(char *)msg->buffer + done, bytes,
    171			line6_async_request_sent, msg);
    172	}
    173
    174	msg->done += bytes;
    175
    176	/* sanity checks of EP before actually submitting */
    177	retval = usb_urb_ep_type_check(urb);
    178	if (retval < 0)
    179		goto error;
    180
    181	retval = usb_submit_urb(urb, GFP_ATOMIC);
    182	if (retval < 0)
    183		goto error;
    184
    185	return 0;
    186
    187 error:
    188	dev_err(line6->ifcdev, "%s: usb_submit_urb failed (%d)\n",
    189		__func__, retval);
    190	usb_free_urb(urb);
    191	kfree(msg);
    192	return retval;
    193}
    194
    195/*
    196	Asynchronously send raw message.
    197*/
    198int line6_send_raw_message_async(struct usb_line6 *line6, const char *buffer,
    199				 int size)
    200{
    201	struct message *msg;
    202	struct urb *urb;
    203
    204	/* create message: */
    205	msg = kmalloc(sizeof(struct message), GFP_ATOMIC);
    206	if (msg == NULL)
    207		return -ENOMEM;
    208
    209	/* create URB: */
    210	urb = usb_alloc_urb(0, GFP_ATOMIC);
    211
    212	if (urb == NULL) {
    213		kfree(msg);
    214		return -ENOMEM;
    215	}
    216
    217	/* set message data: */
    218	msg->line6 = line6;
    219	msg->buffer = buffer;
    220	msg->size = size;
    221	msg->done = 0;
    222
    223	/* start sending: */
    224	return line6_send_raw_message_async_part(msg, urb);
    225}
    226EXPORT_SYMBOL_GPL(line6_send_raw_message_async);
    227
    228/*
    229	Send asynchronous device version request.
    230*/
    231int line6_version_request_async(struct usb_line6 *line6)
    232{
    233	char *buffer;
    234	int retval;
    235
    236	buffer = kmemdup(line6_request_version,
    237			sizeof(line6_request_version), GFP_ATOMIC);
    238	if (buffer == NULL)
    239		return -ENOMEM;
    240
    241	retval = line6_send_raw_message_async(line6, buffer,
    242					      sizeof(line6_request_version));
    243	kfree(buffer);
    244	return retval;
    245}
    246EXPORT_SYMBOL_GPL(line6_version_request_async);
    247
    248/*
    249	Send sysex message in pieces of wMaxPacketSize bytes.
    250*/
    251int line6_send_sysex_message(struct usb_line6 *line6, const char *buffer,
    252			     int size)
    253{
    254	return line6_send_raw_message(line6, buffer,
    255				      size + SYSEX_EXTRA_SIZE) -
    256	    SYSEX_EXTRA_SIZE;
    257}
    258EXPORT_SYMBOL_GPL(line6_send_sysex_message);
    259
    260/*
    261	Allocate buffer for sysex message and prepare header.
    262	@param code sysex message code
    263	@param size number of bytes between code and sysex end
    264*/
    265char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1, int code2,
    266			       int size)
    267{
    268	char *buffer = kmalloc(size + SYSEX_EXTRA_SIZE, GFP_ATOMIC);
    269
    270	if (!buffer)
    271		return NULL;
    272
    273	buffer[0] = LINE6_SYSEX_BEGIN;
    274	memcpy(buffer + 1, line6_midi_id, sizeof(line6_midi_id));
    275	buffer[sizeof(line6_midi_id) + 1] = code1;
    276	buffer[sizeof(line6_midi_id) + 2] = code2;
    277	buffer[sizeof(line6_midi_id) + 3 + size] = LINE6_SYSEX_END;
    278	return buffer;
    279}
    280EXPORT_SYMBOL_GPL(line6_alloc_sysex_buffer);
    281
    282/*
    283	Notification of data received from the Line 6 device.
    284*/
    285static void line6_data_received(struct urb *urb)
    286{
    287	struct usb_line6 *line6 = (struct usb_line6 *)urb->context;
    288	struct midi_buffer *mb = &line6->line6midi->midibuf_in;
    289	int done;
    290
    291	if (urb->status == -ESHUTDOWN)
    292		return;
    293
    294	if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
    295		done =
    296			line6_midibuf_write(mb, urb->transfer_buffer, urb->actual_length);
    297
    298		if (done < urb->actual_length) {
    299			line6_midibuf_ignore(mb, done);
    300			dev_dbg(line6->ifcdev, "%d %d buffer overflow - message skipped\n",
    301				done, urb->actual_length);
    302		}
    303
    304		for (;;) {
    305			done =
    306				line6_midibuf_read(mb, line6->buffer_message,
    307						LINE6_MIDI_MESSAGE_MAXLEN);
    308
    309			if (done <= 0)
    310				break;
    311
    312			line6->message_length = done;
    313			line6_midi_receive(line6, line6->buffer_message, done);
    314
    315			if (line6->process_message)
    316				line6->process_message(line6);
    317		}
    318	} else {
    319		line6->buffer_message = urb->transfer_buffer;
    320		line6->message_length = urb->actual_length;
    321		if (line6->process_message)
    322			line6->process_message(line6);
    323		line6->buffer_message = NULL;
    324	}
    325
    326	line6_start_listen(line6);
    327}
    328
    329#define LINE6_READ_WRITE_STATUS_DELAY 2  /* milliseconds */
    330#define LINE6_READ_WRITE_MAX_RETRIES 50
    331
    332/*
    333	Read data from device.
    334*/
    335int line6_read_data(struct usb_line6 *line6, unsigned address, void *data,
    336		    unsigned datalen)
    337{
    338	struct usb_device *usbdev = line6->usbdev;
    339	int ret;
    340	u8 len;
    341	unsigned count;
    342
    343	if (address > 0xffff || datalen > 0xff)
    344		return -EINVAL;
    345
    346	/* query the serial number: */
    347	ret = usb_control_msg_send(usbdev, 0, 0x67,
    348				   USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
    349				   (datalen << 8) | 0x21, address, NULL, 0,
    350				   LINE6_TIMEOUT, GFP_KERNEL);
    351	if (ret) {
    352		dev_err(line6->ifcdev, "read request failed (error %d)\n", ret);
    353		goto exit;
    354	}
    355
    356	/* Wait for data length. We'll get 0xff until length arrives. */
    357	for (count = 0; count < LINE6_READ_WRITE_MAX_RETRIES; count++) {
    358		mdelay(LINE6_READ_WRITE_STATUS_DELAY);
    359
    360		ret = usb_control_msg_recv(usbdev, 0, 0x67,
    361					   USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
    362					   0x0012, 0x0000, &len, 1,
    363					   LINE6_TIMEOUT, GFP_KERNEL);
    364		if (ret) {
    365			dev_err(line6->ifcdev,
    366				"receive length failed (error %d)\n", ret);
    367			goto exit;
    368		}
    369
    370		if (len != 0xff)
    371			break;
    372	}
    373
    374	ret = -EIO;
    375	if (len == 0xff) {
    376		dev_err(line6->ifcdev, "read failed after %d retries\n",
    377			count);
    378		goto exit;
    379	} else if (len != datalen) {
    380		/* should be equal or something went wrong */
    381		dev_err(line6->ifcdev,
    382			"length mismatch (expected %d, got %d)\n",
    383			(int)datalen, len);
    384		goto exit;
    385	}
    386
    387	/* receive the result: */
    388	ret = usb_control_msg_recv(usbdev, 0, 0x67,
    389				   USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
    390				   0x0013, 0x0000, data, datalen, LINE6_TIMEOUT,
    391				   GFP_KERNEL);
    392	if (ret)
    393		dev_err(line6->ifcdev, "read failed (error %d)\n", ret);
    394
    395exit:
    396	return ret;
    397}
    398EXPORT_SYMBOL_GPL(line6_read_data);
    399
    400/*
    401	Write data to device.
    402*/
    403int line6_write_data(struct usb_line6 *line6, unsigned address, void *data,
    404		     unsigned datalen)
    405{
    406	struct usb_device *usbdev = line6->usbdev;
    407	int ret;
    408	unsigned char *status;
    409	int count;
    410
    411	if (address > 0xffff || datalen > 0xffff)
    412		return -EINVAL;
    413
    414	status = kmalloc(1, GFP_KERNEL);
    415	if (!status)
    416		return -ENOMEM;
    417
    418	ret = usb_control_msg_send(usbdev, 0, 0x67,
    419				   USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
    420				   0x0022, address, data, datalen, LINE6_TIMEOUT,
    421				   GFP_KERNEL);
    422	if (ret) {
    423		dev_err(line6->ifcdev,
    424			"write request failed (error %d)\n", ret);
    425		goto exit;
    426	}
    427
    428	for (count = 0; count < LINE6_READ_WRITE_MAX_RETRIES; count++) {
    429		mdelay(LINE6_READ_WRITE_STATUS_DELAY);
    430
    431		ret = usb_control_msg_recv(usbdev, 0, 0x67,
    432					   USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
    433					   0x0012, 0x0000, status, 1, LINE6_TIMEOUT,
    434					   GFP_KERNEL);
    435		if (ret) {
    436			dev_err(line6->ifcdev,
    437				"receiving status failed (error %d)\n", ret);
    438			goto exit;
    439		}
    440
    441		if (*status != 0xff)
    442			break;
    443	}
    444
    445	if (*status == 0xff) {
    446		dev_err(line6->ifcdev, "write failed after %d retries\n",
    447			count);
    448		ret = -EIO;
    449	} else if (*status != 0) {
    450		dev_err(line6->ifcdev, "write failed (error %d)\n", ret);
    451		ret = -EIO;
    452	}
    453exit:
    454	kfree(status);
    455	return ret;
    456}
    457EXPORT_SYMBOL_GPL(line6_write_data);
    458
    459/*
    460	Read Line 6 device serial number.
    461	(POD, TonePort, GuitarPort)
    462*/
    463int line6_read_serial_number(struct usb_line6 *line6, u32 *serial_number)
    464{
    465	return line6_read_data(line6, 0x80d0, serial_number,
    466			       sizeof(*serial_number));
    467}
    468EXPORT_SYMBOL_GPL(line6_read_serial_number);
    469
    470/*
    471	Card destructor.
    472*/
    473static void line6_destruct(struct snd_card *card)
    474{
    475	struct usb_line6 *line6 = card->private_data;
    476	struct usb_device *usbdev = line6->usbdev;
    477
    478	/* Free buffer memory first. We cannot depend on the existence of private
    479	 * data from the (podhd) module, it may be gone already during this call
    480	 */
    481	kfree(line6->buffer_message);
    482
    483	kfree(line6->buffer_listen);
    484
    485	/* then free URBs: */
    486	usb_free_urb(line6->urb_listen);
    487	line6->urb_listen = NULL;
    488
    489	/* decrement reference counters: */
    490	usb_put_dev(usbdev);
    491}
    492
    493static void line6_get_usb_properties(struct usb_line6 *line6)
    494{
    495	struct usb_device *usbdev = line6->usbdev;
    496	const struct line6_properties *properties = line6->properties;
    497	int pipe;
    498	struct usb_host_endpoint *ep = NULL;
    499
    500	if (properties->capabilities & LINE6_CAP_CONTROL) {
    501		if (properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
    502			pipe = usb_rcvintpipe(line6->usbdev,
    503				line6->properties->ep_ctrl_r);
    504		} else {
    505			pipe = usb_rcvbulkpipe(line6->usbdev,
    506				line6->properties->ep_ctrl_r);
    507		}
    508		ep = usbdev->ep_in[usb_pipeendpoint(pipe)];
    509	}
    510
    511	/* Control data transfer properties */
    512	if (ep) {
    513		line6->interval = ep->desc.bInterval;
    514		line6->max_packet_size = le16_to_cpu(ep->desc.wMaxPacketSize);
    515	} else {
    516		if (properties->capabilities & LINE6_CAP_CONTROL) {
    517			dev_err(line6->ifcdev,
    518				"endpoint not available, using fallback values");
    519		}
    520		line6->interval = LINE6_FALLBACK_INTERVAL;
    521		line6->max_packet_size = LINE6_FALLBACK_MAXPACKETSIZE;
    522	}
    523
    524	/* Isochronous transfer properties */
    525	if (usbdev->speed == USB_SPEED_LOW) {
    526		line6->intervals_per_second = USB_LOW_INTERVALS_PER_SECOND;
    527		line6->iso_buffers = USB_LOW_ISO_BUFFERS;
    528	} else {
    529		line6->intervals_per_second = USB_HIGH_INTERVALS_PER_SECOND;
    530		line6->iso_buffers = USB_HIGH_ISO_BUFFERS;
    531	}
    532}
    533
    534/* Enable buffering of incoming messages, flush the buffer */
    535static int line6_hwdep_open(struct snd_hwdep *hw, struct file *file)
    536{
    537	struct usb_line6 *line6 = hw->private_data;
    538
    539	/* NOTE: hwdep layer provides atomicity here */
    540
    541	line6->messages.active = 1;
    542	line6->messages.nonblock = file->f_flags & O_NONBLOCK ? 1 : 0;
    543
    544	return 0;
    545}
    546
    547/* Stop buffering */
    548static int line6_hwdep_release(struct snd_hwdep *hw, struct file *file)
    549{
    550	struct usb_line6 *line6 = hw->private_data;
    551
    552	line6->messages.active = 0;
    553
    554	return 0;
    555}
    556
    557/* Read from circular buffer, return to user */
    558static long
    559line6_hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count,
    560					loff_t *offset)
    561{
    562	struct usb_line6 *line6 = hwdep->private_data;
    563	long rv = 0;
    564	unsigned int out_count;
    565
    566	if (mutex_lock_interruptible(&line6->messages.read_lock))
    567		return -ERESTARTSYS;
    568
    569	while (kfifo_len(&line6->messages.fifo) == 0) {
    570		mutex_unlock(&line6->messages.read_lock);
    571
    572		if (line6->messages.nonblock)
    573			return -EAGAIN;
    574
    575		rv = wait_event_interruptible(
    576			line6->messages.wait_queue,
    577			kfifo_len(&line6->messages.fifo) != 0);
    578		if (rv < 0)
    579			return rv;
    580
    581		if (mutex_lock_interruptible(&line6->messages.read_lock))
    582			return -ERESTARTSYS;
    583	}
    584
    585	if (kfifo_peek_len(&line6->messages.fifo) > count) {
    586		/* Buffer too small; allow re-read of the current item... */
    587		rv = -EINVAL;
    588	} else {
    589		rv = kfifo_to_user(&line6->messages.fifo, buf, count, &out_count);
    590		if (rv == 0)
    591			rv = out_count;
    592	}
    593
    594	mutex_unlock(&line6->messages.read_lock);
    595	return rv;
    596}
    597
    598/* Write directly (no buffering) to device by user*/
    599static long
    600line6_hwdep_write(struct snd_hwdep *hwdep, const char __user *data, long count,
    601					loff_t *offset)
    602{
    603	struct usb_line6 *line6 = hwdep->private_data;
    604	int rv;
    605	char *data_copy;
    606
    607	if (count > line6->max_packet_size * LINE6_RAW_MESSAGES_MAXCOUNT) {
    608		/* This is an arbitrary limit - still better than nothing... */
    609		return -EINVAL;
    610	}
    611
    612	data_copy = memdup_user(data, count);
    613	if (IS_ERR(data_copy))
    614		return PTR_ERR(data_copy);
    615
    616	rv = line6_send_raw_message(line6, data_copy, count);
    617
    618	kfree(data_copy);
    619	return rv;
    620}
    621
    622static __poll_t
    623line6_hwdep_poll(struct snd_hwdep *hwdep, struct file *file, poll_table *wait)
    624{
    625	__poll_t rv;
    626	struct usb_line6 *line6 = hwdep->private_data;
    627
    628	poll_wait(file, &line6->messages.wait_queue, wait);
    629
    630	mutex_lock(&line6->messages.read_lock);
    631	rv = kfifo_len(&line6->messages.fifo) == 0 ? 0 : EPOLLIN | EPOLLRDNORM;
    632	mutex_unlock(&line6->messages.read_lock);
    633
    634	return rv;
    635}
    636
    637static const struct snd_hwdep_ops hwdep_ops = {
    638	.open    = line6_hwdep_open,
    639	.release = line6_hwdep_release,
    640	.read    = line6_hwdep_read,
    641	.write   = line6_hwdep_write,
    642	.poll    = line6_hwdep_poll,
    643};
    644
    645/* Insert into circular buffer */
    646static void line6_hwdep_push_message(struct usb_line6 *line6)
    647{
    648	if (!line6->messages.active)
    649		return;
    650
    651	if (kfifo_avail(&line6->messages.fifo) >= line6->message_length) {
    652		/* No race condition here, there's only one writer */
    653		kfifo_in(&line6->messages.fifo,
    654			line6->buffer_message, line6->message_length);
    655	} /* else TODO: signal overflow */
    656
    657	wake_up_interruptible(&line6->messages.wait_queue);
    658}
    659
    660static int line6_hwdep_init(struct usb_line6 *line6)
    661{
    662	int err;
    663	struct snd_hwdep *hwdep;
    664
    665	/* TODO: usb_driver_claim_interface(); */
    666	line6->process_message = line6_hwdep_push_message;
    667	line6->messages.active = 0;
    668	init_waitqueue_head(&line6->messages.wait_queue);
    669	mutex_init(&line6->messages.read_lock);
    670	INIT_KFIFO(line6->messages.fifo);
    671
    672	err = snd_hwdep_new(line6->card, "config", 0, &hwdep);
    673	if (err < 0)
    674		goto end;
    675	strcpy(hwdep->name, "config");
    676	hwdep->iface = SNDRV_HWDEP_IFACE_LINE6;
    677	hwdep->ops = hwdep_ops;
    678	hwdep->private_data = line6;
    679	hwdep->exclusive = true;
    680
    681end:
    682	return err;
    683}
    684
    685static int line6_init_cap_control(struct usb_line6 *line6)
    686{
    687	int ret;
    688
    689	/* initialize USB buffers: */
    690	line6->buffer_listen = kmalloc(LINE6_BUFSIZE_LISTEN, GFP_KERNEL);
    691	if (!line6->buffer_listen)
    692		return -ENOMEM;
    693
    694	line6->urb_listen = usb_alloc_urb(0, GFP_KERNEL);
    695	if (!line6->urb_listen)
    696		return -ENOMEM;
    697
    698	if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
    699		line6->buffer_message = kmalloc(LINE6_MIDI_MESSAGE_MAXLEN, GFP_KERNEL);
    700		if (!line6->buffer_message)
    701			return -ENOMEM;
    702
    703		ret = line6_init_midi(line6);
    704		if (ret < 0)
    705			return ret;
    706	} else {
    707		ret = line6_hwdep_init(line6);
    708		if (ret < 0)
    709			return ret;
    710	}
    711
    712	ret = line6_start_listen(line6);
    713	if (ret < 0) {
    714		dev_err(line6->ifcdev, "cannot start listening: %d\n", ret);
    715		return ret;
    716	}
    717
    718	return 0;
    719}
    720
    721static void line6_startup_work(struct work_struct *work)
    722{
    723	struct usb_line6 *line6 =
    724		container_of(work, struct usb_line6, startup_work.work);
    725
    726	if (line6->startup)
    727		line6->startup(line6);
    728}
    729
    730/*
    731	Probe USB device.
    732*/
    733int line6_probe(struct usb_interface *interface,
    734		const struct usb_device_id *id,
    735		const char *driver_name,
    736		const struct line6_properties *properties,
    737		int (*private_init)(struct usb_line6 *, const struct usb_device_id *id),
    738		size_t data_size)
    739{
    740	struct usb_device *usbdev = interface_to_usbdev(interface);
    741	struct snd_card *card;
    742	struct usb_line6 *line6;
    743	int interface_number;
    744	int ret;
    745
    746	if (WARN_ON(data_size < sizeof(*line6)))
    747		return -EINVAL;
    748
    749	/* we don't handle multiple configurations */
    750	if (usbdev->descriptor.bNumConfigurations != 1)
    751		return -ENODEV;
    752
    753	ret = snd_card_new(&interface->dev,
    754			   SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
    755			   THIS_MODULE, data_size, &card);
    756	if (ret < 0)
    757		return ret;
    758
    759	/* store basic data: */
    760	line6 = card->private_data;
    761	line6->card = card;
    762	line6->properties = properties;
    763	line6->usbdev = usbdev;
    764	line6->ifcdev = &interface->dev;
    765	INIT_DELAYED_WORK(&line6->startup_work, line6_startup_work);
    766
    767	strcpy(card->id, properties->id);
    768	strcpy(card->driver, driver_name);
    769	strcpy(card->shortname, properties->name);
    770	sprintf(card->longname, "Line 6 %s at USB %s", properties->name,
    771		dev_name(line6->ifcdev));
    772	card->private_free = line6_destruct;
    773
    774	usb_set_intfdata(interface, line6);
    775
    776	/* increment reference counters: */
    777	usb_get_dev(usbdev);
    778
    779	/* initialize device info: */
    780	dev_info(&interface->dev, "Line 6 %s found\n", properties->name);
    781
    782	/* query interface number */
    783	interface_number = interface->cur_altsetting->desc.bInterfaceNumber;
    784
    785	/* TODO reserves the bus bandwidth even without actual transfer */
    786	ret = usb_set_interface(usbdev, interface_number,
    787				properties->altsetting);
    788	if (ret < 0) {
    789		dev_err(&interface->dev, "set_interface failed\n");
    790		goto error;
    791	}
    792
    793	line6_get_usb_properties(line6);
    794
    795	if (properties->capabilities & LINE6_CAP_CONTROL) {
    796		ret = line6_init_cap_control(line6);
    797		if (ret < 0)
    798			goto error;
    799	}
    800
    801	/* initialize device data based on device: */
    802	ret = private_init(line6, id);
    803	if (ret < 0)
    804		goto error;
    805
    806	/* creation of additional special files should go here */
    807
    808	dev_info(&interface->dev, "Line 6 %s now attached\n",
    809		 properties->name);
    810
    811	return 0;
    812
    813 error:
    814	/* we can call disconnect callback here because no close-sync is
    815	 * needed yet at this point
    816	 */
    817	line6_disconnect(interface);
    818	return ret;
    819}
    820EXPORT_SYMBOL_GPL(line6_probe);
    821
    822/*
    823	Line 6 device disconnected.
    824*/
    825void line6_disconnect(struct usb_interface *interface)
    826{
    827	struct usb_line6 *line6 = usb_get_intfdata(interface);
    828	struct usb_device *usbdev = interface_to_usbdev(interface);
    829
    830	if (!line6)
    831		return;
    832
    833	if (WARN_ON(usbdev != line6->usbdev))
    834		return;
    835
    836	cancel_delayed_work_sync(&line6->startup_work);
    837
    838	if (line6->urb_listen != NULL)
    839		line6_stop_listen(line6);
    840
    841	snd_card_disconnect(line6->card);
    842	if (line6->line6pcm)
    843		line6_pcm_disconnect(line6->line6pcm);
    844	if (line6->disconnect)
    845		line6->disconnect(line6);
    846
    847	dev_info(&interface->dev, "Line 6 %s now disconnected\n",
    848		 line6->properties->name);
    849
    850	/* make sure the device isn't destructed twice: */
    851	usb_set_intfdata(interface, NULL);
    852
    853	snd_card_free_when_closed(line6->card);
    854}
    855EXPORT_SYMBOL_GPL(line6_disconnect);
    856
    857#ifdef CONFIG_PM
    858
    859/*
    860	Suspend Line 6 device.
    861*/
    862int line6_suspend(struct usb_interface *interface, pm_message_t message)
    863{
    864	struct usb_line6 *line6 = usb_get_intfdata(interface);
    865	struct snd_line6_pcm *line6pcm = line6->line6pcm;
    866
    867	snd_power_change_state(line6->card, SNDRV_CTL_POWER_D3hot);
    868
    869	if (line6->properties->capabilities & LINE6_CAP_CONTROL)
    870		line6_stop_listen(line6);
    871
    872	if (line6pcm != NULL)
    873		line6pcm->flags = 0;
    874
    875	return 0;
    876}
    877EXPORT_SYMBOL_GPL(line6_suspend);
    878
    879/*
    880	Resume Line 6 device.
    881*/
    882int line6_resume(struct usb_interface *interface)
    883{
    884	struct usb_line6 *line6 = usb_get_intfdata(interface);
    885
    886	if (line6->properties->capabilities & LINE6_CAP_CONTROL)
    887		line6_start_listen(line6);
    888
    889	snd_power_change_state(line6->card, SNDRV_CTL_POWER_D0);
    890	return 0;
    891}
    892EXPORT_SYMBOL_GPL(line6_resume);
    893
    894#endif /* CONFIG_PM */
    895
    896MODULE_AUTHOR(DRIVER_AUTHOR);
    897MODULE_DESCRIPTION(DRIVER_DESC);
    898MODULE_LICENSE("GPL");
    899