usb.c 30.5 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 31
 */

/*
 * 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>
#include <asm/processor.h>
M
Mike Frysinger 已提交
32
#include <linux/compiler.h>
33
#include <linux/ctype.h>
34
#include <asm/byteorder.h>
35
#include <asm/unaligned.h>
36
#include <errno.h>
W
wdenk 已提交
37 38
#include <usb.h>
#ifdef CONFIG_4xx
39
#include <asm/4xx_pci.h>
W
wdenk 已提交
40 41
#endif

W
wdenk 已提交
42 43
#define USB_BUFSIZ	512

W
wdenk 已提交
44 45 46 47
static struct usb_device usb_dev[USB_MAX_DEVICE];
static int dev_index;
static int asynch_allowed;

48 49
char usb_started; /* flag for the started/stopped USB status */

50 51 52
#ifndef CONFIG_USB_MAX_CONTROLLER_COUNT
#define CONFIG_USB_MAX_CONTROLLER_COUNT 1
#endif
W
wdenk 已提交
53 54 55 56 57 58

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

65 66
	dev_index = 0;
	asynch_allowed = 1;
W
wdenk 已提交
67
	usb_hub_reset();
68 69 70 71 72 73 74

	/* 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 已提交
75
	/* init low_level USB */
76 77 78
	for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
		/* init low_level USB */
		printf("USB%d:   ", i);
79 80 81
		ret = usb_lowlevel_init(i, USB_INIT_HOST, &ctrl);
		if (ret == -ENODEV) {	/* No such device. */
			puts("Port not available.\n");
82
			controllers_initialized++;
83 84 85 86
			continue;
		}

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

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

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

117
		usb_started = 1;
118 119
	}

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

125
	return usb_started ? 0 : -ENODEV;
W
wdenk 已提交
126 127 128 129 130 131 132
}

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

	if (usb_started) {
		asynch_allowed = 1;
		usb_started = 0;
		usb_hub_reset();
139 140 141 142 143

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

	return 0;
W
wdenk 已提交
147 148 149 150 151
}

/*
 * 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.
152
 * Returns the old value so it can be restored later.
W
wdenk 已提交
153
 */
154
int usb_disable_asynch(int disable)
W
wdenk 已提交
155
{
156 157
	int old_value = asynch_allowed;

158
	asynch_allowed = !disable;
159
	return old_value;
W
wdenk 已提交
160 161 162 163 164 165 166 167 168 169 170 171
}


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

/*
 * submits an Interrupt Message
 */
int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
172
			void *buffer, int transfer_len, int interval)
W
wdenk 已提交
173
{
174
	return submit_int_msg(dev, pipe, buffer, transfer_len, interval);
W
wdenk 已提交
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
}

/*
 * 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)).
 * returns the transfered length if OK or -1 if error. The transfered length
 * 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 已提交
191
	ALLOC_CACHE_ALIGN_BUFFER(struct devrequest, setup_packet, 1);
192

193 194
	if ((timeout == 0) && (!asynch_allowed)) {
		/* request for a asynch control pipe is not allowed */
195
		return -EINVAL;
196
	}
197

W
wdenk 已提交
198
	/* set setup command */
P
Puneet Saxena 已提交
199 200 201 202 203
	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);
204 205 206
	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);
207
	dev->status = USB_ST_NOT_PROC; /*not yet processed */
W
wdenk 已提交
208

209
	if (submit_control_msg(dev, pipe, data, size, setup_packet) < 0)
210
		return -EIO;
211
	if (timeout == 0)
W
wdenk 已提交
212
		return (int)size;
213

214 215 216 217 218 219 220 221
	/*
	 * 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;
222
		mdelay(1);
R
Remy Bohmer 已提交
223
	}
224 225
	if (dev->status)
		return -1;
R
Remy Bohmer 已提交
226 227

	return dev->act_len;
228

W
wdenk 已提交
229 230 231 232
}

/*-------------------------------------------------------------------
 * submits bulk message, and waits for completion. returns 0 if Ok or
233
 * negative if Error.
W
wdenk 已提交
234 235 236 237 238 239
 * 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)
240
		return -EINVAL;
241
	dev->status = USB_ST_NOT_PROC; /*not yet processed */
242
	if (submit_bulk_msg(dev, pipe, data, len) < 0)
243
		return -EIO;
