Lines Matching refs:pUrb

625 static int  usbMsdHandleBulkDevToHost(PUSBMSD pThis, PUSBMSDEP pEp, PVUSBURB pUrb);
645 * @param pUrb The URB to insert.
647 DECLINLINE(void) usbMsdQueueAddTail(PUSBMSDURBQUEUE pQueue, PVUSBURB pUrb)
649 pUrb->Dev.pNext = NULL;
650 *pQueue->ppTail = pUrb;
651 pQueue->ppTail = &pUrb->Dev.pNext;
663 PVUSBURB pUrb = pQueue->pHead;
664 if (pUrb)
666 PVUSBURB pNext = pUrb->Dev.pNext;
671 pUrb->Dev.pNext = NULL;
673 return pUrb;
682 * @param pUrb The URB to remove.
684 DECLINLINE(bool) usbMsdQueueRemove(PUSBMSDURBQUEUE pQueue, PVUSBURB pUrb)
687 if (pCur == pUrb)
688 pQueue->pHead = pUrb->Dev.pNext;
693 if (pCur->Dev.pNext == pUrb)
695 pCur->Dev.pNext = pUrb->Dev.pNext;
703 if (!pUrb->Dev.pNext)
725 * @param pUrb The URB.
727 static void usbMsdLinkDone(PUSBMSD pThis, PVUSBURB pUrb)
729 usbMsdQueueAddTail(&pThis->DoneQueue, pUrb);
867 static int usbMsdCompleteStall(PUSBMSD pThis, PUSBMSDEP pEp, PVUSBURB pUrb, const char *pszWhy)
869 Log(("usbMsdCompleteStall/#%u: pUrb=%p:%s: %s\n", pThis->pUsbIns->iInstance, pUrb, pUrb->pszDesc, pszWhy));
871 pUrb->enmStatus = VUSBSTATUS_STALL;
882 usbMsdLinkDone(pThis, pUrb);
890 static int usbMsdCompleteOk(PUSBMSD pThis, PVUSBURB pUrb, size_t cbData)
892 Log(("usbMsdCompleteOk/#%u: pUrb=%p:%s cbData=%#zx\n", pThis->pUsbIns->iInstance, pUrb, pUrb->pszDesc, cbData));
894 pUrb->enmStatus = VUSBSTATUS_OK;
895 pUrb->cbData = (uint32_t)cbData;
897 usbMsdLinkDone(pThis, pUrb);
908 * @param pUrb Set when usbMsdUrbHandleDefaultPipe is the
913 static int usbMsdResetWorker(PUSBMSD pThis, PVUSBURB pUrb, bool fSetConfig)
926 if (pThis->pResetUrb && (pUrb || fSetConfig))
929 return usbMsdCompleteStall(pThis, NULL, pUrb, "pResetUrb");
933 if (pUrb)
935 pThis->pResetUrb = pUrb;
975 if (!pUrb && !fSetConfig) /* (only device reset) */
996 if (pUrb)
997 return usbMsdCompleteOk(pThis, pUrb, 0);
1040 PVUSBURB pUrb = usbMsdQueueRemoveHead(&pThis->ToHostQueue);
1041 if (!pUrb)
1045 usbMsdHandleBulkDevToHost(pThis, &pThis->aEps[1], pUrb);
1339 PVUSBURB pUrb = usbMsdQueueRemoveHead(&pThis->DoneQueue);
1340 if (!pUrb && cMillies)
1351 pUrb = usbMsdQueueRemoveHead(&pThis->DoneQueue);
1356 if (pUrb)
1357 Log(("usbMsdUrbReap/#%u: pUrb=%p:%s\n", pUsbIns->iInstance, pUrb, pUrb->pszDesc));
1358 return pUrb;
1377 static DECLCALLBACK(int) usbMsdUrbCancel(PPDMUSBINS pUsbIns, PVUSBURB pUrb)
1380 LogFlow(("usbMsdUrbCancel/#%u: pUrb=%p:%s\n", pUsbIns->iInstance, pUrb, pUrb->pszDesc));
1386 if (usbMsdQueueRemove(&pThis->ToHostQueue, pUrb))
1387 usbMsdLinkDone(pThis, pUrb);
1504 * @param pUrb The URB.
1506 static bool usbMsdIsValidCommand(PUSBMSD pThis, PCUSBCBW pCbw, PVUSBURB pUrb)
1523 static int usbMsdHandleBulkHostToDev(PUSBMSD pThis, PUSBMSDEP pEp, PVUSBURB pUrb)
1529 return usbMsdCompleteStall(pThis, NULL, pUrb, "Halted pipe");
1549 PCUSBCBW pCbw = (PUSBCBW)&pUrb->abData[0];
1550 if (pUrb->cbData < RT_UOFFSETOF(USBCBW, CBWCB[1]))
1552 Log(("usbMsd: Bad CBW: cbData=%#x < min=%#x\n", pUrb->cbData, RT_UOFFSETOF(USBCBW, CBWCB[1]) ));
1553 return usbMsdCompleteStall(pThis, NULL, pUrb, "BAD CBW");
1558 return usbMsdCompleteStall(pThis, NULL, pUrb, "Bad CBW");
1561 pCbw->dCBWTag, pCbw->dCBWDataTransferLength, pCbw->bmCBWFlags, pCbw->bCBWLun, pCbw->bCBWCBLength, pUrb->cbData, pUrb->fShortNotOk));
1565 return usbMsdCompleteStall(pThis, NULL, pUrb, "Bad CBW");
1571 return usbMsdCompleteStall(pThis, NULL, pUrb, "Bad CBW");
1576 return usbMsdCompleteStall(pThis, NULL, pUrb, "Bad CBW");
1578 if (pUrb->cbData < RT_UOFFSETOF(USBCBW, CBWCB[pCbw->bCBWCBLength]))
1581 pUrb->cbData, RT_UOFFSETOF(USBCBW, CBWCB[pCbw->bCBWCBLength]), pCbw->bCBWCBLength));
1582 return usbMsdCompleteStall(pThis, NULL, pUrb, "Bad CBW");
1588 return usbMsdCompleteStall(pThis, NULL, pUrb, "Too big transfer");
1591 if (!usbMsdIsValidCommand(pThis, pCbw, pUrb))
1605 return usbMsdCompleteStall(pThis, NULL, pUrb, "Request allocation failure");
1609 return usbMsdCompleteStall(pThis, NULL, pUrb, "Buffer allocation failure");
1631 return usbMsdCompleteStall(pThis, NULL, pUrb, "SCSI Submit #1");
1641 return usbMsdCompleteOk(pThis, pUrb, pUrb->cbData);
1649 uint32_t cbData = pUrb->cbData;
1655 return usbMsdCompleteStall(pThis, NULL, pUrb, "Too much data");
1657 memcpy(&pReq->pbBuf[pReq->offBuf], &pUrb->abData[0], cbData);
1666 return usbMsdCompleteStall(pThis, NULL, pUrb, "SCSI Submit #2");
1669 return usbMsdCompleteOk(pThis, pUrb, cbData);
1676 return usbMsdCompleteStall(pThis, NULL, pUrb, "Bad state H2D: DATA_TO_HOST");
1679 return usbMsdCompleteStall(pThis, NULL, pUrb, "Bad state H2D: EXECUTING");
1683 return usbMsdCompleteStall(pThis, NULL, pUrb, "Bad state (H2D)");
1691 static int usbMsdHandleBulkDevToHost(PUSBMSD pThis, PUSBMSDEP pEp, PVUSBURB pUrb)
1699 return usbMsdCompleteStall(pThis, NULL, pUrb, pEp->fHalted ? "Halted pipe" : "No request");
1711 uint32_t cbData = pUrb->cbData;
1715 else if (pUrb->fShortNotOk)
1719 return usbMsdCompleteStall(pThis, NULL, pUrb, "Data underrun");
1721 memcpy(&pUrb->abData[0], &pReq->pbBuf[pReq->offBuf], cbCopy);
1729 return usbMsdCompleteOk(pThis, pUrb, cbCopy);
1737 if ((pUrb->cbData < sizeof(USBCSW)) || (pUrb->cbData > sizeof(USBCSW) && pUrb->fShortNotOk))
1739 Log(("usbMsd: Unexpected status request size: %#x (expected %#x), fShortNotOK=%RTbool\n", pUrb->cbData, sizeof(USBCSW), pUrb->fShortNotOk));
1740 return usbMsdCompleteStall(pThis, NULL, pUrb, "Invalid CSW size");
1744 PUSBCSW pCsw = (PUSBCSW)&pUrb->abData[0];
1767 return usbMsdCompleteOk(pThis, pUrb, sizeof(*pCsw));
1778 if (pUrb->cbData != sizeof(USBCSW))
1780 Log(("usbMsdHandleBulkDevToHost: DATA_FROM_HOST; cbData=%#x -> stall\n", pUrb->cbData));
1781 return usbMsdCompleteStall(pThis, NULL, pUrb, "Invalid CSW size");
1793 usbMsdQueueAddTail(&pThis->ToHostQueue, pUrb);
1794 LogFlow(("usbMsdHandleBulkDevToHost: Added %p:%s to the to-host queue\n", pUrb, pUrb->pszDesc));
1804 return usbMsdCompleteStall(pThis, NULL, pUrb, "SCSI Submit #3");
1815 usbMsdQueueAddTail(&pThis->ToHostQueue, pUrb);
1816 LogFlow(("usbMsdHandleBulkDevToHost: Added %p:%s to the to-host queue\n", pUrb, pUrb->pszDesc));
1823 Log(("usbMsdHandleBulkDevToHost: enmState=READ (cbData=%#x)\n", pReq->enmState, pUrb->cbData));
1824 return usbMsdCompleteStall(pThis, NULL, pUrb, "Bad state D2H: READY");
1827 Log(("usbMsdHandleBulkDevToHost: enmState=%d cbData=%#x\n", pReq->enmState, pUrb->cbData));
1828 return usbMsdCompleteStall(pThis, NULL, pUrb, "Really bad state (D2H)!");
1836 static int usbMsdHandleDefaultPipe(PUSBMSD pThis, PUSBMSDEP pEp, PVUSBURB pUrb)
1838 PVUSBSETUP pSetup = (PVUSBSETUP)&pUrb->abData[0];
1839 AssertReturn(pUrb->cbData >= sizeof(*pSetup), VERR_VUSB_FAILED_TO_QUEUE_URB);
1850 return usbMsdCompleteStall(pThis, pEp, pUrb, "Bad GET_DESCRIPTOR");
1863 cbCopy = pUrb->cbData - sizeof(*pSetup);
1865 memcpy(&pUrb->abData[sizeof(*pSetup)], &g_UsbMsdDeviceQualifier, cbCopy);
1866 return usbMsdCompleteOk(pThis, pUrb, cbCopy + sizeof(*pSetup));
1870 cbCopy = pUrb->cbData - sizeof(*pSetup);
1872 memcpy(&pUrb->abData[sizeof(*pSetup)], &g_UsbMsdBOS, cbCopy);
1873 return usbMsdCompleteOk(pThis, pUrb, cbCopy + sizeof(*pSetup));
1889 usbMsdCompleteStall(pThis, pEp, pUrb, "TODO: standard request stuff");
1899 return usbMsdResetWorker(pThis, pUrb, false /*fSetConfig*/);
1909 usbMsdCompleteOk(pThis, pUrb, 1);
1915 return usbMsdCompleteStall(pThis, pEp, pUrb, "Unknown control msg");
1925 static DECLCALLBACK(int) usbMsdQueue(PPDMUSBINS pUsbIns, PVUSBURB pUrb)
1928 LogFlow(("usbMsdQueue/#%u: pUrb=%p:%s EndPt=%#x\n", pUsbIns->iInstance, pUrb, pUrb->pszDesc, pUrb->EndPt));
1935 switch (pUrb->EndPt)
1938 rc = usbMsdHandleDefaultPipe(pThis, &pThis->aEps[0], pUrb);
1944 rc = usbMsdHandleBulkDevToHost(pThis, &pThis->aEps[1], pUrb);
1948 rc = usbMsdHandleBulkHostToDev(pThis, &pThis->aEps[2], pUrb);
1952 AssertMsgFailed(("EndPt=%d\n", pUrb->EndPt));