Skip to contentSkip to conversation

Patch for IDE hang after resetting quirk drive

PATCH Dale Farnsworth 2 participants 2 messages Jul 3, 2001 – Jul 5, 2001

lore
Share & tools
lore
#0 lore raw

I have a Promise PDC20265 ide controller with one of the "quirk" drives, a Quantum Fireballp LM30. That drive has a bad sector and accessing it would result in a DMA timeout. Unfortunately, after the IDE driver resets the controller, the drive never responded.

The following patch appears to correct the problem. It duplicates the workaround for "quirky" drives found in ide-features.c

-Dale

Dale Farnsworth [email protected]

drivers/ide/ide.c +4 -1
@@ -758,7 +758,10 @@
 	 */
 	OUT_BYTE(drive->ctl|6,IDE_CONTROL_REG);	/* set SRST and nIEN */
 	udelay(10);			/* more than enough time */
-	OUT_BYTE(drive->ctl|2,IDE_CONTROL_REG);	/* clear SRST, leave nIEN */
+	if (drive->quirk_list == 2)
+		OUT_BYTE(drive->ctl, IDE_CONTROL_REG); /* clear SRST and nIEN */
+	else
+		OUT_BYTE(drive->ctl|2,IDE_CONTROL_REG);	/* clear SRST only */
 	udelay(10);			/* more than enough time */
 	hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;
 	ide_set_handler (drive, &reset_pollfunc, HZ/20, NULL);
#1 lore raw

Looks valid will take!

Cheers,

Andre Hedrick
ASL Kernel Development
Linux ATA Development
-----------------------------------------------------------------------------

ASL, Inc.                                     Toll free: 1-877-ASL-3535
1757 Houret Court                             Fax: 1-408-941-2071
Milpitas, CA 95035                            Web: www.aslab.com
Quoted 27 lines · Dale Farnsworth

I have a Promise PDC20265 ide controller with one of the "quirk" drives, a Quantum Fireballp LM30. That drive has a bad sector and accessing it would result in a DMA timeout. Unfortunately, after the IDE driver resets the controller, the drive never responded.

The following patch appears to correct the problem. It duplicates the workaround for "quirky" drives found in ide-features.c

-Dale

Dale Farnsworth [email protected]

drivers/ide/ide.c +4 -1
@@ -758,7 +758,10 @@
 	 */
 	OUT_BYTE(drive->ctl|6,IDE_CONTROL_REG);	/* set SRST and nIEN */
 	udelay(10);			/* more than enough time */
-	OUT_BYTE(drive->ctl|2,IDE_CONTROL_REG);	/* clear SRST, leave nIEN */
+	if (drive->quirk_list == 2)
+		OUT_BYTE(drive->ctl, IDE_CONTROL_REG); /* clear SRST and nIEN */
+	else
+		OUT_BYTE(drive->ctl|2,IDE_CONTROL_REG);	/* clear SRST only */
 	udelay(10);			/* more than enough time */
 	hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;
 	ide_set_handler (drive, &reset_pollfunc, HZ/20, NULL);