244 245
	while (timeout--) {
		if (!((volatile unsigned long)dev->status & USB_ST_NOT_PROC))
W
wdenk 已提交
246
			break;
247
		mdelay(1);
W
wdenk 已提交
248
	}
249 250
	*actual_length = dev->act_len;
	if (dev->status == 0)
W
wdenk 已提交
251 252
		return 0;
	else
253
		return -EIO;
W
wdenk 已提交
254 255 256 257 258 259 260 261 262 263 264
}


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

/*
 * returns the max packet size, depending on the pipe direction and
 * the configurations values
 */
265
int usb_maxpacket(struct usb_device *dev, unsigned long pipe)
W
wdenk 已提交
266
{
267 268
	/* direction is out -> use emaxpacket out */
	if ((pipe & USB_DIR_IN) == 0)
269
		return dev->epmaxpacketout[((pipe>>15) & 0xf)];
W
wdenk 已提交
270
	else
271
		return dev->epmaxpacketin[((pipe>>15) & 0xf)];
W
wdenk 已提交
272 273
}

M
Marek Vasut 已提交
274 275
/*
 * The routine usb_set_maxpacket_ep() is extracted from the loop of routine
276 277 278 279 280 281
 * 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 已提交
282 283
 *
 * NOTE: Similar behaviour was observed with GCC4.6 on ARMv5.
284
 */
M
Mike Frysinger 已提交
285
static void noinline
M
Marek Vasut 已提交
286
usb_set_maxpacket_ep(struct usb_device *dev, int if_idx, int ep_idx)
287 288
{
	int b;
M
Marek Vasut 已提交
289
	struct usb_endpoint_descriptor *ep;
290
	u16 ep_wMaxPacketSize;
M
Marek Vasut 已提交
291 292

	ep = &dev->config.if_desc[if_idx].ep_desc[ep_idx];
293 294

	b = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
295
	ep_wMaxPacketSize = get_unaligned(&ep->wMaxPacketSize);
296 297 298 299

	if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
						USB_ENDPOINT_XFER_CONTROL) {
		/* Control => bidirectional */
300 301
		dev->epmaxpacketout[b] = ep_wMaxPacketSize;
		dev->epmaxpacketin[b] = ep_wMaxPacketSize;
302 303
		debug("##Control EP epmaxpacketout/in[%d] = %d\n",
		      b, dev->epmaxpacketin[b]);
304 305 306
	} else {
		if ((ep->bEndpointAddress & 0x80) == 0) {
			/* OUT Endpoint */
307 308
			if (ep_wMaxPacketSize > dev->epmaxpacketout[b]) {
				dev->epmaxpacketout[b] = ep_wMaxPacketSize;
309 310
				debug("##EP epmaxpacketout[%d] = %d\n",
				      b, dev->epmaxpacketout[b]);
311 312 313
			}
		} else {
			/* IN Endpoint */
314 315
			if (ep_wMaxPacketSize > dev->epmaxpacketin[b]) {
				dev->epmaxpacketin[b] = ep_wMaxPacketSize;
316 317
				debug("##EP epmaxpacketin[%d] = %d\n",
				      b, dev->epmaxpacketin[b]);
318 319 320 321 322
			}
		} /* if out */
	} /* if control */
}

W
wdenk 已提交
323 324 325
/*
 * set the max packed value of all endpoints in the given configuration
 */
M
Marek Vasut 已提交
326
static int usb_set_maxpacket(struct usb_device *dev)
W
wdenk 已提交
327
{
328
	int i, ii;
W
wdenk 已提交
329

T
Tom Rix 已提交
330 331
	for (i = 0; i < dev->config.desc.bNumInterfaces; i++)
		for (ii = 0; ii < dev->config.if_desc[i].desc.bNumEndpoints; ii++)
M
Marek Vasut 已提交
332
			usb_set_maxpacket_ep(dev, i, ii);
W
wdenk 已提交
333 334 335 336 337 338 339

	return 0;
}

/*******************************************************************************
 * Parse the config, located in buffer, and fills the dev->config structure.
 * Note that all little/big endian swapping are done automatically.
340
 * (wTotalLength has already been swapped and sanitized when it was read.)
W
wdenk 已提交
341
 */
M
Marek Vasut 已提交
342 343
static int usb_parse_config(struct usb_device *dev,
			unsigned char *buffer, int cfgno)
