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;
123 if((u32)(1 << i) >= params->size && emptyBlocks[i]!=0)
124 return apaInsertPartition(device, params, emptyBlocks[i], err);
126 clink_this=apaCacheGetHeader(device, sector, APA_IO_MODE_READ, err);
127 header=clink_this->header;
128 part_end=header->start+header->length;
129 some_size=(part_end%params->size);
130 tmp = some_size ? params->size - some_size : 0;
132 if(hddDevices[device].totalLBA < (part_end + params->size + tmp)
134 || (part_end < sector))
137 apaCacheFree(clink_this);
141 if((clink_next=apaCacheGetHeader(device, APA_SECTOR_MBR, APA_IO_MODE_READ, err))==NULL)
143 apaCacheFree(clink_this);
147 while(part_end%params->size)
149 tempSize=params->size>>1;
150 while(0x3FFFF<tempSize)
152 if(!(part_end%tempSize))
154 clink_new=apaRemovePartition(device, part_end, 0,
155 clink_this->header->start, tempSize);
156 clink_this->header->next=part_end;
157 clink_this->flags|=APA_CACHE_FLAG_DIRTY;
158 clink_next->header->prev=clink_new->header->start;
160 clink_next->flags|=APA_CACHE_FLAG_DIRTY;
161 apaCacheFlushAllDirty(device);
162 apaCacheFree(clink_this);
163 clink_this=clink_new;
169 if((clink_new=apaFillHeader(device, params, part_end, 0, clink_this->header->start,
170 params->size, err))!=NULL)
172 clink_this->header->next=part_end;
173 clink_this->flags|=APA_CACHE_FLAG_DIRTY;
174 clink_next->header->prev=clink_new->header->start;
175 clink_next->flags|=APA_CACHE_FLAG_DIRTY;
176 apaCacheFlushAllDirty(device);
178 apaCacheFree(clink_this);
179 apaCacheFree(clink_next);
183static int inputError(
char *input)
185 APA_PRINTF(APA_DRV_NAME
": Error: Usage: %s [-o <apaMaxOpen>] [-n <maxcache>]\n", input);
186 return MODULE_NO_RESIDENT_END;
189static void printStartup(
void)
191 APA_PRINTF(APA_DRV_NAME
": PS2 APA Driver v%d.%d (c) 2003 Vector\n", APA_MODVER_MAJOR, APA_MODVER_MINOR);
196static int unlockDrive(s32 device)
200 if((rv=apaGetIlinkID(
id))==0)
201 return sceAtaSecurityUnLock(device,
id);
207int APA_ENTRYPOINT(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi)
209int APA_ENTRYPOINT(
int argc,
char *argv[])
224 for ( i = 0; i < apaMaxOpen; i += 1 )
226 if ( hddFileSlots[i].f )
228 APA_PRINTF(APA_DRV_NAME
": error: can't stop module(fd busy)\n");
229 return MODULE_REMOVABLE_END;
233 Dev9RegisterPowerOffHandler(0, NULL);
235 iomanX_DelDrv(hddFioDev.name);
236#ifdef APA_SUPPORT_BHDD
237 iomanX_DelDrv(bhddFioDev.name);
241 apaFreeMem(hddFileSlots);
244 APA_PRINTF(APA_DRV_NAME
": stopped module\n");
245 return MODULE_NO_RESIDENT_END;
251 if((input=strrchr(argv[0],
'/')))
259 if(argv[0][0] !=
'-')
261 if(strcmp(
"-o", argv[0])==0)
265 return inputError(input);
266 i=strtol(argv[0], 0, 10);
270 else if(strcmp(
"-n", argv[0])==0)
274 return inputError(input);
275 i=strtol(*argv, 0, 10);
282 APA_PRINTF(APA_DRV_NAME
": max open = %d, %d buffers\n", apaMaxOpen, cacheSize);
284 if(Dev9RegisterPowerOffHandler(0, &hddShutdownCb) != 0)
286 APA_PRINTF(APA_DRV_NAME
": error: dev9 may not be resident.\n");
287 return hddInitError();
291 if(apaGetTime(&tm) != 0)
293 APA_PRINTF(APA_DRV_NAME
": error: could not get date.\n");
294 return hddInitError();
297 APA_PRINTF(APA_DRV_NAME
": %02d:%02d:%02d %02d/%02d/%d\n",
298 tm.hour, tm.min, tm.sec, tm.month, tm.day, tm.year);
299 memset(&hddDevices, 0,
sizeof(hddDevices));
300 for(i = 0; i < BLKIO_MAX_VOLUMES; i++)
302 hddDevices[i].status = 3;
304 if(!(hddInfo=sceAtaInit(i)))
306 APA_PRINTF(APA_DRV_NAME
": Error: ata initialization failed.\n");
307 return hddInitError();
311 hddDevices[i].status--;
313 hddDevices[i].partitionMaxSize=apaGetPartitionMax(hddInfo->
total_sectors);
314 if(unlockDrive(i)==0)
315 hddDevices[i].status--;
316 APA_PRINTF(APA_DRV_NAME
": disk%d: 0x%08lx sectors, max 0x%08lx\n", i,
317 hddDevices[i].totalLBA, hddDevices[i].partitionMaxSize);
322 ret = (hddFileSlots == NULL) ? -
ENOMEM : 0;
325 APA_PRINTF(APA_DRV_NAME
": error: file descriptor initialization failed.\n");
326 return hddInitError();
331 if(apaCacheInit(cacheSize) != 0)
333 APA_PRINTF(APA_DRV_NAME
": error: cache buffer initialization failed.\n");
334 return hddInitError();
338 for(i=0;i < BLKIO_MAX_VOLUMES;i++)
340 if(hddDevices[i].status<2)
342 if((hddDevices[i].status != 1) && apaJournalRestore(i) != 0)
344 APA_PRINTF(APA_DRV_NAME
": error: log check failed.\n");
345 return hddInitError();
347 if(apaGetFormat(i, &hddDevices[i].format))
348 hddDevices[i].status--;
349 APA_PRINTF(APA_DRV_NAME
": drive status %d, format version %08x\n",
350 hddDevices[i].status, hddDevices[i].format);
355 iomanX_DelDrv(hddFioDev.name);
356 if(iomanX_AddDrv(&hddFioDev) == 0)
358#ifdef APA_SUPPORT_BHDD
359 iomanX_DelDrv(bhddFioDev.name);
360 if(iomanX_AddDrv(&bhddFioDev) == 0)
363#if defined(APA_XOSD_VER)
364 APA_PRINTF(APA_DRV_NAME
": version %04x driver start. This is XOSD LBA48 VERSION !!!!!!!!!!!\n", IRX_VER(APA_MODVER_MAJOR, APA_MODVER_MINOR));
365#elif defined(APA_OSD_VER)
366 APA_PRINTF(APA_DRV_NAME
": version %04x driver start. This is OSD version!\n", IRX_VER(APA_MODVER_MAJOR, APA_MODVER_MINOR));
368 APA_PRINTF(APA_DRV_NAME
": version %04x driver start.\n", IRX_VER(APA_MODVER_MAJOR, APA_MODVER_MINOR));
371 if (mi && ((mi->
newflags & 2) != 0))
374 return MODULE_RESIDENT_END;
378 APA_PRINTF(APA_DRV_NAME
": error: add device failed.\n");
379 return hddInitError();
384static void hddShutdownCb(
void)
388 for(i = 0; i < BLKIO_MAX_VOLUMES; i++)
390 if(hddDevices[i].status == 0)
391 blkIoSmartSaveAttr(i);
396static int hddInitError(
void)
399 Dev9RegisterPowerOffHandler(0, NULL);
401 return MODULE_NO_RESIDENT_END;