ManagerFilter::ManagerFilter() { // Initialize structures: streams, vars, mutexes, etc. this->sOut = getOutputHandler("out"); this->sWorkRequest = getOutputHandler("workRequest"); this->sNewWork = getInputHandler("newWork"); this->sNeedMore = getInputHandler("needMore"); this->currVal = 0; this->msgId = 1; this->hasRequest = false; pthread_mutex_init(&mWorkQueue, NULL); pthread_mutex_init(&mStatus, NULL); pthread_mutex_init(&mLog, NULL); // Open Log File log.open("manager.log", std::fstream::out); // Create initial work buildInitialWork(); // Set event handlers setHandler( sNewWork, &ManagerFilter::handleNewWork ); setHandler( sNeedMore, &ManagerFilter::handleNeedMore ); }
bool darwin_iwi3945::start(IOService *provider) { UInt16 reg; //linking the kext control clone to the driver: clone=this; firstifup=0; do { if ( super::start(provider) == 0) { IOLog("%s ERR: super::start failed\n", getName()); break; } if ( (fPCIDevice = OSDynamicCast(IOPCIDevice, provider)) == 0) { IOLog("%s ERR: fPCIDevice == 0 :(\n", getName()); break; } fPCIDevice->retain(); if (fPCIDevice->open(this) == 0) { IOLog("%s ERR: fPCIDevice->open(this) failed\n", getName()); break; } // Request domain power. // Without this, the PCIDevice may be in state 0, and the // PCI config space may be invalid if the machine has been // sleeping. if (fPCIDevice->requestPowerDomainState(kIOPMPowerOn, (IOPowerConnection *) getParentEntry(gIOPowerPlane), IOPMLowestState ) != IOPMNoErr) { IOLog("%s Power thingi failed\n", getName()); break; } /*UInt16 reg16; reg16 = fPCIDevice->configRead16(kIOPCIConfigCommand); reg16 |= (kIOPCICommandBusMaster | kIOPCICommandMemorySpace | kIOPCICommandMemWrInvalidate); reg16 &= ~kIOPCICommandIOSpace; // disable I/O space fPCIDevice->configWrite16(kIOPCIConfigCommand,reg16);*/ fPCIDevice->setBusMasterEnable(true); fPCIDevice->setMemoryEnable(true); irqNumber = fPCIDevice->configRead8(kIOPCIConfigInterruptLine); vendorID = fPCIDevice->configRead16(kIOPCIConfigVendorID); deviceID = fPCIDevice->configRead16(kIOPCIConfigDeviceID); pciReg = fPCIDevice->configRead16(kIOPCIConfigRevisionID); map = fPCIDevice->mapDeviceMemoryWithRegister(kIOPCIConfigBaseAddress0, kIOMapInhibitCache); if (map == 0) { IOLog("%s map is zero\n", getName()); break; } ioBase = map->getPhysicalAddress(); memBase = (UInt16 *)map->getVirtualAddress(); //memDes = map->getMemoryDescriptor(); //mem = fPCIDevice->getDeviceMemoryWithRegister(kIOPCIConfigBaseAddress0); //memDes->initWithPhysicalAddress(ioBase, map->getLength(), kIODirectionOutIn); /* We disable the RETRY_TIMEOUT register (0x41) to keep * PCI Tx retries from interfering with C3 CPU state */ reg = fPCIDevice->configRead16(0x40); if((reg & 0x0000ff00) != 0) fPCIDevice->configWrite16(0x40, reg & 0xffff00ff); printf("%s iomemory length: 0x%x @ 0x%x\n", getName(), map->getLength(), ioBase); printf("%s virt: 0x%x physical: 0x%x\n", getName(), memBase, ioBase); printf("%s IRQ: %d, Vendor ID: %04x, Product ID: %04x\n", getName(), irqNumber, vendorID, deviceID); fWorkLoop = (IOWorkLoop *) getWorkLoop(); if (!fWorkLoop) { //IOLog("%s ERR: start - getWorkLoop failed\n", getName()); break; } fInterruptSrc = IOInterruptEventSource::interruptEventSource( this, (IOInterruptEventAction) &darwin_iwi3945::interruptOccurred, provider); if(!fInterruptSrc || (fWorkLoop->addEventSource(fInterruptSrc) != kIOReturnSuccess)) { //IOLog("%s fInterruptSrc error\n", getName()); break;; } // This is important. If the interrupt line is shared with other devices, // then the interrupt vector will be enabled only if all corresponding // interrupt event sources are enabled. To avoid masking interrupts for // other devices that are sharing the interrupt line, the event source // is enabled immediately. fInterruptSrc->enable(); //mutex=IOLockAlloc(); fTransmitQueue = createOutputQueue(); if (fTransmitQueue == NULL) { IWI_ERR("ERR: getOutputQueue()\n"); break; } fTransmitQueue->setCapacity(1024); iwl_pci_probe(); if (!priv) break; iwl_hw_nic_init(priv); iwl_hw_nic_reset(priv); if (attachInterface((IONetworkInterface **) &fNetif, false) == false) { //IOLog("%s attach failed\n", getName()); break; } setProperty(kIOMinPacketSize,12); setProperty(kIOMaxPacketSize, IWL_RX_BUF_SIZE); //setProperty(kIOFeatures, kIONetworkFeatureNoBSDWait|kIONetworkFeatureSoftwareVlan); fNetif->registerOutputHandler(this,getOutputHandler()); fNetif->registerService(); registerService(); mediumDict = OSDictionary::withCapacity(MEDIUM_TYPE_INVALID + 1); addMediumType(kIOMediumIEEE80211None, 0, MEDIUM_TYPE_NONE); addMediumType(kIOMediumIEEE80211Auto, 0, MEDIUM_TYPE_AUTO); publishMediumDictionary(mediumDict); setCurrentMedium(mediumTable[MEDIUM_TYPE_AUTO]); setSelectedMedium(mediumTable[MEDIUM_TYPE_AUTO]); setLinkStatus(kIONetworkLinkValid, mediumTable[MEDIUM_TYPE_AUTO]); //kext control registration: //these functions registers the control which enables //the user to interact with the driver struct kern_ctl_reg ep_ctl; // Initialize control kern_ctl_ref kctlref; bzero(&ep_ctl, sizeof(ep_ctl)); ep_ctl.ctl_id = 0; ep_ctl.ctl_unit = 0; strcpy(ep_ctl.ctl_name,"insanelymac.iwidarwin.control"); ep_ctl.ctl_flags = 0; ep_ctl.ctl_connect = ConnectClient; ep_ctl.ctl_disconnect = disconnectClient; ep_ctl.ctl_send = setSelectedNetwork; ep_ctl.ctl_setopt = configureConnection; ep_ctl.ctl_getopt = sendNetworkList; errno_t error = ctl_register(&ep_ctl, &kctlref); //queue_te(12,OSMemberFunctionCast(thread_call_func_t,this,&darwin_iwi3945::check_firstup),NULL,NULL,false); //queue_te(12,OSMemberFunctionCast(thread_call_func_t,this,&darwin_iwi3945::check_firstup),priv,1000,true); //check_firstup(priv); return true; // end start successfully } while (false); //stop(provider); //free(); return false; // end start insuccessfully }