/* * floppy_blkdev.cpp * floppy * * Created by dgatwood on Tue Feb 05 2002. * Copyright (c) 2001 __MyCompanyName__. All rights reserved. * */ #include #define CPLUSPLUS typedef long unsigned int uint_t; #include "floppy.h" extern "C" { #include //This is for debugging purposes ONLY io_return_t fdsetstat(dev_t dev, dev_flavor_t flavor, dev_status_t data, natural_t count); } // virtual IOReturn doAsyncReadWrite(IOMemoryDescriptor *buffer, // UInt32 block,UInt32 nblks, // IOStorageCompletion completion) = 0; IOReturn org_mklinux_iokit_swim3_driver::doEjectMedia(void) { dev_t dev; dev=(this->busdev->unit << 6); if (fdsetstat(dev, (dev_flavor_t)V_EJECT, NULL, 0) == D_SUCCESS) return kIOReturnSuccess; else return kIOReturnError; } IOReturn org_mklinux_iokit_swim3_driver::doFormatMedia(UInt64 byteCapacity) { /* @@@ WRITE ME! @@@*/ return kIOReturnUnsupported; } UInt32 org_mklinux_iokit_swim3_driver::doGetFormatCapacities(UInt64 * capacities, UInt32 capacitiesMaxCount) { /* @@@ WRITE ME! @@@*/ return kIOReturnUnsupported; } IOReturn org_mklinux_iokit_swim3_driver::doLockUnlockMedia(bool doLock) { /* @@@ WRITE ME! @@@*/ return kIOReturnUnsupported; } IOReturn org_mklinux_iokit_swim3_driver::doSyncReadWrite(IOMemoryDescriptor *buffer, UInt32 block,UInt32 nblks) { /* @@@ WRITE ME! @@@ */ return kIOReturnUnsupported; } // virtual IOReturn doSynchronizeCache(void) = 0; // virtual char * getAdditionalDeviceInfoString(void) = 0; // virtual char * getProductString(void) = 0; // virtual char * getRevisionString(void) = 0; // virtual char * getVendorString(void) = 0; // virtual bool init(OSDictionary * properties); OSStatus FloppyPluginGetInfo(BSStorePtr infoStore, struct BSStoreMPIInfo *info); IOReturn org_mklinux_iokit_swim3_driver::reportBlockSize(UInt64 *blockSize) { struct BSStoreMPIInfo info; BSStorePtr infoStore; OSStatus ret; ret=FloppyPluginGetInfo(infoStore, &info); *blockSize=info.writeBlockSize; if (ret == E_BSSuccess) return kIOReturnSuccess; else return kIOReturnError; } IOReturn org_mklinux_iokit_swim3_driver::reportEjectability(bool *isEjectable) { *isEjectable=1; return kIOReturnSuccess; } IOReturn org_mklinux_iokit_swim3_driver::reportLockability(bool *isLockable) { *isLockable=1; return kIOReturnSuccess; } IOReturn org_mklinux_iokit_swim3_driver::reportMaxReadTransfer(UInt64 blockSize,UInt64 *max) { /* It's the same for floppies, so why screw with two functions? */ return reportMaxWriteTransfer(blockSize, max); } IOReturn org_mklinux_iokit_swim3_driver::reportMaxValidBlock(UInt64 *maxBlock) { struct BSStoreMPIInfo info; BSStorePtr infoStore; OSStatus ret; ret=FloppyPluginGetInfo(infoStore, &info); *maxBlock=info.storeSize / info.writeBlockSize; if (ret == E_BSSuccess) return kIOReturnSuccess; else return kIOReturnError; } IOReturn org_mklinux_iokit_swim3_driver::reportMaxWriteTransfer(UInt64 blockSize,UInt64 *max) { *max=MAX_PHYS / blockSize; return kIOReturnSuccess; } IOReturn org_mklinux_iokit_swim3_driver::reportMediaState(bool *mediaPresent,bool *changedState) { struct BSStoreMPIInfo info; BSStorePtr infoStore; OSStatus ret; ret=FloppyPluginGetInfo(infoStore, &info); if (info.curState == kBSOnline) *mediaPresent = true; else *mediaPresent = false; if (media_present != *mediaPresent) *changedState = true; else *changedState = false; if (ret == E_BSSuccess) return kIOReturnSuccess; else return kIOReturnError; } IOReturn org_mklinux_iokit_swim3_driver::reportPollRequirements(bool *pollRequired, bool *pollIsExpensive) { *pollRequired=false; *pollIsExpensive=false; return kIOReturnSuccess; } IOReturn org_mklinux_iokit_swim3_driver::reportRemovability(bool *isRemovable) { *isRemovable=true; return kIOReturnSuccess; } IOReturn org_mklinux_iokit_swim3_driver::reportWriteProtection(bool *isWriteProtected) { struct BSStoreMPIInfo info; BSStorePtr infoStore; OSStatus ret; ret=FloppyPluginGetInfo(infoStore, &info); if (!info.isWriteable) *isWriteProtected = true; else *isWriteProtected = false; if (ret == E_BSSuccess) return kIOReturnSuccess; else return kIOReturnError; }