W
wdenk 已提交
344 345
{
	struct usb_descriptor_header *head;
346
	int index, ifno, epno, curr_if_num;
347
	u16 ep_wMaxPacketSize;
348
	struct usb_interface *if_desc = NULL;
349 350 351 352 353 354 355

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

	dev->configno = cfgno;
	head = (struct usb_descriptor_header *) &buffer[0];
356 357 358
	if (head->bDescriptorType != USB_DT_CONFIG) {
		printf(" ERROR: NOT USB_CONFIG_DESC %x\n",
			head->bDescriptorType);
359
		return -EINVAL;
W
wdenk 已提交
360
	}
361 362
	if (head->bLength != USB_DT_CONFIG_SIZE) {
		printf("ERROR: Invalid USB CFG length (%d)\n", head->bLength);
363
		return -EINVAL;
364 365
	}
	memcpy(&dev->config, head, USB_DT_CONFIG_SIZE);
366
	dev->config.no_of_if = 0;
W
wdenk 已提交
367

T
Tom Rix 已提交
368
	index = dev->config.desc.bLength;
369 370
	/* Ok the first entry must be a configuration entry,
	 * now process the others */
371
	head = (struct usb_descriptor_header *) &buffer[index];
372
	while (index + 1 < dev->config.desc.wTotalLength && head->bLength) {
373 374
		switch (head->bDescriptorType) {
		case USB_DT_INTERFACE:
375 376 377 378 379 380 381 382 383 384
			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;
			}
385
			if (((struct usb_interface_descriptor *) \
386
			     head)->bInterfaceNumber != curr_if_num) {
387 388
				/* this is a new interface, copy new desc */
				ifno = dev->config.no_of_if;
389 390 391
				if (ifno >= USB_MAXINTERFACES) {
					puts("Too many USB interfaces!\n");
					/* try to go on with what we have */
392
					return -EINVAL;
393
				}
394
				if_desc = &dev->config.if_desc[ifno];
395
				dev->config.no_of_if++;
396 397
				memcpy(if_desc, head,
					USB_DT_INTERFACE_SIZE);
398 399
				if_desc->no_of_ep = 0;
				if_desc->num_altsetting = 1;
400
				curr_if_num =
401
				     if_desc->desc.bInterfaceNumber;
402 403
			} else {
				/* found alternate setting for the interface */
404 405 406 407
				if (ifno >= 0) {
					if_desc = &dev->config.if_desc[ifno];
					if_desc->num_altsetting++;
				}
408 409 410
			}
			break;
		case USB_DT_ENDPOINT:
411 412 413 414 415 416 417 418 419 420 421 422 423 424
			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;
			}
425
			epno = dev->config.if_desc[ifno].no_of_ep;
426
			if_desc = &dev->config.if_desc[ifno];
427 428 429
			if (epno > USB_MAXENDPOINTS) {
				printf("Interface %d has too many endpoints!\n",
					if_desc->desc.bInterfaceNumber);
430
				return -EINVAL;
431
			}
432
			/* found an endpoint */
433
			if_desc->no_of_ep++;
434 435
			memcpy(&if_desc->ep_desc[epno], head,
				USB_DT_ENDPOINT_SIZE);
436 437 438 439 440 441 442 443 444
			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);
445
			debug("if %d, ep %d\n", ifno, epno);
446
			break;
447
		case USB_DT_SS_ENDPOINT_COMP:
448 449 450 451 452 453 454 455 456 457 458 459 460 461
			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;
			}
462
			if_desc = &dev->config.if_desc[ifno];
463 464
			memcpy(&if_desc->ss_ep_comp_desc[epno], head,
				USB_DT_SS_EP_COMP_SIZE);
465
			break;
466 467
		default:
			if (head->bLength == 0)
468
				return -EINVAL;
469

470 471
			debug("unknown Description Type : %x\n",
			      head->bDescriptorType);
472

473
#ifdef DEBUG
474
			{
475
				unsigned char *ch = (unsigned char *)head;
476 477
				int i;

478
				for (i = 0; i < head->bLength; i++)
479 480
					debug("%02X ", *ch++);
				debug("\n\n\n");
481
			}
482
#endif
483
			break;
W
wdenk 已提交
484
		}
485 486
		index += head->bLength;
		head = (struct usb_descriptor_header *)&buffer[index];
W
wdenk 已提交
487
	}
