コード例 #1
0
ファイル: ali14xx.c プロジェクト: sarnobat/knoppix
/*
 * Set PIO mode for the specified drive.
 * This function computes timing parameters
 * and sets controller registers accordingly.
 */
static void ali14xx_tune_drive (ide_drive_t *drive, u8 pio)
{
	int driveNum;
	int time1, time2;
	u8 param1, param2, param3, param4;
	unsigned long flags;
	ide_pio_data_t d;
	int bus_speed = system_bus_clock();

	pio = ide_get_best_pio_mode(drive, pio, ALI_MAX_PIO, &d);

	/* calculate timing, according to PIO mode */
	time1 = d.cycle_time;
	time2 = ide_pio_timings[pio].active_time;
	param3 = param1 = (time2 * bus_speed + 999) / 1000;
	param4 = param2 = (time1 * bus_speed + 999) / 1000 - param1;
	if (pio < 3) {
		param3 += 8;
		param4 += 8;
	}
	printk(KERN_DEBUG "%s: PIO mode%d, t1=%dns, t2=%dns, cycles = %d+%d, %d+%d\n",
		drive->name, pio, time1, time2, param1, param2, param3, param4);

	/* stuff timing parameters into controller registers */
	driveNum = (HWIF(drive)->index << 1) + drive->select.b.unit;
	spin_lock_irqsave(&ide_lock, flags);
	outb_p(regOn, basePort);
	outReg(param1, regTab[driveNum].reg1);
	outReg(param2, regTab[driveNum].reg2);
	outReg(param3, regTab[driveNum].reg3);
	outReg(param4, regTab[driveNum].reg4);
	outb_p(regOff, basePort);
	spin_unlock_irqrestore(&ide_lock, flags);
}
コード例 #2
0
ファイル: ali14xx.c プロジェクト: ChineseDr/linux
/*
 * Set PIO mode for the specified drive.
 * This function computes timing parameters
 * and sets controller registers accordingly.
 */
static void ali14xx_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive)
{
    int driveNum;
    int time1, time2;
    u8 param1, param2, param3, param4;
    unsigned long flags;
    int bus_speed = ide_vlb_clk ? ide_vlb_clk : 50;
    const u8 pio = drive->pio_mode - XFER_PIO_0;
    struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio);

    /* calculate timing, according to PIO mode */
    time1 = ide_pio_cycle_time(drive, pio);
    time2 = t->active;
    param3 = param1 = (time2 * bus_speed + 999) / 1000;
    param4 = param2 = (time1 * bus_speed + 999) / 1000 - param1;
    if (pio < 3) {
        param3 += 8;
        param4 += 8;
    }
    printk(KERN_DEBUG "%s: PIO mode%d, t1=%dns, t2=%dns, cycles = %d+%d, %d+%d\n",
           drive->name, pio, time1, time2, param1, param2, param3, param4);

    /* stuff timing parameters into controller registers */
    driveNum = (drive->hwif->index << 1) + (drive->dn & 1);
    spin_lock_irqsave(&ali14xx_lock, flags);
    outb_p(regOn, basePort);
    outReg(param1, regTab[driveNum].reg1);
    outReg(param2, regTab[driveNum].reg2);
    outReg(param3, regTab[driveNum].reg3);
    outReg(param4, regTab[driveNum].reg4);
    outb_p(regOff, basePort);
    spin_unlock_irqrestore(&ali14xx_lock, flags);
}
コード例 #3
0
ファイル: ali14xx.c プロジェクト: liexusong/linux2.0-comment
/*
 * Set PIO mode for the specified drive.
 * This function computes timing parameters
 * and sets controller registers accordingly.
 */
static void ali14xx_tune_drive (ide_drive_t *drive, byte pio)
{
	int driveNum;
	int time1, time2, time1a;
	byte param1, param2, param3, param4;
	struct hd_driveid *id = drive->id;
	unsigned long flags;

	if (pio == 255)
		pio = ide_get_best_pio_mode(drive);
	if (pio > 3)
		pio = 3;

	/* calculate timing, according to PIO mode */
	time1 = timeTab[pio].time1;
	time2 = timeTab[pio].time2;
	if (pio == 3) {
		time1a = (id->capability & 0x08) ? id->eide_pio_iordy : id->eide_pio;
		if (time1a != 0 && time1a < time1)
			time1 = time1a;
	}
	param3 = param1 = (time2 * ALI_14xx_BUS_SPEED + 999) / 1000;
	param4 = param2 = (time1 * ALI_14xx_BUS_SPEED + 999) / 1000 - param1;
	if (pio != 3) {
		param3 += 8;
		param4 += 8;
	}
	printk("%s: PIO mode%d, t1=%dns, t2=%dns, cycles = %d+%d, %d+%d\n",
		drive->name, pio, time1, time2, param1, param2, param3, param4);

	/* stuff timing parameters into controller registers */
	driveNum = (HWIF(drive)->index << 1) + drive->select.b.unit;
	save_flags(flags);
	cli();
	outb_p(regOn, basePort);
	outReg(param1, regTab[driveNum].reg1);
	outReg(param2, regTab[driveNum].reg2);
	outReg(param3, regTab[driveNum].reg3);
	outReg(param4, regTab[driveNum].reg4);
	outb_p(regOff, basePort);
	restore_flags(flags);
}
コード例 #4
0
ファイル: ali14xx.c プロジェクト: sarnobat/knoppix
/*
 * Initialize controller registers with default values.
 */
static int __init initRegisters (void) {
	RegInitializer *p;
	u8 t;
	unsigned long flags;

	local_irq_save(flags);
	outb_p(regOn, basePort);
	for (p = initData; p->reg != 0; ++p)
		outReg(p->data, p->reg);
	outb_p(0x01, regPort);
	t = inb(regPort) & 0x01;
	outb_p(regOff, basePort);
	local_irq_restore(flags);
	return t;
}
コード例 #5
0
ファイル: ali14xx.c プロジェクト: liexusong/linux2.0-comment
/*
 * Initialize controller registers with default values.
 */
static int initRegisters (void) {
	RegInitializer *p;
	byte t;
	unsigned long flags;

	save_flags(flags);
	cli();
	outb_p(regOn, basePort);
	for (p = initData; p->reg != 0; ++p)
		outReg(p->data, p->reg);
	outb_p(0x01, regPort);
	t = inb(regPort) & 0x01;
	outb_p(regOff, basePort);
	restore_flags(flags);
	return t;
}