mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.git
				synced 2025-11-04 07:44:51 +10:00 
			
		
		
		
	ata changes for 6.15
- Add 'external' to the libata.force module parameter, in order to
    allow a user to workaround broken firmware (me)
 
  - Use the str_up_down() helper in the sata_via driver (Salah Triki)
 
  - Convert the Freescale PowerQUICC SATA device tree binding to YAML
    (J. Neuschäfer)
 
  - Do not use ATAPI DMA for a device that only supports PIO (me)
 
  - Add Marvell 88SE9215 PCI device ID to the ahci driver.
    Since the controller has quirks, it cannot rely on the generic
    AHCI PCI class code entry (Daniel Kral)
 
  - Improve the return value of atapi_check_dma() (Huacai Chen)
 
  - Fix the NCQ Non-Data log not supported print to actually reference
    the correct log (me)
 
  - Make Marvel 88SE9215 prefer DMA for ATAPI devices (Huacai Chen)
 
  - Simplify the AHCI IRQ vector allocations by performing the IRQ
    vector allocations in the same function, regardless of IRQ type
    (Tomas Henzl)
 -----BEGIN PGP SIGNATURE-----
 
 iHUEABYKAB0WIQRN+ES/c4tHlMch3DzJZDGjmcZNcgUCZ+MDSwAKCRDJZDGjmcZN
 ctr2AQCu7c9GPgL6VbVIzgoTdHqN39f7YuyajWxsNKi0832CTAEAkkk2exqa1tMy
 3gFmHcKqm1PoWD2VhjU6odzHy0UtQQY=
 =61mg
 -----END PGP SIGNATURE-----
Merge tag 'ata-6.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux
Pull ata updates from Niklas Cassel:
 - Add 'external' to the libata.force module parameter, in order to
   allow a user to workaround broken firmware (me)
 - Use the str_up_down() helper in the sata_via driver (Salah Triki)
 - Convert the Freescale PowerQUICC SATA device tree binding to YAML
   (J. Neuschäfer)
 - Do not use ATAPI DMA for a device that only supports PIO (me)
 - Add Marvell 88SE9215 PCI device ID to the ahci driver. Since the
   controller has quirks, it cannot rely on the generic AHCI PCI class
   code entry (Daniel Kral)
 - Improve the return value of atapi_check_dma() (Huacai Chen)
 - Fix the NCQ Non-Data log not supported print to actually reference
   the correct log (me)
 - Make Marvel 88SE9215 prefer DMA for ATAPI devices (Huacai Chen)
 - Simplify the AHCI IRQ vector allocations by performing the IRQ vector
   allocations in the same function, regardless of IRQ type (Tomas
   Henzl)
* tag 'ata-6.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux:
  ata: ahci: simplify init function
  ahci: Marvell 88SE9215 controllers prefer DMA for ATAPI
  ata: libata: Fix NCQ Non-Data log not supported print
  ata: libata: Improve return value of atapi_check_dma()
  ahci: add PCI ID for Marvell 88SE9215 SATA Controller
  ata: libata-eh: Do not use ATAPI DMA for a device limited to PIO mode
  dt-bindings: ata: Convert fsl,pq-sata to YAML
  ata: sata_via: Use str_up_down() helper in vt6420_prereset()
  ata: libata-core: Add 'external' to the libata.force kernel parameter
			
			
This commit is contained in:
		
						commit
						22093997ac
					
				@ -3117,6 +3117,8 @@
 | 
			
		||||
			* max_sec_lba48: Set or clear transfer size limit to
 | 
			
		||||
			  65535 sectors.
 | 
			
		||||
 | 
			
		||||
			* external: Mark port as external (hotplug-capable).
 | 
			
		||||
 | 
			
		||||
			* [no]lpm: Enable or disable link power management.
 | 
			
		||||
 | 
			
		||||
			* [no]setxfer: Indicate if transfer speed mode setting
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										60
									
								
								Documentation/devicetree/bindings/ata/fsl,pq-sata.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								Documentation/devicetree/bindings/ata/fsl,pq-sata.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,60 @@
 | 
			
		||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
 | 
			
		||||
