usb.c 27.3 KB
Newer Older
W
wdenk 已提交
1 2 3
/*
 *
 * Most of this source has been derived from the Linux USB
4 5 6 7 8 9 10 11 12 13 14 15 16
 * 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 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 *
 */

/*
 * 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 已提交
50
#include <linux/compiler.h>
51
#include <linux/ctype.h>
52
#include <asm/byteorder.h>
53
#include <asm/unaligned.h>
W
wdenk 已提交
54 55 56

#include <usb.h>
#ifdef CONFIG_4xx
57
#include <asm/4xx_pci.h>
W
wdenk 已提交
58 59
#endif

W
wdenk 已提交
60 61
#define USB_BUFSIZ	512

W
wdenk 已提交
62 63 64 65
static struct usb_device usb_dev[USB_MAX_DEVICE];
static int dev_index;
static int asynch_allowed;

66 67
char usb_started; /* flag for the started/stopped USB status */

68 69 70
#ifndef CONFIG_USB_MAX_CONTROLLER_COUNT
#define CONFIG_USB_MAX_CONTROLLER_COUNT 1
#endif
W
wdenk 已提交
71 72 73 74 75 76

/***************************************************************************
 * Init USB Device
 */
int usb_init(void)
{
77 78 79
	void *ctrl;
	struct usb_device *dev;
	int i, start_index = 0;
W
wdenk 已提交
80

81 82
	dev_index = 0;
	asynch_allowed = 1;
W
wdenk 已提交
83
	usb_hub_reset();
84 85 86 87 88 89 90

	/* 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 已提交
91
	/* init low_level USB */
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
	for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
		/* init low_level USB */
		printf("USB%d:   ", i);
		if (usb_lowlevel_init(i, &ctrl)) {
			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);

119
		usb_started = 1;
120 121
	}

122
	debug("scan end\n");
123 124 125
	/* 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 已提交
126 127
		return -1;
	}
128 129

	return 0;
W
wdenk 已提交
130 131 132 133 134 135 136
}

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

	if (usb_started) {
		asynch_allowed = 1;
		usb_started = 0;
		usb_hub_reset();
143 144 145 146 147

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

	return 0;
W
wdenk 已提交
151 152 153 154 155
}

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

162
	asynch_allowed = !disable;
163
	return old_value;
W
wdenk 已提交
164 165 166 167 168 169 170 171 172 173 174 175
}


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

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

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

197 198
	if ((timeout == 0) && (!asynch_allowed)) {
		/* request for a asynch control pipe is not allowed */
W
wdenk 已提交
199
		return -1;
200
	}
201

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

213 214
	if (submit_control_msg(dev, pipe, data, size, setup_packet) < 0)
		return -1;
215
	if (timeout == 0)
W
wdenk 已提交
216
		return (int)size;
217

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

	return dev->act_len;
232

W
wdenk 已提交
233 234 235 236 237 238 239 240 241 242 243 244
}

/*-------------------------------------------------------------------
 * 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;
245
	dev->status = USB_ST_NOT_PROC; /*not yet processed */
246 247
	if (submit_bulk_msg(dev, pipe, data, len) < 0)
		return -1;
248 249
	while (timeout--) {
		if (!((volatile unsigned long)dev->status & USB_ST_NOT_PROC))
W
wdenk 已提交
250
			break;
251
		mdelay(1);
W
wdenk 已提交
252
	}
253 254
	*actual_length = dev->act_len;
	if (dev->status == 0)
W
wdenk 已提交
255 256 257 258 259 260 261 262 263 264 265 266 267 268
		return 0;
	else
		return -1;
}


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

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

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

	ep = &dev->config.if_desc[if_idx].ep_desc[ep_idx];
297 298

	b = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
299
	ep_wMaxPacketSize = get_unaligned(&ep->wMaxPacketSize);
300 301 302 303

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

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

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

	return 0;
}

/*******************************************************************************
 * Parse the config, located in buffer, and fills the dev->config structure.
 * Note that all little/big endian swapping are done automatically.
 */
M
Marek Vasut 已提交
345 346
static int usb_parse_config(struct usb_device *dev,
			unsigned char *buffer, int cfgno)
