mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-02 03:06:43 +07:00
ahci: add HFLAG_YES_FBS and apply it to 88SE9128
88SE9128 can do FBS and sets it in HOST_CAP but forgets to set FBSCP in PORT_CMD. Implement AHCI_HFLAG_YES_FBS and apply it to 88SE9128. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
6d981b9a91
commit
5f173107ec
@ -60,6 +60,7 @@ enum board_ids {
|
|||||||
board_ahci,
|
board_ahci,
|
||||||
board_ahci_ign_iferr,
|
board_ahci_ign_iferr,
|
||||||
board_ahci_nosntf,
|
board_ahci_nosntf,
|
||||||
|
board_ahci_yes_fbs,
|
||||||
|
|
||||||
/* board IDs for specific chipsets in alphabetical order */
|
/* board IDs for specific chipsets in alphabetical order */
|
||||||
board_ahci_mcp65,
|
board_ahci_mcp65,
|
||||||
@ -132,6 +133,14 @@ static const struct ata_port_info ahci_port_info[] = {
|
|||||||
.udma_mask = ATA_UDMA6,
|
.udma_mask = ATA_UDMA6,
|
||||||
.port_ops = &ahci_ops,
|
.port_ops = &ahci_ops,
|
||||||
},
|
},
|
||||||
|
[board_ahci_yes_fbs] =
|
||||||
|
{
|
||||||
|
AHCI_HFLAGS (AHCI_HFLAG_YES_FBS),
|
||||||
|
.flags = AHCI_FLAG_COMMON,
|
||||||
|
.pio_mask = ATA_PIO4,
|
||||||
|
.udma_mask = ATA_UDMA6,
|
||||||
|
.port_ops = &ahci_ops,
|
||||||
|
},
|
||||||
/* by chipsets */
|
/* by chipsets */
|
||||||
[board_ahci_mcp65] =
|
[board_ahci_mcp65] =
|
||||||
{
|
{
|
||||||
@ -362,6 +371,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
|||||||
/* Marvell */
|
/* Marvell */
|
||||||
{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */
|
{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */
|
||||||
{ PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */
|
{ PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */
|
||||||
|
{ PCI_DEVICE(0x1b4b, 0x9123),
|
||||||
|
.driver_data = board_ahci_yes_fbs }, /* 88se9128 */
|
||||||
|
|
||||||
/* Promise */
|
/* Promise */
|
||||||
{ PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */
|
{ PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */
|
||||||
|
@ -209,6 +209,7 @@ enum {
|
|||||||
link offline */
|
link offline */
|
||||||
AHCI_HFLAG_NO_SNTF = (1 << 12), /* no sntf */
|
AHCI_HFLAG_NO_SNTF = (1 << 12), /* no sntf */
|
||||||
AHCI_HFLAG_NO_FPDMA_AA = (1 << 13), /* no FPDMA AA */
|
AHCI_HFLAG_NO_FPDMA_AA = (1 << 13), /* no FPDMA AA */
|
||||||
|
AHCI_HFLAG_YES_FBS = (1 << 14), /* force FBS cap on */
|
||||||
|
|
||||||
/* ap->flags bits */
|
/* ap->flags bits */
|
||||||
|
|
||||||
|
@ -430,6 +430,12 @@ void ahci_save_initial_config(struct device *dev,
|
|||||||
cap &= ~HOST_CAP_SNTF;
|
cap &= ~HOST_CAP_SNTF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(cap & HOST_CAP_FBS) && (hpriv->flags & AHCI_HFLAG_YES_FBS)) {
|
||||||
|
dev_printk(KERN_INFO, dev,
|
||||||
|
"controller can do FBS, turning on CAP_FBS\n");
|
||||||
|
cap |= HOST_CAP_FBS;
|
||||||
|
}
|
||||||
|
|
||||||
if (force_port_map && port_map != force_port_map) {
|
if (force_port_map && port_map != force_port_map) {
|
||||||
dev_printk(KERN_INFO, dev, "forcing port_map 0x%x -> 0x%x\n",
|
dev_printk(KERN_INFO, dev, "forcing port_map 0x%x -> 0x%x\n",
|
||||||
port_map, force_port_map);
|
port_map, force_port_map);
|
||||||
@ -2036,9 +2042,15 @@ static int ahci_port_start(struct ata_port *ap)
|
|||||||
u32 cmd = readl(port_mmio + PORT_CMD);
|
u32 cmd = readl(port_mmio + PORT_CMD);
|
||||||
if (cmd & PORT_CMD_FBSCP)
|
if (cmd & PORT_CMD_FBSCP)
|
||||||
pp->fbs_supported = true;
|
pp->fbs_supported = true;
|
||||||
else
|
else if (hpriv->flags & AHCI_HFLAG_YES_FBS) {
|
||||||
|
dev_printk(KERN_INFO, dev,
|
||||||
|
"port %d can do FBS, forcing FBSCP\n",
|
||||||
|
ap->port_no);
|
||||||
|
pp->fbs_supported = true;
|
||||||
|
} else
|
||||||
dev_printk(KERN_WARNING, dev,
|
dev_printk(KERN_WARNING, dev,
|
||||||
"The port is not capable of FBS\n");
|
"port %d is not capable of FBS\n",
|
||||||
|
ap->port_no);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pp->fbs_supported) {
|
if (pp->fbs_supported) {
|
||||||
|
Loading…
Reference in New Issue
Block a user