[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#279902: Bug#270198: Related problem?



assign 270198 kernel-image-2.6.8-1-686
merge 273171 270198 279902
thanks

On Sun, Oct 31, 2004 at 10:16:45PM -0500, Graham Knap wrote:
> Hi
> 
> I think I may be seeing the same (or at least maybe closely related) 
> problem. My "test box" is currently based on an old i430TX board, with 
> the Intel PIIX4 southbridge -- the same as would be present on the 
> reporter's i440LX/BX boards.
> 
> I have kernel-image-2.6.8-1-386 installed on this system, but I'm using 
> a SCSI drive as boot/root/swap. I cannot seem to get my IDE drives to 
> work after boot. No entries for the IDE controllers appear in 
> /proc/interrupts. Nothing shows up in "dmesg" saying that the PIIX4 or 
> the drives hanging off of it were found.
> 
> But the "piix" module shows up in "lsmod", as do the IDE core, disk, and 
> cd modules.
> 
> I also have kernel-image-2.4.27-1-k6 installed, and it works properly.
> 
> If you need further info to help debug this problem, let me know and 
> I'll do my best to help.

This smells a lot like #273171 and #279902
and implicitly that #278504 seems to be resolved.

There was supposed to be a fix for this in kernel-source-2.6.8-7,
but it seems that it did not work. I have just finished a backport
(minor tweak) of a patch from upstream. It is attached.

-- 
Horms
#! /bin/sh -e 
## <PATCHNAME>.dpatch by <PATCH_AUTHOR@EMAI>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Description: libata: PCI IDE legacy mode fix
## DP: Patch author: Bartlomiej Zolnierkiewicz
## DP: Upstream status: included

. $(dirname $0)/DPATCH

@DPATCH@
# origin: bzolnier (BitKeeper)
# cset: 1.1988.91.1 (2.6) key=416b214bV7CwIRgRqoomLi6qTfcGmw
# inclusion: upstream
# descrition: [PATCH] libata: PCI IDE legacy mode fix
# revision date: Mon, 08 Nov 2004 16:12:47 +0900
#
# rset: ChangeSet|1.1988.89.2..1.1988.91.1
# rset: drivers/scsi/libata-core.c|1.100..1.101
# rset: include/linux/libata.h|1.55..1.56
# rset: drivers/scsi/ata_piix.c|1.31..1.32
#
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/10/11 20:11:55-04:00 bzolnier@elka.pw.edu.pl 
#   [PATCH] libata: PCI IDE legacy mode fix
#   
#   In PCI IDE legacy mode ap->port_no is incorrectly set to zero for
#   the second port.  Fix it by adding ->hard_port_no to struct ata_probe_ent
#   and struct ata_port (per Jeff's suggestion) and teaching ata_piix.c
#   to use it instead of ->port_no.
#   
#   Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
# 
# include/linux/libata.h
#   2004/10/11 15:52:22-04:00 bzolnier@elka.pw.edu.pl +2 -0
#   PCI IDE legacy mode fix
# 
# drivers/scsi/libata-core.c
#   2004/10/11 15:52:22-04:00 bzolnier@elka.pw.edu.pl +8 -0
#   PCI IDE legacy mode fix
# 
# drivers/scsi/ata_piix.c
#   2004/10/11 15:52:22-04:00 bzolnier@elka.pw.edu.pl +10 -10
#   PCI IDE legacy mode fix
# 
diff -Nru a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c
--- a/drivers/scsi/ata_piix.c	2004-11-08 16:12:47 +09:00
+++ b/drivers/scsi/ata_piix.c	2004-11-08 16:12:47 +09:00
@@ -268,7 +268,7 @@
 		goto cbl40;
 
 	/* check BIOS cable detect results */
-	mask = ap->port_no == 0 ? PIIX_80C_PRI : PIIX_80C_SEC;
+	mask = ap->hard_port_no == 0 ? PIIX_80C_PRI : PIIX_80C_SEC;
 	pci_read_config_byte(pdev, PIIX_IOCFG, &tmp);
 	if ((tmp & mask) == 0)
 		goto cbl40;
@@ -294,7 +294,7 @@
 static void piix_pata_phy_reset(struct ata_port *ap)
 {
 	if (!pci_test_config_bits(ap->host_set->pdev,
-				  &piix_enable_bits[ap->port_no])) {
+				  &piix_enable_bits[ap->hard_port_no])) {
 		ata_port_disable(ap);
 		printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
 		return;
@@ -327,8 +327,8 @@
 	int orig_mask, mask, i;
 	u8 pcs;
 
-	mask = (PIIX_PORT_PRESENT << ap->port_no) |
-	       (PIIX_PORT_ENABLED << ap->port_no);
+	mask = (PIIX_PORT_PRESENT << ap->hard_port_no) |
+	       (PIIX_PORT_ENABLED << ap->hard_port_no);
 
 	pci_read_config_byte(pdev, ICH5_PCS, &pcs);
 	orig_mask = (int) pcs & 0xff;
@@ -345,7 +345,7 @@
 		mask = (PIIX_PORT_PRESENT << i) | (PIIX_PORT_ENABLED << i);
 
 		if ((orig_mask & mask) == mask)
-			if (combined || (i == ap->port_no))
+			if (combined || (i == ap->hard_port_no))
 				return 1;
 	}
 
@@ -373,7 +373,7 @@
 {
 	struct pci_dev *dev	= ap->host_set->pdev;
 	unsigned int is_slave	= (adev->flags & ATA_DFLAG_MASTER) ? 0 : 1;
-	unsigned int master_port= ap->port_no ? 0x42 : 0x40;
+	unsigned int master_port= ap->hard_port_no ? 0x42 : 0x40;
 	unsigned int slave_port	= 0x44;
 	u16 master_data;
 	u8 slave_data;
@@ -412,10 +412,10 @@
 		/* enable PPE, IE and TIME */
 		master_data |= 0x0070;
 		pci_read_config_byte(dev, slave_port, &slave_data);
-		slave_data &= (ap->port_no ? 0x0f : 0xf0);
+		slave_data &= (ap->hard_port_no ? 0x0f : 0xf0);
 		slave_data |=
 			(timings[pio][0] << 2) |
-			(timings[pio][1] << (ap->port_no ? 4 : 0));
+			(timings[pio][1] << (ap->hard_port_no ? 4 : 0));
 	} else {
 		master_data &= 0xccf8;
 		/* enable PPE, IE and TIME */
@@ -445,9 +445,9 @@
 {
 	unsigned int udma	= adev->dma_mode; /* FIXME: MWDMA too */
 	struct pci_dev *dev	= ap->host_set->pdev;
-	u8 maslave		= ap->port_no ? 0x42 : 0x40;
+	u8 maslave		= ap->hard_port_no ? 0x42 : 0x40;
 	u8 speed		= udma;
-	unsigned int drive_dn	= (ap->port_no ? 2 : 0) + adev->devno;
+	unsigned int drive_dn	= (ap->hard_port_no ? 2 : 0) + adev->devno;
 	int a_speed		= 3 << (drive_dn * 4);
 	int u_flag		= 1 << drive_dn;
 	int v_flag		= 0x01 << drive_dn;
diff -Nru a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
--- a/drivers/scsi/libata-core.c	2004-11-08 16:12:47 +09:00
+++ b/drivers/scsi/libata-core.c	2004-11-08 16:12:47 +09:00
@@ -3032,6 +3032,8 @@
 	ap->ctl = ATA_DEVCTL_OBS;
 	ap->host_set = host_set;
 	ap->port_no = port_no;
+	ap->hard_port_no =
+		ent->legacy_mode ? ent->hard_port_no : port_no;
 	ap->pio_mask = ent->pio_mask;
 	ap->mwdma_mask = ent->mwdma_mask;
 	ap->udma_mask = ent->udma_mask;
@@ -3163,6 +3163,8 @@
 		probe_ent->port[0].ctl_addr = 0x3f6;
 		probe_ent->n_ports = 1;
 		probe_ent->irq = 14;
+		probe_ent->hard_port_no = 0;
+		probe_ent->legacy_mode = 1;
 		ata_std_ports(&probe_ent->port[0]);
 
 		probe_ent2->port[0].cmd_addr = 0x170;
@@ -3171,6 +3173,8 @@
 		probe_ent2->port[0].bmdma_addr = pci_resource_start(pdev, 4)+8;
 		probe_ent2->n_ports = 1;
 		probe_ent2->irq = 15;
+		probe_ent->hard_port_no = 1;
+		probe_ent->legacy_mode = 1;
 		ata_std_ports(&probe_ent2->port[0]);
 
 		probe_ent2->sht = port1->sht;
diff -Nru a/include/linux/libata.h b/include/linux/libata.h
--- a/include/linux/libata.h	2004-11-08 16:12:47 +09:00
+++ b/include/linux/libata.h	2004-11-08 16:12:47 +09:00
@@ -189,6 +189,7 @@
 	Scsi_Host_Template	*sht;
 	struct ata_ioports	port[ATA_MAX_PORTS];
 	unsigned int		n_ports;
+	unsigned int		hard_port_no;
 	unsigned int		pio_mask;
 	unsigned int		mwdma_mask;
 	unsigned int		udma_mask;
@@ -273,6 +274,7 @@
 	unsigned long		flags;	/* ATA_FLAG_xxx */
 	unsigned int		id;	/* unique id req'd by scsi midlyr */
 	unsigned int		port_no; /* unique port #; from zero */
+	unsigned int		hard_port_no;	/* hardware port #; from zero */
 
 	struct ata_prd		*prd;	 /* our SG list */
 	dma_addr_t		prd_dma; /* and its DMA mapping */

Reply to: