FLStatus flRegisterComponents(void) { /* Registering socket interface */ flprintk(1,"flRegisterComponents: from %x to %x\n",flGetWinL(), flGetWinH()); if (flRegisterDOCPLUSSOC(flGetWinL(), flGetWinH()) == flOK) { /* Register DiskOnChip socket interface */ /* Registering MTD */ flRegisterDOCPLUS(); /* Registering translation layer */ flRegisterINFTL(); return flOK; } if (flRegisterDOCSOC(flGetWinL(), flGetWinH()) == flOK) { /* Register DiskOnChip socket interface */ /* Registering MTD */ flRegisterDOC2000(); /* Registering translation layer */ flRegisterINFTL(); /* Register MCP */ /* Registering translation layer */ flRegisterNFTL(); return flOK; } return flAdapterNotFound; }
/* Perform read or write of appropriate number of sectors from a DOC volume */ int fl_doc_write(int VOL, void *data, int block, int count) { IOreq ioreq; int status=0; ioreq.irHandle = VOL; ioreq.irData = data; ioreq.irSectorNo = block; ioreq.irSectorCount = count; #ifdef FL_FAT_FILTER if ((status = ffCheckBeforeWrite(&ioreq))) flprintk(0,"VOL: %d ffCheckBeforeWrite() status %d, block=%d count=%d\n", VOL, status, block, count); #endif /* FL_FAT_FILTER */ if ((status = flAbsWrite(&ioreq))) flprintk(0,"VOL: %d flAbsWrite() status %d, block=%d count=%d\n", VOL, status, block, count); return (status); }
/* Initialize M-Systems OSAK. */ int fl_doc_init() { DEBUG_PRINT("fllnx version: %s\n", FLLNX_VERSION); if (flInit()) { flprintk(0,"M-Systems DiskOnChip not found\n"); return (-1); } return (0); }
/* return 1 if volume read only)*/ int fl_protType(int VOL) { IOreq ioreq; int stat=0; ioreq.irHandle = VOL; stat=flIdentifyProtection(&ioreq); if(!stat) { if( (ioreq.irFlags&READ_PROTECTED || ioreq.irFlags&WRITE_PROTECTED) && (!(ioreq.irFlags&KEY_INSERTED)) ) { flprintk(1,"fl_protType:%x: Volume protected\n", VOL); return 1; } } else flprintk(1,"fl_protType:%x: flIdentifyProtection returns %d\n", VOL,stat); return 0; }
/* Perform read or write of appropriate number of sectors from a DOC volume */ int fl_doc_read(int VOL, void *data, int block, int count) { IOreq ioreq; static int status=0; ioreq.irHandle = VOL; ioreq.irData = data; ioreq.irSectorNo = block; ioreq.irSectorCount = count; if ((status = flAbsRead(&ioreq))) flprintk(0,"%d: flAbsRead() status %d, block=%d count=%d\n", VOL, status, block, count); return status; }
/* Get the number of sectors in the DOC volume */ int fl_doc_sectors(int VOL) { IOreq ioreq; int status; ioreq.irHandle = VOL; if ((status = flSectorsInVolume(&ioreq)) != 0) { flprintk(0,"Cannot get sectors in volume: %d\n", VOL); return (0); } return (ioreq.irLength); }
/* Dismount DOC volume */ int fl_doc_dismount(int VOL) { IOreq ioreq; int status; ioreq.irHandle = VOL; if ((status = flDismountVolume(&ioreq)) != 0) { flprintk(0,"fl_doc_dismount: Cannot dismount DOC volume: %d\n", VOL); return (-1); } return (0); }
int fl_doc_ioctl(int bdtlVolume, int cmd,unsigned long arg) { unsigned char bdkVolume=0; IOreq ioreq; int status; DEBUG_PRINT("In fl_doc_ioctl: bdtlVolume %d bdkVolume %d command %d\n",bdtlVolume,bdkVolume,cmd); /* maybe arg doesn't correspond exactly to what irData should be, and so we have to do some unpickling */ switch (cmd) { case FL_IOCTL_GET_INFO: ioreq.irHandle = bdtlVolume; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_GET_INFO; break; case FL_IOCTL_DEFRAGMENT: ioreq.irHandle = bdtlVolume; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_DEFRAGMENT; break; case FL_IOCTL_WRITE_PROTECT: ioreq.irHandle = bdtlVolume; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_WRITE_PROTECT; break; case FL_IOCTL_MOUNT_VOLUME: ioreq.irHandle = bdtlVolume; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_MOUNT_VOLUME; break; case FL_IOCTL_FORMAT_VOLUME: ioreq.irHandle = bdtlVolume; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_FORMAT_VOLUME; break; case FL_IOCTL_BDK_OPERATION: ioreq.irHandle = bdkVolume; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_BDK_OPERATION; break; case FL_IOCTL_DELETE_SECTORS: ioreq.irHandle = bdtlVolume; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_DELETE_SECTORS; break; case FL_IOCTL_READ_SECTORS: ioreq.irHandle = bdtlVolume; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_READ_SECTORS; break; case FL_IOCTL_WRITE_SECTORS: ioreq.irHandle = bdtlVolume; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_WRITE_SECTORS; break; case FL_IOCTL_FORMAT_PHYSICAL_DRIVE: ioreq.irHandle = bdtlVolume&0x0f; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_FORMAT_PHYSICAL_DRIVE; break; case FL_IOCTL_FORMAT_LOGICAL_DRIVE: ioreq.irHandle = bdtlVolume; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_FORMAT_LOGICAL_DRIVE; break; case FL_IOCTL_BDTL_HW_PROTECTION: ioreq.irHandle = bdtlVolume; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_BDTL_HW_PROTECTION; break; case FL_IOCTL_BINARY_HW_PROTECTION: ioreq.irHandle = bdkVolume; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_BINARY_HW_PROTECTION; break; case FL_IOCTL_OTP: ioreq.irHandle = bdtlVolume&0x0f; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_OTP; break; case FL_IOCTL_CUSTOMER_ID: ioreq.irHandle = bdtlVolume&0x0f; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_CUSTOMER_ID; break; case FL_IOCTL_UNIQUE_ID: ioreq.irHandle = bdtlVolume&0x0f; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_UNIQUE_ID; break; case FL_IOCTL_NUMBER_OF_PARTITIONS: ioreq.irHandle = bdtlVolume&0x0f; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_NUMBER_OF_PARTITIONS; break; case FL_IOCTL_INQUIRE_CAPABILITIES: ioreq.irHandle = 0; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_INQUIRE_CAPABILITIES; break; case FL_IOCTL_SET_ENVIRONMENT_VARIABLES: ioreq.irHandle = 0; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_SET_ENVIRONMENT_VARIABLES; break; case FL_IOCTL_PLACE_EXB_BY_BUFFER: ioreq.irHandle = bdtlVolume&0x0f; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_PLACE_EXB_BY_BUFFER; break; case FL_IOCTL_WRITE_IPL: ioreq.irHandle = bdtlVolume&0x0f; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_WRITE_IPL; break; case FL_IOCTL_DEEP_POWER_DOWN_MODE: ioreq.irHandle = bdtlVolume&0x0f; ioreq.irData = (void *) arg; ioreq.irFlags = FL_IOCTL_DEEP_POWER_DOWN_MODE; break; case FL_IOCTL_LNX: { flInputLnxRecord*inRec=(flInputLnxRecord*)(((flIOctlRecord*)arg)->inputRecord); flOutputLnxRecord*outRec=(flOutputLnxRecord*)(((flIOctlRecord*)arg)->outputRecord); switch( inRec -> command ) { case 0: // set BKD volume bdkVolume=inRec->data; return (outRec->status=flOK); default: return (outRec->status=flBadParameter); } } default: return flBadParameter; } if ((status = flIOctl(&ioreq))) { flprintk(0,"fl: bdtlVolume: %d flIOctl() status %d, cmd=%d", bdtlVolume, status, cmd); } return (status); }