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

W
wdenk 已提交
43 44
#define USB_BUFSIZ	512

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

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

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

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

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

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

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

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

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

119
		usb_started = 1;
120 121
	}

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

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

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

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

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

	return 0;
W
wdenk 已提交
149 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
/******************************************************************************
 * 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 已提交
177 178 179
/*
 * 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.
180
 * Returns the old value so it can be restored later.
W
wdenk 已提交
181
 */
182
int usb_disable_asynch(int disable)
W
wdenk 已提交
183
{
184 185
	int old_value = asynch_allowed;

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


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

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

/*
 * 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 已提交
220
	ALLOC_CACHE_ALIGN_BUFFER(struct devrequest, setup_packet, 1);
221
	int err;
222

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

W
wdenk 已提交
228
	/* set setup command */
P
Puneet Saxena 已提交
229 230 231 232 233
	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);
234 235 236
	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);
237
	dev->status = USB_ST_NOT_PROC; /*not yet processed */
W
wdenk 已提交
238

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

245 246 247 248 249 250 251 252
	/*
	 * 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;
253
		mdelay(1);
R
Remy Bohmer 已提交
254
	}
255 256
	if (dev->status)
		return -1;
R
Remy Bohmer 已提交
257 258

	return dev->act_len;
259

W
wdenk 已提交
260 261 262 263
}

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


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

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

M
Marek Vasut 已提交
305 306
/*
 * The routine usb_set_maxpacket_ep() is extracted from the loop of routine
307 308 309 310 311 312
 * 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 已提交
313 314
 *
 * NOTE: Similar behaviour was observed with GCC4.6 on ARMv5.
315
 */
M
Mike Frysinger 已提交
316
static void noinline
M
Marek Vasut 已提交
317
usb_set_maxpacket_ep(struct usb_device *dev, int if_idx, int ep_idx)
318 319
{
	int b;
M
Marek Vasut 已提交
320
	struct usb_endpoint_descriptor *ep;
321
	u16 ep_wMaxPacketSize;
M
Marek Vasut 已提交
322 323

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

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

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

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

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

	return 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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


/**********************************************************************
 * get_descriptor type
 */
M
Marek Vasut 已提交
556
static int usb_get_descriptor(struct usb_device *dev, unsigned char type,
557
			unsigned char index, void *buf, int size)
W
wdenk 已提交
558 559
{
	int res;
W
Wolfgang Denk 已提交
560
	res = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
W
wdenk 已提交
561 562 563 564 565 566 567 568 569
			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
 */
570 571
int usb_get_configuration_no(struct usb_device *dev,
			     unsigned char *buffer, int cfgno)
W
wdenk 已提交
572
{
W
Wolfgang Denk 已提交
573
	int result;
574
	unsigned int length;
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
	length = le16_to_cpu(config->wTotalLength);
W
wdenk 已提交
589

590 591 592
	if (length > USB_BUFSIZ) {
		printf("%s: failed to get descriptor - too long: %d\n",
			__func__, length);
593
		return -EIO;
W
wdenk 已提交
594 595
	}

596 597 598 599
	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 已提交
600 601 602 603 604 605 606
	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 已提交
607
static int usb_set_address(struct usb_device *dev)
W
wdenk 已提交
608 609 610
{
	int res;

611
	debug("set address %d\n", dev->devnum);
612 613 614 615
	res = usb_control_msg(dev, usb_snddefctrl(dev),
				USB_REQ_SET_ADDRESS, 0,
				(dev->devnum), 0,
				NULL, 0, USB_CNTL_TIMEOUT);
W
wdenk 已提交
616 617 618 619 620 621 622 623
	return res;
}

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

T
Tom Rix 已提交
627 628
	for (i = 0; i < dev->config.desc.bNumInterfaces; i++) {
		if (dev->config.if_desc[i].desc.bInterfaceNumber == interface) {
W
wdenk 已提交
629 630 631 632 633 634
			if_face = &dev->config.if_desc[i];
			break;
		}
	}
	if (!if_face) {
		printf("selecting invalid interface %d", interface);
635
		return -EINVAL;
W
wdenk 已提交
636
	}
637 638
	/*
	 * We should return now for devices with only one alternate setting.
639 640 641 642
	 * 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.
643 644 645
	 */
	if (if_face->num_altsetting == 1)
		return 0;
W
wdenk 已提交
646

647 648 649 650 651
	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 已提交
652 653 654 655 656 657 658 659
		return ret;

	return 0;
}

/********************************************************************
 * set configuration number to configuration
 */
M
Marek Vasut 已提交
660
static int usb_set_configuration(struct usb_device *dev, int configuration)
W
wdenk 已提交
661 662
{
	int res;
663
	debug("set configuration %d\n", configuration);
W
wdenk 已提交
664
	/* set setup command */
665 666 667 668 669
	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 已提交
670 671 672
		dev->toggle[0] = 0;
		dev->toggle[1] = 0;
		return 0;
673
	} else
674
		return -EIO;
W
wdenk 已提交
675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699
}

/********************************************************************
 * 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
 */
700 701
int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type,
		   unsigned char id, void *buf, int size)