W
wdenk 已提交
347 348
{
	struct usb_descriptor_header *head;
349
	int index, ifno, epno, curr_if_num;
350
	u16 ep_wMaxPacketSize;
351 352 353 354 355 356 357

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

	dev->configno = cfgno;
	head = (struct usb_descriptor_header *) &buffer[0];
358 359 360
	if (head->bDescriptorType != USB_DT_CONFIG) {
		printf(" ERROR: NOT USB_CONFIG_DESC %x\n",
			head->bDescriptorType);
W
wdenk 已提交
361 362
		return -1;
	}
363
	memcpy(&dev->config, buffer, buffer[0]);
T
Tom Rix 已提交
364
	le16_to_cpus(&(dev->config.desc.wTotalLength));
365
	dev->config.no_of_if = 0;
W
wdenk 已提交
366

T
Tom Rix 已提交
367
	index = dev->config.desc.bLength;
368 369
	/* Ok the first entry must be a configuration entry,
	 * now process the others */
370
	head = (struct usb_descriptor_header *) &buffer[index];
T
Tom Rix 已提交
371
	while (index + 1 < dev->config.desc.wTotalLength) {
372 373 374 375 376 377 378 379
		switch (head->bDescriptorType) {
		case USB_DT_INTERFACE:
			if (((struct usb_interface_descriptor *) \
			     &buffer[index])->bInterfaceNumber != curr_if_num) {
				/* this is a new interface, copy new desc */
				ifno = dev->config.no_of_if;
				dev->config.no_of_if++;
				memcpy(&dev->config.if_desc[ifno],
380
					&buffer[index], buffer[index]);
381 382 383
				dev->config.if_desc[ifno].no_of_ep = 0;
				dev->config.if_desc[ifno].num_altsetting = 1;
				curr_if_num =
T
Tom Rix 已提交
384
				     dev->config.if_desc[ifno].desc.bInterfaceNumber;
385 386 387 388 389 390 391 392 393 394 395
			} else {
				/* found alternate setting for the interface */
				dev->config.if_desc[ifno].num_altsetting++;
			}
			break;
		case USB_DT_ENDPOINT:
			epno = dev->config.if_desc[ifno].no_of_ep;
			/* found an endpoint */
			dev->config.if_desc[ifno].no_of_ep++;
			memcpy(&dev->config.if_desc[ifno].ep_desc[epno],
				&buffer[index], buffer[index]);
396 397 398 399 400 401 402 403 404
			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);
405
			debug("if %d, ep %d\n", ifno, epno);
406 407 408 409 410
			break;
		default:
			if (head->bLength == 0)
				return 1;

411 412
			debug("unknown Description Type : %x\n",
			      head->bDescriptorType);
413

414
#ifdef DEBUG
415
			{
416
				unsigned char *ch = (unsigned char *)head;
417 418
				int i;

419
				for (i = 0; i < head->bLength; i++)
420 421
					debug("%02X ", *ch++);
				debug("\n\n\n");
422
			}
423
#endif
424
			break;
W
wdenk 已提交
425
		}
426 427
		index += head->bLength;
		head = (struct usb_descriptor_header *)&buffer[index];
W
wdenk 已提交
428 429 430 431 432 433 434 435 436 437 438 439
	}
	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;
440
	int endp = usb_pipeendpoint(pipe)|(usb_pipein(pipe)<<7);
W
wdenk 已提交
441 442

	result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
443 444
				 USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0,
				 endp, NULL, 0, USB_CNTL_TIMEOUT * 3);
W
wdenk 已提交
445 446 447 448

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

W
Wolfgang Denk 已提交
450
	/*
451 452 453 454
	 * NOTE: we do not get status and verify reset was successful
	 * as some devices are reported to lock up upon this check..
	 */

W
wdenk 已提交
455
	usb_endpoint_running(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe));
456

W
wdenk 已提交
457 458 459 460 461 462 463 464 465
	/* toggle is reset on clear */
	usb_settoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe), 0);
	return 0;
}


/**********************************************************************
 * get_descriptor type
 */
M
Marek Vasut 已提交
466
static int usb_get_descriptor(struct usb_device *dev, unsigned char type,
467
			unsigned char index, void *buf, int size)
