/* * This routine is invoked from ide.c to prepare for access to a given drive. */ static void ht6560b_selectproc (ide_drive_t *drive) { unsigned long flags; static byte current_select = 0; static byte current_timing = 0; byte select, timing; __save_flags (flags); /* local CPU only */ __cli(); /* local CPU only */ select = HT_CONFIG(drive); timing = HT_TIMING(drive); if (select != current_select || timing != current_timing) { current_select = select; current_timing = timing; if (drive->media != ide_disk || !drive->present) select |= HT_PREFETCH_MODE; (void) inb(HT_CONFIG_PORT); (void) inb(HT_CONFIG_PORT); (void) inb(HT_CONFIG_PORT); (void) inb(HT_CONFIG_PORT); outb(select, HT_CONFIG_PORT); /* * Set timing for this drive: */ outb(timing, IDE_SELECT_REG); (void) inb(IDE_STATUS_REG); #ifdef DEBUG printk("ht6560b: %s: select=%#x timing=%#x\n", drive->name, select, timing); #endif } __restore_flags (flags); /* local CPU only */ }
/* * This routine is invoked from ide.c to prepare for access to a given drive. */ static void ht6560b_selectproc (ide_drive_t *drive) { unsigned long flags; static u8 current_select = 0; static u8 current_timing = 0; u8 select, timing; local_irq_save(flags); select = HT_CONFIG(drive); timing = HT_TIMING(drive); if (select != current_select || timing != current_timing) { current_select = select; current_timing = timing; if (drive->media != ide_disk || !drive->present) select |= HT_PREFETCH_MODE; (void) HWIF(drive)->INB(HT_CONFIG_PORT); (void) HWIF(drive)->INB(HT_CONFIG_PORT); (void) HWIF(drive)->INB(HT_CONFIG_PORT); (void) HWIF(drive)->INB(HT_CONFIG_PORT); HWIF(drive)->OUTB(select, HT_CONFIG_PORT); /* * Set timing for this drive: */ HWIF(drive)->OUTB(timing, IDE_SELECT_REG); (void) HWIF(drive)->INB(IDE_STATUS_REG); #ifdef DEBUG printk("ht6560b: %s: select=%#x timing=%#x\n", drive->name, select, timing); #endif } local_irq_restore(flags); }
/* * This routine is invoked from ide.c to prepare for access to a given drive. */ static void ht6560b_dev_select(ide_drive_t *drive) { ide_hwif_t *hwif = drive->hwif; unsigned long flags; static u8 current_select = 0; static u8 current_timing = 0; u8 select, timing; local_irq_save(flags); select = HT_CONFIG(drive); timing = HT_TIMING(drive); /* * Need to enforce prefetch sometimes because otherwise * it'll hang (hard). */ if (drive->media != ide_disk || (drive->dev_flags & IDE_DFLAG_PRESENT) == 0) select |= HT_PREFETCH_MODE; if (select != current_select || timing != current_timing) { current_select = select; current_timing = timing; (void)inb(HT_CONFIG_PORT); (void)inb(HT_CONFIG_PORT); (void)inb(HT_CONFIG_PORT); (void)inb(HT_CONFIG_PORT); outb(select, HT_CONFIG_PORT); /* * Set timing for this drive: */ outb(timing, hwif->io_ports.device_addr); (void)inb(hwif->io_ports.status_addr); #ifdef DEBUG printk("ht6560b: %s: select=%#x timing=%#x\n", drive->name, select, timing); #endif } local_irq_restore(flags); outb(drive->select | ATA_DEVICE_OBS, hwif->io_ports.device_addr); }