W
wdenk 已提交
702 703
{
	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
704 705 706
			USB_REQ_GET_REPORT,
			USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
			(type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
W
wdenk 已提交
707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722
}

/********************************************************************
 * 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 已提交
723
static int usb_get_string(struct usb_device *dev, unsigned short langid,
724
		   unsigned char index, void *buf, int size)
W
wdenk 已提交
725
{
726 727 728 729 730 731 732
	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 已提交
733
			(USB_DT_STRING << 8) + index, langid, buf, size,
734 735 736 737
			USB_CNTL_TIMEOUT);

		if (result > 0)
			break;
W
Wolfgang Denk 已提交
738 739
	}

740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755
	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 已提交
756 757
}

758 759 760 761 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

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)
788
		rc = -EINVAL;
789 790 791 792 793

	return rc;
}


W
wdenk 已提交
794 795 796 797 798 799 800
/********************************************************************
 * 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 已提交
801
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, mybuf, USB_BUFSIZ);
W
wdenk 已提交
802 803 804 805 806
	unsigned char *tbuf;
	int err;
	unsigned int u, idx;

	if (size <= 0 || !buf || !index)
807
		return -EINVAL;
W
wdenk 已提交
808
	buf[0] = 0;
809
	tbuf = &mybuf[0];
W
wdenk 已提交
810 811 812

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

831
	err = usb_string_sub(dev, dev->string_langid, index, tbuf);
W
wdenk 已提交
832 833
	if (err < 0)
		return err;
834

W
wdenk 已提交
835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854
	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].
 */

855
#ifndef CONFIG_DM_USB
W
wdenk 已提交
856 857 858 859

/* returns a pointer to the device with the index [index].
 * if the device is not assigned (dev->devnum==-1) returns NULL
 */
860
struct usb_device *usb_get_dev_index(int index)
W
wdenk 已提交
861
{
862
	if (usb_dev[index].devnum == -1)
W
wdenk 已提交
863 864 865 866 867
		return NULL;
	else
		return &usb_dev[index];
}

868
int usb_alloc_new_device(struct udevice *controller, struct usb_device **devp)
W
wdenk 已提交
869 870
{
	int i;
871
	debug("New Device %d\n", dev_index);
872 873
	if (dev_index == USB_MAX_DEVICE) {
		printf("ERROR, too many USB Devices, max=%d\n", USB_MAX_DEVICE);
874
		return -ENOSPC;
W
wdenk 已提交
875
	}
876 877 878 879 880 881
	/* 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;
882
	usb_dev[dev_index].controller = controller;
W
wdenk 已提交
883
	dev_index++;
884 885 886
	*devp = &usb_dev[dev_index - 1];

	return 0;
W
wdenk 已提交
887 888
}

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

902 903 904 905 906 907 908 909 910 911
/*
 * 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;
}
912
#endif /* !CONFIG_DM_USB */
S
Simon Glass 已提交
913

914
static int usb_legacy_port_reset(struct usb_device *hub, int portnr)
S
Simon Glass 已提交
915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932
{
	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;
}

933
static int get_descriptor_len(struct usb_device *dev, int len, int expect_len)
W
wdenk 已提交
934
{
935
	__maybe_unused struct usb_device_descriptor *desc;
P
Puneet Saxena 已提交
936
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, tmpbuf, USB_BUFSIZ);
937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959
	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)
{
960 961
	/*
	 * This is a Windows scheme of initialization sequence, with double
R
Remy Bohmer 已提交
962
	 * reset of the device (Linux uses the same sequence)
963 964
	 * Some equipment is said to work only with such init sequence; this
	 * patch is based on the work by Alan Stern:
965 966
	 * http://sourceforge.net/mailarchive/forum.php?
	 * thread_id=5729457&forum_id=5398
967 968
	 */

969 970
	/*
	 * send 64-byte GET-DEVICE-DESCRIPTOR request.  Since the descriptor is
971 972
	 * 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
973 974
	 * some more, or keeps on retransmitting the 8 byte header.
	 */
975

976 977 978 979 980 981 982 983 984
	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 已提交
985

986 987
	if (do_read) {
		int err;
S
Simon Glass 已提交
988

989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003
		/*
		 * 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.
		 */
1004 1005 1006
		err = get_descriptor_len(dev, 64, 8);
		if (err)
			return err;
1007
	}
R
Remy Bohmer 已提交
1008

1009
	dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
W
wdenk 已提交
1010 1011
	dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
	switch (dev->descriptor.bMaxPacketSize0) {
1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
	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;
1024 1025 1026
	default:
		printf("usb_new_device: invalid max packet size\n");
		return -EIO;
W
wdenk 已提交
1027
	}
1028 1029 1030 1031

	return 0;
}

1032 1033
static int usb_prepare_device(struct usb_device *dev, int addr, bool do_read,
			      struct usb_device *parent, int portnr)
1034
{
1035
	int err;
1036 1037 1038 1039 1040 1041 1042

	/*
	 * 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
	 */
1043 1044
	err = usb_alloc_device(dev);
	if (err) {
1045
		printf("Cannot allocate device context to get SLOT_ID\n");
1046
		return err;
1047 1048 1049 1050
	}
	err = usb_setup_descriptor(dev, do_read);
	if (err)
		return err;
1051
	err = usb_legacy_port_reset(parent, portnr);
1052 1053 1054
	if (err)
		return err;

W
wdenk 已提交
1055 1056 1057 1058 1059
	dev->devnum = addr;

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

	if (err < 0) {
1060 1061
		printf("\n      USB device not accepting new address " \
			"(error=%lX)\n", dev->status);
1062
		return err;
W
wdenk 已提交
1063 1064
	}

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

1067 1068 1069
	return 0;
}

1070
int usb_select_config(struct usb_device *dev)
1071 1072
{
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, tmpbuf, USB_BUFSIZ);
1073
	int err;
1074

1075 1076 1077
	err = get_descriptor_len(dev, USB_DT_DEVICE_SIZE, USB_DT_DEVICE_SIZE);
	if (err)
		return err;
W
wdenk 已提交
1078 1079

	/* correct le values */
1080 1081 1082 1083
	le16_to_cpus(&dev->descriptor.bcdUSB);
	le16_to_cpus(&dev->descriptor.idVendor);
	le16_to_cpus(&dev->descriptor.idProduct);
	le16_to_cpus(&dev->descriptor.bcdDevice);
1084

W
wdenk 已提交
1085
	/* only support for one config for now */
1086 1087 1088 1089 1090
	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);
