libpayload: usbhub: Don't clear PSC unless it was set

The current USB hub code always clears the port status change after
checking it, regardless of whether it was set in the first place. Since
this check runs on every poll, it might create a race condition where
the port status changes right between the GET_PORT_STATUS and the
CLEAR_FEATURE(C_PORT_CONNECT), thus clearing the statrus change flag
before it was ever read. Let's add one extra if() to avoid that possible
headache.

Change-Id: Idd46c2199dc6c240bd9ef068fbe70cccc88bac42
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/168098
(cherry picked from commit f7f6f008f701ab3e4a4f785032d8024d676e11cb)
Signed-off-by: Isaac Christensen <isaac.christensen@se-eng.com>
Reviewed-on: http://review.coreboot.org/6617
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
This commit is contained in:
Julius Werner 2013-09-03 16:44:15 -07:00 committed by Isaac Christensen
parent eb623ab204
commit 4498f6a6e5
1 changed files with 2 additions and 1 deletions

View File

@ -48,6 +48,7 @@ usb_hub_port_status_changed(usbdev_t *const dev, const int port)
{ {
unsigned short buf[2] = { 0, 0 }; unsigned short buf[2] = { 0, 0 };
get_status (dev, port, DR_PORT, 4, buf); get_status (dev, port, DR_PORT, 4, buf);
if (buf[1] & PORT_CONNECTION)
clear_feature (dev, port, SEL_C_PORT_CONNECTION, DR_PORT); clear_feature (dev, port, SEL_C_PORT_CONNECTION, DR_PORT);
return buf[1] & PORT_CONNECTION; return buf[1] & PORT_CONNECTION;
} }