%YAML 1.2
 | 
			
		||||
---
 | 
			
		||||
$id: http://devicetree.org/schemas/ata/fsl,pq-sata.yaml#
 | 
			
		||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
 | 
			
		||||
 | 
			
		||||
title: Freescale 8xxx/3.0 Gb/s SATA nodes
 | 
			
		||||
 | 
			
		||||
maintainers:
 | 
			
		||||
  - J. Neuschäfer <j.ne@posteo.net>
 | 
			
		||||
 | 
			
		||||
description:
 | 
			
		||||
  SATA nodes are defined to describe on-chip Serial ATA controllers.
 | 
			
		||||
  Each SATA controller should have its own node.
 | 
			
		||||
 | 
			
		||||
properties:
 | 
			
		||||
  compatible:
 | 
			
		||||
    oneOf:
 | 
			
		||||
      - items:
 | 
			
		||||
          - enum:
 | 
			
		||||
              - fsl,mpc8377-sata
 | 
			
		||||
              - fsl,mpc8536-sata
 | 
			
		||||
              - fsl,mpc8315-sata
 | 
			
		||||
              - fsl,mpc8379-sata
 | 
			
		||||
          - const: fsl,pq-sata
 | 
			
		||||
      - const: fsl,pq-sata-v2
 | 
			
		||||
 | 
			
		||||
  reg:
 | 
			
		||||
    maxItems: 1
 | 
			
		||||
 | 
			
		||||
  interrupts:
 | 
			
		||||
    maxItems: 1
 | 
			
		||||
 | 
			
		||||
  cell-index:
 | 
			
		||||
    $ref: /schemas/types.yaml#/definitions/uint32
 | 
			
		||||
    enum: [1, 2, 3, 4]
 | 
			
		||||
    description: |
 | 
			
		||||
      1 for controller @ 0x18000
 | 
			
		||||
      2 for controller @ 0x19000
 | 
			
		||||
      3 for controller @ 0x1a000
 | 
			
		||||
      4 for controller @ 0x1b000
 | 
			
		||||
 | 
			
		||||
required:
 | 
			
		||||
  - compatible
 | 
			
		||||
  - interrupts
 | 
			
		||||
  - cell-index
 | 
			
		||||
 | 
			
		||||
additionalProperties: false
 | 
			
		||||
 | 
			
		||||
