usb.c 33.8 KB
Newer Older
W
wdenk 已提交
1 2
/*
 * Most of this source has been derived from the Linux USB
3 4 5 6 7 8 9 10 11 12 13 14 15
 * project:
 * (C) Copyright Linus Torvalds 1999
 * (C) Copyright Johannes Erdfelt 1999-2001
 * (C) Copyright Andreas Gal 1999
 * (C) Copyright Gregory P. Smith 1999
 * (C) Copyright Deti Fliegl 1999 (new USB architecture)
 * (C) Copyright Randy Dunlap 2000
 * (C) Copyright David Brownell 2000 (kernel hotplug, usb_device_id)
 * (C) Copyright Yggdrasil Computing, Inc. 2000
 *     (usb_device_id matching changes by Adam J. Richter)
 *
 * Adapted for U-Boot:
 * (C) Copyright 2001 Denis Peter, MPL AG Switzerland
W
wdenk 已提交
16
 *
17
 * SPDX-License-Identifier:	GPL-2.0+
W
wdenk 已提交
18 19 20 21 22 23 24 25 26 27 28 29 30
 */

/*
 * How it works:
 *
 * Since this is a bootloader, the devices will not be automatic
 * (re)configured on hotplug, but after a restart of the USB the
 * device should work.
 *
 * For each transfer (except "Interrupt") we wait for completion.
 */
#include <common.h>
#include <command.h>
31
#include <dm.h>
32
#include <memalign.h>
W
wdenk 已提交
33
#include <asm/processor.h>
M
Mike Frysinger 已提交
34
#include <linux/compiler.h>
35
#include <linux/ctype.h>
36
#include <asm/byteorder.h>
37
#include <asm/unaligned.h>
38
#include <errno.h>
W
wdenk 已提交
39 40
#include <usb.h>
#ifdef CONFIG_4xx
41
#include <asm/4xx_pci.h>
W
wdenk 已提交
42 43
#endif

W
wdenk 已提交
44 45
#define USB_BUFSIZ	512

W
wdenk 已提交
46
static int asynch_allowed;
47 48
char usb_started; /* flag for the started/stopped USB status */

49 50 51 52
#ifndef CONFIG_DM_USB
static struct usb_device usb_dev[USB_MAX_DEVICE];
static int dev_index;

53 54 55
#ifndef CONFIG_USB_MAX_CONTROLLER_COUNT
#define CONFIG_USB_MAX_CONTROLLER_COUNT 1
#endif
W
wdenk 已提交
56 57 58 59 60 61

/***************************************************************************
 * Init USB Device
 */
int usb_init(void)
{
62 63 64
	void *ctrl;
	struct usb_device *dev;
	int i, start_index = 0;
65
	int controllers_initialized = 0;
66
	int ret;
W
wdenk 已提交
67

68 69
	dev_index = 0;
	asynch_allowed = 1;
W
wdenk 已提交
70
	usb_hub_reset();
71 72 73 74 75 76 77

	/* first make all devices unknown */
	for (i = 0; i < USB_MAX_DEVICE; i++) {
		memset(&usb_dev[i], 0, sizeof(struct usb_device));
		usb_dev[i].devnum = -1;
	}

W
wdenk 已提交
78
	/* init low_level USB */
79 80 81
	for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
		/* init low_level USB */
		printf("USB%d:   ", i);
82 83 84
		ret = usb_lowlevel_init(i, USB_INIT_HOST, &ctrl);
		if (ret == -ENODEV) {	/* No such device. */
			puts("Port not available.\n");
85
			controllers_initialized++;
86 87 88 89
			continue;
		}

		if (ret) {		/* Other error. */
90 91 92 93 94 95 96
			puts("lowlevel init failed\n");
			continue;
		}
		/*
		 * lowlevel init is OK, now scan the bus for devices
		 * i.e. search HUBs and configure them
		 */
97
		controllers_initialized++;
98 99
		start_index = dev_index;
		printf("scanning bus %d for devices... ", i);
100 101
		ret = usb_alloc_new_device(ctrl, &dev);
		if (ret)
102 103
			break;

104 105 106 107
		/*
		 * device 0 is always present
		 * (root hub, so let it analyze)
		 */
108 109
		ret = usb_new_device(dev);
		if (ret)
110
			usb_free_device(dev->controller);
111

112
		if (start_index == dev_index) {
113
			puts("No USB Device found\n");
114 115
			continue;
		} else {
116 117
			printf("%d USB Device(s) found\n",
				dev_index - start_index);
118
		}
119

120
		usb_started = 1;
121 122
	}

123
	debug("scan end\n");
124
	/* if we were not able to find at least one working bus, bail out */
125
	if (controllers_initialized == 0)
126 127
		puts("USB error: all controllers failed lowlevel init\n");

128
	return usb_started ? 0 : -ENODEV;
W
wdenk 已提交
129 130 131 132 133 134 135
}

/******************************************************************************
 * Stop USB this stops the LowLevel Part and deregisters USB devices.
 */
int usb_stop(void)
{
136
	int i;
137 138 139 140 141

	if (usb_started) {
		asynch_allowed = 1;
		usb_started = 0;
		usb_hub_reset();
142 143 144 145 146

		for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
			if (usb_lowlevel_stop(i))
				printf("failed to stop USB controller %d\n", i);
		}
147
	}
148 149

	return 0;
W
wdenk 已提交
150 151
}

152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
/******************************************************************************
 * Detect if a USB device has been plugged or unplugged.
 */
int usb_detect_change(void)
{
	int i, j;
	int change = 0;

	for (j = 0; j < USB_MAX_DEVICE; j++) {
		for (i = 0; i < usb_dev[j].maxchild; i++) {
			struct usb_port_status status;

			if (usb_get_port_status(&usb_dev[j], i + 1,
						&status) < 0)
				/* USB request failed */
				continue;

			if (le16_to_cpu(status.wPortChange) &
			    USB_PORT_STAT_C_CONNECTION)
				change++;
		}
	}

	return change;
}

W
wdenk 已提交
178 179 180
/*
 * disables the asynch behaviour of the control message. This is used for data
 * transfers that uses the exclusiv access to the control and bulk messages.
181
 * Returns the old value so it can be restored later.
W
wdenk 已提交
182
 */
183
int usb_disable_asynch(int disable)
W
wdenk 已提交
184
{
185 186
	int old_value = asynch_allowed;

187
	asynch_allowed = !disable;
188
	return old_value;
W
wdenk 已提交
189
}
190
#endif /* !CONFIG_DM_USB */
W
wdenk 已提交
191 192 193 194 195 196 197 198 199 200 201


/*-------------------------------------------------------------------
 * Message wrappers.
 *
 */

/*
 * submits an Interrupt Message
 */
int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
202
			void *buffer, int transfer_len, int interval)
W
wdenk 已提交
203
{
204
	return submit_int_msg(dev, pipe, buffer, transfer_len, interval);
W
wdenk 已提交
205 206 207 208 209 210 211 212
}

/*
 * submits a control message and waits for comletion (at least timeout * 1ms)
 * If timeout is 0, we don't wait for completion (used as example to set and
 * clear keyboards LEDs). For data transfers, (storage transfers) we don't
 * allow control messages with 0 timeout, by previousely resetting the flag
 * asynch_allowed (usb_disable_asynch(1)).
213
 * returns the transferred length if OK or -1 if error. The transferred length
W
wdenk 已提交
214 215 216 217 218 219 220
 * and the current status are stored in the dev->act_len and dev->status.
 */
int usb_control_msg(struct usb_device *dev, unsigned int pipe,
			unsigned char request, unsigned char requesttype,
			unsigned short value, unsigned short index,
			void *data, unsigned short size, int timeout)
{
P
Puneet Saxena 已提交
221
	ALLOC_CACHE_ALIGN_BUFFER(struct devrequest, setup_packet, 1);
222
	int err;
223

224 225
	if ((timeout == 0) && (!asynch_allowed)) {
		/* request for a asynch control pipe is not allowed */
226
		return -EINVAL;
227
	}
228

W
wdenk 已提交
229
	/* set setup command */
P
Puneet Saxena 已提交
230 231 232 233 234
	setup_packet->requesttype = requesttype;
	setup_packet->request = request;
	setup_packet->value = cpu_to_le16(value);
	setup_packet->index = cpu_to_le16(index);
	setup_packet->length = cpu_to_le16(size);
235 236 237
	debug("usb_control_msg: request: 0x%X, requesttype: 0x%X, " \
	      "value 0x%X index 0x%X length 0x%X\n",
	      request, requesttype, value, index, size);
238
	dev->status = USB_ST_NOT_PROC; /*not yet processed */
W
wdenk 已提交
239

240 241 242
	err = submit_control_msg(dev, pipe, data, size, setup_packet);
	if (err < 0)
		return err;
243
	if (timeout == 0)
W
wdenk 已提交
244
		return (int)size;
245

246 247 248 249 250 251 252 253
	/*
	 * Wait for status to update until timeout expires, USB driver
	 * interrupt handler may set the status when the USB operation has
	 * been completed.
	 */
	while (timeout--) {
		if (!((volatile unsigned long)dev->status & USB_ST_NOT_PROC))
			break;
254
		mdelay(1);
R
Remy Bohmer 已提交
255
	}
256 257
	if (dev->status)
		return -1;
R
Remy Bohmer 已提交
258 259

	return dev->act_len;
260

W
wdenk 已提交
261 262 263 264
}

/*-------------------------------------------------------------------
 * submits bulk message, and waits for completion. returns 0 if Ok or
265
 * negative if Error.
W
wdenk 已提交
266 267 268 269 270 271
 * synchronous behavior
 */
int usb_bulk_msg(struct usb_device *dev, unsigned int pipe,
			void *data, int len, int *actual_length, int timeout)
{
	if (len < 0)
272
		return -EINVAL;
273
	dev->status = USB_ST_NOT_PROC; /*not yet processed */
274
	if (submit_bulk_msg(dev, pipe, data, len) < 0)
275
		return -EIO;
276 277
	while (timeout--) {
		if (!((volatile unsigned long)dev->status & USB_ST_NOT_PROC))
W
wdenk 已提交
278
			break;
279
		mdelay(1);
W
wdenk 已提交
280
	}
281 282
	*actual_length = dev->act_len;
	if (dev->status == 0)
W
wdenk 已提交
283 284
		return 0;
	else
285
		return -EIO;
W
wdenk 已提交
286 287 288 289 290 291 292 293 294 295 296
}


/*-------------------------------------------------------------------
 * Max Packet stuff
 */

/*
 * returns the max packet size, depending on the pipe direction and
 * the configurations values
 */
297
int usb_maxpacket(struct usb_device *dev, unsigned long pipe)
W
wdenk 已提交
298
{
299 300
	/* direction is out -> use emaxpacket out */
	if ((pipe & USB_DIR_IN) == 0)
301
		return dev->epmaxpacketout[((pipe>>15) & 0xf)];
W
wdenk 已提交
302
	else
303
		return dev->epmaxpacketin[((pipe>>15) & 0xf)];
W
wdenk 已提交
304 305
}

M
Marek Vasut 已提交
306 307
/*
 * The routine usb_set_maxpacket_ep() is extracted from the loop of routine
308 309 310 311 312 313
 * usb_set_maxpacket(), because the optimizer of GCC 4.x chokes on this routine
 * when it is inlined in 1 single routine. What happens is that the register r3
 * is used as loop-count 'i', but gets overwritten later on.
 * This is clearly a compiler bug, but it is easier to workaround it here than
 * to update the compiler (Occurs with at least several GCC 4.{1,2},x
 * CodeSourcery compilers like e.g. 2007q3, 2008q1, 2008q3 lite editions on ARM)
M
Marek Vasut 已提交
314 315
 *
 * NOTE: Similar behaviour was observed with GCC4.6 on ARMv5.
316
 */