W
wdenk 已提交
468 469
{
	int res;
W
Wolfgang Denk 已提交
470
	res = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
W
wdenk 已提交
471 472 473 474 475 476 477 478 479
			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
 */
480 481
int usb_get_configuration_no(struct usb_device *dev,
			     unsigned char *buffer, int cfgno)
W
wdenk 已提交
482
{
W
Wolfgang Denk 已提交
483
	int result;
W
wdenk 已提交
484
	unsigned int tmp;
485
	struct usb_config_descriptor *config;
W
wdenk 已提交
486

487
	config = (struct usb_config_descriptor *)&buffer[0];
R
Remy Bohmer 已提交
488 489
	result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 9);
	if (result < 9) {
W
wdenk 已提交
490
		if (result < 0)
491 492
			printf("unable to get descriptor, error %lX\n",
				dev->status);
W
wdenk 已提交
493
		else
494
			printf("config descriptor too short " \
R
Remy Bohmer 已提交
495
				"(expected %i, got %i)\n", 9, result);
W
wdenk 已提交
496 497
		return -1;
	}
498
	tmp = le16_to_cpu(config->wTotalLength);
W
wdenk 已提交
499

W
wdenk 已提交
500
	if (tmp > USB_BUFSIZ) {
501 502
		printf("usb_get_configuration_no: failed to get " \
		       "descriptor - too long: %d\n", tmp);
W
wdenk 已提交
503 504 505
		return -1;
	}

W
wdenk 已提交
506
	result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, tmp);
507
	debug("get_conf_no %d Result %d, wLength %d\n", cfgno, result, tmp);
W
wdenk 已提交
508 509 510 511 512 513 514
	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 已提交
515
static int usb_set_address(struct usb_device *dev)
W
wdenk 已提交
516 517 518
{
	int res;

519
	debug("set address %d\n", dev->devnum);
520 521 522 523
	res = usb_control_msg(dev, usb_snddefctrl(dev),
				USB_REQ_SET_ADDRESS, 0,
				(dev->devnum), 0,
				NULL, 0, USB_CNTL_TIMEOUT);
W
wdenk 已提交
524 525 526 527 528 529 530 531
	return res;
}

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

T
Tom Rix 已提交
535 536
	for (i = 0; i < dev->config.desc.bNumInterfaces; i++) {
		if (dev->config.if_desc[i].desc.bInterfaceNumber == interface) {
W
wdenk 已提交
537 538 539 540 541 542 543 544
			if_face = &dev->config.if_desc[i];
			break;
		}
	}
	if (!if_face) {
		printf("selecting invalid interface %d", interface);
		return -1;
	}
545 546
	/*
	 * We should return now for devices with only one alternate setting.
547 548 549 550
	 * 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.
551 552 553
	 */
	if (if_face->num_altsetting == 1)
		return 0;
W
wdenk 已提交
554

555 556 557 558 559
	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 已提交
560 561 562 563 564 565 566 567
		return ret;

	return 0;
}

/********************************************************************
 * set configuration number to configuration
 */
M
Marek Vasut 已提交
568
static int usb_set_configuration(struct usb_device *dev, int configuration)
W
wdenk 已提交
569 570
{
	int res;
571
	debug("set configuration %d\n", configuration);
W
wdenk 已提交
572
	/* set setup command */
573 574 575 576 577
	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 已提交
578 579 580
		dev->toggle[0] = 0;
		dev->toggle[1] = 0;
		return 0;
581
	} else
W
wdenk 已提交
582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607
		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
 */
608 609
int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type,
		   unsigned char id, void *buf, int size)
