On Wed, 12 Sep 2012, Fengguang Wu wrote:
> Hi Felipe,
>
> FYI, there are new smatch warnings show up in
>
> tree: git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
> merge-result-for-greg
> head: 23953bde3e4d6aa8780dc054f6ad9882ac63f4f4
> commit: e918fa161f510136fce45a524e934fe20e62c8b1 [66/99] Merge tag
> 'gadget-for-v3.7' into merge-result-for-greg
>
> drivers/usb/core/hub.c:2654 usb_get_hub_port_power_state() error: doing dma
> on the stack ((null))
> drivers/usb/core/hub.c:4733 store_port_power_control() info: why not
> propagate 'ret' from set_port_feature() instead of -5?
> drivers/usb/core/hub.c:4744 store_port_power_control() info: why not
> propagate 'ret' from clear_port_feature() instead of -5?
>
> vim +2654 drivers/usb/core/hub.c
> 2644 return ret;
> 2645 }
> 2646
> 2647 static int usb_get_hub_port_power_state(struct usb_device
> *hdev, int port1)
> 2648 {
> 2649 struct usb_hub *hub = hdev_to_hub(hdev);
> 2650 struct usb_port_status data;
> 2651 u16 portstatus;
> 2652 int ret;
> 2653
> > 2654 ret = get_port_status(hub->hdev, port1, &data);
> 2655 if (ret < 4) {
> 2656 dev_err(hub->intfdev,
> 2657 "%s failed (err = %d)\n", __func__,
> ret);
> 2658 if (ret >= 0)
> 2659 ret = -EIO;
> 2660 return ret;
> 2661 } else
> 2662 portstatus = le16_to_cpu(data.wPortStatus);
> 2663 return port_is_power_on(hub, portstatus);
> 2664 }
This is a real problem. It looks like it really is necessary to call
hub_port_status() here, not get_port_status(). Would you like to fix
this?
The reason for changing the return codes from clear_port_feature() and
set_port_feature() is simple. The values they return are meant for
internal use within the kernel, whereas the return code from
store_port_power_control() will be passed back to userspace.
Alan Stern
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html