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

Commit 752d57a8 authored by Paul Bolle's avatar Paul Bolle Committed by Greg Kroah-Hartman
Browse files

USB: Only treat lasting over-current conditions as errors



On a laptop I see these errors on (most) resumes:
    hub 3-0:1.0: over-current change on port 1
    hub 3-0:1.0: over-current change on port 2

Since over-current conditions can disappear quite quickly it's better to
downgrade that message to debug level, recheck for an over-current
condition a little later and only print and over-current condition error
if that condition (still) exists when it's rechecked.

Add similar logic to hub over-current changes. (That code is untested,
as those changes do not occur on this laptop.)

Signed-off-by: default avatarPaul Bolle <pebolle@tiscali.nl>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 0dfeefbc
Loading
Loading
Loading
Loading
+19 −5
Original line number Original line Diff line number Diff line
@@ -3408,12 +3408,19 @@ static void hub_events(void)
			}
			}
			
			
			if (portchange & USB_PORT_STAT_C_OVERCURRENT) {
			if (portchange & USB_PORT_STAT_C_OVERCURRENT) {
				dev_err (hub_dev,
				u16 status = 0;
					"over-current change on port %d\n",
				u16 unused;
					i);

				dev_dbg(hub_dev, "over-current change on port "
					"%d\n", i);
				clear_port_feature(hdev, i,
				clear_port_feature(hdev, i,
					USB_PORT_FEAT_C_OVER_CURRENT);
					USB_PORT_FEAT_C_OVER_CURRENT);
				msleep(100);	/* Cool down */
				hub_power_on(hub, true);
				hub_power_on(hub, true);
				hub_port_status(hub, i, &status, &unused);
				if (status & USB_PORT_STAT_OVERCURRENT)
					dev_err(hub_dev, "over-current "
						"condition on port %d\n", i);
			}
			}


			if (portchange & USB_PORT_STAT_C_RESET) {
			if (portchange & USB_PORT_STAT_C_RESET) {
@@ -3445,10 +3452,17 @@ static void hub_events(void)
					hub->limited_power = 0;
					hub->limited_power = 0;
			}
			}
			if (hubchange & HUB_CHANGE_OVERCURRENT) {
			if (hubchange & HUB_CHANGE_OVERCURRENT) {
				dev_dbg (hub_dev, "overcurrent change\n");
				u16 status = 0;
				msleep(500);	/* Cool down */
				u16 unused;

				dev_dbg(hub_dev, "over-current change\n");
				clear_hub_feature(hdev, C_HUB_OVER_CURRENT);
				clear_hub_feature(hdev, C_HUB_OVER_CURRENT);
				msleep(500);	/* Cool down */
                        	hub_power_on(hub, true);
                        	hub_power_on(hub, true);
				hub_hub_status(hub, &status, &unused);
				if (status & HUB_STATUS_OVERCURRENT)
					dev_err(hub_dev, "over-current "
						"condition\n");
			}
			}
		}
		}