~ubuntu-branches/ubuntu/vivid/virtualbox/vivid

« back to all changes in this revision

Viewing changes to src/VBox/HostDrivers/VBoxUSB/solaris/VBoxUSB-solaris.c

  • Committer: Package Import Robot
  • Author(s): Felix Geyer
  • Date: 2011-12-29 12:29:25 UTC
  • mfrom: (3.1.8 sid)
  • Revision ID: package-import@ubuntu.com-20111229122925-8ota2o33fuk0bkf8
Tags: 4.1.8-dfsg-1
* New upstream release.
* Move all transitional packages to section oldlibs and priority extra.
* Refresh 16-no-update.patch.
* Drop 36-kernel-3.2.patch, applied upstream.

Show diffs side-by-side

added added

removed removed

Lines of Context:
301
301
LOCAL void vboxUSBSolarisDestroyAllEndPoints(vboxusb_state_t *pState);
302
302
LOCAL void vboxUSBSolarisDestroyEndPoint(vboxusb_state_t *pState, vboxusb_ep_t *pEp);
303
303
LOCAL void vboxUSBSolarisCloseAllPipes(vboxusb_state_t *pState, bool fControlPipe);
304
 
LOCAL void vboxUSBSolarisCloseInterface(vboxusb_state_t *pState, uint8_t bInterface);
305
304
LOCAL int vboxUSBSolarisOpenPipe(vboxusb_state_t *pState, vboxusb_ep_t *pEp);
306
305
LOCAL void vboxUSBSolarisClosePipe(vboxusb_state_t *pState, vboxusb_ep_t *pEp);
307
306
LOCAL int vboxUSBSolarisCtrlXfer(vboxusb_state_t *pState, vboxusb_ep_t *pEp, vboxusb_urb_t *pUrb);
331
330
LOCAL int vboxUSBSolarisSetInterface(vboxusb_state_t *pState, uint8_t uInterface, uint8_t uAlt);
332
331
LOCAL int vboxUSBSolarisCloseDevice(vboxusb_state_t *pState, VBOXUSB_RESET_LEVEL enmReset);
333
332
LOCAL int vboxUSBSolarisAbortPipe(vboxusb_state_t *pState, uint8_t bEndpoint);
334
 
LOCAL bool vboxUSBSolarisIsAnyPipeOpen(vboxusb_state_t *pState);
335
333
LOCAL int vboxUSBSolarisGetConfigIndex(vboxusb_state_t *pState, uint_t uCfgValue);
336
334
 
337
335
/** Hotplug & Power Management Hooks */
706
704
             * Close all endpoints.
707
705
             */
708
706
            vboxUSBSolarisCloseAllPipes(pState, true /* ControlPipe */);
 
707
            pState->fClosed = true;
709
708
 
710
709
            /*
711
710
             * Deinitialize power, destroy endpoints.
1726
1725
 
1727
1726
            if (RT_FAILURE(rc))
1728
1727
            {
1729
 
                freemsg(pUrb->pMsg);
 
1728
                mutex_enter(&pState->Mtx);
 
1729
                if (pUrb->pMsg)
 
1730
                {
 
1731
                    freemsg(pUrb->pMsg);
 
1732
                    pUrb->pMsg = NULL;
 
1733
                }
1730
1734
 
1731
1735
                if (   pUrb->enmType == VUSBXFERTYPE_ISOC
1732
1736
                    && pUrb->enmDir  == VUSBDIRECTION_IN)
1739
1743
                    pUrb->pMsg = NULL;
1740
1744
                    pUrb->enmState = VBOXUSB_URB_STATE_FREE;
1741
1745
                }
 
1746
                mutex_exit(&pState->Mtx);
1742
1747
            }
1743
1748
        }
1744
1749
        else
2594
2599
 
2595
2600
 
2596
2601
/**
2597
 
 * Closes all pipes for a given interface.
2598
 
 *
2599
 
 * @param   pState          The USB device instance.
2600
 
 * @param   bInterface      The Interface.
2601
 
 */
2602
 
LOCAL void vboxUSBSolarisCloseInterface(vboxusb_state_t *pState, uint8_t bInterface)
2603
 
{
2604
 
    LogFlowFunc((DEVICE_NAME ":vboxUSBSolarisCloseInterface pState=%p bInterface=%#x\n", pState, bInterface));
2605
 
 
2606
 
    for (int i = 1; i < VBOXUSB_MAX_ENDPOINTS; i++)
2607
 
    {
2608
 
        vboxusb_ep_t *pEp = &pState->aEps[i];
2609
 
        if (   pEp
2610
 
            && pEp->pPipe
2611
 
            && pEp->uInterface == bInterface)
2612
 
        {
2613
 
            LogFlow((DEVICE_NAME ":vboxUSBSolarisCloseInterface closing[%d]\n", i));
2614
 
            vboxUSBSolarisClosePipe(pState, pEp);
2615
 
        }
2616
 
    }
2617
 
}
2618
 
 
2619
 
 
2620
 
/**
2621
2602
 * Open the pipe for an Endpoint.
2622
2603
 *
2623
2604
 * @param   pState          The USB device instance.
2754
2735
 
2755
2736
 
2756
2737
/**
2757
 
 * Check if any non-default Endpoints are open.
2758
 
 *
2759
 
 * @param   pState          The USB device instance.
2760
 
 *
2761
 
 * @returns Returns true if any non-default Endpoint is open, otherwise false.
2762
 
 */
2763
 
LOCAL bool vboxUSBSolarisIsAnyPipeOpen(vboxusb_state_t *pState)
2764
 
{
2765
 
    LogFlowFunc((DEVICE_NAME ":vboxUSBSolarisIsAnyPipeOpen pState=%p\n", pState));
2766
 
 
2767
 
    for (int i = 1; i < VBOXUSB_MAX_ENDPOINTS; i++)
2768
 
    {
2769
 
        vboxusb_ep_t *pEp = &pState->aEps[i];
2770
 
        if (pEp->pPipe)
2771
 
        {
2772
 
            LogFlow((DEVICE_NAME ":vboxUSBSolarisIsAnyPipeOpen pState=%p pEp=%p returns true.\n", pState, pEp));
2773
 
            return true;
2774
 
        }
2775
 
    }
2776
 
 
2777
 
    LogFlow((DEVICE_NAME ":vboxUSBSolarisIsAnyPipeOpen pState=%p returns false.\n", pState));
2778
 
    return false;
2779
 
}
2780
 
 
2781
 
 
2782
 
/**
2783
2738
 * Find the Configuration index for the passed in Configuration value.
2784
2739
 *
2785
2740
 * @param   pState          The USB device instance.
2882
2837
        || (   pUrb
2883
2838
            && pUrb->enmState != VBOXUSB_URB_STATE_FREE))
2884
2839
    {
2885
 
        mutex_exit(&pState->Mtx);
2886
2840
        pUrb = RTMemAllocZ(sizeof(vboxusb_urb_t));
2887
2841
        if (RT_UNLIKELY(!pUrb))
2888
2842
        {
 
2843
            mutex_exit(&pState->Mtx);
2889
2844
            LogRel((DEVICE_NAME ":vboxUSBSolarisQueueURB failed to alloc %d bytes.\n", sizeof(vboxusb_urb_t)));
2890
2845
            return NULL;
2891
2846
        }
2892
 
        mutex_enter(&pState->Mtx);
2893
2847
    }
2894
2848
    else
2895
2849
    {
2905
2859
 
2906
2860
    pUrb->enmState = VBOXUSB_URB_STATE_INFLIGHT;
2907
2861
 
2908
 
    mutex_exit(&pState->Mtx);
2909
 
 
2910
2862
    Assert(pUrb->pMsg == NULL);
2911
2863
    pUrb->pState = pState;
2912
2864
    LogFlow((DEVICE_NAME ":vboxUSBSolarisQueueURB cInflightUrbs=%d\n", pState->cInflightUrbs));
2930
2882
        pUrb->pMsg = pMsg;
2931
2883
    }
2932
2884
 
 
2885
    mutex_exit(&pState->Mtx);
 
2886
 
2933
2887
    return pUrb;
2934
2888
}
2935
2889