linux-stable/drivers/ata
Sascha Hauer c89e7917a2 libata: Fix retrieving of active qcs
commit 8385d756e1 upstream.

ata_qc_complete_multiple() is called with a mask of the still active
tags.

mv_sata doesn't have this information directly and instead calculates
the still active tags from the started tags (ap->qc_active) and the
finished tags as (ap->qc_active ^ done_mask)

Since 28361c4036 the hw_tag and tag are no longer the same and the
equation is no longer valid. In ata_exec_internal_sg() ap->qc_active is
initialized as 1ULL << ATA_TAG_INTERNAL, but in hardware tag 0 is
started and this will be in done_mask on completion. ap->qc_active ^
done_mask becomes 0x100000000 ^ 0x1 = 0x100000001 and thus tag 0 used as
the internal tag will never be reported as completed.

This is fixed by introducing ata_qc_get_active() which returns the
active hardware tags and calling it where appropriate.

This is tested on mv_sata, but sata_fsl and sata_nv suffer from the same
problem. There is another case in sata_nv that most likely needs fixing
as well, but this looks a little different, so I wasn't confident enough
to change that.

Fixes: 28361c4036 ("libata: add extra internal command")
Cc: stable@vger.kernel.org
Tested-by: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Add missing export of ata_qc_get_active(), as per Pali.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
2020-01-09 10:19:01 +01:00
..
acard-ahci.c libata: convert core and drivers to ->hw_tag usage 2018-05-11 13:10:43 -07:00
ahci.c libata/ahci: Fix PCS quirk application 2019-10-29 09:19:36 +01:00
ahci.h libata/ahci: Drop PCS quirk for Denverton and beyond 2019-10-05 13:09:52 +02:00
ahci_brcm.c ata: ahci_brcm: BCM7425 AHCI requires AHCI_HFLAG_DELAY_ENGINE 2020-01-09 10:19:01 +01:00
ahci_ceva.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_da850.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_dm816.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_imx.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_mtk.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_mvebu.c ata: ahci: mvebu: do Armada 38x configuration only on relevant SoCs 2019-12-05 09:21:06 +01:00
ahci_octeon.c
ahci_platform.c ata: Disable AHCI ALPM feature for Ampere Computing eMAG SATA 2019-11-20 18:46:06 +01:00
ahci_qoriq.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_seattle.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_st.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_sunxi.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_tegra.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_xgene.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ata_generic.c
ata_piix.c ata_piix: constify pci_bits 2018-01-08 06:15:41 -08:00
Kconfig ata: ahci_brcm: Allow using driver or DSL SoCs 2019-11-24 08:19:33 +01:00
libahci.c Merge branch 'for-4.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata 2018-08-24 13:20:33 -07:00
libahci_platform.c ata: libahci_platform: Export again ahci_platform_<en/dis>able_phys() 2020-01-09 10:19:01 +01:00
libata-acpi.c
libata-core.c libata: Fix retrieving of active qcs 2020-01-09 10:19:01 +01:00
libata-eh.c libata: don't request sense data on !ZAC ATA devices 2019-07-26 09:14:12 +02:00
libata-pmp.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
libata-scsi.c libata: have ata_scsi_rw_xlat() fail invalid passthrough requests 2019-08-29 08:28:45 +02:00
libata-sff.c libata: add SG safety checks in SFF pio transfers 2019-08-29 08:28:45 +02:00
libata-trace.c
libata-transport.c libata: add refcounting to ata_host 2018-03-13 13:29:10 -07:00
libata-transport.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
libata-zpodd.c libata: zpodd: Fix small read overflow in zpodd_get_mech_type() 2019-08-25 10:47:54 +02:00
libata.h scsi: libsas: dynamically allocate and free ata host 2018-06-19 22:02:25 -04:00
Makefile Merge branch 'for-4.17' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata 2018-04-03 17:42:25 -07:00
pata_acpi.c
pata_ali.c ata: Deprecate pci_get_bus_and_slot() 2018-01-11 17:23:23 -06:00
pata_amd.c cs5536: add support for IDE controller variant 2017-08-11 10:35:07 -07:00
pata_arasan_cf.c pata_arasan_cf: Delete an unnecessary variable initialisation in arasan_cf_probe() 2018-02-18 05:16:35 -08:00
pata_artop.c ata: pata_artop: remove redundant initialization of pio 2017-09-18 20:24:21 -07:00
pata_atiixp.c libata:pata_atiixp: Don't use unconnected secondary port on SB600 2018-01-08 04:02:02 -08:00
pata_atp867x.c ata: mark expected switch fall-throughs 2017-10-23 07:06:09 -07:00
pata_bk3710.c pata_bk3710: clarify license version and use SPDX header 2018-03-01 13:59:03 -08:00
pata_cmd64x.c
pata_cmd640.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pata_cs5520.c
pata_cs5530.c
pata_cs5535.c
pata_cs5536.c cs5536: add support for IDE controller variant 2017-08-11 10:35:07 -07:00
pata_cypress.c
pata_efar.c
pata_ep93xx.c ata: ep93xx: Use proper enums for directions 2019-11-24 08:20:10 +01:00
pata_falcon.c pata_falcon: clarify license version and use SPDX header 2018-03-01 13:58:17 -08:00
pata_ftide010.c ata: ftide010: Add a quirk for SQ201 2018-08-27 14:25:54 -06:00
pata_gayle.c ata: add Amiga Gayle PATA controller driver 2018-03-19 07:41:36 -07:00
pata_hpt3x2n.c
pata_hpt3x3.c
pata_hpt37x.c ata: hpt37x: Convert to use match_string() helper 2018-05-07 08:50:30 -07:00
pata_hpt366.c
pata_icside.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pata_imx.c Merge branch 'for-4.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata 2018-08-24 13:20:33 -07:00
pata_isapnp.c
pata_it821x.c pata_it821x: Delete an error message for a failed memory allocation in it821x_firmware_command() 2018-02-18 05:26:07 -08:00
pata_it8213.c
pata_ixp4xx_cf.c
pata_jmicron.c
pata_legacy.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pata_macio.c pata_macio: Delete an error message for a failed memory allocation in two functions 2018-02-18 05:24:16 -08:00
pata_marvell.c
pata_mpc52xx.c pata_mpc52xx: Delete an error message for a failed memory allocation in mpc52xx_ata_probe() 2018-02-18 05:23:25 -08:00
pata_mpiix.c
pata_netcell.c
pata_ninja32.c
pata_ns87410.c
pata_ns87415.c
pata_octeon_cf.c pata_octeon_cf: use of_property_read_{bool|u32}() 2017-08-28 10:44:24 -07:00
pata_of_platform.c
pata_oldpiix.c
pata_opti.c
pata_optidma.c
pata_palmld.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pata_pcmcia.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pata_pdc202xx_old.c
pata_pdc2027x.c ata: pata_pdc2027x: Replace mdelay with msleep 2018-01-25 07:28:31 -08:00
pata_piccolo.c
pata_platform.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pata_pxa.c ata: pata_pxa: remove the dmaengine compat need 2018-06-18 21:32:07 +02:00
pata_radisys.c
pata_rb532_cf.c
pata_rdc.c ata: declare ata_port_info structures as const 2017-06-12 14:06:34 -04:00
pata_rz1000.c
pata_samsung_cf.c headers: separate linux/mod_devicetable.h from linux/platform_device.h 2018-07-07 17:52:26 +02:00
pata_sc1200.c
pata_sch.c ata: declare ata_port_info structures as const 2017-06-12 14:06:34 -04:00
pata_serverworks.c
pata_sil680.c
pata_sis.c
pata_sl82c105.c
pata_triflex.c
pata_via.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pdc_adma.c
sata_dwc_460ex.c libata: convert core and drivers to ->hw_tag usage 2018-05-11 13:10:43 -07:00
sata_fsl.c libata: Fix retrieving of active qcs 2020-01-09 10:19:01 +01:00
sata_gemini.c ata: sata_gemini: Introduce explicit IDE pin control 2017-08-11 10:32:09 -07:00
sata_gemini.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sata_highbank.c libahci: Allow drivers to override stop_engine 2018-04-26 11:25:04 -07:00
sata_inic162x.c ata: declare ata_port_info structures as const 2017-06-12 14:06:34 -04:00
sata_mv.c libata: Fix retrieving of active qcs 2020-01-09 10:19:01 +01:00
sata_nv.c libata: Fix retrieving of active qcs 2020-01-09 10:19:01 +01:00
sata_promise.c
sata_promise.h
sata_qstor.c
sata_rcar.c sata_rcar: fix deferred probing 2019-02-12 19:47:08 +01:00
sata_sil.c
sata_sil24.c Merge branch 'for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata 2018-06-05 17:01:41 -07:00
sata_sis.c
sata_svw.c ata: Convert to using %pOF instead of full_name 2017-07-18 18:02:36 -04:00
sata_sx4.c
sata_uli.c
sata_via.c sata_via: Enable optional hotplug on VT6420 2017-06-26 16:54:53 -04:00
sata_vsc.c
sis.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00