M
Mike Frysinger 已提交
317
static void noinline
M
Marek Vasut 已提交
318
usb_set_maxpacket_ep(struct usb_device *dev, int if_idx, int ep_idx)
319 320
{
	int b;
M
Marek Vasut 已提交
321
	struct usb_endpoint_descriptor *ep;
322
	u16 ep_wMaxPacketSize;
M
Marek Vasut 已提交
323 324

	ep = &dev->config.if_desc[if_idx].ep_desc[ep_idx];
325 326

	b = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
327
	ep_wMaxPacketSize = get_unaligned(&ep->wMaxPacketSize);
328 329 330 331

	if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
						USB_ENDPOINT_XFER_CONTROL) {
		/* Control => bidirectional */
332 333
		dev->epmaxpacketout[b] = ep_wMaxPacketSize;
		dev->epmaxpacketin[b] = ep_wMaxPacketSize;
334 335
		debug("##Control EP epmaxpacketout/in[%d] = %d\n",
		      b, dev->epmaxpacketin[b]);
336 337 338
	} else {
		if ((ep->bEndpointAddress & 0x80) == 0) {
			/* OUT Endpoint */
339 340
			if (ep_wMaxPacketSize > dev->epmaxpacketout[b]) {
				dev->epmaxpacketout[b] = ep_wMaxPacketSize;
341 342
				debug("##EP epmaxpacketout[%d] = %d\n",
				      b, dev->epmaxpacketout[b]);
343 344 345
			}
		} else {
			/* IN Endpoint */
346 347
			if (ep_wMaxPacketSize > dev->epmaxpacketin[b]) {
				dev->epmaxpacketin[b] = ep_wMaxPacketSize;
348 349
				debug("##EP epmaxpacketin[%d] = %d\n",
				      b, dev->epmaxpacketin[b]);
350 351 352 353 354
			}
		} /* if out */
	} /* if control */
}

W
wdenk 已提交
355 356 357
/*
 * set the max packed value of all endpoints in the given configuration
 */
M
Marek Vasut 已提交
358
static int usb_set_maxpacket(struct usb_device *dev)
W
wdenk 已提交
359
{
360
	int i, ii;
W
wdenk 已提交
361

T
Tom Rix 已提交
362 363
	for (i = 0; i < dev->config.desc.bNumInterfaces; i++)
		for (ii = 0; ii < dev->config.if_desc[i].desc.bNumEndpoints; ii++)
M
Marek Vasut 已提交
364
			usb_set_maxpacket_ep(dev, i, ii);
W
wdenk 已提交
365 366 367 368 369 370 371

	return 0;
}

/*******************************************************************************
 * Parse the config, located in buffer, and fills the dev->config structure.
 * Note that all little/big endian swapping are done automatically.
372
 * (wTotalLength has already been swapped and sanitized when it was read.)
W
wdenk 已提交
373
 */
M
Marek Vasut 已提交
374 375
static int usb_parse_config(struct usb_device *dev,
			unsigned char *buffer, int cfgno)
