r8a66597-hcd: fix cannot use external hub
PATCH 1/1 r8a66597-hcd: fix cannot use external hub
Fix the problem that cannot use external hub, because this driver did not control correctly a DEVADDx register.
Signed-off-by Yoshihiro Shimoda <[email protected]>
--- drivers/usb/r8a66597-hcd.c | 36 +++++++++++++++++++++++++++++++----- 1 files changed, 31 insertions(+), 5 deletions(-)
drivers/usb/r8a66597-hcd.c +31 -5
@@ -36,12 +36,37 @@ static unsigned short vif = CONFIG_R8A66597_LDRV;static unsigned short endian =CONFIG_R8A66597_ENDIAN ;static struct r8a66597 gr8a66597; -static void set_devadd_reg (struct r8a66597 *r8a66597,u8 r8a66597_address, -u16 usbspd,u8 upphub,u8 hubport,int port) +static void get_hub_data (struct usb_device *dev,u16 *hub_devnum,u16 *hubport) { -u16 val; +int i; + + *hub_devnum =0 ; + *hubport =0 ; + +/* check a device connected to root_hub */ +if ((dev->parent && dev->parent->devnum ==1 ) || + (dev->devnum ==1 )) +return ; + +for (i =0 ; i <USB_MAXCHILDREN ; i++) { +if (dev->parent->children[i] == dev) { + *hub_devnum = (u8 )dev->parent->devnum; + *hubport = i; +return ; + } + } + +printf ("get_hub_data error.\n" ); +} + +static void set_devadd (struct r8a66597 *r8a66597,u8 r8a66597_address, +struct usb_device *dev,int port) +{ +u16 val, usbspd, upphub, hubport;unsigned long devadd_reg =get_devadd_addr (r8a66597_address); +get_hub_data (dev, &upphub, &hubport); + usbspd = r8a66597->speed; val = (upphub <<11 ) | (hubport <<8 ) | (usbspd <<6 ) | (port &0x0001 );r8a66597_write (r8a66597, val, devadd_reg); }
@@ -818,7 +843,7 @@ int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer,R8A66597_DPRINT ("pipe = %08x, buffer = %p, len = %d, devnum = %d\n" , pipe, buffer, transfer_len, dev->devnum); -set_devadd_reg (r8a66597, dev->devnum, r8a66597->speed,0 ,0 ,0 ); +set_devadd (r8a66597, dev->devnum, dev,0 );pipe_buffer_setting (r8a66597, dev, pipe);
@@ -854,13 +879,14 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe, setup);R8A66597_DPRINT ("%s: setup\n" , __func__); -set_devadd_reg (r8a66597, r8a66597_address, r8a66597->speed,0 ,0 ,0 ); +set_devadd (r8a66597, r8a66597_address, dev,0 );if (send_setup_packet (r8a66597, dev, setup) <0 ) {printf ("setup packet send error\n" );return -1 ; } + dev->act_len =0 ;if (usb_pipein (pipe))if (receive_control_packet (r8a66597, dev, buffer, transfer_len) <0 )
Signature · 1 line
1.5.5
PATCH 1/1 r8a66597-hcd: fix cannot use external hub
Hello,
2008/10/29 Yoshihiro Shimoda <[email protected]>:
Quoted 7 lines
Fix the problem that cannot use external hub, because this driver did not control correctly a DEVADDx register.
Signed-off-by Yoshihiro Shimoda <[email protected]>--- drivers/usb/r8a66597-hcd.c | 36 +++++++++++++++++++++++++++++++----- 1 files changed, 31 insertions(+), 5 deletions(-)
Applied to u-boot-usb
Thanks.
Remy
Quoted 79 lines
drivers/usb/r8a66597-hcd.c +31
-6@@ -36,12 +36,37 @@ static unsigned short vif = CONFIG_R8A66597_LDRV;static unsigned short endian =CONFIG_R8A66597_ENDIAN ;static struct r8a66597 gr8a66597; -static void set_devadd_reg (struct r8a66597 *r8a66597,u8 r8a66597_address, -u16 usbspd,u8 upphub,u8 hubport,int port) +static void get_hub_data (struct usb_device *dev,u16 *hub_devnum,u16 *hubport) { -u16 val; +int i; + + *hub_devnum =0 ; + *hubport =0 ; + +/* check a device connected to root_hub */ +if ((dev->parent && dev->parent->devnum ==1 ) || + (dev->devnum ==1 )) +return ; + +for (i =0 ; i <USB_MAXCHILDREN ; i++) { +if (dev->parent->children[i] == dev) { + *hub_devnum = (u8 )dev->parent->devnum; + *hubport = i; +return ; + } + } + +printf ("get_hub_data error.\n" ); +} + +static void set_devadd (struct r8a66597 *r8a66597,u8 r8a66597_address, +struct usb_device *dev,int port) +{ +u16 val, usbspd, upphub, hubport;unsigned long devadd_reg =get_devadd_addr (r8a66597_address); +get_hub_data (dev, &upphub, &hubport); + usbspd = r8a66597->speed; val = (upphub <<11 ) | (hubport <<8 ) | (usbspd <<6 ) | (port &0x0001 );r8a66597_write (r8a66597, val, devadd_reg); }@@ -818,7 +843,7 @@ int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer,R8A66597_DPRINT ("pipe = %08x, buffer = %p, len = %d, devnum = %d\n" , pipe, buffer, transfer_len, dev->devnum); -set_devadd_reg (r8a66597, dev->devnum, r8a66597->speed,0 ,0 ,0 ); +set_devadd (r8a66597, dev->devnum, dev,0 );pipe_buffer_setting (r8a66597, dev, pipe);@@ -854,13 +879,14 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe, setup);R8A66597_DPRINT ("%s: setup\n" , __func__); -set_devadd_reg (r8a66597, r8a66597_address, r8a66597->speed,0 ,0 ,0 ); +set_devadd (r8a66597, r8a66597_address, dev,0 );if (send_setup_packet (r8a66597, dev, setup) <0 ) {printf ("setup packet send error\n" );return -1 ; } + dev->act_len =0 ;if (usb_pipein (pipe))if (receive_control_packet (r8a66597, dev, buffer, transfer_len) <0 ) --1.5.5
_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot