diff options
| -rw-r--r-- | drivers/ata/sata_mv.c | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 9463c71dd38e..81982594a014 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
| @@ -1898,19 +1898,25 @@ static void mv_bmdma_start(struct ata_queued_cmd *qc) | |||
| 1898 | * LOCKING: | 1898 | * LOCKING: |
| 1899 | * Inherited from caller. | 1899 | * Inherited from caller. |
| 1900 | */ | 1900 | */ |
| 1901 | static void mv_bmdma_stop(struct ata_queued_cmd *qc) | 1901 | static void mv_bmdma_stop_ap(struct ata_port *ap) |
| 1902 | { | 1902 | { |
| 1903 | struct ata_port *ap = qc->ap; | ||
| 1904 | void __iomem *port_mmio = mv_ap_base(ap); | 1903 | void __iomem *port_mmio = mv_ap_base(ap); |
| 1905 | u32 cmd; | 1904 | u32 cmd; |
| 1906 | 1905 | ||
| 1907 | /* clear start/stop bit */ | 1906 | /* clear start/stop bit */ |
| 1908 | cmd = readl(port_mmio + BMDMA_CMD); | 1907 | cmd = readl(port_mmio + BMDMA_CMD); |
| 1909 | cmd &= ~ATA_DMA_START; | 1908 | if (cmd & ATA_DMA_START) { |
| 1910 | writelfl(cmd, port_mmio + BMDMA_CMD); | 1909 | cmd &= ~ATA_DMA_START; |
| 1910 | writelfl(cmd, port_mmio + BMDMA_CMD); | ||
| 1911 | |||
| 1912 | /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */ | ||
| 1913 | ata_sff_dma_pause(ap); | ||
| 1914 | } | ||
| 1915 | } | ||
| 1911 | 1916 | ||
| 1912 | /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */ | 1917 | static void mv_bmdma_stop(struct ata_queued_cmd *qc) |
| 1913 | ata_sff_dma_pause(ap); | 1918 | { |
| 1919 | mv_bmdma_stop_ap(qc->ap); | ||
| 1914 | } | 1920 | } |
| 1915 | 1921 | ||
| 1916 | /** | 1922 | /** |
| @@ -1934,8 +1940,21 @@ static u8 mv_bmdma_status(struct ata_port *ap) | |||
| 1934 | reg = readl(port_mmio + BMDMA_STATUS); | 1940 | reg = readl(port_mmio + BMDMA_STATUS); |
| 1935 | if (reg & ATA_DMA_ACTIVE) | 1941 | if (reg & ATA_DMA_ACTIVE) |
| 1936 | status = ATA_DMA_ACTIVE; | 1942 | status = ATA_DMA_ACTIVE; |
| 1937 | else | 1943 | else if (reg & ATA_DMA_ERR) |
| 1938 | status = (reg & ATA_DMA_ERR) | ATA_DMA_INTR; | 1944 | status = (reg & ATA_DMA_ERR) | ATA_DMA_INTR; |
| 1945 | else { | ||
| 1946 | /* | ||
| 1947 | * Just because DMA_ACTIVE is 0 (DMA completed), | ||
| 1948 | * this does _not_ mean the device is "done". | ||
| 1949 | * So we should not yet be signalling ATA_DMA_INTR | ||
| 1950 | * in some cases. Eg. DSM/TRIM, and perhaps others. | ||
| 1951 | */ | ||
| 1952 | mv_bmdma_stop_ap(ap); | ||
| 1953 | if (ioread8(ap->ioaddr.altstatus_addr) & ATA_BUSY) | ||
| 1954 | status = 0; | ||
| 1955 | else | ||
| 1956 | status = ATA_DMA_INTR; | ||
| 1957 | } | ||
| 1939 | return status; | 1958 | return status; |
| 1940 | } | 1959 | } |
| 1941 | 1960 | ||
| @@ -1995,6 +2014,9 @@ static void mv_qc_prep(struct ata_queued_cmd *qc) | |||
| 1995 | 2014 | ||
| 1996 | switch (tf->protocol) { | 2015 | switch (tf->protocol) { |
| 1997 | case ATA_PROT_DMA: | 2016 | case ATA_PROT_DMA: |
| 2017 | if (tf->command == ATA_CMD_DSM) | ||
| 2018 | return; | ||
| 2019 | /* fall-thru */ | ||
| 1998 | case ATA_PROT_NCQ: | 2020 | case ATA_PROT_NCQ: |
| 1999 | break; /* continue below */ | 2021 | break; /* continue below */ |
| 2000 | case ATA_PROT_PIO: | 2022 | case ATA_PROT_PIO: |
| @@ -2094,6 +2116,8 @@ static void mv_qc_prep_iie(struct ata_queued_cmd *qc) | |||
| 2094 | if ((tf->protocol != ATA_PROT_DMA) && | 2116 | if ((tf->protocol != ATA_PROT_DMA) && |
| 2095 | (tf->protocol != ATA_PROT_NCQ)) | 2117 | (tf->protocol != ATA_PROT_NCQ)) |
| 2096 | return; | 2118 | return; |
| 2119 | if (tf->command == ATA_CMD_DSM) | ||
| 2120 | return; /* use bmdma for this */ | ||
| 2097 | 2121 | ||
| 2098 | /* Fill in Gen IIE command request block */ | 2122 | /* Fill in Gen IIE command request block */ |
| 2099 | if (!(tf->flags & ATA_TFLAG_WRITE)) | 2123 | if (!(tf->flags & ATA_TFLAG_WRITE)) |
| @@ -2289,6 +2313,12 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc) | |||
| 2289 | 2313 | ||
| 2290 | switch (qc->tf.protocol) { | 2314 | switch (qc->tf.protocol) { |
| 2291 | case ATA_PROT_DMA: | 2315 | case ATA_PROT_DMA: |
| 2316 | if (qc->tf.command == ATA_CMD_DSM) { | ||
| 2317 | if (!ap->ops->bmdma_setup) /* no bmdma on GEN_I */ | ||
| 2318 | return AC_ERR_OTHER; | ||
| 2319 | break; /* use bmdma for this */ | ||
| 2320 | } | ||
| 2321 | /* fall thru */ | ||
| 2292 | case ATA_PROT_NCQ: | 2322 | case ATA_PROT_NCQ: |
| 2293 | mv_start_edma(ap, port_mmio, pp, qc->tf.protocol); | 2323 | mv_start_edma(ap, port_mmio, pp, qc->tf.protocol); |
| 2294 | pp->req_idx = (pp->req_idx + 1) & MV_MAX_Q_DEPTH_MASK; | 2324 | pp->req_idx = (pp->req_idx + 1) & MV_MAX_Q_DEPTH_MASK; |
