mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-14 08:13:56 +08:00
ata changes for 6.6
- Fix OF include file for ata platform drivers (Rob). - Simplify various ahci, sata and pata platform drivers using the function devm_platform_ioremap_resource() (Yangtao). - Cleanup libata time related argument types (e.g. timeouts values) (Sergey). - Cleanup libata code around error handling as all ata drivers now define a error_handler operation (Hannes and Niklas). - Remove functions intended for libsas that are in fact unused (Niklas). - Change the remove device callback of platform drivers to a null function (Uwe). - Simplify the pata_imx driver using devm_clk_get_enabled() (Li). - Remove old and uinused remnants of the ide code in arm, parisc, powerpc, sparc and m68k architectures and associated drivers (pata_buddha, pata_falcon and pata_gayle) (Geert). - Add missing MODULE_DESCRIPTION() in the sata_gemini and pata_ftide010 drivers (me). - Several fixes for the pata_ep93xx and pata_falcon drivers (Nikita, Michael). - Add Elkhart Lake AHCI controller support to the ahci driver (Werner). - Disable NCQ trim on Micron 1100 drives (Pawel). -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQSRPv8tYSvhwAzJdzjdoc3SxdoYdgUCZPbUdQAKCRDdoc3SxdoY du6NAP9G10EhjgXDNIM8f1AN8gHrZk2RGSxSuqIKKROxl2i+ugD+Mt8/UjRpf0JO nVdKTfgeXaLfCXHN/fmkIYNmk+I7Twg= =9Ety -----END PGP SIGNATURE----- Merge tag 'ata-6.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata Pull ata updates from Damien Le Moal: - Fix OF include file for ata platform drivers (Rob) - Simplify various ahci, sata and pata platform drivers using the function devm_platform_ioremap_resource() (Yangtao) - Cleanup libata time related argument types (e.g. timeouts values) (Sergey) - Cleanup libata code around error handling as all ata drivers now define a error_handler operation (Hannes and Niklas) - Remove functions intended for libsas that are in fact unused (Niklas) - Change the remove device callback of platform drivers to a null function (Uwe) - Simplify the pata_imx driver using devm_clk_get_enabled() (Li) - Remove old and uinused remnants of the ide code in arm, parisc, powerpc, sparc and m68k architectures and associated drivers (pata_buddha, pata_falcon and pata_gayle) (Geert) - Add missing MODULE_DESCRIPTION() in the sata_gemini and pata_ftide010 drivers (me) - Several fixes for the pata_ep93xx and pata_falcon drivers (Nikita, Michael) - Add Elkhart Lake AHCI controller support to the ahci driver (Werner) - Disable NCQ trim on Micron 1100 drives (Pawel) * tag 'ata-6.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata: (60 commits) ata: libata-core: Disable NCQ_TRIM on Micron 1100 drives ata: ahci: Add Elkhart Lake AHCI controller ata: pata_falcon: add data_swab option to byte-swap disk data ata: pata_falcon: fix IO base selection for Q40 ata: pata_ep93xx: use soc_device_match for UDMA modes ata: pata_ep93xx: fix error return code in probe ata: sata_gemini: Add missing MODULE_DESCRIPTION ata: pata_ftide010: Add missing MODULE_DESCRIPTION m68k: Remove <asm/ide.h> ata: pata_gayle: Remove #include <asm/ide.h> ata: pata_falcon: Remove #include <asm/ide.h> ata: pata_buddha: Remove #include <asm/ide.h> asm-generic: Remove ide_iops.h sparc: Remove <asm/ide.h> powerpc: Remove <asm/ide.h> parisc: Remove <asm/ide.h> ARM: Remove <asm/ide.h> ata: pata_imx: Use helper function devm_clk_get_enabled() ata: sata_rcar: Convert to platform remove callback returning void ata: sata_mv: Convert to platform remove callback returning void ...
This commit is contained in:
commit
4b3d6e0c6c
@ -32,22 +32,6 @@ register blocks.
|
||||
:c:type:`struct ata_port_operations <ata_port_operations>`
|
||||
----------------------------------------------------------
|
||||
|
||||
Disable ATA port
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
::
|
||||
|
||||
void (*port_disable) (struct ata_port *);
|
||||
|
||||
|
||||
Called from :c:func:`ata_bus_probe` error path, as well as when unregistering
|
||||
from the SCSI module (rmmod, hot unplug). This function should do
|
||||
whatever needs to be done to take the port out of use. In most cases,
|
||||
:c:func:`ata_port_disable` can be used as this hook.
|
||||
|
||||
Called from :c:func:`ata_bus_probe` on a failed probe. Called from
|
||||
:c:func:`ata_scsi_release`.
|
||||
|
||||
Post-IDENTIFY device configuration
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@ -272,14 +256,6 @@ advanced drivers implement their own ``->qc_issue``.
|
||||
Exception and probe handling (EH)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
::
|
||||
|
||||
void (*eng_timeout) (struct ata_port *ap);
|
||||
void (*phy_reset) (struct ata_port *ap);
|
||||
|
||||
|
||||
Deprecated. Use ``->error_handler()`` instead.
|
||||
|
||||
::
|
||||
|
||||
void (*freeze) (struct ata_port *ap);
|
||||
@ -364,8 +340,7 @@ SATA phy read/write
|
||||
u32 val);
|
||||
|
||||
|
||||
Read and write standard SATA phy registers. Currently only used if
|
||||
``->phy_reset`` hook called the :c:func:`sata_phy_reset` helper function.
|
||||
Read and write standard SATA phy registers.
|
||||
sc_reg is one of SCR_STATUS, SCR_CONTROL, SCR_ERROR, or SCR_ACTIVE.
|
||||
|
||||
Init and shutdown
|
||||
@ -536,13 +511,12 @@ to return without deallocating the qc. This leads us to
|
||||
|
||||
:c:func:`ata_scsi_error` is the current ``transportt->eh_strategy_handler()``
|
||||
for libata. As discussed above, this will be entered in two cases -
|
||||
timeout and ATAPI error completion. This function calls low level libata
|
||||
driver's :c:func:`eng_timeout` callback, the standard callback for which is
|
||||
:c:func:`ata_eng_timeout`. It checks if a qc is active and calls
|
||||
:c:func:`ata_qc_timeout` on the qc if so. Actual error handling occurs in
|
||||
:c:func:`ata_qc_timeout`.
|
||||
timeout and ATAPI error completion. This function will check if a qc is active
|
||||
and has not failed yet. Such a qc will be marked with AC_ERR_TIMEOUT such that
|
||||
EH will know to handle it later. Then it calls low level libata driver's
|
||||
:c:func:`error_handler` callback.
|
||||
|
||||
If EH is invoked for timeout, :c:func:`ata_qc_timeout` stops BMDMA and
|
||||
When the :c:func:`error_handler` callback is invoked it stops BMDMA and
|
||||
completes the qc. Note that as we're currently in EH, we cannot call
|
||||
scsi_done. As described in SCSI EH doc, a recovered scmd should be
|
||||
either retried with :c:func:`scsi_queue_insert` or finished with
|
||||
|
@ -1,24 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* arch/arm/include/asm/ide.h
|
||||
*
|
||||
* Copyright (C) 1994-1996 Linus Torvalds & authors
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file contains the ARM architecture specific IDE code.
|
||||
*/
|
||||
|
||||
#ifndef __ASMARM_IDE_H
|
||||
#define __ASMARM_IDE_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define __ide_mm_insw(port,addr,len) readsw(port,addr,len)
|
||||
#define __ide_mm_insl(port,addr,len) readsl(port,addr,len)
|
||||
#define __ide_mm_outsw(port,addr,len) writesw(port,addr,len)
|
||||
#define __ide_mm_outsl(port,addr,len) writesl(port,addr,len)
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* __ASMARM_IDE_H */
|
@ -1,67 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 1994-1996 Linus Torvalds & authors
|
||||
*/
|
||||
|
||||
/* Copyright(c) 1996 Kars de Jong */
|
||||
/* Based on the ide driver from 1.2.13pl8 */
|
||||
|
||||
/*
|
||||
* Credits (alphabetical):
|
||||
*
|
||||
* - Bjoern Brauel
|
||||
* - Kars de Jong
|
||||
* - Torsten Ebeling
|
||||
* - Dwight Engen
|
||||
* - Thorsten Floeck
|
||||
* - Roman Hodek
|
||||
* - Guenther Kelleter
|
||||
* - Chris Lawrence
|
||||
* - Michael Rausch
|
||||
* - Christian Sauer
|
||||
* - Michael Schmitz
|
||||
* - Jes Soerensen
|
||||
* - Michael Thurm
|
||||
* - Geert Uytterhoeven
|
||||
*/
|
||||
|
||||
#ifndef _M68K_IDE_H
|
||||
#define _M68K_IDE_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <asm/setup.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
|
||||
/*
|
||||
* Get rid of defs from io.h - ide has its private and conflicting versions
|
||||
* Since so far no single m68k platform uses ISA/PCI I/O space for IDE, we
|
||||
* always use the `raw' MMIO versions
|
||||
*/
|
||||
#undef readb
|
||||
#undef readw
|
||||
#undef writeb
|
||||
#undef writew
|
||||
|
||||
#define readb in_8
|
||||
#define readw in_be16
|
||||
#define __ide_mm_insw(port, addr, n) raw_insw((u16 *)port, addr, n)
|
||||
#define __ide_mm_insl(port, addr, n) raw_insl((u32 *)port, addr, n)
|
||||
#define writeb(val, port) out_8(port, val)
|
||||
#define writew(val, port) out_be16(port, val)
|
||||
#define __ide_mm_outsw(port, addr, n) raw_outsw((u16 *)port, addr, n)
|
||||
#define __ide_mm_outsl(port, addr, n) raw_outsl((u32 *)port, addr, n)
|
||||
|
||||
#else
|
||||
|
||||
#define __ide_mm_insw(port, addr, n) io_insw((unsigned int)port, addr, n)
|
||||
#define __ide_mm_insl(port, addr, n) io_insl((unsigned int)port, addr, n)
|
||||
#define __ide_mm_outsw(port, addr, n) io_outsw((unsigned int)port, addr, n)
|
||||
#define __ide_mm_outsl(port, addr, n) io_outsl((unsigned int)port, addr, n)
|
||||
|
||||
#endif /* CONFIG_MMU */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _M68K_IDE_H */
|
@ -1,54 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* linux/include/asm-parisc/ide.h
|
||||
*
|
||||
* Copyright (C) 1994-1996 Linus Torvalds & authors
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file contains the PARISC architecture specific IDE code.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_PARISC_IDE_H
|
||||
#define __ASM_PARISC_IDE_H
|
||||
|
||||
/* Generic I/O and MEMIO string operations. */
|
||||
|
||||
#define __ide_insw insw
|
||||
#define __ide_insl insl
|
||||
#define __ide_outsw outsw
|
||||
#define __ide_outsl outsl
|
||||
|
||||
static __inline__ void __ide_mm_insw(void __iomem *port, void *addr, u32 count)
|
||||
{
|
||||
while (count--) {
|
||||
*(u16 *)addr = __raw_readw(port);
|
||||
addr += 2;
|
||||
}
|
||||
}
|
||||
|
||||
static __inline__ void __ide_mm_insl(void __iomem *port, void *addr, u32 count)
|
||||
{
|
||||
while (count--) {
|
||||
*(u32 *)addr = __raw_readl(port);
|
||||
addr += 4;
|
||||
}
|
||||
}
|
||||
|
||||
static __inline__ void __ide_mm_outsw(void __iomem *port, void *addr, u32 count)
|
||||
{
|
||||
while (count--) {
|
||||
__raw_writew(*(u16 *)addr, port);
|
||||
addr += 2;
|
||||
}
|
||||
}
|
||||
|
||||
static __inline__ void __ide_mm_outsl(void __iomem *port, void *addr, u32 count)
|
||||
{
|
||||
while (count--) {
|
||||
__raw_writel(*(u32 *)addr, port);
|
||||
addr += 4;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* __ASM_PARISC_IDE_H */
|
@ -1,18 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 1994-1996 Linus Torvalds & authors
|
||||
*
|
||||
* This file contains the powerpc architecture specific IDE code.
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_IDE_H
|
||||
#define _ASM_POWERPC_IDE_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#define __ide_mm_insw(p, a, c) readsw((void __iomem *)(p), (a), (c))
|
||||
#define __ide_mm_insl(p, a, c) readsl((void __iomem *)(p), (a), (c))
|
||||
#define __ide_mm_outsw(p, a, c) writesw((void __iomem *)(p), (a), (c))
|
||||
#define __ide_mm_outsl(p, a, c) writesl((void __iomem *)(p), (a), (c))
|
||||
|
||||
#endif /* _ASM_POWERPC_IDE_H */
|
@ -1,97 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* ide.h: SPARC PCI specific IDE glue.
|
||||
*
|
||||
* Copyright (C) 1997 David S. Miller (davem@davemloft.net)
|
||||
* Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be)
|
||||
* Adaptation from sparc64 version to sparc by Pete Zaitcev.
|
||||
*/
|
||||
|
||||
#ifndef _SPARC_IDE_H
|
||||
#define _SPARC_IDE_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <asm/io.h>
|
||||
#ifdef CONFIG_SPARC64
|
||||
#include <asm/spitfire.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/page.h>
|
||||
#else
|
||||
#include <linux/pgtable.h>
|
||||
#include <asm/psr.h>
|
||||
#endif
|
||||
|
||||
#define __ide_insl(data_reg, buffer, wcount) \
|
||||
__ide_insw(data_reg, buffer, (wcount)<<1)
|
||||
#define __ide_outsl(data_reg, buffer, wcount) \
|
||||
__ide_outsw(data_reg, buffer, (wcount)<<1)
|
||||
|
||||
/* On sparc, I/O ports and MMIO registers are accessed identically. */
|
||||
#define __ide_mm_insw __ide_insw
|
||||
#define __ide_mm_insl __ide_insl
|
||||
#define __ide_mm_outsw __ide_outsw
|
||||
#define __ide_mm_outsl __ide_outsl
|
||||
|
||||
static inline void __ide_insw(void __iomem *port, void *dst, u32 count)
|
||||
{
|
||||
#if defined(CONFIG_SPARC64) && defined(DCACHE_ALIASING_POSSIBLE)
|
||||
unsigned long end = (unsigned long)dst + (count << 1);
|
||||
#endif
|
||||
u16 *ps = dst;
|
||||
u32 *pi;
|
||||
|
||||
if(((unsigned long)ps) & 0x2) {
|
||||
*ps++ = __raw_readw(port);
|
||||
count--;
|
||||
}
|
||||
pi = (u32 *)ps;
|
||||
while(count >= 2) {
|
||||
u32 w;
|
||||
|
||||
w = __raw_readw(port) << 16;
|
||||
w |= __raw_readw(port);
|
||||
*pi++ = w;
|
||||
count -= 2;
|
||||
}
|
||||
ps = (u16 *)pi;
|
||||
if(count)
|
||||
*ps++ = __raw_readw(port);
|
||||
|
||||
#if defined(CONFIG_SPARC64) && defined(DCACHE_ALIASING_POSSIBLE)
|
||||
__flush_dcache_range((unsigned long)dst, end);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void __ide_outsw(void __iomem *port, const void *src, u32 count)
|
||||
{
|
||||
#if defined(CONFIG_SPARC64) && defined(DCACHE_ALIASING_POSSIBLE)
|
||||
unsigned long end = (unsigned long)src + (count << 1);
|
||||
#endif
|
||||
const u16 *ps = src;
|
||||
const u32 *pi;
|
||||
|
||||
if(((unsigned long)src) & 0x2) {
|
||||
__raw_writew(*ps++, port);
|
||||
count--;
|
||||
}
|
||||
pi = (const u32 *)ps;
|
||||
while(count >= 2) {
|
||||
u32 w;
|
||||
|
||||
w = *pi++;
|
||||
__raw_writew((w >> 16), port);
|
||||
__raw_writew(w, port);
|
||||
count -= 2;
|
||||
}
|
||||
ps = (const u16 *)pi;
|
||||
if(count)
|
||||
__raw_writew(*ps, port);
|
||||
|
||||
#if defined(CONFIG_SPARC64) && defined(DCACHE_ALIASING_POSSIBLE)
|
||||
__flush_dcache_range((unsigned long)src, end);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _SPARC_IDE_H */
|
@ -421,6 +421,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x34d3), board_ahci_low_power }, /* Ice Lake LP AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x02d3), board_ahci_low_power }, /* Comet Lake PCH-U AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x02d7), board_ahci_low_power }, /* Comet Lake PCH RAID */
|
||||
/* Elkhart Lake IDs 0x4b60 & 0x4b62 https://sata-io.org/product/8803 not tested yet */
|
||||
{ PCI_VDEVICE(INTEL, 0x4b63), board_ahci_low_power }, /* Elkhart Lake AHCI */
|
||||
|
||||
/* JMicron 360/1/3/5/6, match class to avoid IDE function */
|
||||
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
||||
@ -807,7 +809,7 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
|
||||
static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
|
||||
unsigned long deadline)
|
||||
{
|
||||
const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
|
||||
const unsigned int *timing = sata_ehc_deb_timing(&link->eh_context);
|
||||
struct ata_port *ap = link->ap;
|
||||
struct ahci_port_priv *pp = ap->private_data;
|
||||
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||
|
@ -10,7 +10,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/libata.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/reset.h>
|
||||
#include "ahci.h"
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include <linux/log2.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/regmap.h>
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <linux/libata.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/regmap.h>
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mbus.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "ahci.h"
|
||||
|
||||
|
@ -31,13 +31,11 @@ static int ahci_octeon_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *node = dev->of_node;
|
||||
struct resource *res;
|
||||
void __iomem *base;
|
||||
u64 cfg;
|
||||
int ret;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
base = devm_ioremap_resource(&pdev->dev, res);
|
||||
base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(base))
|
||||
return PTR_ERR(base);
|
||||
|
||||
|
@ -12,9 +12,7 @@
|
||||
#include <linux/pm.h>
|
||||
#include <linux/ahci_platform.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/libata.h>
|
||||
#include "ahci.h"
|
||||
@ -90,7 +88,7 @@ MODULE_DEVICE_TABLE(acpi, ahci_qoriq_acpi_match);
|
||||
static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class,
|
||||
unsigned long deadline)
|
||||
{
|
||||
const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
|
||||
const unsigned int *timing = sata_ehc_deb_timing(&link->eh_context);
|
||||
void __iomem *port_mmio = ahci_port_base(link->ap);
|
||||
u32 px_cmd, px_is, px_val;
|
||||
struct ata_port *ap = link->ap;
|
||||
|
@ -12,7 +12,6 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/libata.h>
|
||||
#include <linux/ahci_platform.h>
|
||||
@ -132,8 +131,7 @@ static const struct ata_port_info *ahci_seattle_get_port_info(
|
||||
if (!plat_data)
|
||||
return &ahci_port_info;
|
||||
|
||||
plat_data->sgpio_ctrl = devm_ioremap_resource(dev,
|
||||
platform_get_resource(pdev, IORESOURCE_MEM, 1));
|
||||
plat_data->sgpio_ctrl = devm_platform_ioremap_resource(pdev, 1);
|
||||
if (IS_ERR(plat_data->sgpio_ctrl))
|
||||
return &ahci_port_info;
|
||||
|
||||
|
@ -13,8 +13,8 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include "ahci.h"
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/reset.h>
|
||||
@ -530,8 +530,7 @@ static int tegra_ahci_probe(struct platform_device *pdev)
|
||||
tegra->pdev = pdev;
|
||||
tegra->soc = of_device_get_match_data(&pdev->dev);
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
tegra->sata_regs = devm_ioremap_resource(&pdev->dev, res);
|
||||
tegra->sata_regs = devm_platform_ioremap_resource(pdev, 1);
|
||||
if (IS_ERR(tegra->sata_regs))
|
||||
return PTR_ERR(tegra->sata_regs);
|
||||
|
||||
|
@ -110,9 +110,8 @@ static int xgene_ahci_init_memram(struct xgene_ahci_context *ctx)
|
||||
* @timeout : timeout for achieving the value.
|
||||
*/
|
||||
static int xgene_ahci_poll_reg_val(struct ata_port *ap,
|
||||
void __iomem *reg, unsigned
|
||||
int val, unsigned long interval,
|
||||
unsigned long timeout)
|
||||
void __iomem *reg, unsigned int val,
|
||||
unsigned int interval, unsigned int timeout)
|
||||
{
|
||||
unsigned long deadline;
|
||||
unsigned int tmp;
|
||||
@ -350,7 +349,7 @@ static void xgene_ahci_set_phy_cfg(struct xgene_ahci_context *ctx, int channel)
|
||||
static int xgene_ahci_do_hardreset(struct ata_link *link,
|
||||
unsigned long deadline, bool *online)
|
||||
{
|
||||
const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
|
||||
const unsigned int *timing = sata_ehc_deb_timing(&link->eh_context);
|
||||
struct ata_port *ap = link->ap;
|
||||
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||
struct xgene_ahci_context *ctx = hpriv->plat_data;
|
||||
@ -755,20 +754,17 @@ static int xgene_ahci_probe(struct platform_device *pdev)
|
||||
ctx->dev = dev;
|
||||
|
||||
/* Retrieve the IP core resource */
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
ctx->csr_core = devm_ioremap_resource(dev, res);
|
||||
ctx->csr_core = devm_platform_ioremap_resource(pdev, 1);
|
||||
if (IS_ERR(ctx->csr_core))
|
||||
return PTR_ERR(ctx->csr_core);
|
||||
|
||||
/* Retrieve the IP diagnostic resource */
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
|
||||
ctx->csr_diag = devm_ioremap_resource(dev, res);
|
||||
ctx->csr_diag = devm_platform_ioremap_resource(pdev, 2);
|
||||
if (IS_ERR(ctx->csr_diag))
|
||||
return PTR_ERR(ctx->csr_diag);
|
||||
|
||||
/* Retrieve the IP AXI resource */
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 3);
|
||||
ctx->csr_axi = devm_ioremap_resource(dev, res);
|
||||
ctx->csr_axi = devm_platform_ioremap_resource(pdev, 3);
|
||||
if (IS_ERR(ctx->csr_axi))
|
||||
return PTR_ERR(ctx->csr_axi);
|
||||
|
||||
|
@ -1403,7 +1403,7 @@ EXPORT_SYMBOL_GPL(ahci_kick_engine);
|
||||
|
||||
static int ahci_exec_polled_cmd(struct ata_port *ap, int pmp,
|
||||
struct ata_taskfile *tf, int is_cmd, u16 flags,
|
||||
unsigned long timeout_msec)
|
||||
unsigned int timeout_msec)
|
||||
{
|
||||
const u32 cmd_fis_len = 5; /* five dwords */
|
||||
struct ahci_port_priv *pp = ap->private_data;
|
||||
@ -1448,7 +1448,8 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class,
|
||||
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||
struct ahci_port_priv *pp = ap->private_data;
|
||||
const char *reason = NULL;
|
||||
unsigned long now, msecs;
|
||||
unsigned long now;
|
||||
unsigned int msecs;
|
||||
struct ata_taskfile tf;
|
||||
bool fbs_disabled = false;
|
||||
int rc;
|
||||
@ -1587,7 +1588,7 @@ static int ahci_pmp_retry_softreset(struct ata_link *link, unsigned int *class,
|
||||
int ahci_do_hardreset(struct ata_link *link, unsigned int *class,
|
||||
unsigned long deadline, bool *online)
|
||||
{
|
||||
const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
|
||||
const unsigned int *timing = sata_ehc_deb_timing(&link->eh_context);
|
||||
struct ata_port *ap = link->ap;
|
||||
struct ahci_port_priv *pp = ap->private_data;
|
||||
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <linux/ahci_platform.h>
|
||||
#include <linux/phy/phy.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/reset.h>
|
||||
#include "ahci.h"
|
||||
|
@ -1586,13 +1586,11 @@ static unsigned ata_exec_internal_sg(struct ata_device *dev,
|
||||
}
|
||||
}
|
||||
|
||||
if (ap->ops->error_handler)
|
||||
ata_eh_release(ap);
|
||||
ata_eh_release(ap);
|
||||
|
||||
rc = wait_for_completion_timeout(&wait, msecs_to_jiffies(timeout));
|
||||
|
||||
if (ap->ops->error_handler)
|
||||
ata_eh_acquire(ap);
|
||||
ata_eh_acquire(ap);
|
||||
|
||||
ata_sff_flush_pio_task(ap);
|
||||
|
||||
@ -1607,10 +1605,7 @@ static unsigned ata_exec_internal_sg(struct ata_device *dev,
|
||||
if (qc->flags & ATA_QCFLAG_ACTIVE) {
|
||||
qc->err_mask |= AC_ERR_TIMEOUT;
|
||||
|
||||
if (ap->ops->error_handler)
|
||||
ata_port_freeze(ap);
|
||||
else
|
||||
ata_qc_complete(qc);
|
||||
ata_port_freeze(ap);
|
||||
|
||||
ata_dev_warn(dev, "qc timeout after %u msecs (cmd 0x%x)\n",
|
||||
timeout, command);
|
||||
@ -3062,144 +3057,6 @@ int ata_cable_sata(struct ata_port *ap)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_cable_sata);
|
||||
|
||||
/**
|
||||
* ata_bus_probe - Reset and probe ATA bus
|
||||
* @ap: Bus to probe
|
||||
*
|
||||
* Master ATA bus probing function. Initiates a hardware-dependent
|
||||
* bus reset, then attempts to identify any devices found on
|
||||
* the bus.
|
||||
*
|
||||
* LOCKING:
|
||||
* PCI/etc. bus probe sem.
|
||||
*
|
||||
* RETURNS:
|
||||
* Zero on success, negative errno otherwise.
|
||||
*/
|
||||
|
||||
int ata_bus_probe(struct ata_port *ap)
|
||||
{
|
||||
unsigned int classes[ATA_MAX_DEVICES];
|
||||
int tries[ATA_MAX_DEVICES];
|
||||
int rc;
|
||||
struct ata_device *dev;
|
||||
|
||||
ata_for_each_dev(dev, &ap->link, ALL)
|
||||
tries[dev->devno] = ATA_PROBE_MAX_TRIES;
|
||||
|
||||
retry:
|
||||
ata_for_each_dev(dev, &ap->link, ALL) {
|
||||
/* If we issue an SRST then an ATA drive (not ATAPI)
|
||||
* may change configuration and be in PIO0 timing. If
|
||||
* we do a hard reset (or are coming from power on)
|
||||
* this is true for ATA or ATAPI. Until we've set a
|
||||
* suitable controller mode we should not touch the
|
||||
* bus as we may be talking too fast.
|
||||
*/
|
||||
dev->pio_mode = XFER_PIO_0;
|
||||
dev->dma_mode = 0xff;
|
||||
|
||||
/* If the controller has a pio mode setup function
|
||||
* then use it to set the chipset to rights. Don't
|
||||
* touch the DMA setup as that will be dealt with when
|
||||
* configuring devices.
|
||||
*/
|
||||
if (ap->ops->set_piomode)
|
||||
ap->ops->set_piomode(ap, dev);
|
||||
}
|
||||
|
||||
/* reset and determine device classes */
|
||||
ap->ops->phy_reset(ap);
|
||||
|
||||
ata_for_each_dev(dev, &ap->link, ALL) {
|
||||
if (dev->class != ATA_DEV_UNKNOWN)
|
||||
classes[dev->devno] = dev->class;
|
||||
else
|
||||
classes[dev->devno] = ATA_DEV_NONE;
|
||||
|
||||
dev->class = ATA_DEV_UNKNOWN;
|
||||
}
|
||||
|
||||
/* read IDENTIFY page and configure devices. We have to do the identify
|
||||
specific sequence bass-ackwards so that PDIAG- is released by
|
||||
the slave device */
|
||||
|
||||
ata_for_each_dev(dev, &ap->link, ALL_REVERSE) {
|
||||
if (tries[dev->devno])
|
||||
dev->class = classes[dev->devno];
|
||||
|
||||
if (!ata_dev_enabled(dev))
|
||||
continue;
|
||||
|
||||
rc = ata_dev_read_id(dev, &dev->class, ATA_READID_POSTRESET,
|
||||
dev->id);
|
||||
if (rc)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Now ask for the cable type as PDIAG- should have been released */
|
||||
if (ap->ops->cable_detect)
|
||||
ap->cbl = ap->ops->cable_detect(ap);
|
||||
|
||||
/* We may have SATA bridge glue hiding here irrespective of
|
||||
* the reported cable types and sensed types. When SATA
|
||||
* drives indicate we have a bridge, we don't know which end
|
||||
* of the link the bridge is which is a problem.
|
||||
*/
|
||||
ata_for_each_dev(dev, &ap->link, ENABLED)
|
||||
if (ata_id_is_sata(dev->id))
|
||||
ap->cbl = ATA_CBL_SATA;
|
||||
|
||||
/* After the identify sequence we can now set up the devices. We do
|
||||
this in the normal order so that the user doesn't get confused */
|
||||
|
||||
ata_for_each_dev(dev, &ap->link, ENABLED) {
|
||||
ap->link.eh_context.i.flags |= ATA_EHI_PRINTINFO;
|
||||
rc = ata_dev_configure(dev);
|
||||
ap->link.eh_context.i.flags &= ~ATA_EHI_PRINTINFO;
|
||||
if (rc)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* configure transfer mode */
|
||||
rc = ata_set_mode(&ap->link, &dev);
|
||||
if (rc)
|
||||
goto fail;
|
||||
|
||||
ata_for_each_dev(dev, &ap->link, ENABLED)
|
||||
return 0;
|
||||
|
||||
return -ENODEV;
|
||||
|
||||
fail:
|
||||
tries[dev->devno]--;
|
||||
|
||||
switch (rc) {
|
||||
case -EINVAL:
|
||||
/* eeek, something went very wrong, give up */
|
||||
tries[dev->devno] = 0;
|
||||
break;
|
||||
|
||||
case -ENODEV:
|
||||
/* give it just one more chance */
|
||||
tries[dev->devno] = min(tries[dev->devno], 1);
|
||||
fallthrough;
|
||||
case -EIO:
|
||||
if (tries[dev->devno] == 1) {
|
||||
/* This is the last chance, better to slow
|
||||
* down than lose it.
|
||||
*/
|
||||
sata_down_spd_limit(&ap->link, 0);
|
||||
ata_down_xfermask_limit(dev, ATA_DNXFER_PIO);
|
||||
}
|
||||
}
|
||||
|
||||
if (!tries[dev->devno])
|
||||
ata_dev_disable(dev);
|
||||
|
||||
goto retry;
|
||||
}
|
||||
|
||||
/**
|
||||
* sata_print_link_status - Print SATA link status
|
||||
* @link: SATA link to printk link status about
|
||||
@ -3782,7 +3639,7 @@ int ata_std_prereset(struct ata_link *link, unsigned long deadline)
|
||||
{
|
||||
struct ata_port *ap = link->ap;
|
||||
struct ata_eh_context *ehc = &link->eh_context;
|
||||
const unsigned long *timing = sata_ehc_deb_timing(ehc);
|
||||
const unsigned int *timing = sata_ehc_deb_timing(ehc);
|
||||
int rc;
|
||||
|
||||
/* if we're about to do hardreset, nothing more to do */
|
||||
@ -3824,7 +3681,7 @@ EXPORT_SYMBOL_GPL(ata_std_prereset);
|
||||
int sata_std_hardreset(struct ata_link *link, unsigned int *class,
|
||||
unsigned long deadline)
|
||||
{
|
||||
const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
|
||||
const unsigned int *timing = sata_ehc_deb_timing(&link->eh_context);
|
||||
bool online;
|
||||
int rc;
|
||||
|
||||
@ -4213,10 +4070,12 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM },
|
||||
{ "Micron_M500_*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM },
|
||||
{ "Crucial_CT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM },
|
||||
{ "Micron_M5[15]0_*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM },
|
||||
{ "Micron_1100_*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM, },
|
||||
{ "Crucial_CT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM },
|
||||
{ "Crucial_CT*M550*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM },
|
||||
{ "Crucial_CT*MX100*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
@ -4874,126 +4733,103 @@ static void ata_verify_xfer(struct ata_queued_cmd *qc)
|
||||
void ata_qc_complete(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct ata_port *ap = qc->ap;
|
||||
struct ata_device *dev = qc->dev;
|
||||
struct ata_eh_info *ehi = &dev->link->eh_info;
|
||||
|
||||
/* Trigger the LED (if available) */
|
||||
ledtrig_disk_activity(!!(qc->tf.flags & ATA_TFLAG_WRITE));
|
||||
|
||||
/* XXX: New EH and old EH use different mechanisms to
|
||||
* synchronize EH with regular execution path.
|
||||
/*
|
||||
* In order to synchronize EH with the regular execution path, a qc that
|
||||
* is owned by EH is marked with ATA_QCFLAG_EH.
|
||||
*
|
||||
* In new EH, a qc owned by EH is marked with ATA_QCFLAG_EH.
|
||||
* Normal execution path is responsible for not accessing a
|
||||
* qc owned by EH. libata core enforces the rule by returning NULL
|
||||
* from ata_qc_from_tag() for qcs owned by EH.
|
||||
*
|
||||
* Old EH depends on ata_qc_complete() nullifying completion
|
||||
* requests if ATA_QCFLAG_EH_SCHEDULED is set. Old EH does
|
||||
* not synchronize with interrupt handler. Only PIO task is
|
||||
* taken care of.
|
||||
* The normal execution path is responsible for not accessing a qc owned
|
||||
* by EH. libata core enforces the rule by returning NULL from
|
||||
* ata_qc_from_tag() for qcs owned by EH.
|
||||
*/
|
||||
if (ap->ops->error_handler) {
|
||||
struct ata_device *dev = qc->dev;
|
||||
struct ata_eh_info *ehi = &dev->link->eh_info;
|
||||
|
||||
if (unlikely(qc->err_mask))
|
||||
qc->flags |= ATA_QCFLAG_EH;
|
||||
|
||||
/*
|
||||
* Finish internal commands without any further processing
|
||||
* and always with the result TF filled.
|
||||
*/
|
||||
if (unlikely(ata_tag_internal(qc->tag))) {
|
||||
fill_result_tf(qc);
|
||||
trace_ata_qc_complete_internal(qc);
|
||||
__ata_qc_complete(qc);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Non-internal qc has failed. Fill the result TF and
|
||||
* summon EH.
|
||||
*/
|
||||
if (unlikely(qc->flags & ATA_QCFLAG_EH)) {
|
||||
fill_result_tf(qc);
|
||||
trace_ata_qc_complete_failed(qc);
|
||||
ata_qc_schedule_eh(qc);
|
||||
return;
|
||||
}
|
||||
|
||||
WARN_ON_ONCE(ata_port_is_frozen(ap));
|
||||
|
||||
/* read result TF if requested */
|
||||
if (qc->flags & ATA_QCFLAG_RESULT_TF)
|
||||
fill_result_tf(qc);
|
||||
|
||||
trace_ata_qc_complete_done(qc);
|
||||
|
||||
/*
|
||||
* For CDL commands that completed without an error, check if
|
||||
* we have sense data (ATA_SENSE is set). If we do, then the
|
||||
* command may have been aborted by the device due to a limit
|
||||
* timeout using the policy 0xD. For these commands, invoke EH
|
||||
* to get the command sense data.
|
||||
*/
|
||||
if (qc->result_tf.status & ATA_SENSE &&
|
||||
((ata_is_ncq(qc->tf.protocol) &&
|
||||
dev->flags & ATA_DFLAG_CDL_ENABLED) ||
|
||||
(!ata_is_ncq(qc->tf.protocol) &&
|
||||
ata_id_sense_reporting_enabled(dev->id)))) {
|
||||
/*
|
||||
* Tell SCSI EH to not overwrite scmd->result even if
|
||||
* this command is finished with result SAM_STAT_GOOD.
|
||||
*/
|
||||
qc->scsicmd->flags |= SCMD_FORCE_EH_SUCCESS;
|
||||
qc->flags |= ATA_QCFLAG_EH_SUCCESS_CMD;
|
||||
ehi->dev_action[dev->devno] |= ATA_EH_GET_SUCCESS_SENSE;
|
||||
|
||||
/*
|
||||
* set pending so that ata_qc_schedule_eh() does not
|
||||
* trigger fast drain, and freeze the port.
|
||||
*/
|
||||
ap->pflags |= ATA_PFLAG_EH_PENDING;
|
||||
ata_qc_schedule_eh(qc);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Some commands need post-processing after successful
|
||||
* completion.
|
||||
*/
|
||||
switch (qc->tf.command) {
|
||||
case ATA_CMD_SET_FEATURES:
|
||||
if (qc->tf.feature != SETFEATURES_WC_ON &&
|
||||
qc->tf.feature != SETFEATURES_WC_OFF &&
|
||||
qc->tf.feature != SETFEATURES_RA_ON &&
|
||||
qc->tf.feature != SETFEATURES_RA_OFF)
|
||||
break;
|
||||
fallthrough;
|
||||
case ATA_CMD_INIT_DEV_PARAMS: /* CHS translation changed */
|
||||
case ATA_CMD_SET_MULTI: /* multi_count changed */
|
||||
/* revalidate device */
|
||||
ehi->dev_action[dev->devno] |= ATA_EH_REVALIDATE;
|
||||
ata_port_schedule_eh(ap);
|
||||
break;
|
||||
|
||||
case ATA_CMD_SLEEP:
|
||||
dev->flags |= ATA_DFLAG_SLEEPING;
|
||||
break;
|
||||
}
|
||||
|
||||
if (unlikely(dev->flags & ATA_DFLAG_DUBIOUS_XFER))
|
||||
ata_verify_xfer(qc);
|
||||
|
||||
__ata_qc_complete(qc);
|
||||
} else {
|
||||
if (qc->flags & ATA_QCFLAG_EH_SCHEDULED)
|
||||
return;
|
||||
|
||||
/* read result TF if failed or requested */
|
||||
if (qc->err_mask || qc->flags & ATA_QCFLAG_RESULT_TF)
|
||||
fill_result_tf(qc);
|
||||
if (unlikely(qc->err_mask))
|
||||
qc->flags |= ATA_QCFLAG_EH;
|
||||
|
||||
/*
|
||||
* Finish internal commands without any further processing and always
|
||||
* with the result TF filled.
|
||||
*/
|
||||
if (unlikely(ata_tag_internal(qc->tag))) {
|
||||
fill_result_tf(qc);
|
||||
trace_ata_qc_complete_internal(qc);
|
||||
__ata_qc_complete(qc);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Non-internal qc has failed. Fill the result TF and summon EH. */
|
||||
if (unlikely(qc->flags & ATA_QCFLAG_EH)) {
|
||||
fill_result_tf(qc);
|
||||
trace_ata_qc_complete_failed(qc);
|
||||
ata_qc_schedule_eh(qc);
|
||||
return;
|
||||
}
|
||||
|
||||
WARN_ON_ONCE(ata_port_is_frozen(ap));
|
||||
|
||||
/* read result TF if requested */
|
||||
if (qc->flags & ATA_QCFLAG_RESULT_TF)
|
||||
fill_result_tf(qc);
|
||||
|
||||
trace_ata_qc_complete_done(qc);
|
||||
|
||||
/*
|
||||
* For CDL commands that completed without an error, check if we have
|
||||
* sense data (ATA_SENSE is set). If we do, then the command may have
|
||||
* been aborted by the device due to a limit timeout using the policy
|
||||
* 0xD. For these commands, invoke EH to get the command sense data.
|
||||
*/
|
||||
if (qc->result_tf.status & ATA_SENSE &&
|
||||
((ata_is_ncq(qc->tf.protocol) &&
|
||||
dev->flags & ATA_DFLAG_CDL_ENABLED) ||
|
||||
(!ata_is_ncq(qc->tf.protocol) &&
|
||||
ata_id_sense_reporting_enabled(dev->id)))) {
|
||||
/*
|
||||
* Tell SCSI EH to not overwrite scmd->result even if this
|
||||
* command is finished with result SAM_STAT_GOOD.
|
||||
*/
|
||||
qc->scsicmd->flags |= SCMD_FORCE_EH_SUCCESS;
|
||||
qc->flags |= ATA_QCFLAG_EH_SUCCESS_CMD;
|
||||
ehi->dev_action[dev->devno] |= ATA_EH_GET_SUCCESS_SENSE;
|
||||
|
||||
/*
|
||||
* set pending so that ata_qc_schedule_eh() does not trigger
|
||||
* fast drain, and freeze the port.
|
||||
*/
|
||||
ap->pflags |= ATA_PFLAG_EH_PENDING;
|
||||
ata_qc_schedule_eh(qc);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Some commands need post-processing after successful completion. */
|
||||
switch (qc->tf.command) {
|
||||
case ATA_CMD_SET_FEATURES:
|
||||
if (qc->tf.feature != SETFEATURES_WC_ON &&
|
||||
qc->tf.feature != SETFEATURES_WC_OFF &&
|
||||
qc->tf.feature != SETFEATURES_RA_ON &&
|
||||
qc->tf.feature != SETFEATURES_RA_OFF)
|
||||
break;
|
||||
fallthrough;
|
||||
case ATA_CMD_INIT_DEV_PARAMS: /* CHS translation changed */
|
||||
case ATA_CMD_SET_MULTI: /* multi_count changed */
|
||||
/* revalidate device */
|
||||
ehi->dev_action[dev->devno] |= ATA_EH_REVALIDATE;
|
||||
ata_port_schedule_eh(ap);
|
||||
break;
|
||||
|
||||
case ATA_CMD_SLEEP:
|
||||
dev->flags |= ATA_DFLAG_SLEEPING;
|
||||
break;
|
||||
}
|
||||
|
||||
if (unlikely(dev->flags & ATA_DFLAG_DUBIOUS_XFER))
|
||||
ata_verify_xfer(qc);
|
||||
|
||||
__ata_qc_complete(qc);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_qc_complete);
|
||||
|
||||
@ -5039,11 +4875,8 @@ void ata_qc_issue(struct ata_queued_cmd *qc)
|
||||
struct ata_link *link = qc->dev->link;
|
||||
u8 prot = qc->tf.protocol;
|
||||
|
||||
/* Make sure only one non-NCQ command is outstanding. The
|
||||
* check is skipped for old EH because it reuses active qc to
|
||||
* request ATAPI sense.
|
||||
*/
|
||||
WARN_ON_ONCE(ap->ops->error_handler && ata_tag_valid(link->active_tag));
|
||||
/* Make sure only one non-NCQ command is outstanding. */
|
||||
WARN_ON_ONCE(ata_tag_valid(link->active_tag));
|
||||
|
||||
if (ata_is_ncq(prot)) {
|
||||
WARN_ON_ONCE(link->sactive & (1 << qc->hw_tag));
|
||||
@ -5896,7 +5729,7 @@ void ata_host_init(struct ata_host *host, struct device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_host_init);
|
||||
|
||||
void __ata_port_probe(struct ata_port *ap)
|
||||
void ata_port_probe(struct ata_port *ap)
|
||||
{
|
||||
struct ata_eh_info *ehi = &ap->link.eh_info;
|
||||
unsigned long flags;
|
||||
@ -5914,20 +5747,7 @@ void __ata_port_probe(struct ata_port *ap)
|
||||
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
}
|
||||
|
||||
int ata_port_probe(struct ata_port *ap)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (ap->ops->error_handler) {
|
||||
__ata_port_probe(ap);
|
||||
ata_port_wait_eh(ap);
|
||||
} else {
|
||||
rc = ata_bus_probe(ap);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(ata_port_probe);
|
||||
|
||||
static void async_port_probe(void *data, async_cookie_t cookie)
|
||||
{
|
||||
@ -5943,7 +5763,8 @@ static void async_port_probe(void *data, async_cookie_t cookie)
|
||||
if (!(ap->host->flags & ATA_HOST_PARALLEL_SCAN) && ap->port_no != 0)
|
||||
async_synchronize_cookie(cookie);
|
||||
|
||||
(void)ata_port_probe(ap);
|
||||
ata_port_probe(ap);
|
||||
ata_port_wait_eh(ap);
|
||||
|
||||
/* in order to keep device order, we need to synchronize at this point */
|
||||
async_synchronize_cookie(cookie);
|
||||
@ -6130,9 +5951,6 @@ static void ata_port_detach(struct ata_port *ap)
|
||||
struct ata_link *link;
|
||||
struct ata_device *dev;
|
||||
|
||||
if (!ap->ops->error_handler)
|
||||
goto skip_eh;
|
||||
|
||||
/* tell EH we're leaving & flush EH */
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
ap->pflags |= ATA_PFLAG_UNLOADING;
|
||||
@ -6148,7 +5966,6 @@ static void ata_port_detach(struct ata_port *ap)
|
||||
cancel_delayed_work_sync(&ap->hotplug_task);
|
||||
cancel_delayed_work_sync(&ap->scsi_rescan_task);
|
||||
|
||||
skip_eh:
|
||||
/* clean up zpodd on port removal */
|
||||
ata_for_each_link(link, ap, HOST_FIRST) {
|
||||
ata_for_each_dev(dev, link, ALL) {
|
||||
@ -6684,7 +6501,7 @@ EXPORT_SYMBOL_GPL(ata_msleep);
|
||||
* The final register value.
|
||||
*/
|
||||
u32 ata_wait_register(struct ata_port *ap, void __iomem *reg, u32 mask, u32 val,
|
||||
unsigned long interval, unsigned long timeout)
|
||||
unsigned int interval, unsigned int timeout)
|
||||
{
|
||||
unsigned long deadline;
|
||||
u32 tmp;
|
||||
|
@ -78,12 +78,12 @@ enum {
|
||||
* are mostly for error handling, hotplug and those outlier devices that
|
||||
* take an exceptionally long time to recover from reset.
|
||||
*/
|
||||
static const unsigned long ata_eh_reset_timeouts[] = {
|
||||
static const unsigned int ata_eh_reset_timeouts[] = {
|
||||
10000, /* most drives spin up by 10sec */
|
||||
10000, /* > 99% working drives spin up before 20sec */
|
||||
35000, /* give > 30 secs of idleness for outlier devices */
|
||||
5000, /* and sweet one last chance */
|
||||
ULONG_MAX, /* > 1 min has elapsed, give up */
|
||||
UINT_MAX, /* > 1 min has elapsed, give up */
|
||||
};
|
||||
|
||||
static const unsigned int ata_eh_identify_timeouts[] = {
|
||||
@ -571,13 +571,10 @@ void ata_scsi_cmd_error_handler(struct Scsi_Host *host, struct ata_port *ap,
|
||||
/* make sure sff pio task is not running */
|
||||
ata_sff_flush_pio_task(ap);
|
||||
|
||||
if (!ap->ops->error_handler)
|
||||
return;
|
||||
|
||||
/* synchronize with host lock and sort out timeouts */
|
||||
|
||||
/*
|
||||
* For new EH, all qcs are finished in one of three ways -
|
||||
* For EH, all qcs are finished in one of three ways -
|
||||
* normal completion, error completion, and SCSI timeout.
|
||||
* Both completions can race against SCSI timeout. When normal
|
||||
* completion wins, the qc never reaches EH. When error
|
||||
@ -659,95 +656,88 @@ EXPORT_SYMBOL(ata_scsi_cmd_error_handler);
|
||||
void ata_scsi_port_error_handler(struct Scsi_Host *host, struct ata_port *ap)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct ata_link *link;
|
||||
|
||||
/* invoke error handler */
|
||||
if (ap->ops->error_handler) {
|
||||
struct ata_link *link;
|
||||
|
||||
/* acquire EH ownership */
|
||||
ata_eh_acquire(ap);
|
||||
/* acquire EH ownership */
|
||||
ata_eh_acquire(ap);
|
||||
repeat:
|
||||
/* kill fast drain timer */
|
||||
del_timer_sync(&ap->fastdrain_timer);
|
||||
/* kill fast drain timer */
|
||||
del_timer_sync(&ap->fastdrain_timer);
|
||||
|
||||
/* process port resume request */
|
||||
ata_eh_handle_port_resume(ap);
|
||||
/* process port resume request */
|
||||
ata_eh_handle_port_resume(ap);
|
||||
|
||||
/* fetch & clear EH info */
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
/* fetch & clear EH info */
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
|
||||
ata_for_each_link(link, ap, HOST_FIRST) {
|
||||
struct ata_eh_context *ehc = &link->eh_context;
|
||||
struct ata_device *dev;
|
||||
ata_for_each_link(link, ap, HOST_FIRST) {
|
||||
struct ata_eh_context *ehc = &link->eh_context;
|
||||
struct ata_device *dev;
|
||||
|
||||
memset(&link->eh_context, 0, sizeof(link->eh_context));
|
||||
link->eh_context.i = link->eh_info;
|
||||
memset(&link->eh_info, 0, sizeof(link->eh_info));
|
||||
memset(&link->eh_context, 0, sizeof(link->eh_context));
|
||||
link->eh_context.i = link->eh_info;
|
||||
memset(&link->eh_info, 0, sizeof(link->eh_info));
|
||||
|
||||
ata_for_each_dev(dev, link, ENABLED) {
|
||||
int devno = dev->devno;
|
||||
ata_for_each_dev(dev, link, ENABLED) {
|
||||
int devno = dev->devno;
|
||||
|
||||
ehc->saved_xfer_mode[devno] = dev->xfer_mode;
|
||||
if (ata_ncq_enabled(dev))
|
||||
ehc->saved_ncq_enabled |= 1 << devno;
|
||||
}
|
||||
ehc->saved_xfer_mode[devno] = dev->xfer_mode;
|
||||
if (ata_ncq_enabled(dev))
|
||||
ehc->saved_ncq_enabled |= 1 << devno;
|
||||
}
|
||||
|
||||
ap->pflags |= ATA_PFLAG_EH_IN_PROGRESS;
|
||||
ap->pflags &= ~ATA_PFLAG_EH_PENDING;
|
||||
ap->excl_link = NULL; /* don't maintain exclusion over EH */
|
||||
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
|
||||
/* invoke EH, skip if unloading or suspended */
|
||||
if (!(ap->pflags & (ATA_PFLAG_UNLOADING | ATA_PFLAG_SUSPENDED)))
|
||||
ap->ops->error_handler(ap);
|
||||
else {
|
||||
/* if unloading, commence suicide */
|
||||
if ((ap->pflags & ATA_PFLAG_UNLOADING) &&
|
||||
!(ap->pflags & ATA_PFLAG_UNLOADED))
|
||||
ata_eh_unload(ap);
|
||||
ata_eh_finish(ap);
|
||||
}
|
||||
|
||||
/* process port suspend request */
|
||||
ata_eh_handle_port_suspend(ap);
|
||||
|
||||
/* Exception might have happened after ->error_handler
|
||||
* recovered the port but before this point. Repeat
|
||||
* EH in such case.
|
||||
*/
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
|
||||
if (ap->pflags & ATA_PFLAG_EH_PENDING) {
|
||||
if (--ap->eh_tries) {
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
goto repeat;
|
||||
}
|
||||
ata_port_err(ap,
|
||||
"EH pending after %d tries, giving up\n",
|
||||
ATA_EH_MAX_TRIES);
|
||||
ap->pflags &= ~ATA_PFLAG_EH_PENDING;
|
||||
}
|
||||
|
||||
/* this run is complete, make sure EH info is clear */
|
||||
ata_for_each_link(link, ap, HOST_FIRST)
|
||||
memset(&link->eh_info, 0, sizeof(link->eh_info));
|
||||
|
||||
/* end eh (clear host_eh_scheduled) while holding
|
||||
* ap->lock such that if exception occurs after this
|
||||
* point but before EH completion, SCSI midlayer will
|
||||
* re-initiate EH.
|
||||
*/
|
||||
ap->ops->end_eh(ap);
|
||||
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
ata_eh_release(ap);
|
||||
} else {
|
||||
WARN_ON(ata_qc_from_tag(ap, ap->link.active_tag) == NULL);
|
||||
ap->ops->eng_timeout(ap);
|
||||
}
|
||||
|
||||
ap->pflags |= ATA_PFLAG_EH_IN_PROGRESS;
|
||||
ap->pflags &= ~ATA_PFLAG_EH_PENDING;
|
||||
ap->excl_link = NULL; /* don't maintain exclusion over EH */
|
||||
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
|
||||
/* invoke EH, skip if unloading or suspended */
|
||||
if (!(ap->pflags & (ATA_PFLAG_UNLOADING | ATA_PFLAG_SUSPENDED)))
|
||||
ap->ops->error_handler(ap);
|
||||
else {
|
||||
/* if unloading, commence suicide */
|
||||
if ((ap->pflags & ATA_PFLAG_UNLOADING) &&
|
||||
!(ap->pflags & ATA_PFLAG_UNLOADED))
|
||||
ata_eh_unload(ap);
|
||||
ata_eh_finish(ap);
|
||||
}
|
||||
|
||||
/* process port suspend request */
|
||||
ata_eh_handle_port_suspend(ap);
|
||||
|
||||
/*
|
||||
* Exception might have happened after ->error_handler recovered the
|
||||
* port but before this point. Repeat EH in such case.
|
||||
*/
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
|
||||
if (ap->pflags & ATA_PFLAG_EH_PENDING) {
|
||||
if (--ap->eh_tries) {
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
goto repeat;
|
||||
}
|
||||
ata_port_err(ap,
|
||||
"EH pending after %d tries, giving up\n",
|
||||
ATA_EH_MAX_TRIES);
|
||||
ap->pflags &= ~ATA_PFLAG_EH_PENDING;
|
||||
}
|
||||
|
||||
/* this run is complete, make sure EH info is clear */
|
||||
ata_for_each_link(link, ap, HOST_FIRST)
|
||||
memset(&link->eh_info, 0, sizeof(link->eh_info));
|
||||
|
||||
/*
|
||||
* end eh (clear host_eh_scheduled) while holding ap->lock such that if
|
||||
* exception occurs after this point but before EH completion, SCSI
|
||||
* midlayer will re-initiate EH.
|
||||
*/
|
||||
ap->ops->end_eh(ap);
|
||||
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
ata_eh_release(ap);
|
||||
|
||||
scsi_eh_flush_done_q(&ap->eh_done_q);
|
||||
|
||||
/* clean up */
|
||||
@ -912,8 +902,6 @@ void ata_qc_schedule_eh(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct ata_port *ap = qc->ap;
|
||||
|
||||
WARN_ON(!ap->ops->error_handler);
|
||||
|
||||
qc->flags |= ATA_QCFLAG_EH;
|
||||
ata_eh_set_pending(ap, 1);
|
||||
|
||||
@ -934,8 +922,6 @@ void ata_qc_schedule_eh(struct ata_queued_cmd *qc)
|
||||
*/
|
||||
void ata_std_sched_eh(struct ata_port *ap)
|
||||
{
|
||||
WARN_ON(!ap->ops->error_handler);
|
||||
|
||||
if (ap->pflags & ATA_PFLAG_INITIALIZING)
|
||||
return;
|
||||
|
||||
@ -989,8 +975,6 @@ static int ata_do_link_abort(struct ata_port *ap, struct ata_link *link)
|
||||
struct ata_queued_cmd *qc;
|
||||
int tag, nr_aborted = 0;
|
||||
|
||||
WARN_ON(!ap->ops->error_handler);
|
||||
|
||||
/* we're gonna abort all commands, no need for fast drain */
|
||||
ata_eh_set_pending(ap, 0);
|
||||
|
||||
@ -1065,8 +1049,6 @@ EXPORT_SYMBOL_GPL(ata_port_abort);
|
||||
*/
|
||||
static void __ata_port_freeze(struct ata_port *ap)
|
||||
{
|
||||
WARN_ON(!ap->ops->error_handler);
|
||||
|
||||
if (ap->ops->freeze)
|
||||
ap->ops->freeze(ap);
|
||||
|
||||
@ -1091,8 +1073,6 @@ static void __ata_port_freeze(struct ata_port *ap)
|
||||
*/
|
||||
int ata_port_freeze(struct ata_port *ap)
|
||||
{
|
||||
WARN_ON(!ap->ops->error_handler);
|
||||
|
||||
__ata_port_freeze(ap);
|
||||
|
||||
return ata_port_abort(ap);
|
||||
@ -1112,9 +1092,6 @@ void ata_eh_freeze_port(struct ata_port *ap)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!ap->ops->error_handler)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
__ata_port_freeze(ap);
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
@ -1134,9 +1111,6 @@ void ata_eh_thaw_port(struct ata_port *ap)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!ap->ops->error_handler)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
|
||||
ap->pflags &= ~ATA_PFLAG_FROZEN;
|
||||
@ -2575,7 +2549,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
||||
/*
|
||||
* Prepare to reset
|
||||
*/
|
||||
while (ata_eh_reset_timeouts[max_tries] != ULONG_MAX)
|
||||
while (ata_eh_reset_timeouts[max_tries] != UINT_MAX)
|
||||
max_tries++;
|
||||
if (link->flags & ATA_LFLAG_RST_ONCE)
|
||||
max_tries = 1;
|
||||
|
@ -19,11 +19,11 @@
|
||||
#include "libata-transport.h"
|
||||
|
||||
/* debounce timing parameters in msecs { interval, duration, timeout } */
|
||||
const unsigned long sata_deb_timing_normal[] = { 5, 100, 2000 };
|
||||
const unsigned int sata_deb_timing_normal[] = { 5, 100, 2000 };
|
||||
EXPORT_SYMBOL_GPL(sata_deb_timing_normal);
|
||||
const unsigned long sata_deb_timing_hotplug[] = { 25, 500, 2000 };
|
||||
const unsigned int sata_deb_timing_hotplug[] = { 25, 500, 2000 };
|
||||
EXPORT_SYMBOL_GPL(sata_deb_timing_hotplug);
|
||||
const unsigned long sata_deb_timing_long[] = { 100, 2000, 5000 };
|
||||
const unsigned int sata_deb_timing_long[] = { 100, 2000, 5000 };
|
||||
EXPORT_SYMBOL_GPL(sata_deb_timing_long);
|
||||
|
||||
/**
|
||||
@ -232,11 +232,11 @@ EXPORT_SYMBOL_GPL(ata_tf_from_fis);
|
||||
* RETURNS:
|
||||
* 0 on success, -errno on failure.
|
||||
*/
|
||||
int sata_link_debounce(struct ata_link *link, const unsigned long *params,
|
||||
int sata_link_debounce(struct ata_link *link, const unsigned int *params,
|
||||
unsigned long deadline)
|
||||
{
|
||||
unsigned long interval = params[0];
|
||||
unsigned long duration = params[1];
|
||||
unsigned int interval = params[0];
|
||||
unsigned int duration = params[1];
|
||||
unsigned long last_jiffies, t;
|
||||
u32 last, cur;
|
||||
int rc;
|
||||
@ -295,7 +295,7 @@ EXPORT_SYMBOL_GPL(sata_link_debounce);
|
||||
* RETURNS:
|
||||
* 0 on success, -errno on failure.
|
||||
*/
|
||||
int sata_link_resume(struct ata_link *link, const unsigned long *params,
|
||||
int sata_link_resume(struct ata_link *link, const unsigned int *params,
|
||||
unsigned long deadline)
|
||||
{
|
||||
int tries = ATA_LINK_RESUME_TRIES;
|
||||
@ -528,7 +528,7 @@ EXPORT_SYMBOL_GPL(sata_set_spd);
|
||||
* RETURNS:
|
||||
* 0 on success, -errno otherwise.
|
||||
*/
|
||||
int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
|
||||
int sata_link_hardreset(struct ata_link *link, const unsigned int *timing,
|
||||
unsigned long deadline,
|
||||
bool *online, int (*check_ready)(struct ata_link *))
|
||||
{
|
||||
@ -1139,92 +1139,12 @@ struct ata_port *ata_sas_port_alloc(struct ata_host *host,
|
||||
ap->flags |= port_info->flags;
|
||||
ap->ops = port_info->port_ops;
|
||||
ap->cbl = ATA_CBL_SATA;
|
||||
ap->print_id = atomic_inc_return(&ata_print_id);
|
||||
|
||||
return ap;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
|
||||
|
||||
/**
|
||||
* ata_sas_port_start - Set port up for dma.
|
||||
* @ap: Port to initialize
|
||||
*
|
||||
* Called just after data structures for each port are
|
||||
* initialized.
|
||||
*
|
||||
* May be used as the port_start() entry in ata_port_operations.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from caller.
|
||||
*/
|
||||
int ata_sas_port_start(struct ata_port *ap)
|
||||
{
|
||||
/*
|
||||
* the port is marked as frozen at allocation time, but if we don't
|
||||
* have new eh, we won't thaw it
|
||||
*/
|
||||
if (!ap->ops->error_handler)
|
||||
ap->pflags &= ~ATA_PFLAG_FROZEN;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_start);
|
||||
|
||||
/**
|
||||
* ata_sas_port_stop - Undo ata_sas_port_start()
|
||||
* @ap: Port to shut down
|
||||
*
|
||||
* May be used as the port_stop() entry in ata_port_operations.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from caller.
|
||||
*/
|
||||
|
||||
void ata_sas_port_stop(struct ata_port *ap)
|
||||
{
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_stop);
|
||||
|
||||
/**
|
||||
* ata_sas_async_probe - simply schedule probing and return
|
||||
* @ap: Port to probe
|
||||
*
|
||||
* For batch scheduling of probe for sas attached ata devices, assumes
|
||||
* the port has already been through ata_sas_port_init()
|
||||
*/
|
||||
void ata_sas_async_probe(struct ata_port *ap)
|
||||
{
|
||||
__ata_port_probe(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_async_probe);
|
||||
|
||||
int ata_sas_sync_probe(struct ata_port *ap)
|
||||
{
|
||||
return ata_port_probe(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_sync_probe);
|
||||
|
||||
|
||||
/**
|
||||
* ata_sas_port_init - Initialize a SATA device
|
||||
* @ap: SATA port to initialize
|
||||
*
|
||||
* LOCKING:
|
||||
* PCI/etc. bus probe sem.
|
||||
*
|
||||
* RETURNS:
|
||||
* Zero on success, non-zero on error.
|
||||
*/
|
||||
|
||||
int ata_sas_port_init(struct ata_port *ap)
|
||||
{
|
||||
int rc = ap->ops->port_start(ap);
|
||||
|
||||
if (rc)
|
||||
return rc;
|
||||
ap->print_id = atomic_inc_return(&ata_print_id);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_init);
|
||||
|
||||
int ata_sas_tport_add(struct device *parent, struct ata_port *ap)
|
||||
{
|
||||
return ata_tport_add(parent, ap);
|
||||
@ -1237,20 +1157,6 @@ void ata_sas_tport_delete(struct ata_port *ap)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_tport_delete);
|
||||
|
||||
/**
|
||||
* ata_sas_port_destroy - Destroy a SATA port allocated by ata_sas_port_alloc
|
||||
* @ap: SATA port to destroy
|
||||
*
|
||||
*/
|
||||
|
||||
void ata_sas_port_destroy(struct ata_port *ap)
|
||||
{
|
||||
if (ap->ops->port_stop)
|
||||
ap->ops->port_stop(ap);
|
||||
kfree(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_destroy);
|
||||
|
||||
/**
|
||||
* ata_sas_slave_configure - Default slave_config routine for libata devices
|
||||
* @sdev: SCSI device to configure
|
||||
|
@ -135,11 +135,11 @@ static ssize_t ata_scsi_park_store(struct device *device,
|
||||
struct scsi_device *sdev = to_scsi_device(device);
|
||||
struct ata_port *ap;
|
||||
struct ata_device *dev;
|
||||
long int input;
|
||||
int input;
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
rc = kstrtol(buf, 10, &input);
|
||||
rc = kstrtoint(buf, 10, &input);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (input < -2)
|
||||
@ -709,47 +709,6 @@ static void ata_qc_set_pc_nbytes(struct ata_queued_cmd *qc)
|
||||
qc->nbytes = scsi_bufflen(scmd) + qc->extrabytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_dump_status - user friendly display of error info
|
||||
* @ap: the port in question
|
||||
* @tf: ptr to filled out taskfile
|
||||
*
|
||||
* Decode and dump the ATA error/status registers for the user so
|
||||
* that they have some idea what really happened at the non
|
||||
* make-believe layer.
|
||||
*
|
||||
* LOCKING:
|
||||
* inherited from caller
|
||||
*/
|
||||
static void ata_dump_status(struct ata_port *ap, struct ata_taskfile *tf)
|
||||
{
|
||||
u8 stat = tf->status, err = tf->error;
|
||||
|
||||
if (stat & ATA_BUSY) {
|
||||
ata_port_warn(ap, "status=0x%02x {Busy} ", stat);
|
||||
} else {
|
||||
ata_port_warn(ap, "status=0x%02x { %s%s%s%s%s%s%s} ", stat,
|
||||
stat & ATA_DRDY ? "DriveReady " : "",
|
||||
stat & ATA_DF ? "DeviceFault " : "",
|
||||
stat & ATA_DSC ? "SeekComplete " : "",
|
||||
stat & ATA_DRQ ? "DataRequest " : "",
|
||||
stat & ATA_CORR ? "CorrectedError " : "",
|
||||
stat & ATA_SENSE ? "Sense " : "",
|
||||
stat & ATA_ERR ? "Error " : "");
|
||||
if (err)
|
||||
ata_port_warn(ap, "error=0x%02x {%s%s%s%s%s%s", err,
|
||||
err & ATA_ABORTED ?
|
||||
"DriveStatusError " : "",
|
||||
err & ATA_ICRC ?
|
||||
(err & ATA_ABORTED ?
|
||||
"BadCRC " : "Sector ") : "",
|
||||
err & ATA_UNC ? "UncorrectableError " : "",
|
||||
err & ATA_IDNF ? "SectorIdNotFound " : "",
|
||||
err & ATA_TRK0NF ? "TrackZeroNotFound " : "",
|
||||
err & ATA_AMNF ? "AddrMarkNotFound " : "");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_to_sense_error - convert ATA error to SCSI error
|
||||
* @id: ATA device number
|
||||
@ -758,7 +717,6 @@ static void ata_dump_status(struct ata_port *ap, struct ata_taskfile *tf)
|
||||
* @sk: the sense key we'll fill out
|
||||
* @asc: the additional sense code we'll fill out
|
||||
* @ascq: the additional sense code qualifier we'll fill out
|
||||
* @verbose: be verbose
|
||||
*
|
||||
* Converts an ATA error into a SCSI error. Fill out pointers to
|
||||
* SK, ASC, and ASCQ bytes for later use in fixed or descriptor
|
||||
@ -768,7 +726,7 @@ static void ata_dump_status(struct ata_port *ap, struct ata_taskfile *tf)
|
||||
* spin_lock_irqsave(host lock)
|
||||
*/
|
||||
static void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk,
|
||||
u8 *asc, u8 *ascq, int verbose)
|
||||
u8 *asc, u8 *ascq)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -847,7 +805,7 @@ static void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk,
|
||||
*sk = sense_table[i][1];
|
||||
*asc = sense_table[i][2];
|
||||
*ascq = sense_table[i][3];
|
||||
goto translate_done;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -862,7 +820,7 @@ static void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk,
|
||||
*sk = stat_table[i][1];
|
||||
*asc = stat_table[i][2];
|
||||
*ascq = stat_table[i][3];
|
||||
goto translate_done;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@ -873,12 +831,6 @@ static void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk,
|
||||
*sk = ABORTED_COMMAND;
|
||||
*asc = 0x00;
|
||||
*ascq = 0x00;
|
||||
|
||||
translate_done:
|
||||
if (verbose)
|
||||
pr_err("ata%u: translated ATA stat/err 0x%02x/%02x to SCSI SK/ASC/ASCQ 0x%x/%02x/%02x\n",
|
||||
id, drv_stat, drv_err, *sk, *asc, *ascq);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -904,7 +856,6 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
|
||||
struct ata_taskfile *tf = &qc->result_tf;
|
||||
unsigned char *sb = cmd->sense_buffer;
|
||||
unsigned char *desc = sb + 8;
|
||||
int verbose = qc->ap->ops->error_handler == NULL;
|
||||
u8 sense_key, asc, ascq;
|
||||
|
||||
memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
|
||||
@ -916,7 +867,7 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
|
||||
if (qc->err_mask ||
|
||||
tf->status & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) {
|
||||
ata_to_sense_error(qc->ap->print_id, tf->status, tf->error,
|
||||
&sense_key, &asc, &ascq, verbose);
|
||||
&sense_key, &asc, &ascq);
|
||||
ata_scsi_set_sense(qc->dev, cmd, sense_key, asc, ascq);
|
||||
} else {
|
||||
/*
|
||||
@ -999,7 +950,6 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
|
||||
struct scsi_cmnd *cmd = qc->scsicmd;
|
||||
struct ata_taskfile *tf = &qc->result_tf;
|
||||
unsigned char *sb = cmd->sense_buffer;
|
||||
int verbose = qc->ap->ops->error_handler == NULL;
|
||||
u64 block;
|
||||
u8 sense_key, asc, ascq;
|
||||
|
||||
@ -1017,7 +967,7 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
|
||||
if (qc->err_mask ||
|
||||
tf->status & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) {
|
||||
ata_to_sense_error(qc->ap->print_id, tf->status, tf->error,
|
||||
&sense_key, &asc, &ascq, verbose);
|
||||
&sense_key, &asc, &ascq);
|
||||
ata_scsi_set_sense(dev, cmd, sense_key, asc, ascq);
|
||||
} else {
|
||||
/* Could not decode error */
|
||||
@ -1186,9 +1136,6 @@ void ata_scsi_slave_destroy(struct scsi_device *sdev)
|
||||
unsigned long flags;
|
||||
struct ata_device *dev;
|
||||
|
||||
if (!ap->ops->error_handler)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
dev = __ata_scsi_find_dev(ap, sdev);
|
||||
if (dev && dev->sdev) {
|
||||
@ -1675,7 +1622,6 @@ static void ata_qc_done(struct ata_queued_cmd *qc)
|
||||
|
||||
static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct ata_port *ap = qc->ap;
|
||||
struct scsi_cmnd *cmd = qc->scsicmd;
|
||||
u8 *cdb = cmd->cmnd;
|
||||
int need_sense = (qc->err_mask != 0) &&
|
||||
@ -1699,9 +1645,6 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
|
||||
/* Keep the SCSI ML and status byte, clear host byte. */
|
||||
cmd->result &= 0x0000ffff;
|
||||
|
||||
if (need_sense && !ap->ops->error_handler)
|
||||
ata_dump_status(ap, &qc->result_tf);
|
||||
|
||||
ata_qc_done(qc);
|
||||
}
|
||||
|
||||
@ -2608,71 +2551,6 @@ static unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void atapi_sense_complete(struct ata_queued_cmd *qc)
|
||||
{
|
||||
if (qc->err_mask && ((qc->err_mask & AC_ERR_DEV) == 0)) {
|
||||
/* FIXME: not quite right; we don't want the
|
||||
* translation of taskfile registers into
|
||||
* a sense descriptors, since that's only
|
||||
* correct for ATA, not ATAPI
|
||||
*/
|
||||
ata_gen_passthru_sense(qc);
|
||||
}
|
||||
|
||||
ata_qc_done(qc);
|
||||
}
|
||||
|
||||
/* is it pointless to prefer PIO for "safety reasons"? */
|
||||
static inline int ata_pio_use_silly(struct ata_port *ap)
|
||||
{
|
||||
return (ap->flags & ATA_FLAG_PIO_DMA);
|
||||
}
|
||||
|
||||
static void atapi_request_sense(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct ata_port *ap = qc->ap;
|
||||
struct scsi_cmnd *cmd = qc->scsicmd;
|
||||
|
||||
memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
|
||||
|
||||
#ifdef CONFIG_ATA_SFF
|
||||
if (ap->ops->sff_tf_read)
|
||||
ap->ops->sff_tf_read(ap, &qc->tf);
|
||||
#endif
|
||||
|
||||
/* fill these in, for the case where they are -not- overwritten */
|
||||
cmd->sense_buffer[0] = 0x70;
|
||||
cmd->sense_buffer[2] = qc->tf.error >> 4;
|
||||
|
||||
ata_qc_reinit(qc);
|
||||
|
||||
/* setup sg table and init transfer direction */
|
||||
sg_init_one(&qc->sgent, cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE);
|
||||
ata_sg_init(qc, &qc->sgent, 1);
|
||||
qc->dma_dir = DMA_FROM_DEVICE;
|
||||
|
||||
memset(&qc->cdb, 0, qc->dev->cdb_len);
|
||||
qc->cdb[0] = REQUEST_SENSE;
|
||||
qc->cdb[4] = SCSI_SENSE_BUFFERSIZE;
|
||||
|
||||
qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
|
||||
qc->tf.command = ATA_CMD_PACKET;
|
||||
|
||||
if (ata_pio_use_silly(ap)) {
|
||||
qc->tf.protocol = ATAPI_PROT_DMA;
|
||||
qc->tf.feature |= ATAPI_PKT_DMA;
|
||||
} else {
|
||||
qc->tf.protocol = ATAPI_PROT_PIO;
|
||||
qc->tf.lbam = SCSI_SENSE_BUFFERSIZE;
|
||||
qc->tf.lbah = 0;
|
||||
}
|
||||
qc->nbytes = SCSI_SENSE_BUFFERSIZE;
|
||||
|
||||
qc->complete_fn = atapi_sense_complete;
|
||||
|
||||
ata_qc_issue(qc);
|
||||
}
|
||||
|
||||
/*
|
||||
* ATAPI devices typically report zero for their SCSI version, and sometimes
|
||||
* deviate from the spec WRT response data format. If SCSI version is
|
||||
@ -2698,9 +2576,8 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
|
||||
struct scsi_cmnd *cmd = qc->scsicmd;
|
||||
unsigned int err_mask = qc->err_mask;
|
||||
|
||||
/* handle completion from new EH */
|
||||
if (unlikely(qc->ap->ops->error_handler &&
|
||||
(err_mask || qc->flags & ATA_QCFLAG_SENSE_VALID))) {
|
||||
/* handle completion from EH */
|
||||
if (unlikely(err_mask || qc->flags & ATA_QCFLAG_SENSE_VALID)) {
|
||||
|
||||
if (!(qc->flags & ATA_QCFLAG_SENSE_VALID)) {
|
||||
/* FIXME: not quite right; we don't want the
|
||||
@ -2732,23 +2609,10 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
|
||||
return;
|
||||
}
|
||||
|
||||
/* successful completion or old EH failure path */
|
||||
if (unlikely(err_mask & AC_ERR_DEV)) {
|
||||
cmd->result = SAM_STAT_CHECK_CONDITION;
|
||||
atapi_request_sense(qc);
|
||||
return;
|
||||
} else if (unlikely(err_mask)) {
|
||||
/* FIXME: not quite right; we don't want the
|
||||
* translation of taskfile registers into
|
||||
* a sense descriptors, since that's only
|
||||
* correct for ATA, not ATAPI
|
||||
*/
|
||||
ata_gen_passthru_sense(qc);
|
||||
} else {
|
||||
if (cmd->cmnd[0] == INQUIRY && (cmd->cmnd[1] & 0x03) == 0)
|
||||
atapi_fixup_inquiry(cmd);
|
||||
cmd->result = SAM_STAT_GOOD;
|
||||
}
|
||||
/* successful completion path */
|
||||
if (cmd->cmnd[0] == INQUIRY && (cmd->cmnd[1] & 0x03) == 0)
|
||||
atapi_fixup_inquiry(cmd);
|
||||
cmd->result = SAM_STAT_GOOD;
|
||||
|
||||
ata_qc_done(qc);
|
||||
}
|
||||
@ -4797,9 +4661,6 @@ int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
|
||||
unsigned long flags;
|
||||
int devno, rc = 0;
|
||||
|
||||
if (!ap->ops->error_handler)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (lun != SCAN_WILD_CARD && lun)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -883,31 +883,21 @@ static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq)
|
||||
{
|
||||
struct ata_port *ap = qc->ap;
|
||||
|
||||
if (ap->ops->error_handler) {
|
||||
if (in_wq) {
|
||||
/* EH might have kicked in while host lock is
|
||||
* released.
|
||||
*/
|
||||
qc = ata_qc_from_tag(ap, qc->tag);
|
||||
if (qc) {
|
||||
if (likely(!(qc->err_mask & AC_ERR_HSM))) {
|
||||
ata_sff_irq_on(ap);
|
||||
ata_qc_complete(qc);
|
||||
} else
|
||||
ata_port_freeze(ap);
|
||||
}
|
||||
} else {
|
||||
if (likely(!(qc->err_mask & AC_ERR_HSM)))
|
||||
if (in_wq) {
|
||||
/* EH might have kicked in while host lock is released. */
|
||||
qc = ata_qc_from_tag(ap, qc->tag);
|
||||
if (qc) {
|
||||
if (likely(!(qc->err_mask & AC_ERR_HSM))) {
|
||||
ata_sff_irq_on(ap);
|
||||
ata_qc_complete(qc);
|
||||
else
|
||||
} else
|
||||
ata_port_freeze(ap);
|
||||
}
|
||||
} else {
|
||||
if (in_wq) {
|
||||
ata_sff_irq_on(ap);
|
||||
ata_qc_complete(qc);
|
||||
} else
|
||||
if (likely(!(qc->err_mask & AC_ERR_HSM)))
|
||||
ata_qc_complete(qc);
|
||||
else
|
||||
ata_port_freeze(ap);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1971,7 +1961,7 @@ int sata_sff_hardreset(struct ata_link *link, unsigned int *class,
|
||||
unsigned long deadline)
|
||||
{
|
||||
struct ata_eh_context *ehc = &link->eh_context;
|
||||
const unsigned long *timing = sata_ehc_deb_timing(ehc);
|
||||
const unsigned int *timing = sata_ehc_deb_timing(ehc);
|
||||
bool online;
|
||||
int rc;
|
||||
|
||||
|
@ -78,8 +78,6 @@ extern int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg);
|
||||
extern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg);
|
||||
extern struct ata_port *ata_port_alloc(struct ata_host *host);
|
||||
extern const char *sata_spd_string(unsigned int spd);
|
||||
extern int ata_port_probe(struct ata_port *ap);
|
||||
extern void __ata_port_probe(struct ata_port *ap);
|
||||
extern unsigned int ata_read_log_page(struct ata_device *dev, u8 log,
|
||||
u8 page, void *buf, unsigned int sectors);
|
||||
|
||||
@ -124,7 +122,6 @@ extern void ata_scsi_media_change_notify(struct ata_device *dev);
|
||||
extern void ata_scsi_hotplug(struct work_struct *work);
|
||||
extern void ata_schedule_scsi_eh(struct Scsi_Host *shost);
|
||||
extern void ata_scsi_dev_rescan(struct work_struct *work);
|
||||
extern int ata_bus_probe(struct ata_port *ap);
|
||||
extern int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
|
||||
unsigned int id, u64 lun);
|
||||
void ata_scsi_sdev_config(struct scsi_device *sdev);
|
||||
|
@ -917,15 +917,13 @@ static int arasan_cf_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int arasan_cf_remove(struct platform_device *pdev)
|
||||
static void arasan_cf_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ata_host *host = platform_get_drvdata(pdev);
|
||||
struct arasan_cf_dev *acdev = host->ports[0]->private_data;
|
||||
|
||||
ata_host_detach(host);
|
||||
cf_exit(acdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
@ -966,7 +964,7 @@ MODULE_DEVICE_TABLE(of, arasan_cf_id_table);
|
||||
|
||||
static struct platform_driver arasan_cf_driver = {
|
||||
.probe = arasan_cf_probe,
|
||||
.remove = arasan_cf_remove,
|
||||
.remove_new = arasan_cf_remove,
|
||||
.driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.pm = &arasan_cf_pm_ops,
|
||||
|
@ -27,7 +27,6 @@
|
||||
|
||||
#include <asm/amigahw.h>
|
||||
#include <asm/amigaints.h>
|
||||
#include <asm/ide.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
#define DRV_NAME "pata_buddha"
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include <linux/ata.h>
|
||||
#include <linux/libata.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sys_soc.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/ktime.h>
|
||||
@ -910,6 +911,12 @@ static struct ata_port_operations ep93xx_pata_port_ops = {
|
||||
.port_start = ep93xx_pata_port_start,
|
||||
};
|
||||
|
||||
static const struct soc_device_attribute ep93xx_soc_table[] = {
|
||||
{ .revision = "E1", .data = (void *)ATA_UDMA3 },
|
||||
{ .revision = "E2", .data = (void *)ATA_UDMA4 },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static int ep93xx_pata_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ep93xx_pata_data *drv_data;
|
||||
@ -939,7 +946,7 @@ static int ep93xx_pata_probe(struct platform_device *pdev)
|
||||
|
||||
drv_data = devm_kzalloc(&pdev->dev, sizeof(*drv_data), GFP_KERNEL);
|
||||
if (!drv_data) {
|
||||
err = -ENXIO;
|
||||
err = -ENOMEM;
|
||||
goto err_rel_gpio;
|
||||
}
|
||||
|
||||
@ -952,7 +959,7 @@ static int ep93xx_pata_probe(struct platform_device *pdev)
|
||||
/* allocate host */
|
||||
host = ata_host_alloc(&pdev->dev, 1);
|
||||
if (!host) {
|
||||
err = -ENXIO;
|
||||
err = -ENOMEM;
|
||||
goto err_rel_dma;
|
||||
}
|
||||
|
||||
@ -976,12 +983,11 @@ static int ep93xx_pata_probe(struct platform_device *pdev)
|
||||
* so this driver supports only UDMA modes.
|
||||
*/
|
||||
if (drv_data->dma_rx_channel && drv_data->dma_tx_channel) {
|
||||
int chip_rev = ep93xx_chip_revision();
|
||||
const struct soc_device_attribute *match;
|
||||
|
||||
if (chip_rev == EP93XX_CHIP_REV_E1)
|
||||
ap->udma_mask = ATA_UDMA3;
|
||||
else if (chip_rev == EP93XX_CHIP_REV_E2)
|
||||
ap->udma_mask = ATA_UDMA4;
|
||||
match = soc_device_match(ep93xx_soc_table);
|
||||
if (match)
|
||||
ap->udma_mask = (unsigned int) match->data;
|
||||
else
|
||||
ap->udma_mask = ATA_UDMA2;
|
||||
}
|
||||
@ -1004,7 +1010,7 @@ err_rel_gpio:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ep93xx_pata_remove(struct platform_device *pdev)
|
||||
static void ep93xx_pata_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ata_host *host = platform_get_drvdata(pdev);
|
||||
struct ep93xx_pata_data *drv_data = host->private_data;
|
||||
@ -1013,7 +1019,6 @@ static int ep93xx_pata_remove(struct platform_device *pdev)
|
||||
ep93xx_pata_release_dma(drv_data);
|
||||
ep93xx_pata_clear_regs(drv_data->ide_base);
|
||||
ep93xx_ide_release_gpio(pdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver ep93xx_pata_platform_driver = {
|
||||
@ -1021,7 +1026,7 @@ static struct platform_driver ep93xx_pata_platform_driver = {
|
||||
.name = DRV_NAME,
|
||||
},
|
||||
.probe = ep93xx_pata_probe,
|
||||
.remove = ep93xx_pata_remove,
|
||||
.remove_new = ep93xx_pata_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(ep93xx_pata_platform_driver);
|
||||
|
@ -28,11 +28,15 @@
|
||||
#include <asm/atarihw.h>
|
||||
#include <asm/atariints.h>
|
||||
#include <asm/atari_stdma.h>
|
||||
#include <asm/ide.h>
|
||||
|
||||
#define DRV_NAME "pata_falcon"
|
||||
#define DRV_VERSION "0.1.0"
|
||||
|
||||
static int pata_falcon_swap_mask;
|
||||
|
||||
module_param_named(data_swab, pata_falcon_swap_mask, int, 0444);
|
||||
MODULE_PARM_DESC(data_swab, "Data byte swap enable/disable bitmap (0x1==drive1, 0x2==drive2, 0x4==drive3, 0x8==drive4, default==0)");
|
||||
|
||||
static const struct scsi_host_template pata_falcon_sht = {
|
||||
ATA_PIO_SHT(DRV_NAME),
|
||||
};
|
||||
@ -50,7 +54,7 @@ static unsigned int pata_falcon_data_xfer(struct ata_queued_cmd *qc,
|
||||
|
||||
if (dev->class == ATA_DEV_ATA && cmd &&
|
||||
!blk_rq_is_passthrough(scsi_cmd_to_rq(cmd)))
|
||||
swap = 0;
|
||||
swap = (uintptr_t)ap->private_data & BIT(dev->devno);
|
||||
|
||||
/* Transfer multiple of 2 bytes */
|
||||
if (rw == READ) {
|
||||
@ -123,8 +127,9 @@ static int __init pata_falcon_init_one(struct platform_device *pdev)
|
||||
struct resource *base_res, *ctl_res, *irq_res;
|
||||
struct ata_host *host;
|
||||
struct ata_port *ap;
|
||||
void __iomem *base;
|
||||
int irq = 0;
|
||||
void __iomem *base, *ctl_base;
|
||||
int mask_shift = 0; /* Q40 & Falcon default */
|
||||
int irq = 0, io_offset = 1, reg_shift = 2; /* Falcon defaults */
|
||||
|
||||
dev_info(&pdev->dev, "Atari Falcon and Q40/Q60 PATA controller\n");
|
||||
|
||||
@ -165,26 +170,38 @@ static int __init pata_falcon_init_one(struct platform_device *pdev)
|
||||
ap->pio_mask = ATA_PIO4;
|
||||
ap->flags |= ATA_FLAG_SLAVE_POSS | ATA_FLAG_NO_IORDY;
|
||||
|
||||
base = (void __iomem *)base_mem_res->start;
|
||||
/* N.B. this assumes data_addr will be used for word-sized I/O only */
|
||||
ap->ioaddr.data_addr = base + 0 + 0 * 4;
|
||||
ap->ioaddr.error_addr = base + 1 + 1 * 4;
|
||||
ap->ioaddr.feature_addr = base + 1 + 1 * 4;
|
||||
ap->ioaddr.nsect_addr = base + 1 + 2 * 4;
|
||||
ap->ioaddr.lbal_addr = base + 1 + 3 * 4;
|
||||
ap->ioaddr.lbam_addr = base + 1 + 4 * 4;
|
||||
ap->ioaddr.lbah_addr = base + 1 + 5 * 4;
|
||||
ap->ioaddr.device_addr = base + 1 + 6 * 4;
|
||||
ap->ioaddr.status_addr = base + 1 + 7 * 4;
|
||||
ap->ioaddr.command_addr = base + 1 + 7 * 4;
|
||||
ap->ioaddr.data_addr = (void __iomem *)base_mem_res->start;
|
||||
|
||||
base = (void __iomem *)ctl_mem_res->start;
|
||||
ap->ioaddr.altstatus_addr = base + 1;
|
||||
ap->ioaddr.ctl_addr = base + 1;
|
||||
if (base_res) { /* only Q40 has IO resources */
|
||||
io_offset = 0x10000;
|
||||
reg_shift = 0;
|
||||
base = (void __iomem *)base_res->start;
|
||||
ctl_base = (void __iomem *)ctl_res->start;
|
||||
} else {
|
||||
base = (void __iomem *)base_mem_res->start;
|
||||
ctl_base = (void __iomem *)ctl_mem_res->start;
|
||||
}
|
||||
|
||||
ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx",
|
||||
(unsigned long)base_mem_res->start,
|
||||
(unsigned long)ctl_mem_res->start);
|
||||
ap->ioaddr.error_addr = base + io_offset + (1 << reg_shift);
|
||||
ap->ioaddr.feature_addr = base + io_offset + (1 << reg_shift);
|
||||
ap->ioaddr.nsect_addr = base + io_offset + (2 << reg_shift);
|
||||
ap->ioaddr.lbal_addr = base + io_offset + (3 << reg_shift);
|
||||
ap->ioaddr.lbam_addr = base + io_offset + (4 << reg_shift);
|
||||
ap->ioaddr.lbah_addr = base + io_offset + (5 << reg_shift);
|
||||
ap->ioaddr.device_addr = base + io_offset + (6 << reg_shift);
|
||||
ap->ioaddr.status_addr = base + io_offset + (7 << reg_shift);
|
||||
ap->ioaddr.command_addr = base + io_offset + (7 << reg_shift);
|
||||
|
||||
ap->ioaddr.altstatus_addr = ctl_base + io_offset;
|
||||
ap->ioaddr.ctl_addr = ctl_base + io_offset;
|
||||
|
||||
ata_port_desc(ap, "cmd %px ctl %px data %px",
|
||||
base, ctl_base, ap->ioaddr.data_addr);
|
||||
|
||||
if (pdev->id > 0)
|
||||
mask_shift = 2;
|
||||
ap->private_data = (void *)(uintptr_t)(pata_falcon_swap_mask >> mask_shift);
|
||||
|
||||
irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (irq_res && irq_res->start > 0) {
|
||||
|
@ -14,8 +14,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/libata.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/clk.h>
|
||||
#include "sata_gemini.h"
|
||||
|
||||
@ -470,11 +469,7 @@ static int pata_ftide010_probe(struct platform_device *pdev)
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res)
|
||||
return -ENODEV;
|
||||
|
||||
ftide->base = devm_ioremap_resource(dev, res);
|
||||
ftide->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
|
||||
if (IS_ERR(ftide->base))
|
||||
return PTR_ERR(ftide->base);
|
||||
|
||||
@ -541,15 +536,13 @@ err_dis_clk:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pata_ftide010_remove(struct platform_device *pdev)
|
||||
static void pata_ftide010_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ata_host *host = platform_get_drvdata(pdev);
|
||||
struct ftide010 *ftide = host->private_data;
|
||||
|
||||
ata_host_detach(ftide->host);
|
||||
clk_disable_unprepare(ftide->pclk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id pata_ftide010_of_match[] = {
|
||||
@ -563,10 +556,11 @@ static struct platform_driver pata_ftide010_driver = {
|
||||
.of_match_table = pata_ftide010_of_match,
|
||||
},
|
||||
.probe = pata_ftide010_probe,
|
||||
.remove = pata_ftide010_remove,
|
||||
.remove_new = pata_ftide010_remove,
|
||||
};
|
||||
module_platform_driver(pata_ftide010_driver);
|
||||
|
||||
MODULE_DESCRIPTION("low level driver for Faraday Technology FTIDE010");
|
||||
MODULE_AUTHOR("Linus Walleij <linus.walleij@linaro.org>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:" DRV_NAME);
|
||||
|
@ -27,7 +27,6 @@
|
||||
#include <asm/amigahw.h>
|
||||
#include <asm/amigaints.h>
|
||||
#include <asm/amigayle.h>
|
||||
#include <asm/ide.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
#define DRV_NAME "pata_gayle"
|
||||
|
@ -141,21 +141,15 @@ static int pata_imx_probe(struct platform_device *pdev)
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
priv->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
priv->clk = devm_clk_get_enabled(&pdev->dev, NULL);
|
||||
if (IS_ERR(priv->clk)) {
|
||||
dev_err(&pdev->dev, "Failed to get clock\n");
|
||||
dev_err(&pdev->dev, "Failed to get and enable clock\n");
|
||||
return PTR_ERR(priv->clk);
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(priv->clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
host = ata_host_alloc(&pdev->dev, 1);
|
||||
if (!host) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
if (!host)
|
||||
return -ENOMEM;
|
||||
|
||||
host->private_data = priv;
|
||||
ap = host->ports[0];
|
||||
@ -164,12 +158,9 @@ static int pata_imx_probe(struct platform_device *pdev)
|
||||
ap->pio_mask = ATA_PIO4;
|
||||
ap->flags |= ATA_FLAG_SLAVE_POSS;
|
||||
|
||||
io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
priv->host_regs = devm_ioremap_resource(&pdev->dev, io_res);
|
||||
if (IS_ERR(priv->host_regs)) {
|
||||
ret = PTR_ERR(priv->host_regs);
|
||||
goto err;
|
||||
}
|
||||
priv->host_regs = devm_platform_get_and_ioremap_resource(pdev, 0, &io_res);
|
||||
if (IS_ERR(priv->host_regs))
|
||||
return PTR_ERR(priv->host_regs);
|
||||
|
||||
ap->ioaddr.cmd_addr = priv->host_regs + PATA_IMX_DRIVE_DATA;
|
||||
ap->ioaddr.ctl_addr = priv->host_regs + PATA_IMX_DRIVE_CONTROL;
|
||||
@ -195,16 +186,12 @@ static int pata_imx_probe(struct platform_device *pdev)
|
||||
&pata_imx_sht);
|
||||
|
||||
if (ret)
|
||||
goto err;
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
err:
|
||||
clk_disable_unprepare(priv->clk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pata_imx_remove(struct platform_device *pdev)
|
||||
static void pata_imx_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ata_host *host = platform_get_drvdata(pdev);
|
||||
struct pata_imx_priv *priv = host->private_data;
|
||||
@ -212,10 +199,6 @@ static int pata_imx_remove(struct platform_device *pdev)
|
||||
ata_host_detach(host);
|
||||
|
||||
__raw_writel(0, priv->host_regs + PATA_IMX_ATA_INT_EN);
|
||||
|
||||
clk_disable_unprepare(priv->clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
@ -266,7 +249,7 @@ MODULE_DEVICE_TABLE(of, imx_pata_dt_ids);
|
||||
|
||||
static struct platform_driver pata_imx_driver = {
|
||||
.probe = pata_imx_probe,
|
||||
.remove = pata_imx_remove,
|
||||
.remove_new = pata_imx_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.of_match_table = imx_pata_dt_ids,
|
||||
|
@ -242,12 +242,6 @@ static int ixp4xx_pata_probe(struct platform_device *pdev)
|
||||
int ret;
|
||||
int irq;
|
||||
|
||||
cmd = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
ctl = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
|
||||
if (!cmd || !ctl)
|
||||
return -EINVAL;
|
||||
|
||||
ixpp = devm_kzalloc(dev, sizeof(*ixpp), GFP_KERNEL);
|
||||
if (!ixpp)
|
||||
return -ENOMEM;
|
||||
@ -271,18 +265,18 @@ static int ixp4xx_pata_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ixpp->cmd = devm_ioremap_resource(dev, cmd);
|
||||
ixpp->ctl = devm_ioremap_resource(dev, ctl);
|
||||
if (IS_ERR(ixpp->cmd) || IS_ERR(ixpp->ctl))
|
||||
return -ENOMEM;
|
||||
ixpp->cmd = devm_platform_get_and_ioremap_resource(pdev, 0, &cmd);
|
||||
if (IS_ERR(ixpp->cmd))
|
||||
return PTR_ERR(ixpp->cmd);
|
||||
|
||||
ixpp->ctl = devm_platform_get_and_ioremap_resource(pdev, 1, &ctl);
|
||||
if (IS_ERR(ixpp->ctl))
|
||||
return PTR_ERR(ixpp->ctl);
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq > 0)
|
||||
irq_set_irq_type(irq, IRQ_TYPE_EDGE_RISING);
|
||||
else if (irq < 0)
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
else
|
||||
return -EINVAL;
|
||||
irq_set_irq_type(irq, IRQ_TYPE_EDGE_RISING);
|
||||
|
||||
/* Just one port to set up */
|
||||
ixp4xx_setup_port(ixpp->host->ports[0], ixpp, cmd->start, ctl->start);
|
||||
|
@ -19,9 +19,10 @@
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/libata.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
@ -800,8 +801,7 @@ static int mpc52xx_ata_probe(struct platform_device *op)
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int
|
||||
mpc52xx_ata_remove(struct platform_device *op)
|
||||
static void mpc52xx_ata_remove(struct platform_device *op)
|
||||
{
|
||||
struct ata_host *host = platform_get_drvdata(op);
|
||||
struct mpc52xx_ata_priv *priv = host->private_data;
|
||||
@ -815,8 +815,6 @@ mpc52xx_ata_remove(struct platform_device *op)
|
||||
irq_dispose_mapping(task_irq);
|
||||
bcom_ata_release(priv->dmatsk);
|
||||
irq_dispose_mapping(priv->ata_irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
@ -857,7 +855,7 @@ static const struct of_device_id mpc52xx_ata_of_match[] = {
|
||||
|
||||
static struct platform_driver mpc52xx_ata_of_platform_driver = {
|
||||
.probe = mpc52xx_ata_probe,
|
||||
.remove = mpc52xx_ata_remove,
|
||||
.remove_new = mpc52xx_ata_remove,
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.suspend = mpc52xx_ata_suspend,
|
||||
.resume = mpc52xx_ata_resume,
|
||||
|
@ -295,7 +295,7 @@ static int pxa_ata_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pxa_ata_remove(struct platform_device *pdev)
|
||||
static void pxa_ata_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ata_host *host = platform_get_drvdata(pdev);
|
||||
struct pata_pxa_data *data = host->ports[0]->private_data;
|
||||
@ -303,13 +303,11 @@ static int pxa_ata_remove(struct platform_device *pdev)
|
||||
dma_release_channel(data->dma_chan);
|
||||
|
||||
ata_host_detach(host);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver pxa_ata_driver = {
|
||||
.probe = pxa_ata_probe,
|
||||
.remove = pxa_ata_remove,
|
||||
.remove_new = pxa_ata_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
},
|
||||
|
@ -155,18 +155,16 @@ static int rb532_pata_driver_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rb532_pata_driver_remove(struct platform_device *pdev)
|
||||
static void rb532_pata_driver_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ata_host *ah = platform_get_drvdata(pdev);
|
||||
|
||||
ata_host_detach(ah);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver rb532_pata_platform_driver = {
|
||||
.probe = rb532_pata_driver_probe,
|
||||
.remove = rb532_pata_driver_remove,
|
||||
.remove_new = rb532_pata_driver_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
},
|
||||
|
@ -180,8 +180,7 @@ static void sl82c105_bmdma_start(struct ata_queued_cmd *qc)
|
||||
* document.
|
||||
*
|
||||
* This function is also called to turn off DMA when a timeout occurs
|
||||
* during DMA operation. In both cases we need to reset the engine,
|
||||
* so no actual eng_timeout handler is required.
|
||||
* during DMA operation. In both cases we need to reset the engine.
|
||||
*
|
||||
* We assume bmdma_stop is always called if bmdma_start as called. If
|
||||
* not then we may need to wrap qc_issue.
|
||||
|
@ -18,9 +18,8 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/phy/phy.h>
|
||||
#include <linux/libata.h>
|
||||
@ -1211,7 +1210,7 @@ error_out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int sata_dwc_remove(struct platform_device *ofdev)
|
||||
static void sata_dwc_remove(struct platform_device *ofdev)
|
||||
{
|
||||
struct device *dev = &ofdev->dev;
|
||||
struct ata_host *host = dev_get_drvdata(dev);
|
||||
@ -1227,7 +1226,6 @@ static int sata_dwc_remove(struct platform_device *ofdev)
|
||||
#endif
|
||||
|
||||
dev_dbg(dev, "done\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id sata_dwc_match[] = {
|
||||
@ -1242,7 +1240,7 @@ static struct platform_driver sata_dwc_driver = {
|
||||
.of_match_table = sata_dwc_match,
|
||||
},
|
||||
.probe = sata_dwc_probe,
|
||||
.remove = sata_dwc_remove,
|
||||
.remove_new = sata_dwc_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(sata_dwc_driver);
|
||||
|
@ -12,6 +12,9 @@
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
@ -19,9 +22,6 @@
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
#include <linux/libata.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
static unsigned int intr_coalescing_count;
|
||||
module_param(intr_coalescing_count, int, S_IRUGO);
|
||||
@ -1526,7 +1526,7 @@ error_exit_with_cleanup:
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int sata_fsl_remove(struct platform_device *ofdev)
|
||||
static void sata_fsl_remove(struct platform_device *ofdev)
|
||||
{
|
||||
struct ata_host *host = platform_get_drvdata(ofdev);
|
||||
struct sata_fsl_host_priv *host_priv = host->private_data;
|
||||
@ -1535,8 +1535,6 @@ static int sata_fsl_remove(struct platform_device *ofdev)
|
||||
device_remove_file(&ofdev->dev, &host_priv->rx_watermark);
|
||||
|
||||
ata_host_detach(host);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
@ -1591,7 +1589,7 @@ static struct platform_driver fsl_sata_driver = {
|
||||
.of_match_table = fsl_sata_match,
|
||||
},
|
||||
.probe = sata_fsl_probe,
|
||||
.remove = sata_fsl_remove,
|
||||
.remove_new = sata_fsl_remove,
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.suspend = sata_fsl_suspend,
|
||||
.resume = sata_fsl_resume,
|
||||
|
@ -12,8 +12,7 @@
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/reset.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
@ -400,7 +399,7 @@ out_unprep_clk:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int gemini_sata_remove(struct platform_device *pdev)
|
||||
static void gemini_sata_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct sata_gemini *sg = platform_get_drvdata(pdev);
|
||||
|
||||
@ -409,8 +408,6 @@ static int gemini_sata_remove(struct platform_device *pdev)
|
||||
clk_unprepare(sg->sata0_pclk);
|
||||
}
|
||||
sg_singleton = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id gemini_sata_of_match[] = {
|
||||
@ -424,10 +421,11 @@ static struct platform_driver gemini_sata_driver = {
|
||||
.of_match_table = gemini_sata_of_match,
|
||||
},
|
||||
.probe = gemini_sata_probe,
|
||||
.remove = gemini_sata_remove,
|
||||
.remove_new = gemini_sata_remove,
|
||||
};
|
||||
module_platform_driver(gemini_sata_driver);
|
||||
|
||||
MODULE_DESCRIPTION("low level driver for Cortina Systems Gemini SATA bridge");
|
||||
MODULE_AUTHOR("Linus Walleij <linus.walleij@linaro.org>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:" DRV_NAME);
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/libata.h>
|
||||
@ -385,7 +385,7 @@ static int highbank_initialize_phys(struct device *dev, void __iomem *addr)
|
||||
static int ahci_highbank_hardreset(struct ata_link *link, unsigned int *class,
|
||||
unsigned long deadline)
|
||||
{
|
||||
static const unsigned long timing[] = { 5, 100, 500};
|
||||
static const unsigned int timing[] = { 5, 100, 500};
|
||||
struct ata_port *ap = link->ap;
|
||||
struct ahci_port_priv *pp = ap->private_data;
|
||||
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||
|
@ -619,7 +619,7 @@ static int inic_hardreset(struct ata_link *link, unsigned int *class,
|
||||
struct ata_port *ap = link->ap;
|
||||
void __iomem *port_base = inic_port_base(ap);
|
||||
void __iomem *idma_ctl = port_base + PORT_IDMA_CTL;
|
||||
const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
|
||||
const unsigned int *timing = sata_ehc_deb_timing(&link->eh_context);
|
||||
int rc;
|
||||
|
||||
/* hammer it into sane state */
|
||||
|
@ -3633,7 +3633,7 @@ static int mv_hardreset(struct ata_link *link, unsigned int *class,
|
||||
|
||||
/* Workaround for errata FEr SATA#10 (part 2) */
|
||||
do {
|
||||
const unsigned long *timing =
|
||||
const unsigned int *timing =
|
||||
sata_ehc_deb_timing(&link->eh_context);
|
||||
|
||||
rc = sata_link_hardreset(link, timing, deadline + extra,
|
||||
@ -4210,7 +4210,7 @@ err:
|
||||
* A platform bus SATA device has been unplugged. Perform the needed
|
||||
* cleanup. Also called on module unload for any active devices.
|
||||
*/
|
||||
static int mv_platform_remove(struct platform_device *pdev)
|
||||
static void mv_platform_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ata_host *host = platform_get_drvdata(pdev);
|
||||
struct mv_host_priv *hpriv = host->private_data;
|
||||
@ -4228,7 +4228,6 @@ static int mv_platform_remove(struct platform_device *pdev)
|
||||
}
|
||||
phy_power_off(hpriv->port_phys[port]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
@ -4284,7 +4283,7 @@ MODULE_DEVICE_TABLE(of, mv_sata_dt_ids);
|
||||
|
||||
static struct platform_driver mv_platform_driver = {
|
||||
.probe = mv_platform_probe,
|
||||
.remove = mv_platform_remove,
|
||||
.remove_new = mv_platform_remove,
|
||||
.suspend = mv_platform_suspend,
|
||||
.resume = mv_platform_resume,
|
||||
.driver = {
|
||||
|
@ -1529,7 +1529,7 @@ static int nv_hardreset(struct ata_link *link, unsigned int *class,
|
||||
sata_link_hardreset(link, sata_deb_timing_hotplug, deadline,
|
||||
NULL, NULL);
|
||||
else {
|
||||
const unsigned long *timing = sata_ehc_deb_timing(ehc);
|
||||
const unsigned int *timing = sata_ehc_deb_timing(ehc);
|
||||
int rc;
|
||||
|
||||
if (!(ehc->i.flags & ATA_EHI_QUIET))
|
||||
|
@ -11,7 +11,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/ata.h>
|
||||
#include <linux/libata.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/err.h>
|
||||
@ -861,15 +861,11 @@ static int sata_rcar_probe(struct platform_device *pdev)
|
||||
struct device *dev = &pdev->dev;
|
||||
struct ata_host *host;
|
||||
struct sata_rcar_priv *priv;
|
||||
struct resource *mem;
|
||||
int irq;
|
||||
int ret = 0;
|
||||
int irq, ret;
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
if (!irq)
|
||||
return -EINVAL;
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(struct sata_rcar_priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
@ -890,8 +886,7 @@ static int sata_rcar_probe(struct platform_device *pdev)
|
||||
|
||||
host->private_data = priv;
|
||||
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
priv->base = devm_ioremap_resource(dev, mem);
|
||||
priv->base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(priv->base)) {
|
||||
ret = PTR_ERR(priv->base);
|
||||
goto err_pm_put;
|
||||
@ -914,7 +909,7 @@ err_pm_put:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int sata_rcar_remove(struct platform_device *pdev)
|
||||
static void sata_rcar_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ata_host *host = platform_get_drvdata(pdev);
|
||||
struct sata_rcar_priv *priv = host->private_data;
|
||||
@ -930,8 +925,6 @@ static int sata_rcar_remove(struct platform_device *pdev)
|
||||
|
||||
pm_runtime_put(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
@ -1016,7 +1009,7 @@ static const struct dev_pm_ops sata_rcar_pm_ops = {
|
||||
|
||||
static struct platform_driver sata_rcar_driver = {
|
||||
.probe = sata_rcar_probe,
|
||||
.remove = sata_rcar_remove,
|
||||
.remove_new = sata_rcar_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.of_match_table = sata_rcar_match,
|
||||
|
@ -597,7 +597,7 @@ static int sil24_init_port(struct ata_port *ap)
|
||||
static int sil24_exec_polled_cmd(struct ata_port *ap, int pmp,
|
||||
const struct ata_taskfile *tf,
|
||||
int is_cmd, u32 ctrl,
|
||||
unsigned long timeout_msec)
|
||||
unsigned int timeout_msec)
|
||||
{
|
||||
void __iomem *port = sil24_port_base(ap);
|
||||
struct sil24_port_priv *pp = ap->private_data;
|
||||
@ -651,7 +651,7 @@ static int sil24_softreset(struct ata_link *link, unsigned int *class,
|
||||
{
|
||||
struct ata_port *ap = link->ap;
|
||||
int pmp = sata_srst_pmp(link);
|
||||
unsigned long timeout_msec = 0;
|
||||
unsigned int timeout_msec = 0;
|
||||
struct ata_taskfile tf;
|
||||
const char *reason;
|
||||
int rc;
|
||||
|
@ -232,7 +232,6 @@ static const struct scsi_host_template pdc_sata_sht = {
|
||||
.dma_boundary = ATA_DMA_BOUNDARY,
|
||||
};
|
||||
|
||||
/* TODO: inherit from base port_ops after converting to new EH */
|
||||
static struct ata_port_operations pdc_20621_ops = {
|
||||
.inherits = &ata_sff_port_ops,
|
||||
|
||||
|
@ -787,7 +787,7 @@ static int hisi_sas_init_device(struct domain_device *device)
|
||||
* However we don't need to issue a hard reset here for these
|
||||
* reasons:
|
||||
* a. When probing the device, libsas/libata already issues a
|
||||
* hard reset in sas_probe_sata() -> ata_sas_async_probe().
|
||||
* hard reset in sas_probe_sata() -> ata_port_probe().
|
||||
* Note that in hisi_sas_debug_I_T_nexus_reset() we take care
|
||||
* to issue a hard reset by checking the dev status (== INIT).
|
||||
* b. When resetting the controller, this is simply unnecessary.
|
||||
|
@ -567,8 +567,6 @@ static struct ata_port_operations sas_sata_ops = {
|
||||
.qc_prep = ata_noop_qc_prep,
|
||||
.qc_issue = sas_ata_qc_issue,
|
||||
.qc_fill_rtf = sas_ata_qc_fill_rtf,
|
||||
.port_start = ata_sas_port_start,
|
||||
.port_stop = ata_sas_port_stop,
|
||||
.set_dmamode = sas_ata_set_dmamode,
|
||||
.sched_eh = sas_ata_sched_eh,
|
||||
.end_eh = sas_ata_end_eh,
|
||||
@ -609,9 +607,6 @@ int sas_ata_init(struct domain_device *found_dev)
|
||||
ap->private_data = found_dev;
|
||||
ap->cbl = ATA_CBL_SATA;
|
||||
ap->scsi_host = shost;
|
||||
rc = ata_sas_port_init(ap);
|
||||
if (rc)
|
||||
goto destroy_port;
|
||||
|
||||
rc = ata_sas_tport_add(ata_host->dev, ap);
|
||||
if (rc)
|
||||
@ -623,7 +618,7 @@ int sas_ata_init(struct domain_device *found_dev)
|
||||
return 0;
|
||||
|
||||
destroy_port:
|
||||
ata_sas_port_destroy(ap);
|
||||
kfree(ap);
|
||||
free_host:
|
||||
ata_host_put(ata_host);
|
||||
return rc;
|
||||
@ -657,7 +652,7 @@ void sas_probe_sata(struct asd_sas_port *port)
|
||||
if (!dev_is_sata(dev))
|
||||
continue;
|
||||
|
||||
ata_sas_async_probe(dev->sata_dev.ap);
|
||||
ata_port_probe(dev->sata_dev.ap);
|
||||
}
|
||||
mutex_unlock(&port->ha->disco_mutex);
|
||||
|
||||
|
@ -301,7 +301,7 @@ void sas_free_device(struct kref *kref)
|
||||
|
||||
if (dev_is_sata(dev) && dev->sata_dev.ap) {
|
||||
ata_sas_tport_delete(dev->sata_dev.ap);
|
||||
ata_sas_port_destroy(dev->sata_dev.ap);
|
||||
kfree(dev->sata_dev.ap);
|
||||
ata_host_put(dev->sata_dev.ata_host);
|
||||
dev->sata_dev.ata_host = NULL;
|
||||
dev->sata_dev.ap = NULL;
|
||||
|
@ -1,39 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Generic I/O and MEMIO string operations. */
|
||||
|
||||
#define __ide_insw insw
|
||||
#define __ide_insl insl
|
||||
#define __ide_outsw outsw
|
||||
#define __ide_outsl outsl
|
||||
|
||||
static __inline__ void __ide_mm_insw(void __iomem *port, void *addr, u32 count)
|
||||
{
|
||||
while (count--) {
|
||||
*(u16 *)addr = readw(port);
|
||||
addr += 2;
|
||||
}
|
||||
}
|
||||
|
||||
static __inline__ void __ide_mm_insl(void __iomem *port, void *addr, u32 count)
|
||||
{
|
||||
while (count--) {
|
||||
*(u32 *)addr = readl(port);
|
||||
addr += 4;
|
||||
}
|
||||
}
|
||||
|
||||
static __inline__ void __ide_mm_outsw(void __iomem *port, void *addr, u32 count)
|
||||
{
|
||||
while (count--) {
|
||||
writew(*(u16 *)addr, port);
|
||||
addr += 2;
|
||||
}
|
||||
}
|
||||
|
||||
static __inline__ void __ide_mm_outsl(void __iomem * port, void *addr, u32 count)
|
||||
{
|
||||
while (count--) {
|
||||
writel(*(u32 *)addr, port);
|
||||
addr += 4;
|
||||
}
|
||||
}
|
@ -344,7 +344,6 @@ enum {
|
||||
ATA_LINK_RESUME_TRIES = 5,
|
||||
|
||||
/* how hard are we gonna try to probe/recover devices */
|
||||
ATA_PROBE_MAX_TRIES = 3,
|
||||
ATA_EH_DEV_TRIES = 3,
|
||||
ATA_EH_PMP_TRIES = 5,
|
||||
ATA_EH_PMP_LINK_TRIES = 3,
|
||||
@ -976,12 +975,6 @@ struct ata_port_operations {
|
||||
ssize_t (*transmit_led_message)(struct ata_port *ap, u32 state,
|
||||
ssize_t size);
|
||||
|
||||
/*
|
||||
* Obsolete
|
||||
*/
|
||||
void (*phy_reset)(struct ata_port *ap);
|
||||
void (*eng_timeout)(struct ata_port *ap);
|
||||
|
||||
/*
|
||||
* ->inherits must be the last field and all the preceding
|
||||
* fields must be pointers.
|
||||
@ -1116,7 +1109,7 @@ static inline void ata_sas_port_resume(struct ata_port *ap)
|
||||
extern int ata_ratelimit(void);
|
||||
extern void ata_msleep(struct ata_port *ap, unsigned int msecs);
|
||||
extern u32 ata_wait_register(struct ata_port *ap, void __iomem *reg, u32 mask,
|
||||
u32 val, unsigned long interval, unsigned long timeout);
|
||||
u32 val, unsigned int interval, unsigned int timeout);
|
||||
extern int atapi_cmd_type(u8 opcode);
|
||||
extern unsigned int ata_pack_xfermask(unsigned int pio_mask,
|
||||
unsigned int mwdma_mask,
|
||||
@ -1166,11 +1159,11 @@ extern void ata_scsi_cmd_error_handler(struct Scsi_Host *host, struct ata_port *
|
||||
* SATA specific code - drivers/ata/libata-sata.c
|
||||
*/
|
||||
#ifdef CONFIG_SATA_HOST
|
||||
extern const unsigned long sata_deb_timing_normal[];
|
||||
extern const unsigned long sata_deb_timing_hotplug[];
|
||||
extern const unsigned long sata_deb_timing_long[];
|
||||
extern const unsigned int sata_deb_timing_normal[];
|
||||
extern const unsigned int sata_deb_timing_hotplug[];
|
||||
extern const unsigned int sata_deb_timing_long[];
|
||||
|
||||
static inline const unsigned long *
|
||||
static inline const unsigned int *
|
||||
sata_ehc_deb_timing(struct ata_eh_context *ehc)
|
||||
{
|
||||
if (ehc->i.flags & ATA_EHI_HOTPLUGGED)
|
||||
@ -1185,14 +1178,14 @@ extern int sata_scr_write(struct ata_link *link, int reg, u32 val);
|
||||
extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val);
|
||||
extern int sata_set_spd(struct ata_link *link);
|
||||
extern int sata_link_hardreset(struct ata_link *link,
|
||||
const unsigned long *timing, unsigned long deadline,
|
||||
const unsigned int *timing, unsigned long deadline,
|
||||
bool *online, int (*check_ready)(struct ata_link *));
|
||||
extern int sata_link_resume(struct ata_link *link, const unsigned long *params,
|
||||
extern int sata_link_resume(struct ata_link *link, const unsigned int *params,
|
||||
unsigned long deadline);
|
||||
extern int ata_eh_read_sense_success_ncq_log(struct ata_link *link);
|
||||
extern void ata_eh_analyze_ncq_error(struct ata_link *link);
|
||||
#else
|
||||
static inline const unsigned long *
|
||||
static inline const unsigned int *
|
||||
sata_ehc_deb_timing(struct ata_eh_context *ehc)
|
||||
{
|
||||
return NULL;
|
||||
@ -1212,7 +1205,7 @@ static inline int sata_scr_write_flush(struct ata_link *link, int reg, u32 val)
|
||||
}
|
||||
static inline int sata_set_spd(struct ata_link *link) { return -EOPNOTSUPP; }
|
||||
static inline int sata_link_hardreset(struct ata_link *link,
|
||||
const unsigned long *timing,
|
||||
const unsigned int *timing,
|
||||
unsigned long deadline,
|
||||
bool *online,
|
||||
int (*check_ready)(struct ata_link *))
|
||||
@ -1222,7 +1215,7 @@ static inline int sata_link_hardreset(struct ata_link *link,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
static inline int sata_link_resume(struct ata_link *link,
|
||||
const unsigned long *params,
|
||||
const unsigned int *params,
|
||||
unsigned long deadline)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
@ -1234,20 +1227,15 @@ static inline int ata_eh_read_sense_success_ncq_log(struct ata_link *link)
|
||||
static inline void ata_eh_analyze_ncq_error(struct ata_link *link) { }
|
||||
#endif
|
||||
extern int sata_link_debounce(struct ata_link *link,
|
||||
const unsigned long *params, unsigned long deadline);
|
||||
const unsigned int *params, unsigned long deadline);
|
||||
extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
||||
bool spm_wakeup);
|
||||
extern int ata_slave_link_init(struct ata_port *ap);
|
||||
extern void ata_sas_port_destroy(struct ata_port *);
|
||||
extern struct ata_port *ata_sas_port_alloc(struct ata_host *,
|
||||
struct ata_port_info *, struct Scsi_Host *);
|
||||
extern void ata_sas_async_probe(struct ata_port *ap);
|
||||
extern int ata_sas_sync_probe(struct ata_port *ap);
|
||||
extern int ata_sas_port_init(struct ata_port *);
|
||||
extern int ata_sas_port_start(struct ata_port *ap);
|
||||
extern void ata_port_probe(struct ata_port *ap);
|
||||
extern int ata_sas_tport_add(struct device *parent, struct ata_port *ap);
|
||||
extern void ata_sas_tport_delete(struct ata_port *ap);
|
||||
extern void ata_sas_port_stop(struct ata_port *ap);
|
||||
extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *);
|
||||
extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap);
|
||||
extern void ata_tf_to_fis(const struct ata_taskfile *tf,
|
||||
@ -1785,7 +1773,7 @@ static inline struct ata_queued_cmd *ata_qc_from_tag(struct ata_port *ap,
|
||||
{
|
||||
struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag);
|
||||
|
||||
if (unlikely(!qc) || !ap->ops->error_handler)
|
||||
if (unlikely(!qc))
|
||||
return qc;
|
||||
|
||||
if ((qc->flags & (ATA_QCFLAG_ACTIVE |
|
||||
@ -1876,7 +1864,7 @@ static inline int ata_check_ready(u8 status)
|
||||
}
|
||||
|
||||
static inline unsigned long ata_deadline(unsigned long from_jiffies,
|
||||
unsigned long timeout_msecs)
|
||||
unsigned int timeout_msecs)
|
||||
{
|
||||
return from_jiffies + msecs_to_jiffies(timeout_msecs);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user