/* * Initialize drive parameters based on the floppy type returned * by the CMOS. */ static void Setup_Drive_Parameters(int drive, int type) { if (IS_VALID_FLOPPY_TYPE(type)) { struct Floppy_Parameters* params = &s_floppyParamsTable[type]; char devname[BLOCKDEV_MAX_NAME_LEN+1]; int rc; snprintf(devname, sizeof(devname), "fd%d", drive); Print(" %s: cyl=%d, heads=%d, sectors=%d\n", devname, params->cylinders, params->heads, params->sectors); s_driveTable[drive].params = params; /* Register the block device. */ rc = Register_Block_Device(devname, &s_floppyDeviceOps, drive, 0, &s_floppyWaitQueue, &s_floppyRequestQueue); if (rc != 0) Print(" Error: could not create block device for %s\n", devname); } }
static int readDriveConfig(int drive) { int i; int status; short info[256]; char devname[BLOCKDEV_MAX_NAME_LEN]; int rc; if (ideDebug > 1) Print("ide: about to read drive config for drive #%d\n", drive); Out_Byte(IDE_DRIVE_HEAD_REGISTER, IDE_DRIVE(drive)); Out_Byte(IDE_COMMAND_REGISTER, IDE_COMMAND_IDENTIFY_DRIVE); while (In_Byte(IDE_STATUS_REGISTER) & IDE_STATUS_DRIVE_BUSY); status = In_Byte(IDE_STATUS_REGISTER); /* * simulate failure * status = 0x50; */ if ((status & IDE_STATUS_DRIVE_DATA_REQUEST)) { Print("ide: probe found ATA drive\n"); /* drive responded to ATA probe */ for (i = 0; i < 256; i++) { info[i] = In_Word(IDE_DATA_REGISTER); } drives[drive].num_Cylinders = info[IDE_INDENTIFY_NUM_CYLINDERS]; drives[drive].num_Heads = info[IDE_INDENTIFY_NUM_HEADS]; drives[drive].num_SectorsPerTrack = info[IDE_INDENTIFY_NUM_SECTORS_TRACK]; drives[drive].num_BytesPerSector = info[IDE_INDENTIFY_NUM_BYTES_SECTOR]; } else { /* try for ATAPI */ Out_Byte(IDE_FEATURE_REG, 0); /* disable dma & overlap */ Out_Byte(IDE_DRIVE_HEAD_REGISTER, IDE_DRIVE(drive)); Out_Byte(IDE_COMMAND_REGISTER, IDE_COMMAND_ATAPI_IDENT_DRIVE); while (In_Byte(IDE_STATUS_REGISTER) & IDE_STATUS_DRIVE_BUSY); status = In_Byte(IDE_STATUS_REGISTER); Print("status is %x\n", status); if ((status & IDE_STATUS_DRIVE_DATA_REQUEST)) { Print("ide: found atapi drive\n"); } else { Print("ide: found no drive %d\n", drive); } return -1; } Print(" ide%d: cyl=%d, heads=%d, sectors=%d\n", drive, drives[drive].num_Cylinders, drives[drive].num_Heads, drives[drive].num_SectorsPerTrack); /* Register the drive as a block device */ snprintf(devname, sizeof(devname), "ide%d", drive); rc = Register_Block_Device(devname, &s_ideDeviceOps, drive, 0, &s_ideWaitQueue, &s_ideRequestQueue); if (rc != 0) Print(" Error: could not create block device for %s\n", devname); return 0; }