38IRX_ID(
"hdd_driver", APA_MODVER_MAJOR, APA_MODVER_MINOR);
41IOMANX_RETURN_VALUE_IMPL(
EPERM);
52 IOMANX_RETURN_VALUE(
EPERM),
54 IOMANX_RETURN_VALUE(
EPERM),
55 IOMANX_RETURN_VALUE(
EPERM),
60 IOMANX_RETURN_VALUE(
EPERM),
62 IOMANX_RETURN_VALUE(
EPERM),
63 IOMANX_RETURN_VALUE(
EPERM),
66 IOMANX_RETURN_VALUE_S64(
EPERM),
68 IOMANX_RETURN_VALUE(
EPERM),
69 IOMANX_RETURN_VALUE(
EPERM),
79#ifdef APA_SUPPORT_BHDD
94static int inputError(
char *input);
96static int unlockDrive(s32 device);
99static void hddShutdownCb(
void);
101static int hddInitError(
void);
103int hddCheckPartitionMax(s32 device, u32 size)
106 return (hddDevices[device].partitionMaxSize >= size) ? 0 : -
EINVAL;
110 u32 sector,
int *err)
117 u32 tmp, some_size, part_end;
119 u32 minsize = 0x3FFFF;
120#ifdef APA_8MB_PARTITION_SIZE
127 if((u32)(1 << i) >= params->size && emptyBlocks[i]!=0)
128 return apaInsertPartition(device, params, emptyBlocks[i], err);
130 clink_this=apaCacheGetHeader(device, sector, APA_IO_MODE_READ, err);
131 header=clink_this->header;
132 part_end=header->start+header->length;
133 some_size=(part_end%params->size);
134 tmp = some_size ? params->size - some_size : 0;
136 if(hddDevices[device].totalLBA < (part_end + params->size + tmp)
138 || (part_end < sector))
141 apaCacheFree(clink_this);
145 if((clink_next=apaCacheGetHeader(device, APA_SECTOR_MBR, APA_IO_MODE_READ, err))==NULL)
147 apaCacheFree(clink_this);
151 while(part_end%params->size)
153 tempSize=params->size>>1;
154 while (minsize < tempSize)
156 if(!(part_end%tempSize))
158 clink_new=apaRemovePartition(device, part_end, 0,
159 clink_this->header->start, tempSize);
160 clink_this->header->next=part_end;
161 clink_this->flags|=APA_CACHE_FLAG_DIRTY;
162 clink_next->header->prev=clink_new->header->start;
164 clink_next->flags|=APA_CACHE_FLAG_DIRTY;
165 apaCacheFlushAllDirty(device);
166 apaCacheFree(clink_this);
167 clink_this=clink_new;
173 if((clink_new=apaFillHeader(device, params, part_end, 0, clink_this->header->start,
174 params->size, err))!=NULL)
176 clink_this->header->next=part_end;
177 clink_this->flags|=APA_CACHE_FLAG_DIRTY;
178 clink_next->header->prev=clink_new->header->start;
179 clink_next->flags|=APA_CACHE_FLAG_DIRTY;
180 apaCacheFlushAllDirty(device);
182 apaCacheFree(clink_this);
183 apaCacheFree(clink_next);
187static int inputError(
char *input)
189 APA_PRINTF(APA_DRV_NAME
": Error: Usage: %s [-o <apaMaxOpen>] [-n <maxcache>]\n", input);
190 return MODULE_NO_RESIDENT_END;
193static void printStartup(
void)
195 APA_PRINTF(APA_DRV_NAME
": PS2 APA Driver v%d.%d (c) 2003 Vector\n", APA_MODVER_MAJOR, APA_MODVER_MINOR);
200static int unlockDrive(s32 device)
204 if((rv=apaGetIlinkID(
id))==0)
205 return sceAtaSecurityUnLock(device,
id);
211int APA_ENTRYPOINT(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi)
213int APA_ENTRYPOINT(
int argc,
char *argv[])
228 for ( i = 0; i < apaMaxOpen; i += 1 )
230 if ( hddFileSlots[i].f )
232 APA_PRINTF(APA_DRV_NAME
": error: can't stop module(fd busy)\n");
233 return MODULE_REMOVABLE_END;
237 Dev9RegisterPowerOffHandler(0, NULL);
239 iomanX_DelDrv(hddFioDev.name);
240#ifdef APA_SUPPORT_BHDD
241 iomanX_DelDrv(bhddFioDev.name);
245 apaFreeMem(hddFileSlots);
248 APA_PRINTF(APA_DRV_NAME
": stopped module\n");
249 return MODULE_NO_RESIDENT_END;
255 if((input=strrchr(argv[0],
'/')))
263 if(argv[0][0] !=
'-')
265 if(strcmp(
"-o", argv[0])==0)
269 return inputError(input);
270 i=strtol(argv[0], 0, 10);
274 else if(strcmp(
"-n", argv[0])==0)
278 return inputError(input);
279 i=strtol(*argv, 0, 10);
286 APA_PRINTF(APA_DRV_NAME
": max open = %d, %d buffers\n", apaMaxOpen, cacheSize);
288 if(Dev9RegisterPowerOffHandler(0, &hddShutdownCb) != 0)
290 APA_PRINTF(APA_DRV_NAME
": error: dev9 may not be resident.\n");
291 return hddInitError();
295 if(apaGetTime(&tm) != 0)
297 APA_PRINTF(APA_DRV_NAME
": error: could not get date.\n");
298 return hddInitError();
301 APA_PRINTF(APA_DRV_NAME
": %02d:%02d:%02d %02d/%02d/%d\n",
302 tm.hour, tm.min, tm.sec, tm.month, tm.day, tm.year);
303 memset(&hddDevices, 0,
sizeof(hddDevices));
304 for(i = 0; i < BLKIO_MAX_VOLUMES; i++)
306 hddDevices[i].status = 3;
308 if(!(hddInfo=sceAtaInit(i)))
310 APA_PRINTF(APA_DRV_NAME
": Error: ata initialization failed.\n");
311 return hddInitError();
315 hddDevices[i].status--;
317 hddDevices[i].partitionMaxSize=apaGetPartitionMax(hddInfo->
total_sectors);
318 if(unlockDrive(i)==0)
319 hddDevices[i].status--;
320 APA_PRINTF(APA_DRV_NAME
": disk%d: 0x%08lx sectors, max 0x%08lx\n", i,
321 hddDevices[i].totalLBA, hddDevices[i].partitionMaxSize);
326 ret = (hddFileSlots == NULL) ? -
ENOMEM : 0;
329 APA_PRINTF(APA_DRV_NAME
": error: file descriptor initialization failed.\n");
330 return hddInitError();
335 if(apaCacheInit(cacheSize) != 0)
337 APA_PRINTF(APA_DRV_NAME
": error: cache buffer initialization failed.\n");
338 return hddInitError();
342 for(i=0;i < BLKIO_MAX_VOLUMES;i++)
344 if(hddDevices[i].status<2)
346 if((hddDevices[i].status != 1) && apaJournalRestore(i) != 0)
348 APA_PRINTF(APA_DRV_NAME
": error: log check failed.\n");
349 return hddInitError();
351 if(apaGetFormat(i, &hddDevices[i].format))
352 hddDevices[i].status--;
353 APA_PRINTF(APA_DRV_NAME
": drive status %d, format version %08x\n",
354 hddDevices[i].status, hddDevices[i].format);
359 iomanX_DelDrv(hddFioDev.name);
360 if(iomanX_AddDrv(&hddFioDev) == 0)
362#ifdef APA_SUPPORT_BHDD
363 iomanX_DelDrv(bhddFioDev.name);
364 if(iomanX_AddDrv(&bhddFioDev) == 0)
367#if defined(APA_XOSD_VER)
368 APA_PRINTF(APA_DRV_NAME
": version %04x driver start. This is XOSD LBA48 VERSION !!!!!!!!!!!\n", IRX_VER(APA_MODVER_MAJOR, APA_MODVER_MINOR));
369#elif defined(APA_OSD_VER)
370 APA_PRINTF(APA_DRV_NAME
": version %04x driver start. This is OSD version!\n", IRX_VER(APA_MODVER_MAJOR, APA_MODVER_MINOR));
372 APA_PRINTF(APA_DRV_NAME
": version %04x driver start.\n", IRX_VER(APA_MODVER_MAJOR, APA_MODVER_MINOR));
375 if (mi && ((mi->
newflags & 2) != 0))
378 return MODULE_RESIDENT_END;
382 APA_PRINTF(APA_DRV_NAME
": error: add device failed.\n");
383 return hddInitError();
388static void hddShutdownCb(
void)
392 for(i = 0; i < BLKIO_MAX_VOLUMES; i++)
394 if(hddDevices[i].status == 0)
395 blkIoSmartSaveAttr(i);
400static int hddInitError(
void)
403 Dev9RegisterPowerOffHandler(0, NULL);
405 return MODULE_NO_RESIDENT_END;