USB: isp116x: fix enumeration on boot
This patch removes the buffering of the status register. USB core behavior has changed a bit and this buffering was not refreshed at the right time. The core got buffered old value of HCRHPORT and it did not detect any devices on boot. Signed-off-by: Anti Sullin <anti.sullin@artecdesign.ee> Acked by: Olav Kongas <ok@artecdesign.ee> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
b5f7a0ec11
commit
0ed930bffa
2 changed files with 6 additions and 10 deletions
|
@ -911,8 +911,7 @@ static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf)
|
|||
buf[0] = 0;
|
||||
|
||||
for (i = 0; i < ports; i++) {
|
||||
u32 status = isp116x->rhport[i] =
|
||||
isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1);
|
||||
u32 status = isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1);
|
||||
|
||||
if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC
|
||||
| RH_PS_OCIC | RH_PS_PRSC)) {
|
||||
|
@ -1031,7 +1030,9 @@ static int isp116x_hub_control(struct usb_hcd *hcd,
|
|||
DBG("GetPortStatus\n");
|
||||
if (!wIndex || wIndex > ports)
|
||||
goto error;
|
||||
tmp = isp116x->rhport[--wIndex];
|
||||
spin_lock_irqsave(&isp116x->lock, flags);
|
||||
tmp = isp116x_read_reg32(isp116x, (--wIndex) ? HCRHPORT2 : HCRHPORT1);
|
||||
spin_unlock_irqrestore(&isp116x->lock, flags);
|
||||
*(__le32 *) buf = cpu_to_le32(tmp);
|
||||
DBG("GetPortStatus: port[%d] %08x\n", wIndex + 1, tmp);
|
||||
break;
|
||||
|
@ -1080,8 +1081,6 @@ static int isp116x_hub_control(struct usb_hcd *hcd,
|
|||
spin_lock_irqsave(&isp116x->lock, flags);
|
||||
isp116x_write_reg32(isp116x, wIndex
|
||||
? HCRHPORT2 : HCRHPORT1, tmp);
|
||||
isp116x->rhport[wIndex] =
|
||||
isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1);
|
||||
spin_unlock_irqrestore(&isp116x->lock, flags);
|
||||
break;
|
||||
case SetPortFeature:
|
||||
|
@ -1095,24 +1094,22 @@ static int isp116x_hub_control(struct usb_hcd *hcd,
|
|||
spin_lock_irqsave(&isp116x->lock, flags);
|
||||
isp116x_write_reg32(isp116x, wIndex
|
||||
? HCRHPORT2 : HCRHPORT1, RH_PS_PSS);
|
||||
spin_unlock_irqrestore(&isp116x->lock, flags);
|
||||
break;
|
||||
case USB_PORT_FEAT_POWER:
|
||||
DBG("USB_PORT_FEAT_POWER\n");
|
||||
spin_lock_irqsave(&isp116x->lock, flags);
|
||||
isp116x_write_reg32(isp116x, wIndex
|
||||
? HCRHPORT2 : HCRHPORT1, RH_PS_PPS);
|
||||
spin_unlock_irqrestore(&isp116x->lock, flags);
|
||||
break;
|
||||
case USB_PORT_FEAT_RESET:
|
||||
DBG("USB_PORT_FEAT_RESET\n");
|
||||
root_port_reset(isp116x, wIndex);
|
||||
spin_lock_irqsave(&isp116x->lock, flags);
|
||||
break;
|
||||
default:
|
||||
goto error;
|
||||
}
|
||||
isp116x->rhport[wIndex] =
|
||||
isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1);
|
||||
spin_unlock_irqrestore(&isp116x->lock, flags);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -270,7 +270,6 @@ struct isp116x {
|
|||
u32 rhdesca;
|
||||
u32 rhdescb;
|
||||
u32 rhstatus;
|
||||
u32 rhport[2];
|
||||
|
||||
/* async schedule: control, bulk */
|
||||
struct list_head async;
|
||||
|
|
Loading…
Reference in a new issue