W
wdenk 已提交
610 611
{
	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
612 613 614
			USB_REQ_GET_REPORT,
			USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
			(type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
W
wdenk 已提交
615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630
}

/********************************************************************
 * 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 已提交
631
static int usb_get_string(struct usb_device *dev, unsigned short langid,
632
		   unsigned char index, void *buf, int size)
W
wdenk 已提交
633
{
634 635 636 637 638 639 640
	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 已提交
641
			(USB_DT_STRING << 8) + index, langid, buf, size,
642 643 644 645
			USB_CNTL_TIMEOUT);

		if (result > 0)
			break;
W
Wolfgang Denk 已提交
646 647
	}

648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663
	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 已提交
664 665
}

666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695

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 已提交
696
		rc = -1;
697 698 699 700 701

	return rc;
}


W
wdenk 已提交
702 703 704 705 706 707 708
/********************************************************************
 * 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 已提交
709
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, mybuf, USB_BUFSIZ);
W
wdenk 已提交
710 711 712 713 714 715 716
	unsigned char *tbuf;
	int err;
	unsigned int u, idx;

	if (size <= 0 || !buf || !index)
		return -1;
	buf[0] = 0;
717
	tbuf = &mybuf[0];
W
wdenk 已提交
718 719 720

	/* get langid for strings if it's not yet known */
	if (!dev->have_langid) {
721
		err = usb_string_sub(dev, 0, 0, tbuf);
W
wdenk 已提交
722
		if (err < 0) {
723 724
			debug("error getting string descriptor 0 " \
			      "(error=%lx)\n", dev->status);
W
wdenk 已提交
725 726
			return -1;
		} else if (tbuf[0] < 4) {
727
			debug("string descriptor 0 too short\n");
W
wdenk 已提交
728 729 730
			return -1;
		} else {
			dev->have_langid = -1;
731
			dev->string_langid = tbuf[2] | (tbuf[3] << 8);
W
wdenk 已提交
732
				/* always use the first langid listed */
733 734 735
			debug("USB device number %d default " \
			      "language ID 0x%x\n",
			      dev->devnum, dev->string_langid);
W
wdenk 已提交
736 737
		}
	}
W
wdenk 已提交
738

739
	err = usb_string_sub(dev, dev->string_langid, index, tbuf);
W
wdenk 已提交
740 741
	if (err < 0)
		return err;
742

W
wdenk 已提交
743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766
	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
 */
767
struct usb_device *usb_get_dev_index(int index)
W
wdenk 已提交
768
{
769
	if (usb_dev[index].devnum == -1)
W
wdenk 已提交
770 771 772 773 774 775 776 777
		return NULL;
	else
		return &usb_dev[index];
}

/* returns a pointer of a new device structure or NULL, if
 * no device struct is available
 */
778
struct usb_device *usb_alloc_new_device(void *controller)
W
wdenk 已提交
779 780
{
	int i;
781
	debug("New Device %d\n", dev_index);
782 783
	if (dev_index == USB_MAX_DEVICE) {
		printf("ERROR, too many USB Devices, max=%d\n", USB_MAX_DEVICE);
W
wdenk 已提交
784 785
		return NULL;
	}
786 787 788 789 790 791
	/* 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;
792
	usb_dev[dev_index].controller = controller;
W
wdenk 已提交
793
	dev_index++;
794
	return &usb_dev[dev_index - 1];
W
wdenk 已提交
795 796
}

797 798 799 800 801 802 803 804
/*
 * 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--;
805
	debug("Freeing device node: %d\n", dev_index);
806 807 808
	memset(&usb_dev[dev_index], 0, sizeof(struct usb_device));
	usb_dev[dev_index].devnum = -1;
}
W
wdenk 已提交
809 810 811 812 813 814 815 816

/*
 * 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 已提交
817
int usb_new_device(struct usb_device *dev)
W
wdenk 已提交
818 819 820
{
	int addr, err;
	int tmp;
P
Puneet Saxena 已提交
821
	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, tmpbuf, USB_BUFSIZ);
W
wdenk 已提交
822 823 824 825

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

827 828 829 830 831 832 833
#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 已提交
834
	dev->maxpacketsize = PACKET_SIZE_8;
835
	dev->epmaxpacketin[0] = 8;
836 837
	dev->epmaxpacketout[0] = 8;

838
	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, tmpbuf, 8);
839 840
	if (err < 8) {
		printf("\n      USB device not responding, " \
841
		       "giving up (status=%lX)\n", dev->status);
842 843
		return 1;
	}
844
	memcpy(&dev->descriptor, tmpbuf, 8);
845
#else
R
Remy Bohmer 已提交
846 847
	/* This is a Windows scheme of initialization sequence, with double
	 * reset of the device (Linux uses the same sequence)
848 849
	 * Some equipment is said to work only with such init sequence; this
	 * patch is based on the work by Alan Stern:
850 851
	 * http://sourceforge.net/mailarchive/forum.php?
	 * thread_id=5729457&forum_id=5398
852 853 854 855 856 857 858 859 860
	 */
	struct usb_device_descriptor *desc;
	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
861
	 * some more, or keeps on retransmitting the 8 byte header. */
862 863

	desc = (struct usb_device_descriptor *)tmpbuf;
864
	dev->descriptor.bMaxPacketSize0 = 64;	    /* Start off at 64 bytes  */
R
Remy Bohmer 已提交
865 866
	/* Default to 64 byte max packet size */
	dev->maxpacketsize = PACKET_SIZE_64;
867
	dev->epmaxpacketin[0] = 64;
868
	dev->epmaxpacketout[0] = 64;
R
Remy Bohmer 已提交
869 870 871

	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
	if (err < 0) {
872
		debug("usb_new_device: usb_get_descriptor() failed\n");
R
Remy Bohmer 已提交
873
		return 1;
874
	}
R
Remy Bohmer 已提交
875

876
	dev->descriptor.bMaxPacketSize0 = desc->bMaxPacketSize0;
W
Wolfgang Denk 已提交
877

878 879
	/* find the port number we're at */
	if (parent) {
R
Remy Bohmer 已提交
880
		int j;
W
Wolfgang Denk 已提交
881

882 883 884 885 886 887 888
		for (j = 0; j < parent->maxchild; j++) {
			if (parent->children[j] == dev) {
				port = j;
				break;
			}
		}
		if (port < 0) {
889
			printf("usb_new_device:cannot locate device's port.\n");
890 891 892 893 894 895 896 897 898 899 900 901
			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

902
	dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
W
wdenk 已提交
903 904
	dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
	switch (dev->descriptor.bMaxPacketSize0) {
905 906 907 908 909 910 911 912 913 914 915 916
	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 已提交
917 918 919 920 921 922
	}
	dev->devnum = addr;

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

	if (err < 0) {
923 924
		printf("\n      USB device not accepting new address " \
			"(error=%lX)\n", dev->status);
W
wdenk 已提交
925 926 927
		return 1;
	}

928
	mdelay(10);	/* Let the SET_ADDRESS settle */
W
wdenk 已提交
929 930 931

	tmp = sizeof(dev->descriptor);

932
	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
933
				 tmpbuf, sizeof(dev->descriptor));
W
wdenk 已提交
934 935
	if (err < tmp) {
		if (err < 0)
936 937
			printf("unable to get device descriptor (error=%d)\n",
			       err);
W
wdenk 已提交
938
		else
939 940
			printf("USB device descriptor short read " \
				"(expected %i, got %i)\n", tmp, err);
W
wdenk 已提交
941 942
		return 1;
	}
943
	memcpy(&dev->descriptor, tmpbuf, sizeof(dev->descriptor));
W
wdenk 已提交
944
	/* correct le values */
945 946 947 948
	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 已提交
949
	/* only support for one config for now */
950 951 952 953 954 955 956
	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 已提交
957
	usb_parse_config(dev, tmpbuf, 0);
W
wdenk 已提交
958 959
	usb_set_maxpacket(dev);
	/* we set the default configuration here */
T
Tom Rix 已提交
960
	if (usb_set_configuration(dev, dev->config.desc.bConfigurationValue)) {
961 962
		printf("failed to set default configuration " \
			"len %d, status %lX\n", dev->act_len, dev->status);
W
wdenk 已提交
963 964
		return -1;
	}
965 966 967
	debug("new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
	      dev->descriptor.iManufacturer, dev->descriptor.iProduct,
	      dev->descriptor.iSerialNumber);
W
wdenk 已提交
968 969 970 971
	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)
972 973
		usb_string(dev, dev->descriptor.iManufacturer,
			   dev->mf, sizeof(dev->mf));
W
wdenk 已提交
974
	if (dev->descriptor.iProduct)
975 976
		usb_string(dev, dev->descriptor.iProduct,
			   dev->prod, sizeof(dev->prod));
W
wdenk 已提交
977
	if (dev->descriptor.iSerialNumber)
978 979
		usb_string(dev, dev->descriptor.iSerialNumber,
			   dev->serial, sizeof(dev->serial));
980 981 982
	debug("Manufacturer %s\n", dev->mf);
	debug("Product      %s\n", dev->prod);
	debug("SerialNumber %s\n", dev->serial);
W
wdenk 已提交
983
	/* now prode if the device is a hub */
984
	usb_hub_probe(dev, 0);
W
wdenk 已提交
985 986 987 988
	return 0;
}

/* EOF */