int apaReadHeader(s32 device, apa_header_t *header, u32 lba) { if (ata_device_sector_io(device, header, lba, 2, ATA_DIR_READ) != 0) return -EIO; if (header->magic != APA_MAGIC) return -EIO; if (apaCheckSum(header) != header->checksum) return -EIO; if (lba == APA_SECTOR_MBR) { if (strncmp(header->mbr.magic, apaMBRMagic, sizeof(header->mbr.magic)) == 0) return 0; APA_PRINTF(APA_DRV_NAME ": error: invalid partition table or version newer than I know.\n"); return -EIO; } return 0; }
int apaReadHeader(u32 device, apa_header *header, u32 lba) { if(atadDmaTransfer(device, header, lba, 2, ATAD_MODE_READ)!=0) return -EIO; if(header->magic!=APA_MAGIC) return -EIO; if(apaCheckSum(header)!=header->checksum) return -EIO; if(lba==APA_SECTOR_MBR) { if(strncmp(header->mbr.magic, mbrMagic, 0x20)==0) return 0; dprintf1("ps2hdd: Error: invalid partition table or version newer than I know.\n"); return -EIO; } return 0; }
int hddFormat(iop_file_t *f, const char *dev, const char *blockdev, void *arg, int arglen) { int rv=0; apa_cache_t *clink; u32 i; #ifdef APA_FORMAT_MAKE_PARTITIONS apa_params_t params; u32 emptyBlocks[32]; #endif if(f->unit >= 2) return -ENXIO; // clear all errors on hdd clink=apaCacheAlloc(); memset(clink->header, 0, sizeof(apa_header_t)); if(ata_device_sector_io(f->unit, clink->header, APA_SECTOR_SECTOR_ERROR, 1, ATA_DIR_WRITE)){ apaCacheFree(clink); return -EIO; } if(ata_device_sector_io(f->unit, clink->header, APA_SECTOR_PART_ERROR, 1, ATA_DIR_WRITE)){ apaCacheFree(clink); return -EIO; } // clear apa headers for(i=1024*8;i<hddDevices[f->unit].totalLBA;i+=(1024*256)) { ata_device_sector_io(f->unit, clink->header, i, sizeof(apa_header_t)/512, ATA_DIR_WRITE); } apaCacheFree(clink); if((rv=apaJournalReset(f->unit))!=0) return rv; // set up mbr :) if((clink=apaCacheGetHeader(f->unit, 0, APA_IO_MODE_WRITE, &rv))){ apa_header_t *header=clink->header; memset(header, 0, sizeof(apa_header_t)); header->magic=APA_MAGIC; header->length=(1024*256); // 128MB header->type=APA_TYPE_MBR; strcpy(header->id,"__mbr"); #ifdef APA_FORMAT_LOCK_MBR apaEncryptPassword(header->id, header->fpwd, "sce_mbr"); apaEncryptPassword(header->id, header->rpwd, "sce_mbr"); #endif memcpy(header->mbr.magic, apaMBRMagic, sizeof(header->mbr.magic)); header->mbr.version=APA_MBR_VERSION; header->mbr.nsector=0; apaGetTime(&header->created); apaGetTime(&header->mbr.created); header->checksum=apaCheckSum(header); clink->flags|=APA_CACHE_FLAG_DIRTY; apaCacheFlushDirty(clink); ata_device_flush_cache(f->unit); apaCacheFree(clink); hddDevices[f->unit].status=0; hddDevices[f->unit].format=APA_MBR_VERSION; } #ifdef APA_FORMAT_MAKE_PARTITIONS memset(&emptyBlocks, 0, sizeof(emptyBlocks)); memset(¶ms, 0, sizeof(apa_params_t)); params.size=(1024*256); params.type=APA_TYPE_PFS; // add __net, __system.... for(i=0;formatPartList[i];i++) { memset(params.id, 0, APA_IDMAX); strcpy(params.id, formatPartList[i]); if(!(clink=hddAddPartitionHere(f->unit, ¶ms, emptyBlocks, i ? clink->sector : 0, &rv))) return rv; apaCacheFree(clink); params.size<<=1; if(hddDevices[f->unit].partitionMaxSize < params.size) params.size=hddDevices[f->unit].partitionMaxSize; } #endif return rv; }
int hddFormat(iop_file_t *f, const char *dev, const char *blockdev, void *arg, size_t arglen) { int rv=0; apa_cache *clink; int i; input_param params; u32 emptyBlocks[32]; if(f->unit >= 2) return -ENXIO; // clear all errors on hdd clink=cacheGetFree(); memset(clink->header, 0, sizeof(apa_header)); if(atadDmaTransfer(f->unit, clink->header, APA_SECTOR_SECTOR_ERROR, 1, ATAD_MODE_WRITE)){ cacheAdd(clink); return -EIO; } if(atadDmaTransfer(f->unit, clink->header, APA_SECTOR_PART_ERROR, 1, ATAD_MODE_WRITE)){ cacheAdd(clink); return -EIO; } // clear apa headers for(i=1024*8;i<hddDeviceBuf[f->unit].totalLBA;i+=(1024*256)) { atadDmaTransfer(f->unit, clink->header, i, sizeof(apa_header)/512, ATAD_MODE_WRITE); } cacheAdd(clink); if((rv=journalReset(f->unit))!=0) return rv; // set up mbr :) if((clink=cacheGetHeader(f->unit, 0, 1, &rv))){ apa_header *header=clink->header; memset(header, 0, sizeof(apa_header)); header->magic=APA_MAGIC; header->length=(1024*256); // 128MB header->type=APA_TYPE_MBR; strcpy(header->id,"__mbr"); memcpy(header->mbr.magic, mbrMagic, 32); header->mbr.version=APA_MBR_VERSION; header->mbr.nsector=0; getPs2Time(&header->created); getPs2Time(&header->mbr.created); header->checksum=apaCheckSum(header); clink->flags|=CACHE_FLAG_DIRTY; cacheFlushDirty(clink); atadFlushCache(f->unit); cacheAdd(clink); hddDeviceBuf[f->unit].status=0; hddDeviceBuf[f->unit].format=APA_MBR_VERSION; } memset(&emptyBlocks, 0, sizeof(emptyBlocks)); memset(¶ms, 0, sizeof(input_param)); params.size=(1024*256); params.type=APA_TYPE_PFS; // add __net, __system.... for(i=0;formatPartList[i];i++) { memset(params.id, 0, APA_IDMAX); strcpy(params.id, formatPartList[i]); if(!(clink=apaAddPartitionHere(f->unit, ¶ms, emptyBlocks, i ? clink->sector : 0, &rv))) return rv; cacheAdd(clink); params.size<<=1; if(hddDeviceBuf[f->unit].partitionMaxSize < params.size) params.size=hddDeviceBuf[f->unit].partitionMaxSize; } return rv; }