diff --git a/QualcommWifi/QualcommWifi.cpp b/QualcommWifi/QualcommWifi.cpp index 0809871..c14b632 100644 --- a/QualcommWifi/QualcommWifi.cpp +++ b/QualcommWifi/QualcommWifi.cpp @@ -26,8 +26,15 @@ bool QualcommWifi::init(OSDictionary *dictionary) { fBar0Virt = nullptr; fCurrWindow = 0xFFFFFFFF; fInterruptSource = nullptr; + fWorkQueue = nullptr; fNetif = nullptr; - bzero(&fMacAddress, sizeof(fMacAddress)); + // Adresse MAC par défaut (OUI Qualcomm 00:03:7F) en attendant la lecture BHI + fMacAddress.bytes[0] = 0x00; + fMacAddress.bytes[1] = 0x03; + fMacAddress.bytes[2] = 0x7F; + fMacAddress.bytes[3] = 0x11; + fMacAddress.bytes[4] = 0x07; + fMacAddress.bytes[5] = 0x01; fLinkActive = false; fCurrentChannel = 1; fLastRssi = -50; @@ -44,6 +51,7 @@ bool QualcommWifi::init(OSDictionary *dictionary) { } void QualcommWifi::free(void) { + OSSafeReleaseNULL(fWorkQueue); super::free(); } @@ -607,7 +615,7 @@ bool QualcommWifi::start(IOService *provider) { mediumDict->release(); } - if (!IONetworkController::attachInterface((IONetworkInterface **)&fNetif, true)) { + if (!IOEthernetController::attachInterface((IONetworkInterface **)&fNetif, true)) { IOLog("QualcommWifi: Attention - Echec attachement interface reseau BSD.\n"); } else { IOLog("QualcommWifi: Interface reseau attachee avec succes (enX) !\n"); @@ -622,7 +630,7 @@ void QualcommWifi::stop(IOService *provider) { IOLog("QualcommWifi: Arret du pilote Wi-Fi natif, liberation MSI, DMA et BAR0.\n"); if (fNetif) { - IONetworkController::detachInterface(fNetif); + IOEthernetController::detachInterface(fNetif); OSSafeReleaseNULL(fNetif); } @@ -650,6 +658,31 @@ void QualcommWifi::stop(IOService *provider) { super::stop(provider); } +bool QualcommWifi::createWorkQueue(void) { + if (fWorkQueue) { + return true; + } + fWorkQueue = IO80211WorkQueue::workQueue(); + if (!fWorkQueue) { + IOLog("QualcommWifi: Erreur - Impossible d'allouer IO80211WorkQueue !\n"); + return false; + } + IOLog("QualcommWifi: IO80211WorkQueue allouee avec succes (0x%p) !\n", fWorkQueue); + return true; +} + +IO80211WorkQueue* QualcommWifi::getWorkQueue(void) const { + return fWorkQueue; +} + +bool QualcommWifi::createWorkLoop(void) { + return createWorkQueue(); +} + +IOWorkLoop* QualcommWifi::getWorkLoop(void) const { + return getWorkQueue(); +} + IOReturn QualcommWifi::getHardwareAddress(IOEthernetAddress *addrP) { if (!addrP) return kIOReturnBadArgument; bcopy(&fMacAddress, addrP, sizeof(IOEthernetAddress)); diff --git a/QualcommWifi/QualcommWifi.hpp b/QualcommWifi/QualcommWifi.hpp index 2dc5843..60127ae 100644 --- a/QualcommWifi/QualcommWifi.hpp +++ b/QualcommWifi/QualcommWifi.hpp @@ -185,6 +185,7 @@ private: UInt32 fCurrWindow; IOInterruptEventSource *fInterruptSource; + IO80211WorkQueue *fWorkQueue; IONetworkInterface *fNetif; IOEthernetAddress fMacAddress; @@ -225,6 +226,12 @@ public: virtual bool start(IOService *provider) override; virtual void stop(IOService *provider) override; + // WorkQueue / WorkLoop interface required by IO80211Controller / IONetworkController + virtual bool createWorkLoop(void) override; + virtual IOWorkLoop* getWorkLoop(void) const override; + virtual bool createWorkQueue(void) override; + virtual IO80211WorkQueue* getWorkQueue(void) const override; + // IOEthernetController / IONetworkController interface virtual IOReturn getHardwareAddress(IOEthernetAddress *addrP) override; virtual IOReturn enable(IONetworkInterface *netif) override;