📄 usbhubbusmanager.c
字号:
0, 0); /* * a.Call HUB_PortEventHandler() with the pHub and the port * number if this call fails, set the pHub::StateOfHub as * MARKED_FOR_DELETION and go to step 5. */ Result=usbHubPortEventHandler(pHub,uPortCount); if (USBHST_SUCCESS != Result) { /* Debug Message */ OS_LOG_MESSAGE_HIGH( HUB, "usbHubStatusChangeHandler:Port Evnt failed:" "0x%x:port=%d:0x%x\n", pHub->uDeviceHandle, uPortCount, Result, 0); /* Mark the hub for deletion */ pHub->StateOfHub=USB_MARKED_FOR_DELETION; break; } /* End of if (USBHST_SUCCESS != Result) */ } /* End of if (TRUE==bResult) */ /* * iv. Retrieve the HUB_PORT_INFO structure from the * pHub::pPortList[port number]. If this port is enabled, */ /* retrive the Port info */ pPort=pHub->pPortList[uPortCount]; /* Check if the port is enabled */ if (NULL != pPort) { /* * a.If the HUB_PORT_INFO::StateOfPort is HUB_DEBOUNCE_PENDING * then call HUB_PortDebounceHandler(). If this call fails, * then set the pHub::StateOfHub as MARKED_FOR_DELETION and * go to step 5. */ if (USB_HUB_DEBOUNCE_PENDING == pPort->StateOfPort) { /* Debug Message */ OS_LOG_MESSAGE_LOW( HUB, "usbHubStatusChangeHandler:Debounce detect:0x%x:" "port=%d\n", pHub->uDeviceHandle, uPortCount, 0, 0); /* handle the debounce */ Result =usbHubPortDebounceHandler(pHub,uPortCount); if (USBHST_SUCCESS != Result) { /* Debug Message */ OS_LOG_MESSAGE_HIGH( HUB, "usbHubStatusChangeHandler:Debounce failed:" "0x%x:port=%d:0x%x\n", pHub->uDeviceHandle, uPortCount, Result, 0); /* Mark the hub for deletion */ pHub->StateOfHub=USB_MARKED_FOR_DELETION; /* break off from the loop */ break; } /* End of if (USBHST_SUCCESS != Result) */ }/* End of HUB_DEBOUNCE... */ /* * b.If the HUB_PORT_INFO::StateOfPort is HUB_RESET_PENDING then * call the HUB_HandleDeviceConnection(). If this call fails, * then set the pHub::StateOfHub as MARKED_FOR_DELETION * and go to step 5. */ if (USB_HUB_RESET_PENDING == pPort->StateOfPort) { /* Debug Message */ OS_LOG_MESSAGE_LOW( HUB, "usbHubStatusChangeHandler:reset pending detect:0x%x:" "port=%d\n", pHub->uDeviceHandle, uPortCount, 0, 0); Result=usbHubHandleDeviceConnection(pHub,uPortCount); if (USBHST_SUCCESS != Result) { /* Debug Message */ OS_LOG_MESSAGE_HIGH( HUB, "usbHubStatusChangeHandler:Hndl devcon failed:0x%x:" "port=%d:0x%x\n", pHub->uDeviceHandle, uPortCount, Result, 0); /* Mark the hub for deletion */ pHub->StateOfHub=USB_MARKED_FOR_DELETION; break; } /* End of if (USBHST_SUCCESS != Result) */ }/* End of HUB_RESET... */ /* * c.If the HUB_PORT_INFO::StateOfPort is not * MARKED_FOR_DELETION then go to next iteration of for loop */ if (USB_MARKED_FOR_DELETION != pPort->StateOfPort) { continue; }/* End of MARKED_FOR_DELETION... */ /* Debug Message */ OS_LOG_MESSAGE_HIGH( HUB, "usbHubStatusChangeHandler:Port to be deleted:" "0x%x:port=%d:\n", pHub->uDeviceHandle, uPortCount, 0, 0); /* * If HUB_PORT_INFO::pHub is NULL then call * HUB_RemoveDevice() and free HUB_PORT_INFO and set the * pHub::pPortList[port count] as NULL. * 9/5/2k3:NM: Changed here to centralise the effect */ usbHubRemoveDevice(pHub,uPortCount); /* Set the port variable to NULL */ pPort = NULL; /* * f. Call HUB_CLEAR_PORT_FEATURE() with the PORT_ENABLE as the * feature. If this call fails then set the pHub::StateOfHub * as MARKED_FOR_DELETION and go to step 5. * Note: the actual port number is the port count + 1 */ Result = USB_HUB_CLEAR_PORT_FEATURE(pHub,uPortCount,USB_PORT_ENABLE); if (USBHST_SUCCESS != Result) { /* Debug Message */ OS_LOG_MESSAGE_HIGH( HUB, "usbHubStatusChangeHandler:Port disable failed:" "0x%x:port=%d:0x%x\n", pHub->uDeviceHandle, uPortCount, Result, 0); /* Mark the hub for deletion */ pHub->StateOfHub = USB_MARKED_FOR_DELETION; break; }/* End of if (USBHST_SUCCESS!=Result) */ } /* End of If (NULL != pPort) */ } /* End of for (uPortCount.... */ /* if the hub is marked for deletion fall thru to step 5 */ if (USB_MARKED_FOR_DELETION != pHub->StateOfHub) { /* * For all enabled ports in pHub::pPortList, if the status change * has been cleared, * i. Call HUB_SubmitInterruptRequest() with the pHub if this * call fails,set the pHub::StateOfHub * as MARKED_FOR_DELETION. */ bResult=FALSE; for (uPortCount = 0; uPortCount < pHub->HubDescriptor.bNbrPorts; uPortCount++) { /* * Check if the port events have been cleared * Note: The port number is port count +1 */ bResult = USB_HUB_IS_PORT_EVENT(pHub->pStatus, uPortCount+1); if (TRUE == bResult) { /* Debug Message */ OS_LOG_MESSAGE_HIGH( HUB, "usbHubStatusChangeHandler:Port Evnt not cleared:" "0x%x: port=%d:\n", pHub->uDeviceHandle, uPortCount, 0, 0); break; }/* End of if (TRUE==.. */ } /* End of for (uPortCount.... */ /* Submit the URB is we have not already submitted one. */ if ( (TRUE !=bResult)&& (FALSE == pHub->bURBSubmitted ) ) { /* Debug Message */ OS_LOG_MESSAGE_LOW( HUB, "usbHubStatusChangeHandler:Submitting IN request:0x%x\n", pHub->uDeviceHandle, 0, 0, 0); /* Call HUB_SubmitInterruptRequest() with the pHub */ Result=usbHubSubmitInterruptRequest(pHub); /* If failed, delete the hub */ if (USBHST_SUCCESS !=Result) { /* Debug Message */ OS_LOG_MESSAGE_MEDIUM( HUB, "usbHubStatusChangeHandler:SubmitRequest Failed:" "0x%x:0x%x\n", pHub->uDeviceHandle, Result, 0, 0); /* Mark the hub for deletion */ pHub->StateOfHub=USB_MARKED_FOR_DELETION; } /* End of if (USBHST_SUCCESS !=Result) */ }/* End of if TRUE != bResult*/ }/* End of if (MARKED_FOR_DELETION != pHub->StateOfHub) */ } /* End of (MARKED_FOR_DELETION != pHub->StateOfHub) */ /* * 5: * If pHub::StateOfHub is MARKED_FOR_DELETION then * i. Call the USBHST_RemoveDevice() function to remove the hub device. * ii. Return USBHST_SUCCESS. */ if (USB_MARKED_FOR_DELETION == pHub->StateOfHub) { /* Debug Message */ OS_LOG_MESSAGE_HIGH( HUB, "usbHubStatusChangeHandler:Hub Being deleted 0x%x\n", pHub->uDeviceHandle, 0, 0, 0); /* Call the USBHST function to remove the hub */ g_usbHstFunctionList.UsbdToHubFunctionList.removeDevice(pHub->uDeviceHandle); return; } /* End of if (MARKED_FOR_DELETION ==pHub->StateOfHub) */ /* * For all enabled ports in pHub::pPortList, * i. Retrieve the HUB_PORT_INFO structure from the * pHub::pPortList[port number]. * ii. If HUB_PORT_INFO::pHub is not NULL then call * HUB_StatusChangeHandler() with HUB_PORT_INFO::pHub. */ for (uPortCount = 0; uPortCount < pHub->HubDescriptor.bNbrPorts; uPortCount++) { /* Retrieve the HUB_PORT_INFO structure */ pUSB_HUB_PORT_INFO pPort = pHub->pPortList[uPortCount]; /* Check if the port is enabled */ if (NULL != pPort) { /* Check if this is a hub */ if (NULL != pPort->pHub) { /* Debug Message */ OS_LOG_MESSAGE_LOW( HUB, "usbHubStatusChangeHandler:detected hub:0x%x:%d\n", pHub->uDeviceHandle, uPortCount, 0, 0); /* * we could have events on this hb device too.. so call * the handler */ usbHubStatusChangeHandler(pPort->pHub); }/* End of if (NULL != pPort->pHub) */ } /* End of If (NULL != pPort) */ } /* End of for (uPortCount.... */ return;}/* End of HUB_StatusChangehandler() *//**************************** End of File HUB_BusManager.c ********************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -