Let me clear our discussion a little bit.
Checking PxCMD.FR is performed even if there is no device at port.
Because "When PxCMD.FRE is set, it cause PxCMD.FR to be set to ‘1’. Only then HBA receives FISes from the device and copies them into system memory."
In my case, FR is not getting set.
Exactly the same is in my case, setting PxCMD.FRE doesn't cause PxCMD.FR to be set to ‘1’. Since reference driver in Linux doesn't check PxCMD.FR, I assume that it isn't necessary for receiving FISes (I mean that it is enough to set PxCMD.FRE. BTW: "Only then HBA receives FISes from the device and copies them into system memory." is this sentence taken from AHCI Spec?). This assumption lets me comment-out above code, but further in init sequence I have another problem that, data from device isn't copied into system memory.
Do you think that even though PxCMD.FRE is set, receiving FISes is blocked? Do you know what may cause PxCMD.FR to stay unset?
Thanks, Jan