Unverified Commit 0eb5b59d authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!11859 char: xillybus: Check USB endpoints when probing device

parents bf249d29 de6814ef
Loading
Loading
Loading
Loading
+20 −2
Original line number Diff line number Diff line
@@ -1906,6 +1906,13 @@ static const struct file_operations xillyusb_fops = {

static int xillyusb_setup_base_eps(struct xillyusb_dev *xdev)
{
	struct usb_device *udev = xdev->udev;

	/* Verify that device has the two fundamental bulk in/out endpoints */
	if (usb_pipe_type_check(udev, usb_sndbulkpipe(udev, MSG_EP_NUM)) ||
	    usb_pipe_type_check(udev, usb_rcvbulkpipe(udev, IN_EP_NUM)))
		return -ENODEV;

	xdev->msg_ep = endpoint_alloc(xdev, MSG_EP_NUM | USB_DIR_OUT,
				      bulk_out_work, 1, 2);
	if (!xdev->msg_ep)
@@ -1935,14 +1942,15 @@ static int setup_channels(struct xillyusb_dev *xdev,
			  __le16 *chandesc,
			  int num_channels)
{
	struct xillyusb_channel *chan;
	struct usb_device *udev = xdev->udev;
	struct xillyusb_channel *chan, *new_channels;
	int i;

	chan = kcalloc(num_channels, sizeof(*chan), GFP_KERNEL);
	if (!chan)
		return -ENOMEM;

	xdev->channels = chan;
	new_channels = chan;

	for (i = 0; i < num_channels; i++, chan++) {
		unsigned int in_desc = le16_to_cpu(*chandesc++);
@@ -1971,6 +1979,15 @@ static int setup_channels(struct xillyusb_dev *xdev,
		 */

		if ((out_desc & 0x80) && i < 14) { /* Entry is valid */
			if (usb_pipe_type_check(udev,
						usb_sndbulkpipe(udev, i + 2))) {
				dev_err(xdev->dev,
					"Missing BULK OUT endpoint %d\n",
					i + 2);
				kfree(new_channels);
				return -ENODEV;
			}

			chan->writable = 1;
			chan->out_synchronous = !!(out_desc & 0x40);
			chan->out_seekable = !!(out_desc & 0x20);
@@ -1980,6 +1997,7 @@ static int setup_channels(struct xillyusb_dev *xdev,
		}
	}

	xdev->channels = new_channels;
	return 0;
}