Exemplo n.º 1
0
/*
 * 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);
    }
}
Exemplo n.º 2
0
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;
}