488
	return 0;
W
wdenk 已提交
489 490 491 492 493 494 495 496 497 498
}

/***********************************************************************
 * 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;
499
	int endp = usb_pipeendpoint(pipe)|(usb_pipein(pipe)<<7);
W
wdenk 已提交
500 501

	result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
502 503
				 USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0,
				 endp, NULL, 0, USB_CNTL_TIMEOUT * 3);
W
wdenk 已提交
504 505 506 507

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

W
Wolfgang Denk 已提交
509
	/*
510 511 512 513
	 * NOTE: we do not get status and verify reset was successful
	 * as some devices are reported to lock up upon this check..
	 */

W
wdenk 已提交
514
	usb_endpoint_running(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe));
515

W
wdenk 已提交
516 517 518 519 520 521 522 523 524
	/* toggle is reset on clear */
	usb_settoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe), 0);
	return 0;
}


/**********************************************************************
 * get_descriptor type
 */
M
Marek Vasut 已提交
525
static int usb_get_descriptor(struct usb_device *dev, unsigned char type,
526
			unsigned char index, void *buf, int size)
W
wdenk 已提交
527 528
{
	int res;
W
Wolfgang Denk 已提交
529
	res = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
W
wdenk 已提交
530 531 532 533 534 535 536 537 538
			USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
			(type << 8) + index, 0,
			buf, size, USB_CNTL_TIMEOUT);
	return res;
}

/**********************************************************************
 * gets configuration cfgno and store it in the buffer
 */
539 540
int usb_get_configuration_no(struct usb_device *dev,
			     unsigned char *buffer, int cfgno)
W
wdenk 已提交
541
{
W
Wolfgang Denk 已提交
542
	int result;
543
	unsigned int length;
544
	struct usb_config_descriptor *config;
W
wdenk 已提交
545

546
	config = (struct usb_config_descriptor *)&buffer[0];
R
Remy Bohmer 已提交
547 548
	result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 9);
	if (result < 9) {
W
wdenk 已提交
549
		if (result < 0)
550 551
			printf("unable to get descriptor, error %lX\n",
				dev->status);
W
wdenk 已提交
552
		else
553
			printf("config descriptor too short " \
R
Remy Bohmer 已提交
554
				"(expected %i, got %i)\n", 9, result);
555
		return -EIO;
W
wdenk 已提交
556
	}
557
	length = le16_to_cpu(config->wTotalLength);
W
wdenk 已提交
558

559 560 561
	if (length > USB_BUFSIZ) {
		printf("%s: failed to get descriptor - too long: %d\n",
			__func__, length);
562
		return -EIO;
W
wdenk 已提交
563 564
	}

565 566 567 568
	result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, length);
	debug("get_conf_no %d Result %d, wLength %d\n", cfgno, result, length);
	config->wTotalLength = length; /* validated, with CPU byte order */

W
wdenk 已提交
569 570 571 572 573 574 575
	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 已提交
576
static int usb_set_address(struct usb_device *dev)
W
wdenk 已提交
577 578 579
{
	int res;

580
	debug("set address %d\n", dev->devnum);
581 582 583 584
	res = usb_control_msg(dev, usb_snddefctrl(dev),
				USB_REQ_SET_ADDRESS, 0,
				(dev->devnum), 0,
				NULL, 0, USB_CNTL_TIMEOUT);
W
wdenk 已提交
585 586 587 588 589 590 591 592
	return res;
}

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

T
Tom Rix 已提交
596 597
	for (i = 0; i < dev->config.desc.bNumInterfaces; i++) {
		if (dev->config.if_desc[i].desc.bInterfaceNumber == interface) {
W
wdenk 已提交
598 599 600 601 602 603
			if_face = &dev->config.if_desc[i];
			break;
		}
	}
	if (!if_face) {
		printf("selecting invalid interface %d", interface);
604
		return -EINVAL;
W
wdenk 已提交
605
	}
606 607
	/*
	 * We should return now for devices with only one alternate setting.
608 609 610 611
	 * 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.
612 613 614
	 */
	if (if_face->num_altsetting == 1)
		return 0;
W
wdenk 已提交
615

616 617 618 619 620
	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 已提交
621 622 623 624 625 626 627 628
		return ret;

	return 0;
}

/********************************************************************
 * set configuration number to configuration
 */