W
wdenk 已提交
376 377
{
	struct usb_descriptor_header *head;
378
	int index, ifno, epno, curr_if_num;
379
	u16 ep_wMaxPacketSize;
380
	struct usb_interface *if_desc = NULL;
381 382 383 384 385 386 387

	ifno = -1;
	epno = -1;
	curr_if_num = -1;

	dev->configno = cfgno;
	head = (struct usb_descriptor_header *) &buffer[0];
388 389 390
	if (head->bDescriptorType != USB_DT_CONFIG) {
		printf(" ERROR: NOT USB_CONFIG_DESC %x\n",
			head->bDescriptorType);
391
		return -EINVAL;
W
wdenk 已提交
392
	}
393 394
	if (head->bLength != USB_DT_CONFIG_SIZE) {
		printf("ERROR: Invalid USB CFG length (%d)\n", head->bLength);
395
		return -EINVAL;
396 397
	}
	memcpy(&dev->config, head, USB_DT_CONFIG_SIZE);
398
	dev->config.no_of_if = 0;
W
wdenk 已提交
399

T
Tom Rix 已提交
400
	index = dev->config.desc.bLength;
401 402
	/* Ok the first entry must be a configuration entry,
	 * now process the others */
403
	head = (struct usb_descriptor_header *) &buffer[index];
404
	while (index + 1 < dev->config.desc.wTotalLength && head->bLength) {
405 406
		switch (head->bDescriptorType) {
		case USB_DT_INTERFACE:
407 408 409 410 411 412 413 414 415 416
			if (head->bLength != USB_DT_INTERFACE_SIZE) {
				printf("ERROR: Invalid USB IF length (%d)\n",
					head->bLength);
				break;
			}
			if (index + USB_DT_INTERFACE_SIZE >
			    dev->config.desc.wTotalLength) {
				puts("USB IF descriptor overflowed buffer!\n");
				break;
			}
417
			if (((struct usb_interface_descriptor *) \
418
			     head)->bInterfaceNumber != curr_if_num) {
419 420
				/* this is a new interface, copy new desc */
				ifno = dev->config.no_of_if;
421 422 423
				if (ifno >= USB_MAXINTERFACES) {
					puts("Too many USB interfaces!\n");
					/* try to go on with what we have */
424
					return -EINVAL;
425
				}
426
				if_desc = &dev->config.if_desc[ifno];
427
				dev->config.no_of_if++;
428 429
				memcpy(if_desc, head,
					USB_DT_INTERFACE_SIZE);
430 431
				if_desc->no_of_ep = 0;
				if_desc->num_altsetting = 1;
432
				curr_if_num =
433
				     if_desc->desc.bInterfaceNumber;
434 435
			} else {
				/* found alternate setting for the interface */
436 437 438 439
				if (ifno >= 0) {
					if_desc = &dev->config.if_desc[ifno];
					if_desc->num_altsetting++;
				}
440 441 442
			}
			break;
		case USB_DT_ENDPOINT:
443 444 445 446 447 448 449 450 451 452 453 454 455 456
			if (head->bLength != USB_DT_ENDPOINT_SIZE) {
				printf("ERROR: Invalid USB EP length (%d)\n",
					head->bLength);
				break;
			}
			if (index + USB_DT_ENDPOINT_SIZE >
			    dev->config.desc.wTotalLength) {
				puts("USB EP descriptor overflowed buffer!\n");
				break;
			}
			if (ifno < 0) {
				puts("Endpoint descriptor out of order!\n");
				break;
			}
457
			epno = dev->config.if_desc[ifno].no_of_ep;
458
			if_desc = &dev->config.if_desc[ifno];
P
Peng Fan 已提交
459
			if (epno >= USB_MAXENDPOINTS) {
460 461
				printf("Interface %d has too many endpoints!\n",
					if_desc->desc.bInterfaceNumber);
462
				return -EINVAL;
463
			}
464
			/* found an endpoint */
465
			if_desc->no_of_ep++;
466 467
			memcpy(&if_desc->ep_desc[epno], head,
				USB_DT_ENDPOINT_SIZE);
468 469 470 471 472 473 474 475 476
			ep_wMaxPacketSize = get_unaligned(&dev->config.\
							if_desc[ifno].\
							ep_desc[epno].\
							wMaxPacketSize);
			put_unaligned(le16_to_cpu(ep_wMaxPacketSize),
					&dev->config.\
					if_desc[ifno].\
					ep_desc[epno].\
					wMaxPacketSize);
477
			debug("if %d, ep %d\n", ifno, epno);
478
			break;
479
		case USB_DT_SS_ENDPOINT_COMP:
480 481 482 483 484 485 486 487 488 489 490 491 492 493
			if (head->bLength != USB_DT_SS_EP_COMP_SIZE) {
				printf("ERROR: Invalid USB EPC length (%d)\n",
					head->bLength);
				break;
			}
			if (index + USB_DT_SS_EP_COMP_SIZE >
			    dev->config.desc.wTotalLength) {
				puts("USB EPC descriptor overflowed buffer!\n");
				break;
			}
			if (ifno < 0 || epno < 0) {
				puts("EPC descriptor out of order!\n");
				break;
			}
494
			if_desc = &dev->config.if_desc[ifno];
495 496
			memcpy(&if_desc->ss_ep_comp_desc[epno], head,
				USB_DT_SS_EP_COMP_SIZE);
497
			break;
498 499
		default:
			if (head->bLength == 0)
500
				return -EINVAL;
501

502 503
			debug("unknown Description Type : %x\n",
			      head->bDescriptorType);
504

505
#ifdef DEBUG
506
			{
507
				unsigned char *ch = (unsigned char *)head;
508 509
				int i;

510
				for (i = 0; i < head->bLength; i++)
511 512
					debug("%02X ", *ch++);
				debug("\n\n\n");
513
			}
514
#endif
515
			break;
W
wdenk 已提交
516
		}
517 518
		index += head->bLength;
		head = (struct usb_descriptor_header *)&buffer[index];
W
wdenk 已提交
519
	}
520
	return 0;
W
wdenk 已提交
521 522 523 524 525 526 527 528 529 530
}

/***********************************************************************
 * Clears an endpoint
 * endp: endpoint number in bits 0-3;
 * direction flag in bit 7 (1 = IN, 0 = OUT)
 */
int usb_clear_halt(struct usb_device *dev, int pipe)
{
	int result;
531
	int endp = usb_pipeendpoint(pipe)|(usb_pipein(pipe)<<7);
W
wdenk 已提交
532 533

	result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
534 535
				 USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0,
				 endp, NULL, 0, USB_CNTL_TIMEOUT * 3);
W
wdenk 已提交
536 537 538 539

	/* don't clear if failed */
	if (result < 0)
		return result;
540

W
Wolfgang Denk 已提交
541
	/*
542 543 544 545
	 * NOTE: we do not get status and verify reset was successful
	 * as some devices are reported to lock up upon this check..
	 */

W
wdenk 已提交
546
	usb_endpoint_running(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe));
547

W
wdenk 已提交
548 549 550 551 552 553 554 555 556
	/* toggle is reset on clear */
	usb_settoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe), 0);
	return 0;
}


/**********************************************************************
 * get_descriptor type
 */
M
Marek Vasut 已提交
557
static int usb_get_descriptor(struct usb_device *dev, unsigned char type,
558
			unsigned char index, void *buf, int size)
W
wdenk 已提交
559 560
{
	int res;
W
Wolfgang Denk 已提交
561
	res = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
W
wdenk 已提交
562 563 564 565 566 567 568
			USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
			(type << 8) + index, 0,
			buf, size, USB_CNTL_TIMEOUT);
	return res;
}

/**********************************************************************
569
 * gets len of configuration cfgno
W
wdenk 已提交
570
 */
571
int usb_get_configuration_len(struct usb_device *dev, int cfgno)
W
wdenk 已提交
572
{
W
Wolfgang Denk 已提交
573
	int result;
574
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, 9);
575
	struct usb_config_descriptor *config;
W
wdenk 已提交
576

577
	config = (struct usb_config_descriptor *)&buffer[0];
R
Remy Bohmer 已提交
578 579
	result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 9);
	if (result < 9) {
W
wdenk 已提交
580
		if (result < 0)
581 582
			printf("unable to get descriptor, error %lX\n",
				dev->status);
W
wdenk 已提交
583
		else
584
			printf("config descriptor too short " \
R
Remy Bohmer 已提交
585
				"(expected %i, got %i)\n", 9, result);
586
		return -EIO;
W
wdenk 已提交
587
	}
588 589
	return le16_to_cpu(config->wTotalLength);
}
W
wdenk 已提交
590

591 592 593 594 595 596 597 598
/**********************************************************************
 * gets configuration cfgno and store it in the buffer
 */
int usb_get_configuration_no(struct usb_device *dev, int cfgno,
			     unsigned char *buffer, int length)
{
	int result;
	struct usb_config_descriptor *config;
W
wdenk 已提交
599

600
	config = (struct usb_config_descriptor *)&buffer[0];
601
	result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, length);
