usb.c 29.3 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 ret;
W
wdenk 已提交
63

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

	/* 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 已提交
74
	/* init low_level USB */
75 76 77
	for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
		/* init low_level USB */
		printf("USB%d:   ", i);
78 79 80 81 82 83 84
		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. */
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
			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);

108
		usb_started = 1;
109 110
	}

111
	debug("scan end\n");
112 113 114
	/* 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 已提交
115 116
		return -1;
	}
117 118

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

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

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

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

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

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

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


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

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

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

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

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

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

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

	return dev->act_len;
221

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

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


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

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

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

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

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

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

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

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

	return 0;
}

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

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

	dev->configno = cfgno;
	head = (struct usb_descriptor_header *) &buffer[0];
349 350 351
	if (head->bDescriptorType != USB_DT_CONFIG) {
		printf(" ERROR: NOT USB_CONFIG_DESC %x\n",
			head->bDescriptorType);
W
wdenk 已提交
352 353
		return -1;
	}
354 355 356 357 358
	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);
359
	dev->config.no_of_if = 0;
W
wdenk 已提交
360

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

	return 0;
}

/********************************************************************
 * set configuration number to configuration
 */
M
Marek Vasut 已提交
622
static int usb_set_configuration(struct usb_device *dev, int configuration)
W
wdenk 已提交
623 624
{
	int res;
625
	debug("set configuration %d\n", configuration);
W
wdenk 已提交
626
	/* set setup command */
627 628 629 630 631
	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 已提交
632 633 634
		dev->toggle[0] = 0;
		dev->toggle[1] = 0;
		return 0;
635
	} else
W
wdenk 已提交
636 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
		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
 */
662 663
int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type,
		   unsigned char id, void *buf, int size)
W
wdenk 已提交
664 665
{
	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
666 667 668
			USB_REQ_GET_REPORT,
			USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
			(type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
W
wdenk 已提交
669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684
}

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

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

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

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 已提交
750
		rc = -1;
751 752 753 754 755

	return rc;
}


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

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

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

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

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

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

851 852 853 854 855 856 857 858
/*
 * 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--;
859
	debug("Freeing device node: %d\n", dev_index);
860 861 862
	memset(&usb_dev[dev_index], 0, sizeof(struct usb_device));
	usb_dev[dev_index].devnum = -1;
}
W
wdenk 已提交
863

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

887 888 889 890 891 892 893 894 895 896 897
	/*
	 * 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 已提交
898 899 900
	/* We still haven't set the Address yet */
	addr = dev->devnum;
	dev->devnum = 0;
901

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

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

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

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

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

965 966
	if (parent) {
		/* reset the port for the second time */
967
		err = hub_port_reset(dev->parent, dev->portnr - 1, &portstatus);
968
		if (err < 0) {
969
			printf("\n     Couldn't reset port %i\n", dev->portnr);
970 971 972 973 974
			return 1;
		}
	}
#endif

975
	dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
W
wdenk 已提交
976 977
	dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
	switch (dev->descriptor.bMaxPacketSize0) {
978 979 980 981 982 983 984 985 986 987 988 989
	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 已提交
990 991 992 993 994 995
	}
	dev->devnum = addr;

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

	if (err < 0) {
996 997
		printf("\n      USB device not accepting new address " \
			"(error=%lX)\n", dev->status);
W
wdenk 已提交
998 999 1000
		return 1;
	}

1001
	mdelay(10);	/* Let the SET_ADDRESS settle */
W
wdenk 已提交
1002 1003 1004

	tmp = sizeof(dev->descriptor);

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

1061
__weak
1062
int board_usb_init(int index, enum usb_init_type init)
1063 1064 1065
{
	return 0;
}
W
wdenk 已提交
1066
/* EOF */