mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-17 13:53:39 +00:00
On Soft Reset, read device signature from FIS receive area, instead of
PxSIG register. It works better for NVidia chipsets. ahci(4) does the same. PR: kern/140472, i386/138668
This commit is contained in:
parent
bc0d5982e2
commit
00f0143052
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=200117
|
@ -824,11 +824,10 @@ ata_ahci_hardreset(device_t dev, int port, uint32_t *signature)
|
|||
static u_int32_t
|
||||
ata_ahci_softreset(device_t dev, int port)
|
||||
{
|
||||
struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev));
|
||||
struct ata_channel *ch = device_get_softc(dev);
|
||||
int offset = ch->unit << 7;
|
||||
struct ata_ahci_cmd_tab *ctp =
|
||||
(struct ata_ahci_cmd_tab *)(ch->dma.work + ATA_AHCI_CT_OFFSET);
|
||||
u_int8_t *fis = ch->dma.work + ATA_AHCI_FB_OFFSET + 0x40;
|
||||
|
||||
if (bootverbose)
|
||||
device_printf(dev, "software reset port %d...\n", port);
|
||||
|
@ -865,7 +864,10 @@ ata_ahci_softreset(device_t dev, int port)
|
|||
return (-1);
|
||||
}
|
||||
|
||||
return ATA_INL(ctlr->r_res2, ATA_AHCI_P_SIG + offset);
|
||||
return (((u_int32_t)fis[6] << 24) |
|
||||
((u_int32_t)fis[5] << 16) |
|
||||
((u_int32_t)fis[4] << 8) |
|
||||
(u_int32_t)fis[12]);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in a new issue