602 603 604
	debug("get_conf_no %d Result %d, wLength %d\n", cfgno, result,
	      le16_to_cpu(config->wTotalLength));
	config->wTotalLength = result; /* validated, with CPU byte order */
605

W
wdenk 已提交
606 607 608 609 610 611 612
	return result;
}

/********************************************************************
 * set address of a device to the value in dev->devnum.
 * This can only be done by addressing the device via the default address (0)
 */
M
Marek Vasut 已提交
613
static int usb_set_address(struct usb_device *dev)
W
wdenk 已提交
614 615 616
{
	int res;

617
	debug("set address %d\n", dev->devnum);
618 619 620 621
	res = usb_control_msg(dev, usb_snddefctrl(dev),
				USB_REQ_SET_ADDRESS, 0,
				(dev->devnum), 0,
				NULL, 0, USB_CNTL_TIMEOUT);
W
wdenk 已提交
622 623 624 625 626 627 628 629
	return res;
}

/********************************************************************
 * set interface number to interface
 */
int usb_set_interface(struct usb_device *dev, int interface, int alternate)
{
T
Tom Rix 已提交
630
	struct usb_interface *if_face = NULL;
W
wdenk 已提交
631 632
	int ret, i;

T
Tom Rix 已提交
633 634
	for (i = 0; i < dev->config.desc.bNumInterfaces; i++) {
		if (dev->config.if_desc[i].desc.bInterfaceNumber == interface) {
W
wdenk 已提交
635 636 637 638 639 640
			if_face = &dev->config.if_desc[i];
			break;
		}
	}
	if (!if_face) {
		printf("selecting invalid interface %d", interface);
641
		return -EINVAL;
W
wdenk 已提交
642
	}
643 644
	/*
	 * We should return now for devices with only one alternate setting.
645 646 647 648
	 * According to 9.4.10 of the Universal Serial Bus Specification
	 * Revision 2.0 such devices can return with a STALL. This results in
	 * some USB sticks timeouting during initialization and then being
	 * unusable in U-Boot.
649 650 651
	 */
	if (if_face->num_altsetting == 1)
		return 0;
W
wdenk 已提交
652

653 654 655 656 657
	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
				USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE,
				alternate, interface, NULL, 0,
				USB_CNTL_TIMEOUT * 5);
	if (ret < 0)
W
wdenk 已提交
658 659 660 661 662 663 664 665
		return ret;

	return 0;
}

/********************************************************************
 * set configuration number to configuration
 */
M
Marek Vasut 已提交
666
static int usb_set_configuration(struct usb_device *dev, int configuration)
W
wdenk 已提交
667 668
{
	int res;
669
	debug("set configuration %d\n", configuration);
W
wdenk 已提交
670
	/* set setup command */
671 672 673 674 675
	res = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
				USB_REQ_SET_CONFIGURATION, 0,
				configuration, 0,
				NULL, 0, USB_CNTL_TIMEOUT);
	if (res == 0) {
W
wdenk 已提交
676 677 678
		dev->toggle[0] = 0;
		dev->toggle[1] = 0;
		return 0;
679
	} else
680
		return -EIO;
W
wdenk 已提交
681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705
}

/********************************************************************
 * set protocol to protocol
 */
int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol)
{
	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
		USB_REQ_SET_PROTOCOL, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
		protocol, ifnum, NULL, 0, USB_CNTL_TIMEOUT);
}

/********************************************************************
 * set idle
 */
int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id)
{
	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
		USB_REQ_SET_IDLE, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
		(duration << 8) | report_id, ifnum, NULL, 0, USB_CNTL_TIMEOUT);
}

/********************************************************************
 * get report
 */
706 707
int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type,
		   unsigned char id, void *buf, int size)
