Thread (16 messages) 16 messages, 4 authors, 2011-02-15

Re: AHCI support Port Multiplier problem.

From: Robert Hancock <hidden>
Date: 2011-01-11 01:54:32

On 01/09/2011 07:46 PM, Luo Dislo wrote:
Hello,

This is my company(Faraday) implemented AHCI SATA controller. Our
controller is not located at PCI bus, but AHB bus(ARM based platform).

However, I modify Linux kernel builtin AHCI driver(ahci.c) to replace
the PCI related code by using platform bus. Just pretty similar way
with drivers/ata/ahci_platform.c (Kernel 2.6.35).

I think the problem happens because libata does not give up, keep on
expecting the Port Multiplier Signature when we set CONFIG_SATA_PMP
to 1.
It shouldn't be expecting only a PMP signature in this case if there is 
no PMP connected. The PMP spec states:

"To determine if a Port Multiplier is present, the host performs the 
following procedure. The host will determine if communication is 
established on the host’s Serial ATA port by checking the host’s SStatus 
register. If a device is present, the host will issue a software reset 
with the PM Port field set to the control port. The host will check the 
signature value returned and if it corresponds to the Port Multiplier 
Signature, the host knows that a Port Multiplier is present. If the 
signature value does not correspond to a Port Multiplier, the host may 
proceed with the normal initialization sequence for that device type."

The code is doing this. However, I suspect the problem is that on some 
controllers, it won't fill in the signature as expected if the PMP field 
on the received D2H Register FIS doesn't match the one listed in the 
command 15, for the PMP control port), which it won't if there's no PMP 
connected. I'm not sure if this is the intent of the AHCI spec or not, 
but in any case it appears that a number of controllers have this issue. 
I suspect that retrying with PMP=0 if the softreset with PMP=15 failed 
to acquire a signature is likely the thing to do.

quoted hunk ↗ jump to hunk
I know how to fix this problem, just add AHCI_HFLAG_NO_PMP to AHCI_HFLAGS when I connect hard drive to the controller. Meanwhile, when I want to connect the Port Muliplier to my controller, I need to remove AHCI_HFLAG_NO_PMP from AHCI_HFLAGS.

I don't think this is a good solution because I have to compile two version of my code. It does not make sense. We set CONFIG_SATA_PMP to 1 and inside the driver code DOES NOT have AHCI_HFLAG_NO_PMP just means that controller support Port Multiplier but the device connecting to the port might be others type.



Regards,

Dislo



--- 11/1/8 (六),Tejun Heo<tj@kernel.org>  寫道:
quoted
寄件者: Tejun Heo[off-list ref]
主旨: Re: AHCI support Port Multiplier problem.
收件者: "Luo Dislo"[off-list ref]
副本: jgarzik@pobox.com, linux-ide@vger.kernel.org
日期: 2011年1月8日,六,上午5:25
Hello,

On Fri, Jan 07, 2011 at 10:55:14AM +0800, Luo Dislo wrote:
quoted
I am using AHCI driver, when CONFIG_SATA_PMP is set
and the ahci
quoted
driver DOES NOT have AHCI_HFLAG_NO_PMP. Libata sends
Software Reset
quoted
with PMP=0xF, trying to detect if Port Multiplier
connected to the
quoted
port. Unfortunately, if I plugged in general Hard
drive, my
quoted
controller failed to identify the hard drive.

What I observed was that libata always sent Software
Reset with
quoted
PMP=0xF and I guessed expecting signature is
0x96690101. I think
quoted
libata should give up if the device does not return
the Port
quoted
Multiplier signature at the first time and take the
signature value
quoted
from device as the real device connnecting to the port
now.
quoted
What we said "support" PMP does not mean the port can
only connnect
quoted
to Port Multiplier. It might connect with hard drive
or ATAPI
quoted
device.
Which controller is this?  Can you please post the
output of "lspci
-nn"?  SB600 had this problem and needed workaround
but later SBs
fixed it.  Looks like someone else screwed up
similarly.

Thanks.

--
tejun


--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help