mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 06:02:05 +00:00
for-5.7/libata-2020-03-29
-----BEGIN PGP SIGNATURE----- iQJEBAABCAAuFiEEwPw5LcreJtl1+l5K99NY+ylx4KYFAl6BJIgQHGF4Ym9lQGtl cm5lbC5kawAKCRD301j7KXHgph2iEADcreBhOOXF8EMkC7Ck5QDNXWOhkru2LXO6 fdc6eCx11fCN8/PqMZXv7cvKUCAhdZqEhhfqDhQ7tpKuh1WDTC9NGLGM+6z+S0GV P1R/PXOMOb4pnR96xlc+UYe7IgKD5GTcazIMFZ3HbbbI65LL0dCT5JvI4Cc4VVF1 r/kXs7MRplz+fItEY3aJ/zOXCAICGcL8Wn/MAInD3Jr4NvWNGtWDpfsm7M1IoX4K JLGY5OY7AMmUFVBcxDhtyf6LXdERRfjAJ+95AgzF0WLcz8SczhsPXhqeOaSRtNoG aF4a9vvuz8jdEAyIvXgqoYlDzt989ZEv4AdWhXs4Y+UX5+PzTQ5eoGthYFqenQju uxQUPnrYTKtX1HMN68ih5u75mktXn97NeQ764bcFV1+5rELSxHMQxBaZ2y5Zy7sY EK4owLsWUhyZNsVbAqRz8sy+UJF5AwfCa0rXEVsoFIpi6r90kZWh58zlNkq82p4K WHnRDikD6dZ/vbWVaRWLZIF9PiJ4Jy9mdefcEHDZuqAKHeehkBFU+iGG9AtHA8bm 3CCHWPqd6cwMKPzKL9nLvNl0PwDTfTpZBO9waW3Xh9RAyNA/dNJ+vexSgh8WQbC5 o0UFT82orpMTMDwmqsT+dc3aIUWIXXZVSDeeXZKZ1SPAkLX55L969l2AK+Z0U9ar Yj6VGE4U2g== =vn2E -----END PGP SIGNATURE----- Merge tag 'for-5.7/libata-2020-03-29' of git://git.kernel.dk/linux-block Pull libata updates from Jens Axboe: - Series from Bart, making the libata code smaller on PATA only setups. This is useful for smaller/embedded use cases, and will help us move some of those off drivers/ide. - Kill unused BPRINTK() (Hannes) - Add various Comet Lake ahci PCI ids (Kai-Heng, Mika) - Fix for a double scsi_host_put() in error handling (John) - Use scnprintf (Takashi) - Assign OF node to the SCSI device (Linus Walleij) * tag 'for-5.7/libata-2020-03-29' of git://git.kernel.dk/linux-block: (36 commits) ata: make "libata.force" kernel parameter optional ata: move ata_eh_analyze_ncq_error() & co. to libata-sata.c ata: start separating SATA specific code from libata-eh.c ata: move ata_sas_*() to libata-sata.c ata: start separating SATA specific code from libata-scsi.c ata: move sata_deb_timing_*() to libata-sata.c ata: move ata_qc_complete_multiple() to libata-sata.c ata: move sata_link_hardreset() to libata-sata.c ata: move sata_link_{debounce,resume}() to libata-sata.c ata: move *sata_set_spd*() to libata-sata.c ata: move sata_scr_*() to libata-sata.c ata: start separating SATA specific code from libata-core.c ata: let compiler optimize out ata_eh_set_lpm() on non-SATA hosts ata: let compiler optimize out ata_dev_config_ncq() on non-SATA hosts ata: add CONFIG_SATA_HOST=n version of ata_ncq_enabled() ata: separate PATA timings code from libata-core.c ata: fix CodingStyle issues in PATA timings code ata: remove EXPORT_SYMBOL_GPL()s not used by modules ata: move EXPORT_SYMBOL_GPL()s close to exported code ata: optimize ata_scsi_rbuf[] size ...
This commit is contained in:
commit
3a0eb192c0
@ -34,6 +34,12 @@ if ATA
|
||||
config ATA_NONSTANDARD
|
||||
bool
|
||||
|
||||
config SATA_HOST
|
||||
bool
|
||||
|
||||
config PATA_TIMINGS
|
||||
bool
|
||||
|
||||
config ATA_VERBOSE_ERROR
|
||||
bool "Verbose ATA error reporting"
|
||||
default y
|
||||
@ -45,9 +51,26 @@ config ATA_VERBOSE_ERROR
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config ATA_FORCE
|
||||
bool "\"libata.force=\" kernel parameter support" if EXPERT
|
||||
default y
|
||||
help
|
||||
This option adds support for "libata.force=" kernel parameter for
|
||||
forcing configuration settings.
|
||||
|
||||
For further information, please read
|
||||
<file:Documentation/admin-guide/kernel-parameters.txt>.
|
||||
|
||||
This option will enlarge the kernel by approx. 3KB. Disable it if
|
||||
kernel size is more important than ability to override the default
|
||||
configuration settings.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config ATA_ACPI
|
||||
bool "ATA ACPI Support"
|
||||
depends on ACPI
|
||||
select PATA_TIMINGS
|
||||
default y
|
||||
help
|
||||
This option adds support for ATA-related ACPI objects.
|
||||
@ -73,6 +96,7 @@ config SATA_ZPODD
|
||||
|
||||
config SATA_PMP
|
||||
bool "SATA Port Multiplier support"
|
||||
depends on SATA_HOST
|
||||
default y
|
||||
help
|
||||
This option adds support for SATA Port Multipliers
|
||||
@ -85,6 +109,7 @@ comment "Controllers with non-SFF native interface"
|
||||
config SATA_AHCI
|
||||
tristate "AHCI SATA support"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for AHCI Serial ATA.
|
||||
|
||||
@ -111,6 +136,7 @@ config SATA_MOBILE_LPM_POLICY
|
||||
|
||||
config SATA_AHCI_PLATFORM
|
||||
tristate "Platform AHCI SATA support"
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Platform AHCI Serial ATA
|
||||
controllers.
|
||||
@ -121,6 +147,7 @@ config AHCI_BRCM
|
||||
tristate "Broadcom AHCI SATA support"
|
||||
depends on ARCH_BRCMSTB || BMIPS_GENERIC || ARCH_BCM_NSP || \
|
||||
ARCH_BCM_63XX
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the AHCI SATA3 controller found on
|
||||
Broadcom SoC's.
|
||||
@ -130,6 +157,7 @@ config AHCI_BRCM
|
||||
config AHCI_DA850
|
||||
tristate "DaVinci DA850 AHCI SATA support"
|
||||
depends on ARCH_DAVINCI_DA850
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the DaVinci DA850 SoC's
|
||||
onboard AHCI SATA.
|
||||
@ -139,6 +167,7 @@ config AHCI_DA850
|
||||
config AHCI_DM816
|
||||
tristate "DaVinci DM816 AHCI SATA support"
|
||||
depends on ARCH_OMAP2PLUS
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the DaVinci DM816 SoC's
|
||||
onboard AHCI SATA controller.
|
||||
@ -148,6 +177,7 @@ config AHCI_DM816
|
||||
config AHCI_ST
|
||||
tristate "ST AHCI SATA support"
|
||||
depends on ARCH_STI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for ST AHCI SATA controller.
|
||||
|
||||
@ -157,6 +187,7 @@ config AHCI_IMX
|
||||
tristate "Freescale i.MX AHCI SATA support"
|
||||
depends on MFD_SYSCON && (ARCH_MXC || COMPILE_TEST)
|
||||
depends on (HWMON && (THERMAL || !THERMAL_OF)) || !HWMON
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the Freescale i.MX SoC's
|
||||
onboard AHCI SATA.
|
||||
@ -166,6 +197,7 @@ config AHCI_IMX
|
||||
config AHCI_CEVA
|
||||
tristate "CEVA AHCI SATA support"
|
||||
depends on OF
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the CEVA AHCI SATA.
|
||||
It can be found on the Xilinx Zynq UltraScale+ MPSoC.
|
||||
@ -176,6 +208,7 @@ config AHCI_MTK
|
||||
tristate "MediaTek AHCI SATA support"
|
||||
depends on ARCH_MEDIATEK
|
||||
select MFD_SYSCON
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the MediaTek SoC's
|
||||
onboard AHCI SATA controller.
|
||||
@ -185,6 +218,7 @@ config AHCI_MTK
|
||||
config AHCI_MVEBU
|
||||
tristate "Marvell EBU AHCI SATA support"
|
||||
depends on ARCH_MVEBU
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the Marvebu EBU SoC's
|
||||
onboard AHCI SATA.
|
||||
@ -203,6 +237,7 @@ config AHCI_OCTEON
|
||||
config AHCI_SUNXI
|
||||
tristate "Allwinner sunxi AHCI SATA support"
|
||||
depends on ARCH_SUNXI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the Allwinner sunxi SoC's
|
||||
onboard AHCI SATA.
|
||||
@ -212,6 +247,7 @@ config AHCI_SUNXI
|
||||
config AHCI_TEGRA
|
||||
tristate "NVIDIA Tegra AHCI SATA support"
|
||||
depends on ARCH_TEGRA
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the NVIDIA Tegra SoC's
|
||||
onboard AHCI SATA.
|
||||
@ -221,12 +257,14 @@ config AHCI_TEGRA
|
||||
config AHCI_XGENE
|
||||
tristate "APM X-Gene 6.0Gbps AHCI SATA host controller support"
|
||||
depends on PHY_XGENE
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for APM X-Gene SoC SATA host controller.
|
||||
|
||||
config AHCI_QORIQ
|
||||
tristate "Freescale QorIQ AHCI SATA support"
|
||||
depends on OF
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the Freescale QorIQ AHCI SoC's
|
||||
onboard AHCI SATA.
|
||||
@ -236,6 +274,7 @@ config AHCI_QORIQ
|
||||
config SATA_FSL
|
||||
tristate "Freescale 3.0Gbps SATA support"
|
||||
depends on FSL_SOC
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Freescale 3.0Gbps SATA controller.
|
||||
It can be found on MPC837x and MPC8315.
|
||||
@ -245,6 +284,7 @@ config SATA_FSL
|
||||
config SATA_GEMINI
|
||||
tristate "Gemini SATA bridge support"
|
||||
depends on ARCH_GEMINI || COMPILE_TEST
|
||||
select SATA_HOST
|
||||
default ARCH_GEMINI
|
||||
help
|
||||
This enabled support for the FTIDE010 to SATA bridge
|
||||
@ -255,6 +295,7 @@ config SATA_GEMINI
|
||||
config SATA_AHCI_SEATTLE
|
||||
tristate "AMD Seattle 6.0Gbps AHCI SATA host controller support"
|
||||
depends on ARCH_SEATTLE
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for AMD Seattle SATA host controller.
|
||||
|
||||
@ -263,12 +304,14 @@ config SATA_AHCI_SEATTLE
|
||||
config SATA_INIC162X
|
||||
tristate "Initio 162x SATA support (Very Experimental)"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Initio 162x Serial ATA.
|
||||
|
||||
config SATA_ACARD_AHCI
|
||||
tristate "ACard AHCI variant (ATP 8620)"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Acard.
|
||||
|
||||
@ -277,6 +320,7 @@ config SATA_ACARD_AHCI
|
||||
config SATA_SIL24
|
||||
tristate "Silicon Image 3124/3132 SATA support"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Silicon Image 3124/3132 Serial ATA.
|
||||
|
||||
@ -317,6 +361,7 @@ config PDC_ADMA
|
||||
config PATA_OCTEON_CF
|
||||
tristate "OCTEON Boot Bus Compact Flash support"
|
||||
depends on CAVIUM_OCTEON_SOC
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables a polled compact flash driver for use with
|
||||
compact flash cards attached to the OCTEON boot bus.
|
||||
@ -326,6 +371,7 @@ config PATA_OCTEON_CF
|
||||
config SATA_QSTOR
|
||||
tristate "Pacific Digital SATA QStor support"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Pacific Digital Serial ATA QStor.
|
||||
|
||||
@ -334,6 +380,7 @@ config SATA_QSTOR
|
||||
config SATA_SX4
|
||||
tristate "Promise SATA SX4 support (Experimental)"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Promise Serial ATA SX4.
|
||||
|
||||
@ -357,6 +404,7 @@ comment "SATA SFF controllers with BMDMA"
|
||||
config ATA_PIIX
|
||||
tristate "Intel ESB, ICH, PIIX3, PIIX4 PATA/SATA support"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for ICH5/6/7/8 Serial ATA
|
||||
and support for PATA on the Intel ESB/ICH/PIIX3/PIIX4 series
|
||||
@ -368,6 +416,7 @@ config SATA_DWC
|
||||
tristate "DesignWare Cores SATA support"
|
||||
depends on DMADEVICES
|
||||
select GENERIC_PHY
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the on-chip SATA controller of the
|
||||
AppliedMicro processor 460EX.
|
||||
@ -398,6 +447,7 @@ config SATA_DWC_VDEBUG
|
||||
config SATA_HIGHBANK
|
||||
tristate "Calxeda Highbank SATA support"
|
||||
depends on ARCH_HIGHBANK || COMPILE_TEST
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the Calxeda Highbank SoC's
|
||||
onboard SATA.
|
||||
@ -409,6 +459,7 @@ config SATA_MV
|
||||
depends on PCI || ARCH_DOVE || ARCH_MV78XX0 || \
|
||||
ARCH_MVEBU || ARCH_ORION5X || COMPILE_TEST
|
||||
select GENERIC_PHY
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the Marvell Serial ATA family.
|
||||
Currently supports 88SX[56]0[48][01] PCI(-X) chips,
|
||||
@ -419,6 +470,7 @@ config SATA_MV
|
||||
config SATA_NV
|
||||
tristate "NVIDIA SATA support"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for NVIDIA Serial ATA.
|
||||
|
||||
@ -427,6 +479,7 @@ config SATA_NV
|
||||
config SATA_PROMISE
|
||||
tristate "Promise SATA TX2/TX4 support"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Promise Serial ATA TX2/TX4.
|
||||
|
||||
@ -435,6 +488,7 @@ config SATA_PROMISE
|
||||
config SATA_RCAR
|
||||
tristate "Renesas R-Car SATA support"
|
||||
depends on ARCH_RENESAS || COMPILE_TEST
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Renesas R-Car Serial ATA.
|
||||
|
||||
@ -443,6 +497,7 @@ config SATA_RCAR
|
||||
config SATA_SIL
|
||||
tristate "Silicon Image SATA support"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Silicon Image Serial ATA.
|
||||
|
||||
@ -452,6 +507,7 @@ config SATA_SIS
|
||||
tristate "SiS 964/965/966/180 SATA support"
|
||||
depends on PCI
|
||||
select PATA_SIS
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for SiS Serial ATA on
|
||||
SiS 964/965/966/180 and Parallel ATA on SiS 180.
|
||||
@ -462,6 +518,7 @@ config SATA_SIS
|
||||
config SATA_SVW
|
||||
tristate "ServerWorks Frodo / Apple K2 SATA support"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Broadcom/Serverworks/Apple K2
|
||||
SATA support.
|
||||
@ -471,6 +528,7 @@ config SATA_SVW
|
||||
config SATA_ULI
|
||||
tristate "ULi Electronics SATA support"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for ULi Electronics SATA.
|
||||
|
||||
@ -479,6 +537,7 @@ config SATA_ULI
|
||||
config SATA_VIA
|
||||
tristate "VIA SATA support"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for VIA Serial ATA.
|
||||
|
||||
@ -487,6 +546,7 @@ config SATA_VIA
|
||||
config SATA_VITESSE
|
||||
tristate "VITESSE VSC-7174 / INTEL 31244 SATA support"
|
||||
depends on PCI
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Vitesse VSC7174 and Intel 31244 Serial ATA.
|
||||
|
||||
@ -497,6 +557,7 @@ comment "PATA SFF controllers with BMDMA"
|
||||
config PATA_ALI
|
||||
tristate "ALi PATA support"
|
||||
depends on PCI
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the ALi ATA interfaces
|
||||
found on the many ALi chipsets.
|
||||
@ -506,6 +567,7 @@ config PATA_ALI
|
||||
config PATA_AMD
|
||||
tristate "AMD/NVidia PATA support"
|
||||
depends on PCI
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the AMD and NVidia PATA
|
||||
interfaces found on the chipsets for Athlon/Athlon64.
|
||||
@ -540,6 +602,7 @@ config PATA_ATIIXP
|
||||
config PATA_ATP867X
|
||||
tristate "ARTOP/Acard ATP867X PATA support"
|
||||
depends on PCI
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for ARTOP/Acard ATP867X PATA
|
||||
controllers.
|
||||
@ -549,6 +612,7 @@ config PATA_ATP867X
|
||||
config PATA_BK3710
|
||||
tristate "Palmchip BK3710 PATA support"
|
||||
depends on ARCH_DAVINCI
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the integrated IDE controller on
|
||||
the TI DaVinci SoC.
|
||||
@ -558,6 +622,7 @@ config PATA_BK3710
|
||||
config PATA_CMD64X
|
||||
tristate "CMD64x PATA support"
|
||||
depends on PCI
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the CMD64x series chips
|
||||
except for the CMD640.
|
||||
@ -603,6 +668,7 @@ config PATA_CS5536
|
||||
config PATA_CYPRESS
|
||||
tristate "Cypress CY82C693 PATA support (Very Experimental)"
|
||||
depends on PCI
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the Cypress/Contaq CY82C693
|
||||
chipset found in some Alpha systems
|
||||
@ -621,6 +687,7 @@ config PATA_EFAR
|
||||
config PATA_EP93XX
|
||||
tristate "Cirrus Logic EP93xx PATA support"
|
||||
depends on ARCH_EP93XX
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the PATA controller in
|
||||
the Cirrus Logic EP9312 and EP9315 ARM CPU.
|
||||
@ -685,6 +752,7 @@ config PATA_HPT3X3_DMA
|
||||
config PATA_ICSIDE
|
||||
tristate "Acorn ICS PATA support"
|
||||
depends on ARM && ARCH_ACORN
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
On Acorn systems, say Y here if you wish to use the ICS PATA
|
||||
interface card. This is not required for ICS partition support.
|
||||
@ -693,6 +761,7 @@ config PATA_ICSIDE
|
||||
config PATA_IMX
|
||||
tristate "PATA support for Freescale iMX"
|
||||
depends on ARCH_MXC
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the PATA host available on Freescale
|
||||
iMX SoCs.
|
||||
@ -778,6 +847,7 @@ config PATA_NINJA32
|
||||
config PATA_NS87415
|
||||
tristate "Nat Semi NS87415 PATA support"
|
||||
depends on PCI
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the National Semiconductor
|
||||
NS87415 PCI-IDE controller.
|
||||
@ -902,6 +972,7 @@ config PATA_TRIFLEX
|
||||
config PATA_VIA
|
||||
tristate "VIA PATA support"
|
||||
depends on PCI
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the VIA PATA interfaces
|
||||
found on the many VIA chipsets.
|
||||
@ -935,6 +1006,7 @@ comment "PIO-only SFF controllers"
|
||||
config PATA_CMD640_PCI
|
||||
tristate "CMD640 PCI PATA support (Experimental)"
|
||||
depends on PCI
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the CMD640 PCI IDE
|
||||
interface chip. Only the primary channel is currently
|
||||
@ -1005,6 +1077,7 @@ config PATA_MPIIX
|
||||
config PATA_NS87410
|
||||
tristate "Nat Semi NS87410 PATA support"
|
||||
depends on PCI
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the National Semiconductor
|
||||
NS87410 PCI-IDE controller.
|
||||
@ -1085,6 +1158,7 @@ config PATA_RZ1000
|
||||
config PATA_SAMSUNG_CF
|
||||
tristate "Samsung SoC PATA support"
|
||||
depends on SAMSUNG_DEV_IDE
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables basic support for Samsung's S3C/S5P board
|
||||
PATA controllers via the new ATA layer
|
||||
@ -1104,6 +1178,7 @@ comment "Generic fallback / legacy drivers"
|
||||
config PATA_ACPI
|
||||
tristate "ACPI firmware driver for PATA"
|
||||
depends on ATA_ACPI && ATA_BMDMA && PCI
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables an ACPI method driver which drives
|
||||
motherboard PATA controller interfaces through the ACPI
|
||||
@ -1113,6 +1188,7 @@ config PATA_ACPI
|
||||
config ATA_GENERIC
|
||||
tristate "Generic ATA support"
|
||||
depends on PCI && ATA_BMDMA
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for generic BIOS configured
|
||||
ATA controllers via the new ATA layer
|
||||
@ -1122,6 +1198,7 @@ config ATA_GENERIC
|
||||
config PATA_LEGACY
|
||||
tristate "Legacy ISA PATA support (Experimental)"
|
||||
depends on (ISA || PCI)
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for ISA/VLB/PCI bus legacy PATA
|
||||
ports and allows them to be accessed via the new ATA layer.
|
||||
|
@ -123,7 +123,9 @@ obj-$(CONFIG_PATA_LEGACY) += pata_legacy.o
|
||||
|
||||
libata-y := libata-core.o libata-scsi.o libata-eh.o \
|
||||
libata-transport.o libata-trace.o
|
||||
libata-$(CONFIG_SATA_HOST) += libata-sata.o
|
||||
libata-$(CONFIG_ATA_SFF) += libata-sff.o
|
||||
libata-$(CONFIG_SATA_PMP) += libata-pmp.o
|
||||
libata-$(CONFIG_ATA_ACPI) += libata-acpi.o
|
||||
libata-$(CONFIG_SATA_ZPODD) += libata-zpodd.o
|
||||
libata-$(CONFIG_PATA_TIMINGS) += libata-pata-timings.o
|
||||
|
@ -40,6 +40,7 @@
|
||||
enum {
|
||||
AHCI_PCI_BAR_STA2X11 = 0,
|
||||
AHCI_PCI_BAR_CAVIUM = 0,
|
||||
AHCI_PCI_BAR_LOONGSON = 0,
|
||||
AHCI_PCI_BAR_ENMOTUS = 2,
|
||||
AHCI_PCI_BAR_CAVIUM_GEN5 = 4,
|
||||
AHCI_PCI_BAR_STANDARD = 5,
|
||||
@ -245,6 +246,7 @@ static const struct ata_port_info ahci_port_info[] = {
|
||||
|
||||
static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
/* Intel */
|
||||
{ PCI_VDEVICE(INTEL, 0x06d6), board_ahci }, /* Comet Lake PCH-H RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x2652), board_ahci }, /* ICH6 */
|
||||
{ PCI_VDEVICE(INTEL, 0x2653), board_ahci }, /* ICH6M */
|
||||
{ PCI_VDEVICE(INTEL, 0x27c1), board_ahci }, /* ICH7 */
|
||||
@ -401,6 +403,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0xa252), board_ahci }, /* Lewisburg RAID*/
|
||||
{ PCI_VDEVICE(INTEL, 0xa256), board_ahci }, /* Lewisburg RAID*/
|
||||
{ PCI_VDEVICE(INTEL, 0xa356), board_ahci }, /* Cannon Lake PCH-H RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x06d7), board_ahci }, /* Comet Lake-H RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0xa386), board_ahci }, /* Comet Lake PCH-V RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x0f22), board_ahci_mobile }, /* Bay Trail AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x0f23), board_ahci_mobile }, /* Bay Trail AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x22a3), board_ahci_mobile }, /* Cherry Tr. AHCI */
|
||||
@ -589,6 +593,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
/* Enmotus */
|
||||
{ PCI_DEVICE(0x1c44, 0x8000), board_ahci },
|
||||
|
||||
/* Loongson */
|
||||
{ PCI_VDEVICE(LOONGSON, 0x7a08), board_ahci },
|
||||
|
||||
/* Generic, PCI class code for AHCI */
|
||||
{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
||||
PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci },
|
||||
@ -1680,6 +1687,9 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
ahci_pci_bar = AHCI_PCI_BAR_CAVIUM;
|
||||
if (pdev->device == 0xa084)
|
||||
ahci_pci_bar = AHCI_PCI_BAR_CAVIUM_GEN5;
|
||||
} else if (pdev->vendor == PCI_VENDOR_ID_LOONGSON) {
|
||||
if (pdev->device == 0x7a08)
|
||||
ahci_pci_bar = AHCI_PCI_BAR_LOONGSON;
|
||||
}
|
||||
|
||||
/* acquire resources */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -2,10 +2,6 @@
|
||||
/*
|
||||
* libata-eh.c - libata error handling
|
||||
*
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
* Copyright 2006 Tejun Heo <htejun@gmail.com>
|
||||
*
|
||||
* libata documentation is available via 'make {ps|pdf}docs',
|
||||
@ -184,6 +180,7 @@ void __ata_ehi_push_desc(struct ata_eh_info *ehi, const char *fmt, ...)
|
||||
__ata_ehi_pushv_desc(ehi, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__ata_ehi_push_desc);
|
||||
|
||||
/**
|
||||
* ata_ehi_push_desc - push error description with separator
|
||||
@ -207,6 +204,7 @@ void ata_ehi_push_desc(struct ata_eh_info *ehi, const char *fmt, ...)
|
||||
__ata_ehi_pushv_desc(ehi, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_ehi_push_desc);
|
||||
|
||||
/**
|
||||
* ata_ehi_clear_desc - clean error description
|
||||
@ -222,6 +220,7 @@ void ata_ehi_clear_desc(struct ata_eh_info *ehi)
|
||||
ehi->desc[0] = '\0';
|
||||
ehi->desc_len = 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_ehi_clear_desc);
|
||||
|
||||
/**
|
||||
* ata_port_desc - append port description
|
||||
@ -249,9 +248,9 @@ void ata_port_desc(struct ata_port *ap, const char *fmt, ...)
|
||||
__ata_ehi_pushv_desc(&ap->link.eh_info, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_port_desc);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
|
||||
/**
|
||||
* ata_port_pbar_desc - append PCI BAR description
|
||||
* @ap: target ATA port
|
||||
@ -288,7 +287,7 @@ void ata_port_pbar_desc(struct ata_port *ap, int bar, ssize_t offset,
|
||||
ata_port_desc(ap, "%s 0x%llx", name,
|
||||
start + (unsigned long long)offset);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(ata_port_pbar_desc);
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
static int ata_lookup_timeout_table(u8 cmd)
|
||||
@ -973,6 +972,7 @@ void ata_port_schedule_eh(struct ata_port *ap)
|
||||
/* see: ata_std_sched_eh, unless you know better */
|
||||
ap->ops->sched_eh(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_port_schedule_eh);
|
||||
|
||||
static int ata_do_link_abort(struct ata_port *ap, struct ata_link *link)
|
||||
{
|
||||
@ -1015,6 +1015,7 @@ int ata_link_abort(struct ata_link *link)
|
||||
{
|
||||
return ata_do_link_abort(link->ap, link);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_link_abort);
|
||||
|
||||
/**
|
||||
* ata_port_abort - abort all qc's on the port
|
||||
@ -1032,6 +1033,7 @@ int ata_port_abort(struct ata_port *ap)
|
||||
{
|
||||
return ata_do_link_abort(ap, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_port_abort);
|
||||
|
||||
/**
|
||||
* __ata_port_freeze - freeze port
|
||||
@ -1088,79 +1090,7 @@ int ata_port_freeze(struct ata_port *ap)
|
||||
|
||||
return nr_aborted;
|
||||
}
|
||||
|
||||
/**
|
||||
* sata_async_notification - SATA async notification handler
|
||||
* @ap: ATA port where async notification is received
|
||||
*
|
||||
* Handler to be called when async notification via SDB FIS is
|
||||
* received. This function schedules EH if necessary.
|
||||
*
|
||||
* LOCKING:
|
||||
* spin_lock_irqsave(host lock)
|
||||
*
|
||||
* RETURNS:
|
||||
* 1 if EH is scheduled, 0 otherwise.
|
||||
*/
|
||||
int sata_async_notification(struct ata_port *ap)
|
||||
{
|
||||
u32 sntf;
|
||||
int rc;
|
||||
|
||||
if (!(ap->flags & ATA_FLAG_AN))
|
||||
return 0;
|
||||
|
||||
rc = sata_scr_read(&ap->link, SCR_NOTIFICATION, &sntf);
|
||||
if (rc == 0)
|
||||
sata_scr_write(&ap->link, SCR_NOTIFICATION, sntf);
|
||||
|
||||
if (!sata_pmp_attached(ap) || rc) {
|
||||
/* PMP is not attached or SNTF is not available */
|
||||
if (!sata_pmp_attached(ap)) {
|
||||
/* PMP is not attached. Check whether ATAPI
|
||||
* AN is configured. If so, notify media
|
||||
* change.
|
||||
*/
|
||||
struct ata_device *dev = ap->link.device;
|
||||
|
||||
if ((dev->class == ATA_DEV_ATAPI) &&
|
||||
(dev->flags & ATA_DFLAG_AN))
|
||||
ata_scsi_media_change_notify(dev);
|
||||
return 0;
|
||||
} else {
|
||||
/* PMP is attached but SNTF is not available.
|
||||
* ATAPI async media change notification is
|
||||
* not used. The PMP must be reporting PHY
|
||||
* status change, schedule EH.
|
||||
*/
|
||||
ata_port_schedule_eh(ap);
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
/* PMP is attached and SNTF is available */
|
||||
struct ata_link *link;
|
||||
|
||||
/* check and notify ATAPI AN */
|
||||
ata_for_each_link(link, ap, EDGE) {
|
||||
if (!(sntf & (1 << link->pmp)))
|
||||
continue;
|
||||
|
||||
if ((link->device->class == ATA_DEV_ATAPI) &&
|
||||
(link->device->flags & ATA_DFLAG_AN))
|
||||
ata_scsi_media_change_notify(link->device);
|
||||
}
|
||||
|
||||
/* If PMP is reporting that PHY status of some
|
||||
* downstream ports has changed, schedule EH.
|
||||
*/
|
||||
if (sntf & (1 << SATA_PMP_CTRL_PORT)) {
|
||||
ata_port_schedule_eh(ap);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_port_freeze);
|
||||
|
||||
/**
|
||||
* ata_eh_freeze_port - EH helper to freeze port
|
||||
@ -1182,6 +1112,7 @@ void ata_eh_freeze_port(struct ata_port *ap)
|
||||
__ata_port_freeze(ap);
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_eh_freeze_port);
|
||||
|
||||
/**
|
||||
* ata_port_thaw_port - EH helper to thaw port
|
||||
@ -1289,6 +1220,7 @@ void ata_dev_disable(struct ata_device *dev)
|
||||
*/
|
||||
ata_ering_clear(&dev->ering);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_dev_disable);
|
||||
|
||||
/**
|
||||
* ata_eh_detach_dev - detach ATA device
|
||||
@ -1419,62 +1351,6 @@ static const char *ata_err_string(unsigned int err_mask)
|
||||
return "unknown error";
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_eh_read_log_10h - Read log page 10h for NCQ error details
|
||||
* @dev: Device to read log page 10h from
|
||||
* @tag: Resulting tag of the failed command
|
||||
* @tf: Resulting taskfile registers of the failed command
|
||||
*
|
||||
* Read log page 10h to obtain NCQ error details and clear error
|
||||
* condition.
|
||||
*
|
||||
* LOCKING:
|
||||
* Kernel thread context (may sleep).
|
||||
*
|
||||
* RETURNS:
|
||||
* 0 on success, -errno otherwise.
|
||||
*/
|
||||
static int ata_eh_read_log_10h(struct ata_device *dev,
|
||||
int *tag, struct ata_taskfile *tf)
|
||||
{
|
||||
u8 *buf = dev->link->ap->sector_buf;
|
||||
unsigned int err_mask;
|
||||
u8 csum;
|
||||
int i;
|
||||
|
||||
err_mask = ata_read_log_page(dev, ATA_LOG_SATA_NCQ, 0, buf, 1);
|
||||
if (err_mask)
|
||||
return -EIO;
|
||||
|
||||
csum = 0;
|
||||
for (i = 0; i < ATA_SECT_SIZE; i++)
|
||||
csum += buf[i];
|
||||
if (csum)
|
||||
ata_dev_warn(dev, "invalid checksum 0x%x on log page 10h\n",
|
||||
csum);
|
||||
|
||||
if (buf[0] & 0x80)
|
||||
return -ENOENT;
|
||||
|
||||
*tag = buf[0] & 0x1f;
|
||||
|
||||
tf->command = buf[2];
|
||||
tf->feature = buf[3];
|
||||
tf->lbal = buf[4];
|
||||
tf->lbam = buf[5];
|
||||
tf->lbah = buf[6];
|
||||
tf->device = buf[7];
|
||||
tf->hob_lbal = buf[8];
|
||||
tf->hob_lbam = buf[9];
|
||||
tf->hob_lbah = buf[10];
|
||||
tf->nsect = buf[12];
|
||||
tf->hob_nsect = buf[13];
|
||||
if (dev->class == ATA_DEV_ZAC && ata_id_has_ncq_autosense(dev->id))
|
||||
tf->auxiliary = buf[14] << 16 | buf[15] << 8 | buf[16];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* atapi_eh_tur - perform ATAPI TEST_UNIT_READY
|
||||
* @dev: target ATAPI device
|
||||
@ -1658,80 +1534,6 @@ static void ata_eh_analyze_serror(struct ata_link *link)
|
||||
ehc->i.action |= action;
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_eh_analyze_ncq_error - analyze NCQ error
|
||||
* @link: ATA link to analyze NCQ error for
|
||||
*
|
||||
* Read log page 10h, determine the offending qc and acquire
|
||||
* error status TF. For NCQ device errors, all LLDDs have to do
|
||||
* is setting AC_ERR_DEV in ehi->err_mask. This function takes
|
||||
* care of the rest.
|
||||
*
|
||||
* LOCKING:
|
||||
* Kernel thread context (may sleep).
|
||||
*/
|
||||
void ata_eh_analyze_ncq_error(struct ata_link *link)
|
||||
{
|
||||
struct ata_port *ap = link->ap;
|
||||
struct ata_eh_context *ehc = &link->eh_context;
|
||||
struct ata_device *dev = link->device;
|
||||
struct ata_queued_cmd *qc;
|
||||
struct ata_taskfile tf;
|
||||
int tag, rc;
|
||||
|
||||
/* if frozen, we can't do much */
|
||||
if (ap->pflags & ATA_PFLAG_FROZEN)
|
||||
return;
|
||||
|
||||
/* is it NCQ device error? */
|
||||
if (!link->sactive || !(ehc->i.err_mask & AC_ERR_DEV))
|
||||
return;
|
||||
|
||||
/* has LLDD analyzed already? */
|
||||
ata_qc_for_each_raw(ap, qc, tag) {
|
||||
if (!(qc->flags & ATA_QCFLAG_FAILED))
|
||||
continue;
|
||||
|
||||
if (qc->err_mask)
|
||||
return;
|
||||
}
|
||||
|
||||
/* okay, this error is ours */
|
||||
memset(&tf, 0, sizeof(tf));
|
||||
rc = ata_eh_read_log_10h(dev, &tag, &tf);
|
||||
if (rc) {
|
||||
ata_link_err(link, "failed to read log page 10h (errno=%d)\n",
|
||||
rc);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(link->sactive & (1 << tag))) {
|
||||
ata_link_err(link, "log page 10h reported inactive tag %d\n",
|
||||
tag);
|
||||
return;
|
||||
}
|
||||
|
||||
/* we've got the perpetrator, condemn it */
|
||||
qc = __ata_qc_from_tag(ap, tag);
|
||||
memcpy(&qc->result_tf, &tf, sizeof(tf));
|
||||
qc->result_tf.flags = ATA_TFLAG_ISADDR | ATA_TFLAG_LBA | ATA_TFLAG_LBA48;
|
||||
qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ;
|
||||
if (dev->class == ATA_DEV_ZAC &&
|
||||
((qc->result_tf.command & ATA_SENSE) || qc->result_tf.auxiliary)) {
|
||||
char sense_key, asc, ascq;
|
||||
|
||||
sense_key = (qc->result_tf.auxiliary >> 16) & 0xff;
|
||||
asc = (qc->result_tf.auxiliary >> 8) & 0xff;
|
||||
ascq = qc->result_tf.auxiliary & 0xff;
|
||||
ata_scsi_set_sense(dev, qc->scsicmd, sense_key, asc, ascq);
|
||||
ata_scsi_set_sense_information(dev, qc->scsicmd,
|
||||
&qc->result_tf);
|
||||
qc->flags |= ATA_QCFLAG_SENSE_VALID;
|
||||
}
|
||||
|
||||
ehc->i.err_mask &= ~AC_ERR_DEV;
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_eh_analyze_tf - analyze taskfile of a failed qc
|
||||
* @qc: qc to analyze
|
||||
@ -3436,7 +3238,8 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
||||
int rc;
|
||||
|
||||
/* if the link or host doesn't do LPM, noop */
|
||||
if ((link->flags & ATA_LFLAG_NO_LPM) || (ap && !ap->ops->set_lpm))
|
||||
if (!IS_ENABLED(CONFIG_SATA_HOST) ||
|
||||
(link->flags & ATA_LFLAG_NO_LPM) || (ap && !ap->ops->set_lpm))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
@ -4052,6 +3855,7 @@ void ata_std_error_handler(struct ata_port *ap)
|
||||
|
||||
ata_do_eh(ap, ops->prereset, ops->softreset, hardreset, ops->postreset);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_std_error_handler);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
/**
|
||||
|
192
drivers/ata/libata-pata-timings.c
Normal file
192
drivers/ata/libata-pata-timings.c
Normal file
@ -0,0 +1,192 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* Helper library for PATA timings
|
||||
*
|
||||
* Copyright 2003-2004 Red Hat, Inc. All rights reserved.
|
||||
* Copyright 2003-2004 Jeff Garzik
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/libata.h>
|
||||
|
||||
/*
|
||||
* This mode timing computation functionality is ported over from
|
||||
* drivers/ide/ide-timing.h and was originally written by Vojtech Pavlik
|
||||
*/
|
||||
/*
|
||||
* PIO 0-4, MWDMA 0-2 and UDMA 0-6 timings (in nanoseconds).
|
||||
* These were taken from ATA/ATAPI-6 standard, rev 0a, except
|
||||
* for UDMA6, which is currently supported only by Maxtor drives.
|
||||
*
|
||||
* For PIO 5/6 MWDMA 3/4 see the CFA specification 3.0.
|
||||
*/
|
||||
|
||||
static const struct ata_timing ata_timing[] = {
|
||||
/* { XFER_PIO_SLOW, 120, 290, 240, 960, 290, 240, 0, 960, 0 }, */
|
||||
{ XFER_PIO_0, 70, 290, 240, 600, 165, 150, 0, 600, 0 },
|
||||
{ XFER_PIO_1, 50, 290, 93, 383, 125, 100, 0, 383, 0 },
|
||||
{ XFER_PIO_2, 30, 290, 40, 330, 100, 90, 0, 240, 0 },
|
||||
{ XFER_PIO_3, 30, 80, 70, 180, 80, 70, 0, 180, 0 },
|
||||
{ XFER_PIO_4, 25, 70, 25, 120, 70, 25, 0, 120, 0 },
|
||||
{ XFER_PIO_5, 15, 65, 25, 100, 65, 25, 0, 100, 0 },
|
||||
{ XFER_PIO_6, 10, 55, 20, 80, 55, 20, 0, 80, 0 },
|
||||
|
||||
{ XFER_SW_DMA_0, 120, 0, 0, 0, 480, 480, 50, 960, 0 },
|
||||
{ XFER_SW_DMA_1, 90, 0, 0, 0, 240, 240, 30, 480, 0 },
|
||||
{ XFER_SW_DMA_2, 60, 0, 0, 0, 120, 120, 20, 240, 0 },
|
||||
|
||||
{ XFER_MW_DMA_0, 60, 0, 0, 0, 215, 215, 20, 480, 0 },
|
||||
{ XFER_MW_DMA_1, 45, 0, 0, 0, 80, 50, 5, 150, 0 },
|
||||
{ XFER_MW_DMA_2, 25, 0, 0, 0, 70, 25, 5, 120, 0 },
|
||||
{ XFER_MW_DMA_3, 25, 0, 0, 0, 65, 25, 5, 100, 0 },
|
||||
{ XFER_MW_DMA_4, 25, 0, 0, 0, 55, 20, 5, 80, 0 },
|
||||
|
||||
/* { XFER_UDMA_SLOW, 0, 0, 0, 0, 0, 0, 0, 0, 150 }, */
|
||||
{ XFER_UDMA_0, 0, 0, 0, 0, 0, 0, 0, 0, 120 },
|
||||
{ XFER_UDMA_1, 0, 0, 0, 0, 0, 0, 0, 0, 80 },
|
||||
{ XFER_UDMA_2, 0, 0, 0, 0, 0, 0, 0, 0, 60 },
|
||||
{ XFER_UDMA_3, 0, 0, 0, 0, 0, 0, 0, 0, 45 },
|
||||
{ XFER_UDMA_4, 0, 0, 0, 0, 0, 0, 0, 0, 30 },
|
||||
{ XFER_UDMA_5, 0, 0, 0, 0, 0, 0, 0, 0, 20 },
|
||||
{ XFER_UDMA_6, 0, 0, 0, 0, 0, 0, 0, 0, 15 },
|
||||
|
||||
{ 0xFF }
|
||||
};
|
||||
|
||||
#define ENOUGH(v, unit) (((v)-1)/(unit)+1)
|
||||
#define EZ(v, unit) ((v)?ENOUGH(((v) * 1000), unit):0)
|
||||
|
||||
static void ata_timing_quantize(const struct ata_timing *t,
|
||||
struct ata_timing *q, int T, int UT)
|
||||
{
|
||||
q->setup = EZ(t->setup, T);
|
||||
q->act8b = EZ(t->act8b, T);
|
||||
q->rec8b = EZ(t->rec8b, T);
|
||||
q->cyc8b = EZ(t->cyc8b, T);
|
||||
q->active = EZ(t->active, T);
|
||||
q->recover = EZ(t->recover, T);
|
||||
q->dmack_hold = EZ(t->dmack_hold, T);
|
||||
q->cycle = EZ(t->cycle, T);
|
||||
q->udma = EZ(t->udma, UT);
|
||||
}
|
||||
|
||||
void ata_timing_merge(const struct ata_timing *a, const struct ata_timing *b,
|
||||
struct ata_timing *m, unsigned int what)
|
||||
{
|
||||
if (what & ATA_TIMING_SETUP)
|
||||
m->setup = max(a->setup, b->setup);
|
||||
if (what & ATA_TIMING_ACT8B)
|
||||
m->act8b = max(a->act8b, b->act8b);
|
||||
if (what & ATA_TIMING_REC8B)
|
||||
m->rec8b = max(a->rec8b, b->rec8b);
|
||||
if (what & ATA_TIMING_CYC8B)
|
||||
m->cyc8b = max(a->cyc8b, b->cyc8b);
|
||||
if (what & ATA_TIMING_ACTIVE)
|
||||
m->active = max(a->active, b->active);
|
||||
if (what & ATA_TIMING_RECOVER)
|
||||
m->recover = max(a->recover, b->recover);
|
||||
if (what & ATA_TIMING_DMACK_HOLD)
|
||||
m->dmack_hold = max(a->dmack_hold, b->dmack_hold);
|
||||
if (what & ATA_TIMING_CYCLE)
|
||||
m->cycle = max(a->cycle, b->cycle);
|
||||
if (what & ATA_TIMING_UDMA)
|
||||
m->udma = max(a->udma, b->udma);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_timing_merge);
|
||||
|
||||
const struct ata_timing *ata_timing_find_mode(u8 xfer_mode)
|
||||
{
|
||||
const struct ata_timing *t = ata_timing;
|
||||
|
||||
while (xfer_mode > t->mode)
|
||||
t++;
|
||||
|
||||
if (xfer_mode == t->mode)
|
||||
return t;
|
||||
|
||||
WARN_ONCE(true, "%s: unable to find timing for xfer_mode 0x%x\n",
|
||||
__func__, xfer_mode);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_timing_find_mode);
|
||||
|
||||
int ata_timing_compute(struct ata_device *adev, unsigned short speed,
|
||||
struct ata_timing *t, int T, int UT)
|
||||
{
|
||||
const u16 *id = adev->id;
|
||||
const struct ata_timing *s;
|
||||
struct ata_timing p;
|
||||
|
||||
/*
|
||||
* Find the mode.
|
||||
*/
|
||||
s = ata_timing_find_mode(speed);
|
||||
if (!s)
|
||||
return -EINVAL;
|
||||
|
||||
memcpy(t, s, sizeof(*s));
|
||||
|
||||
/*
|
||||
* If the drive is an EIDE drive, it can tell us it needs extended
|
||||
* PIO/MW_DMA cycle timing.
|
||||
*/
|
||||
|
||||
if (id[ATA_ID_FIELD_VALID] & 2) { /* EIDE drive */
|
||||
memset(&p, 0, sizeof(p));
|
||||
|
||||
if (speed >= XFER_PIO_0 && speed < XFER_SW_DMA_0) {
|
||||
if (speed <= XFER_PIO_2)
|
||||
p.cycle = p.cyc8b = id[ATA_ID_EIDE_PIO];
|
||||
else if ((speed <= XFER_PIO_4) ||
|
||||
(speed == XFER_PIO_5 && !ata_id_is_cfa(id)))
|
||||
p.cycle = p.cyc8b = id[ATA_ID_EIDE_PIO_IORDY];
|
||||
} else if (speed >= XFER_MW_DMA_0 && speed <= XFER_MW_DMA_2)
|
||||
p.cycle = id[ATA_ID_EIDE_DMA_MIN];
|
||||
|
||||
ata_timing_merge(&p, t, t, ATA_TIMING_CYCLE | ATA_TIMING_CYC8B);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert the timing to bus clock counts.
|
||||
*/
|
||||
|
||||
ata_timing_quantize(t, t, T, UT);
|
||||
|
||||
/*
|
||||
* Even in DMA/UDMA modes we still use PIO access for IDENTIFY,
|
||||
* S.M.A.R.T * and some other commands. We have to ensure that the
|
||||
* DMA cycle timing is slower/equal than the fastest PIO timing.
|
||||
*/
|
||||
|
||||
if (speed > XFER_PIO_6) {
|
||||
ata_timing_compute(adev, adev->pio_mode, &p, T, UT);
|
||||
ata_timing_merge(&p, t, t, ATA_TIMING_ALL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Lengthen active & recovery time so that cycle time is correct.
|
||||
*/
|
||||
|
||||
if (t->act8b + t->rec8b < t->cyc8b) {
|
||||
t->act8b += (t->cyc8b - (t->act8b + t->rec8b)) / 2;
|
||||
t->rec8b = t->cyc8b - t->act8b;
|
||||
}
|
||||
|
||||
if (t->active + t->recover < t->cycle) {
|
||||
t->active += (t->cycle - (t->active + t->recover)) / 2;
|
||||
t->recover = t->cycle - t->active;
|
||||
}
|
||||
|
||||
/*
|
||||
* In a few cases quantisation may produce enough errors to
|
||||
* leave t->cycle too low for the sum of active and recovery
|
||||
* if so we must correct this.
|
||||
*/
|
||||
if (t->active + t->recover > t->cycle)
|
||||
t->cycle = t->active + t->recover;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_timing_compute);
|
1483
drivers/ata/libata-sata.c
Normal file
1483
drivers/ata/libata-sata.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -2,10 +2,6 @@
|
||||
/*
|
||||
* libata-scsi.c - helper library for ATA
|
||||
*
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
* Copyright 2003-2004 Red Hat, Inc. All rights reserved.
|
||||
* Copyright 2003-2004 Jeff Garzik
|
||||
*
|
||||
@ -36,11 +32,12 @@
|
||||
#include <linux/suspend.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/ioprio.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#include "libata.h"
|
||||
#include "libata-transport.h"
|
||||
|
||||
#define ATA_SCSI_RBUF_SIZE 4096
|
||||
#define ATA_SCSI_RBUF_SIZE 576
|
||||
|
||||
static DEFINE_SPINLOCK(ata_scsi_rbuf_lock);
|
||||
static u8 ata_scsi_rbuf[ATA_SCSI_RBUF_SIZE];
|
||||
@ -49,8 +46,6 @@ typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *qc);
|
||||
|
||||
static struct ata_device *__ata_scsi_find_dev(struct ata_port *ap,
|
||||
const struct scsi_device *scsidev);
|
||||
static struct ata_device *ata_scsi_find_dev(struct ata_port *ap,
|
||||
const struct scsi_device *scsidev);
|
||||
|
||||
#define RW_RECOVERY_MPAGE 0x1
|
||||
#define RW_RECOVERY_MPAGE_LEN 12
|
||||
@ -90,71 +85,6 @@ static const u8 def_control_mpage[CONTROL_MPAGE_LEN] = {
|
||||
0, 30 /* extended self test time, see 05-359r1 */
|
||||
};
|
||||
|
||||
static const char *ata_lpm_policy_names[] = {
|
||||
[ATA_LPM_UNKNOWN] = "max_performance",
|
||||
[ATA_LPM_MAX_POWER] = "max_performance",
|
||||
[ATA_LPM_MED_POWER] = "medium_power",
|
||||
[ATA_LPM_MED_POWER_WITH_DIPM] = "med_power_with_dipm",
|
||||
[ATA_LPM_MIN_POWER_WITH_PARTIAL] = "min_power_with_partial",
|
||||
[ATA_LPM_MIN_POWER] = "min_power",
|
||||
};
|
||||
|
||||
static ssize_t ata_scsi_lpm_store(struct device *device,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct Scsi_Host *shost = class_to_shost(device);
|
||||
struct ata_port *ap = ata_shost_to_port(shost);
|
||||
struct ata_link *link;
|
||||
struct ata_device *dev;
|
||||
enum ata_lpm_policy policy;
|
||||
unsigned long flags;
|
||||
|
||||
/* UNKNOWN is internal state, iterate from MAX_POWER */
|
||||
for (policy = ATA_LPM_MAX_POWER;
|
||||
policy < ARRAY_SIZE(ata_lpm_policy_names); policy++) {
|
||||
const char *name = ata_lpm_policy_names[policy];
|
||||
|
||||
if (strncmp(name, buf, strlen(name)) == 0)
|
||||
break;
|
||||
}
|
||||
if (policy == ARRAY_SIZE(ata_lpm_policy_names))
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
|
||||
ata_for_each_link(link, ap, EDGE) {
|
||||
ata_for_each_dev(dev, &ap->link, ENABLED) {
|
||||
if (dev->horkage & ATA_HORKAGE_NOLPM) {
|
||||
count = -EOPNOTSUPP;
|
||||
goto out_unlock;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ap->target_lpm_policy = policy;
|
||||
ata_port_schedule_eh(ap);
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t ata_scsi_lpm_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct Scsi_Host *shost = class_to_shost(dev);
|
||||
struct ata_port *ap = ata_shost_to_port(shost);
|
||||
|
||||
if (ap->target_lpm_policy >= ARRAY_SIZE(ata_lpm_policy_names))
|
||||
return -EINVAL;
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n",
|
||||
ata_lpm_policy_names[ap->target_lpm_policy]);
|
||||
}
|
||||
DEVICE_ATTR(link_power_management_policy, S_IRUGO | S_IWUSR,
|
||||
ata_scsi_lpm_show, ata_scsi_lpm_store);
|
||||
EXPORT_SYMBOL_GPL(dev_attr_link_power_management_policy);
|
||||
|
||||
static ssize_t ata_scsi_park_show(struct device *device,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
@ -258,83 +188,6 @@ DEVICE_ATTR(unload_heads, S_IRUGO | S_IWUSR,
|
||||
ata_scsi_park_show, ata_scsi_park_store);
|
||||
EXPORT_SYMBOL_GPL(dev_attr_unload_heads);
|
||||
|
||||
static ssize_t ata_ncq_prio_enable_show(struct device *device,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct scsi_device *sdev = to_scsi_device(device);
|
||||
struct ata_port *ap;
|
||||
struct ata_device *dev;
|
||||
bool ncq_prio_enable;
|
||||
int rc = 0;
|
||||
|
||||
ap = ata_shost_to_port(sdev->host);
|
||||
|
||||
spin_lock_irq(ap->lock);
|
||||
dev = ata_scsi_find_dev(ap, sdev);
|
||||
if (!dev) {
|
||||
rc = -ENODEV;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
ncq_prio_enable = dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLE;
|
||||
|
||||
unlock:
|
||||
spin_unlock_irq(ap->lock);
|
||||
|
||||
return rc ? rc : snprintf(buf, 20, "%u\n", ncq_prio_enable);
|
||||
}
|
||||
|
||||
static ssize_t ata_ncq_prio_enable_store(struct device *device,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t len)
|
||||
{
|
||||
struct scsi_device *sdev = to_scsi_device(device);
|
||||
struct ata_port *ap;
|
||||
struct ata_device *dev;
|
||||
long int input;
|
||||
int rc;
|
||||
|
||||
rc = kstrtol(buf, 10, &input);
|
||||
if (rc)
|
||||
return rc;
|
||||
if ((input < 0) || (input > 1))
|
||||
return -EINVAL;
|
||||
|
||||
ap = ata_shost_to_port(sdev->host);
|
||||
dev = ata_scsi_find_dev(ap, sdev);
|
||||
if (unlikely(!dev))
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_irq(ap->lock);
|
||||
if (input)
|
||||
dev->flags |= ATA_DFLAG_NCQ_PRIO_ENABLE;
|
||||
else
|
||||
dev->flags &= ~ATA_DFLAG_NCQ_PRIO_ENABLE;
|
||||
|
||||
dev->link->eh_info.action |= ATA_EH_REVALIDATE;
|
||||
dev->link->eh_info.flags |= ATA_EHI_QUIET;
|
||||
ata_port_schedule_eh(ap);
|
||||
spin_unlock_irq(ap->lock);
|
||||
|
||||
ata_port_wait_eh(ap);
|
||||
|
||||
if (input) {
|
||||
spin_lock_irq(ap->lock);
|
||||
if (!(dev->flags & ATA_DFLAG_NCQ_PRIO)) {
|
||||
dev->flags &= ~ATA_DFLAG_NCQ_PRIO_ENABLE;
|
||||
rc = -EIO;
|
||||
}
|
||||
spin_unlock_irq(ap->lock);
|
||||
}
|
||||
|
||||
return rc ? rc : len;
|
||||
}
|
||||
|
||||
DEVICE_ATTR(ncq_prio_enable, S_IRUGO | S_IWUSR,
|
||||
ata_ncq_prio_enable_show, ata_ncq_prio_enable_store);
|
||||
EXPORT_SYMBOL_GPL(dev_attr_ncq_prio_enable);
|
||||
|
||||
void ata_scsi_set_sense(struct ata_device *dev, struct scsi_cmnd *cmd,
|
||||
u8 sk, u8 asc, u8 ascq)
|
||||
{
|
||||
@ -383,90 +236,8 @@ static void ata_scsi_set_invalid_parameter(struct ata_device *dev,
|
||||
field, 0xff, 0);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
ata_scsi_em_message_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct Scsi_Host *shost = class_to_shost(dev);
|
||||
struct ata_port *ap = ata_shost_to_port(shost);
|
||||
if (ap->ops->em_store && (ap->flags & ATA_FLAG_EM))
|
||||
return ap->ops->em_store(ap, buf, count);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
ata_scsi_em_message_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct Scsi_Host *shost = class_to_shost(dev);
|
||||
struct ata_port *ap = ata_shost_to_port(shost);
|
||||
|
||||
if (ap->ops->em_show && (ap->flags & ATA_FLAG_EM))
|
||||
return ap->ops->em_show(ap, buf);
|
||||
return -EINVAL;
|
||||
}
|
||||
DEVICE_ATTR(em_message, S_IRUGO | S_IWUSR,
|
||||
ata_scsi_em_message_show, ata_scsi_em_message_store);
|
||||
EXPORT_SYMBOL_GPL(dev_attr_em_message);
|
||||
|
||||
static ssize_t
|
||||
ata_scsi_em_message_type_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct Scsi_Host *shost = class_to_shost(dev);
|
||||
struct ata_port *ap = ata_shost_to_port(shost);
|
||||
|
||||
return snprintf(buf, 23, "%d\n", ap->em_message_type);
|
||||
}
|
||||
DEVICE_ATTR(em_message_type, S_IRUGO,
|
||||
ata_scsi_em_message_type_show, NULL);
|
||||
EXPORT_SYMBOL_GPL(dev_attr_em_message_type);
|
||||
|
||||
static ssize_t
|
||||
ata_scsi_activity_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct scsi_device *sdev = to_scsi_device(dev);
|
||||
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
||||
struct ata_device *atadev = ata_scsi_find_dev(ap, sdev);
|
||||
|
||||
if (atadev && ap->ops->sw_activity_show &&
|
||||
(ap->flags & ATA_FLAG_SW_ACTIVITY))
|
||||
return ap->ops->sw_activity_show(atadev, buf);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
ata_scsi_activity_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct scsi_device *sdev = to_scsi_device(dev);
|
||||
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
||||
struct ata_device *atadev = ata_scsi_find_dev(ap, sdev);
|
||||
enum sw_activity val;
|
||||
int rc;
|
||||
|
||||
if (atadev && ap->ops->sw_activity_store &&
|
||||
(ap->flags & ATA_FLAG_SW_ACTIVITY)) {
|
||||
val = simple_strtoul(buf, NULL, 0);
|
||||
switch (val) {
|
||||
case OFF: case BLINK_ON: case BLINK_OFF:
|
||||
rc = ap->ops->sw_activity_store(atadev, val);
|
||||
if (!rc)
|
||||
return count;
|
||||
else
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
DEVICE_ATTR(sw_activity, S_IWUSR | S_IRUGO, ata_scsi_activity_show,
|
||||
ata_scsi_activity_store);
|
||||
EXPORT_SYMBOL_GPL(dev_attr_sw_activity);
|
||||
|
||||
struct device_attribute *ata_common_sdev_attrs[] = {
|
||||
&dev_attr_unload_heads,
|
||||
&dev_attr_ncq_prio_enable,
|
||||
NULL
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(ata_common_sdev_attrs);
|
||||
@ -499,6 +270,7 @@ int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev,
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_std_bios_param);
|
||||
|
||||
/**
|
||||
* ata_scsi_unlock_native_capacity - unlock native capacity
|
||||
@ -528,6 +300,7 @@ void ata_scsi_unlock_native_capacity(struct scsi_device *sdev)
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
ata_port_wait_eh(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_unlock_native_capacity);
|
||||
|
||||
/**
|
||||
* ata_get_identity - Handler for HDIO_GET_IDENTITY ioctl
|
||||
@ -1215,7 +988,7 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
|
||||
scsi_set_sense_information(sb, SCSI_SENSE_BUFFERSIZE, block);
|
||||
}
|
||||
|
||||
static void ata_scsi_sdev_config(struct scsi_device *sdev)
|
||||
void ata_scsi_sdev_config(struct scsi_device *sdev)
|
||||
{
|
||||
sdev->use_10_for_rw = 1;
|
||||
sdev->use_10_for_ms = 1;
|
||||
@ -1255,8 +1028,7 @@ static int atapi_drain_needed(struct request *rq)
|
||||
return atapi_cmd_type(scsi_req(rq)->cmd[0]) == ATAPI_MISC;
|
||||
}
|
||||
|
||||
static int ata_scsi_dev_config(struct scsi_device *sdev,
|
||||
struct ata_device *dev)
|
||||
int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev)
|
||||
{
|
||||
struct request_queue *q = sdev->request_queue;
|
||||
|
||||
@ -1344,6 +1116,7 @@ int ata_scsi_slave_config(struct scsi_device *sdev)
|
||||
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_slave_config);
|
||||
|
||||
/**
|
||||
* ata_scsi_slave_destroy - SCSI device is about to be destroyed
|
||||
@ -1383,71 +1156,7 @@ void ata_scsi_slave_destroy(struct scsi_device *sdev)
|
||||
q->dma_drain_buffer = NULL;
|
||||
q->dma_drain_size = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* __ata_change_queue_depth - helper for ata_scsi_change_queue_depth
|
||||
* @ap: ATA port to which the device change the queue depth
|
||||
* @sdev: SCSI device to configure queue depth for
|
||||
* @queue_depth: new queue depth
|
||||
*
|
||||
* libsas and libata have different approaches for associating a sdev to
|
||||
* its ata_port.
|
||||
*
|
||||
*/
|
||||
int __ata_change_queue_depth(struct ata_port *ap, struct scsi_device *sdev,
|
||||
int queue_depth)
|
||||
{
|
||||
struct ata_device *dev;
|
||||
unsigned long flags;
|
||||
|
||||
if (queue_depth < 1 || queue_depth == sdev->queue_depth)
|
||||
return sdev->queue_depth;
|
||||
|
||||
dev = ata_scsi_find_dev(ap, sdev);
|
||||
if (!dev || !ata_dev_enabled(dev))
|
||||
return sdev->queue_depth;
|
||||
|
||||
/* NCQ enabled? */
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
dev->flags &= ~ATA_DFLAG_NCQ_OFF;
|
||||
if (queue_depth == 1 || !ata_ncq_enabled(dev)) {
|
||||
dev->flags |= ATA_DFLAG_NCQ_OFF;
|
||||
queue_depth = 1;
|
||||
}
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
|
||||
/* limit and apply queue depth */
|
||||
queue_depth = min(queue_depth, sdev->host->can_queue);
|
||||
queue_depth = min(queue_depth, ata_id_queue_depth(dev->id));
|
||||
queue_depth = min(queue_depth, ATA_MAX_QUEUE);
|
||||
|
||||
if (sdev->queue_depth == queue_depth)
|
||||
return -EINVAL;
|
||||
|
||||
return scsi_change_queue_depth(sdev, queue_depth);
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_scsi_change_queue_depth - SCSI callback for queue depth config
|
||||
* @sdev: SCSI device to configure queue depth for
|
||||
* @queue_depth: new queue depth
|
||||
*
|
||||
* This is libata standard hostt->change_queue_depth callback.
|
||||
* SCSI will call into this callback when user tries to set queue
|
||||
* depth via sysfs.
|
||||
*
|
||||
* LOCKING:
|
||||
* SCSI layer (we don't care)
|
||||
*
|
||||
* RETURNS:
|
||||
* Newly configured queue depth.
|
||||
*/
|
||||
int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth)
|
||||
{
|
||||
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
||||
|
||||
return __ata_change_queue_depth(ap, sdev, queue_depth);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_slave_destroy);
|
||||
|
||||
/**
|
||||
* ata_scsi_start_stop_xlat - Translate SCSI START STOP UNIT command
|
||||
@ -2354,10 +2063,6 @@ static unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf)
|
||||
*/
|
||||
static unsigned int ata_scsiop_inq_89(struct ata_scsi_args *args, u8 *rbuf)
|
||||
{
|
||||
struct ata_taskfile tf;
|
||||
|
||||
memset(&tf, 0, sizeof(tf));
|
||||
|
||||
rbuf[1] = 0x89; /* our page code */
|
||||
rbuf[2] = (0x238 >> 8); /* page size fixed at 238h */
|
||||
rbuf[3] = (0x238 & 0xff);
|
||||
@ -2366,14 +2071,14 @@ static unsigned int ata_scsiop_inq_89(struct ata_scsi_args *args, u8 *rbuf)
|
||||
memcpy(&rbuf[16], "libata ", 16);
|
||||
memcpy(&rbuf[32], DRV_VERSION, 4);
|
||||
|
||||
/* we don't store the ATA device signature, so we fake it */
|
||||
|
||||
tf.command = ATA_DRDY; /* really, this is Status reg */
|
||||
tf.lbal = 0x1;
|
||||
tf.nsect = 0x1;
|
||||
|
||||
ata_tf_to_fis(&tf, 0, 1, &rbuf[36]); /* TODO: PMP? */
|
||||
rbuf[36] = 0x34; /* force D2H Reg FIS (34h) */
|
||||
rbuf[37] = (1 << 7); /* bit 7 indicates Command FIS */
|
||||
/* TODO: PMP? */
|
||||
|
||||
/* we don't store the ATA device signature, so we fake it */
|
||||
rbuf[38] = ATA_DRDY; /* really, this is Status reg */
|
||||
rbuf[40] = 0x1;
|
||||
rbuf[48] = 0x1;
|
||||
|
||||
rbuf[56] = ATA_CMD_ID_ATA;
|
||||
|
||||
@ -3089,7 +2794,7 @@ static struct ata_device *__ata_scsi_find_dev(struct ata_port *ap,
|
||||
* RETURNS:
|
||||
* Associated ATA device, or %NULL if not found.
|
||||
*/
|
||||
static struct ata_device *
|
||||
struct ata_device *
|
||||
ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev)
|
||||
{
|
||||
struct ata_device *dev = __ata_scsi_find_dev(ap, scsidev);
|
||||
@ -4299,8 +4004,7 @@ static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd)
|
||||
* Prints the contents of a SCSI command via printk().
|
||||
*/
|
||||
|
||||
static inline void ata_scsi_dump_cdb(struct ata_port *ap,
|
||||
struct scsi_cmnd *cmd)
|
||||
void ata_scsi_dump_cdb(struct ata_port *ap, struct scsi_cmnd *cmd)
|
||||
{
|
||||
#ifdef ATA_VERBOSE_DEBUG
|
||||
struct scsi_device *scsidev = cmd->device;
|
||||
@ -4312,8 +4016,7 @@ static inline void ata_scsi_dump_cdb(struct ata_port *ap,
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
|
||||
struct ata_device *dev)
|
||||
int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev)
|
||||
{
|
||||
u8 scsi_op = scmd->cmnd[0];
|
||||
ata_xlat_func_t xlat_func;
|
||||
@ -4407,6 +4110,7 @@ int ata_scsi_queuecmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
|
||||
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_queuecmd);
|
||||
|
||||
/**
|
||||
* ata_scsi_simulate - simulate SCSI command on ATA device
|
||||
@ -4562,26 +4266,51 @@ int ata_scsi_add_hosts(struct ata_host *host, struct scsi_host_template *sht)
|
||||
*/
|
||||
shost->max_host_blocked = 1;
|
||||
|
||||
rc = scsi_add_host_with_dma(ap->scsi_host,
|
||||
&ap->tdev, ap->host->dev);
|
||||
rc = scsi_add_host_with_dma(shost, &ap->tdev, ap->host->dev);
|
||||
if (rc)
|
||||
goto err_add;
|
||||
goto err_alloc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_add:
|
||||
scsi_host_put(host->ports[i]->scsi_host);
|
||||
err_alloc:
|
||||
while (--i >= 0) {
|
||||
struct Scsi_Host *shost = host->ports[i]->scsi_host;
|
||||
|
||||
/* scsi_host_put() is in ata_devres_release() */
|
||||
scsi_remove_host(shost);
|
||||
scsi_host_put(shost);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static void ata_scsi_assign_ofnode(struct ata_device *dev, struct ata_port *ap)
|
||||
{
|
||||
struct scsi_device *sdev = dev->sdev;
|
||||
struct device *d = ap->host->dev;
|
||||
struct device_node *np = d->of_node;
|
||||
struct device_node *child;
|
||||
|
||||
for_each_available_child_of_node(np, child) {
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
ret = of_property_read_u32(child, "reg", &val);
|
||||
if (ret)
|
||||
continue;
|
||||
if (val == dev->devno) {
|
||||
dev_dbg(d, "found matching device node\n");
|
||||
sdev->sdev_gendev.of_node = child;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
static void ata_scsi_assign_ofnode(struct ata_device *dev, struct ata_port *ap)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
void ata_scsi_scan_host(struct ata_port *ap, int sync)
|
||||
{
|
||||
int tries = 5;
|
||||
@ -4607,6 +4336,7 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync)
|
||||
NULL);
|
||||
if (!IS_ERR(sdev)) {
|
||||
dev->sdev = sdev;
|
||||
ata_scsi_assign_ofnode(dev, ap);
|
||||
scsi_device_put(sdev);
|
||||
} else {
|
||||
dev->sdev = NULL;
|
||||
@ -4929,214 +4659,3 @@ void ata_scsi_dev_rescan(struct work_struct *work)
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
mutex_unlock(&ap->scsi_scan_mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_sas_port_alloc - Allocate port for a SAS attached SATA device
|
||||
* @host: ATA host container for all SAS ports
|
||||
* @port_info: Information from low-level host driver
|
||||
* @shost: SCSI host that the scsi device is attached to
|
||||
*
|
||||
* LOCKING:
|
||||
* PCI/etc. bus probe sem.
|
||||
*
|
||||
* RETURNS:
|
||||
* ata_port pointer on success / NULL on failure.
|
||||
*/
|
||||
|
||||
struct ata_port *ata_sas_port_alloc(struct ata_host *host,
|
||||
struct ata_port_info *port_info,
|
||||
struct Scsi_Host *shost)
|
||||
{
|
||||
struct ata_port *ap;
|
||||
|
||||
ap = ata_port_alloc(host);
|
||||
if (!ap)
|
||||
return NULL;
|
||||
|
||||
ap->port_no = 0;
|
||||
ap->lock = &host->lock;
|
||||
ap->pio_mask = port_info->pio_mask;
|
||||
ap->mwdma_mask = port_info->mwdma_mask;
|
||||
ap->udma_mask = port_info->udma_mask;
|
||||
ap->flags |= port_info->flags;
|
||||
ap->ops = port_info->port_ops;
|
||||
ap->cbl = ATA_CBL_SATA;
|
||||
|
||||
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_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);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_tport_add);
|
||||
|
||||
void ata_sas_tport_delete(struct ata_port *ap)
|
||||
{
|
||||
ata_tport_delete(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
|
||||
* @ap: ATA port to which SCSI device is attached
|
||||
*
|
||||
* RETURNS:
|
||||
* Zero.
|
||||
*/
|
||||
|
||||
int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap)
|
||||
{
|
||||
ata_scsi_sdev_config(sdev);
|
||||
ata_scsi_dev_config(sdev, ap->link.device);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
|
||||
|
||||
/**
|
||||
* ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
|
||||
* @cmd: SCSI command to be sent
|
||||
* @ap: ATA port to which the command is being sent
|
||||
*
|
||||
* RETURNS:
|
||||
* Return value from __ata_scsi_queuecmd() if @cmd can be queued,
|
||||
* 0 otherwise.
|
||||
*/
|
||||
|
||||
int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
ata_scsi_dump_cdb(ap, cmd);
|
||||
|
||||
if (likely(ata_dev_enabled(ap->link.device)))
|
||||
rc = __ata_scsi_queuecmd(cmd, ap->link.device);
|
||||
else {
|
||||
cmd->result = (DID_BAD_TARGET << 16);
|
||||
cmd->scsi_done(cmd);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_queuecmd);
|
||||
|
||||
int ata_sas_allocate_tag(struct ata_port *ap)
|
||||
{
|
||||
unsigned int max_queue = ap->host->n_tags;
|
||||
unsigned int i, tag;
|
||||
|
||||
for (i = 0, tag = ap->sas_last_tag + 1; i < max_queue; i++, tag++) {
|
||||
tag = tag < max_queue ? tag : 0;
|
||||
|
||||
/* the last tag is reserved for internal command. */
|
||||
if (ata_tag_internal(tag))
|
||||
continue;
|
||||
|
||||
if (!test_and_set_bit(tag, &ap->sas_tag_allocated)) {
|
||||
ap->sas_last_tag = tag;
|
||||
return tag;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void ata_sas_free_tag(unsigned int tag, struct ata_port *ap)
|
||||
{
|
||||
clear_bit(tag, &ap->sas_tag_allocated);
|
||||
}
|
||||
|
@ -2,10 +2,6 @@
|
||||
/*
|
||||
* libata-sff.c - helper library for PCI IDE BMDMA
|
||||
*
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
* Copyright 2003-2006 Red Hat, Inc. All rights reserved.
|
||||
* Copyright 2003-2006 Jeff Garzik
|
||||
*
|
||||
|
@ -208,7 +208,7 @@ show_ata_port_##name(struct device *dev, \
|
||||
{ \
|
||||
struct ata_port *ap = transport_class_to_port(dev); \
|
||||
\
|
||||
return snprintf(buf, 20, format_string, cast ap->field); \
|
||||
return scnprintf(buf, 20, format_string, cast ap->field); \
|
||||
}
|
||||
|
||||
#define ata_port_simple_attr(field, name, format_string, type) \
|
||||
@ -479,7 +479,7 @@ show_ata_dev_##field(struct device *dev, \
|
||||
{ \
|
||||
struct ata_device *ata_dev = transport_class_to_dev(dev); \
|
||||
\
|
||||
return snprintf(buf, 20, format_string, cast ata_dev->field); \
|
||||
return scnprintf(buf, 20, format_string, cast ata_dev->field); \
|
||||
}
|
||||
|
||||
#define ata_dev_simple_attr(field, format_string, type) \
|
||||
@ -533,7 +533,7 @@ show_ata_dev_id(struct device *dev,
|
||||
if (ata_dev->class == ATA_DEV_PMP)
|
||||
return 0;
|
||||
for(i=0;i<ATA_ID_WORDS;i++) {
|
||||
written += snprintf(buf+written, 20, "%04x%c",
|
||||
written += scnprintf(buf+written, 20, "%04x%c",
|
||||
ata_dev->id[i],
|
||||
((i+1) & 7) ? ' ' : '\n');
|
||||
}
|
||||
@ -552,7 +552,7 @@ show_ata_dev_gscr(struct device *dev,
|
||||
if (ata_dev->class != ATA_DEV_PMP)
|
||||
return 0;
|
||||
for(i=0;i<SATA_PMP_GSCR_DWORDS;i++) {
|
||||
written += snprintf(buf+written, 20, "%08x%c",
|
||||
written += scnprintf(buf+written, 20, "%08x%c",
|
||||
ata_dev->gscr[i],
|
||||
((i+1) & 3) ? ' ' : '\n');
|
||||
}
|
||||
@ -581,7 +581,7 @@ show_ata_dev_trim(struct device *dev,
|
||||
else
|
||||
mode = "unqueued";
|
||||
|
||||
return snprintf(buf, 20, "%s\n", mode);
|
||||
return scnprintf(buf, 20, "%s\n", mode);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(trim, S_IRUGO, show_ata_dev_trim, NULL);
|
||||
|
@ -37,7 +37,11 @@ extern int libata_noacpi;
|
||||
extern int libata_allow_tpm;
|
||||
extern const struct device_type ata_port_type;
|
||||
extern struct ata_link *ata_dev_phys_link(struct ata_device *dev);
|
||||
#ifdef CONFIG_ATA_FORCE
|
||||
extern void ata_force_cbl(struct ata_port *ap);
|
||||
#else
|
||||
static inline void ata_force_cbl(struct ata_port *ap) { }
|
||||
#endif
|
||||
extern u64 ata_tf_to_lba(const struct ata_taskfile *tf);
|
||||
extern u64 ata_tf_to_lba48(const struct ata_taskfile *tf);
|
||||
extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev, int tag);
|
||||
@ -87,6 +91,18 @@ extern unsigned int ata_read_log_page(struct ata_device *dev, u8 log,
|
||||
|
||||
#define to_ata_port(d) container_of(d, struct ata_port, tdev)
|
||||
|
||||
/* libata-sata.c */
|
||||
#ifdef CONFIG_SATA_HOST
|
||||
int ata_sas_allocate_tag(struct ata_port *ap);
|
||||
void ata_sas_free_tag(unsigned int tag, struct ata_port *ap);
|
||||
#else
|
||||
static inline int ata_sas_allocate_tag(struct ata_port *ap)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
static inline void ata_sas_free_tag(unsigned int tag, struct ata_port *ap) { }
|
||||
#endif
|
||||
|
||||
/* libata-acpi.c */
|
||||
#ifdef CONFIG_ATA_ACPI
|
||||
extern unsigned int ata_acpi_gtf_filter;
|
||||
@ -112,6 +128,8 @@ static inline void ata_acpi_bind_dev(struct ata_device *dev) {}
|
||||
#endif
|
||||
|
||||
/* libata-scsi.c */
|
||||
extern struct ata_device *ata_scsi_find_dev(struct ata_port *ap,
|
||||
const struct scsi_device *scsidev);
|
||||
extern int ata_scsi_add_hosts(struct ata_host *host,
|
||||
struct scsi_host_template *sht);
|
||||
extern void ata_scsi_scan_host(struct ata_port *ap, int sync);
|
||||
@ -128,9 +146,10 @@ 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);
|
||||
int ata_sas_allocate_tag(struct ata_port *ap);
|
||||
void ata_sas_free_tag(unsigned int tag, struct ata_port *ap);
|
||||
|
||||
void ata_scsi_sdev_config(struct scsi_device *sdev);
|
||||
int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev);
|
||||
void ata_scsi_dump_cdb(struct ata_port *ap, struct scsi_cmnd *cmd);
|
||||
int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev);
|
||||
|
||||
/* libata-eh.c */
|
||||
extern unsigned long ata_internal_cmd_timeout(struct ata_device *dev, u8 cmd);
|
||||
|
@ -157,7 +157,6 @@ static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class,
|
||||
static void pdc_error_handler(struct ata_port *ap);
|
||||
static void pdc_post_internal_cmd(struct ata_queued_cmd *qc);
|
||||
static int pdc_pata_cable_detect(struct ata_port *ap);
|
||||
static int pdc_sata_cable_detect(struct ata_port *ap);
|
||||
|
||||
static struct scsi_host_template pdc_ata_sht = {
|
||||
ATA_BASE_SHT(DRV_NAME),
|
||||
@ -183,7 +182,7 @@ static const struct ata_port_operations pdc_common_ops = {
|
||||
|
||||
static struct ata_port_operations pdc_sata_ops = {
|
||||
.inherits = &pdc_common_ops,
|
||||
.cable_detect = pdc_sata_cable_detect,
|
||||
.cable_detect = ata_cable_sata,
|
||||
.freeze = pdc_sata_freeze,
|
||||
.thaw = pdc_sata_thaw,
|
||||
.scr_read = pdc_sata_scr_read,
|
||||
@ -459,11 +458,6 @@ static int pdc_pata_cable_detect(struct ata_port *ap)
|
||||
return ATA_CBL_PATA80;
|
||||
}
|
||||
|
||||
static int pdc_sata_cable_detect(struct ata_port *ap)
|
||||
{
|
||||
return ATA_CBL_SATA;
|
||||
}
|
||||
|
||||
static int pdc_sata_scr_read(struct ata_link *link,
|
||||
unsigned int sc_reg, u32 *val)
|
||||
{
|
||||
|
@ -989,6 +989,7 @@ config SCSI_SYM53C8XX_MMIO
|
||||
config SCSI_IPR
|
||||
tristate "IBM Power Linux RAID adapter support"
|
||||
depends on PCI && SCSI && ATA
|
||||
select SATA_HOST
|
||||
select FW_LOADER
|
||||
select IRQ_POLL
|
||||
select SGL_ALLOC
|
||||
|
@ -19,6 +19,7 @@ config SCSI_SAS_ATA
|
||||
bool "ATA support for libsas (requires libata)"
|
||||
depends on SCSI_SAS_LIBSAS
|
||||
depends on ATA = y || ATA = SCSI_SAS_LIBSAS
|
||||
select SATA_HOST
|
||||
help
|
||||
Builds in ATA support into libsas. Will necessitate
|
||||
the loading of libata along with libsas.
|
||||
|
@ -57,8 +57,6 @@
|
||||
#define VPRINTK(fmt, args...)
|
||||
#endif /* ATA_DEBUG */
|
||||
|
||||
#define BPRINTK(fmt, args...) if (ap->flags & ATA_FLAG_DEBUGMSG) printk(KERN_ERR "%s: " fmt, __func__, ## args)
|
||||
|
||||
#define ata_print_version_once(dev, version) \
|
||||
({ \
|
||||
static bool __print_once; \
|
||||
@ -176,6 +174,7 @@ enum {
|
||||
ATA_DEV_NONE = 11, /* no device */
|
||||
|
||||
/* struct ata_link flags */
|
||||
/* NOTE: struct ata_force_param currently stores lflags in u16 */
|
||||
ATA_LFLAG_NO_HRST = (1 << 1), /* avoid hardreset */
|
||||
ATA_LFLAG_NO_SRST = (1 << 2), /* avoid softreset */
|
||||
ATA_LFLAG_ASSUME_ATA = (1 << 3), /* assume ATA class */
|
||||
@ -531,12 +530,14 @@ typedef int (*ata_reset_fn_t)(struct ata_link *link, unsigned int *classes,
|
||||
unsigned long deadline);
|
||||
typedef void (*ata_postreset_fn_t)(struct ata_link *link, unsigned int *classes);
|
||||
|
||||
extern struct device_attribute dev_attr_link_power_management_policy;
|
||||
extern struct device_attribute dev_attr_unload_heads;
|
||||
#ifdef CONFIG_SATA_HOST
|
||||
extern struct device_attribute dev_attr_link_power_management_policy;
|
||||
extern struct device_attribute dev_attr_ncq_prio_enable;
|
||||
extern struct device_attribute dev_attr_em_message_type;
|
||||
extern struct device_attribute dev_attr_em_message;
|
||||
extern struct device_attribute dev_attr_sw_activity;
|
||||
#endif
|
||||
|
||||
enum sw_activity {
|
||||
OFF,
|
||||
@ -1020,10 +1021,6 @@ struct ata_timing {
|
||||
/*
|
||||
* Core layer - drivers/ata/libata-core.c
|
||||
*/
|
||||
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 struct ata_port_operations ata_dummy_port_ops;
|
||||
extern const struct ata_port_info ata_dummy_port_info;
|
||||
|
||||
@ -1061,33 +1058,14 @@ static inline int is_multi_taskfile(struct ata_taskfile *tf)
|
||||
(tf->command == ATA_CMD_WRITE_MULTI_FUA_EXT);
|
||||
}
|
||||
|
||||
static inline const unsigned long *
|
||||
sata_ehc_deb_timing(struct ata_eh_context *ehc)
|
||||
{
|
||||
if (ehc->i.flags & ATA_EHI_HOTPLUGGED)
|
||||
return sata_deb_timing_hotplug;
|
||||
else
|
||||
return sata_deb_timing_normal;
|
||||
}
|
||||
|
||||
static inline int ata_port_is_dummy(struct ata_port *ap)
|
||||
{
|
||||
return ap->ops == &ata_dummy_port_ops;
|
||||
}
|
||||
|
||||
extern int sata_set_spd(struct ata_link *link);
|
||||
extern int ata_std_prereset(struct ata_link *link, unsigned long deadline);
|
||||
extern int ata_wait_after_reset(struct ata_link *link, unsigned long deadline,
|
||||
int (*check_ready)(struct ata_link *link));
|
||||
extern int sata_link_debounce(struct ata_link *link,
|
||||
const unsigned long *params, unsigned long deadline);
|
||||
extern int sata_link_resume(struct ata_link *link, const unsigned long *params,
|
||||
unsigned long deadline);
|
||||
extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
||||
bool spm_wakeup);
|
||||
extern int sata_link_hardreset(struct ata_link *link,
|
||||
const unsigned long *timing, unsigned long deadline,
|
||||
bool *online, int (*check_ready)(struct ata_link *));
|
||||
extern int sata_std_hardreset(struct ata_link *link, unsigned int *class,
|
||||
unsigned long deadline);
|
||||
extern void ata_std_postreset(struct ata_link *link, unsigned int *classes);
|
||||
@ -1095,7 +1073,6 @@ extern void ata_std_postreset(struct ata_link *link, unsigned int *classes);
|
||||
extern struct ata_host *ata_host_alloc(struct device *dev, int max_ports);
|
||||
extern struct ata_host *ata_host_alloc_pinfo(struct device *dev,
|
||||
const struct ata_port_info * const * ppi, int n_ports);
|
||||
extern int ata_slave_link_init(struct ata_port *ap);
|
||||
extern void ata_host_get(struct ata_host *host);
|
||||
extern void ata_host_put(struct ata_host *host);
|
||||
extern int ata_host_start(struct ata_host *host);
|
||||
@ -1117,22 +1094,6 @@ extern int ata_scsi_ioctl(struct scsi_device *dev, unsigned int cmd,
|
||||
extern int ata_scsi_queuecmd(struct Scsi_Host *h, struct scsi_cmnd *cmd);
|
||||
extern int ata_sas_scsi_ioctl(struct ata_port *ap, struct scsi_device *dev,
|
||||
unsigned int cmd, void __user *arg);
|
||||
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 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 int sata_scr_valid(struct ata_link *link);
|
||||
extern int sata_scr_read(struct ata_link *link, int reg, u32 *val);
|
||||
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 bool ata_link_online(struct ata_link *link);
|
||||
extern bool ata_link_offline(struct ata_link *link);
|
||||
#ifdef CONFIG_PM
|
||||
@ -1153,9 +1114,6 @@ 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);
|
||||
extern int atapi_cmd_type(u8 opcode);
|
||||
extern void ata_tf_to_fis(const struct ata_taskfile *tf,
|
||||
u8 pmp, int is_cmd, u8 *fis);
|
||||
extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf);
|
||||
extern unsigned long ata_pack_xfermask(unsigned long pio_mask,
|
||||
unsigned long mwdma_mask, unsigned long udma_mask);
|
||||
extern void ata_unpack_xfermask(unsigned long xfer_mask,
|
||||
@ -1179,7 +1137,6 @@ extern void ata_id_c_string(const u16 *id, unsigned char *s,
|
||||
extern unsigned int ata_do_dev_read_id(struct ata_device *dev,
|
||||
struct ata_taskfile *tf, u16 *id);
|
||||
extern void ata_qc_complete(struct ata_queued_cmd *qc);
|
||||
extern int ata_qc_complete_multiple(struct ata_port *ap, u64 qc_active);
|
||||
extern u64 ata_qc_get_active(struct ata_port *ap);
|
||||
extern void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd);
|
||||
extern int ata_std_bios_param(struct scsi_device *sdev,
|
||||
@ -1196,7 +1153,96 @@ extern struct ata_device *ata_dev_pair(struct ata_device *adev);
|
||||
extern int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev);
|
||||
extern void ata_scsi_port_error_handler(struct Scsi_Host *host, struct ata_port *ap);
|
||||
extern void ata_scsi_cmd_error_handler(struct Scsi_Host *host, struct ata_port *ap, struct list_head *eh_q);
|
||||
|
||||
/*
|
||||
* 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[];
|
||||
|
||||
static inline const unsigned long *
|
||||
sata_ehc_deb_timing(struct ata_eh_context *ehc)
|
||||
{
|
||||
if (ehc->i.flags & ATA_EHI_HOTPLUGGED)
|
||||
return sata_deb_timing_hotplug;
|
||||
else
|
||||
return sata_deb_timing_normal;
|
||||
}
|
||||
|
||||
extern int sata_scr_valid(struct ata_link *link);
|
||||
extern int sata_scr_read(struct ata_link *link, int reg, u32 *val);
|
||||
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,
|
||||
bool *online, int (*check_ready)(struct ata_link *));
|
||||
extern int sata_link_resume(struct ata_link *link, const unsigned long *params,
|
||||
unsigned long deadline);
|
||||
extern void ata_eh_analyze_ncq_error(struct ata_link *link);
|
||||
#else
|
||||
static inline const unsigned long *
|
||||
sata_ehc_deb_timing(struct ata_eh_context *ehc)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline int sata_scr_valid(struct ata_link *link) { return 0; }
|
||||
static inline int sata_scr_read(struct ata_link *link, int reg, u32 *val)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
static inline int sata_scr_write(struct ata_link *link, int reg, u32 val)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
static inline int sata_scr_write_flush(struct ata_link *link, int reg, u32 val)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
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,
|
||||
unsigned long deadline,
|
||||
bool *online,
|
||||
int (*check_ready)(struct ata_link *))
|
||||
{
|
||||
if (online)
|
||||
*online = false;
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
static inline int sata_link_resume(struct ata_link *link,
|
||||
const unsigned long *params,
|
||||
unsigned long deadline)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
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);
|
||||
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 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,
|
||||
u8 pmp, int is_cmd, u8 *fis);
|
||||
extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf);
|
||||
extern int ata_qc_complete_multiple(struct ata_port *ap, u64 qc_active);
|
||||
extern bool sata_lpm_ignore_phy_events(struct ata_link *link);
|
||||
extern int sata_async_notification(struct ata_port *ap);
|
||||
|
||||
extern int ata_cable_40wire(struct ata_port *ap);
|
||||
extern int ata_cable_80wire(struct ata_port *ap);
|
||||
@ -1206,12 +1252,6 @@ extern int ata_cable_unknown(struct ata_port *ap);
|
||||
|
||||
/* Timing helpers */
|
||||
extern unsigned int ata_pio_need_iordy(const struct ata_device *);
|
||||
extern const struct ata_timing *ata_timing_find_mode(u8 xfer_mode);
|
||||
extern int ata_timing_compute(struct ata_device *, unsigned short,
|
||||
struct ata_timing *, int, int);
|
||||
extern void ata_timing_merge(const struct ata_timing *,
|
||||
const struct ata_timing *, struct ata_timing *,
|
||||
unsigned int);
|
||||
extern u8 ata_timing_cycle2mode(unsigned int xfer_shift, int cycle);
|
||||
|
||||
/* PCI */
|
||||
@ -1295,14 +1335,12 @@ extern void ata_port_wait_eh(struct ata_port *ap);
|
||||
extern int ata_link_abort(struct ata_link *link);
|
||||
extern int ata_port_abort(struct ata_port *ap);
|
||||
extern int ata_port_freeze(struct ata_port *ap);
|
||||
extern int sata_async_notification(struct ata_port *ap);
|
||||
|
||||
extern void ata_eh_freeze_port(struct ata_port *ap);
|
||||
extern void ata_eh_thaw_port(struct ata_port *ap);
|
||||
|
||||
extern void ata_eh_qc_complete(struct ata_queued_cmd *qc);
|
||||
extern void ata_eh_qc_retry(struct ata_queued_cmd *qc);
|
||||
extern void ata_eh_analyze_ncq_error(struct ata_link *link);
|
||||
|
||||
extern void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
|
||||
ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
|
||||
@ -1343,7 +1381,7 @@ extern struct device_attribute *ata_common_sdev_attrs[];
|
||||
* edge driver's module reference, otherwise the driver can be unloaded
|
||||
* even if the scsi_device is being accessed.
|
||||
*/
|
||||
#define ATA_BASE_SHT(drv_name) \
|
||||
#define __ATA_BASE_SHT(drv_name) \
|
||||
.module = THIS_MODULE, \
|
||||
.name = drv_name, \
|
||||
.ioctl = ata_scsi_ioctl, \
|
||||
@ -1357,12 +1395,20 @@ extern struct device_attribute *ata_common_sdev_attrs[];
|
||||
.slave_configure = ata_scsi_slave_config, \
|
||||
.slave_destroy = ata_scsi_slave_destroy, \
|
||||
.bios_param = ata_std_bios_param, \
|
||||
.unlock_native_capacity = ata_scsi_unlock_native_capacity, \
|
||||
.unlock_native_capacity = ata_scsi_unlock_native_capacity
|
||||
|
||||
#define ATA_BASE_SHT(drv_name) \
|
||||
__ATA_BASE_SHT(drv_name), \
|
||||
.sdev_attrs = ata_common_sdev_attrs
|
||||
|
||||
#ifdef CONFIG_SATA_HOST
|
||||
extern struct device_attribute *ata_ncq_sdev_attrs[];
|
||||
|
||||
#define ATA_NCQ_SHT(drv_name) \
|
||||
ATA_BASE_SHT(drv_name), \
|
||||
__ATA_BASE_SHT(drv_name), \
|
||||
.sdev_attrs = ata_ncq_sdev_attrs, \
|
||||
.change_queue_depth = ata_scsi_change_queue_depth
|
||||
#endif
|
||||
|
||||
/*
|
||||
* PMP helpers
|
||||
@ -1635,6 +1681,8 @@ extern struct ata_device *ata_dev_next(struct ata_device *dev,
|
||||
*/
|
||||
static inline int ata_ncq_enabled(struct ata_device *dev)
|
||||
{
|
||||
if (!IS_ENABLED(CONFIG_SATA_HOST))
|
||||
return 0;
|
||||
return (dev->flags & (ATA_DFLAG_PIO | ATA_DFLAG_NCQ_OFF |
|
||||
ATA_DFLAG_NCQ)) == ATA_DFLAG_NCQ;
|
||||
}
|
||||
@ -1803,6 +1851,16 @@ static inline int ata_dma_enabled(struct ata_device *adev)
|
||||
return (adev->dma_mode == 0xFF ? 0 : 1);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* PATA timings - drivers/ata/libata-pata-timings.c
|
||||
*/
|
||||
extern const struct ata_timing *ata_timing_find_mode(u8 xfer_mode);
|
||||
extern int ata_timing_compute(struct ata_device *, unsigned short,
|
||||
struct ata_timing *, int, int);
|
||||
extern void ata_timing_merge(const struct ata_timing *,
|
||||
const struct ata_timing *, struct ata_timing *,
|
||||
unsigned int);
|
||||
|
||||
/**************************************************************************
|
||||
* PMP - drivers/ata/libata-pmp.c
|
||||
*/
|
||||
|
@ -148,6 +148,8 @@
|
||||
|
||||
/* Vendors and devices. Sort key: vendor first, device next. */
|
||||
|
||||
#define PCI_VENDOR_ID_LOONGSON 0x0014
|
||||
|
||||
#define PCI_VENDOR_ID_TTTECH 0x0357
|
||||
#define PCI_DEVICE_ID_TTTECH_MC322 0x000a
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user