[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: gnumach patch (ide unexpected interrupt, hang, then irq timeout)
From: |
Samuel Thibault |
Subject: |
Re: gnumach patch (ide unexpected interrupt, hang, then irq timeout) |
Date: |
Sat, 30 Jul 2005 13:25:47 +0200 |
User-agent: |
Mutt/1.5.9i-nntp |
Hi,
Thomas Schwinge agreed on the patches, here they are again, with
changelog entries.
Regards,
Samuel
2005-07-30 Samuel Thibault <samuel.thibault@ens-lyon.org>
* irq.c (linux_intr): Disable interrupts when the driver
requested it through request_irq().
--- gnumach/linux/dev/arch/i386/kernel/irq.c 1999-04-26 07:40:55.000000000
+0200
+++ gnumach/linux/dev/arch/i386/kernel/irq.c 2005-07-19 04:37:17.000000000
+0200
@@ -103,16 +103,23 @@ linux_intr (int irq)
{
struct pt_regs regs;
struct linux_action *action = *(irq_action + irq);
+ unsigned long flags;
kstat.interrupts[irq]++;
intr_count++;
+ save_flags (flags);
+ if (action && (action->flags & SA_INTERRUPT))
+ cli ();
+
while (action)
{
action->handler (irq, action->dev_id, ®s);
action = action->next;
}
+ restore_flags (flags);
+
intr_count--;
/* Not used. by OKUJI Yoshinori. */
2005-07-30 Samuel Thibault <samuel.thibault@ens-lyon.org>
* ide.c (read_intr): Set irq handler before issuing order, in
case the device is really fast (QEMU for instance).
(write_intr): Likewise.
(multwrite_intr): Likewise.
--- gnumach/linux/dev/drivers/block/ide.c 2001-06-28 10:55:02.000000000
+0200
+++ gnumach/linux/dev/drivers/block/ide.c 2005-07-19 03:53:36.000000000
+0200
@@ -1129,6 +1129,9 @@ read_intr (ide_drive_t *drive)
msect -= nsect;
} else
nsect = 1;
+ i = rq->nr_sectors - nsect;
+ if (i > 0 && !msect)
+ ide_set_handler (drive, &read_intr, WAIT_CMD);
ide_input_data(drive, rq->buffer, nsect * SECTOR_WORDS);
#ifdef DEBUG
printk("%s: read: sectors(%ld-%ld), buffer=0x%08lx, remaining=%ld\n",
@@ -1138,14 +1141,11 @@ read_intr (ide_drive_t *drive)
rq->sector += nsect;
rq->buffer += nsect<<9;
rq->errors = 0;
- i = (rq->nr_sectors -= nsect);
+ rq->nr_sectors = i;
if ((rq->current_nr_sectors -= nsect) <= 0)
ide_end_request(1, HWGROUP(drive));
- if (i > 0) {
- if (msect)
- goto read_next;
- ide_set_handler (drive, &read_intr, WAIT_CMD);
- }
+ if (i > 0 && msect)
+ goto read_next;
}
/*
@@ -1173,8 +1173,8 @@ write_intr (ide_drive_t *drive)
if (rq->current_nr_sectors <= 0)
ide_end_request(1, hwgroup);
if (i > 0) {
+ ide_set_handler (drive, &write_intr, WAIT_CMD);
ide_output_data (drive, rq->buffer,
SECTOR_WORDS);
- ide_set_handler (drive, &write_intr, WAIT_CMD);
}
return;
}
@@ -1231,8 +1231,8 @@ multwrite_intr (ide_drive_t *drive)
if (OK_STAT(stat=GET_STAT(),DRIVE_READY,drive->bad_wstat)) {
if (stat & DRQ_STAT) {
if (rq->nr_sectors) {
+ ide_set_handler (drive, &multwrite_intr,
WAIT_CMD);
ide_multwrite(drive, drive->mult_count);
- ide_set_handler (drive, &multwrite_intr,
WAIT_CMD);
return;
}
} else {