Commit 467d296f authored by Thomas Pugliese's avatar Thomas Pugliese Committed by Greg Kroah-Hartman

wusbcore: fix root hub hub_status_data to only return > 0 if status has actually changed

The hub_status_data function on the wireless USB root hub controller
(wusbhc_rh_status_data) always returns a positive value even if no ports
have changed.  This patch updates wusbhc_rh_status_data to only return a
positive value if the root hub status needs to be queried.  The current
implementation can also leave the upper bits of the port bitmap
uninitialized if wusbhc->ports_max is not one less than an even multiple
of 8.  This patch fixes that as well by initializing the buffer to 0.
Signed-off-by: default avatarThomas Pugliese <thomas.pugliese@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9841f37a
...@@ -141,18 +141,26 @@ static int wusbhc_rh_port_reset(struct wusbhc *wusbhc, u8 port_idx) ...@@ -141,18 +141,26 @@ static int wusbhc_rh_port_reset(struct wusbhc *wusbhc, u8 port_idx)
int wusbhc_rh_status_data(struct usb_hcd *usb_hcd, char *_buf) int wusbhc_rh_status_data(struct usb_hcd *usb_hcd, char *_buf)
{ {
struct wusbhc *wusbhc = usb_hcd_to_wusbhc(usb_hcd); struct wusbhc *wusbhc = usb_hcd_to_wusbhc(usb_hcd);
size_t cnt, size; size_t cnt, size, bits_set = 0;
unsigned long *buf = (unsigned long *) _buf;
/* WE DON'T LOCK, see comment */ /* WE DON'T LOCK, see comment */
size = wusbhc->ports_max + 1 /* hub bit */; /* round up to bytes. Hub bit is bit 0 so add 1. */
size = (size + 8 - 1) / 8; /* round to bytes */ size = DIV_ROUND_UP(wusbhc->ports_max + 1, 8);
for (cnt = 0; cnt < wusbhc->ports_max; cnt++)
if (wusb_port_by_idx(wusbhc, cnt)->change) /* clear the output buffer. */
set_bit(cnt + 1, buf); memset(_buf, 0, size);
else /* set the bit for each changed port. */
clear_bit(cnt + 1, buf); for (cnt = 0; cnt < wusbhc->ports_max; cnt++) {
return size;
if (wusb_port_by_idx(wusbhc, cnt)->change) {
const int bitpos = cnt+1;
_buf[bitpos/8] |= (1 << (bitpos % 8));
bits_set++;
}
}
return bits_set ? size : 0;
} }
EXPORT_SYMBOL_GPL(wusbhc_rh_status_data); EXPORT_SYMBOL_GPL(wusbhc_rh_status_data);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment