svn commit: r305798 - stable/10/sys/dev/ahci
Alexander Motin
mav at FreeBSD.org
Wed Sep 14 09:11:04 UTC 2016
Author: mav
Date: Wed Sep 14 09:11:03 2016
New Revision: 305798
URL: https://svnweb.freebsd.org/changeset/base/305798
Log:
MFC r305536: Fix channel initialization in FBS mode.
Due to reading initialized variable, FIS receive area was always allocated
as 256 bytes, suitable for command-based switching, instead of 4096 bytes,
required for FIS-based switching. This caused memory corruption in case of
MFC r305536: Fix channel initialization in FBS mode.
Due to reading initialized variable, FIS receive area was always allocated
as 256 bytes, suitable for command-based switching, instead of 4096 bytes,
required for FIS-based switching. This caused memory corruption in case of
port multipliers used on FBS-capable HBAs (Marvell).
Modified:
stable/10/sys/dev/ahci/ahci.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/dev/ahci/ahci.c
==============================================================================
--- stable/10/sys/dev/ahci/ahci.c Wed Sep 14 09:10:31 2016 (r305797)
+++ stable/10/sys/dev/ahci/ahci.c Wed Sep 14 09:11:03 2016 (r305798)
@@ -668,6 +668,21 @@ ahci_ch_attach(device_t dev)
if (!(ch->r_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
&rid, RF_ACTIVE)))
return (ENXIO);
+ ch->chcaps = ATA_INL(ch->r_mem, AHCI_P_CMD);
+ version = ATA_INL(ctlr->r_mem, AHCI_VS);
+ if (version < 0x00010200 && (ctlr->caps & AHCI_CAP_FBSS))
+ ch->chcaps |= AHCI_P_CMD_FBSCP;
+ if (ch->caps2 & AHCI_CAP2_SDS)
+ ch->chscaps = ATA_INL(ch->r_mem, AHCI_P_DEVSLP);
+ if (bootverbose) {
+ device_printf(dev, "Caps:%s%s%s%s%s%s\n",
+ (ch->chcaps & AHCI_P_CMD_HPCP) ? " HPCP":"",
+ (ch->chcaps & AHCI_P_CMD_MPSP) ? " MPSP":"",
+ (ch->chcaps & AHCI_P_CMD_CPD) ? " CPD":"",
+ (ch->chcaps & AHCI_P_CMD_ESP) ? " ESP":"",
+ (ch->chcaps & AHCI_P_CMD_FBSCP) ? " FBSCP":"",
+ (ch->chscaps & AHCI_P_DEVSLP_DSP) ? " DSP":"");
+ }
ahci_dmainit(dev);
ahci_slotsalloc(dev);
mtx_lock(&ch->mtx);
@@ -686,21 +701,6 @@ ahci_ch_attach(device_t dev)
error = ENXIO;
goto err1;
}
- ch->chcaps = ATA_INL(ch->r_mem, AHCI_P_CMD);
- version = ATA_INL(ctlr->r_mem, AHCI_VS);
- if (version < 0x00010200 && (ctlr->caps & AHCI_CAP_FBSS))
- ch->chcaps |= AHCI_P_CMD_FBSCP;
- if (ch->caps2 & AHCI_CAP2_SDS)
- ch->chscaps = ATA_INL(ch->r_mem, AHCI_P_DEVSLP);
- if (bootverbose) {
- device_printf(dev, "Caps:%s%s%s%s%s%s\n",
- (ch->chcaps & AHCI_P_CMD_HPCP) ? " HPCP":"",
- (ch->chcaps & AHCI_P_CMD_MPSP) ? " MPSP":"",
- (ch->chcaps & AHCI_P_CMD_CPD) ? " CPD":"",
- (ch->chcaps & AHCI_P_CMD_ESP) ? " ESP":"",
- (ch->chcaps & AHCI_P_CMD_FBSCP) ? " FBSCP":"",
- (ch->chscaps & AHCI_P_DEVSLP_DSP) ? " DSP":"");
- }
/* Create the device queue for our SIM. */
devq = cam_simq_alloc(ch->numslots);
if (devq == NULL) {
More information about the svn-src-stable
mailing list