examples:
 | 
			
		||||
  - |
 | 
			
		||||
    #include <dt-bindings/interrupt-controller/irq.h>
 | 
			
		||||
    sata@18000 {
 | 
			
		||||
        compatible = "fsl,mpc8379-sata", "fsl,pq-sata";
 | 
			
		||||
        reg = <0x18000 0x1000>;
 | 
			
		||||
        cell-index = <1>;
 | 
			
		||||
        interrupts = <44 IRQ_TYPE_LEVEL_LOW>;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
...
 | 
			
		||||
@ -1,28 +0,0 @@
 | 
			
		||||
* Freescale 8xxx/3.0 Gb/s SATA nodes
 | 
			
		||||
 | 
			
		||||
SATA nodes are defined to describe on-chip Serial ATA controllers.
 | 
			
		||||
Each SATA port should have its own node.
 | 
			
		||||
 | 
			
		||||
Required properties:
 | 
			
		||||
- compatible        : compatible list, contains 2 entries, first is
 | 
			
		||||
		 "fsl,CHIP-sata", where CHIP is the processor
 | 
			
		||||
		 (mpc8315, mpc8379, etc.) and the second is
 | 
			
		||||
		 "fsl,pq-sata"
 | 
			
		||||
- interrupts        : <interrupt mapping for SATA IRQ>
 | 
			
		||||
- cell-index        : controller index.
 | 
			
		||||
                          1 for controller @ 0x18000
 | 
			
		||||
                          2 for controller @ 0x19000
 | 
			
		||||
                          3 for controller @ 0x1a000
 | 
			
		||||
                          4 for controller @ 0x1b000
 | 
			
		||||
 | 
			
		||||
Optional properties:
 | 
			
		||||
- reg               : <registers mapping>
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
	sata@18000 {
 | 
			
		||||
		compatible = "fsl,mpc8379-sata", "fsl,pq-sata";
 | 
			
		||||
		reg = <0x18000 0x1000>;
 | 
			
		||||
		cell-index = <1>;
 | 
			
		||||
		interrupts = <2c 8>;
 | 
			
		||||
		interrupt-parent = < &ipic >;
 | 
			
		||||
	};
 | 
			
		||||
@ -63,6 +63,7 @@ enum board_ids {
 | 
			
		||||
	board_ahci_pcs_quirk_no_devslp,
 | 
			
		||||
	board_ahci_pcs_quirk_no_sntf,
 | 
			
		||||
	board_ahci_yes_fbs,
 | 
			
		||||
	board_ahci_yes_fbs_atapi_dma,
 | 
			
		||||
 | 
			
		||||
	/* board IDs for specific chipsets in alphabetical order */
 | 
			
		||||
	board_ahci_al,
 | 
			
		||||
@ -188,6 +189,14 @@ static const struct ata_port_info ahci_port_info[] = {
 | 
			
		||||
		.udma_mask	= ATA_UDMA6,
 | 
			
		||||
		.port_ops	= &ahci_ops,
 | 
			
		||||
	},
 | 
			
		||||
	[board_ahci_yes_fbs_atapi_dma] = {
 | 
			
		||||
		AHCI_HFLAGS	(AHCI_HFLAG_YES_FBS |
 | 
			
		||||
				 AHCI_HFLAG_ATAPI_DMA_QUIRK),
 | 
			
		||||
		.flags		= AHCI_FLAG_COMMON,
 | 
			
		||||
		.pio_mask	= ATA_PIO4,
 | 
			
		||||
		.udma_mask	= ATA_UDMA6,
 | 
			
		||||
		.port_ops	= &ahci_ops,
 | 
			
		||||
	},
 | 
			
		||||
	/* by chipsets */
 | 
			
		||||
	[board_ahci_al] = {
 | 
			
		||||
		AHCI_HFLAGS	(AHCI_HFLAG_NO_PMP | AHCI_HFLAG_NO_MSI),
 | 
			
		||||
@ -589,6 +598,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
 | 
			
		||||
	  .driver_data = board_ahci_yes_fbs },
 | 
			
		||||
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3),
 | 
			
		||||
	  .driver_data = board_ahci_yes_fbs },
 | 
			
		||||
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9215),
 | 
			
		||||
	  .driver_data = board_ahci_yes_fbs_atapi_dma },
 | 
			
		||||
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9230),
 | 
			
		||||
	  .driver_data = board_ahci_yes_fbs },
 | 
			
		||||
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9235),
 | 
			
		||||
@ -1665,13 +1676,15 @@ static int ahci_get_irq_vector(struct ata_host *host, int port)
 | 
			
		||||
	return pci_irq_vector(to_pci_dev(host->dev), port);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports,
 | 
			
		||||
