USB hub_probe: rework ugly goto-into-compound-statement
PATCH v7 1/1 USB hub_probe: rework ugly goto-into-compound-statement
Rework smelling code (goto inside compound statement). Perhaps this is legacy. Anyway such code is not appropriate for Linux kernel.
Signed-off-by Eugene Korenevsky <[email protected]>
---
Changes in v7: rename hub_check_descriptor_sanity -> hub_descriptor_is_sane Changes in v6: more pedantic conversion from int to bool; fix comment Changes in v5: make bool a return type of hub_check_descriptor_sanity() Changes in v4: fix typo
Changes in v3: extract the code to static function
Changes in v2: fix spaces instead of tab, add missing 'Signed-off-by'
drivers/usb/core/hub.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-)
drivers/usb/core/hub.c +21 -17
@@ -1661,10 +1661,28 @@ static void hub_disconnect(struct usb_interface *intf)kref_put (&hub->kref, hub_release); } +static bool hub_descriptor_is_sane (struct usb_host_interface *desc) +{ +/* Some hubs have a subclass of 1, which AFAICT according to the */ +/* specs is not defined, but it works */ +if (desc->desc.bInterfaceSubClass !=0 && + desc->desc.bInterfaceSubClass !=1 ) +return false; + +/* Multiple endpoints? What kind of mutant ninja-hub is this? */ +if (desc->desc.bNumEndpoints !=1 ) +return false; + +/* If the first endpoint is not interrupt IN, we'd better punt! */ +if (!usb_endpoint_is_int_in (&desc->endpoint[0 ].desc)) +return false; + +return true; +} +static int hub_probe (struct usb_interface *intf,const struct usb_device_id *id) {struct usb_host_interface *desc; -struct usb_endpoint_descriptor *endpoint;struct usb_device *hdev;struct usb_hub *hub;
@@ -1739,25 +1757,11 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) }#endif -/* Some hubs have a subclass of 1, which AFAICT according to the */ -/* specs is not defined, but it works */ -if ((desc->desc.bInterfaceSubClass !=0 ) && - (desc->desc.bInterfaceSubClass !=1 )) { -descriptor_error: +if (!hub_descriptor_is_sane (desc)) {dev_err (&intf->dev,"bad descriptor, ignoring hub\n" );return -EIO ; } -/* Multiple endpoints? What kind of mutant ninja-hub is this? */ -if (desc->desc.bNumEndpoints !=1 ) - goto descriptor_error; - - endpoint = &desc->endpoint[0 ].desc; - -/* If it's not an interrupt in endpoint, we'd better punt! */ -if (!usb_endpoint_is_int_in (endpoint)) - goto descriptor_error; -/* We found a hub */ dev_info (&intf->dev,"USB hub found\n" );
@@ -1784,7 +1788,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)if (id->driver_info &HUB_QUIRK_CHECK_PORT_AUTOSUSPEND ) hub->quirk_check_port_auto_suspend =1 ; -if (hub_configure (hub, endpoint) >=0 ) +if (hub_configure (hub, &desc->endpoint[0 ].desc) >=0 )return 0 ;hub_disconnect (intf);
Signature · 1 line
2.13.1