Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f8b8ab5b authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "usb: misc: mdm_data_bridge: add INT IN pipe support for DUN rx data path"

parents d0b18c57 eff1b336
Loading
Loading
Loading
Loading
+38 −10
Original line number Diff line number Diff line
@@ -95,6 +95,10 @@ struct data_bridge {
	unsigned int			bulk_out;
	int				err;

	/* Support INT IN instead of BULK IN */
	bool				use_int_in_pipe;
	unsigned int			period;

	/* keep track of in-flight URBs */
	struct usb_anchor		tx_active;
	struct usb_anchor		rx_active;
@@ -329,6 +333,11 @@ static int submit_rx_urb(struct data_bridge *dev, struct urb *rx_urb,
	info->dev = dev;
	info->created = created;

	if (dev->use_int_in_pipe)
		usb_fill_int_urb(rx_urb, dev->udev, dev->bulk_in,
				skb->data, RMNET_RX_BUFSIZE,
				data_bridge_read_cb, skb, dev->period);
	else
		usb_fill_bulk_urb(rx_urb, dev->udev, dev->bulk_in,
				skb->data, RMNET_RX_BUFSIZE,
				data_bridge_read_cb, skb);
@@ -694,8 +703,14 @@ static int data_bridge_probe(struct usb_interface *iface,
	dev->udev = interface_to_usbdev(iface);
	dev->intf = iface;

	if (dev->use_int_in_pipe)
		dev->bulk_in = usb_rcvintpipe(dev->udev,
			bulk_in->desc.bEndpointAddress &
			USB_ENDPOINT_NUMBER_MASK);
	else
		dev->bulk_in = usb_rcvbulkpipe(dev->udev,
		bulk_in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
			bulk_in->desc.bEndpointAddress &
			USB_ENDPOINT_NUMBER_MASK);

	dev->bulk_out = usb_sndbulkpipe(dev->udev,
		bulk_out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
@@ -949,6 +964,7 @@ bridge_probe(struct usb_interface *iface, const struct usb_device_id *id)
	struct usb_host_endpoint	*bulk_in = NULL;
	struct usb_host_endpoint	*bulk_out = NULL;
	struct usb_host_endpoint	*int_in = NULL;
	struct usb_host_endpoint	*data_int_in = NULL;
	struct usb_device		*udev;
	int				i;
	int				status = 0;
@@ -979,11 +995,15 @@ bridge_probe(struct usb_interface *iface, const struct usb_device_id *id)
			bulk_in = endpoint;
		else if (usb_endpoint_is_bulk_out(&endpoint->desc))
			bulk_out = endpoint;
		else if (usb_endpoint_is_int_in(&endpoint->desc))
		else if (usb_endpoint_is_int_in(&endpoint->desc)) {
			if (int_in != 0)
				data_int_in = endpoint;
			else
				int_in = endpoint;
		}
	}

	if (!bulk_in || !bulk_out || !int_in) {
	if ((!bulk_in && !data_int_in) || !bulk_out || !int_in) {
		dev_err(&iface->dev, "%s: invalid endpoints\n", __func__);
		status = -EINVAL;
		goto out;
@@ -995,9 +1015,14 @@ bridge_probe(struct usb_interface *iface, const struct usb_device_id *id)
				__func__);
		return -ENODEV;
	}

	if (data_int_in) {
		__dev[ch_id]->use_int_in_pipe = true;
		status = data_bridge_probe(iface, data_int_in, bulk_out,
				bname[BRIDGE_DATA_IDX], ch_id);
	} else {
		status = data_bridge_probe(iface, bulk_in, bulk_out,
			bname[BRIDGE_DATA_IDX], ch_id);
	}
	if (status < 0) {
		dev_err(&iface->dev, "data_bridge_probe failed %d\n", status);
		goto out;
@@ -1106,6 +1131,9 @@ static const struct usb_device_id bridge_ids[] = {
	{ USB_DEVICE_INTERFACE_NUMBER(0x5c6, 0x909E, 5),
	.driver_info = (unsigned long)serial_hsic_bridge_names,
	},
	{ USB_DEVICE_INTERFACE_NUMBER(0x5c6, 0x90A0, 3),
	.driver_info = (unsigned long)serial_hsic_bridge_names,
	},

	{ } /* Terminating entry */
};