lkml.org 
[lkml]   [1999]   [Dec]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectFix for ide problems in 2.2.14pre15
Okay,

Here is a patch that fixes all of the IDE trouble
I can find/reproduce from 2.2.14pre15 (including the multwrite bugs):

-- completely restores the multwrite and write behaviour
back to what was in 2.2.13 (two very subtle one-liners).

-- fixes the unsigned<=0 comparisms (day-1 bug in IDE).

-- fixes a problem I found today whereby two IDE interfaces
sharing a PCI interrupt get confused when using PIO mode
(was never an issue for DMA transfers, which is why most
users never see this problem).

I don't know if it completely fixes Petri's system or not,
but he should give it a try.

Is anyone out there still having IDE trouble once this patch
is applied to a fresh 2.2.14pre15 ??

Alan -- I'll be away for a bit beginning tomorrow
(I've already delayed the trip 36 hours to work on this problem).

I can read/reply email, but won't have access to the machine
I used to reproduce the multwrite bugs.


--
Mark Lord
Real-Time Remedies Inc.
mlord@pobox.comdiff -u --recursive --new-file --exclude=.* linux-2.2.14pre15x/drivers/block/ide-disk.c linux/drivers/block/ide-disk.c
--- linux-2.2.14pre15x/drivers/block/ide-disk.c Sat Dec 18 16:03:17 1999
+++ linux/drivers/block/ide-disk.c Sun Dec 19 16:06:25 1999
@@ -137,10 +137,20 @@
int i;
unsigned int msect, nsect;
struct request *rq;
-
+#if 0
if (!OK_STAT(stat=GET_STAT(),DATA_READY,BAD_R_STAT)) {
return ide_error(drive, "read_intr", stat);
}
+#else /* new way for dealing with premature shared PCI interrupts */
+ if (!OK_STAT(stat=GET_STAT(),DATA_READY,BAD_R_STAT)) {
+ if (stat & (ERR_STAT|DRQ_STAT)) {
+ return ide_error(drive, "read_intr", stat);
+ }
+ /* no data yet, so wait for another interrupt */
+ ide_set_handler(drive, &read_intr, WAIT_CMD);
+ return ide_started;
+ }
+#endif
msect = drive->mult_count;

read_next:
@@ -161,7 +171,7 @@
rq->buffer += nsect<<9;
rq->errors = 0;
i = (rq->nr_sectors -= nsect);
- if ((rq->current_nr_sectors -= nsect) <= 0)
+ if (((long)(rq->current_nr_sectors -= nsect)) <= 0)
ide_end_request(1, HWGROUP(drive));
if (i > 0) {
if (msect)
@@ -196,7 +206,7 @@
rq->errors = 0;
i = --rq->nr_sectors;
--rq->current_nr_sectors;
- if (rq->current_nr_sectors <= 0)
+ if (((long)rq->current_nr_sectors) <= 0)
ide_end_request(1, hwgroup);
if (i > 0) {
idedisk_output_data (drive, rq->buffer, SECTOR_WORDS);
@@ -205,7 +215,7 @@
}
return ide_stopped;
}
- printk("%s: write_intr error2: nr_sectors=%ld, stat=0x%02x\n", drive->name, rq->nr_sectors, stat);
+ return ide_stopped; /* the original code did this here (?) */
}
return ide_error(drive, "write_intr", stat);
}
@@ -251,7 +261,7 @@
* Completed ?
*/

- if ((rq->nr_sectors -= nsect) <= 0)
+ if (((long)(rq->nr_sectors -= nsect)) <= 0)
{
spin_unlock_irqrestore(&io_request_lock, flags);
break;
@@ -275,7 +285,7 @@
* deep crap
*/
spin_unlock_irqrestore(&io_request_lock, flags);
- printk("%s: buffer list corrupted (%d, %d, %d)\n", drive->name,
+ printk("%s: buffer list corrupted (%ld, %ld, %d)\n", drive->name,
rq->current_nr_sectors, rq->nr_sectors, nsect);
ide_end_request(0, hwgroup);
return 1;
@@ -325,6 +335,7 @@
return ide_stopped;
}
}
+ return ide_stopped; /* the original code did this here (?) */
}
return ide_error(drive, "multwrite_intr", stat);
}
\
 
 \ /
  Last update: 2005-03-22 13:55    [W:0.125 / U:1.756 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site