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

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

Merge "usb: u_data_bridge: Check for USB cable connect with gbridge_port_write()"

parents 1e69b5a9 152c4661
Loading
Loading
Loading
Loading
+21 −7
Original line number Diff line number Diff line
@@ -508,6 +508,7 @@ ssize_t gbridge_port_write(struct file *file,
	struct usb_request *req;
	struct list_head *pool;
	unsigned xfer_size;
	struct usb_ep *in;

	port = file->private_data;
	if (!port) {
@@ -518,11 +519,19 @@ ssize_t gbridge_port_write(struct file *file,
	spin_lock_irqsave(&port->port_lock, flags);
	pr_debug("write on port(%p)\n", port);

	if (!port->is_connected || !port->port_usb) {
		spin_unlock_irqrestore(&port->port_lock, flags);
		pr_err("%s: cable is disconnected.\n", __func__);
		return -ENODEV;
	}

	if (list_empty(&port->write_pool)) {
		spin_unlock_irqrestore(&port->port_lock, flags);
		pr_debug("%s: Request list is empty.\n", __func__);
		return 0;
	}

	in = port->port_usb->in;
	pool = &port->write_pool;
	req = list_first_entry(pool, struct usb_request, list);
	list_del_init(&req->list);
@@ -540,13 +549,10 @@ ssize_t gbridge_port_write(struct file *file,
		ret = -EFAULT;
	} else {
		req->length = xfer_size;
		ret = usb_ep_queue(port->port_usb->in, req, GFP_KERNEL);
		ret = usb_ep_queue(in, req, GFP_KERNEL);
		if (ret) {
			pr_err("EP QUEUE failed:%d\n", ret);
			spin_lock_irqsave(&port->port_lock, flags);
			list_add(&req->list, &port->write_pool);
			ret = -EIO;
			spin_unlock_irqrestore(&port->port_lock, flags);
			goto err_exit;
		}
		spin_lock_irqsave(&port->port_lock, flags);
@@ -555,9 +561,17 @@ ssize_t gbridge_port_write(struct file *file,
	}

err_exit:
	if (ret)
		return ret;
	if (ret) {
		spin_lock_irqsave(&port->port_lock, flags);
		/* USB cable is connected, add it back otherwise free request */
		if (port->is_connected)
			list_add(&req->list, &port->write_pool);
		else
			gbridge_free_req(in, req);
		spin_unlock_irqrestore(&port->port_lock, flags);
		return ret;
	}

	return xfer_size;
}