drivers/media/usb/au0828/au0828-dvb.c

Source file repositories/reference/linux-study-clean/drivers/media/usb/au0828/au0828-dvb.c

File Facts

System
Linux kernel
Corpus path
drivers/media/usb/au0828/au0828-dvb.c
Extension
.c
Size
16554 bytes
Lines
686
Domain
Driver Families
Bucket
drivers/media
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (dev->urbs[i]) {
			usb_kill_urb(dev->urbs[i]);
			if (!preallocate_big_buffers)
				kfree(dev->urbs[i]->transfer_buffer);

			usb_free_urb(dev->urbs[i]);
		}
	}

	return 0;
}

static int start_urb_transfer(struct au0828_dev *dev)
{
	struct urb *purb;
	int i, ret;

	dprintk(2, "%s()\n", __func__);

	if (dev->urb_streaming) {
		dprintk(2, "%s: bulk xfer already running!\n", __func__);
		return 0;
	}

	for (i = 0; i < URB_COUNT; i++) {

		dev->urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
		if (!dev->urbs[i])
			return -ENOMEM;

		purb = dev->urbs[i];

		if (preallocate_big_buffers)
			purb->transfer_buffer = dev->dig_transfer_buffer[i];
		else
			purb->transfer_buffer = kzalloc(URB_BUFSIZE,
					GFP_KERNEL);

		if (!purb->transfer_buffer) {
			usb_free_urb(purb);
			dev->urbs[i] = NULL;
			ret = -ENOMEM;
			pr_err("%s: failed big buffer allocation, err = %d\n",
			       __func__, ret);
			return ret;
		}

		purb->status = -EINPROGRESS;
		usb_fill_bulk_urb(purb,
				  dev->usbdev,
				  usb_rcvbulkpipe(dev->usbdev,
					_AU0828_BULKPIPE),
				  purb->transfer_buffer,
				  URB_BUFSIZE,
				  urb_completion,
				  dev);

	}

	for (i = 0; i < URB_COUNT; i++) {
		ret = usb_submit_urb(dev->urbs[i], GFP_ATOMIC);
		if (ret != 0) {
			stop_urb_transfer(dev);
			pr_err("%s: failed urb submission, err = %d\n",
			       __func__, ret);
			return ret;
		}
	}

	dev->urb_streaming = true;

	/* If we don't valid data within 1 second, restart stream */
	mod_timer(&dev->bulk_timeout, jiffies + (HZ));
	dev->bulk_timeout_running = 1;

	return 0;
}

static void au0828_start_transport(struct au0828_dev *dev)
{
	au0828_write(dev, 0x608, 0x90);
	au0828_write(dev, 0x609, 0x72);
	au0828_write(dev, 0x60a, 0x71);
	au0828_write(dev, 0x60b, 0x01);

}

static void au0828_stop_transport(struct au0828_dev *dev, int full_stop)
{
	if (full_stop) {

Annotation

Implementation Notes