1091
		return err;
1092
	}
P
Puneet Saxena 已提交
1093
	usb_parse_config(dev, tmpbuf, 0);
W
wdenk 已提交
1094
	usb_set_maxpacket(dev);
1095 1096 1097 1098 1099 1100 1101
	/*
	 * 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) {
1102 1103
		printf("failed to set default configuration " \
			"len %d, status %lX\n", dev->act_len, dev->status);
1104
		return err;
W
wdenk 已提交
1105
	}
1106 1107 1108
	debug("new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
	      dev->descriptor.iManufacturer, dev->descriptor.iProduct,
	      dev->descriptor.iSerialNumber);
W
wdenk 已提交
1109 1110 1111 1112
	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)
1113 1114
		usb_string(dev, dev->descriptor.iManufacturer,
			   dev->mf, sizeof(dev->mf));
W
wdenk 已提交
1115
	if (dev->descriptor.iProduct)
1116 1117
		usb_string(dev, dev->descriptor.iProduct,
			   dev->prod, sizeof(dev->prod));
W
wdenk 已提交
1118
	if (dev->descriptor.iSerialNumber)
1119 1120
		usb_string(dev, dev->descriptor.iSerialNumber,
			   dev->serial, sizeof(dev->serial));
1121 1122 1123
	debug("Manufacturer %s\n", dev->mf);
	debug("Product      %s\n", dev->prod);
	debug("SerialNumber %s\n", dev->serial);
1124 1125 1126 1127

	return 0;
}

1128 1129
int usb_setup_device(struct usb_device *dev, bool do_read,
		     struct usb_device *parent, int portnr)
1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145
{
	int addr;
	int ret;

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

	ret = usb_prepare_device(dev, addr, do_read, parent, portnr);
	if (ret)
		return ret;
	ret = usb_select_config(dev);

	return ret;
}

1146
#ifndef CONFIG_DM_USB
1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176
/*
 * 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.
	 */
#ifdef CONFIG_USB_XHCI
	do_read = false;
#endif
	err = usb_setup_device(dev, do_read, dev->parent, dev->portnr);
	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 已提交
1177 1178
	return 0;
}
1179
#endif
W
wdenk 已提交
1180

1181
__weak
1182
int board_usb_init(int index, enum usb_init_type init)
1183 1184 1185
{
	return 0;
}
1186 1187 1188 1189 1190 1191

__weak
int board_usb_cleanup(int index, enum usb_init_type init)
{
	return 0;
}
1192 1193 1194 1195 1196 1197 1198 1199 1200 1201

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
}

W
wdenk 已提交
1202
/* EOF */