#include "sata_promise.h"
 
 #define DRV_NAME       "sata_promise"
-#define DRV_VERSION    "2.06"
+#define DRV_VERSION    "2.07"
 
 
 enum {
        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");
        }
        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);