#include "cmos.h" // inb_cmos
#include "pic.h" // eoi_pic1
#include "bregs.h" // struct bregs
+#include "boot.h" // boot_add_floppy
+#include "pci.h" // pci_to_bdf
+#include "pci_ids.h" // PCI_CLASS_BRIDGE_ISA
#define FLOPPY_SIZE_CODE 0x02 // 512 byte sectors
#define FLOPPY_DATALEN 0xff // Not used - because size code is 0x02
};
struct drive_s *
-addFloppy(int floppyid, int ftype, int driver)
+init_floppy(int floppyid, int ftype)
{
if (ftype <= 0 || ftype >= ARRAY_SIZE(FloppyInfo)) {
dprintf(1, "Bad floppy type %d\n", ftype);
}
memset(drive_g, 0, sizeof(*drive_g));
drive_g->cntl_id = floppyid;
- drive_g->type = driver;
+ drive_g->type = DTYPE_FLOPPY;
drive_g->blksize = DISK_SECTOR_SIZE;
drive_g->floppy_type = ftype;
drive_g->sectors = (u64)-1;
memcpy(&drive_g->lchs, &FloppyInfo[ftype].chs
, sizeof(FloppyInfo[ftype].chs));
-
- map_floppy_drive(drive_g);
return drive_g;
}
-void
-describe_floppy(struct drive_s *drive_g)
+static void
+addFloppy(int floppyid, int ftype)
{
- printf("drive %c", 'A' + drive_g->cntl_id);
+ struct drive_s *drive_g = init_floppy(floppyid, ftype);
+ if (!drive_g)
+ return;
+ char *desc = znprintf(MAXDESCSIZE, "Floppy [drive %c]", 'A' + floppyid);
+ struct pci_device *pci = pci_find_class(PCI_CLASS_BRIDGE_ISA); /* isa-to-pci bridge */
+ int prio = bootprio_find_fdc_device(pci, PORT_FD_BASE, floppyid);
+ boot_add_floppy(drive_g, desc, prio);
}
void
} else {
u8 type = inb_cmos(CMOS_FLOPPY_DRIVE_TYPE);
if (type & 0xf0)
- addFloppy(0, type >> 4, DTYPE_FLOPPY);
+ addFloppy(0, type >> 4);
if (type & 0x0f)
- addFloppy(1, type & 0x0f, DTYPE_FLOPPY);
+ addFloppy(1, type & 0x0f);
}
outb(0x02, PORT_DMA1_MASK_REG);
- enable_hwirq(6, entry_0e);
+ enable_hwirq(6, FUNC16(entry_0e));
}
// Find a floppy type that matches a given image size.