[USBPORT]

- Correctly distinguish between current hub status and status change in USBPORT_RootHubSCE. Patch by Vadim Galyant.

svn path=/trunk/; revision=75234
This commit is contained in:
Thomas Faber 2017-06-29 15:01:47 +00:00
parent 7d2398b6af
commit f4e131fa49
2 changed files with 15 additions and 20 deletions

View file

@ -137,7 +137,7 @@ USBPORT_RootHubClassCommand(IN PDEVICE_OBJECT FdoDevice,
{ {
return RHStatus; return RHStatus;
} }
KeAcquireSpinLock(&FdoExtension->MiniportSpinLock, &OldIrql); KeAcquireSpinLock(&FdoExtension->MiniportSpinLock, &OldIrql);
MPStatus = Packet->RH_GetPortStatus(FdoExtension->MiniPortExt, MPStatus = Packet->RH_GetPortStatus(FdoExtension->MiniPortExt,
@ -170,7 +170,7 @@ USBPORT_RootHubClassCommand(IN PDEVICE_OBJECT FdoDevice,
RHStatus = RH_STATUS_SUCCESS; RHStatus = RH_STATUS_SUCCESS;
return RHStatus; return RHStatus;
} }
if (Feature == FEATURE_C_HUB_OVER_CURRENT) if (Feature == FEATURE_C_HUB_OVER_CURRENT)
{ {
MPStatus = Packet->RH_ClearFeaturePortOvercurrentChange(FdoExtension->MiniPortExt, MPStatus = Packet->RH_ClearFeaturePortOvercurrentChange(FdoExtension->MiniPortExt,
@ -178,7 +178,7 @@ USBPORT_RootHubClassCommand(IN PDEVICE_OBJECT FdoDevice,
RHStatus = USBPORT_MPStatusToRHStatus(MPStatus); RHStatus = USBPORT_MPStatusToRHStatus(MPStatus);
return RHStatus; return RHStatus;
} }
DbgBreakPoint(); DbgBreakPoint();
return RHStatus; return RHStatus;
} }
@ -436,7 +436,7 @@ USBPORT_RootHubStandardCommand(IN PDEVICE_OBJECT FdoDevice,
!(SetupPacket->bmRequestType.Dir == BMREQUEST_DEVICE_TO_HOST)) !(SetupPacket->bmRequestType.Dir == BMREQUEST_DEVICE_TO_HOST))
{ {
if (SetupPacket->wValue.W == 0 || if (SetupPacket->wValue.W == 0 ||
SetupPacket->wValue.W == SetupPacket->wValue.W ==
PdoExtension->RootHubDescriptors->ConfigDescriptor.bConfigurationValue) PdoExtension->RootHubDescriptors->ConfigDescriptor.bConfigurationValue)
{ {
PdoExtension->ConfigurationValue = SetupPacket->wValue.LowByte; PdoExtension->ConfigurationValue = SetupPacket->wValue.LowByte;
@ -535,7 +535,7 @@ USBPORT_RootHubSCE(IN PUSBPORT_TRANSFER Transfer)
PUSBPORT_REGISTRATION_PACKET Packet; PUSBPORT_REGISTRATION_PACKET Packet;
ULONG TransferLength; ULONG TransferLength;
USBHUB_PORT_STATUS PortStatus; USBHUB_PORT_STATUS PortStatus;
USB_HUB_STATUS HubStatus; USB_HUB_STATUS_AND_CHANGE HubStatus;
PVOID Buffer; PVOID Buffer;
PULONG AddressBitMap; PULONG AddressBitMap;
ULONG Port; ULONG Port;
@ -556,7 +556,7 @@ USBPORT_RootHubSCE(IN PUSBPORT_TRANSFER Transfer)
NumberOfPorts = HubDescriptor->bNumberOfPorts; NumberOfPorts = HubDescriptor->bNumberOfPorts;
PortStatus.AsULONG = 0; PortStatus.AsULONG = 0;
HubStatus.AsUshort16 = 0; HubStatus.AsUlong32 = 0;
Urb = Transfer->Urb; Urb = Transfer->Urb;
TransferLength = Transfer->TransferParameters.TransferBufferLength; TransferLength = Transfer->TransferParameters.TransferBufferLength;
@ -603,7 +603,7 @@ USBPORT_RootHubSCE(IN PUSBPORT_TRANSFER Transfer)
Port, Port,
&PortStatus)) &PortStatus))
{ {
/* Miniport returned an error */ /* Miniport returned an error */
DPRINT1("USBPORT_RootHubSCE: RH_GetPortStatus failed\n"); DPRINT1("USBPORT_RootHubSCE: RH_GetPortStatus failed\n");
return RH_STATUS_UNSUCCESSFUL; return RH_STATUS_UNSUCCESSFUL;
} }
@ -623,8 +623,8 @@ USBPORT_RootHubSCE(IN PUSBPORT_TRANSFER Transfer)
/* Request the hub status from miniport */ /* Request the hub status from miniport */
if (!Packet->RH_GetHubStatus(FdoExtension->MiniPortExt, &HubStatus)) if (!Packet->RH_GetHubStatus(FdoExtension->MiniPortExt, &HubStatus))
{ {
if (HubStatus.AsUshort16 & (HUB_STATUS_CHANGE_LOCAL_POWER | if (HubStatus.HubChange.LocalPowerChange == 1 ||
HUB_STATUS_CHANGE_OVERCURRENT)) HubStatus.HubChange.OverCurrentChange == 1)
{ {
/* At the hub status there is a change */ /* At the hub status there is a change */
AddressBitMap[0] |= 1; AddressBitMap[0] |= 1;
@ -647,7 +647,7 @@ USBPORT_RootHubSCE(IN PUSBPORT_TRANSFER Transfer)
return RHStatus; return RHStatus;
} }
/* Miniport returned an error */ /* Miniport returned an error */
DPRINT1("USBPORT_RootHubSCE: RH_GetHubStatus failed\n"); DPRINT1("USBPORT_RootHubSCE: RH_GetHubStatus failed\n");
return RH_STATUS_UNSUCCESSFUL; return RH_STATUS_UNSUCCESSFUL;
} }
@ -904,7 +904,7 @@ USBPORT_InvalidateRootHub(PVOID Context)
FdoDevice = FdoExtension->CommonExtension.SelfDevice; FdoDevice = FdoExtension->CommonExtension.SelfDevice;
if (FdoExtension->Flags & USBPORT_FLAG_HC_SUSPEND && if (FdoExtension->Flags & USBPORT_FLAG_HC_SUSPEND &&
FdoExtension->Flags & USBPORT_FLAG_HC_WAKE_SUPPORT && FdoExtension->Flags & USBPORT_FLAG_HC_WAKE_SUPPORT &&
FdoExtension->MiniPortFlags & USBPORT_MPFLAG_SUSPENDED && FdoExtension->MiniPortFlags & USBPORT_MPFLAG_SUSPENDED &&
FdoExtension->TimerFlags & USBPORT_TMFLAG_WAKE) FdoExtension->TimerFlags & USBPORT_TMFLAG_WAKE)
@ -912,7 +912,7 @@ USBPORT_InvalidateRootHub(PVOID Context)
USBPORT_HcQueueWakeDpc(FdoDevice); USBPORT_HcQueueWakeDpc(FdoDevice);
return 0; return 0;
} }
FdoExtension->MiniPortInterface->Packet.RH_DisableIrq(FdoExtension->MiniPortExt); FdoExtension->MiniPortInterface->Packet.RH_DisableIrq(FdoExtension->MiniPortExt);
PdoDevice = FdoExtension->RootHubPdo; PdoDevice = FdoExtension->RootHubPdo;

