25static void apaCalculateFreeSpace(u32 *free, u32 sectors)
27 u32 maxsize = 0x1FFFFF;
28 u32 minsize = 0x3FFFF;
29#ifdef APA_8MB_PARTITION_SIZE
32 if (maxsize < sectors) {
37 if ((*free & sectors) == 0) {
41 for (sectors /= 2; minsize < sectors; sectors /= 2)
45int apaGetFreeSectors(s32 device, u32 *free,
apa_device_t *deviceinfo)
50 u32 minsize = 0x3FFFF;
51#ifdef APA_8MB_PARTITION_SIZE
57 if((clink = apaCacheGetHeader(device, APA_SECTOR_MBR, APA_IO_MODE_READ, &rv)) != NULL)
60 if(clink->header->type == 0)
61 apaCalculateFreeSpace(free, clink->header->length);
62 sectors += clink->header->length;
63 }
while((clink = apaGetNextHeader(clink, &rv)) != NULL);
68 for(partMax = deviceinfo[device].partitionMaxSize; minsize < partMax; partMax = deviceinfo[device].partitionMaxSize)
70 for( ; minsize < partMax; partMax /= 2)
73 if((sectors % partMax == 0) && ((u64)sectors + partMax < deviceinfo[device].totalLBA))
75 apaCalculateFreeSpace(free, partMax);
81 if(minsize >= partMax)
85 APA_PRINTF(APA_DRV_NAME
": total = %08lx sectors, installable = %08lx sectors.\n", sectors, *free);