Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0ed930bf authored by Anti Sullin's avatar Anti Sullin Committed by Greg Kroah-Hartman
Browse files

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: default avatarAnti Sullin <anti.sullin@artecdesign.ee>
Acked by: Olav Kongas <ok@artecdesign.ee>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent b5f7a0ec
Loading
Loading
Loading
Loading
+6 −9
Original line number Original line Diff line number Diff line
@@ -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:
+0 −1
Original line number Original line Diff line number Diff line
@@ -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;