W
wdenk 已提交
708 709
{
	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
710 711 712
			USB_REQ_GET_REPORT,
			USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
			(type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
W
wdenk 已提交
713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728
}

/********************************************************************
 * get class descriptor
 */
int usb_get_class_descriptor(struct usb_device *dev, int ifnum,
		unsigned char type, unsigned char id, void *buf, int size)
{
	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
		USB_REQ_GET_DESCRIPTOR, USB_RECIP_INTERFACE | USB_DIR_IN,
		(type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
}

/********************************************************************
 * get string index in buffer
 */
M
Marek Vasut 已提交
729
static int usb_get_string(struct usb_device *dev, unsigned short langid,
730
		   unsigned char index, void *buf, int size)
W
wdenk 已提交
731
{
732 733 734 735 736 737 738
	int i;
	int result;

	for (i = 0; i < 3; ++i) {
		/* some devices are flaky */
		result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
			USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
W
Wolfgang Denk 已提交
739
			(USB_DT_STRING << 8) + index, langid, buf, size,
740 741 742 743
			USB_CNTL_TIMEOUT);

		if (result > 0)
			break;
W
Wolfgang Denk 已提交
744 745
	}

746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
	return result;
}


static void usb_try_string_workarounds(unsigned char *buf, int *length)
{
	int newlength, oldlength = *length;

	for (newlength = 2; newlength + 1 < oldlength; newlength += 2)
		if (!isprint(buf[newlength]) || buf[newlength + 1])
			break;

	if (newlength > 2) {
		buf[0] = newlength;
		*length = newlength;
	}
W
wdenk 已提交
762 763
}

764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793

static int usb_string_sub(struct usb_device *dev, unsigned int langid,
		unsigned int index, unsigned char *buf)
{
	int rc;

	/* Try to read the string descriptor by asking for the maximum
	 * possible number of bytes */
	rc = usb_get_string(dev, langid, index, buf, 255);

	/* If that failed try to read the descriptor length, then
	 * ask for just that many bytes */
	if (rc < 2) {
		rc = usb_get_string(dev, langid, index, buf, 2);
		if (rc == 2)
			rc = usb_get_string(dev, langid, index, buf, buf[0]);
	}

	if (rc >= 2) {
		if (!buf[0] && !buf[1])
			usb_try_string_workarounds(buf, &rc);

		/* There might be extra junk at the end of the descriptor */
		if (buf[0] < rc)
			rc = buf[0];

		rc = rc - (rc & 1); /* force a multiple of two */
	}

	if (rc < 2)
794
		rc = -EINVAL;
795 796 797 798 799

	return rc;
}


W
wdenk 已提交
800 801 802 803 804 805 806
/********************************************************************
 * usb_string:
 * Get string index and translate it to ascii.
 * returns string length (> 0) or error (< 0)
 */
int usb_string(struct usb_device *dev, int index, char *buf, size_t size)
{
P
Puneet Saxena 已提交
807
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, mybuf, USB_BUFSIZ);
W
wdenk 已提交
808 809 810 811 812
	unsigned char *tbuf;
	int err;
	unsigned int u, idx;

	if (size <= 0 || !buf || !index)
813
		return -EINVAL;
W
wdenk 已提交
814
	buf[0] = 0;
815
	tbuf = &mybuf[0];
W
wdenk 已提交
816 817 818

	/* get langid for strings if it's not yet known */
	if (!dev->have_langid) {
819
		err = usb_string_sub(dev, 0, 0, tbuf);
W
wdenk 已提交
820
		if (err < 0) {
821 822
			debug("error getting string descriptor 0 " \
			      "(error=%lx)\n", dev->status);
823
			return -EIO;
W
wdenk 已提交
824
		} else if (tbuf[0] < 4) {
825
			debug("string descriptor 0 too short\n");
826
			return -EIO;
W
wdenk 已提交
827 828
		} else {
			dev->have_langid = -1;
829
			dev->string_langid = tbuf[2] | (tbuf[3] << 8);
W
wdenk 已提交
830
				/* always use the first langid listed */
831 832 833
			debug("USB device number %d default " \
			      "language ID 0x%x\n",
			      dev->devnum, dev->string_langid);
W
wdenk 已提交
834 835
		}
	}
W
wdenk 已提交
836

837
	err = usb_string_sub(dev, dev->string_langid, index, tbuf);
W
wdenk 已提交
838 839
	if (err < 0)
		return err;
840

W
wdenk 已提交
841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860
	size--;		/* leave room for trailing NULL char in output buffer */
	for (idx = 0, u = 2; u < err; u += 2) {
		if (idx >= size)
			break;
		if (tbuf[u+1])			/* high byte */
			buf[idx++] = '?';  /* non-ASCII character */
		else
			buf[idx++] = tbuf[u];
	}
	buf[idx] = 0;
	err = idx;
	return err;
}


/********************************************************************
 * USB device handling:
 * the USB device are static allocated [USB_MAX_DEVICE].
 */

861
#ifndef CONFIG_DM_USB
W
wdenk 已提交
862 863 864 865

/* returns a pointer to the device with the index [index].
 * if the device is not assigned (dev->devnum==-1) returns NULL
 */
866
struct usb_device *usb_get_dev_index(int index)
W
wdenk 已提交
867
{
868
	if (usb_dev[index].devnum == -1)
W
wdenk 已提交
869 870 871 872 873
		return NULL;
	else
		return &usb_dev[index];
}

874
int usb_alloc_new_device(struct udevice *controller, struct usb_device **devp)
W
wdenk 已提交
875 876
{
	int i;
877
	debug("New Device %d\n", dev_index);
878 879
	if (dev_index == USB_MAX_DEVICE) {
		printf("ERROR, too many USB Devices, max=%d\n", USB_MAX_DEVICE);
880
		return -ENOSPC;
W
wdenk 已提交
881
	}
882 883 884 885 886 887
	/* default Address is 0, real addresses start with 1 */
	usb_dev[dev_index].devnum = dev_index + 1;
	usb_dev[dev_index].maxchild = 0;
	for (i = 0; i < USB_MAXCHILDREN; i++)
		usb_dev[dev_index].children[i] = NULL;
	usb_dev[dev_index].parent = NULL;
888
	usb_dev[dev_index].controller = controller;
W
wdenk 已提交
889
	dev_index++;
890 891 892
	*devp = &usb_dev[dev_index - 1];

	return 0;
W
wdenk 已提交
893 894
}

895 896 897 898 899
/*
 * Free the newly created device node.
 * Called in error cases where configuring a newly attached
 * device fails for some reason.
 */
900
void usb_free_device(struct udevice *controller)
901 902
{
	dev_index--;
903
	debug("Freeing device node: %d\n", dev_index);
904 905 906
	memset(&usb_dev[dev_index], 0, sizeof(struct usb_device));
	usb_dev[dev_index].devnum = -1;
}
W
wdenk 已提交
907

908 909 910 911 912 913 914 915 916 917
/*
 * XHCI issues Enable Slot command and thereafter
 * allocates device contexts. Provide a weak alias
 * function for the purpose, so that XHCI overrides it
 * and EHCI/OHCI just work out of the box.
 */
__weak int usb_alloc_device(struct usb_device *udev)
{
	return 0;
}
918
#endif /* !CONFIG_DM_USB */
S
Simon Glass 已提交
919

920
static int usb_hub_port_reset(struct usb_device *dev, struct usb_device *hub)
S
Simon Glass 已提交
921
{
922
	if (!hub)
923
		usb_reset_root_port(dev);
S
Simon Glass 已提交
924 925 926 927

	return 0;
}

928
static int get_descriptor_len(struct usb_device *dev, int len, int expect_len)
W
wdenk 已提交
929
{
930
	__maybe_unused struct usb_device_descriptor *desc;
P
Puneet Saxena 已提交
931
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, tmpbuf, USB_BUFSIZ);
932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954
	int err;

	desc = (struct usb_device_descriptor *)tmpbuf;

	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, len);
	if (err < expect_len) {
		if (err < 0) {
			printf("unable to get device descriptor (error=%d)\n",
				err);
			return err;
		} else {
			printf("USB device descriptor short read (expected %i, got %i)\n",
				expect_len, err);
			return -EIO;
		}
	}
	memcpy(&dev->descriptor, tmpbuf, sizeof(dev->descriptor));

	return 0;
}