M
Marek Vasut 已提交
629
static int usb_set_configuration(struct usb_device *dev, int configuration)
W
wdenk 已提交
630 631
{
	int res;
632
	debug("set configuration %d\n", configuration);
W
wdenk 已提交
633
	/* set setup command */
634 635 636 637 638
	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 已提交
639 640 641
		dev->toggle[0] = 0;
		dev->toggle[1] = 0;
		return 0;
642
	} else
643
		return -EIO;
W
wdenk 已提交
644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668
}

/********************************************************************
 * 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
 */
669 670
int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type,
		   unsigned char id, void *buf, int size)
W
wdenk 已提交
671 672
{
	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
673 674 675
			USB_REQ_GET_REPORT,
			USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
			(type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
W
wdenk 已提交
676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691
}

/********************************************************************
 * 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 已提交
692
static int usb_get_string(struct usb_device *dev, unsigned short langid,
693
		   unsigned char index, void *buf, int size)
W
wdenk 已提交
694
{
695 696 697 698 699 700 701
	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 已提交
702
			(USB_DT_STRING << 8) + index, langid, buf, size,
703 704 705 706
			USB_CNTL_TIMEOUT);

		if (result > 0)
			break;
W
Wolfgang Denk 已提交
707 708
	}

709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724
	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 已提交
725 726
}

727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756

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)
757
		rc = -EINVAL;
758 759 760 761 762

	return rc;
}


W
wdenk 已提交
763 764 765 766 767 768 769
/********************************************************************
 * 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 已提交
770
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, mybuf, USB_BUFSIZ);
W
wdenk 已提交
771 772 773 774 775
	unsigned char *tbuf;
	int err;
	unsigned int u, idx;

	if (size <= 0 || !buf || !index)
776
		return -EINVAL;
W
wdenk 已提交
777
	buf[0] = 0;
778
	tbuf = &mybuf[0];
W
wdenk 已提交
779 780 781

	/* get langid for strings if it's not yet known */
	if (!dev->have_langid) {
782
		err = usb_string_sub(dev, 0, 0, tbuf);
W
wdenk 已提交
783
		if (err < 0) {
784 785
			debug("error getting string descriptor 0 " \
			      "(error=%lx)\n", dev->status);
786
			return -EIO;
W
wdenk 已提交
787
		} else if (tbuf[0] < 4) {
788
			debug("string descriptor 0 too short\n");
789
			return -EIO;
W
wdenk 已提交
790 791
		} else {
			dev->have_langid = -1;
792
			dev->string_langid = tbuf[2] | (tbuf[3] << 8);
W
wdenk 已提交
793
				/* always use the first langid listed */
794 795 796
			debug("USB device number %d default " \
			      "language ID 0x%x\n",
			      dev->devnum, dev->string_langid);
W
wdenk 已提交
797 798
		}
	}
W
wdenk 已提交
799

800
	err = usb_string_sub(dev, dev->string_langid, index, tbuf);
W
wdenk 已提交
801 802
	if (err < 0)
		return err;
803

W
wdenk 已提交
804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827
	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].
 */


/* returns a pointer to the device with the index [index].
 * if the device is not assigned (dev->devnum==-1) returns NULL
 */
828
struct usb_device *usb_get_dev_index(int index)
W
wdenk 已提交
829
{
830
	if (usb_dev[index].devnum == -1)
W
wdenk 已提交
831 832 833 834 835
		return NULL;
	else
		return &usb_dev[index];
}

836
int usb_alloc_new_device(struct udevice *controller, struct usb_device **devp)
W
wdenk 已提交
837 838
{
	int i;
839
	debug("New Device %d\n", dev_index);
840 841
	if (dev_index == USB_MAX_DEVICE) {
		printf("ERROR, too many USB Devices, max=%d\n", USB_MAX_DEVICE);
842
		return -ENOSPC;
W
wdenk 已提交
843
	}
844 845 846 847 848 849
	/* 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;
850
	usb_dev[dev_index].controller = controller;
W
wdenk 已提交
851
	dev_index++;
852 853 854
	*devp = &usb_dev[dev_index - 1];

	return 0;
W
wdenk 已提交
855 856
}

857 858 859 860 861
/*
 * Free the newly created device node.
 * Called in error cases where configuring a newly attached
 * device fails for some reason.
 */
862
void usb_free_device(struct udevice *controller)
863 864
{
	dev_index--;
865
	debug("Freeing device node: %d\n", dev_index);
866 867 868
	memset(&usb_dev[dev_index], 0, sizeof(struct usb_device));
	usb_dev[dev_index].devnum = -1;
}
W
wdenk 已提交
869

870 871 872 873 874 875 876 877 878 879
/*
 * 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;
}
W
wdenk 已提交
880 881 882 883 884 885 886
/*
 * 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.
 */
M
Marek Vasut 已提交
887
int usb_new_device(struct usb_device *dev)
W
wdenk 已提交
888 889 890
{
	int addr, err;
	int tmp;
P
Puneet Saxena 已提交
891
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, tmpbuf, USB_BUFSIZ);
W
wdenk 已提交
892

893 894 895 896 897 898 899 900
	/*
	 * 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
	 */
	if (usb_alloc_device(dev)) {
		printf("Cannot allocate device context to get SLOT_ID\n");
901
		return -EINVAL;
902 903
	}

W
wdenk 已提交
904 905 906
	/* We still haven't set the Address yet */
	addr = dev->devnum;
	dev->devnum = 0;
907

908 909 910 911 912 913 914
#ifdef CONFIG_LEGACY_USB_INIT_SEQ
	/* this is the old and known way of initializing devices, it is
	 * different than what Windows and Linux are doing. Windows and Linux
	 * both retrieve 64 bytes while reading the device descriptor
	 * Several USB stick devices report ERR: CTL_TIMEOUT, caused by an
	 * invalid header while reading 8 bytes as device descriptor. */
	dev->descriptor.bMaxPacketSize0 = 8;	    /* Start off at 8 bytes  */
R
Remy Bohmer 已提交
915
	dev->maxpacketsize = PACKET_SIZE_8;
916
	dev->epmaxpacketin[0] = 8;
917 918
	dev->epmaxpacketout[0] = 8;

919
	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, tmpbuf, 8);
920 921
	if (err < 8) {
		printf("\n      USB device not responding, " \
922
		       "giving up (status=%lX)\n", dev->status);
923
		return -EIO;
924
	}
925
	memcpy(&dev->descriptor, tmpbuf, 8);
926
#else
R
Remy Bohmer 已提交
927 928
	/* This is a Windows scheme of initialization sequence, with double
	 * reset of the device (Linux uses the same sequence)
929 930
	 * Some equipment is said to work only with such init sequence; this
	 * patch is based on the work by Alan Stern:
931 932
	 * http://sourceforge.net/mailarchive/forum.php?
	 * thread_id=5729457&forum_id=5398
933
	 */
934
	__maybe_unused struct usb_device_descriptor *desc;
935 936 937 938 939 940
	struct usb_device *parent = dev->parent;
	unsigned short portstatus;

	/* send 64-byte GET-DEVICE-DESCRIPTOR request.  Since the descriptor is
	 * 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
941
	 * some more, or keeps on retransmitting the 8 byte header. */
942 943

	desc = (struct usb_device_descriptor *)tmpbuf;
944
	dev->descriptor.bMaxPacketSize0 = 64;	    /* Start off at 64 bytes  */
R
Remy Bohmer 已提交
945 946
	/* Default to 64 byte max packet size */
	dev->maxpacketsize = PACKET_SIZE_64;
947
	dev->epmaxpacketin[0] = 64;
948
	dev->epmaxpacketout[0] = 64;
R
Remy Bohmer 已提交
949

950 951 952 953 954 955 956
	/*
	 * 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.
	 */
#ifndef CONFIG_USB_XHCI
R
Remy Bohmer 已提交
957
	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973
	/*
	 * 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.
	 */
	if (err < 8) {
974
		debug("usb_new_device: usb_get_descriptor() failed\n");
975
		return -EIO;
976
	}
R
Remy Bohmer 已提交
977

978
	dev->descriptor.bMaxPacketSize0 = desc->bMaxPacketSize0;
979 980 981 982 983
	/*
	 * Fetch the device class, driver can use this info
	 * to differentiate between HUB and DEVICE.
	 */
	dev->descriptor.bDeviceClass = desc->bDeviceClass;
984
#endif
W
Wolfgang Denk 已提交
985

