void ide_tf_load(ide_drive_t *drive, ide_task_t *task) { ide_hwif_t *hwif = drive->hwif; struct ide_taskfile *tf = &task->tf; u8 HIHI = (task->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF; if (task->tf_flags & IDE_TFLAG_FLAGGED) HIHI = 0xFF; #ifdef DEBUG printk("%s: tf: feat 0x%02x nsect 0x%02x lbal 0x%02x " "lbam 0x%02x lbah 0x%02x dev 0x%02x cmd 0x%02x\n", drive->name, tf->feature, tf->nsect, tf->lbal, tf->lbam, tf->lbah, tf->device, tf->command); printk("%s: hob: nsect 0x%02x lbal 0x%02x " "lbam 0x%02x lbah 0x%02x\n", drive->name, tf->hob_nsect, tf->hob_lbal, tf->hob_lbam, tf->hob_lbah); #endif ide_set_irq(drive, 1); if ((task->tf_flags & IDE_TFLAG_NO_SELECT_MASK) == 0) SELECT_MASK(drive, 0); if (task->tf_flags & IDE_TFLAG_OUT_DATA) hwif->OUTW((tf->hob_data << 8) | tf->data, IDE_DATA_REG); if (task->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) hwif->OUTB(tf->hob_feature, IDE_FEATURE_REG); if (task->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) hwif->OUTB(tf->hob_nsect, IDE_NSECTOR_REG); if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAL) hwif->OUTB(tf->hob_lbal, IDE_SECTOR_REG); if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAM) hwif->OUTB(tf->hob_lbam, IDE_LCYL_REG); if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAH) hwif->OUTB(tf->hob_lbah, IDE_HCYL_REG); if (task->tf_flags & IDE_TFLAG_OUT_FEATURE) hwif->OUTB(tf->feature, IDE_FEATURE_REG); if (task->tf_flags & IDE_TFLAG_OUT_NSECT) hwif->OUTB(tf->nsect, IDE_NSECTOR_REG); if (task->tf_flags & IDE_TFLAG_OUT_LBAL) hwif->OUTB(tf->lbal, IDE_SECTOR_REG); if (task->tf_flags & IDE_TFLAG_OUT_LBAM) hwif->OUTB(tf->lbam, IDE_LCYL_REG); if (task->tf_flags & IDE_TFLAG_OUT_LBAH) hwif->OUTB(tf->lbah, IDE_HCYL_REG); if (task->tf_flags & IDE_TFLAG_OUT_DEVICE) hwif->OUTB((tf->device & HIHI) | drive->select.all, IDE_SELECT_REG); }
/* * interrupt control function for emxx_ide */ static void emxx_ide_set_irq(ide_hwif_t *hwif, int on) { /*disable all the interrupts*/ writel(0x00000000, EMXX_CFI_CONTROL_1); /*clear all the interrupt*/ writel(0xffffffff, EMXX_CFI_INTERRUPT); if (on) writel(CFI_CONTROL1_RINTE, EMXX_CFI_CONTROL_1); ide_set_irq(hwif, on); }