usb.c 29.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 <compiler.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 46 47 48
static struct usb_device usb_dev[USB_MAX_DEVICE];
static int dev_index;
static int asynch_allowed;

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

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

/***************************************************************************
 * Init USB Device
 */
int usb_init(void)
{
60 61 62
	void *ctrl;
	struct usb_device *dev;
	int i, start_index = 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 82 83 84 85
		ret = usb_lowlevel_init(i, USB_INIT_HOST, &ctrl);
		if (ret == -ENODEV) {	/* No such device. */
			puts("Port not available.\n");
			continue;
		}

		if (ret) {		/* Other error. */
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
			puts("lowlevel init failed\n");
			continue;
		}
		/*
		 * lowlevel init is OK, now scan the bus for devices
		 * i.e. search HUBs and configure them
		 */
		start_index = dev_index;
		printf("scanning bus %d for devices... ", i);
		dev = usb_alloc_new_device(ctrl);
		/*
		 * device 0 is always present
		 * (root hub, so let it analyze)
		 */
		if (dev)
			usb_new_device(dev);

		if (start_index == dev_index)
			puts("No USB Device found\n");
		else
			printf("%d USB Device(s) found\n",
				dev_index - start_index);

109
		usb_started = 1;
110 111
	}

112
	debug("scan end\n");
113 114 115
	/* if we were not able to find at least one working bus, bail out */
	if (!usb_started) {
		puts("USB error: all controllers failed lowlevel init\n");
W
wdenk 已提交
116 117
		return -1;
	}
118 119

	return 0;
W
wdenk 已提交
120 121 122 123 124 125 126
}

/******************************************************************************
 * Stop USB this stops the LowLevel Part and deregisters USB devices.
 */
int usb_stop(void)
{
127
	int i;
128 129 130 131 132

	if (usb_started) {
		asynch_allowed = 1;
		usb_started = 0;
		usb_hub_reset();
133 134 135 136 137

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

	return 0;
W
wdenk 已提交
141 142 143 144 145
}

/*
 * 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.
146
 * Returns the old value so it can be restored later.
W
wdenk 已提交
147
 */
148
int usb_disable_asynch(int disable)
W
wdenk 已提交
149
{
150 151
	int old_value = asynch_allowed;

152
	asynch_allowed = !disable;
153
	return old_value;
W
wdenk 已提交
154 155 156 157 158 159 160 161 162 163 164 165
}


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

/*
 * submits an Interrupt Message
 */
int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
166
			void *buffer, int transfer_len, int interval)
W
wdenk 已提交
167
{
168
	return submit_int_msg(dev, pipe, buffer, transfer_len, interval);
W
wdenk 已提交
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
}

/*
 * 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 已提交
185
	ALLOC_CACHE_ALIGN_BUFFER(struct devrequest, setup_packet, 1);
186

187 188
	if ((timeout == 0) && (!asynch_allowed)) {
		/* request for a asynch control pipe is not allowed */
W
wdenk 已提交
189
		return -1;
190
	}
191

W
wdenk 已提交
192
	/* set setup command */
P
Puneet Saxena 已提交
193 194 195 196 197
	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);
198 199 200
	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);
201
	dev->status = USB_ST_NOT_PROC; /*not yet processed */
W
wdenk 已提交
202

203 204
	if (submit_control_msg(dev, pipe, data, size, setup_packet) < 0)
		return -1;
205
	if (timeout == 0)
W
wdenk 已提交
206
		return (int)size;
207

208 209 210 211 212 213 214 215
	/*
	 * 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;
216
		mdelay(1);
R
Remy Bohmer 已提交
217
	}
218 219
	if (dev->status)
		return -1;
R
Remy Bohmer 已提交
220 221

	return dev->act_len;
222

W
wdenk 已提交
223 224 225 226 227 228 229 230 231 232 233 234
}

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


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

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

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

	ep = &dev->config.if_desc[if_idx].ep_desc[ep_idx];
287 288

	b = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
289
	ep_wMaxPacketSize = get_unaligned(&ep->wMaxPacketSize);
290 291 292 293

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

W
wdenk 已提交
317 318 319
/*
 * set the max packed value of all endpoints in the given configuration
 */
