VirtualBox

Changeset 50228 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Jan 24, 2014 9:16:37 PM (11 years ago)
Author:
vboxsync
Message:

USB/Proxy: Start a source code cleanup, remove unused struct members and make the generic proxy code do the backend specific memory allocation (fixes a small memory leak in the VRDP backend when closing a proxy device)

Location:
trunk/src/VBox/Devices/USB
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/USB/USBProxyDevice-stub.cpp

    r44529 r50228  
    3333{
    3434    "host",
     35    0,          /* cbBackend */
    3536    NULL,       /* Open */
    3637    NULL,       /* Init */
  • trunk/src/VBox/Devices/USB/USBProxyDevice.cpp

    r49814 r50228  
    741741        RTStrFree(pUsbIns->pszName);
    742742    pUsbIns->pszName = NULL;
     743
     744    if (pThis->pvInstanceDataR3)
     745        RTMemFree(pThis->pvInstanceDataR3);
    743746}
    744747
     
    820823    pThis->fMaskedIfs = 0;
    821824    pThis->fOpened = false;
    822     pThis->fInited = false;
    823825
    824826    /*
     
    844846    else
    845847        pThis->pOps = &g_USBProxyDeviceVRDP;
     848
     849    pThis->pvInstanceDataR3 = RTMemAllocZ(pThis->pOps->cbBackend);
     850    if (!pThis->pvInstanceDataR3)
     851        return PDMUSB_SET_ERROR(pUsbIns, VERR_NO_MEMORY, N_("USBProxy: can't allocate memory for host backend"));
     852
    846853    rc = pThis->pOps->pfnOpen(pThis, szAddress, pvBackend);
    847854    if (RT_FAILURE(rc))
     
    10651072            return rc;
    10661073    }
    1067     pThis->fInited = true;
    10681074
    10691075    /*
  • trunk/src/VBox/Devices/USB/USBProxyDevice.h

    r49814 r50228  
    5151    /** Name of the backend. */
    5252    const char *pszName;
     53    /** Size of the backend specific data. */
     54    size_t      cbBackend;
    5355
    5456    /**
     
    6466     * @param   pvBackend   Pointer to backend specific data.
    6567     */
    66     int  (* pfnOpen)(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend);
     68    DECLR3CALLBACKMEMBER(int, pfnOpen, (PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend));
    6769
    6870    /**
     
    7375     * @param   pProxyDev   The USB Proxy Device instance.
    7476     */
    75     int  (* pfnInit)(PUSBPROXYDEV pProxyDev);
    76 
    77     /**         Closes handle to the host USB device.
     77    DECLR3CALLBACKMEMBER(int, pfnInit, (PUSBPROXYDEV pProxyDev));
     78
     79    /**
     80     * Closes handle to the host USB device.
    7881     *
    7982     * @param   pDev        The USB Proxy Device instance.
    8083     */
    81     void (* pfnClose)(PUSBPROXYDEV pProxyDev);
     84    DECLR3CALLBACKMEMBER(void, pfnClose, (PUSBPROXYDEV pProxyDev));
    8285
    8386    /**
     
    9194     *                          being logically reconnected.
    9295     */
    93     int  (* pfnReset)(PUSBPROXYDEV pProxyDev, bool fResetOnLinux);
    94 
    95     /** @todo make it return a VBox status code! */
    96     int  (* pfnSetConfig)(PUSBPROXYDEV pProxyDev, int iCfg);
    97 
    98     /** @todo make it return a VBox status code! */
    99     int  (* pfnClaimInterface)(PUSBPROXYDEV pProxyDev, int iIf);
    100 
    101     /** @todo make it return a VBox status code! */
    102     int  (* pfnReleaseInterface)(PUSBPROXYDEV pProxyDev, int iIf);
    103 
    104     /** @todo make it return a VBox status code! */
    105     int  (* pfnSetInterface)(PUSBPROXYDEV pProxyDev, int iIf, int setting);
    106 
    107     /** @todo make it return a VBox status code! */
    108     bool (* pfnClearHaltedEndpoint)(PUSBPROXYDEV  pDev, unsigned int iEp);
     96    DECLR3CALLBACKMEMBER(int, pfnReset, (PUSBPROXYDEV pProxyDev, bool fResetOnLinux));
     97
     98    /** @todo make it return a VBox status code! */
     99    DECLR3CALLBACKMEMBER(int, pfnSetConfig, (PUSBPROXYDEV pProxyDev, int iCfg));
     100
     101    /** @todo make it return a VBox status code! */
     102    DECLR3CALLBACKMEMBER(int, pfnClaimInterface, (PUSBPROXYDEV pProxyDev, int iIf));
     103
     104    /** @todo make it return a VBox status code! */
     105    DECLR3CALLBACKMEMBER(int, pfnReleaseInterface, (PUSBPROXYDEV pProxyDev, int iIf));
     106
     107    /** @todo make it return a VBox status code! */
     108    DECLR3CALLBACKMEMBER(int, pfnSetInterface, (PUSBPROXYDEV pProxyDev, int iIf, int setting));
     109
     110    /** @todo make it return a VBox status code! */
     111    DECLR3CALLBACKMEMBER(bool, pfnClearHaltedEndpoint, (PUSBPROXYDEV  pDev, unsigned int iEp));
    109112
    110113    /** @todo make it return a VBox status code! Add pDev. */
    111     int  (* pfnUrbQueue)(PVUSBURB pUrb);
     114    DECLR3CALLBACKMEMBER(int, pfnUrbQueue, (PVUSBURB pUrb));
    112115
    113116    /**
     
    117120     * @todo make it return a VBox status code! Add pDev.
    118121     */
    119     void (* pfnUrbCancel)(PVUSBURB pUrb);
     122    DECLR3CALLBACKMEMBER(void, pfnUrbCancel, (PVUSBURB pUrb));
    120123
    121124    /**
     
    128131     *                      wait at all.
    129132     */
    130     PVUSBURB (* pfnUrbReap)(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies);
     133    DECLR3CALLBACKMEMBER(PVUSBURB, pfnUrbReap, (PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies));
    131134
    132135    /**
     
    136139     * @param   pProxyDev   The device.
    137140     */
    138     int (* pfnWakeup)(PUSBPROXYDEV pProxyDev);
     141    DECLR3CALLBACKMEMBER(int, pfnWakeup, (PUSBPROXYDEV pProxyDev));
    139142
    140143    /** Dummy entry for making sure we've got all members initialized. */
     
    171174    PUSBPROXYDEV        pPrev;
    172175    /** The vrdp device ID */
    173     uint32_t devid;
     176    uint32_t            devid;
    174177    /** Linked list of in-flight URBs */
    175178    PVUSBURB            pUrbs;
     
    203206     * For dealing with failed construction (the destruct method is always called). */
    204207    bool                fOpened;
    205     /** Whether we've called pfnInit or not.
    206      * For dealing with failed construction (the destruct method is always called). */
    207     bool                fInited;
    208208    /** Whether the device has been detached.
    209209     * This is hack for making PDMUSBREG::pfnUsbQueue return the right status code. */
    210210    bool                fDetached;
    211     /** Backend specific data */
    212     union USBPROXYBACKENDDATA
    213     {
    214         /** Pointer to some backend data.
    215          * The Linux and Darwin backends are making use of this. */
    216         void *pv;
    217         RTFILE hFile;
    218         int fd;
    219         struct vrdp_priv
    220         {
    221             void *pCallback;
    222             void *pDevice;
    223         } vrdp;
    224     } Backend;
     211    /** Backend specific data, the size is stored in pOps::cbBackend. */
     212    void                *pvInstanceDataR3;
    225213} USBPROXYDEV;
     214
     215/** @def USBPROXYDEV_2_DATA
     216 * Converts a USB proxy Device, pointer to a pointer to the backend specific instance data.
     217 */
     218#define USBPROXYDEV_2_DATA(a_pProxyDev, a_Type)   ( (a_Type)(a_pProxyDev)->pvInstanceDataR3 )
    226219
    227220static inline char *usbProxyGetName(PUSBPROXYDEV pProxyDev)
  • trunk/src/VBox/Devices/USB/darwin/USBProxyDevice-darwin.cpp

    r50093 r50228  
    55
    66/*
    7  * Copyright (C) 2006-2012 Oracle Corporation
     7 * Copyright (C) 2006-2014 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    10881088 * @param   pvBackend       Backend specific pointer, unused for the Darwin backend.
    10891089 */
    1090 static int usbProxyDarwinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
     1090static DECLCALLBACK(int) usbProxyDarwinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
    10911091{
    10921092    int vrc;
     
    10981098    vrc = RTOnce(&g_usbProxyDarwinOnce, usbProxyDarwinInitOnce, NULL);
    10991099    AssertRCReturn(vrc, vrc);
     1100
     1101    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
    11001102
    11011103    /*
     
    12321234            {
    12331235                /*
    1234                  * Create a proxy device instance.
     1236                 * Init a proxy device instance.
    12351237                 */
    1236                 vrc = VERR_NO_MEMORY;
    1237                 PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)RTMemAllocZ(sizeof(*pDevOsX));
    1238                 if (pDevOsX)
     1238                RTListInit((PRTLISTNODE)&pDevOsX->HeadOfRunLoopLst);
     1239                vrc = RTCritSectInit(&pDevOsX->CritSect);
     1240                if (RT_SUCCESS(vrc))
    12391241                {
    1240                     RTListInit((PRTLISTNODE)&pDevOsX->HeadOfRunLoopLst);
    1241                     vrc = RTCritSectInit(&pDevOsX->CritSect);
     1242                    pDevOsX->USBDevice = USBDevice;
     1243                    pDevOsX->ppDevI = ppDevI;
     1244                    pDevOsX->pProxyDev = pProxyDev;
     1245
     1246                    /*
     1247                     * Try seize all the interface.
     1248                     */
     1249                    char *pszDummyName = pProxyDev->pUsbIns->pszName;
     1250                    pProxyDev->pUsbIns->pszName = (char *)pszAddress;
     1251                    vrc = usbProxyDarwinSeizeAllInterfaces(pDevOsX, false /* give up on failure */);
     1252                    pProxyDev->pUsbIns->pszName = pszDummyName;
    12421253                    if (RT_SUCCESS(vrc))
    12431254                    {
    1244                         pDevOsX->USBDevice = USBDevice;
    1245                         pDevOsX->ppDevI = ppDevI;
    1246                         pDevOsX->pProxyDev = pProxyDev;
    1247 
    12481255                        /*
    1249                          * Try seize all the interface.
     1256                         * Create the async event source and add it to the run loop.
    12501257                         */
    1251                         char *pszDummyName = pProxyDev->pUsbIns->pszName;
    1252                         pProxyDev->pUsbIns->pszName = (char *)pszAddress;
    1253                         vrc = usbProxyDarwinSeizeAllInterfaces(pDevOsX, false /* give up on failure */);
    1254                         pProxyDev->pUsbIns->pszName = pszDummyName;
    1255                         if (RT_SUCCESS(vrc))
     1258                        irc = (*ppDevI)->CreateDeviceAsyncEventSource(ppDevI, &pDevOsX->RunLoopSrcRef);
     1259                        if (irc == kIOReturnSuccess)
    12561260                        {
    12571261                            /*
    1258                              * Create the async event source and add it to the run loop.
     1262                             * Determine the active configuration.
     1263                             * Can cause hangs, so drop it for now.
    12591264                             */
    1260                             irc = (*ppDevI)->CreateDeviceAsyncEventSource(ppDevI, &pDevOsX->RunLoopSrcRef);
    1261                             if (irc == kIOReturnSuccess)
     1265                            /** @todo test Palm. */
     1266                            //uint8_t u8Cfg;
     1267                            //irc = (*ppDevI)->GetConfiguration(ppDevI, &u8Cfg);
     1268                            if (irc != kIOReturnNoDevice)
    12621269                            {
    1263                                 /*
    1264                                  * Determine the active configuration.
    1265                                  * Can cause hangs, so drop it for now.
    1266                                  */
    1267                                 /** @todo test Palm. */
    1268                                 //uint8_t u8Cfg;
    1269                                 //irc = (*ppDevI)->GetConfiguration(ppDevI, &u8Cfg);
    1270                                 if (irc != kIOReturnNoDevice)
     1270                                CFRunLoopSourceContext CtxRunLoopSource;
     1271                                CtxRunLoopSource.version = 0;
     1272                                CtxRunLoopSource.info = NULL;
     1273                                CtxRunLoopSource.retain = NULL;
     1274                                CtxRunLoopSource.release = NULL;
     1275                                CtxRunLoopSource.copyDescription = NULL;
     1276                                CtxRunLoopSource.equal = NULL;
     1277                                CtxRunLoopSource.hash = NULL;
     1278                                CtxRunLoopSource.schedule = NULL;
     1279                                CtxRunLoopSource.cancel = NULL;
     1280                                CtxRunLoopSource.perform = usbProxyDarwinPerformWakeup;
     1281                                pDevOsX->hRunLoopSrcWakeRef = CFRunLoopSourceCreate(NULL, 0, &CtxRunLoopSource);
     1282                                if (CFRunLoopSourceIsValid(pDevOsX->hRunLoopSrcWakeRef))
    12711283                                {
    1272                                     CFRunLoopSourceContext CtxRunLoopSource;
    1273                                     CtxRunLoopSource.version = 0;
    1274                                     CtxRunLoopSource.info = NULL;
    1275                                     CtxRunLoopSource.retain = NULL;
    1276                                     CtxRunLoopSource.release = NULL;
    1277                                     CtxRunLoopSource.copyDescription = NULL;
    1278                                     CtxRunLoopSource.equal = NULL;
    1279                                     CtxRunLoopSource.hash = NULL;
    1280                                     CtxRunLoopSource.schedule = NULL;
    1281                                     CtxRunLoopSource.cancel = NULL;
    1282                                     CtxRunLoopSource.perform = usbProxyDarwinPerformWakeup;
    1283                                     pDevOsX->hRunLoopSrcWakeRef = CFRunLoopSourceCreate(NULL, 0, &CtxRunLoopSource);
    1284                                     if (CFRunLoopSourceIsValid(pDevOsX->hRunLoopSrcWakeRef))
    1285                                     {
    1286                                         //pProxyDev->iActiveCfg = irc == kIOReturnSuccess ? u8Cfg : -1;
    1287                                         RTListInit(&pDevOsX->HeadOfRunLoopWakeLst);
    1288                                         pProxyDev->iActiveCfg = -1;
    1289                                         pProxyDev->cIgnoreSetConfigs = 1;
    1290 
    1291                                         pProxyDev->Backend.pv = pDevOsX;
    1292                                         usbProxyDarwinAddRunLoopRef(&pDevOsX->HeadOfRunLoopLst, pDevOsX->RunLoopSrcRef);
    1293                                         return VINF_SUCCESS;        /* return */
    1294                                     }
    1295                                     else
    1296                                     {
    1297                                         LogRel(("USB: Device '%s' out of memory allocating runloop source\n", pszAddress));
    1298                                         vrc = VERR_NO_MEMORY;
    1299                                     }
     1284                                    //pProxyDev->iActiveCfg = irc == kIOReturnSuccess ? u8Cfg : -1;
     1285                                    RTListInit(&pDevOsX->HeadOfRunLoopWakeLst);
     1286                                    pProxyDev->iActiveCfg = -1;
     1287                                    pProxyDev->cIgnoreSetConfigs = 1;
     1288
     1289                                    pProxyDev->Backend.pv = pDevOsX;
     1290                                    usbProxyDarwinAddRunLoopRef(&pDevOsX->HeadOfRunLoopLst, pDevOsX->RunLoopSrcRef);
     1291                                    return VINF_SUCCESS;        /* return */
    13001292                                }
    1301                                 vrc = VERR_VUSB_DEVICE_NOT_ATTACHED;
     1293                                else
     1294                                {
     1295                                    LogRel(("USB: Device '%s' out of memory allocating runloop source\n", pszAddress));
     1296                                    vrc = VERR_NO_MEMORY;
     1297                                }
    13021298                            }
    1303                             else
    1304                                 vrc = RTErrConvertFromDarwin(irc);
    1305 
    1306                             usbProxyDarwinReleaseAllInterfaces(pDevOsX);
     1299                            vrc = VERR_VUSB_DEVICE_NOT_ATTACHED;
    13071300                        }
    1308                         /* else: already bitched */
    1309 
    1310                         RTCritSectDelete(&pDevOsX->CritSect);
     1301                        else
     1302                            vrc = RTErrConvertFromDarwin(irc);
     1303
     1304                        usbProxyDarwinReleaseAllInterfaces(pDevOsX);
    13111305                    }
    1312 
    1313                     RTMemFree(pDevOsX);
     1306                    /* else: already bitched */
     1307
     1308                    RTCritSectDelete(&pDevOsX->CritSect);
    13141309                }
    13151310
     
    13521347 * Closes the proxy device.
    13531348 */
    1354 static void usbProxyDarwinClose(PUSBPROXYDEV pProxyDev)
     1349static DECLCALLBACK(void) usbProxyDarwinClose(PUSBPROXYDEV pProxyDev)
    13551350{
    13561351    LogFlow(("usbProxyDarwinClose: pProxyDev=%s\n", pProxyDev->pUsbIns->pszName));
    1357     PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
    1358     Assert(pDevOsX);
    1359     if (!pDevOsX)
    1360         return;
     1352    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
     1353    AssertPtrReturnVoid(pDevOsX);
    13611354
    13621355    /*
     
    14291422    }
    14301423
    1431     RTMemFree(pDevOsX);
    1432     pProxyDev->Backend.pv = NULL;
    1433 
    14341424#ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
    14351425    USBLibTerm();
     
    14451435 * @param   pDev    The device to reset.
    14461436 */
    1447 static int usbProxyDarwinReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
    1448 {
    1449     PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
     1437static DECLCALLBACK(int) usbProxyDarwinReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
     1438{
     1439    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
    14501440    LogFlow(("usbProxyDarwinReset: pProxyDev=%s\n", pProxyDev->pUsbIns->pszName));
    14511441
     
    14831473 * @param   iCfg            The configuration to set.
    14841474 */
    1485 static int usbProxyDarwinSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
    1486 {
    1487     PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
     1475static DECLCALLBACK(int) usbProxyDarwinSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
     1476{
     1477    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
    14881478    LogFlow(("usbProxyDarwinSetConfig: pProxyDev=%s cfg=%#x\n",
    14891479             pProxyDev->pUsbIns->pszName, iCfg));
     
    15101500 * @returns success indicator (always true).
    15111501 */
    1512 static int usbProxyDarwinClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
     1502static DECLCALLBACK(int) usbProxyDarwinClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
    15131503{
    15141504    return true;
     
    15241514 * @returns success indicator.
    15251515 */
    1526 static int usbProxyDarwinReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
     1516static DECLCALLBACK(int) usbProxyDarwinReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
    15271517{
    15281518    return true;
     
    15351525 * @returns success indicator.
    15361526 */
    1537 static int usbProxyDarwinSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
    1538 {
    1539     PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
     1527static DECLCALLBACK(int) usbProxyDarwinSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
     1528{
     1529    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
    15401530    IOReturn irc = kIOReturnSuccess;
    15411531    PUSBPROXYIFOSX pIf = usbProxyDarwinGetInterface(pDevOsX, iIf);
     
    15821572 * Clears the halted endpoint 'EndPt'.
    15831573 */
    1584 static bool usbProxyDarwinClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndPt)
    1585 {
    1586     PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
     1574static DECLCALLBACK(bool) usbProxyDarwinClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndPt)
     1575{
     1576    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
    15871577    LogFlow(("usbProxyDarwinClearHaltedEp: pProxyDev=%s EndPt=%#x\n", pProxyDev->pUsbIns->pszName, EndPt));
    15881578
     
    16191609 * @copydoc USBPROXYBACK::pfnUrbQueue
    16201610 */
    1621 static int usbProxyDarwinUrbQueue(PVUSBURB pUrb)
     1611static DECLCALLBACK(int) usbProxyDarwinUrbQueue(PVUSBURB pUrb)
    16221612{
    16231613    PUSBPROXYDEV    pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
    1624     PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
     1614    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
    16251615    LogFlow(("%s: usbProxyDarwinUrbQueue: pProxyDev=%s pUrb=%p EndPt=%d cbData=%d\n",
    16261616             pUrb->pszDesc, pProxyDev->pUsbIns->pszName, pUrb, pUrb->EndPt, pUrb->cbData));
     
    18331823 * @param   cMillies    Number of milliseconds to wait. Use 0 to not wait at all.
    18341824 */
    1835 static PVUSBURB usbProxyDarwinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
     1825static DECLCALLBACK(PVUSBURB) usbProxyDarwinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
    18361826{
    18371827    PVUSBURB pUrb = NULL;
    1838     PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
     1828    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
    18391829    CFRunLoopRef hRunLoopRef = CFRunLoopGetCurrent();
    18401830
     
    19071897 *          requests, we should probably be fine...
    19081898 */
    1909 static void usbProxyDarwinUrbCancel(PVUSBURB pUrb)
     1899static DECLCALLBACK(void) usbProxyDarwinUrbCancel(PVUSBURB pUrb)
    19101900{
    19111901    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
    1912     PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
     1902    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
    19131903    //PUSBPROXYURBOSX pUrbOsX = (PUSBPROXYURBOSX)pUrb->Dev.pvProxyUrb;
    19141904    LogFlow(("%s: usbProxyDarwinUrbCancel: pProxyDev=%s EndPt=%d\n",
     
    19381928
    19391929
    1940 static int usbProxyDarwinWakeup(PUSBPROXYDEV pProxyDev)
    1941 {
    1942     PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
     1930static DECLCALLBACK(int) usbProxyDarwinWakeup(PUSBPROXYDEV pProxyDev)
     1931{
     1932    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
    19431933
    19441934    LogFlow(("usbProxyDarwinWakeup: pProxyDev=%p\n", pProxyDev));
     
    19631953extern const USBPROXYBACK g_USBProxyDeviceHost =
    19641954{
     1955    /* pszName */
    19651956    "host",
     1957    /* cbBackend */
     1958    sizeof(USBPROXYDEVOSX),
    19661959    usbProxyDarwinOpen,
    19671960    NULL,
  • trunk/src/VBox/Devices/USB/freebsd/USBProxyDevice-freebsd.cpp

    r44528 r50228  
    77 * Includes contributions from Hans Petter Selasky
    88 *
    9  * Copyright (C) 2006-2012 Oracle Corporation
     9 * Copyright (C) 2006-2014 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    128128{
    129129    int rc = VINF_SUCCESS;
    130     PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
     130    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    131131
    132132    LogFlow(("usbProxyFreeBSDDoIoCtl: iCmd=%#x\n", iCmd));
     
    159159{
    160160    struct usb_fs_init UsbFsInit;
    161     PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
     161    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    162162    int rc;
    163163
     
    190190{
    191191    struct usb_fs_uninit UsbFsUninit;
    192     PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
     192    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    193193    int rc;
    194194
     
    241241static int usbProxyFreeBSDEndpointOpen(PUSBPROXYDEV pProxyDev, int Endpoint, bool fIsoc, int index)
    242242{
    243     PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
     243    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    244244    PUSBENDPOINTFBSD pEndpointFBSD = NULL; /* shut up gcc */
    245245    struct usb_fs_endpoint *pXferEndpoint;
     
    316316static int usbProxyFreeBSDEndpointClose(PUSBPROXYDEV pProxyDev, int Endpoint)
    317317{
    318     PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
     318    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    319319    PUSBENDPOINTFBSD pEndpointFBSD = &pDevFBSD->aSwEndpoint[Endpoint];
    320320    struct usb_fs_close UsbFsClose;
     
    360360 * @param   pvBackend       Backend specific pointer, unused for the linux backend.
    361361 */
    362 static int usbProxyFreeBSDOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress,
    363                                void *pvBackend)
    364 {
     362static DECLCALLBACK(int) usbProxyFreeBSDOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress,
     363                                             void *pvBackend)
     364{
     365    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    365366    int rc;
    366367
    367368    LogFlow(("usbProxyFreeBSDOpen: pProxyDev=%p pszAddress=%s\n", pProxyDev, pszAddress));
     369
     370    NOREF(pvBackend);
    368371
    369372    /*
     
    375378    {
    376379        /*
    377          * Allocate and initialize the linux backend data.
     380         * Initialize the FreeBSD backend data.
    378381         */
    379         PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD)RTMemAllocZ(sizeof(USBPROXYDEVFBSD));
    380         if (pDevFBSD)
    381         {
    382             pDevFBSD->hFile = hFile;
    383             pProxyDev->Backend.pv = pDevFBSD;
    384 
    385             rc = usbProxyFreeBSDFsInit(pProxyDev);
    386             if (RT_SUCCESS(rc))
    387             {
    388                 LogFlow(("usbProxyFreeBSDOpen(%p, %s): returns successfully hFile=%RTfile iActiveCfg=%d\n",
    389                          pProxyDev, pszAddress, pDevFBSD->hFile, pProxyDev->iActiveCfg));
    390 
    391                 return VINF_SUCCESS;
    392             }
    393 
    394             RTMemFree(pDevFBSD);
    395         }
    396         else
    397             rc = VERR_NO_MEMORY;
     382        pDevFBSD->hFile = hFile;
     383        rc = usbProxyFreeBSDFsInit(pProxyDev);
     384        if (RT_SUCCESS(rc))
     385        {
     386            LogFlow(("usbProxyFreeBSDOpen(%p, %s): returns successfully hFile=%RTfile iActiveCfg=%d\n",
     387                     pProxyDev, pszAddress, pDevFBSD->hFile, pProxyDev->iActiveCfg));
     388
     389            return VINF_SUCCESS;
     390        }
    398391
    399392        RTFileClose(hFile);
     
    405398         pProxyDev, pszAddress, rc));
    406399
    407     pProxyDev->Backend.pv = NULL;
    408 
    409     NOREF(pvBackend);
    410400    return rc;
    411401}
     
    419409 * @param   pProxyDev       The proxy device.
    420410 */
    421 static int usbProxyFreeBSDInit(PUSBPROXYDEV pProxyDev)
    422 {
    423     PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
     411static DECLCALLBACK(int) usbProxyFreeBSDInit(PUSBPROXYDEV pProxyDev)
     412{
     413    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    424414    int rc;
    425415
     
    449439 * Closes the proxy device.
    450440 */
    451 static void usbProxyFreeBSDClose(PUSBPROXYDEV pProxyDev)
    452 {
    453     PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD)pProxyDev->Backend.pv;
     441static DECLCALLBACK(void) usbProxyFreeBSDClose(PUSBPROXYDEV pProxyDev)
     442{
     443    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    454444
    455445    LogFlow(("usbProxyFreeBSDClose: pProxyDev=%s\n", pProxyDev->pUsbIns->pszName));
     
    475465 * @param   pDev    The device to reset.
    476466 */
    477 static int usbProxyFreeBSDReset(PUSBPROXYDEV pProxyDev, bool fResetOnFreeBSD)
    478 {
    479     PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
     467static DECLCALLBACK(int) usbProxyFreeBSDReset(PUSBPROXYDEV pProxyDev, bool fResetOnFreeBSD)
     468{
     469    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    480470    int iParm;
    481471    int rc = VINF_SUCCESS;
     
    532522 * @param   iCfg            The configuration to set.
    533523 */
    534 static int usbProxyFreeBSDSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
    535 {
    536     PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
     524static DECLCALLBACK(int) usbProxyFreeBSDSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
     525{
     526    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    537527    int iCfgIndex;
    538528    int rc;
     
    589579 * @returns success indicator.
    590580 */
    591 static int usbProxyFreeBSDClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
     581static DECLCALLBACK(int) usbProxyFreeBSDClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
    592582{
    593583    int rc;
     
    614604 * @returns success indicator.
    615605 */
    616 static int usbProxyFreeBSDReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
     606static DECLCALLBACK(int) usbProxyFreeBSDReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
    617607{
    618608    int rc;
     
    633623 * @returns success indicator.
    634624 */
    635 static int
     625static DECLCALLBACK(int)
    636626usbProxyFreeBSDSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
    637627{
    638     PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
     628    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    639629    struct usb_alt_interface UsbIntAlt;
    640630    int rc;
     
    673663 * Clears the halted endpoint 'ep_num'.
    674664 */
    675 static bool usbProxyFreeBSDClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int ep_num)
     665static DECLCALLBACK(bool) usbProxyFreeBSDClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int ep_num)
    676666{
    677667    struct usb_ctl_request Req;
     
    707697 * @copydoc USBPROXYBACK::pfnUrbQueue
    708698 */
    709 static int usbProxyFreeBSDUrbQueue(PVUSBURB pUrb)
     699static DECLCALLBACK(int) usbProxyFreeBSDUrbQueue(PVUSBURB pUrb)
    710700{
    711701    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
    712     PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
     702    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    713703    PUSBENDPOINTFBSD pEndpointFBSD;
    714704    struct usb_fs_endpoint *pXferEndpoint;
     
    851841 * @param   cMillies    Number of milliseconds to wait. Use 0 to not wait at all.
    852842 */
    853 static PVUSBURB usbProxyFreeBSDUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
     843static DECLCALLBACK(PVUSBURB) usbProxyFreeBSDUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
    854844{
    855845    struct usb_fs_endpoint *pXferEndpoint;
    856     PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
     846    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
    857847    PUSBENDPOINTFBSD pEndpointFBSD;
    858848    PVUSBURB pUrb;
     
    1007997 * The URB requires reaping, so we don't change its state.
    1008998 */
    1009 static void usbProxyFreeBSDUrbCancel(PVUSBURB pUrb)
     999static DECLCALLBACK(void) usbProxyFreeBSDUrbCancel(PVUSBURB pUrb)
    10101000{
    10111001    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
     
    10271017extern const USBPROXYBACK g_USBProxyDeviceHost =
    10281018{
     1019    /* pszName */
    10291020    "host",
     1021    /* cbBackend */
     1022    sizeof(PUSBPROXYDEVFBSD),
    10301023    usbProxyFreeBSDOpen,
    10311024    usbProxyFreeBSDInit,
  • trunk/src/VBox/Devices/USB/linux/USBProxyDevice-linux.cpp

    r49814 r50228  
    160160    /** The device node/sysfs path of the device.
    161161     * Used to figure out the configuration after a reset. */
    162     char                szPath[1];
     162    char                *pszPath;
    163163} USBPROXYDEVLNX, *PUSBPROXYDEVLNX;
    164164
     
    194194{
    195195    int rc;
    196     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     196    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    197197    do
    198198    {
     
    225225static void usbProxLinuxUrbUnplugged(PUSBPROXYDEV pProxyDev)
    226226{
    227     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     227    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    228228
    229229    /*
     
    307307static PUSBPROXYURBLNX usbProxyLinuxUrbAlloc(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pSplitHead)
    308308{
    309     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     309    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    310310    PUSBPROXYURBLNX pUrbLnx;
    311311
     
    360360static void usbProxyLinuxUrbFree(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pUrbLnx)
    361361{
    362     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     362    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    363363
    364364    RTCritSectEnter(&pDevLnx->CritSect);
     
    398398static void usbProxyLinuxUrbFreeSplitList(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pUrbLnx)
    399399{
    400     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     400    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    401401
    402402    RTCritSectEnter(&pDevLnx->CritSect);
     
    585585static int usbProxyLinuxFindActiveConfig(PUSBPROXYDEV pProxyDev, const char *pszPath, int *piFirstCfg)
    586586{
    587     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     587    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    588588    if (pDevLnx->fUsingSysfs)
    589589        return usbProxyLinuxFindActiveConfigSysfs(pProxyDev, pszPath, piFirstCfg);
     
    600600RTDECL(int) USBProxyDeviceLinuxGetFD(PUSBPROXYDEV pProxyDev)
    601601{
    602     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     602    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    603603    AssertReturn(pDevLnx->hFile != NIL_RTFILE, -1);
    604604    return RTFileToNative(pDevLnx->hFile);
     
    618618 * @param   pvBackend       Backend specific pointer, unused for the linux backend.
    619619 */
    620 static int usbProxyLinuxOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
     620static DECLCALLBACK(int) usbProxyLinuxOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
    621621{
    622622    LogFlow(("usbProxyLinuxOpen: pProxyDev=%p pszAddress=%s\n", pProxyDev, pszAddress));
     
    637637        {
    638638            LogRel(("usbProxyLinuxOpen: Invalid device address: '%s'\n", pszAddress));
    639             pProxyDev->Backend.pv = NULL;
    640639            return VERR_INVALID_PARAMETER;
    641640        }
     
    662661    if (RT_SUCCESS(rc))
    663662    {
    664             /*
    665              * Allocate and initialize the linux backend data.
    666              */
    667             PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)RTMemAllocZVar(sizeof(*pDevLnx) + cchPath);
    668             if (pDevLnx)
     663        /*
     664         * Initialize the linux backend data.
     665         */
     666        PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
     667        pDevLnx->pszPath = RTStrDupN(pszPath, cchPath);
     668        if (pDevLnx->pszPath)
     669        {
     670            rc = RTPipeCreate(&pDevLnx->hPipeWakeupR, &pDevLnx->hPipeWakeupW, 0);
     671            if (RT_SUCCESS(rc))
    669672            {
    670 
    671                 rc = RTPipeCreate(&pDevLnx->hPipeWakeupR, &pDevLnx->hPipeWakeupW, 0);
     673                pDevLnx->fUsingSysfs = fUsingSysfs;
     674                pDevLnx->hFile = hFile;
     675                rc = RTCritSectInit(&pDevLnx->CritSect);
    672676                if (RT_SUCCESS(rc))
    673677                {
    674                     pDevLnx->fUsingSysfs = fUsingSysfs;
    675                     memcpy(&pDevLnx->szPath[0], pszPath, cchPath);
    676                     pDevLnx->szPath[cchPath] = '\0';
    677                     pDevLnx->hFile = hFile;
    678                     rc = RTCritSectInit(&pDevLnx->CritSect);
    679                     if (RT_SUCCESS(rc))
    680                     {
    681                         pProxyDev->Backend.pv = pDevLnx;
    682 
    683                         LogFlow(("usbProxyLinuxOpen(%p, %s): returns successfully File=%RTfile iActiveCfg=%d\n",
    684                                  pProxyDev, pszAddress, pDevLnx->hFile, pProxyDev->iActiveCfg));
    685 
    686                         return VINF_SUCCESS;
    687                     }
    688                     RTPipeClose(pDevLnx->hPipeWakeupR);
    689                     RTPipeClose(pDevLnx->hPipeWakeupW);
     678                    LogFlow(("usbProxyLinuxOpen(%p, %s): returns successfully File=%RTfile iActiveCfg=%d\n",
     679                             pProxyDev, pszAddress, pDevLnx->hFile, pProxyDev->iActiveCfg));
     680
     681                    return VINF_SUCCESS;
    690682                }
    691 
    692                 RTMemFree(pDevLnx);
     683                RTPipeClose(pDevLnx->hPipeWakeupR);
     684                RTPipeClose(pDevLnx->hPipeWakeupW);
    693685            }
    694             else
    695                 rc = VERR_NO_MEMORY;
     686        }
     687        else
     688            rc = VERR_NO_MEMORY;
    696689
    697690        RTFileClose(hFile);
     
    702695    Log(("usbProxyLinuxOpen(%p, %s) failed, rc=%s!\n", pProxyDev, pszAddress,
    703696         RTErrGetShort(rc)));
    704     pProxyDev->Backend.pv = NULL;
    705697
    706698    NOREF(pvBackend);
     
    716708 * @param   pProxyDev       The proxy device.
    717709 */
    718 static int usbProxyLinuxInit(PUSBPROXYDEV pProxyDev)
    719 {
    720     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     710static DECLCALLBACK(int) usbProxyLinuxInit(PUSBPROXYDEV pProxyDev)
     711{
     712    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    721713
    722714    /*
     
    737729    pProxyDev->cIgnoreSetConfigs = 1;
    738730    int iFirstCfg;
    739     pProxyDev->iActiveCfg = usbProxyLinuxFindActiveConfig(pProxyDev, pDevLnx->szPath, &iFirstCfg);
     731    pProxyDev->iActiveCfg = usbProxyLinuxFindActiveConfig(pProxyDev, pDevLnx->pszPath, &iFirstCfg);
    740732    if (pProxyDev->iActiveCfg == -1)
    741733    {
    742734        usbProxyLinuxDoIoCtl(pProxyDev, USBDEVFS_SETCONFIGURATION, &iFirstCfg, false, UINT32_MAX);
    743         pProxyDev->iActiveCfg = usbProxyLinuxFindActiveConfig(pProxyDev, pDevLnx->szPath, NULL);
     735        pProxyDev->iActiveCfg = usbProxyLinuxFindActiveConfig(pProxyDev, pDevLnx->pszPath, NULL);
    744736        Log(("usbProxyLinuxInit: No active config! Tried to set %d: iActiveCfg=%d\n", iFirstCfg, pProxyDev->iActiveCfg));
    745737    }
     
    753745 * Closes the proxy device.
    754746 */
    755 static void usbProxyLinuxClose(PUSBPROXYDEV pProxyDev)
     747static DECLCALLBACK(void) usbProxyLinuxClose(PUSBPROXYDEV pProxyDev)
    756748{
    757749    LogFlow(("usbProxyLinuxClose: pProxyDev=%s\n", usbProxyGetName(pProxyDev)));
    758     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
    759     Assert(pDevLnx);
    760     if (!pDevLnx)
    761         return;
     750    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
     751    AssertPtrReturnVoid(pDevLnx);
    762752
    763753    /*
     
    831821    RTPipeClose(pDevLnx->hPipeWakeupW);
    832822
    833     RTMemFree(pDevLnx);
    834     pProxyDev->Backend.pv = NULL;
     823    RTStrFree(pDevLnx->pszPath);
     824
    835825    LogFlow(("usbProxyLinuxClose: returns\n"));
    836826}
     
    10291019 * @param   pDev    The device to reset.
    10301020 */
    1031 static int usbProxyLinuxReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
     1021static DECLCALLBACK(int) usbProxyLinuxReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
    10321022{
    10331023#ifdef NO_PORT_RESET
    1034     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     1024    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    10351025
    10361026    /*
     
    10581048
    10591049        /* find the active config - damn annoying. */
    1060         pProxyDev->iActiveCfg = usbProxyLinuxFindActiveConfig(pProxyDev, pDevLnx->szPath, NULL);
     1050        pProxyDev->iActiveCfg = usbProxyLinuxFindActiveConfig(pProxyDev, pDevLnx->pszPath, NULL);
    10611051        LogFlow(("usbProxyLinuxReset: returns successfully iActiveCfg=%d\n", pProxyDev->iActiveCfg));
    10621052    }
     
    11281118 * @param   iCfg            The configuration to set.
    11291119 */
    1130 static int usbProxyLinuxSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
     1120static DECLCALLBACK(int) usbProxyLinuxSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
    11311121{
    11321122    LogFlow(("usbProxyLinuxSetConfig: pProxyDev=%s cfg=%#x\n",
     
    11461136 * @returns success indicator.
    11471137 */
    1148 static int usbProxyLinuxClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
     1138static DECLCALLBACK(int) usbProxyLinuxClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
    11491139{
    11501140    LogFlow(("usbProxyLinuxClaimInterface: pProxyDev=%s ifnum=%#x\n", usbProxyGetName(pProxyDev), iIf));
     
    12911281static bool usbProxyLinuxSubmitURB(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pCur, PVUSBURB pUrb, bool *pfUnplugged)
    12921282{
    1293     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     1283    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    12941284    unsigned        cTries = 0;
    12951285
     
    14631453 * @copydoc USBPROXYBACK::pfnUrbQueue
    14641454 */
    1465 static int usbProxyLinuxUrbQueue(PVUSBURB pUrb)
     1455static DECLCALLBACK(int) usbProxyLinuxUrbQueue(PVUSBURB pUrb)
    14661456{
    14671457    unsigned        cTries;
     
    14711461    PUSBPROXYDEV    pProxyDev = usbProxyFromVusbDev(pUrb->pDev);
    14721462#endif
    1473     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     1463    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    14741464    LogFlow(("usbProxyLinuxUrbQueue: pProxyDev=%s pUrb=%p EndPt=%d cbData=%d\n",
    14751465             usbProxyGetName(pProxyDev), pUrb, pUrb->EndPt, pUrb->cbData));
     
    17231713 * @param   cMillies    Number of milliseconds to wait. Use 0 to not wait at all.
    17241714 */
    1725 static PVUSBURB usbProxyLinuxUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
     1715static DECLCALLBACK(PVUSBURB) usbProxyLinuxUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
    17261716{
    17271717    PUSBPROXYURBLNX pUrbLnx = NULL;
    1728     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     1718    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    17291719
    17301720    /*
     
    19611951 * The URB requires reaping, so we don't change its state.
    19621952 */
    1963 static void usbProxyLinuxUrbCancel(PVUSBURB pUrb)
     1953static DECLCALLBACK(void) usbProxyLinuxUrbCancel(PVUSBURB pUrb)
    19641954{
    19651955#ifndef RDESKTOP
     
    20011991static DECLCALLBACK(int) usbProxyLinuxWakeup(PUSBPROXYDEV pProxyDev)
    20021992{
    2003     PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
     1993    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
    20041994    size_t cbIgnored;
    20051995
     
    20142004const USBPROXYBACK g_USBProxyDeviceHost =
    20152005{
     2006    /* pszName */
    20162007    "host",
     2008    /* cbBackend */
     2009    sizeof(USBPROXYDEVLNX),
    20172010    usbProxyLinuxOpen,
    20182011    usbProxyLinuxInit,
  • trunk/src/VBox/Devices/USB/solaris/USBProxyDevice-solaris.cpp

    r49816 r50228  
    55
    66/*
    7  * Copyright (C) 2009-2013 Oracle Corporation
     7 * Copyright (C) 2009-2014 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    9292    /** The tail of the landed solaris URBs. */
    9393    PUSBPROXYURBSOL                pTaxingTail;
    94     /** Pipe handle for waiking up - writing end. */
     94    /** Pipe handle for waking up - writing end. */
    9595    RTPIPE                         hPipeWakeupW;
    96     /** Pipe handle for waiking up - reading end. */
     96    /** Pipe handle for waking up - reading end. */
    9797    RTPIPE                         hPipeWakeupR;
    9898} USBPROXYDEVSOL, *PUSBPROXYDEVSOL;
     
    288288 * @param   pvBackend       Backend specific pointer, unused for the solaris backend.
    289289 */
    290 static int usbProxySolarisOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
    291 {
     290static DECLCALLBACK(int) usbProxySolarisOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
     291{
     292    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
     293
    292294    LogFlowFunc((USBPROXY ":usbProxySolarisOpen pProxyDev=%p pszAddress=%s pvBackend=%p\n", pProxyDev, pszAddress, pvBackend));
    293295
     
    301303         * Allocate and initialize the solaris backend data.
    302304         */
    303         PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)RTMemAllocZ(sizeof(*pDevSol));
    304         if (RT_LIKELY(pDevSol))
     305        AssertCompile(PATH_MAX >= MAXPATHLEN);
     306        char szDeviceIdent[PATH_MAX+48];
     307        rc = RTStrPrintf(szDeviceIdent, sizeof(szDeviceIdent), "%s", pszAddress);
     308        if (RT_SUCCESS(rc))
    305309        {
    306             AssertCompile(PATH_MAX >= MAXPATHLEN);
    307             char szDeviceIdent[PATH_MAX+48];
    308             rc = RTStrPrintf(szDeviceIdent, sizeof(szDeviceIdent), "%s", pszAddress);
     310            rc = RTCritSectInit(&pDevSol->CritSect);
    309311            if (RT_SUCCESS(rc))
    310312            {
    311                 rc = RTCritSectInit(&pDevSol->CritSect);
     313                /*
     314                 * Create wakeup pipe.
     315                 */
     316                rc = RTPipeCreate(&pDevSol->hPipeWakeupR, &pDevSol->hPipeWakeupW, 0);
    312317                if (RT_SUCCESS(rc))
    313318                {
    314                     pProxyDev->Backend.pv = pDevSol;
    315 
    316                     /*
    317                      * Create wakeup pipe.
    318                      */
    319                     rc = RTPipeCreate(&pDevSol->hPipeWakeupR, &pDevSol->hPipeWakeupW, 0);
     319                    int Instance;
     320                    char *pszDevicePath = NULL;
     321                    rc = USBLibGetClientInfo(szDeviceIdent, &pszDevicePath, &Instance);
    320322                    if (RT_SUCCESS(rc))
    321323                    {
    322                         int Instance;
    323                         char *pszDevicePath = NULL;
    324                         rc = USBLibGetClientInfo(szDeviceIdent, &pszDevicePath, &Instance);
     324                        pDevSol->pszDevicePath = pszDevicePath;
     325
     326                        /*
     327                         * Open the client driver.
     328                         */
     329                        RTFILE hFile;
     330                        rc = RTFileOpen(&hFile, pDevSol->pszDevicePath, RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
    325331                        if (RT_SUCCESS(rc))
    326332                        {
    327                             pDevSol->pszDevicePath = pszDevicePath;
     333                            pDevSol->hFile = hFile;
     334                            pDevSol->pProxyDev = pProxyDev;
    328335
    329336                            /*
    330                              * Open the client driver.
     337                             * Verify client driver version.
    331338                             */
    332                             RTFILE hFile;
    333                             rc = RTFileOpen(&hFile, pDevSol->pszDevicePath, RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
     339                            VBOXUSBREQ_GET_VERSION GetVersionReq;
     340                            bzero(&GetVersionReq, sizeof(GetVersionReq));
     341                            rc = usbProxySolarisIOCtl(pDevSol, VBOXUSB_IOCTL_GET_VERSION, &GetVersionReq, sizeof(GetVersionReq));
    334342                            if (RT_SUCCESS(rc))
    335343                            {
    336                                 pDevSol->hFile = hFile;
    337                                 pDevSol->pProxyDev = pProxyDev;
    338 
    339                                 /*
    340                                  * Verify client driver version.
    341                                  */
    342                                 VBOXUSBREQ_GET_VERSION GetVersionReq;
    343                                 bzero(&GetVersionReq, sizeof(GetVersionReq));
    344                                 rc = usbProxySolarisIOCtl(pDevSol, VBOXUSB_IOCTL_GET_VERSION, &GetVersionReq, sizeof(GetVersionReq));
    345                                 if (RT_SUCCESS(rc))
     344                                if (   GetVersionReq.u32Major == VBOXUSB_VERSION_MAJOR
     345                                    && GetVersionReq.u32Minor >= VBOXUSB_VERSION_MINOR)
    346346                                {
    347                                     if (   GetVersionReq.u32Major == VBOXUSB_VERSION_MAJOR
    348                                         && GetVersionReq.u32Minor >= VBOXUSB_VERSION_MINOR)
    349                                     {
    350                                         /*
    351                                          * Try & get the current cached config from Solaris.
    352                                          */
    353                                         usbProxySolarisGetActiveConfig(pDevSol);
    354                                         return VINF_SUCCESS;
    355                                     }
    356                                     else
    357                                     {
    358                                         LogRel((USBPROXY ":version mismatch! driver v%d.%d expecting ~v%d.%d\n", GetVersionReq.u32Major,
    359                                                 GetVersionReq.u32Minor, VBOXUSB_VERSION_MAJOR, VBOXUSB_VERSION_MINOR));
    360                                         rc = VERR_VERSION_MISMATCH;
    361                                     }
     347                                    /*
     348                                     * Try & get the current cached config from Solaris.
     349                                     */
     350                                    usbProxySolarisGetActiveConfig(pDevSol);
     351                                    return VINF_SUCCESS;
    362352                                }
    363353                                else
    364354                                {
    365                                     LogRel((USBPROXY ":failed to query driver version. rc=%Rrc\n", rc));
     355                                    LogRel((USBPROXY ":version mismatch! driver v%d.%d expecting ~v%d.%d\n", GetVersionReq.u32Major,
     356                                            GetVersionReq.u32Minor, VBOXUSB_VERSION_MAJOR, VBOXUSB_VERSION_MINOR));
     357                                    rc = VERR_VERSION_MISMATCH;
    366358                                }
    367 
    368                                 RTFileClose(pDevSol->hFile);
    369                                 pDevSol->hFile = NIL_RTFILE;
    370                                 pDevSol->pProxyDev = NULL;
    371359                            }
    372360                            else
    373                                 LogRel((USBPROXY ":failed to open device. rc=%Rrc pszDevicePath=%s\n", rc, pDevSol->pszDevicePath));
    374 
    375                             RTStrFree(pDevSol->pszDevicePath);
    376                             pDevSol->pszDevicePath = NULL;
     361                                LogRel((USBPROXY ":failed to query driver version. rc=%Rrc\n", rc));
     362
     363                            RTFileClose(pDevSol->hFile);
     364                            pDevSol->hFile = NIL_RTFILE;
     365                            pDevSol->pProxyDev = NULL;
    377366                        }
    378367                        else
    379                         {
    380                             LogRel((USBPROXY ":failed to get client info. rc=%Rrc pszDevicePath=%s\n", rc, pDevSol->pszDevicePath));
    381                             if (rc == VERR_NOT_FOUND)
    382                                 rc = VERR_OPEN_FAILED;
    383                         }
    384                         RTPipeClose(pDevSol->hPipeWakeupR);
    385                         RTPipeClose(pDevSol->hPipeWakeupW);
     368                            LogRel((USBPROXY ":failed to open device. rc=%Rrc pszDevicePath=%s\n", rc, pDevSol->pszDevicePath));
     369
     370                        RTStrFree(pDevSol->pszDevicePath);
     371                        pDevSol->pszDevicePath = NULL;
    386372                    }
    387 
    388                     RTCritSectDelete(&pDevSol->CritSect);
     373                    else
     374                    {
     375                        LogRel((USBPROXY ":failed to get client info. rc=%Rrc pszDevicePath=%s\n", rc, pDevSol->pszDevicePath));
     376                        if (rc == VERR_NOT_FOUND)
     377                            rc = VERR_OPEN_FAILED;
     378                    }
     379                    RTPipeClose(pDevSol->hPipeWakeupR);
     380                    RTPipeClose(pDevSol->hPipeWakeupW);
    389381                }
    390                 else
    391                     LogRel((USBPROXY ":RTCritSectInit failed. rc=%Rrc pszAddress=%s\n", rc, pszAddress));
     382
     383                RTCritSectDelete(&pDevSol->CritSect);
    392384            }
    393385            else
    394                 LogRel((USBPROXY ":RTStrAPrintf failed. rc=%Rrc pszAddress=%s\n", rc, pszAddress));
    395 
    396             RTMemFree(pDevSol);
    397             pDevSol = NULL;
     386                LogRel((USBPROXY ":RTCritSectInit failed. rc=%Rrc pszAddress=%s\n", rc, pszAddress));
    398387        }
    399388        else
    400             rc = VERR_NO_MEMORY;
     389            LogRel((USBPROXY ":RTStrAPrintf failed. rc=%Rrc pszAddress=%s\n", rc, pszAddress));
    401390    }
    402391    else
     
    404393
    405394    USBLibTerm();
    406     pProxyDev->Backend.pv = NULL;
    407395    return rc;
    408396}
     
    414402 * @param   pProxyDev   The device instance.
    415403 */
    416 static void usbProxySolarisClose(PUSBPROXYDEV pProxyDev)
     404static DECLCALLBACK(void) usbProxySolarisClose(PUSBPROXYDEV pProxyDev)
    417405{
    418406    LogFlow((USBPROXY ":usbProxySolarisClose: pProxyDev=%p\n", pProxyDev));
    419407
    420     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     408    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    421409
    422410    /* Close the device (do not re-enumerate). */
     
    452440    pDevSol->pszDevicePath = NULL;
    453441
    454     RTMemFree(pDevSol);
    455     pProxyDev->Backend.pv = NULL;
    456 
    457442    USBLibTerm();
    458443}
     
    466451 * @param   fRootHubReset       Is this a root hub reset or device specific reset request.
    467452 */
    468 static int usbProxySolarisReset(PUSBPROXYDEV pProxyDev, bool fRootHubReset)
     453static DECLCALLBACK(int) usbProxySolarisReset(PUSBPROXYDEV pProxyDev, bool fRootHubReset)
    469454{
    470455    LogFlowFunc((USBPROXY ":usbProxySolarisReset pProxyDev=%s fRootHubReset=%d\n", pProxyDev->pUsbIns->pszName, fRootHubReset));
    471456
    472457    /** Pass all resets to the device. The Trekstor USB (1.1) stick requires this to work. */
    473     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     458    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    474459
    475460    /* Soft reset the device. */
     
    499484 * @param   iCfg            The configuration value to set.
    500485 */
    501 static int usbProxySolarisSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
     486static DECLCALLBACK(int) usbProxySolarisSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
    502487{
    503488    LogFlowFunc((USBPROXY ":usbProxySolarisSetConfig: pProxyDev=%p iCfg=%#x\n", pProxyDev, iCfg));
    504489
    505     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     490    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    506491    AssertPtrReturn(pDevSol, VERR_INVALID_POINTER);
    507492
     
    527512 * @returns success indicator (always true).
    528513 */
    529 static int usbProxySolarisClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
     514static DECLCALLBACK(int) usbProxySolarisClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
    530515{
    531516    return true;
     
    541526 * @returns success indicator.
    542527 */
    543 static int usbProxySolarisReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
     528static DECLCALLBACK(int) usbProxySolarisReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
    544529{
    545530    return true;
     
    552537 * @returns success indicator.
    553538 */
    554 static int usbProxySolarisSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
     539static DECLCALLBACK(int) usbProxySolarisSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
    555540{
    556541    LogFlowFunc((USBPROXY ":usbProxySolarisSetInterface: pProxyDev=%p iIf=%d iAlt=%d\n", pProxyDev, iIf, iAlt));
    557542
    558     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     543    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    559544    AssertPtrReturn(pDevSol, VERR_INVALID_POINTER);
    560545
     
    576561 * Clears the halted endpoint 'EndPt'.
    577562 */
    578 static bool usbProxySolarisClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndPt)
     563static DECLCALLBACK(bool) usbProxySolarisClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndPt)
    579564{
    580565    LogFlowFunc((USBPROXY ":usbProxySolarisClearHaltedEp pProxyDev=%p EndPt=%#x\n", pProxyDev, EndPt));
    581566
    582     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     567    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    583568    AssertPtrReturn(pDevSol, VERR_INVALID_POINTER);
    584569
     
    599584 * @copydoc USBPROXYBACK::pfnUrbQueue
    600585 */
    601 static int usbProxySolarisUrbQueue(PVUSBURB pUrb)
     586static DECLCALLBACK(int) usbProxySolarisUrbQueue(PVUSBURB pUrb)
    602587{
    603588    PUSBPROXYDEV    pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
    604     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     589    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    605590
    606591    LogFlowFunc((USBPROXY ": usbProxySolarisUrbQueue: pProxyDev=%s pUrb=%p EndPt=%#x enmDir=%d cbData=%d pvData=%p\n",
     
    665650 *          on Solaris. So we just abort pending URBs on the pipe.
    666651 */
    667 static void usbProxySolarisUrbCancel(PVUSBURB pUrb)
     652static DECLCALLBACK(void) usbProxySolarisUrbCancel(PVUSBURB pUrb)
    668653{
    669654    PUSBPROXYURBSOL pUrbSol = (PUSBPROXYURBSOL)pUrb->Dev.pvPrivate;
    670655
    671656    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
    672     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     657    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    673658    AssertPtrReturnVoid(pDevSol);
    674659
     
    701686 * @param   cMillies    Number of milliseconds to wait. Use 0 to not wait at all.
    702687 */
    703 static PVUSBURB usbProxySolarisUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
     688static DECLCALLBACK(PVUSBURB) usbProxySolarisUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
    704689{
    705690    //LogFlowFunc((USBPROXY ":usbProxySolarisUrbReap pProxyDev=%p cMillies=%u\n", pProxyDev, cMillies));
    706691
    707     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     692    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    708693
    709694    /*
     
    805790 * @param   pDevSol         The Solaris device instance.
    806791 */
    807 PVUSBURB usbProxySolarisUrbComplete(PUSBPROXYDEVSOL pDevSol)
     792static PVUSBURB usbProxySolarisUrbComplete(PUSBPROXYDEVSOL pDevSol)
    808793{
    809794    LogFlowFunc((USBPROXY ":usbProxySolarisUrbComplete pDevSol=%p\n", pDevSol));
     
    895880static DECLCALLBACK(int) usbProxySolarisWakeup(PUSBPROXYDEV pProxyDev)
    896881{
    897     PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
     882    PUSBPROXYDEVFBSD pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
    898883    size_t cbIgnored;
    899884
     
    909894extern const USBPROXYBACK g_USBProxyDeviceHost =
    910895{
     896    /* pszName */
    911897    "host",
     898    /* cbBackend */
     899    sizeof(USBPROXYDEVSOL),
    912900    usbProxySolarisOpen,
    913901    NULL,
  • trunk/src/VBox/Devices/USB/vrdp/USBProxyDevice-vrdp.cpp

    r49814 r50228  
    55
    66/*
    7  * Copyright (C) 2006-2010 Oracle Corporation
     7 * Copyright (C) 2006-2014 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    4343 */
    4444
    45 static int usbProxyVrdpOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
     45static DECLCALLBACK(int) usbProxyVrdpOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
    4646{
    4747    LogFlow(("usbProxyVrdpOpen: pProxyDev=%p pszAddress=%s, pvBackend=%p\n", pProxyDev, pszAddress, pvBackend));
    4848
     49    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
    4950    int rc = VINF_SUCCESS;
    5051
     
    5859        if (RT_SUCCESS (rc))
    5960        {
    60             PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)RTMemAlloc (sizeof(*pDevVrdp));
    61             if (pDevVrdp)
    62             {
    63                 pDevVrdp->pCallback = pCallback;
    64                 pDevVrdp->pDevice = pDevice;
    65                 pProxyDev->Backend.pv = pDevVrdp;
    66                 pProxyDev->iActiveCfg = 1; /** @todo that may not be always true. */
    67                 pProxyDev->cIgnoreSetConfigs = 1;
    68                 return VINF_SUCCESS;
    69             }
    70 
    71             pCallback->pfnClose (pDevice);
    72             rc = VERR_NO_MEMORY;
     61            pDevVrdp->pCallback = pCallback;
     62            pDevVrdp->pDevice = pDevice;
     63            pProxyDev->iActiveCfg = 1; /** @todo that may not be always true. */
     64            pProxyDev->cIgnoreSetConfigs = 1;
     65            return VINF_SUCCESS;
    7366        }
    7467    }
     
    8275}
    8376
    84 static void usbProxyVrdpClose(PUSBPROXYDEV pProxyDev)
     77static DECLCALLBACK(void) usbProxyVrdpClose(PUSBPROXYDEV pProxyDev)
    8578{
    8679    LogFlow(("usbProxyVrdpClose: pProxyDev = %p\n", pProxyDev));
    8780
    88     PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
     81    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
    8982
    9083    pDevVrdp->pCallback->pfnClose (pDevVrdp->pDevice);
    9184}
    9285
    93 static int usbProxyVrdpReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
     86static DECLCALLBACK(int) usbProxyVrdpReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
    9487{
    9588    LogFlow(("usbProxyVrdpReset: pProxyDev = %p\n", pProxyDev));
    9689
    97     PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
     90    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
    9891
    9992    int rc = pDevVrdp->pCallback->pfnReset (pDevVrdp->pDevice);
     
    111104}
    112105
    113 static int usbProxyVrdpSetConfig(PUSBPROXYDEV pProxyDev, int cfg)
     106static DECLCALLBACK(int) usbProxyVrdpSetConfig(PUSBPROXYDEV pProxyDev, int cfg)
    114107{
    115108    LogFlow(("usbProxyVrdpSetConfig: pProxyDev=%s cfg=%#x\n", pProxyDev->pUsbIns->pszName, cfg));
    116109
    117     PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
     110    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
    118111
    119112    int rc = pDevVrdp->pCallback->pfnSetConfig (pDevVrdp->pDevice, (uint8_t)cfg);
     
    128121}
    129122
    130 static int usbProxyVrdpClaimInterface(PUSBPROXYDEV pProxyDev, int ifnum)
     123static DECLCALLBACK(int) usbProxyVrdpClaimInterface(PUSBPROXYDEV pProxyDev, int ifnum)
    131124{
    132125    LogFlow(("usbProxyVrdpClaimInterface: pProxyDev=%s ifnum=%#x\n", pProxyDev->pUsbIns->pszName, ifnum));
    133126
    134     PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
     127    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
    135128
    136129    int rc = pDevVrdp->pCallback->pfnClaimInterface (pDevVrdp->pDevice, (uint8_t)ifnum);
     
    145138}
    146139
    147 static int usbProxyVrdpReleaseInterface(PUSBPROXYDEV pProxyDev, int ifnum)
     140static DECLCALLBACK(int) usbProxyVrdpReleaseInterface(PUSBPROXYDEV pProxyDev, int ifnum)
    148141{
    149142    LogFlow(("usbProxyVrdpReleaseInterface: pProxyDev=%s ifnum=%#x\n", pProxyDev->pUsbIns->pszName, ifnum));
    150143
    151     PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
     144    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
    152145
    153146    int rc = pDevVrdp->pCallback->pfnReleaseInterface (pDevVrdp->pDevice, (uint8_t)ifnum);
     
    162155}
    163156
    164 static int usbProxyVrdpSetInterface(PUSBPROXYDEV pProxyDev, int ifnum, int setting)
     157static DECLCALLBACK(int) usbProxyVrdpSetInterface(PUSBPROXYDEV pProxyDev, int ifnum, int setting)
    165158{
    166159    LogFlow(("usbProxyVrdpSetInterface: pProxyDev=%p ifnum=%#x setting=%#x\n", pProxyDev, ifnum, setting));
    167160
    168     PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
     161    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
    169162
    170163    int rc = pDevVrdp->pCallback->pfnInterfaceSetting (pDevVrdp->pDevice, (uint8_t)ifnum, (uint8_t)setting);
     
    179172}
    180173
    181 static bool usbProxyVrdpClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int ep)
     174static DECLCALLBACK(bool) usbProxyVrdpClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int ep)
    182175{
    183176    LogFlow(("usbProxyVrdpClearHaltedEp: pProxyDev=%s ep=%u\n", pProxyDev->pUsbIns->pszName, ep));
    184177
    185     PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
     178    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
    186179
    187180    int rc = pDevVrdp->pCallback->pfnClearHaltedEP (pDevVrdp->pDevice, (uint8_t)ep);
     
    196189}
    197190
    198 static int usbProxyVrdpUrbQueue(PVUSBURB pUrb)
     191static DECLCALLBACK(int) usbProxyVrdpUrbQueue(PVUSBURB pUrb)
    199192{
    200193    LogFlow(("usbProxyVrdpUrbQueue: pUrb=%p\n", pUrb));
     
    208201
    209202    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
    210     PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
     203    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
    211204
    212205    int rc = pDevVrdp->pCallback->pfnQueueURB (pDevVrdp->pDevice, pUrb->enmType, pUrb->EndPt, pUrb->enmDir, pUrb->cbData,
     
    222215}
    223216
    224 static PVUSBURB usbProxyVrdpUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
     217static DECLCALLBACK(PVUSBURB) usbProxyVrdpUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
    225218{
    226219    LogFlow(("usbProxyVrdpUrbReap: pProxyDev=%s\n", pProxyDev->pUsbIns->pszName));
    227220
    228     PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
     221    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
    229222
    230223    PVUSBURB pUrb = NULL;
     
    252245}
    253246
    254 static void usbProxyVrdpUrbCancel(PVUSBURB pUrb)
     247static DECLCALLBACK(void) usbProxyVrdpUrbCancel(PVUSBURB pUrb)
    255248{
    256249    LogFlow(("usbProxyVrdpUrbCancel: pUrb=%p\n", pUrb));
    257250
    258251    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
    259     PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
     252    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
    260253
    261254    pDevVrdp->pCallback->pfnCancelURB (pDevVrdp->pDevice, (PREMOTEUSBQURB)pUrb->Dev.pvPrivate);
    262255}
    263256
    264 static int usbProxyVrdpWakeup(PUSBPROXYDEV pProxyDev)
     257static DECLCALLBACK(int) usbProxyVrdpWakeup(PUSBPROXYDEV pProxyDev)
    265258{
    266259    LogFlow(("usbProxyVrdpWakeup: pProxyDev=%s\n", pProxyDev->pUsbIns->pszName));
    267260
    268     PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
     261    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
    269262
    270263    return pDevVrdp->pCallback->pfnWakeup (pDevVrdp->pDevice);
     
    276269extern const USBPROXYBACK g_USBProxyDeviceVRDP =
    277270{
     271    /* pszName */
    278272    "vrdp",
     273    /* cbBackend */
     274    sizeof(USBPROXYDEVVRDP),
    279275    usbProxyVrdpOpen,
    280276    NULL,
  • trunk/src/VBox/Devices/USB/win/USBProxyDevice-win.cpp

    r49814 r50228  
    99
    1010/*
    11  * Copyright (C) 2006-2011 Oracle Corporation
     11 * Copyright (C) 2006-2014 Oracle Corporation
    1212 *
    1313 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    9090 * @returns VBox status code.
    9191 */
    92 static int usbProxyWinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
    93 {
    94     /* Here you just need to use pProxyDev->priv to store whatever per-device
    95      * data is needed
    96      */
    97     /*
    98      * Allocate private device instance data and use USBPROXYDEV::Backend::pv to point to it.
    99      */
    100     PPRIV_USBW32 pPriv = (PPRIV_USBW32)RTMemAllocZ(sizeof(PRIV_USBW32));
    101     if (!pPriv)
    102         return VERR_NO_MEMORY;
    103     pProxyDev->Backend.pv = pPriv;
     92static DECLCALLBACK(int) usbProxyWinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
     93{
     94    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    10495
    10596    int rc = VINF_SUCCESS;
     
    192183    RTMemFree(pPriv->paQueuedUrbs);
    193184    RTMemFree(pPriv->paHandles);
    194     RTMemFree(pPriv);
    195     pProxyDev->Backend.pv = NULL;
    196185    return rc;
    197186}
     
    200189 * Copy the device and free resources associated with the backend.
    201190 */
    202 static void usbProxyWinClose(PUSBPROXYDEV pProxyDev)
     191static DECLCALLBACK(void) usbProxyWinClose(PUSBPROXYDEV pProxyDev)
    203192{
    204193    /* Here we just close the device and free up p->priv
     
    206195     * that will have been done already
    207196     */
    208     PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
     197    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    209198    Assert(pPriv);
    210199    if (!pPriv)
     
    233222    RTMemFree(pPriv->paQueuedUrbs);
    234223    RTMemFree(pPriv->paHandles);
    235     RTMemFree(pPriv);
    236     pProxyDev->Backend.pv = NULL;
    237 }
    238 
    239 
    240 static int usbProxyWinReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
    241 {
    242     PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
     224}
     225
     226
     227static DECLCALLBACK(int) usbProxyWinReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
     228{
     229    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    243230    DWORD cbReturned;
    244231    int  rc;
     
    271258}
    272259
    273 static int usbProxyWinSetConfig(PUSBPROXYDEV pProxyDev, int cfg)
     260static DECLCALLBACK(int) usbProxyWinSetConfig(PUSBPROXYDEV pProxyDev, int cfg)
    274261{
    275262    /* Send a SET_CONFIGURATION command to the device. We don't do this
     
    280267     * point but it has to be synchronous.
    281268    */
    282     PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
     269    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    283270    USBSUP_SET_CONFIG in;
    284271    DWORD cbReturned;
     
    306293}
    307294
    308 static int usbProxyWinClaimInterface(PUSBPROXYDEV p, int ifnum)
     295static DECLCALLBACK(int) usbProxyWinClaimInterface(PUSBPROXYDEV p, int ifnum)
    309296{
    310297    /* Called just before we use an interface. Needed on Linux to claim
     
    313300     * Not relevant for Windows.
    314301     */
    315     PPRIV_USBW32 pPriv = (PPRIV_USBW32)p->Backend.pv;
     302    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    316303
    317304    pPriv->bInterfaceNumber = ifnum;
     
    321308}
    322309
    323 static int usbProxyWinReleaseInterface(PUSBPROXYDEV p, int ifnum)
     310static DECLCALLBACK(int) usbProxyWinReleaseInterface(PUSBPROXYDEV p, int ifnum)
    324311{
    325312    /* The opposite of claim_interface. */
    326     PPRIV_USBW32 pPriv = (PPRIV_USBW32)p->Backend.pv;
     313    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    327314
    328315    Assert(pPriv);
     
    330317}
    331318
    332 static int usbProxyWinSetInterface(PUSBPROXYDEV pProxyDev, int ifnum, int setting)
     319static DECLCALLBACK(int) usbProxyWinSetInterface(PUSBPROXYDEV pProxyDev, int ifnum, int setting)
    333320{
    334321    /* Select an alternate setting for an interface, the same applies
     
    336323     * message if you want but it must be synchronous
    337324     */
    338     PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
     325    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    339326    USBSUP_SELECT_INTERFACE in;
    340327    DWORD cbReturned;
     
    365352 * Clears the halted endpoint 'ep'.
    366353 */
    367 static bool usbProxyWinClearHaltedEndPt(PUSBPROXYDEV pProxyDev, unsigned int ep)
    368 {
    369     PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
     354static DECLCALLBACK(bool) usbProxyWinClearHaltedEndPt(PUSBPROXYDEV pProxyDev, unsigned int ep)
     355{
     356    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    370357    USBSUP_CLEAR_ENDPOINT in;
    371358    DWORD cbReturned;
     
    396383static int usbProxyWinAbortEndPt(PUSBPROXYDEV pProxyDev, unsigned int ep)
    397384{
    398     PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
     385    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    399386    USBSUP_CLEAR_ENDPOINT in;
    400387    DWORD cbReturned;
     
    425412 * @copydoc USBPROXYBACK::pfnUrbQueue
    426413 */
    427 static int usbProxyWinUrbQueue(PVUSBURB pUrb)
     414static DECLCALLBACK(int) usbProxyWinUrbQueue(PVUSBURB pUrb)
    428415{
    429416    PUSBPROXYDEV    pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
    430     PPRIV_USBW32    pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
     417    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    431418    Assert(pPriv);
    432419
     
    571558 *                      wait at all.
    572559 */
    573 static PVUSBURB usbProxyWinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
    574 {
    575     PPRIV_USBW32      pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
     560static DECLCALLBACK(PVUSBURB) usbProxyWinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
     561{
     562    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    576563    AssertReturn(pPriv, NULL);
    577564
     
    732719 *          exactly what the guest wants to do.
    733720 */
    734 static void usbProxyWinUrbCancel(PVUSBURB pUrb)
     721static DECLCALLBACK(void) usbProxyWinUrbCancel(PVUSBURB pUrb)
    735722{
    736723    PUSBPROXYDEV      pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
    737     PPRIV_USBW32      pPriv     = (PPRIV_USBW32)pProxyDev->Backend.pv;
     724    PPRIV_USBW32      pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    738725    PQUEUED_URB       pQUrbWin  = (PQUEUED_URB)pUrb->Dev.pvPrivate;
    739726    int                     rc;
     
    760747}
    761748
    762 static int usbProxyWinWakeup(PUSBPROXYDEV pProxyDev)
    763 {
    764     PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
     749static DECLCALLBACK(int) usbProxyWinWakeup(PUSBPROXYDEV pProxyDev)
     750{
     751    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
    765752
    766753    SetEvent(pPriv->hEventWakeup);
     
    773760extern const USBPROXYBACK g_USBProxyDeviceHost =
    774761{
     762    /* pszName */
    775763    "host",
     764    /* cbBackend */
     765    sizeof(PRIV_USBW32),
    776766    usbProxyWinOpen,
    777767    NULL,
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette