diff options
-rw-r--r-- | drivers/ata/libata-core.c | 18 | ||||
-rw-r--r-- | drivers/ata/libata-sff.c | 2 | ||||
-rw-r--r-- | include/linux/libata.h | 8 |
3 files changed, 23 insertions, 5 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 1c9315401f7a..bb66a12c84e5 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -5269,11 +5269,19 @@ void ata_port_init(struct ata_port *ap, struct ata_host *host, | |||
5269 | ap->host = host; | 5269 | ap->host = host; |
5270 | ap->dev = ent->dev; | 5270 | ap->dev = ent->dev; |
5271 | ap->port_no = port_no; | 5271 | ap->port_no = port_no; |
5272 | ap->pio_mask = ent->pio_mask; | 5272 | if (port_no == 1 && ent->pinfo2) { |
5273 | ap->mwdma_mask = ent->mwdma_mask; | 5273 | ap->pio_mask = ent->pinfo2->pio_mask; |
5274 | ap->udma_mask = ent->udma_mask; | 5274 | ap->mwdma_mask = ent->pinfo2->mwdma_mask; |
5275 | ap->flags |= ent->port_flags; | 5275 | ap->udma_mask = ent->pinfo2->udma_mask; |
5276 | ap->ops = ent->port_ops; | 5276 | ap->flags |= ent->pinfo2->flags; |
5277 | ap->ops = ent->pinfo2->port_ops; | ||
5278 | } else { | ||
5279 | ap->pio_mask = ent->pio_mask; | ||
5280 | ap->mwdma_mask = ent->mwdma_mask; | ||
5281 | ap->udma_mask = ent->udma_mask; | ||
5282 | ap->flags |= ent->port_flags; | ||
5283 | ap->ops = ent->port_ops; | ||
5284 | } | ||
5277 | ap->hw_sata_spd_limit = UINT_MAX; | 5285 | ap->hw_sata_spd_limit = UINT_MAX; |
5278 | ap->active_tag = ATA_TAG_POISON; | 5286 | ap->active_tag = ATA_TAG_POISON; |
5279 | ap->last_ctl = 0xFF; | 5287 | ap->last_ctl = 0xFF; |
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index d51dc41fa195..688bb55e197a 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -858,6 +858,7 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int | |||
858 | probe_ent->port[p].bmdma_addr = bmdma; | 858 | probe_ent->port[p].bmdma_addr = bmdma; |
859 | } | 859 | } |
860 | ata_std_ports(&probe_ent->port[p]); | 860 | ata_std_ports(&probe_ent->port[p]); |
861 | probe_ent->pinfo2 = port[1]; | ||
861 | p++; | 862 | p++; |
862 | } | 863 | } |
863 | 864 | ||
@@ -907,6 +908,7 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev, | |||
907 | probe_ent->_host_flags |= ATA_HOST_SIMPLEX; | 908 | probe_ent->_host_flags |= ATA_HOST_SIMPLEX; |
908 | } | 909 | } |
909 | ata_std_ports(&probe_ent->port[1]); | 910 | ata_std_ports(&probe_ent->port[1]); |
911 | probe_ent->pinfo2 = port[1]; | ||
910 | } else | 912 | } else |
911 | probe_ent->dummy_port_mask |= ATA_PORT_SECONDARY; | 913 | probe_ent->dummy_port_mask |= ATA_PORT_SECONDARY; |
912 | 914 | ||
diff --git a/include/linux/libata.h b/include/linux/libata.h index 8715305f611f..ff67e7524fe9 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -361,6 +361,14 @@ struct ata_probe_ent { | |||
361 | unsigned long _host_flags; | 361 | unsigned long _host_flags; |
362 | void __iomem *mmio_base; | 362 | void __iomem *mmio_base; |
363 | void *private_data; | 363 | void *private_data; |
364 | |||
365 | /* port_info for the secondary port. Together with irq2, it's | ||
366 | * used to implement non-uniform secondary port. Currently, | ||
367 | * the only user is ata_piix combined mode. This workaround | ||
368 | * will be removed together with ata_probe_ent when init model | ||
369 | * is updated. | ||
370 | */ | ||
371 | const struct ata_port_info *pinfo2; | ||
364 | }; | 372 | }; |
365 | 373 | ||
366 | struct ata_host { | 374 | struct ata_host { |