mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Tejun Heo <htejun@gmail.com>
To: Keith Owens <kaos@ocs.com.au>
Cc: Andrew Morton <akpm@osdl.org>, Linus Torvalds <torvalds@osdl.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Jeff Garzik <jeff@garzik.org>
Subject: Re: Linux v2.6.18-rc5
Date: Sun, 03 Sep 2006 15:10:44 +0900	[thread overview]
Message-ID: <44FA71E4.70408@gmail.com> (raw)
In-Reply-To: <6353.1156778652@ocs10w.ocs.com.au>

[-- Attachment #1: Type: text/plain, Size: 3443 bytes --]

Hello, Keith Owens.

Sorry about late respond.  I'm quite occupied with personal stuff these 
days.

Keith Owens wrote:
>>> (2) I have seen the same intermittent bug on ICH7 SATA but
>>>     PIIX_FLAG_IGNORE_PCS is only set for ich5 and i6300esb_sata.  It
>>>     probably needs to be set for ich7 as well.
>> No, ICH7 up to this point has been believed to have well-behaving PCS. 
>> If you report PCS problem, you'll be the first.  Also, note that ICH7 
>> suffers from ghost device probing problem if PCS is not honored exactly. 
>>  Are you sure it's the same problem?
> 
> It definitely looks like it.  Stock 2.6.18-rc5 plus this patch to
> activate ata_debug from boot until just after probing drives.
[--snip--]
> <3>piix_sata_present_mask: ata1: ENTER, pcs=0x15 base=0
> <3>piix_sata_present_mask: ata1: LEAVE, pcs=0x15 present_mask=0x3
> <3>piix_sata_present_mask: ata1: ENTER, pcs=0x0 base=0
> <3>piix_sata_present_mask: ata1: LEAVE, pcs=0x0 present_mask=0x3
> <3>piix_sata_present_mask: ata1: ENTER, pcs=0x15 base=0
> <3>piix_sata_present_mask: ata1: LEAVE, pcs=0x15 present_mask=0x3
> <3>piix_sata_present_mask: ata1: ENTER, pcs=0x0 base=0
> <3>piix_sata_present_mask: ata1: LEAVE, pcs=0x0 present_mask=0x3
> <3>piix_sata_present_mask: ata1: ENTER, pcs=0x15 base=0

Yeah, it definitely looks like it.  Does the kernel print a message 
which looks like the following before those debug messages?

"updating PCS from 0x0 to 0x5"

> Note the pcs=0x0 values.  Adding PIIX_FLAG_IGNORE_PCS to
> ich6m_sata_ahci gets past the failure to detect pcs, with no sign of
> any ghost devices.  BTW, dropping down to 2.6.17 with the same config
> has no problem detecting the disk, even without PIIX_FLAG_IGNORE_PCS on
> ich6m_sata_ahci.

BTW, you can set PIIX_FLAG_IGNORE_PCS by using force_pcs=1 module 
parameter now.

> lspci extract, this is an ICH7M.
> 
> 00:1f.0 Class 0601: 8086:27b9 (rev 02)
> 	Subsystem: 1033:832c
> 	Flags: bus master, medium devsel, latency 0
> 	Capabilities: [e0] Vendor Specific Information
> 
> 00:1f.2 Class 0101: 8086:27c4 (rev 02) (prog-if 80)
> 	Subsystem: 1033:832c
> 	Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 18
> 	I/O ports at <unassigned>
> 	I/O ports at <unassigned>
> 	I/O ports at <unassigned>
> 	I/O ports at <unassigned>
> 	I/O ports at 18b0 [size=16]
> 	Capabilities: [70] Power Management version 2
> 
> 00:1f.3 Class 0c05: 8086:27da (rev 02)
> 	Subsystem: 1033:832c
> 	Flags: medium devsel, IRQ 11
> 	I/O ports at 18c0 [size=32]
> 

Hmm... Can you try the attached patch and see what happens?  ATM, I'm on 
the road and can't test the patch, so it's only compile-tested.  This 
patch basically reverts some of the effects of the following commit and 
makes PCS update a little bit more aggressive iff necessary.

ea35d29e2fa8b3d766a2ce8fbcce599dce8d2734
[libata] ata_piix: Consolidate PCS register writing

If this works for you ich7m, can you please test this on your formerly 
problematic ich5 with force_pcs=2 specified?  I initially thought that 
the ich5 problem was caused by exact PCS map change and thus added 
IGNORE_PCS as workaround but if the same problem occurs on ich7 and is 
fixed by the attached patch, it's due to conservative PCS update change 
and thus the original IGNORE_PCS fix on ich5 might not be necessary.

Sorry this PCS business causes you and other people so much trouble.  It 
just doesn't work quite as ata_piix developers expect.

Thanks.

-- 
tejun

[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 3417 bytes --]

diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c
index 2d20caf..46f7c9b 100644
--- a/drivers/scsi/ata_piix.c
+++ b/drivers/scsi/ata_piix.c
@@ -553,15 +553,42 @@ static unsigned int piix_sata_present_ma
 {
 	struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
 	struct piix_host_priv *hpriv = ap->host_set->private_data;
+	const struct piix_map_db *map_db = hpriv->map_db;
 	const unsigned int *map = hpriv->map;
 	int base = 2 * ap->hard_port_no;
 	unsigned int present_mask = 0;
 	int port, i;
-	u16 pcs;
+	u16 pcs, new_pcs;
 
 	pci_read_config_word(pdev, ICH5_PCS, &pcs);
 	DPRINTK("ata%u: ENTER, pcs=0x%x base=%d\n", ap->id, pcs, base);
 
+	new_pcs = pcs | map_db->port_enable;
+
+	if (pcs != new_pcs) {
+		u16 old_pcs = pcs;
+
+		for (i = 0; i < 10; i++) {
+			pci_write_config_word(pdev, ICH5_PCS, new_pcs);
+			msleep(150);
+			pci_read_config_word(pdev, ICH5_PCS, &pcs);
+
+			new_pcs = pcs | map_db->port_enable;
+			if (pcs == new_pcs)
+				break;
+		}
+
+		if (pcs == new_pcs)
+			ata_port_printk(ap, KERN_INFO, "updated PCS from "
+					"0x%x to 0x%x (%d tries)\n",
+					old_pcs, pcs, i);
+		else
+			ata_port_printk(ap, KERN_WARNING,
+					"failed to update PCS after %d tries, "
+					"old=0x%x cur=0x%x new=0x%x\n",
+					i, old_pcs, pcs, new_pcs);
+	}
+
 	for (i = 0; i < 2; i++) {
 		port = map[base + i];
 		if (port < 0)
@@ -816,35 +843,6 @@ static int __devinit piix_check_450nx_er
 	return no_piix_dma;
 }
 
-static void __devinit piix_init_pcs(struct pci_dev *pdev,
-				    struct ata_port_info *pinfo,
-				    const struct piix_map_db *map_db)
-{
-	u16 pcs, new_pcs;
-
-	pci_read_config_word(pdev, ICH5_PCS, &pcs);
-
-	new_pcs = pcs | map_db->port_enable;
-
-	if (new_pcs != pcs) {
-		DPRINTK("updating PCS from 0x%x to 0x%x\n", pcs, new_pcs);
-		pci_write_config_word(pdev, ICH5_PCS, new_pcs);
-		msleep(150);
-	}
-
-	if (force_pcs == 1) {
-		dev_printk(KERN_INFO, &pdev->dev,
-			   "force ignoring PCS (0x%x)\n", new_pcs);
-		pinfo[0].host_flags |= PIIX_FLAG_IGNORE_PCS;
-		pinfo[1].host_flags |= PIIX_FLAG_IGNORE_PCS;
-	} else if (force_pcs == 2) {
-		dev_printk(KERN_INFO, &pdev->dev,
-			   "force honoring PCS (0x%x)\n", new_pcs);
-		pinfo[0].host_flags &= ~PIIX_FLAG_IGNORE_PCS;
-		pinfo[1].host_flags &= ~PIIX_FLAG_IGNORE_PCS;
-	}
-}
-
 static void __devinit piix_init_sata_map(struct pci_dev *pdev,
 					 struct ata_port_info *pinfo,
 					 const struct piix_map_db *map_db)
@@ -893,6 +891,17 @@ static void __devinit piix_init_sata_map
 
 	hpriv->map = map;
 	hpriv->map_db = map_db;
+
+	/* handle force_pcs module parameter */
+	if (force_pcs == 1) {
+		dev_printk(KERN_INFO, &pdev->dev, "force ignoring PCS\n");
+		pinfo[0].host_flags |= PIIX_FLAG_IGNORE_PCS;
+		pinfo[1].host_flags |= PIIX_FLAG_IGNORE_PCS;
+	} else if (force_pcs == 2) {
+		dev_printk(KERN_INFO, &pdev->dev, "force honoring PCS\n");
+		pinfo[0].host_flags &= ~PIIX_FLAG_IGNORE_PCS;
+		pinfo[1].host_flags &= ~PIIX_FLAG_IGNORE_PCS;
+	}
 }
 
 /**
@@ -948,12 +957,9 @@ static int piix_init_one (struct pci_dev
 	}
 
 	/* Initialize SATA map */
-	if (host_flags & ATA_FLAG_SATA) {
+	if (host_flags & ATA_FLAG_SATA)
 		piix_init_sata_map(pdev, port_info,
 				   piix_map_db_table[ent->driver_data]);
-		piix_init_pcs(pdev, port_info,
-			      piix_map_db_table[ent->driver_data]);
-	}
 
 	/* On ICH5, some BIOSen disable the interrupt using the
 	 * PCI_COMMAND_INTX_DISABLE bit added in PCI 2.3.

  reply	other threads:[~2006-09-03 18:44 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-08-28  4:30 Linus Torvalds
2006-08-28  5:17 ` Marc Perkel
2006-08-28  5:52   ` Linus Torvalds
2006-08-28  6:13     ` Andi Kleen
2006-08-28  7:24       ` Prakash Punnoor
2006-08-28 12:05         ` Andi Kleen
2006-08-28 12:15           ` Prakash Punnoor
2006-08-28 16:02             ` Andi Kleen
2006-08-28  6:14 ` Andrew Morton
2006-08-28  6:19   ` Olaf Hering
2006-08-28  6:24     ` Andrew Morton
2006-08-28 14:41       ` Shailabh Nagar
2006-08-28 22:01         ` Shailabh Nagar
2006-08-28  6:29   ` Jeff Garzik
2006-08-28  7:25   ` Andi Kleen
2006-08-28  8:08     ` Thomas Gleixner
2006-08-28 17:20       ` Andrew Morton
2006-08-28 17:45         ` Thomas Gleixner
2006-08-28  8:05   ` Catalin Marinas
2006-08-28  8:25   ` Catalin Marinas
2006-08-28  8:34   ` Keith Owens
2006-08-28  8:42     ` Tejun Heo
2006-08-28 15:24       ` Keith Owens
2006-09-03  6:10         ` Tejun Heo [this message]
2006-09-06  6:42           ` Keith Owens
2006-09-13 14:41             ` Tejun Heo
2006-09-15  7:40           ` Keith Owens
2006-08-28  8:53   ` Beschorner Daniel
2006-08-28 15:26   ` Dmitry Torokhov
2006-08-29  2:01   ` Greg KH
2006-08-29  2:01   ` Greg KH
2006-08-29 14:50   ` Andreas Barth
2006-08-29 15:57   ` Brice Goglin
2006-08-30 15:54   ` Andrew Benton
2006-08-30 16:15     ` Takashi Iwai
2006-08-31  8:22       ` Takashi Iwai
2006-08-31  5:14   ` Len Brown
2006-09-02  1:40   ` Elias Holman
2006-09-02  1:50     ` Jeff Garzik
2006-08-28 10:10 ` Jesper Juhl
2006-08-28 10:27   ` Kasper Sandberg
2006-08-28 10:35     ` Jesper Juhl
2006-08-28 22:36       ` Nathan Scott
2006-08-28 23:30         ` Jesper Juhl
2006-08-30  8:14           ` Kasper Sandberg
2006-08-30  9:19             ` Jesper Juhl
2006-08-30 13:43               ` Jesper Juhl
2006-09-06 12:21             ` Paul Slootman
2006-08-28 13:04 ` Roger Luethi
2006-08-29 11:55 ` Olaf Hering
2006-08-29 13:06   ` Nathan Lynch
2006-08-29 15:52     ` Olaf Hering
2006-08-30  6:13       ` Paul Mackerras
2006-08-30  8:05         ` Olaf Hering
2006-08-30  9:00         ` Mikael Pettersson
2006-08-28  9:50 Chuck Ebbert
2006-08-28 18:40 ` Andrew Morton
2006-08-28 18:43   ` Arjan van de Ven
2006-08-29  5:36 Chuck Ebbert

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=44FA71E4.70408@gmail.com \
    --to=htejun@gmail.com \
    --cc=akpm@osdl.org \
    --cc=jeff@garzik.org \
    --cc=kaos@ocs.com.au \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@osdl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome