示例#1
0
文件: apa.c 项目: EvertonSilva/ps2sdk
int getPartErrorName(u32 device, char *name)
{
	int lba;
	int rv=0;
	apa_cache *clink;

	if((rv=getPartErrorSector(device, APA_SECTOR_PART_ERROR, &lba)) <= 0)
		return rv;
	if(!(clink=cacheGetHeader(device, 0, THEADER_MODE_READ, &rv)))
		return rv;

	while(clink)
	{
		if(clink->header->type!=APA_TYPE_FREE && 
			!(clink->header->flags & CACHE_FLAG_DIRTY) && 
			clink->header->start==lba) {
				if(name) {
					strncpy(name, clink->header->id, APA_IDMAX - 1);
					name[APA_IDMAX - 1] = '\0';
				}
				cacheAdd(clink);
				return 1;
		}
		clink=apaGetNextHeader(clink, &rv);
	}

	// clear error if no errors and partitions was not found...
	if(rv==0)
		setPartErrorSector(device, 0);
	return rv;
}
示例#2
0
int hddDevctl(iop_file_t *f, const char *devname, int cmd, void *arg,
			  unsigned int arglen, void *bufp, unsigned int buflen)
{
	int	rv=0;

	WaitSema(fioSema);
	switch(cmd)
	{
	// cmd set 1
	case APA_DEVCTL_DEV9_SHUTDOWN:
		atadUpdateAttrib(f->unit);
		dev9Shutdown();
		break;

	case APA_DEVCTL_IDLE:
		rv=atadIdle(f->unit, *(char *)arg);
		break;

	case APA_DEVCTL_MAX_SECTORS:
		rv=hddDeviceBuf[f->unit].partitionMaxSize;
		break;

	case APA_DEVCTL_TOTAL_SECTORS:
		rv=hddDeviceBuf[f->unit].totalLBA;
		break;

	case APA_DEVCTL_FLUSH_CACHE:
		if(atadFlushCache(f->unit))
			rv=-EIO;
		break;

	case APA_DEVCTL_SWAP_TMP:
		rv=devctlSwapTemp(f->unit, (char *)arg);
		break;

	case APA_DEVCTL_SMART_STAT:
		rv=atadGetStatus(f->unit);
		break;

	case APA_DEVCTL_STATUS:
		rv=hddDeviceBuf[f->unit].status;
		break;

	case APA_DEVCTL_FORMAT:
		rv=hddDeviceBuf[f->unit].format;
		break;

	// removed dos not work the way you like... use hddlib ;)
	//case APA_DEVCTL_FREE_SECTORS:
	//case APA_DEVCTL_FREE_SECTORS2:
	//	rv=apaGetFreeSectors(f->unit, bufp);
	//	break;

	// cmd set 2 :)
	case APA_DEVCTL_GETTIME:
		rv=getPs2Time((ps2time *)bufp);
		break;

	case APA_DEVCTL_SET_OSDMBR:
		rv=devctlSetOsdMBR(f->unit, (hddSetOsdMBR_t *)arg);
		break;

	case APA_DEVCTL_GET_SECTOR_ERROR:
		rv=getPartErrorSector(f->unit, APA_SECTOR_SECTOR_ERROR, 0);
		break;

	case APA_DEVCTL_GET_ERROR_PART_NAME:
		rv=getPartErrorName(f->unit, (char *)bufp);
		break;

	case APA_DEVCTL_ATA_READ:
		rv=atadDmaTransfer(f->unit, (void *)bufp, ((hddAtaTransfer_t *)arg)->lba,
			((hddAtaTransfer_t *)arg)->size, ATAD_MODE_READ);
		break;

	case APA_DEVCTL_ATA_WRITE:
		rv=atadDmaTransfer(f->unit, ((hddAtaTransfer_t *)arg)->data,
			((hddAtaTransfer_t *)arg)->lba, ((hddAtaTransfer_t *)arg)->size,
				ATAD_MODE_WRITE);
		break;

	case APA_DEVCTL_SCE_IDENTIFY_DRIVE:
		rv=atadSceIdentifyDrive(f->unit, (u16 *)bufp);
		break;

	case APA_DEVCTL_IS_48BIT:
		rv=atadIs48bit(f->unit);
		break;

	case APA_DEVCTL_SET_TRANSFER_MODE:
		rv=atadSetTransferMode(f->unit, ((hddAtaSetMode_t *)arg)->type, ((hddAtaSetMode_t *)arg)->mode);
		break;

	case APA_DEVCTL_ATA_IOP_WRITE:
		rv=atadDmaTransfer(f->unit, ((hddAtaIOPTransfer_t *)arg)->data,
			((hddAtaIOPTransfer_t *)arg)->lba, ((hddAtaIOPTransfer_t *)arg)->size,
				ATAD_MODE_WRITE);
		break;
		
	default:
		rv=-EINVAL;
		break;
	}
	SignalSema(fioSema);

	return rv;
}
示例#3
0
int hddIoctl2(iop_file_t *f, int req, void *argp, unsigned int arglen,
			  void *bufp, unsigned int buflen)
{
	u32 rv=0;
	hdd_file_slot_t *fileSlot=f->privdata;

	WaitSema(fioSema);
	switch(req)
	{
	// cmd set 1
	case APA_IOCTL2_ADD_SUB:
		rv=ioctl2AddSub(fileSlot, (char *)argp);
		break;

	case APA_IOCTL2_DELETE_LAST_SUB:
		rv=ioctl2DeleteLastSub(fileSlot);
		break;

	case APA_IOCTL2_NUMBER_OF_SUBS:
		rv=fileSlot->nsub;
		break;

	case APA_IOCTL2_FLUSH_CACHE:
		atadFlushCache(f->unit);
		break;

	// cmd set 2
	case APA_IOCTL2_TRANSFER_DATA:
		rv=ioctl2Transfer(f->unit, fileSlot, argp);
		break;

	case APA_IOCTL2_GETSIZE:
		//	rv=fileSlot->subs[*(u32 *)argp].length;
		rv=((apa_subs *)(&fileSlot->start))[*(u32 *)argp].length;	// !HACK!
		break;

	case APA_IOCTL2_GETHEADER:
		if(atadDmaTransfer(f->unit, bufp, fileSlot->start, sizeof(apa_header)/512, ATAD_MODE_READ))
			rv=-EIO;
		rv=sizeof(apa_header);
		break;

	case APA_IOCTL2_SET_PART_ERROR:
		setPartErrorSector(f->unit, fileSlot->start); rv=0;
		break;

	case APA_IOCTL2_GET_PART_ERROR:
		if((rv=getPartErrorSector(f->unit, APA_SECTOR_PART_ERROR, bufp)) > 0) {
			if(*(u32 *)bufp==fileSlot->start) {
				rv=0; setPartErrorSector(f->unit, 0);// clear last error :)
			}
		}
		break;

	default:
		rv=-EINVAL;
		break;
	}
	SignalSema(fioSema);
	return rv;
}