summaryrefslogtreecommitdiff
path: root/debian/patches/20_ide_disable_irqs.patch
blob: de1b3961f3ae80c7af26ed21a0568994e9cf9be3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#DPATCHLEVEL=1

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, &regs);
       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 {