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:
committed by
Greg Kroah-Hartman
parent
b5f7a0ec11
commit
0ed930bffa
@@ -911,8 +911,7 @@ static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf)
|
|||||||
buf[0] = 0;
|
buf[0] = 0;
|
||||||
|
|
||||||
for (i = 0; i < ports; i++) {
|
for (i = 0; i < ports; i++) {
|
||||||
u32 status = isp116x->rhport[i] =
|
u32 status = isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1);
|
||||||
isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1);
|
|
||||||
|
|
||||||
if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC
|
if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC
|
||||||
| RH_PS_OCIC | RH_PS_PRSC)) {
|
| RH_PS_OCIC | RH_PS_PRSC)) {
|
||||||
@@ -1031,7 +1030,9 @@ static int isp116x_hub_control(struct usb_hcd *hcd,
|
|||||||
DBG("GetPortStatus\n");
|
DBG("GetPortStatus\n");
|
||||||
if (!wIndex || wIndex > ports)
|
if (!wIndex || wIndex > ports)
|
||||||
goto error;
|
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);
|
*(__le32 *) buf = cpu_to_le32(tmp);
|
||||||
DBG("GetPortStatus: port[%d] %08x\n", wIndex + 1, tmp);
|
DBG("GetPortStatus: port[%d] %08x\n", wIndex + 1, tmp);
|
||||||
break;
|
break;
|
||||||
@@ -1080,8 +1081,6 @@ static int isp116x_hub_control(struct usb_hcd *hcd,
|
|||||||
spin_lock_irqsave(&isp116x->lock, flags);
|
spin_lock_irqsave(&isp116x->lock, flags);
|
||||||
isp116x_write_reg32(isp116x, wIndex
|
isp116x_write_reg32(isp116x, wIndex
|
||||||
? HCRHPORT2 : HCRHPORT1, tmp);
|
? HCRHPORT2 : HCRHPORT1, tmp);
|
||||||
isp116x->rhport[wIndex] =
|
|
||||||
isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1);
|
|
||||||
spin_unlock_irqrestore(&isp116x->lock, flags);
|
spin_unlock_irqrestore(&isp116x->lock, flags);
|
||||||
break;
|
break;
|
||||||
case SetPortFeature:
|
case SetPortFeature:
|
||||||
@@ -1095,24 +1094,22 @@ static int isp116x_hub_control(struct usb_hcd *hcd,
|
|||||||
spin_lock_irqsave(&isp116x->lock, flags);
|
spin_lock_irqsave(&isp116x->lock, flags);
|
||||||
isp116x_write_reg32(isp116x, wIndex
|
isp116x_write_reg32(isp116x, wIndex
|
||||||
? HCRHPORT2 : HCRHPORT1, RH_PS_PSS);
|
? HCRHPORT2 : HCRHPORT1, RH_PS_PSS);
|
||||||
|
spin_unlock_irqrestore(&isp116x->lock, flags);
|
||||||
break;
|
break;
|
||||||
case USB_PORT_FEAT_POWER:
|
case USB_PORT_FEAT_POWER:
|
||||||
DBG("USB_PORT_FEAT_POWER\n");
|
DBG("USB_PORT_FEAT_POWER\n");
|
||||||
spin_lock_irqsave(&isp116x->lock, flags);
|
spin_lock_irqsave(&isp116x->lock, flags);
|
||||||
isp116x_write_reg32(isp116x, wIndex
|
isp116x_write_reg32(isp116x, wIndex
|
||||||
? HCRHPORT2 : HCRHPORT1, RH_PS_PPS);
|
? HCRHPORT2 : HCRHPORT1, RH_PS_PPS);
|
||||||
|
spin_unlock_irqrestore(&isp116x->lock, flags);
|
||||||
break;
|
break;
|
||||||
case USB_PORT_FEAT_RESET:
|
case USB_PORT_FEAT_RESET:
|
||||||
DBG("USB_PORT_FEAT_RESET\n");
|
DBG("USB_PORT_FEAT_RESET\n");
|
||||||
root_port_reset(isp116x, wIndex);
|
root_port_reset(isp116x, wIndex);
|
||||||
spin_lock_irqsave(&isp116x->lock, flags);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
isp116x->rhport[wIndex] =
|
|
||||||
isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1);
|
|
||||||
spin_unlock_irqrestore(&isp116x->lock, flags);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@@ -270,7 +270,6 @@ struct isp116x {
|
|||||||
u32 rhdesca;
|
u32 rhdesca;
|
||||||
u32 rhdescb;
|
u32 rhdescb;
|
||||||
u32 rhstatus;
|
u32 rhstatus;
|
||||||
u32 rhport[2];
|
|
||||||
|
|
||||||
/* async schedule: control, bulk */
|
/* async schedule: control, bulk */
|
||||||
struct list_head async;
|
struct list_head async;
|
||||||
|
Reference in New Issue
Block a user