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

Commit 7acdb926 authored by Alan Stern's avatar Alan Stern Committed by TARKZiM
Browse files

USB: simplify the interface of usb_get_status()



This patch simplifies the interface presented by usb_get_status().
Instead of forcing callers to check for the proper data length and
convert the status value to host byte order, the function will now
do these things itself.

Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Change-Id: I2695c4953029af802d21f9181ddcb5ad0373cf0b
parent 3fe4caec
Loading
Loading
Loading
Loading
+2 −8
Original line number Diff line number Diff line
@@ -1531,11 +1531,10 @@ static int hub_configure(struct usb_hub *hub,
	 * and battery-powered root hubs (may provide just 8 mA).
	 */
	ret = usb_get_status(hdev, USB_RECIP_DEVICE, 0, &hubstatus);
	if (ret < 2) {
	if (ret) {
		message = "can't get hub status";
		goto fail;
	}
	le16_to_cpus(&hubstatus);
	hcd = bus_to_hcd(hdev->bus);
	if (hdev == hdev->bus->root_hub) {
		if (hcd->power_budget > 0)
@@ -3272,8 +3271,6 @@ static int finish_port_resume(struct usb_device *udev)
	if (status == 0) {
		devstatus = 0;
		status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus);
		if (status >= 0)
			status = (status > 0 ? 0 : -ENODEV);

		/* If a normal resume failed, try doing a reset-resume */
		if (status && !udev->reset_resume && udev->persist_enabled) {
@@ -3294,7 +3291,6 @@ static int finish_port_resume(struct usb_device *udev)
	 */
	} else if (udev->actconfig && !udev->reset_resume) {
		if (!hub_is_superspeed(udev->parent)) {
			le16_to_cpus(&devstatus);
			if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP))
				status = usb_control_msg(udev,
						usb_sndctrlpipe(udev, 0),
@@ -3306,7 +3302,6 @@ static int finish_port_resume(struct usb_device *udev)
		} else {
			status = usb_get_status(udev, USB_RECIP_INTERFACE, 0,
					&devstatus);
			le16_to_cpus(&devstatus);
			if (!status && devstatus & (USB_INTRF_STAT_FUNC_RW_CAP
					| USB_INTRF_STAT_FUNC_RW))
				status =
@@ -4734,11 +4729,10 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,

			status = usb_get_status(udev, USB_RECIP_DEVICE, 0,
					&devstat);
			if (status < 2) {
			if (status) {
				dev_dbg(&udev->dev, "get status %d ?\n", status);
				goto loop_disable;
			}
			le16_to_cpus(&devstat);
			if ((devstat & (1 << USB_DEVICE_SELF_POWERED)) == 0) {
				dev_err(&udev->dev,
					"can't connect bus-powered hub "
+9 −4
Original line number Diff line number Diff line
@@ -939,13 +939,13 @@ int usb_get_device_descriptor(struct usb_device *dev, unsigned int size)
 *
 * This call is synchronous, and may not be used in an interrupt context.
 *
 * Returns the number of bytes received on success, or else the status code
 * returned by the underlying usb_control_msg() call.
 * Returns 0 and the status value in *@data (in host byte order) on success,
 * or else the status code from the underlying usb_control_msg() call.
 */
int usb_get_status(struct usb_device *dev, int type, int target, void *data)
{
	int ret;
	u16 *status = kmalloc(sizeof(*status), GFP_KERNEL);
	__le16 *status = kmalloc(sizeof(*status), GFP_KERNEL);

	if (!status)
		return -ENOMEM;
@@ -954,7 +954,12 @@ int usb_get_status(struct usb_device *dev, int type, int target, void *data)
		USB_REQ_GET_STATUS, USB_DIR_IN | type, 0, target, status,
		sizeof(*status), USB_CTRL_GET_TIMEOUT);

	*(u16 *)data = *status;
	if (ret == 2) {
		*(u16 *) data = le16_to_cpu(*status);
		ret = 0;
	} else if (ret >= 0) {
		ret = -EIO;
	}
	kfree(status);
	return ret;
}
+4 −5
Original line number Diff line number Diff line
@@ -769,9 +769,9 @@ static int ch9_postconfig(struct usbtest_dev *dev)

	/* [9.4.5] get_status always works */
	retval = usb_get_status(udev, USB_RECIP_DEVICE, 0, dev->buf);
	if (retval != 2) {
	if (retval) {
		dev_err(&iface->dev, "get dev status --> %d\n", retval);
		return (retval < 0) ? retval : -EDOM;
		return retval;
	}

	/* FIXME configuration.bmAttributes says if we could try to set/clear
@@ -780,9 +780,9 @@ static int ch9_postconfig(struct usbtest_dev *dev)

	retval = usb_get_status(udev, USB_RECIP_INTERFACE,
			iface->altsetting[0].desc.bInterfaceNumber, dev->buf);
	if (retval != 2) {
	if (retval) {
		dev_err(&iface->dev, "get interface status --> %d\n", retval);
		return (retval < 0) ? retval : -EDOM;
		return retval;
	}
	/* FIXME get status for each endpoint in the interface */

@@ -1383,7 +1383,6 @@ static int verify_halted(struct usbtest_dev *tdev, int ep, struct urb *urb)
				ep, retval);
		return retval;
	}
	le16_to_cpus(&status);
	if (status != 1) {
		ERROR(tdev, "ep %02x bogus status: %04x != 1\n", ep, status);
		return -EINVAL;