diff options
| -rw-r--r-- | common/usb.c | 56 | ||||
| -rw-r--r-- | drivers/usb/usb_ohci.c | 14 | ||||
| -rw-r--r-- | include/usb.h | 16 | 
3 files changed, 47 insertions, 39 deletions
| diff --git a/common/usb.c b/common/usb.c index db65d7db3..7ab5df670 100644 --- a/common/usb.c +++ b/common/usb.c @@ -196,15 +196,16 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,  	if (timeout == 0)  		return (int)size; -	while (timeout--) { -		if (!((volatile unsigned long)dev->status & USB_ST_NOT_PROC)) -			break; -		wait_ms(1); -	} -	if (dev->status == 0) -		return dev->act_len; -	else +	if (dev->status != 0) { +		/* +		 * Let's wait a while for the timeout to elapse. +		 * It has no real use, but it keeps the interface happy. +		 */ +		wait_ms(timeout);  		return -1; +	} + +	return dev->act_len;  }  /*------------------------------------------------------------------- @@ -442,14 +443,14 @@ int usb_get_configuration_no(struct usb_device *dev,  	config = (struct usb_config_descriptor *)&buffer[0]; -	result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 8); -	if (result < 8) { +	result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 9); +	if (result < 9) {  		if (result < 0)  			printf("unable to get descriptor, error %lX\n",  				dev->status);  		else  			printf("config descriptor too short " \ -				"(expected %i, got %i)\n", 8, result); +				"(expected %i, got %i)\n", 9, result);  		return -1;  	}  	tmp = le16_to_cpu(config->wTotalLength); @@ -777,7 +778,7 @@ int usb_new_device(struct usb_device *dev)  	 * 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  */ -	dev->maxpacketsize = 0;		/* Default to 8 byte max packet size */ +	dev->maxpacketsize = PACKET_SIZE_8;  	dev->epmaxpacketin [0] = 8;  	dev->epmaxpacketout[0] = 8; @@ -788,15 +789,12 @@ int usb_new_device(struct usb_device *dev)  		return 1;  	}  #else -	/* this is a Windows scheme of initialization sequence, with double -	 * reset of the device (Linux uses the same sequence, but without double -	 * reset. This double reset is not considered harmful and matches the -	 * Windows behaviour) +	/* This is a Windows scheme of initialization sequence, with double +	 * reset of the device (Linux uses the same sequence)  	 * Some equipment is said to work only with such init sequence; this  	 * patch is based on the work by Alan Stern:  	 * http://sourceforge.net/mailarchive/forum.php?thread_id=5729457&forum_id=5398  	 */ -	int j;  	struct usb_device_descriptor *desc;  	int port = -1;  	struct usb_device *parent = dev->parent; @@ -809,20 +807,22 @@ int usb_new_device(struct usb_device *dev)  	desc = (struct usb_device_descriptor *)tmpbuf;  	dev->descriptor.bMaxPacketSize0 = 64;	    /* Start off at 64 bytes  */ -	dev->maxpacketsize = 64;	/* Default to 64 byte max packet size */ +	/* Default to 64 byte max packet size */ +	dev->maxpacketsize = PACKET_SIZE_64;  	dev->epmaxpacketin [0] = 64;  	dev->epmaxpacketout[0] = 64; -	for (j = 0; j < 3; ++j) { -		err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64); -		if (err < 0) { -			USB_PRINTF("usb_new_device: 64 byte descr\n"); -			break; -		} + +	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64); +	if (err < 0) { +		USB_PRINTF("usb_new_device: usb_get_descriptor() failed\n"); +		return 1;  	} +  	dev->descriptor.bMaxPacketSize0 = desc->bMaxPacketSize0;  	/* find the port number we're at */  	if (parent) { +		int j;  		for (j = 0; j < parent->maxchild; j++) {  			if (parent->children[j] == dev) { @@ -847,10 +847,10 @@ int usb_new_device(struct usb_device *dev)  	dev->epmaxpacketin [0] = dev->descriptor.bMaxPacketSize0;  	dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;  	switch (dev->descriptor.bMaxPacketSize0) { -	case 8: dev->maxpacketsize = 0; break; -	case 16: dev->maxpacketsize = 1; break; -	case 32: dev->maxpacketsize = 2; break; -	case 64: dev->maxpacketsize = 3; break; +	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;  	}  	dev->devnum = addr; diff --git a/drivers/usb/usb_ohci.c b/drivers/usb/usb_ohci.c index 76c6390b1..660b4b32a 100644 --- a/drivers/usb/usb_ohci.c +++ b/drivers/usb/usb_ohci.c @@ -856,8 +856,7 @@ static void td_fill(ohci_t *ohci, unsigned int info,  	td->index = index;  	td->data = (__u32)data;  #ifdef OHCI_FILL_TRACE -	if ((usb_pipetype(urb_priv->pipe) == PIPE_BULK) && -						usb_pipeout(urb_priv->pipe)) { +	if (usb_pipebulk(urb_priv->pipe) && usb_pipeout(urb_priv->pipe)) {  		for (i = 0; i < len; i++)  		printf("td->data[%d] %#2x ", i, ((unsigned char *)td->data)[i]);  		printf("\n"); @@ -983,7 +982,7 @@ static void dl_transfer_length(td_t *td)  	tdBE   = m32_swap(td->hwBE);  	tdCBP  = m32_swap(td->hwCBP); -	if (!(usb_pipetype(lurb_priv->pipe) == PIPE_CONTROL && +	if (!(usb_pipecontrol(lurb_priv->pipe) &&  	    ((td->index == 0) || (td->index == lurb_priv->length - 1)))) {  		if (tdBE != 0) {  			if (td->hwCBP == 0) @@ -1096,8 +1095,7 @@ static int takeback_td(ohci_t *ohci, td_t *td_list)  	dbg("dl_done_list: processing TD %x, len %x\n",  		lurb_priv->td_cnt, lurb_priv->length); -	if (ed->state != ED_NEW && -		(usb_pipetype(lurb_priv->pipe) != PIPE_INTERRUPT)) { +	if (ed->state != ED_NEW && (!usb_pipeint(lurb_priv->pipe))) {  		edHeadP = m32_swap(ed->hwHeadP) & 0xfffffff0;  		edTailP = m32_swap(ed->hwTailP); @@ -1287,7 +1285,7 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,  #else  	wait_ms(1);  #endif -	if ((pipe & PIPE_INTERRUPT) == PIPE_INTERRUPT) { +	if (usb_pipeint(pipe)) {  		info("Root-Hub submit IRQ: NOT implemented");  		return 0;  	} @@ -1538,7 +1536,7 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,  	/* allow more time for a BULK device to react - some are slow */  #define BULK_TO	 5000	/* timeout in milliseconds */ -	if (usb_pipetype(pipe) == PIPE_BULK) +	if (usb_pipebulk(pipe))  		timeout = BULK_TO;  	else  		timeout = 100; @@ -1591,7 +1589,7 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,  #endif  	/* free TDs in urb_priv */ -	if (usb_pipetype(pipe) != PIPE_INTERRUPT) +	if (!usb_pipeint(pipe))  		urb_free_priv(urb);  	return 0;  } diff --git a/include/usb.h b/include/usb.h index e68e98ead..9a2e72c9d 100644 --- a/include/usb.h +++ b/include/usb.h @@ -129,6 +129,13 @@ struct usb_config_descriptor {  	struct usb_interface_descriptor if_desc[USB_MAXINTERFACES];  } __attribute__ ((packed)); +enum { +	/* Maximum packet size; encoded as 0,1,2,3 = 8,16,32,64 */ +	PACKET_SIZE_8   = 0, +	PACKET_SIZE_16  = 1, +	PACKET_SIZE_32  = 2, +	PACKET_SIZE_64  = 3, +};  struct usb_device {  	int devnum;			/* Device number on USB bus */ @@ -137,9 +144,12 @@ struct usb_device {  	char prod[32];			/* product */  	char serial[32];		/* serial number */ -	int maxpacketsize;		/* Maximum packet size; encoded as 0,1,2,3 = 8,16,32,64 */ -	unsigned int toggle[2];		/* one bit for each endpoint ([0] = IN, [1] = OUT) */ -	unsigned int halted[2];		/* endpoint halts; one bit per endpoint # & direction; */ +	/* Maximum packet size; one of: PACKET_SIZE_* */ +	int maxpacketsize; +	/* one bit for each endpoint ([0] = IN, [1] = OUT) */ +	unsigned int toggle[2]; +	/* endpoint halts; one bit per endpoint # & direction; */ +	unsigned int halted[2];  			    /* [0] = IN, [1] = OUT */  	int epmaxpacketin[16];		/* INput endpoint specific maximums */  	int epmaxpacketout[16];		/* OUTput endpoint specific maximums */ |