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

Bug#302988: IBM Thinkpad T43 hardware detection incomplete



On Wed, Apr 06, 2005 at 11:40:57AM +0200, Gaudenz Steinlin wrote:
> On Wed, Apr 06, 2005 at 07:16:09AM +0200, Christian Perrier wrote:
> > > Actually, I think that it is ata_piix.  I am attaching my working
> > > 2.6.11.5 kernel config and the output of lsmod.  I am not using an
> > > initrd image.  However, if I modprobe ata_piix and sd_mod, the
> > > installer still does not find the hard drive.  I don't find any
> > > entries in /dev/scsi either.  It does not help to modprobe all of the
> > > other sata_* modules either.
> > 
> > 
> > So, loading ata_piix should be the Right Way for discover when finding
> > your SATA chipset but what you say it that this is not enough with the
> > D-I kernel, right??
> > 
> > So, this problem is dual:
> > 
> > -discover needs to load the correct module?: easy to fix in pci.lst
> I've added the missing information to pci.lst. 
> > 
> > -the kernel module must properly handle your hardware?: not easy to
> >  fix if this fails with the current 2.6.8-2 kernel we have in D-I
> > 
> > For everyone reading this?: is this the correct conclusion?
> 
> I think this conculsion is correct. Horm: Is there any need to reassign
> this bug to the kernel (if yes which package?)?
> 
> The only problem reported in this bug not yet solved is the second
> network card:
> 0000:04:02.0 0280: 8086:4224 (rev 05)
> 0000:04:02.0 Network controller: Intel Corp.: Unknown device 4224 (rev 05)

If you want to reassign this bug to the kernel, I'd assign it
to kernel-source-2.6.8. Actually, I think there is already
a bug there relating to this, and I would be interested in someone
testing the attached patches (applogies if you have seen these before,
a problem a lot like this is being discussed in a couple of places) 
though I don't think they have much chance of making it into Sarge.

