IOService* BrcmPatchRAM::probe(IOService *provider, SInt32 *probeScore) { extern kmod_info_t kmod_info; uint64_t start_time, end_time, nano_secs; DebugLog("probe\n"); AlwaysLog("Version %s starting on OS X Darwin %d.%d.\n", kmod_info.version, version_major, version_minor); clock_get_uptime(&start_time); mWorkLock = IOLockAlloc(); if (!mWorkLock) return NULL; mCompletionLock = IOLockAlloc(); if (!mCompletionLock) return NULL; mDevice = OSDynamicCast(IOUSBDevice, provider); if (!mDevice) { AlwaysLog("Provider is not a USB device.\n"); return NULL; } mDevice->retain(); initBrcmStrings(); OSString* displayName = OSDynamicCast(OSString, getProperty(kDisplayName)); if (displayName) provider->setProperty(kUSBProductString, displayName); mVendorId = mDevice->GetVendorID(); mProductId = mDevice->GetProductID(); // get firmware here to pre-cache for eventual use on wakeup or now if (BrcmFirmwareStore* firmwareStore = getFirmwareStore()) firmwareStore->getFirmware(OSDynamicCast(OSString, getProperty(kFirmwareKey))); uploadFirmware(); publishPersonality(); clock_get_uptime(&end_time); absolutetime_to_nanoseconds(end_time - start_time, &nano_secs); uint64_t milli_secs = nano_secs / 1000000; AlwaysLog("Processing time %llu.%llu seconds.\n", milli_secs / 1000, milli_secs % 1000); return this; }
IOService* BrcmPatchRAM::probe(IOService *provider, SInt32 *probeScore) { uint64_t start_time, end_time, nano_secs; DebugLog("probe\n"); AlwaysLog("Version %s starting on OS X Darwin %d.%d.\n", OSKextGetCurrentVersionString(), version_major, version_minor); #ifdef TARGET_ELCAPITAN // preference towards starting BrcmPatchRAM2.kext when BrcmPatchRAM.kext also exists *probeScore = 2000; #endif #ifndef TARGET_ELCAPITAN // BrcmPatchRAM.kext, if installed on 10.11+... fails immediately if (version_major >= 15) { AlwaysLog("Aborting -- BrcmPatchRAM.kext should not be installed on 10.11+. Use BrcmPatchRAM2.kext instead.\n"); return NULL; } #endif clock_get_uptime(&start_time); #ifndef NON_RESIDENT mWorkLock = IOLockAlloc(); if (!mWorkLock) return NULL; // Note: mLoadFirmwareLock is static (global), not instance data... if (!mLoadFirmwareLock) return NULL; #endif mCompletionLock = IOLockAlloc(); if (!mCompletionLock) return NULL; mDevice.setDevice(provider); if (!mDevice.getValidatedDevice()) { AlwaysLog("Provider type is incorrect (not IOUSBDevice or IOUSBHostDevice)\n"); return NULL; } // personality strings depend on version initBrcmStrings(); #ifndef NON_RESIDENT // longest time seen in normal re-probe was ~200ms (400+ms on 10.11) if (version_major >= 15) mBlurpWait = 800; else mBlurpWait = 400; #endif OSString* displayName = OSDynamicCast(OSString, getProperty(kDisplayName)); if (displayName) provider->setProperty(kUSBProductString, displayName); mVendorId = mDevice.getVendorID(); mProductId = mDevice.getProductID(); // get firmware here to pre-cache for eventual use on wakeup or now if (OSString* firmwareKey = OSDynamicCast(OSString, getProperty(kFirmwareKey))) { if (BrcmFirmwareStore* firmwareStore = getFirmwareStore()) firmwareStore->getFirmware(mVendorId, mProductId, firmwareKey); } uploadFirmware(); publishPersonality(); clock_get_uptime(&end_time); absolutetime_to_nanoseconds(end_time - start_time, &nano_secs); uint64_t milli_secs = nano_secs / 1000000; AlwaysLog("Processing time %llu.%llu seconds.\n", milli_secs / 1000, milli_secs % 1000); #ifdef NON_RESIDENT // maybe residency is not required for 10.11? mDevice.setDevice(NULL); return NULL; #endif return this; }