return;
 }
 
+static void mv_setup_ifctl(void __iomem *port_mmio, int want_gen2i)
+{
+       u32 ifctl = readl(port_mmio + SATA_INTERFACE_CFG);
+
+       ifctl = (ifctl & 0xf7f) | 0x9b1000;     /* from chip spec */
+       if (want_gen2i)
+               ifctl |= (1 << 7);              /* enable gen2i speed */
+       writelfl(ifctl, port_mmio + SATA_INTERFACE_CFG);
+}
+
 /*
  * Caller must ensure that EDMA is not active,
  * by first doing mv_stop_edma() where needed.
 
        writelfl(ATA_RST, port_mmio + EDMA_CMD_OFS);
 
-       if (IS_GEN_II(hpriv)) {
-               u32 ifctl = readl(port_mmio + SATA_INTERFACE_CFG);
-               ifctl |= (1 << 7);              /* enable gen2i speed */
-               ifctl = (ifctl & 0xfff) | 0x9b1000; /* from chip spec */
-               writelfl(ifctl, port_mmio + SATA_INTERFACE_CFG);
+       if (!IS_GEN_I(hpriv)) {
+               /* Enable 3.0gb/s link speed */
+               mv_setup_ifctl(port_mmio, 1);
        }
-
-       udelay(25);             /* allow reset propagation */
-
-       /* Spec never mentions clearing the bit.  Marvell's driver does
-        * clear the bit, however.
+       /*
+        * Strobing ATA_RST here causes a hard reset of the SATA transport,
+        * link, and physical layers.  It resets all SATA interface registers
+        * (except for SATA_INTERFACE_CFG), and issues a COMRESET to the dev.
         */
+       writelfl(ATA_RST, port_mmio + EDMA_CMD_OFS);
+       udelay(25);     /* allow reset propagation */
        writelfl(0, port_mmio + EDMA_CMD_OFS);
 
        hpriv->ops->phy_errata(hpriv, mmio, port_no);
        hpriv->ops->reset_bus(host, mmio);
        hpriv->ops->enable_leds(hpriv, mmio);
 
-       for (port = 0; port < host->n_ports; port++) {
-               if (IS_GEN_II(hpriv)) {
-                       void __iomem *port_mmio = mv_port_base(mmio, port);
-
-                       u32 ifctl = readl(port_mmio + SATA_INTERFACE_CFG);
-                       ifctl |= (1 << 7);              /* enable gen2i speed */
-                       ifctl = (ifctl & 0xfff) | 0x9b1000; /* from chip spec */
-                       writelfl(ifctl, port_mmio + SATA_INTERFACE_CFG);
-               }
-
-               hpriv->ops->phy_errata(hpriv, mmio, port);
-       }
-
        for (port = 0; port < host->n_ports; port++) {
                struct ata_port *ap = host->ports[port];
                void __iomem *port_mmio = mv_port_base(mmio, port);