|
@@ -354,6 +354,8 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
|
|
usbip_dbg_vhci_rh(" ClearHubFeature\n");
|
|
|
break;
|
|
|
case ClearPortFeature:
|
|
|
+ if (rhport < 0)
|
|
|
+ goto error;
|
|
|
switch (wValue) {
|
|
|
case USB_PORT_FEAT_SUSPEND:
|
|
|
if (hcd->speed == HCD_USB3) {
|
|
@@ -511,11 +513,16 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
|
|
goto error;
|
|
|
}
|
|
|
|
|
|
+ if (rhport < 0)
|
|
|
+ goto error;
|
|
|
+
|
|
|
vhci_hcd->port_status[rhport] |= USB_PORT_STAT_SUSPEND;
|
|
|
break;
|
|
|
case USB_PORT_FEAT_POWER:
|
|
|
usbip_dbg_vhci_rh(
|
|
|
" SetPortFeature: USB_PORT_FEAT_POWER\n");
|
|
|
+ if (rhport < 0)
|
|
|
+ goto error;
|
|
|
if (hcd->speed == HCD_USB3)
|
|
|
vhci_hcd->port_status[rhport] |= USB_SS_PORT_STAT_POWER;
|
|
|
else
|
|
@@ -524,6 +531,8 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
|
|
case USB_PORT_FEAT_BH_PORT_RESET:
|
|
|
usbip_dbg_vhci_rh(
|
|
|
" SetPortFeature: USB_PORT_FEAT_BH_PORT_RESET\n");
|
|
|
+ if (rhport < 0)
|
|
|
+ goto error;
|
|
|
/* Applicable only for USB3.0 hub */
|
|
|
if (hcd->speed != HCD_USB3) {
|
|
|
pr_err("USB_PORT_FEAT_BH_PORT_RESET req not "
|
|
@@ -534,6 +543,8 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
|
|
case USB_PORT_FEAT_RESET:
|
|
|
usbip_dbg_vhci_rh(
|
|
|
" SetPortFeature: USB_PORT_FEAT_RESET\n");
|
|
|
+ if (rhport < 0)
|
|
|
+ goto error;
|
|
|
/* if it's already enabled, disable */
|
|
|
if (hcd->speed == HCD_USB3) {
|
|
|
vhci_hcd->port_status[rhport] = 0;
|
|
@@ -554,6 +565,8 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
|
|
default:
|
|
|
usbip_dbg_vhci_rh(" SetPortFeature: default %d\n",
|
|
|
wValue);
|
|
|
+ if (rhport < 0)
|
|
|
+ goto error;
|
|
|
if (hcd->speed == HCD_USB3) {
|
|
|
if ((vhci_hcd->port_status[rhport] &
|
|
|
USB_SS_PORT_STAT_POWER) != 0) {
|