-- 
Horms
# origin: bzolnier (BitKeeper)
# cset: 1.1938.134.1 (2.6) key=416b214bV7CwIRgRqoomLi6qTfcGmw
# URL: http://linux.bkbits.net:8080/linux-2.6/cset@416b214bV7CwIRgRqoomLi6qTfcGmw
# inclusion: upstream
# descrition: [PATCH] libata: PCI IDE legacy mode fix
# revision date: Wed, 06 Apr 2005 17:25:20 +0900
#
# S rset: ChangeSet|1.1938.132.2..1.1938.134.1
# I rset: drivers/scsi/libata-core.c|1.100..1.101
# I rset: include/linux/libata.h|1.55..1.56
# I rset: drivers/scsi/ata_piix.c|1.31..1.32
#
# Key:
# S: Skipped  ChangeSet file only
# O: Original Followed by Updated
# U: Updated  Included with updated range of versions
# I: Included Included verbatim
# E: Excluded Excluded on request from user
# D: Deleted  Manually deleted by subsequent user edit
# R: Revised  Manually revised by subsequent user edit
#
#
# 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
# 
#
===== drivers/scsi/libata-core.c 1.100 vs 1.101 =====
--- 1.100/drivers/scsi/libata-core.c	2004-09-16 15:45:15 +09:00
+++ 1.101/drivers/scsi/libata-core.c	2004-10-12 04:52:22 +09:00
@@ -3032,6 +3032,8 @@ static void ata_host_init(struct ata_por
 	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;
@@ -3338,8 +3340,14 @@ ata_pci_init_legacy_mode(struct pci_dev 
 	probe_ent[0].n_ports = 1;
 	probe_ent[0].irq = 14;
 
+	probe_ent[0].hard_port_no = 0;
+	probe_ent[0].legacy_mode = 1;
+
 	probe_ent[1].n_ports = 1;
 	probe_ent[1].irq = 15;
+
+	probe_ent[1].hard_port_no = 1;
+	probe_ent[1].legacy_mode = 1;
 
 	probe_ent[0].port[0].cmd_addr = 0x1f0;
 	probe_ent[0].port[0].altstatus_addr =
===== include/linux/libata.h 1.55 vs 1.56 =====
--- 1.55/include/linux/libata.h	2004-09-16 15:45:15 +09:00
+++ 1.56/include/linux/libata.h	2004-10-12 04:52:22 +09:00
@@ -189,6 +189,7 @@ struct ata_probe_ent {
 	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 @@ struct ata_port {
 	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 */
===== drivers/scsi/ata_piix.c 1.31 vs 1.32 =====
--- 1.31/drivers/scsi/ata_piix.c	2004-09-16 15:45:15 +09:00
+++ 1.32/drivers/scsi/ata_piix.c	2004-10-12 04:52:22 +09:00
@@ -268,7 +268,7 @@ static void piix_pata_cbl_detect(struct 
 		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 @@ cbl40:
 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 @@ static int piix_sata_probe (struct ata_p
 	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 @@ static int piix_sata_probe (struct ata_p
 		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;
 	}
 
@@ -394,7 +394,7 @@ static void piix_set_piomode (struct ata
 	unsigned int pio	= adev->pio_mode - XFER_PIO_0;
 	struct pci_dev *dev	= ap->host_set->pdev;
 	unsigned int is_slave	= (adev->devno != 0);
-	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 @@ static void piix_set_piomode (struct ata
 		/* 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 @@ static void piix_set_dmamode (struct ata
 {
 	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;
# origin: jason.d.gaston (BitKeeper)
# cset: 1.1966.19.1 (2.6) key=41ddef86je30CbKgp5uBV9FbFEHpYQ
# URL: http://linux.bkbits.net:8080/linux-2.6/cset@41ddef86je30CbKgp5uBV9FbFEHpYQ
# inclusion: upstream
# descrition: [PATCH] SATA support for Intel ICH7
# revision date: Wed, 06 Apr 2005 17:24:52 +0900
#
# S rset: ChangeSet|1.1966.10.3..1.1966.19.1
# I rset: drivers/pci/quirks.c|1.64..1.65
# I rset: drivers/scsi/ahci.c|1.9..1.10
# I rset: drivers/scsi/ata_piix.c|1.35..1.36
#
# Key:
# S: Skipped  ChangeSet file only
# O: Original Followed by Updated
# U: Updated  Included with updated range of versions
# I: Included Included verbatim
# E: Excluded Excluded on request from user
# D: Deleted  Manually deleted by subsequent user edit
# R: Revised  Manually revised by subsequent user edit
#
#
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2005/01/06 21:10:14-05:00 jason.d.gaston@intel.com 
#   [PATCH] SATA support for Intel ICH7
#   
#   Reposting patch with word wrap turned off.  Please let me know if
#   this is still not formated correctly.
#   
#   This patch adds the Intel ICH7 DID's to the ata_piix.c SATA driver,
#   ahci.c SATA AHCI driver and quirks.c for ICH7 SATA support.
#   
#   Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
# 
# drivers/scsi/ata_piix.c
#   2004/12/28 10:07:38-05:00 jason.d.gaston@intel.com +15 -0
#   SATA support for Intel ICH7 - 2.6.10 - repost
# 
# drivers/scsi/ahci.c
#   2004/12/28 10:07:38-05:00 jason.d.gaston@intel.com +6 -2
#   SATA support for Intel ICH7 - 2.6.10 - repost
# 
# drivers/pci/quirks.c
#   2004/12/30 07:24:21-05:00 jason.d.gaston@intel.com +5 -1
#   SATA support for Intel ICH7 - 2.6.10 - repost
# 
#
===== drivers/pci/quirks.c 1.64 vs 1.65 =====
--- 1.64/drivers/pci/quirks.c	2004-12-24 13:38:24 +09:00
+++ 1.65/drivers/pci/quirks.c	2004-12-30 21:24:21 +09:00
@@ -1144,6 +1144,10 @@ static void __devinit quirk_intel_ide_co
 	case 0x2653:
 		ich = 6;
 		break;
+	case 0x27c0:
+	case 0x27c4:
+		ich = 7;
+		break;
 	default:
 		/* we do not handle this PCI device */
 		return;
@@ -1163,7 +1167,7 @@ static void __devinit quirk_intel_ide_co
 		else
 			return;			/* not in combined mode */
 	} else {
-		WARN_ON(ich != 6);
+		WARN_ON((ich != 6) && (ich != 7));
 		tmp &= 0x3;  /* interesting bits 1:0 */
 		if (tmp & (1 << 0))
 			comb = (1 << 2);	/* PATA port 0, SATA port 1 */
===== drivers/scsi/ahci.c 1.9 vs 1.10 =====
--- 1.9/drivers/scsi/ahci.c	2004-12-08 08:54:23 +09:00
+++ 1.10/drivers/scsi/ahci.c	2004-12-29 00:07:38 +09:00
@@ -239,9 +239,13 @@ static struct ata_port_info ahci_port_in
 
 static struct pci_device_id ahci_pci_tbl[] = {
 	{ PCI_VENDOR_ID_INTEL, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-	  board_ahci },
+	  board_ahci }, /* ICH6 */
 	{ PCI_VENDOR_ID_INTEL, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-	  board_ahci },
+	  board_ahci }, /* ICH6M */
+	{ PCI_VENDOR_ID_INTEL, 0x27c1, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_ahci }, /* ICH7 */
+	{ PCI_VENDOR_ID_INTEL, 0x27c5, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_ahci }, /* ICH7M */
 	{ }	/* terminate list */
 };
 
===== drivers/scsi/ata_piix.c 1.35 vs 1.36 =====
--- 1.35/drivers/scsi/ata_piix.c	2004-11-14 04:24:05 +09:00
+++ 1.36/drivers/scsi/ata_piix.c	2004-12-29 00:07:38 +09:00
@@ -60,6 +60,7 @@ enum {
 	piix4_pata		= 2,
 	ich6_sata		= 3,
 	ich6_sata_rm		= 4,
+	ich7_sata		= 5,
 };
 
 static int piix_init_one (struct pci_dev *pdev,
@@ -90,6 +91,8 @@ static struct pci_device_id piix_pci_tbl
 	{ 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
 	{ 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_rm },
 	{ 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_rm },
+	{ 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7_sata },
+	{ 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7_sata },
 
 	{ }	/* terminate list */
 };
@@ -226,6 +229,18 @@ static struct ata_port_info piix_port_in
 	},
 
 	/* ich6_sata_rm */
+	{
+		.sht		= &piix_sht,
+		.host_flags	= ATA_FLAG_SATA | ATA_FLAG_SRST |
+				  PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR |
+				  ATA_FLAG_SLAVE_POSS | PIIX_FLAG_AHCI,
+		.pio_mask	= 0x1f,	/* pio0-4 */
+		.mwdma_mask	= 0x07, /* mwdma0-2 */
+		.udma_mask	= 0x7f,	/* udma0-6 */
+		.port_ops	= &piix_sata_ops,
+	},
+
+	/* ich7_sata */
 	{
 		.sht		= &piix_sht,
 		.host_flags	= ATA_FLAG_SATA | ATA_FLAG_SRST |

Reply to: