enableATA6.h

#include <IOKit/IOService.h>
#include "IOATABlockStorageDriver.h"

class com_sarnau_enableATA6 : public IOATABlockStorageDriver
{
	OSDeclareDefaultStructors ( com_sarnau_enableATA6 )

protected:
	virtual IOReturn 	identifyAndConfigureATADevice ( void );
};

enableATA6.cpp

#include "enableATA6.h"

#define	super IOATABlockStorageDriver
OSDefineMetaClassAndStructors ( com_sarnau_enableATA6, IOATABlockStorageDriver );

/***
 *  This kext overloads the standard IOATABlockStorageDriver (by having a IOProbeScore of 1000)
 *
 *  We only have to overload the identifyAndConfigureATADevice function and patch a variable
 *  to enable LBA support. The problem is the IOATABusInfo class - this class checks the bus
 *  interface hardware and detects that the computer is not capable of supporting LBA drives.
 *  And so LBA support is disabled in general. There is a good reason to do this, because without
 *  this support in the ROM the system can't read the kernel from the drive, if the kernel is
 *  beyond the 128MB border. For this reason we should partition a drive and make sure that the
 *  boot partition is 127.99 GB or smaller. If we don't boot from this drive, we don't have to
 *  partition it.
 ***/
IOReturn 	com_sarnau_enableATA6::identifyAndConfigureATADevice(void)
{
	// call super class (and execute IDENTIFY DEVICE commamd - see ATA6 spec for more information)
	IOReturn	err = super::identifyAndConfigureATADevice();

	// does the drive support the 48 bit command set?
	if(fDeviceIdentifyData[kATAIdentifyCommandSetSupported2] & kATASupports48BitAddressingMask)
	{
		// and is the 48 bit command set really enabled for that drive?
		if(fDeviceIdentifyData[kATAIdentifyCommandsEnabled] & kATASupports48BitAddressingMask)
		{
			// then force the use of the LBA commands in the driver
			fUseExtendedLBA = true;

			// set the "48-bit LBA supported" bit in the "ATA Features" entry in the registry
			// (this seems not to be necessary, but maybe 3rd party software checks the registry)
			fSupportedFeatures |= kIOATAFeature48BitLBA;

			// we don't increase the buffer size, which is normally done by the super class
			// when a LBA drive is recognized. So we are limited to 256 instead of 2048 blocks
			// per read or write.
		}
	}

	return err;
}
 
software/sourcecode_enableata6.txt · Last modified: 2008/01/31 01:22 (external edit)
 
Recent changes RSS feed