static int usb_setup_descriptor(struct usb_device *dev, bool do_read)
{
955 956
	/*
	 * This is a Windows scheme of initialization sequence, with double
R
Remy Bohmer 已提交
957
	 * reset of the device (Linux uses the same sequence)
958 959
	 * Some equipment is said to work only with such init sequence; this
	 * patch is based on the work by Alan Stern:
960 961
	 * http://sourceforge.net/mailarchive/forum.php?
	 * thread_id=5729457&forum_id=5398
962 963
	 */

964 965
	/*
	 * send 64-byte GET-DEVICE-DESCRIPTOR request.  Since the descriptor is
966 967
	 * only 18 bytes long, this will terminate with a short packet.  But if
	 * the maxpacket size is 8 or 16 the device may be waiting to transmit
968 969
	 * some more, or keeps on retransmitting the 8 byte header.
	 */
970

971 972 973 974 975 976 977 978 979
	if (dev->speed == USB_SPEED_LOW) {
		dev->descriptor.bMaxPacketSize0 = 8;
		dev->maxpacketsize = PACKET_SIZE_8;
	} else {
		dev->descriptor.bMaxPacketSize0 = 64;
		dev->maxpacketsize = PACKET_SIZE_64;
	}
	dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
	dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
R
Remy Bohmer 已提交
980

981 982
	if (do_read) {
		int err;
S
Simon Glass 已提交
983

984 985 986 987 988 989 990 991 992 993 994 995 996 997 998
		/*
		 * Validate we've received only at least 8 bytes, not that we've
		 * received the entire descriptor. The reasoning is:
		 * - The code only uses fields in the first 8 bytes, so that's all we
		 *   need to have fetched at this stage.
		 * - The smallest maxpacket size is 8 bytes. Before we know the actual
		 *   maxpacket the device uses, the USB controller may only accept a
		 *   single packet. Consequently we are only guaranteed to receive 1
		 *   packet (at least 8 bytes) even in a non-error case.
		 *
		 * At least the DWC2 controller needs to be programmed with the number
		 * of packets in addition to the number of bytes. A request for 64
		 * bytes of data with the maxpacket guessed as 64 (above) yields a
		 * request for 1 packet.
		 */
999 1000 1001
		err = get_descriptor_len(dev, 64, 8);
		if (err)
			return err;
1002
	}
R
Remy Bohmer 已提交
1003

1004
	dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
W
wdenk 已提交
1005 1006
	dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
	switch (dev->descriptor.bMaxPacketSize0) {
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018
	case 8:
		dev->maxpacketsize  = PACKET_SIZE_8;
		break;
	case 16:
		dev->maxpacketsize = PACKET_SIZE_16;
		break;
	case 32:
		dev->maxpacketsize = PACKET_SIZE_32;
		break;
	case 64:
		dev->maxpacketsize = PACKET_SIZE_64;
		break;
1019 1020 1021
	default:
		printf("usb_new_device: invalid max packet size\n");
		return -EIO;
W
wdenk 已提交
1022
	}
1023 1024 1025 1026

	return 0;
}

1027
static int usb_prepare_device(struct usb_device *dev, int addr, bool do_read,
1028
			      struct usb_device *parent)
1029
{
1030
	int err;
1031 1032 1033 1034 1035 1036 1037

	/*
	 * Allocate usb 3.0 device context.
	 * USB 3.0 (xHCI) protocol tries to allocate device slot
	 * and related data structures first. This call does that.
	 * Refer to sec 4.3.2 in xHCI spec rev1.0
	 */
1038 1039
	err = usb_alloc_device(dev);
	if (err) {
1040
		printf("Cannot allocate device context to get SLOT_ID\n");
1041
		return err;
1042 1043 1044 1045
	}
	err = usb_setup_descriptor(dev, do_read);
	if (err)
		return err;
1046
	err = usb_hub_port_reset(dev, parent);
1047 1048 1049
	if (err)
		return err;

W
wdenk 已提交
1050 1051 1052 1053 1054
	dev->devnum = addr;

	err = usb_set_address(dev); /* set address */

	if (err < 0) {
1055 1056
		printf("\n      USB device not accepting new address " \
			"(error=%lX)\n", dev->status);
1057
		return err;
W
wdenk 已提交
1058 1059
	}

1060
	mdelay(10);	/* Let the SET_ADDRESS settle */
W
wdenk 已提交
1061

1062 1063 1064
	return 0;
}

