|
@@ -2242,6 +2242,16 @@ static void mv_soc_reset_bus(struct ata_host *host, void __iomem *mmio)
|
|
|
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.
|
|
@@ -2253,18 +2263,17 @@ static void mv_reset_channel(struct mv_host_priv *hpriv, void __iomem *mmio,
|
|
|
|
|
|
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);
|
|
@@ -2710,19 +2719,6 @@ static int mv_init_host(struct ata_host *host, unsigned int board_idx)
|
|
|
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);
|