Skip to content

Commit

Permalink
Fully parses firmware
Browse files Browse the repository at this point in the history
Includes firmware files for all supported models
  • Loading branch information
ammulder committed Feb 16, 2016
1 parent f5e0d6a commit eba02c4
Show file tree
Hide file tree
Showing 18 changed files with 3,973 additions and 39 deletions.
54 changes: 47 additions & 7 deletions AppleIntelWiFiMVM.xcodeproj/project.pbxproj
Expand Up @@ -7,6 +7,15 @@
objects = {

/* Begin PBXBuildFile section */
843096591C6FC3320020E454 /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = 843096571C6FC3320020E454 /* README.md */; };
843096601C7004920020E454 /* iwl-trans.h in Headers */ = {isa = PBXBuildFile; fileRef = 8430965F1C7004920020E454 /* iwl-trans.h */; };
843096631C70CE6F0020E454 /* FirmwareParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843096611C70CE6F0020E454 /* FirmwareParser.cpp */; };
843096641C70CE6F0020E454 /* FirmwareParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 843096621C70CE6F0020E454 /* FirmwareParser.h */; };
843096661C70EA6C0020E454 /* iwl-fw-error-dump.h in Headers */ = {isa = PBXBuildFile; fileRef = 843096651C70EA6C0020E454 /* iwl-fw-error-dump.h */; };
844145681C717D2700D92381 /* iwlwifi-3160-16.ucode in Resources */ = {isa = PBXBuildFile; fileRef = 844145641C717D2700D92381 /* iwlwifi-3160-16.ucode */; };
844145691C717D2700D92381 /* iwlwifi-7260-16.ucode in Resources */ = {isa = PBXBuildFile; fileRef = 844145651C717D2700D92381 /* iwlwifi-7260-16.ucode */; };
8441456A1C717D2700D92381 /* iwlwifi-7265-16.ucode in Resources */ = {isa = PBXBuildFile; fileRef = 844145661C717D2700D92381 /* iwlwifi-7265-16.ucode */; };
8441456B1C717D2700D92381 /* iwlwifi-7265D-16.ucode in Resources */ = {isa = PBXBuildFile; fileRef = 844145671C717D2700D92381 /* iwlwifi-7265D-16.ucode */; };
846A8A6A1C6CB86400888583 /* iwl-agn-hw.h in Headers */ = {isa = PBXBuildFile; fileRef = 846A8A671C6CB86400888583 /* iwl-agn-hw.h */; };
846A8A6E1C6CBA6300888583 /* iwl-config.h in Headers */ = {isa = PBXBuildFile; fileRef = 846A8A6D1C6CBA6300888583 /* iwl-config.h */; };
846A8A701C6CBB1E00888583 /* linux-porting.h in Headers */ = {isa = PBXBuildFile; fileRef = 846A8A6F1C6CBB1E00888583 /* linux-porting.h */; };
Expand All @@ -23,6 +32,17 @@
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
843096561C6FC3320020E454 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
843096571C6FC3320020E454 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
8430965E1C6FFB820020E454 /* firmware-defs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "firmware-defs.h"; path = "linux/firmware-defs.h"; sourceTree = "<group>"; };
8430965F1C7004920020E454 /* iwl-trans.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "iwl-trans.h"; path = "linux/iwl-trans.h"; sourceTree = "<group>"; };
843096611C70CE6F0020E454 /* FirmwareParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FirmwareParser.cpp; sourceTree = "<group>"; };
843096621C70CE6F0020E454 /* FirmwareParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FirmwareParser.h; sourceTree = "<group>"; };
843096651C70EA6C0020E454 /* iwl-fw-error-dump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "iwl-fw-error-dump.h"; path = "linux/iwl-fw-error-dump.h"; sourceTree = "<group>"; };
844145641C717D2700D92381 /* iwlwifi-3160-16.ucode */ = {isa = PBXFileReference; lastKnownFileType = file; name = "iwlwifi-3160-16.ucode"; path = "firmware/iwlwifi-3160-16.ucode"; sourceTree = "<group>"; };
844145651C717D2700D92381 /* iwlwifi-7260-16.ucode */ = {isa = PBXFileReference; lastKnownFileType = file; name = "iwlwifi-7260-16.ucode"; path = "firmware/iwlwifi-7260-16.ucode"; sourceTree = "<group>"; };
844145661C717D2700D92381 /* iwlwifi-7265-16.ucode */ = {isa = PBXFileReference; lastKnownFileType = file; name = "iwlwifi-7265-16.ucode"; path = "firmware/iwlwifi-7265-16.ucode"; sourceTree = "<group>"; };
844145671C717D2700D92381 /* iwlwifi-7265D-16.ucode */ = {isa = PBXFileReference; lastKnownFileType = file; name = "iwlwifi-7265D-16.ucode"; path = "firmware/iwlwifi-7265D-16.ucode"; sourceTree = "<group>"; };
846A8A671C6CB86400888583 /* iwl-agn-hw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "iwl-agn-hw.h"; path = "linux/iwl-agn-hw.h"; sourceTree = "<group>"; };
846A8A6D1C6CBA6300888583 /* iwl-config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "iwl-config.h"; path = "linux/iwl-config.h"; sourceTree = "<group>"; };
846A8A6F1C6CBB1E00888583 /* linux-porting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "linux-porting.h"; path = "linux/linux-porting.h"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -55,23 +75,30 @@
846A8A641C6CB54700888583 /* linux */ = {
isa = PBXGroup;
children = (
84EF56511C6D95C300C97EDD /* iwl-8000.h */,
843096651C70EA6C0020E454 /* iwl-fw-error-dump.h */,
84EF564F1C6D951E00C97EDD /* device-list.h */,
84EF564D1C6D943E00C97EDD /* iwl-7000.h */,
84EF564B1C6D903B00C97EDD /* netdev_features.h */,
84E3AE741C6CF475004694CB /* if_ether.h */,
8430965E1C6FFB820020E454 /* firmware-defs.h */,
84E3AE721C6CF3F1004694CB /* ieee80211.h */,
846A8A6F1C6CBB1E00888583 /* linux-porting.h */,
846A8A6D1C6CBA6300888583 /* iwl-config.h */,
84E3AE741C6CF475004694CB /* if_ether.h */,
84EF564D1C6D943E00C97EDD /* iwl-7000.h */,
84EF56511C6D95C300C97EDD /* iwl-8000.h */,
846A8A671C6CB86400888583 /* iwl-agn-hw.h */,
846A8A6D1C6CBA6300888583 /* iwl-config.h */,
8430965F1C7004920020E454 /* iwl-trans.h */,
84EF564A1C6D8D7800C97EDD /* linux-80211.h */,
846A8A6F1C6CBB1E00888583 /* linux-porting.h */,
84EF564B1C6D903B00C97EDD /* netdev_features.h */,
);
name = linux;
sourceTree = "<group>";
};
847F26C61C6EA0A90007A5B0 /* Firmware */ = {
isa = PBXGroup;
children = (
844145641C717D2700D92381 /* iwlwifi-3160-16.ucode */,
844145651C717D2700D92381 /* iwlwifi-7260-16.ucode */,
844145661C717D2700D92381 /* iwlwifi-7265-16.ucode */,
844145671C717D2700D92381 /* iwlwifi-7265D-16.ucode */,
847F26C71C6EA19C0007A5B0 /* iwlwifi-8000C-16.ucode */,
);
name = Firmware;
Expand All @@ -80,6 +107,8 @@
84C019F41C6C1F4100408046 = {
isa = PBXGroup;
children = (
843096561C6FC3320020E454 /* LICENSE */,
843096571C6FC3320020E454 /* README.md */,
84C01A001C6C1F4100408046 /* AppleIntelWiFiMVM */,
84C019FF1C6C1F4100408046 /* Products */,
);
Expand All @@ -96,12 +125,14 @@
84C01A001C6C1F4100408046 /* AppleIntelWiFiMVM */ = {
isa = PBXGroup;
children = (
84C01A051C6C1F4100408046 /* Info.plist */,
847F26C61C6EA0A90007A5B0 /* Firmware */,
846A8A641C6CB54700888583 /* linux */,
84C01A011C6C1F4100408046 /* AppleIntelWiFiMVM.h */,
84C01A031C6C1F4100408046 /* AppleIntelWiFiMVM.cpp */,
84C01A051C6C1F4100408046 /* Info.plist */,
847F26C91C6EA2870007A5B0 /* FirmwareLoader.cpp */,
843096621C70CE6F0020E454 /* FirmwareParser.h */,
843096611C70CE6F0020E454 /* FirmwareParser.cpp */,
);
path = AppleIntelWiFiMVM;
sourceTree = "<group>";
Expand All @@ -115,9 +146,12 @@
files = (
84EF56501C6D951E00C97EDD /* device-list.h in Headers */,
84EF564E1C6D943E00C97EDD /* iwl-7000.h in Headers */,
843096601C7004920020E454 /* iwl-trans.h in Headers */,
84EF564C1C6D903B00C97EDD /* netdev_features.h in Headers */,
843096641C70CE6F0020E454 /* FirmwareParser.h in Headers */,
84E3AE751C6CF475004694CB /* if_ether.h in Headers */,
846A8A6E1C6CBA6300888583 /* iwl-config.h in Headers */,
843096661C70EA6C0020E454 /* iwl-fw-error-dump.h in Headers */,
846A8A701C6CBB1E00888583 /* linux-porting.h in Headers */,
84E3AE731C6CF3F1004694CB /* ieee80211.h in Headers */,
84EF56521C6D95C300C97EDD /* iwl-8000.h in Headers */,
Expand Down Expand Up @@ -183,6 +217,10 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
844145681C717D2700D92381 /* iwlwifi-3160-16.ucode in Resources */,
8441456A1C717D2700D92381 /* iwlwifi-7265-16.ucode in Resources */,
844145691C717D2700D92381 /* iwlwifi-7260-16.ucode in Resources */,
8441456B1C717D2700D92381 /* iwlwifi-7265D-16.ucode in Resources */,
847F26C81C6EA19C0007A5B0 /* iwlwifi-8000C-16.ucode in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -194,6 +232,8 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
843096591C6FC3320020E454 /* README.md in Sources */,
843096631C70CE6F0020E454 /* FirmwareParser.cpp in Sources */,
84C01A041C6C1F4100408046 /* AppleIntelWiFiMVM.cpp in Sources */,
847F26CA1C6EA2870007A5B0 /* FirmwareLoader.cpp in Sources */,
);
Expand Down
Binary file not shown.
32 changes: 26 additions & 6 deletions AppleIntelWiFiMVM/AppleIntelWiFiMVM.cpp
Expand Up @@ -34,11 +34,25 @@ bool AppleIntelWiFiMVM::start(IOService* provider) {
UInt16 subsystem_vendor = pciDevice->configRead16(kIOPCIConfigSubSystemVendorID);
UInt16 subsystem_device = pciDevice->configRead16(kIOPCIConfigSubSystemID);
UInt8 revision = pciDevice->configRead8(kIOPCIConfigRevisionID);
vendor = 0x8086;
subsystem_vendor = 0x8086;
device = 0x095a;
subsystem_device = 0x9510;

// vendor = 0x8086;
// subsystem_vendor = 0x8086;
// Broadwell NUC 7265
// device = 0x095a;
// subsystem_device = 0x9510;
// Skylake NUC 8260
// device = 0x24F3;
// subsystem_device = 0x9010;
// 7260
// device = 0x08B1;
// subsystem_device = 0x4070;
// 3160
// device = 0x08B3;
// subsystem_device = 0x0070;
// 3165 uses 7165D firmware
// device = 0x3165;
// subsystem_device = 0x4010;
// 4165 uses 8260 firmware above, not retested here

if(vendor != 0x8086 || subsystem_vendor != 0x8086) {
IOLog("%s Unrecognized vendor/sub-vendor ID %#06x/%#06x; expecting 0x8086 for both; cannot load driver.\n",
MYNAME, vendor, subsystem_vendor);
Expand All @@ -63,7 +77,11 @@ bool AppleIntelWiFiMVM::start(IOService* provider) {

pciDevice->retain();

loadFirmwareSync(card);
IOLog("%s Starting Firmware...\n", MYNAME);
if(!startFirmware(card, NULL)) {// TODO: PCI transport
IOLog("%s Unable to start firmware\n", MYNAME);
return false;
}

pciDevice->setMemoryEnable(true);
registerService();
Expand All @@ -73,6 +91,7 @@ bool AppleIntelWiFiMVM::start(IOService* provider) {

void AppleIntelWiFiMVM::stop(IOService* provider) {
DEBUGLOG("%s::stop\n", MYNAME);
if(driver) stopFirmware();
if (firmwareLoadLock)
{
IOLockFree(firmwareLoadLock);
Expand All @@ -84,6 +103,7 @@ void AppleIntelWiFiMVM::stop(IOService* provider) {
void AppleIntelWiFiMVM::free() {
DEBUGLOG("%s::free\n", MYNAME);
RELEASE(pciDevice);
if(driver) IOFree(driver, sizeof(iwl_drv));
super::free();
}

Expand Down
9 changes: 7 additions & 2 deletions AppleIntelWiFiMVM/AppleIntelWiFiMVM.h
Expand Up @@ -2,6 +2,7 @@
#include <IOKit/pci/IOPCIDevice.h>
#include <libkern/OSKextLib.h>
#include "linux/device-list.h"
#include "FirmwareParser.h"

class AppleIntelWiFiMVM : public IOService {
OSDeclareDefaultStructors(AppleIntelWiFiMVM);
Expand All @@ -16,7 +17,9 @@ class AppleIntelWiFiMVM : public IOService {
private:
// --------------- Methods ---------------
const struct iwl_cfg *identifyWiFiCard(UInt16 device, UInt16 subdevice);
OSData* loadFirmwareSync(const struct iwl_cfg *device);
bool startFirmware(const struct iwl_cfg *device, struct iwl_trans *trans);
void stopFirmware();
OSData* loadFirmwareSync(struct iwl_drv *drv, const struct iwl_cfg *device);
static void firmwareLoadComplete( OSKextRequestTag requestTag, OSReturn result, const void *resourceData, uint32_t resourceDataLength, void *context);

// --------------- Structs ---------------
Expand All @@ -28,7 +31,9 @@ class AppleIntelWiFiMVM : public IOService {
// --------------- Variables ---------------
IOLock *firmwareLoadLock;
IOPCIDevice *pciDevice;

iwl_drv *driver;
bool firmwareLoaded = false;
FirmwareParser *parser;
};

#define MYNAME "AppleIntelWiFiMVM"
Expand Down

0 comments on commit eba02c4

Please sign in to comment.