1065
int usb_select_config(struct usb_device *dev)
1066
{
1067
	unsigned char *tmpbuf = NULL;
1068
	int err;
1069

1070 1071 1072
	err = get_descriptor_len(dev, USB_DT_DEVICE_SIZE, USB_DT_DEVICE_SIZE);
	if (err)
		return err;
W
wdenk 已提交
1073 1074

	/* correct le values */
1075 1076 1077 1078
	le16_to_cpus(&dev->descriptor.bcdUSB);
	le16_to_cpus(&dev->descriptor.idVendor);
	le16_to_cpus(&dev->descriptor.idProduct);
	le16_to_cpus(&dev->descriptor.bcdDevice);
1079

1080 1081 1082 1083 1084 1085 1086 1087
	/*
	 * Kingston DT Ultimate 32GB USB 3.0 seems to be extremely sensitive
	 * about this first Get Descriptor request. If there are any other
	 * requests in the first microframe, the stick crashes. Wait about
	 * one microframe duration here (1mS for USB 1.x , 125uS for USB 2.0).
	 */
	mdelay(1);

W
wdenk 已提交
1088
	/* only support for one config for now */
1089 1090 1091 1092 1093 1094 1095 1096
	err = usb_get_configuration_len(dev, 0);
	if (err >= 0) {
		tmpbuf = (unsigned char *)malloc_cache_aligned(err);
		if (!tmpbuf)
			err = -ENOMEM;
		else
			err = usb_get_configuration_no(dev, 0, tmpbuf, err);
	}
1097 1098 1099 1100
	if (err < 0) {
		printf("usb_new_device: Cannot read configuration, " \
		       "skipping device %04x:%04x\n",
		       dev->descriptor.idVendor, dev->descriptor.idProduct);
1101
		free(tmpbuf);
1102
		return err;
1103
	}
P
Puneet Saxena 已提交
1104
	usb_parse_config(dev, tmpbuf, 0);
1105
	free(tmpbuf);
W
wdenk 已提交
1106
	usb_set_maxpacket(dev);
1107 1108 1109 1110 1111 1112 1113
	/*
	 * we set the default configuration here
	 * This seems premature. If the driver wants a different configuration
	 * it will need to select itself.
	 */
	err = usb_set_configuration(dev, dev->config.desc.bConfigurationValue);
	if (err < 0) {
1114 1115
		printf("failed to set default configuration " \
			"len %d, status %lX\n", dev->act_len, dev->status);
1116
		return err;
W
wdenk 已提交
1117
	}
1118 1119 1120 1121 1122 1123 1124 1125

	/*
	 * Wait until the Set Configuration request gets processed by the
	 * device. This is required by at least SanDisk Cruzer Pop USB 2.0
	 * and Kingston DT Ultimate 32GB USB 3.0 on DWC2 OTG controller.
	 */
	mdelay(10);

1126 1127 1128
	debug("new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
	      dev->descriptor.iManufacturer, dev->descriptor.iProduct,
	      dev->descriptor.iSerialNumber);
W
wdenk 已提交
1129 1130 1131 1132
	memset(dev->mf, 0, sizeof(dev->mf));
	memset(dev->prod, 0, sizeof(dev->prod));
	memset(dev->serial, 0, sizeof(dev->serial));
	if (dev->descriptor.iManufacturer)
1133 1134
		usb_string(dev, dev->descriptor.iManufacturer,
			   dev->mf, sizeof(dev->mf));
W
wdenk 已提交
1135
	if (dev->descriptor.iProduct)
1136 1137
		usb_string(dev, dev->descriptor.iProduct,
			   dev->prod, sizeof(dev->prod));
W
wdenk 已提交
1138
	if (dev->descriptor.iSerialNumber)
1139 1140
		usb_string(dev, dev->descriptor.iSerialNumber,
			   dev->serial, sizeof(dev->serial));
1141 1142 1143
	debug("Manufacturer %s\n", dev->mf);
	debug("Product      %s\n", dev->prod);
	debug("SerialNumber %s\n", dev->serial);
1144 1145 1146 1147

	return 0;
}

1148
int usb_setup_device(struct usb_device *dev, bool do_read,
1149
		     struct usb_device *parent)
1150 1151 1152 1153 1154 1155 1156 1157
{
	int addr;
	int ret;

	/* We still haven't set the Address yet */
	addr = dev->devnum;
	dev->devnum = 0;

1158
	ret = usb_prepare_device(dev, addr, do_read, parent);
1159 1160 1161 1162 1163 1164 1165
	if (ret)
		return ret;
	ret = usb_select_config(dev);

	return ret;
}

1166
#ifndef CONFIG_DM_USB
1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184
/*
 * 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 err;

	/*
	 * 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.
	 */
1185
#ifdef CONFIG_USB_XHCI_HCD
1186 1187
	do_read = false;
#endif
1188
	err = usb_setup_device(dev, do_read, dev->parent);
1189 1190 1191 1192 1193 1194 1195 1196
	if (err)
		return err;

	/* Now probe if the device is a hub */
	err = usb_hub_probe(dev, 0);
	if (err < 0)
		return err;

W
wdenk 已提交
1197 1198
	return 0;
}
1199
#endif
W
wdenk 已提交
1200

1201
__weak
1202
int board_usb_init(int index, enum usb_init_type init)
1203 1204 1205
{
	return 0;
}
1206 1207 1208 1209 1210 1211

__weak
int board_usb_cleanup(int index, enum usb_init_type init)
{
	return 0;
}
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221

bool usb_device_has_child_on_port(struct usb_device *parent, int port)
{
#ifdef CONFIG_DM_USB
	return false;
#else
	return parent->children[port] != NULL;
#endif
}

1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277
#ifdef CONFIG_DM_USB
void usb_find_usb2_hub_address_port(struct usb_device *udev,
			       uint8_t *hub_address, uint8_t *hub_port)
{
	struct udevice *parent;
	struct usb_device *uparent, *ttdev;

	/*
	 * When called from usb-uclass.c: usb_scan_device() udev->dev points
	 * to the parent udevice, not the actual udevice belonging to the
	 * udev as the device is not instantiated yet. So when searching
	 * for the first usb-2 parent start with udev->dev not
	 * udev->dev->parent .
	 */
	ttdev = udev;
	parent = udev->dev;
	uparent = dev_get_parent_priv(parent);

	while (uparent->speed != USB_SPEED_HIGH) {
		struct udevice *dev = parent;

		if (device_get_uclass_id(dev->parent) != UCLASS_USB_HUB) {
			printf("Error: Cannot find high speed parent of usb-1 device\n");
			*hub_address = 0;
			*hub_port = 0;
			return;
		}

		ttdev = dev_get_parent_priv(dev);
		parent = dev->parent;
		uparent = dev_get_parent_priv(parent);
	}
	*hub_address = uparent->devnum;
	*hub_port = ttdev->portnr;
}
#else
void usb_find_usb2_hub_address_port(struct usb_device *udev,
			       uint8_t *hub_address, uint8_t *hub_port)
{
	/* Find out the nearest parent which is high speed */
	while (udev->parent->parent != NULL)
		if (udev->parent->speed != USB_SPEED_HIGH) {
			udev = udev->parent;
		} else {
			*hub_address = udev->parent->devnum;
			*hub_port = udev->portnr;
			return;
		}

	printf("Error: Cannot find high speed parent of usb-1 device\n");
	*hub_address = 0;
	*hub_port = 0;
}
#endif


W
wdenk 已提交
1278
/* EOF */