|
@@ -45,7 +45,7 @@
|
|
|
#include "sata_promise.h"
|
|
|
|
|
|
#define DRV_NAME "sata_promise"
|
|
|
-#define DRV_VERSION "2.06"
|
|
|
+#define DRV_VERSION "2.07"
|
|
|
|
|
|
|
|
|
enum {
|
|
@@ -926,6 +926,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
|
|
|
struct ata_host *host;
|
|
|
void __iomem *base;
|
|
|
int n_ports, i, rc;
|
|
|
+ int is_sataii_tx4;
|
|
|
|
|
|
if (!printed_version++)
|
|
|
dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
|
|
@@ -964,10 +965,23 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
|
|
|
}
|
|
|
host->iomap = pcim_iomap_table(pdev);
|
|
|
|
|
|
- for (i = 0; i < host->n_ports; i++)
|
|
|
+ is_sataii_tx4 = 0;
|
|
|
+ if ((pi->flags & (PDC_FLAG_GEN_II|PDC_FLAG_4_PORTS)) == (PDC_FLAG_GEN_II|PDC_FLAG_4_PORTS)) {
|
|
|
+ is_sataii_tx4 = 1;
|
|
|
+ dev_printk(KERN_INFO, &pdev->dev, "applying SATAII TX4 port numbering workaround\n");
|
|
|
+ }
|
|
|
+ for (i = 0; i < host->n_ports; i++) {
|
|
|
+ static const unsigned char sataii_tx4_port_remap[4] = { 3, 1, 0, 2};
|
|
|
+ int ata_nr;
|
|
|
+
|
|
|
+ ata_nr = i;
|
|
|
+ if (is_sataii_tx4)
|
|
|
+ ata_nr = sataii_tx4_port_remap[i];
|
|
|
+
|
|
|
pdc_ata_setup_port(host->ports[i],
|
|
|
- base + 0x200 + i * 0x80,
|
|
|
- base + 0x400 + i * 0x100);
|
|
|
+ base + 0x200 + ata_nr * 0x80,
|
|
|
+ base + 0x400 + ata_nr * 0x100);
|
|
|
+ }
|
|
|
|
|
|
/* initialize adapter */
|
|
|
pdc_host_init(host);
|