static void ahci_init_irq(struct pci_dev *pdev, unsigned int n_ports,
 | 
			
		||||
			struct ahci_host_priv *hpriv)
 | 
			
		||||
{
 | 
			
		||||
	int nvec;
 | 
			
		||||
 | 
			
		||||
	if (hpriv->flags & AHCI_HFLAG_NO_MSI)
 | 
			
		||||
		return -ENODEV;
 | 
			
		||||
	if (hpriv->flags & AHCI_HFLAG_NO_MSI) {
 | 
			
		||||
		pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_INTX);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * If number of MSIs is less than number of ports then Sharing Last
 | 
			
		||||
@ -1685,7 +1698,7 @@ static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports,
 | 
			
		||||
			if (!(readl(hpriv->mmio + HOST_CTL) & HOST_MRSM)) {
 | 
			
		||||
				hpriv->get_irq_vector = ahci_get_irq_vector;
 | 
			
		||||
				hpriv->flags |= AHCI_HFLAG_MULTI_MSI;
 | 
			
		||||
				return nvec;
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/*
 | 
			
		||||
@ -1700,12 +1713,13 @@ static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports,
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * If the host is not capable of supporting per-port vectors, fall
 | 
			
		||||
	 * back to single MSI before finally attempting single MSI-X.
 | 
			
		||||
	 * back to single MSI before finally attempting single MSI-X or
 | 
			
		||||
	 * a legacy INTx.
 | 
			
		||||
	 */
 | 
			
		||||
	nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
 | 
			
		||||
	if (nvec == 1)
 | 
			
		||||
		return nvec;
 | 
			
		||||
	return pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSIX);
 | 
			
		||||
		return;
 | 
			
		||||
	pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSIX | PCI_IRQ_INTX);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ahci_mark_external_port(struct ata_port *ap)
 | 
			
		||||
@ -1985,10 +1999,8 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 | 
			
		||||
	}
 | 
			
		||||
	host->private_data = hpriv;
 | 
			
		||||
 | 
			
		||||
	if (ahci_init_msi(pdev, n_ports, hpriv) < 0) {
 | 
			
		||||
		/* legacy intx interrupts */
 | 
			
		||||
		pcim_intx(pdev, 1);
 | 
			
		||||
	}
 | 
			
		||||
	ahci_init_irq(pdev, n_ports, hpriv);
 | 
			
		||||
 | 
			
		||||
	hpriv->irq = pci_irq_vector(pdev, 0);
 | 
			
		||||
 | 
			
		||||
	if (!(hpriv->cap & HOST_CAP_SSS) || ahci_ignore_sss)
 | 
			
		||||
 | 
			
		||||
@ -246,6 +246,7 @@ enum {
 | 
			
		||||
	AHCI_HFLAG_NO_SXS		= BIT(26), /* SXS not supported */
 | 
			
		||||
	AHCI_HFLAG_43BIT_ONLY		= BIT(27), /* 43bit DMA addr limit */
 | 
			
		||||
	AHCI_HFLAG_INTEL_PCS_QUIRK	= BIT(28), /* apply Intel PCS quirk */
 | 
			
		||||
	AHCI_HFLAG_ATAPI_DMA_QUIRK	= BIT(29), /* force ATAPI to use DMA */
 | 
			
		||||
 | 
			
		||||
	/* ap->flags bits */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1322,6 +1322,10 @@ static void ahci_dev_config(struct ata_device *dev)
 | 
			
		||||
{
 | 
			
		||||
	struct ahci_host_priv *hpriv = dev->link->ap->host->private_data;
 | 
			
		||||
 | 
			
		||||
	if ((dev->class == ATA_DEV_ATAPI) &&
 | 
			
		||||
	    (hpriv->flags & AHCI_HFLAG_ATAPI_DMA_QUIRK))
 | 
			
		||||
		dev->quirks |= ATA_QUIRK_ATAPI_MOD16_DMA;
 | 
			
		||||
 | 
			
		||||
	if (hpriv->flags & AHCI_HFLAG_SECT255) {
 | 
			
		||||
		dev->max_sectors = 255;
 | 
			
		||||
		ata_dev_info(dev,
 | 
			
		||||
 | 
			
		||||
@ -88,6 +88,7 @@ struct ata_force_param {
 | 
			
		||||
	unsigned int	xfer_mask;
 | 
			
		||||
	unsigned int	quirk_on;
 | 
			
		||||
	unsigned int	quirk_off;
 | 
			
		||||
	unsigned int	pflags_on;
 | 
			
		||||
	u16		lflags_on;
 | 
			
		||||
	u16		lflags_off;
 | 
			
		||||
};
 | 
			
		||||
@ -331,6 +332,35 @@ void ata_force_cbl(struct ata_port *ap)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *	ata_force_pflags - force port flags according to libata.force
 | 
			
		||||
 *	@ap: ATA port of interest
 | 
			
		||||
 *
 | 
			
		||||
 *	Force port flags according to libata.force and whine about it.
 | 
			
		||||
 *
 | 
			
		||||
 *	LOCKING:
 | 
			
		||||
 *	EH context.
 | 
			
		||||
 */
 | 
			
		||||
static void ata_force_pflags(struct ata_port *ap)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	for (i = ata_force_tbl_size - 1; i >= 0; i--) {
 | 
			
		||||
		const struct ata_force_ent *fe = &ata_force_tbl[i];
 | 
			
		||||
 | 
			
		||||
		if (fe->port != -1 && fe->port != ap->print_id)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		/* let pflags stack */
 | 
			
		||||
		if (fe->param.pflags_on) {
 | 
			
		||||
			ap->pflags |= fe->param.pflags_on;
 | 
			
		||||
			ata_port_notice(ap,
 | 
			
		||||
					"FORCE: port flag 0x%x forced -> 0x%x\n",
 | 
			
		||||
					fe->param.pflags_on, ap->pflags);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *	ata_force_link_limits - force link limits according to libata.force
 | 
			
		||||
 *	@link: ATA link of interest
 | 
			
		||||
@ -486,6 +516,7 @@ static void ata_force_quirks(struct ata_device *dev)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
static inline void ata_force_pflags(struct ata_port *ap) { }
 | 
			
		||||
static inline void ata_force_link_limits(struct ata_link *link) { }
 | 
			
		||||
static inline void ata_force_xfermask(struct ata_device *dev) { }
 | 
			
		||||
static inline void ata_force_quirks(struct ata_device *dev) { }
 | 
			
		||||
@ -2243,7 +2274,7 @@ static void ata_dev_config_ncq_non_data(struct ata_device *dev)
 | 
			
		||||
 | 
			
		||||
	if (!ata_log_supported(dev, ATA_LOG_NCQ_NON_DATA)) {
 | 
			
		||||
		ata_dev_warn(dev,
 | 
			
		||||
			     "NCQ Send/Recv Log not supported\n");
 | 
			
		||||
			     "NCQ Non-Data Log not supported\n");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	err_mask = ata_read_log_page(dev, ATA_LOG_NCQ_NON_DATA,
 | 
			
		||||
@ -4552,7 +4583,7 @@ int atapi_check_dma(struct ata_queued_cmd *qc)
 | 
			
		||||
	 */
 | 
			
		||||
	if (!(qc->dev->quirks & ATA_QUIRK_ATAPI_MOD16_DMA) &&
 | 
			
		||||
	    unlikely(qc->nbytes & 15))
 | 
			
		||||
		return 1;
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	if (ap->ops->check_atapi_dma)
 | 
			
		||||
		return ap->ops->check_atapi_dma(qc);
 | 
			
		||||
@ -5460,6 +5491,8 @@ struct ata_port *ata_port_alloc(struct ata_host *host)
 | 
			
		||||
#endif
 | 
			
		||||
	ata_sff_port_init(ap);
 | 
			
		||||
 | 
			
		||||
	ata_force_pflags(ap);
 | 
			
		||||
 | 
			
		||||
	return ap;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(ata_port_alloc);
 | 
			
		||||
@ -6272,6 +6305,9 @@ EXPORT_SYMBOL_GPL(ata_platform_remove_one);
 | 
			
		||||
	{ "no" #name,	.lflags_on	= (flags) },	\
 | 
			
		||||
	{ #name,	.lflags_off	= (flags) }
 | 
			
		||||
 | 
			
		||||
#define force_pflag_on(name, flags)			\
 | 
			
		||||
	{ #name,	.pflags_on	= (flags) }
 | 
			
		||||
 | 
			
		||||
#define force_quirk_on(name, flag)			\
 | 
			
		||||
	{ #name,	.quirk_on	= (flag) }
 | 
			
		||||
 | 
			
		||||
@ -6331,6 +6367,8 @@ static const struct ata_force_param force_tbl[] __initconst = {
 | 
			
		||||
	force_lflag_on(rstonce,		ATA_LFLAG_RST_ONCE),
 | 
			
		||||
	force_lflag_onoff(dbdelay,	ATA_LFLAG_NO_DEBOUNCE_DELAY),
 | 
			
		||||
 | 
			
		||||
	force_pflag_on(external,	ATA_PFLAG_EXTERNAL),
 | 
			
		||||
 | 
			
		||||
	force_quirk_onoff(ncq,		ATA_QUIRK_NONCQ),
 | 
			
		||||
	force_quirk_onoff(ncqtrim,	ATA_QUIRK_NO_NCQ_TRIM),
 | 
			
		||||
	force_quirk_onoff(ncqati,	ATA_QUIRK_NO_NCQ_ON_ATI),
 | 
			
		||||
 | 
			
		||||
@ -1542,8 +1542,15 @@ unsigned int atapi_eh_request_sense(struct ata_device *dev,
 | 
			
		||||
	tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
 | 
			
		||||
	tf.command = ATA_CMD_PACKET;
 | 
			
		||||
 | 
			
		||||
	/* is it pointless to prefer PIO for "safety reasons"? */
 | 
			
		||||
	if (ap->flags & ATA_FLAG_PIO_DMA) {
 | 
			
		||||
	/*
 | 
			
		||||
	 * Do not use DMA if the connected device only supports PIO, even if the
 | 
			
		||||
	 * port prefers PIO commands via DMA.
 | 
			
		||||
	 *
 | 
			
		||||
	 * Ideally, we should call atapi_check_dma() to check if it is safe for
 | 
			
		||||
	 * the LLD to use DMA for REQUEST_SENSE, but we don't have a qc.
 | 
			
		||||
	 * Since we can't check the command, perhaps we should only use pio?
 | 
			
		||||
	 */
 | 
			
		||||
	if ((ap->flags & ATA_FLAG_PIO_DMA) && !(dev->flags & ATA_DFLAG_PIO)) {
 | 
			
		||||
		tf.protocol = ATAPI_PROT_DMA;
 | 
			
		||||
		tf.feature |= ATAPI_PKT_DMA;
 | 
			
		||||
	} else {
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,7 @@
 | 
			
		||||
#include <scsi/scsi_cmnd.h>
 | 
			
		||||
#include <scsi/scsi_host.h>
 | 
			
		||||
#include <linux/libata.h>
 | 
			
		||||
#include <linux/string_choices.h>
 | 
			
		||||
 | 
			
		||||
#define DRV_NAME	"sata_via"
 | 
			
		||||
#define DRV_VERSION	"2.6"
 | 
			
		||||
@ -359,7 +360,7 @@ static int vt6420_prereset(struct ata_link *link, unsigned long deadline)
 | 
			
		||||
 | 
			
		||||
	ata_port_info(ap,
 | 
			
		||||
		      "SATA link %s 1.5 Gbps (SStatus %X SControl %X)\n",
 | 
			
		||||
		      online ? "up" : "down", sstatus, scontrol);
 | 
			
		||||
		      str_up_down(online), sstatus, scontrol);
 | 
			
		||||
 | 
			
		||||
	/* SStatus is read one more time */
 | 
			
		||||
	svia_scr_read(link, SCR_STATUS, &sstatus);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user