M
Marek Vasut 已提交
320
static int usb_set_maxpacket(struct usb_device *dev)
W
wdenk 已提交
321
{
322
	int i, ii;
W
wdenk 已提交
323

T
Tom Rix 已提交
324 325
	for (i = 0; i < dev->config.desc.bNumInterfaces; i++)
		for (ii = 0; ii < dev->config.if_desc[i].desc.bNumEndpoints; ii++)
M
Marek Vasut 已提交
326
			usb_set_maxpacket_ep(dev, i, ii);
W
wdenk 已提交
327 328 329 330 331 332 333

	return 0;
}

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

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

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

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

464 465
			debug("unknown Description Type : %x\n",
			      head->bDescriptorType);
466

467
#ifdef DEBUG
468
			{
469
				unsigned char *ch = (unsigned char *)head;
470 471
				int i;

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

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

	result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
496 497
				 USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0,
				 endp, NULL, 0, USB_CNTL_TIMEOUT * 3);
W
wdenk 已提交
498 499 500 501

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

W
Wolfgang Denk 已提交
503
	/*
504 505 506 507
	 * NOTE: we do not get status and verify reset was successful
	 * as some devices are reported to lock up upon this check..
	 */

W
wdenk 已提交
508
	usb_endpoint_running(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe));
509

W
wdenk 已提交
510 511 512 513 514 515 516 517 518
	/* toggle is reset on clear */
	usb_settoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe), 0);
	return 0;
}


/**********************************************************************
 * get_descriptor type
 */
M
Marek Vasut 已提交
519
static int usb_get_descriptor(struct usb_device *dev, unsigned char type,
520
			unsigned char index, void *buf, int size)
