|
@@ -1003,19 +1003,20 @@ static void r8a66597_check_syssts(struct r8a66597 *r8a66597, int port,
|
|
|
if (syssts == SE0) {
|
|
|
r8a66597_write(r8a66597, ~ATTCH, get_intsts_reg(port));
|
|
|
r8a66597_bset(r8a66597, ATTCHE, get_intenb_reg(port));
|
|
|
- return;
|
|
|
- }
|
|
|
+ } else {
|
|
|
+ if (syssts == FS_JSTS)
|
|
|
+ r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port));
|
|
|
+ else if (syssts == LS_JSTS)
|
|
|
+ r8a66597_bclr(r8a66597, HSE, get_syscfg_reg(port));
|
|
|
|
|
|
- if (syssts == FS_JSTS)
|
|
|
- r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port));
|
|
|
- else if (syssts == LS_JSTS)
|
|
|
- r8a66597_bclr(r8a66597, HSE, get_syscfg_reg(port));
|
|
|
+ r8a66597_write(r8a66597, ~DTCH, get_intsts_reg(port));
|
|
|
+ r8a66597_bset(r8a66597, DTCHE, get_intenb_reg(port));
|
|
|
|
|
|
- r8a66597_write(r8a66597, ~DTCH, get_intsts_reg(port));
|
|
|
- r8a66597_bset(r8a66597, DTCHE, get_intenb_reg(port));
|
|
|
+ if (r8a66597->bus_suspended)
|
|
|
+ usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597));
|
|
|
+ }
|
|
|
|
|
|
- if (r8a66597->bus_suspended)
|
|
|
- usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597));
|
|
|
+ usb_hcd_poll_rh_status(r8a66597_to_hcd(r8a66597));
|
|
|
}
|
|
|
|
|
|
/* this function must be called with interrupt disabled */
|
|
@@ -1024,6 +1025,8 @@ static void r8a66597_usb_connect(struct r8a66597 *r8a66597, int port)
|
|
|
u16 speed = get_rh_usb_speed(r8a66597, port);
|
|
|
struct r8a66597_root_hub *rh = &r8a66597->root_hub[port];
|
|
|
|
|
|
+ rh->port &= ~((1 << USB_PORT_FEAT_HIGHSPEED) |
|
|
|
+ (1 << USB_PORT_FEAT_LOWSPEED));
|
|
|
if (speed == HSMODE)
|
|
|
rh->port |= (1 << USB_PORT_FEAT_HIGHSPEED);
|
|
|
else if (speed == LSMODE)
|