Lines Matching refs:pUrb

314 LOCAL int vboxUSBSolarisCtrlXfer(vboxusb_state_t *pState, vboxusb_ep_t *pEp, vboxusb_urb_t *pUrb);
318 LOCAL int vboxUSBSolarisIntrXfer(vboxusb_state_t *pState, vboxusb_ep_t *pEp, vboxusb_urb_t *pUrb);
320 LOCAL int vboxUSBSolarisIsocXfer(vboxusb_state_t *pState, vboxusb_ep_t *pEp, vboxusb_urb_t *pUrb);
326 LOCAL inline void vboxUSBSolarisConcatMsg(vboxusb_urb_t *pUrb);
328 LOCAL inline void vboxUSBSolarisDeQueueURB(vboxusb_urb_t *pUrb, int URBStatus);
745 vboxusb_urb_t *pUrb = NULL;
746 while ((pUrb = list_remove_head(&pState->hUrbs)) != NULL)
748 if (pUrb->pMsg)
749 freemsg(pUrb->pMsg);
750 RTMemFree(pUrb);
753 while ((pUrb = list_remove_head(&pState->hLandedUrbs)) != NULL)
755 if (pUrb->pMsg)
756 freemsg(pUrb->pMsg);
757 RTMemFree(pUrb);
1720 vboxusb_urb_t *pUrb = NULL;
1723 pUrb = vboxUSBSolarisGetIsocInURB(pState, pUrbReq);
1725 pUrb = vboxUSBSolarisQueueURB(pState, pUrbReq, pMsg);
1727 if (RT_LIKELY(pUrb))
1729 switch (pUrb->enmType)
1733 rc = vboxUSBSolarisCtrlXfer(pState, pEp, pUrb);
1739 rc = vboxUSBSolarisBulkXfer(pState, pEp, pUrb);
1745 rc = vboxUSBSolarisIntrXfer(pState, pEp, pUrb);
1751 rc = vboxUSBSolarisIsocXfer(pState, pEp, pUrb);
1765 * the inflight URB list as well as pUrb->pMsg (data). Probably make this
1769 if (pUrb->pMsg)
1771 freemsg(pUrb->pMsg);
1772 pUrb->pMsg = NULL;
1775 if ( pUrb->enmType == VUSBXFERTYPE_ISOC
1776 && pUrb->enmDir == VUSBDIRECTION_IN)
1778 RTMemFree(pUrb);
1779 pUrb = NULL;
1783 pUrb->pMsg = NULL;
1784 pUrb->enmState = VBOXUSB_URB_STATE_FREE;
1796 && pUrb)
1798 if ( pUrb->enmType != VUSBXFERTYPE_ISOC
1799 || pUrb->enmDir != VUSBDIRECTION_IN)
1839 vboxusb_urb_t *pUrb = list_remove_head(&pState->hLandedUrbs);
1842 * It is safe to access pUrb->pMsg outside the state mutex because this is from the landed URB list
1846 if (pUrb)
1851 pUrbReq->pvUrbR3 = pUrb->pvUrbR3;
1852 pUrbReq->bEndpoint = pUrb->bEndpoint;
1853 pUrbReq->enmType = pUrb->enmType;
1854 pUrbReq->enmDir = pUrb->enmDir;
1855 pUrbReq->enmStatus = pUrb->enmStatus;
1857 if (RT_LIKELY(pUrb->pMsg))
1862 if (RT_LIKELY(pUrb->pvDataR3 != NIL_RTR3PTR))
1864 size_t cbData = RT_MIN(msgdsize(pUrb->pMsg), pUrb->cbDataR3);
1866 pUrbReq->pvData = (void *)pUrb->pvDataR3;
1871 if (RT_LIKELY( !pUrb->pMsg->b_cont
1874 rc = ddi_copyout(pUrb->pMsg->b_rptr, (void *)pUrbReq->pvData, cbData, Mode);
1883 RTR3PTR pvDataR3 = pUrb->pvDataR3;
1884 mblk_t *pMsg = pUrb->pMsg;
1901 if ((pvDataR3 - pUrb->pvDataR3) >= cbData)
1919 freemsg(pUrb->pMsg);
1920 pUrb->pMsg = NULL;
1924 if (pUrb->enmType == VUSBXFERTYPE_ISOC)
1926 if (pUrb->enmDir == VUSBDIRECTION_OUT)
1927 pUrbReq->cbData = pUrb->cbDataR3;
1944 if (pUrb->enmType == VUSBXFERTYPE_ISOC)
1946 AssertCompile(sizeof(pUrbReq->aIsocPkts) == sizeof(pUrb->aIsocPkts));
1947 pUrbReq->cIsocPkts = pUrb->cIsocPkts;
1949 for (unsigned i = 0; i < pUrb->cIsocPkts; i++)
1951 pUrbReq->aIsocPkts[i].cbPkt = pUrb->aIsocPkts[i].cbPkt;
1952 pUrbReq->aIsocPkts[i].cbActPkt = pUrb->aIsocPkts[i].cbActPkt;
1953 pUrbReq->aIsocPkts[i].enmStatus = pUrb->aIsocPkts[i].enmStatus;
1956 if (pUrb->enmDir == VUSBDIRECTION_IN)
1958 RTMemFree(pUrb);
1959 pUrb = NULL;
1963 if (pUrb)
1968 pUrb->cbDataR3 = 0;
1969 pUrb->pvDataR3 = NIL_RTR3PTR;
1970 pUrb->enmState = VBOXUSB_URB_STATE_FREE;
1972 list_insert_head(&pState->hUrbs, pUrb);
2591 vboxusb_urb_t *pUrb = list_remove_head(&pEp->hIsocInUrbs);
2592 while (pUrb)
2594 if (pUrb->pMsg)
2595 freemsg(pUrb->pMsg);
2596 RTMemFree(pUrb);
2597 pUrb = list_remove_head(&pEp->hIsocInUrbs);
2819 * @param pUrb The URB to initialize.
2831 vboxusb_urb_t *pUrb = RTMemAllocZ(sizeof(vboxusb_urb_t));
2832 if (RT_LIKELY(pUrb))
2834 pUrb->enmState = VBOXUSB_URB_STATE_INFLIGHT;
2835 pUrb->pState = pState;
2839 pUrb->pvUrbR3 = pUrbReq->pvUrbR3;
2840 pUrb->bEndpoint = pUrbReq->bEndpoint;
2841 pUrb->enmType = pUrbReq->enmType;
2842 pUrb->enmDir = pUrbReq->enmDir;
2843 pUrb->enmStatus = pUrbReq->enmStatus;
2844 pUrb->cbDataR3 = pUrbReq->cbData;
2845 pUrb->pvDataR3 = (RTR3PTR)pUrbReq->pvData;
2846 pUrb->cIsocPkts = pUrbReq->cIsocPkts;
2849 pUrb->aIsocPkts[i].cbPkt = pUrbReq->aIsocPkts[i].cbPkt;
2851 pUrb->pMsg = NULL;
2856 return pUrb;
2880 vboxusb_urb_t *pUrb = list_head(&pState->hUrbs);
2881 if (RT_LIKELY(pUrb))
2883 if (pUrb->pMsg)
2885 freemsg(pUrb->pMsg);
2886 pUrb->pMsg = NULL;
2888 pUrb->enmState = VBOXUSB_URB_STATE_FREE;
2892 vboxusb_urb_t *pUrb = list_head(&pState->hUrbs);
2893 if ( !pUrb
2894 || ( pUrb
2895 && pUrb->enmState != VBOXUSB_URB_STATE_FREE))
2898 pUrb = RTMemAllocZ(sizeof(vboxusb_urb_t));
2899 if (RT_UNLIKELY(!pUrb))
2912 Assert(pUrb && pUrb->enmState == VBOXUSB_URB_STATE_FREE);
2916 list_insert_tail(&pState->hUrbs, pUrb);
2919 pUrb->enmState = VBOXUSB_URB_STATE_INFLIGHT;
2921 Assert(pUrb->pMsg == NULL);
2922 pUrb->pState = pState;
2927 pUrb->pvUrbR3 = pUrbReq->pvUrbR3;
2928 pUrb->bEndpoint = pUrbReq->bEndpoint;
2929 pUrb->enmType = pUrbReq->enmType;
2930 pUrb->enmDir = pUrbReq->enmDir;
2931 pUrb->enmStatus = pUrbReq->enmStatus;
2932 pUrb->fShortOk = pUrbReq->fShortOk;
2933 pUrb->pvDataR3 = (RTR3PTR)pUrbReq->pvData;
2934 pUrb->cbDataR3 = pUrbReq->cbData;
2935 pUrb->cIsocPkts = pUrbReq->cIsocPkts;
2940 pUrb->aIsocPkts[i].cbPkt = pUrbReq->aIsocPkts[i].cbPkt;
2943 pUrb->pMsg = pMsg;
2948 return pUrb;
2955 * @param pUrb The URB to move.
2960 LOCAL inline void vboxUSBSolarisDeQueueURB(vboxusb_urb_t *pUrb, int URBStatus)
2962 LogFunc((DEVICE_NAME ":vboxUSBSolarisDeQueue pUrb=%p\n", pUrb));
2963 AssertPtrReturnVoid(pUrb);
2965 pUrb->enmStatus = vboxUSBSolarisGetUrbStatus(URBStatus);
2967 vboxusb_state_t *pState = pUrb->pState;
2971 pUrb->enmState = VBOXUSB_URB_STATE_LANDED;
2976 list_remove(&pState->hUrbs, pUrb);
2978 list_insert_tail(&pState->hLandedUrbs, pUrb);
2980 vboxUSBSolarisNotifyComplete(pUrb->pState);
2986 freemsg(pUrb->pMsg);
2987 pUrb->pMsg = NULL;
2988 pUrb->enmStatus = VUSBSTATUS_INVALID;
2996 * @param pUrb The URB to move.
2998 LOCAL inline void vboxUSBSolarisConcatMsg(vboxusb_urb_t *pUrb)
3003 if ( pUrb->pMsg
3004 && pUrb->pMsg->b_cont)
3006 mblk_t *pFullMsg = msgpullup(pUrb->pMsg, -1 /* all data */);
3009 freemsg(pUrb->pMsg);
3010 pUrb->pMsg = pFullMsg;
3059 * @param pUrb The VBox USB URB.
3062 * @remarks Any errors, the caller should free pUrb->pMsg.
3064 LOCAL int vboxUSBSolarisCtrlXfer(vboxusb_state_t *pState, vboxusb_ep_t *pEp, vboxusb_urb_t *pUrb)
3066 LogFunc((DEVICE_NAME ":vboxUSBSolarisCtrlXfer pState=%p pEp=%p pUrb=%p enmDir=%d cbData=%d\n", pState, pEp, pUrb,
3067 pUrb->enmDir, pUrb->cbDataR3));
3069 AssertPtrReturn(pUrb->pMsg, VERR_INVALID_PARAMETER);
3070 uchar_t *pSetupData = pUrb->pMsg->b_rptr;
3071 size_t cbData = pUrb->cbDataR3 > VBOXUSB_CTRL_XFER_SIZE ? pUrb->cbDataR3 - VBOXUSB_CTRL_XFER_SIZE : 0;
3089 if ( pUrb->enmDir == VUSBDIRECTION_OUT
3092 pUrb->pMsg->b_rptr += VBOXUSB_CTRL_XFER_SIZE;
3093 bcopy(pUrb->pMsg->b_rptr, pReq->ctrl_data->b_wptr, cbData);
3097 freemsg(pUrb->pMsg);
3098 pUrb->pMsg = NULL;
3104 if ( pUrb->enmDir == VUSBDIRECTION_IN
3105 && pUrb->fShortOk)
3114 pReq->ctrl_client_private = (usb_opaque_t)pUrb;
3155 vboxusb_urb_t *pUrb = (vboxusb_urb_t *)pReq->ctrl_client_private;
3156 if (RT_LIKELY(pUrb))
3179 pUrb->pMsg = pSetupMsg;
3180 pUrb->pMsg->b_cont = pReq->ctrl_data;
3182 vboxUSBSolarisConcatMsg(pUrb);
3185 if ( pUrb->pMsg
3186 && pUrb->pMsg->b_cont == NULL) /* Concat succeeded */
3189 pReq->ctrl_completion_reason, MBLKL(pUrb->pMsg)));
3190 Log((DEVICE_NAME ":%.*Rhxd\n", MBLKL(pUrb->pMsg), pUrb->pMsg->b_rptr));
3197 vboxUSBSolarisDeQueueURB(pUrb, pReq->ctrl_completion_reason);
3217 * @param pUrb The VBox USB URB.
3220 * @remarks Any errors, the caller should free pUrb->pMsg.
3222 LOCAL int vboxUSBSolarisBulkXfer(vboxusb_state_t *pState, vboxusb_ep_t *pEp, vboxusb_urb_t *pUrb)
3224 LogFunc((DEVICE_NAME ":vboxUSBSolarisBulkXfer pState=%p pEp=%p pUrb=%p enmDir=%d cbData=%d\n", pState, pEp, pUrb,
3225 pUrb->enmDir, pUrb->cbDataR3));
3231 usb_bulk_req_t *pReq = usb_alloc_bulk_req(pState->pDip, pUrb->enmDir == VUSBDIRECTION_IN ? pUrb->cbDataR3 : 0,
3239 if (pUrb->enmDir == VUSBDIRECTION_OUT)
3240 pReq->bulk_data = pUrb->pMsg;
3241 else if ( pUrb->enmDir == VUSBDIRECTION_IN
3242 && pUrb->fShortOk)
3247 pReq->bulk_len = pUrb->cbDataR3;
3252 pReq->bulk_client_private = (usb_opaque_t)pUrb;
3255 if (RT_UNLIKELY(pUrb->cbDataR3 > pState->cbMaxBulkXfer))
3258 pUrb->cbDataR3, pState->cbMaxBulkXfer));
3270 LogRel((DEVICE_NAME ":vboxUSBSolarisBulkXfer usb_pipe_bulk_xfer enmDir=%#x Ep=%#x failed! rc=%d\n", pUrb->enmDir,
3271 pUrb->bEndpoint, rc));
3275 if (pUrb->enmDir == VUSBDIRECTION_OUT) /* pUrb->pMsg freed by caller */
3303 vboxusb_urb_t *pUrb = (vboxusb_urb_t *)pReq->bulk_client_private;
3304 if (RT_LIKELY(pUrb))
3306 if (pUrb->enmDir == VUSBDIRECTION_OUT)
3312 pUrb->pMsg = pReq->bulk_data;
3314 vboxUSBSolarisConcatMsg(pUrb);
3320 pReq->bulk_completion_reason, pUrb->pMsg ? MBLKL(pUrb->pMsg) : 0));
3325 vboxUSBSolarisDeQueueURB(pUrb, pReq->bulk_completion_reason);
3344 * @param pUrb The VBox USB URB.
3347 * @remarks Any errors, the caller should free pUrb->pMsg.
3349 LOCAL int vboxUSBSolarisIntrXfer(vboxusb_state_t *pState, vboxusb_ep_t *pEp, vboxusb_urb_t *pUrb)
3351 LogFunc((DEVICE_NAME ":vboxUSBSolarisIntrXfer pState=%p pEp=%p pUrb=%p enmDir=%d cbData=%d\n", pState, pEp, pUrb,
3352 pUrb->enmDir, pUrb->cbDataR3));
3361 if (pUrb->enmDir == VUSBDIRECTION_OUT)
3363 pReq->intr_data = pUrb->pMsg;
3368 Assert(pUrb->enmDir == VUSBDIRECTION_IN);
3370 pReq->intr_attributes = USB_ATTRS_AUTOCLEARING | USB_ATTRS_ONE_XFER | (pUrb->fShortOk ? USB_ATTRS_SHORT_XFER_OK : 0);
3373 pReq->intr_len = pUrb->cbDataR3; /* Not pEp->EpDesc.wMaxPacketSize */
3377 pReq->intr_client_private = (usb_opaque_t)pUrb;
3418 vboxusb_urb_t *pUrb = (vboxusb_urb_t *)pReq->intr_client_private;
3419 if (RT_LIKELY(pUrb))
3421 if (pUrb->enmDir == VUSBDIRECTION_OUT)
3427 pUrb->pMsg = pReq->intr_data;
3433 pUrb->pMsg, pUrb->enmDir));
3438 vboxUSBSolarisDeQueueURB(pUrb, pReq->intr_completion_reason);
3457 * @param pUrb The VBox USB URB.
3460 * @remarks Any errors, the caller should free pUrb->pMsg.
3462 LOCAL int vboxUSBSolarisIsocXfer(vboxusb_state_t *pState, vboxusb_ep_t *pEp, vboxusb_urb_t *pUrb)
3464 // LogFunc((DEVICE_NAME ":vboxUSBSolarisIsocXfer pState=%p pEp=%p pUrb=%p\n", pState, pEp, pUrb));
3470 size_t cbData = (pUrb->enmDir == VUSBDIRECTION_IN ? pUrb->cIsocPkts * pUrb->aIsocPkts[0].cbPkt : 0);
3471 if (pUrb->enmDir == VUSBDIRECTION_IN)
3488 list_insert_tail(&pEp->hIsocInUrbs, pUrb);
3498 usb_isoc_req_t *pReq = usb_alloc_isoc_req(pState->pDip, pUrb->cIsocPkts, cbData, USB_FLAGS_NOSLEEP);
3499 Log((DEVICE_NAME ":vboxUSBSolarisIsocXfer enmDir=%#x cIsocPkts=%d aIsocPkts[0]=%d cbDataR3=%d\n", pUrb->enmDir,
3500 pUrb->cIsocPkts, pUrb->aIsocPkts[0].cbPkt, pUrb->cbDataR3));
3506 for (unsigned i = 0; i < pUrb->cIsocPkts; i++)
3507 pReq->isoc_pkt_descr[i].isoc_pkt_length = pUrb->aIsocPkts[i].cbPkt;
3509 if (pUrb->enmDir == VUSBDIRECTION_OUT)
3511 pReq->isoc_data = pUrb->pMsg;
3515 pReq->isoc_client_private = (usb_opaque_t)pUrb;
3524 pReq->isoc_pkts_count = pUrb->cIsocPkts;
3533 if (pUrb->enmDir == VUSBDIRECTION_IN)
3539 list_insert_tail(&pEp->hIsocInUrbs, pUrb);
3552 if (pUrb->enmDir == VUSBDIRECTION_IN)
3566 if (pUrb->enmDir == VUSBDIRECTION_OUT) /* pUrb->pMsg freed by caller */
3573 LogRel((DEVICE_NAME ":vboxUSBSolarisIsocXfer failed to alloc isoc req for %d packets\n", pUrb->cIsocPkts));
3629 vboxusb_urb_t *pUrb = list_remove_head(&pEp->hIsocInUrbs);
3630 if (RT_LIKELY(pUrb))
3637 pUrb->aIsocPkts[i].cbActPkt = pReq->isoc_pkt_descr[i].isoc_pkt_actual_length;
3638 pUrb->aIsocPkts[i].enmStatus = vboxUSBSolarisGetUrbStatus(pReq->isoc_pkt_descr[i].isoc_pkt_status);
3641 pUrb->pMsg = pReq->isoc_data;
3648 list_insert_tail(&pState->hLandedUrbs, pUrb);
3717 vboxusb_urb_t *pUrb = list_remove_head(&pEp->hIsocInUrbs);
3718 if (RT_UNLIKELY(!pUrb))
3724 list_insert_head(&pEp->hIsocInUrbs, pUrb);
3735 pUrb->aIsocPkts[i].cbActPkt = pBuffReq->aIsocPkts[i].cbActPkt;
3736 pUrb->aIsocPkts[i].enmStatus = pBuffReq->aIsocPkts[i].enmStatus;
3739 bcopy(pBuffReq->aIsocPkts, pUrb->aIsocPkts, pBuffReq->cIsocPkts * sizeof(VUSBISOC_PKT_DESC));
3741 pUrb->pMsg = pBuffReq->pMsg;
3749 list_insert_tail(&pState->hLandedUrbs, pUrb);
3841 vboxusb_urb_t *pUrb = list_remove_tail(&pEp->hIsocInUrbs);
3842 if (pUrb)
3846 freemsg(pUrb->pMsg);
3847 RTMemFree(pUrb);
3869 vboxusb_urb_t *pUrb = (vboxusb_urb_t *)pReq->isoc_client_private;
3870 if (RT_LIKELY(pUrb))
3876 pUrb->aIsocPkts[i].cbActPkt = pReq->isoc_pkt_descr[i].isoc_pkt_actual_length;
3877 pUrb->aIsocPkts[i].enmStatus = vboxUSBSolarisGetUrbStatus(pReq->isoc_pkt_descr[i].isoc_pkt_status);
3880 Log((DEVICE_NAME ":vboxUSBSolarisIsocOutXferCompleted cIsocPkts=%d cbData=%d cbActPkt=%d\n", pUrb->cIsocPkts,
3881 pUrb->cbDataR3, cbActPkt));
3885 if (RT_UNLIKELY(pUrb->pMsg != pReq->isoc_data)) /* Paranoia */
3887 freemsg(pUrb->pMsg);
3888 pUrb->pMsg = pReq->isoc_data;
3893 pUrb->cIsocPkts = pReq->isoc_pkts_count;
3894 pUrb->cbDataR3 = cbActPkt;
3899 vboxUSBSolarisDeQueueURB(pUrb, pReq->isoc_completion_reason);
3904 Log((DEVICE_NAME ":vboxUSBSolarisIsocOutXferCompleted missing private data!?! Dropping OUT pUrb.\n"));