W
wdenk 已提交
521 522
{
	int res;
W
Wolfgang Denk 已提交
523
	res = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
W
wdenk 已提交
524 525 526 527 528 529 530 531 532
			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
 */
533 534
int usb_get_configuration_no(struct usb_device *dev,
			     unsigned char *buffer, int cfgno)
W
wdenk 已提交
535
{
W
Wolfgang Denk 已提交
536
	int result;
537
	unsigned int length;
538
	struct usb_config_descriptor *config;
W
wdenk 已提交
539

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

553 554 555
	if (length > USB_BUFSIZ) {
		printf("%s: failed to get descriptor - too long: %d\n",
			__func__, length);
W
wdenk 已提交
556 557 558
		return -1;
	}

559 560 561 562
	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 已提交
563 564 565 566 567 568 569
	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 已提交
570
static int usb_set_address(struct usb_device *dev)
W
wdenk 已提交
571 572 573
{
	int res;

574
	debug("set address %d\n", dev->devnum);
575 576 577 578
	res = usb_control_msg(dev, usb_snddefctrl(dev),
				USB_REQ_SET_ADDRESS, 0,
				(dev->devnum), 0,
				NULL, 0, USB_CNTL_TIMEOUT);
W
wdenk 已提交
579 580 581 582 583 584 585 586
	return res;
}

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

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

610 611 612 613 614
	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 已提交
615 616 617 618 619 620 621 622
		return ret;

	return 0;
}

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

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

/********************************************************************
 * 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 已提交
686
static int usb_get_string(struct usb_device *dev, unsigned short langid,
687
		   unsigned char index, void *buf, int size)
W
wdenk 已提交
688
{
689 690 691 692 693 694 695
	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 已提交
696
			(USB_DT_STRING << 8) + index, langid, buf, size,
697 698 699 700
			USB_CNTL_TIMEOUT);

		if (result > 0)
			break;
W
Wolfgang Denk 已提交
701 702
	}

703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718
	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 已提交
719 720
}

721 722 723 724 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

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)
W
Wolfgang Denk 已提交
751
		rc = -1;
752 753 754 755 756

	return rc;
}


W
wdenk 已提交
757 758 759 760 761 762 763
/********************************************************************
 * 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 已提交
764
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, mybuf, USB_BUFSIZ);
W
wdenk 已提交
765 766 767 768 769 770 771
	unsigned char *tbuf;
	int err;
	unsigned int u, idx;

	if (size <= 0 || !buf || !index)
		return -1;
	buf[0] = 0;
772
	tbuf = &mybuf[0];
W
wdenk 已提交
773 774 775

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

794
	err = usb_string_sub(dev, dev->string_langid, index, tbuf);
W
wdenk 已提交
795 796
	if (err < 0)
		return err;
797

W
wdenk 已提交
798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821
	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
 */
822
struct usb_device *usb_get_dev_index(int index)
W
wdenk 已提交
823
{
824
	if (usb_dev[index].devnum == -1)
W
wdenk 已提交
825 826 827 828 829 830 831 832
		return NULL;
	else
		return &usb_dev[index];
}

/* returns a pointer of a new device structure or NULL, if
 * no device struct is available
 */
833
struct usb_device *usb_alloc_new_device(void *controller)
W
wdenk 已提交
834 835
{
	int i;
836
	debug("New Device %d\n", dev_index);
837 838
	if (dev_index == USB_MAX_DEVICE) {
		printf("ERROR, too many USB Devices, max=%d\n", USB_MAX_DEVICE);
W
wdenk 已提交
839 840
		return NULL;
	}
841 842 843 844 845 846
	/* 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;
847
	usb_dev[dev_index].controller = controller;
W
wdenk 已提交
848
	dev_index++;
849
	return &usb_dev[dev_index - 1];
W
wdenk 已提交
850 851
}

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

865 866 867 868 869 870 871 872 873 874
/*
 * 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 已提交
875 876 877 878 879 880 881
/*
 * 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 已提交
882
int usb_new_device(struct usb_device *dev)
W
wdenk 已提交
883 884 885
{
	int addr, err;
	int tmp;
P
Puneet Saxena 已提交
886
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, tmpbuf, USB_BUFSIZ);
W
wdenk 已提交
887

888 889 890 891 892 893 894 895 896 897 898
	/*
	 * 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");
		return -1;
	}

W
wdenk 已提交
899 900 901
	/* We still haven't set the Address yet */
	addr = dev->devnum;
	dev->devnum = 0;
902

903 904 905 906 907 908 909
#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 已提交
910
	dev->maxpacketsize = PACKET_SIZE_8;
911
	dev->epmaxpacketin[0] = 8;
912 913
	dev->epmaxpacketout[0] = 8;

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

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

946 947 948 949 950 951 952
	/*
	 * 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 已提交
953 954
	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
	if (err < 0) {
955
		debug("usb_new_device: usb_get_descriptor() failed\n");
R
Remy Bohmer 已提交
956
		return 1;
957
	}
R
Remy Bohmer 已提交
958

959
	dev->descriptor.bMaxPacketSize0 = desc->bMaxPacketSize0;
960 961 962 963 964
	/*
	 * Fetch the device class, driver can use this info
	 * to differentiate between HUB and DEVICE.
	 */
	dev->descriptor.bDeviceClass = desc->bDeviceClass;
965
#endif
W
Wolfgang Denk 已提交
966

967
	if (parent) {
R
Remy Bohmer 已提交
968
		int j;
W
Wolfgang Denk 已提交
969

970
		/* find the port number we're at */
971 972 973 974 975 976 977
		for (j = 0; j < parent->maxchild; j++) {
			if (parent->children[j] == dev) {
				port = j;
				break;
			}
		}
		if (port < 0) {
978
			printf("usb_new_device:cannot locate device's port.\n");
979 980 981 982 983 984 985 986 987 988 989 990
			return 1;
		}

		/* reset the port for the second time */
		err = hub_port_reset(dev->parent, port, &portstatus);
		if (err < 0) {
			printf("\n     Couldn't reset port %i\n", port);
			return 1;
		}
	}
#endif

991
	dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
W
wdenk 已提交
992 993
	dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
	switch (dev->descriptor.bMaxPacketSize0) {
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005
	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;
W
wdenk 已提交
1006 1007 1008 1009 1010 1011
	}
	dev->devnum = addr;

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

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

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

	tmp = sizeof(dev->descriptor);

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

1077
__weak
1078
int board_usb_init(int index, enum usb_init_type init)
1079 1080 1081
{
	return 0;
}
W
wdenk 已提交
1082
/* EOF */