986 987
	if (parent) {
		/* reset the port for the second time */
988
		err = hub_port_reset(dev->parent, dev->portnr - 1, &portstatus);
989
		if (err < 0) {
990
			printf("\n     Couldn't reset port %i\n", dev->portnr);
991
			return -EIO;
992
		}
993 994
	} else {
		usb_reset_root_port();
995 996 997
	}
#endif

998
	dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
W
wdenk 已提交
999 1000
	dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
	switch (dev->descriptor.bMaxPacketSize0) {
1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012
	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;
1013 1014 1015
	default:
		printf("usb_new_device: invalid max packet size\n");
		return -EIO;
W
wdenk 已提交
1016 1017 1018 1019 1020 1021
	}
	dev->devnum = addr;

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

	if (err < 0) {
1022 1023
		printf("\n      USB device not accepting new address " \
			"(error=%lX)\n", dev->status);
1024
		return -EIO;
W
wdenk 已提交
1025 1026
	}

1027
	mdelay(10);	/* Let the SET_ADDRESS settle */
W
wdenk 已提交
1028 1029 1030

	tmp = sizeof(dev->descriptor);

1031
	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
1032
				 tmpbuf, sizeof(dev->descriptor));
W
wdenk 已提交
1033 1034
	if (err < tmp) {
		if (err < 0)
1035 1036
			printf("unable to get device descriptor (error=%d)\n",
			       err);
W
wdenk 已提交
1037
		else
1038 1039
			printf("USB device descriptor short read " \
				"(expected %i, got %i)\n", tmp, err);
1040
		return -EIO;
W
wdenk 已提交
1041
	}
1042
	memcpy(&dev->descriptor, tmpbuf, sizeof(dev->descriptor));
W
wdenk 已提交
1043
	/* correct le values */
1044 1045 1046 1047
	le16_to_cpus(&dev->descriptor.bcdUSB);
	le16_to_cpus(&dev->descriptor.idVendor);
	le16_to_cpus(&dev->descriptor.idProduct);
	le16_to_cpus(&dev->descriptor.bcdDevice);
W
wdenk 已提交
1048
	/* only support for one config for now */
1049 1050 1051 1052 1053
	err = usb_get_configuration_no(dev, tmpbuf, 0);
	if (err < 0) {
		printf("usb_new_device: Cannot read configuration, " \
		       "skipping device %04x:%04x\n",
		       dev->descriptor.idVendor, dev->descriptor.idProduct);
1054
		return -EIO;
1055
	}
P
Puneet Saxena 已提交
1056
	usb_parse_config(dev, tmpbuf, 0);
W
wdenk 已提交
1057 1058
	usb_set_maxpacket(dev);
	/* we set the default configuration here */
T
Tom Rix 已提交
1059
	if (usb_set_configuration(dev, dev->config.desc.bConfigurationValue)) {
1060 1061
		printf("failed to set default configuration " \
			"len %d, status %lX\n", dev->act_len, dev->status);
1062
		return -EIO;
W
wdenk 已提交
1063
	}
1064 1065 1066
	debug("new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
	      dev->descriptor.iManufacturer, dev->descriptor.iProduct,
	      dev->descriptor.iSerialNumber);
W
wdenk 已提交
1067 1068 1069 1070
	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)
1071 1072
		usb_string(dev, dev->descriptor.iManufacturer,
			   dev->mf, sizeof(dev->mf));
W
wdenk 已提交
1073
	if (dev->descriptor.iProduct)
1074 1075
		usb_string(dev, dev->descriptor.iProduct,
			   dev->prod, sizeof(dev->prod));
W
wdenk 已提交
1076
	if (dev->descriptor.iSerialNumber)
1077 1078
		usb_string(dev, dev->descriptor.iSerialNumber,
			   dev->serial, sizeof(dev->serial));
1079 1080 1081
	debug("Manufacturer %s\n", dev->mf);
	debug("Product      %s\n", dev->prod);
	debug("SerialNumber %s\n", dev->serial);
W
wdenk 已提交
1082
	/* now prode if the device is a hub */
1083
	usb_hub_probe(dev, 0);
W
wdenk 已提交
1084 1085 1086
	return 0;
}

1087
__weak
1088
int board_usb_init(int index, enum usb_init_type init)
1089 1090 1091
{
	return 0;
}
1092 1093 1094 1095 1096 1097

__weak
int board_usb_cleanup(int index, enum usb_init_type init)
{
	return 0;
}
W
wdenk 已提交
1098
/* EOF */