@ -150,12 +150,17 @@ struct us_data {
unsigned int irqpipe ; /* pipe for release_irq */
unsigned char irqmaxp ; /* max packed for irq Pipe */
unsigned char irqinterval ; /* Intervall for IRQ Pipe */
unsigned long max_xfer_blk ; /* Max blocks per xfer */
ccb * srb ; /* current srb */
trans_reset transport_reset ; /* reset routine */
trans_cmnd transport ; /* transport routine */
} ;
/*
* The U - Boot EHCI driver cannot handle more than 5 page aligned buffers
* of 4096 bytes in a transfer without running itself out of qt_buffers
*/
# define USB_MAX_XFER_BLK(start, blksz) (((4096 * 5) - (start % 4096)) / blksz)
static struct us_data usb_stor [ USB_MAX_STOR_DEV ] ;
@ -1041,7 +1046,7 @@ static void usb_bin_fixup(struct usb_device_descriptor descriptor,
unsigned long usb_stor_read ( int device , unsigned long blknr ,
unsigned long blkcnt , void * buffer )
{
unsigned long start , blks , buf_addr ;
unsigned long start , blks , buf_addr , max_xfer_blk ;
unsigned short smallblks ;
struct usb_device * dev ;
struct us_data * ss ;
@ -1083,12 +1088,14 @@ unsigned long usb_stor_read(int device, unsigned long blknr,
/* XXX need some comment here */
retry = 2 ;
srb - > pdata = ( unsigned char * ) buf_addr ;
if ( blks > ss - > max_xfer_blk )
smallblks = ss - > max_xfer_blk ;
max_xfer_blk = USB_MAX_XFER_BLK ( buf_addr ,
usb_dev_desc [ device ] . blksz ) ;
if ( blks > max_xfer_blk )
smallblks = ( unsigned short ) max_xfer_blk ;
else
smallblks = ( unsigned short ) blks ;
retry_it :
if ( smallblks = = ss - > max_xfer_blk )
if ( smallblks = = max_xfer_blk )
usb_show_progress ( ) ;
srb - > datalen = usb_dev_desc [ device ] . blksz * smallblks ;
srb - > pdata = ( unsigned char * ) buf_addr ;
@ -1109,7 +1116,7 @@ retry_it:
start , smallblks , buf_addr ) ;
usb_disable_asynch ( 0 ) ; /* asynch transfer allowed */
if ( blkcnt > = ss - > max_xfer_blk )
if ( blkcnt > = max_xfer_blk )
debug ( " \n " ) ;
return blkcnt ;
}
@ -1117,7 +1124,7 @@ retry_it:
unsigned long usb_stor_write ( int device , unsigned long blknr ,
unsigned long blkcnt , const void * buffer )
{
unsigned long start , blks , buf_addr ;
unsigned long start , blks , buf_addr , max_xfer_blk ;
unsigned short smallblks ;
struct usb_device * dev ;
struct us_data * ss ;
@ -1162,12 +1169,14 @@ unsigned long usb_stor_write(int device, unsigned long blknr,
*/
retry = 2 ;
srb - > pdata = ( unsigned char * ) buf_addr ;
if ( blks > ss - > max_xfer_blk )
smallblks = ss - > max_xfer_blk ;
max_xfer_blk = USB_MAX_XFER_BLK ( buf_addr ,
usb_dev_desc [ device ] . blksz ) ;
if ( blks > max_xfer_blk )
smallblks = ( unsigned short ) max_xfer_blk ;
else
smallblks = ( unsigned short ) blks ;
retry_it :
if ( smallblks = = ss - > max_xfer_blk )
if ( smallblks = = max_xfer_blk )
usb_show_progress ( ) ;
srb - > datalen = usb_dev_desc [ device ] . blksz * smallblks ;
srb - > pdata = ( unsigned char * ) buf_addr ;
@ -1188,7 +1197,7 @@ retry_it:
start , smallblks , buf_addr ) ;
usb_disable_asynch ( 0 ) ; /* asynch transfer allowed */
if ( blkcnt > = ss - > max_xfer_blk )
if ( blkcnt > = max_xfer_blk )
debug ( " \n " ) ;
return blkcnt ;
@ -1415,12 +1424,6 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *ss,
USB_STOR_PRINTF ( " address %d \n " , dev_desc - > target ) ;
USB_STOR_PRINTF ( " partype: %d \n " , dev_desc - > part_type ) ;
/*
* The U - Boot EHCI driver cannot handle more than 4096 * 5 bytes in a
* transfer without running itself out of qt_buffers .
*/
ss - > max_xfer_blk = ( 4096 * 5 ) / dev_desc - > blksz ;
init_part ( dev_desc ) ;
USB_STOR_PRINTF ( " partype: %d \n " , dev_desc - > part_type ) ;