@ -196,15 +196,16 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
if ( timeout = = 0 )
if ( timeout = = 0 )
return ( int ) size ;
return ( int ) size ;
while ( timeout - - ) {
if ( dev - > status ! = 0 ) {
if ( ! ( ( volatile unsigned long ) dev - > status & USB_ST_NOT_PROC ) )
/*
break ;
* Let ' s wait a while for the timeout to elapse .
wait_ms ( 1 ) ;
* It has no real use , but it keeps the interface happy .
*/
wait_ms ( timeout ) ;
return - 1 ;
}
}
if ( dev - > status = = 0 )
return dev - > act_len ;
return dev - > act_len ;
else
return - 1 ;
}
}
/*-------------------------------------------------------------------
/*-------------------------------------------------------------------
@ -442,14 +443,14 @@ int usb_get_configuration_no(struct usb_device *dev,
config = ( struct usb_config_descriptor * ) & buffer [ 0 ] ;
config = ( struct usb_config_descriptor * ) & buffer [ 0 ] ;
result = usb_get_descriptor ( dev , USB_DT_CONFIG , cfgno , buffer , 8 ) ;
result = usb_get_descriptor ( dev , USB_DT_CONFIG , cfgno , buffer , 9 ) ;
if ( result < 8 ) {
if ( result < 9 ) {
if ( result < 0 )
if ( result < 0 )
printf ( " unable to get descriptor, error %lX \n " ,
printf ( " unable to get descriptor, error %lX \n " ,
dev - > status ) ;
dev - > status ) ;
else
else
printf ( " config descriptor too short " \
printf ( " config descriptor too short " \
" (expected %i, got %i) \n " , 8 , result ) ;
" (expected %i, got %i) \n " , 9 , result ) ;
return - 1 ;
return - 1 ;
}
}
tmp = le16_to_cpu ( config - > wTotalLength ) ;
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
* Several USB stick devices report ERR : CTL_TIMEOUT , caused by an
* invalid header while reading 8 bytes as device descriptor . */
* invalid header while reading 8 bytes as device descriptor . */
dev - > descriptor . bMaxPacketSize0 = 8 ; /* Start off at 8 bytes */
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 - > epmaxpacketin [ 0 ] = 8 ;
dev - > epmaxpacketout [ 0 ] = 8 ;
dev - > epmaxpacketout [ 0 ] = 8 ;
@ -788,15 +789,12 @@ int usb_new_device(struct usb_device *dev)
return 1 ;
return 1 ;
}
}
# else
# else
/* this is a Windows scheme of initialization sequence, with double
/* This is a Windows scheme of initialization sequence, with double
* reset of the device ( Linux uses the same sequence , but without double
* reset of the device ( Linux uses the same sequence )
* reset . This double reset is not considered harmful and matches the
* Windows behaviour )
* Some equipment is said to work only with such init sequence ; this
* Some equipment is said to work only with such init sequence ; this
* patch is based on the work by Alan Stern :
* patch is based on the work by Alan Stern :
* http : //sourceforge.net/mailarchive/forum.php?thread_id=5729457&forum_id=5398
* http : //sourceforge.net/mailarchive/forum.php?thread_id=5729457&forum_id=5398
*/
*/
int j ;
struct usb_device_descriptor * desc ;
struct usb_device_descriptor * desc ;
int port = - 1 ;
int port = - 1 ;
struct usb_device * parent = dev - > parent ;
struct usb_device * parent = dev - > parent ;
@ -809,20 +807,22 @@ int usb_new_device(struct usb_device *dev)
desc = ( struct usb_device_descriptor * ) tmpbuf ;
desc = ( struct usb_device_descriptor * ) tmpbuf ;
dev - > descriptor . bMaxPacketSize0 = 64 ; /* Start off at 64 bytes */
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 - > epmaxpacketin [ 0 ] = 64 ;
dev - > epmaxpacketout [ 0 ] = 64 ;
dev - > epmaxpacketout [ 0 ] = 64 ;
for ( j = 0 ; j < 3 ; + + j ) {
err = usb_get_descriptor ( dev , USB_DT_DEVICE , 0 , desc , 64 ) ;
err = usb_get_descriptor ( dev , USB_DT_DEVICE , 0 , desc , 64 ) ;
if ( err < 0 ) {
if ( err < 0 ) {
USB_PRINTF ( " usb_new_device: 64 byte descr \n " ) ;
USB_PRINTF ( " usb_new_device: usb_get_descriptor() failed \n " ) ;
break ;
return 1 ;
}
}
}
dev - > descriptor . bMaxPacketSize0 = desc - > bMaxPacketSize0 ;
dev - > descriptor . bMaxPacketSize0 = desc - > bMaxPacketSize0 ;
/* find the port number we're at */
/* find the port number we're at */
if ( parent ) {
if ( parent ) {
int j ;
for ( j = 0 ; j < parent - > maxchild ; j + + ) {
for ( j = 0 ; j < parent - > maxchild ; j + + ) {
if ( parent - > children [ j ] = = dev ) {
if ( parent - > children [ j ] = = dev ) {
@ -847,10 +847,10 @@ int usb_new_device(struct usb_device *dev)
dev - > epmaxpacketin [ 0 ] = dev - > descriptor . bMaxPacketSize0 ;
dev - > epmaxpacketin [ 0 ] = dev - > descriptor . bMaxPacketSize0 ;
dev - > epmaxpacketout [ 0 ] = dev - > descriptor . bMaxPacketSize0 ;
dev - > epmaxpacketout [ 0 ] = dev - > descriptor . bMaxPacketSize0 ;
switch ( dev - > descriptor . bMaxPacketSize0 ) {
switch ( dev - > descriptor . bMaxPacketSize0 ) {
case 8 : dev - > maxpacketsize = 0 ; break ;
case 8 : dev - > maxpacketsize = PACKET_SIZE_8 ; break ;
case 16 : dev - > maxpacketsize = 1 ; break ;
case 16 : dev - > maxpacketsize = PACKET_SIZE_16 ; break ;
case 32 : dev - > maxpacketsize = 2 ; break ;
case 32 : dev - > maxpacketsize = PACKET_SIZE_3 2; break ;
case 64 : dev - > maxpacketsize = 3 ; break ;
case 64 : dev - > maxpacketsize = PACKET_SIZE_64 ; break ;
}
}
dev - > devnum = addr ;
dev - > devnum = addr ;