View file

@ -76,11 +76,6 @@ struct {
ULONG AsULONG; ULONG AsULONG;
} USBHUB_PORT_STATUS, *PUSBHUB_PORT_STATUS; } USBHUB_PORT_STATUS, *PUSBHUB_PORT_STATUS;
/* Hub status & hub status change bits.
See USB 2.0 spec Table 11-19 and Table 11-20. */
#define HUB_STATUS_CHANGE_LOCAL_POWER 0x00010000
#define HUB_STATUS_CHANGE_OVERCURRENT 0x00020000
/* Additional USB Class Codes from USB.org */ /* Additional USB Class Codes from USB.org */
#define USBC_DEVICE_CLASS_AUDIO_VIDEO 0x10 #define USBC_DEVICE_CLASS_AUDIO_VIDEO 0x10
#define USBC_DEVICE_CLASS_BILLBOARD 0x11 #define USBC_DEVICE_CLASS_BILLBOARD 0x11
@ -232,7 +227,7 @@ typedef MPSTATUS
typedef MPSTATUS typedef MPSTATUS
(NTAPI *PHCI_RH_GET_HUB_STATUS)( (NTAPI *PHCI_RH_GET_HUB_STATUS)(
PVOID, PVOID,
PUSB_HUB_STATUS); PUSB_HUB_STATUS_AND_CHANGE);
typedef MPSTATUS typedef MPSTATUS
(NTAPI *PHCI_RH_SET_FEATURE_PORT_RESET)( (NTAPI *PHCI_RH_SET_FEATURE_PORT_RESET)(
@ -420,12 +415,12 @@ typedef MPSTATUS
typedef NTSTATUS typedef NTSTATUS
(NTAPI *PUSBPORT_WAIT)( (NTAPI *PUSBPORT_WAIT)(
PVOID, PVOID,
ULONG); ULONG);
typedef ULONG typedef ULONG
(NTAPI *PUSBPORT_INVALIDATE_CONTROLLER)( (NTAPI *PUSBPORT_INVALIDATE_CONTROLLER)(
PVOID, PVOID,
ULONG); ULONG);
typedef VOID typedef VOID
(NTAPI *PUSBPORT_BUG_CHECK)(PVOID); (NTAPI *PUSBPORT_BUG_CHECK)(PVOID);