Commit 91398f98 authored by Simon Glass's avatar Simon Glass
Browse files

dm: usb: Split out more code from usb_new_device()



Move the code that sets up the device with a new address into its own
function, usb_prepare_device().
Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
Reviewed-by: default avatarMarek Vasut <marex@denx.de>
parent 128fcac0
......@@ -980,19 +980,10 @@ static int usb_setup_descriptor(struct usb_device *dev, bool do_read)
return 0;
}
/*
* By the time we get here, the device has gotten a new device ID
* and is in the default state. We need to identify the thing and
* get the ball rolling..
*
* Returns 0 for success, != 0 for error.
*/
int usb_new_device(struct usb_device *dev)
static int usb_prepare_device(struct usb_device *dev, int addr, bool do_read,
struct usb_device *parent, int portnr)
{
bool do_read = true;
int addr, err;
int tmp;
ALLOC_CACHE_ALIGN_BUFFER(unsigned char, tmpbuf, USB_BUFSIZ);
int err;
/*
* Allocate usb 3.0 device context.
......@@ -1000,28 +991,15 @@ int usb_new_device(struct usb_device *dev)
* and related data structures first. This call does that.
* Refer to sec 4.3.2 in xHCI spec rev1.0
*/
if (usb_alloc_device(dev)) {
err = usb_alloc_device(dev);
if (err) {
printf("Cannot allocate device context to get SLOT_ID\n");
return -1;
return err;
}
/* We still haven't set the Address yet */
addr = dev->devnum;
dev->devnum = 0;
/*
* XHCI needs to issue a Address device command to setup
* proper device context structures, before it can interact
* with the device. So a get_descriptor will fail before any
* of that is done for XHCI unlike EHCI.
*/
#ifdef CONFIG_USB_XHCI
do_read = false;
#endif
err = usb_setup_descriptor(dev, do_read);
if (err)
return err;
err = usb_legacy_port_reset(dev->parent, dev->portnr);
err = usb_legacy_port_reset(parent, portnr);
if (err)
return err;
......@@ -1032,11 +1010,45 @@ int usb_new_device(struct usb_device *dev)
if (err < 0) {
printf("\n USB device not accepting new address " \
"(error=%lX)\n", dev->status);
return -EIO;
return err;
}
mdelay(10); /* Let the SET_ADDRESS settle */
return 0;
}
/*
* By the time we get here, the device has gotten a new device ID
* and is in the default state. We need to identify the thing and
* get the ball rolling..
*
* Returns 0 for success, != 0 for error.
*/
int usb_new_device(struct usb_device *dev)
{
bool do_read = true;
int addr, err;
int tmp, ret;
ALLOC_CACHE_ALIGN_BUFFER(unsigned char, tmpbuf, USB_BUFSIZ);
/* We still haven't set the Address yet */
addr = dev->devnum;
dev->devnum = 0;
/*
* XHCI needs to issue a Address device command to setup
* proper device context structures, before it can interact
* with the device. So a get_descriptor will fail before any
* of that is done for XHCI unlike EHCI.
*/
#ifdef CONFIG_USB_XHCI
do_read = false;
#endif
ret = usb_prepare_device(dev, addr, do_read, dev->parent, dev->portnr);
if (ret)
return ret;
tmp = sizeof(dev->descriptor);
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment