usb.c 30.4 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;
}
S
Simon Glass 已提交
880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899

int usb_legacy_port_reset(struct usb_device *hub, int portnr)
{
	if (hub) {
		unsigned short portstatus;
		int err;

		/* reset the port for the second time */
		err = legacy_hub_port_reset(hub, portnr - 1, &portstatus);
		if (err < 0) {
			printf("\n     Couldn't reset port %i\n", portnr);
			return err;
		}
	} else {
		usb_reset_root_port();
	}

	return 0;
}

900
static int usb_setup_descriptor(struct usb_device *dev, bool do_read)
W
wdenk 已提交
901
{
902
	__maybe_unused struct usb_device_descriptor *desc;
P
Puneet Saxena 已提交
903
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, tmpbuf, USB_BUFSIZ);
W
wdenk 已提交
904

905 906
	/*
	 * This is a Windows scheme of initialization sequence, with double
R
Remy Bohmer 已提交
907
	 * reset of the device (Linux uses the same sequence)
908 909
	 * Some equipment is said to work only with such init sequence; this
	 * patch is based on the work by Alan Stern:
910 911
	 * http://sourceforge.net/mailarchive/forum.php?
	 * thread_id=5729457&forum_id=5398
912 913
	 */

914 915
	/*
	 * send 64-byte GET-DEVICE-DESCRIPTOR request.  Since the descriptor is
916 917
	 * 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
918
	 * some more, or keeps on retransmitting the 8 byte header. */
919

920
	desc = (struct usb_device_descriptor *)tmpbuf;
921
	dev->descriptor.bMaxPacketSize0 = 64;	    /* Start off at 64 bytes  */
R
Remy Bohmer 已提交
922 923
	/* Default to 64 byte max packet size */
	dev->maxpacketsize = PACKET_SIZE_64;
924
	dev->epmaxpacketin[0] = 64;
925
	dev->epmaxpacketout[0] = 64;
R
Remy Bohmer 已提交
926

927 928
	if (do_read) {
		int err;
S
Simon Glass 已提交
929

930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957
		err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
		/*
		 * 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) {
			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",
				       (int)sizeof(dev->descriptor), err);
				return -EIO;
			}
		}
		memcpy(&dev->descriptor, tmpbuf, sizeof(dev->descriptor));
958
	}
R
Remy Bohmer 已提交
959

960
	dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
W
wdenk 已提交
961 962
	dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
	switch (dev->descriptor.bMaxPacketSize0) {
963 964 965 966 967 968 969 970 971 972 973 974
	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;
975 976 977
	default:
		printf("usb_new_device: invalid max packet size\n");
		return -EIO;
W
wdenk 已提交
978
	}
979 980 981 982

	return 0;
}

983 984
static int usb_prepare_device(struct usb_device *dev, int addr, bool do_read,
			      struct usb_device *parent, int portnr)
985
{
986
	int err;
987 988 989 990 991 992 993

	/*
	 * 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
	 */
994 995
	err = usb_alloc_device(dev);
	if (err) {
996
		printf("Cannot allocate device context to get SLOT_ID\n");
997
		return err;
998 999 1000 1001
	}
	err = usb_setup_descriptor(dev, do_read);
	if (err)
		return err;
1002
	err = usb_legacy_port_reset(parent, portnr);
1003 1004 1005
	if (err)
		return err;

W
wdenk 已提交
1006 1007 1008 1009 1010
	dev->devnum = addr;

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

	if (err < 0) {
1011 1012
		printf("\n      USB device not accepting new address " \
			"(error=%lX)\n", dev->status);
1013
		return err;
W
wdenk 已提交
1014 1015
	}

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

1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051
	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;

W
wdenk 已提交
1052 1053
	tmp = sizeof(dev->descriptor);

1054
	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
1055
				 tmpbuf, sizeof(dev->descriptor));
W
wdenk 已提交
1056 1057
	if (err < tmp) {
		if (err < 0)
1058 1059
			printf("unable to get device descriptor (error=%d)\n",
			       err);
W
wdenk 已提交
1060
		else
1061 1062
			printf("USB device descriptor short read " \
				"(expected %i, got %i)\n", tmp, err);
1063
		return -EIO;
W
wdenk 已提交
1064
	}
1065
	memcpy(&dev->descriptor, tmpbuf, sizeof(dev->descriptor));
W
wdenk 已提交
1066
	/* correct le values */
1067 1068 1069 1070
	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 已提交
1071
	/* only support for one config for now */
1072 1073 1074 1075 1076
	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);
1077
		return -EIO;
1078
	}
P
Puneet Saxena 已提交
1079
	usb_parse_config(dev, tmpbuf, 0);
W
wdenk 已提交
1080 1081
	usb_set_maxpacket(dev);
	/* we set the default configuration here */
T
Tom Rix 已提交
1082
	if (usb_set_configuration(dev, dev->config.desc.bConfigurationValue)) {
1083 1084
		printf("failed to set default configuration " \
			"len %d, status %lX\n", dev->act_len, dev->status);
1085
		return -EIO;
W
wdenk 已提交
1086
	}
1087 1088 1089
	debug("new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
	      dev->descriptor.iManufacturer, dev->descriptor.iProduct,
	      dev->descriptor.iSerialNumber);
W
wdenk 已提交
1090 1091 1092 1093
	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)
1094 1095
		usb_string(dev, dev->descriptor.iManufacturer,
			   dev->mf, sizeof(dev->mf));
W
wdenk 已提交
1096
	if (dev->descriptor.iProduct)
1097 1098
		usb_string(dev, dev->descriptor.iProduct,
			   dev->prod, sizeof(dev->prod));
W
wdenk 已提交
1099
	if (dev->descriptor.iSerialNumber)
1100 1101
		usb_string(dev, dev->descriptor.iSerialNumber,
			   dev->serial, sizeof(dev->serial));
1102 1103 1104
	debug("Manufacturer %s\n", dev->mf);
	debug("Product      %s\n", dev->prod);
	debug("SerialNumber %s\n", dev->serial);
W
wdenk 已提交
1105
	/* now prode if the device is a hub */
1106
	usb_hub_probe(dev, 0);
W
wdenk 已提交
1107 1108 1109
	return 0;
}

1110
__weak
1111
int board_usb_init(int index, enum usb_init_type init)
1112 1113 1114
{
	return 0;
}
1115 1116 1117 1118 1119 1120

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