Commit 7be5cb14 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev

* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev:
  libata: fix kernel-doc parameter warning
  sata_mv: remove iounmap in mv_platform_remove and use devm_iomap
  ata: fix sparse warning in libata.h
  libata: implement libata.force module parameter
  sata_mv: use hpriv->base instead of the host->iomap
  sata_mv: Define module alias for platform device
  ata: fix sparse warnings in pata_legacy.c
parents 1803f338 73fd8b6d
...@@ -950,6 +950,41 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -950,6 +950,41 @@ and is between 256 and 4096 characters. It is defined in the file
when set. when set.
Format: <int> Format: <int>
libata.force= [LIBATA] Force configurations. The format is comma
separated list of "[ID:]VAL" where ID is
PORT[:DEVICE]. PORT and DEVICE are decimal numbers
matching port, link or device. Basically, it matches
the ATA ID string printed on console by libata. If
the whole ID part is omitted, the last PORT and DEVICE
values are used. If ID hasn't been specified yet, the
configuration applies to all ports, links and devices.
If only DEVICE is omitted, the parameter applies to
the port and all links and devices behind it. DEVICE
number of 0 either selects the first device or the
first fan-out link behind PMP device. It does not
select the host link. DEVICE number of 15 selects the
host link and device attached to it.
The VAL specifies the configuration to force. As long
as there's no ambiguity shortcut notation is allowed.
For example, both 1.5 and 1.5G would work for 1.5Gbps.
The following configurations can be forced.
* Cable type: 40c, 80c, short40c, unk, ign or sata.
Any ID with matching PORT is used.
* SATA link speed limit: 1.5Gbps or 3.0Gbps.
* Transfer mode: pio[0-7], mwdma[0-4] and udma[0-7].
udma[/][16,25,33,44,66,100,133] notation is also
allowed.
* [no]ncq: Turn on or off NCQ.
If there are multiple matching configurations changing
the same attribute, the last one is used.
load_ramdisk= [RAM] List of ramdisks to load from floppy load_ramdisk= [RAM] List of ramdisks to load from floppy
See Documentation/ramdisk.txt. See Documentation/ramdisk.txt.
......
This diff is collapsed.
...@@ -2393,9 +2393,11 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link, ...@@ -2393,9 +2393,11 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link,
} }
/* PDIAG- should have been released, ask cable type if post-reset */ /* PDIAG- should have been released, ask cable type if post-reset */
if (ata_is_host_link(link) && ap->ops->cable_detect && if ((ehc->i.flags & ATA_EHI_DID_RESET) && ata_is_host_link(link)) {
(ehc->i.flags & ATA_EHI_DID_RESET)) if (ap->ops->cable_detect)
ap->cbl = ap->ops->cable_detect(ap); ap->cbl = ap->ops->cable_detect(ap);
ata_force_cbl(ap);
}
/* Configure new devices forward such that user doesn't see /* Configure new devices forward such that user doesn't see
* device detection messages backwards. * device detection messages backwards.
......
...@@ -828,7 +828,7 @@ static void ata_scsi_sdev_config(struct scsi_device *sdev) ...@@ -828,7 +828,7 @@ static void ata_scsi_sdev_config(struct scsi_device *sdev)
/** /**
* atapi_drain_needed - Check whether data transfer may overflow * atapi_drain_needed - Check whether data transfer may overflow
* @request: request to be checked * @rq: request to be checked
* *
* ATAPI commands which transfer variable length data to host * ATAPI commands which transfer variable length data to host
* might overflow due to application error or hardare bug. This * might overflow due to application error or hardare bug. This
......
...@@ -61,6 +61,7 @@ extern int atapi_passthru16; ...@@ -61,6 +61,7 @@ extern int atapi_passthru16;
extern int libata_fua; extern int libata_fua;
extern int libata_noacpi; extern int libata_noacpi;
extern int libata_allow_tpm; extern int libata_allow_tpm;
extern void ata_force_cbl(struct ata_port *ap);
extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev); extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev);
extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev, extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev,
u64 block, u32 n_block, unsigned int tf_flags, u64 block, u32 n_block, unsigned int tf_flags,
......
...@@ -774,14 +774,14 @@ static struct ata_port_operations opti82c46x_port_ops = { ...@@ -774,14 +774,14 @@ static struct ata_port_operations opti82c46x_port_ops = {
static void qdi6500_set_piomode(struct ata_port *ap, struct ata_device *adev) static void qdi6500_set_piomode(struct ata_port *ap, struct ata_device *adev)
{ {
struct ata_timing t; struct ata_timing t;
struct legacy_data *qdi = ap->host->private_data; struct legacy_data *ld_qdi = ap->host->private_data;
int active, recovery; int active, recovery;
u8 timing; u8 timing;
/* Get the timing data in cycles */ /* Get the timing data in cycles */
ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000); ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
if (qdi->fast) { if (ld_qdi->fast) {
active = 8 - FIT(t.active, 1, 8); active = 8 - FIT(t.active, 1, 8);
recovery = 18 - FIT(t.recover, 3, 18); recovery = 18 - FIT(t.recover, 3, 18);
} else { } else {
...@@ -790,9 +790,9 @@ static void qdi6500_set_piomode(struct ata_port *ap, struct ata_device *adev) ...@@ -790,9 +790,9 @@ static void qdi6500_set_piomode(struct ata_port *ap, struct ata_device *adev)
} }
timing = (recovery << 4) | active | 0x08; timing = (recovery << 4) | active | 0x08;
qdi->clock[adev->devno] = timing; ld_qdi->clock[adev->devno] = timing;
outb(timing, qdi->timing); outb(timing, ld_qdi->timing);
} }
/** /**
...@@ -808,14 +808,14 @@ static void qdi6500_set_piomode(struct ata_port *ap, struct ata_device *adev) ...@@ -808,14 +808,14 @@ static void qdi6500_set_piomode(struct ata_port *ap, struct ata_device *adev)
static void qdi6580dp_set_piomode(struct ata_port *ap, struct ata_device *adev) static void qdi6580dp_set_piomode(struct ata_port *ap, struct ata_device *adev)
{ {
struct ata_timing t; struct ata_timing t;
struct legacy_data *qdi = ap->host->private_data; struct legacy_data *ld_qdi = ap->host->private_data;
int active, recovery; int active, recovery;
u8 timing; u8 timing;
/* Get the timing data in cycles */ /* Get the timing data in cycles */
ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000); ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
if (qdi->fast) { if (ld_qdi->fast) {
active = 8 - FIT(t.active, 1, 8); active = 8 - FIT(t.active, 1, 8);
recovery = 18 - FIT(t.recover, 3, 18); recovery = 18 - FIT(t.recover, 3, 18);
} else { } else {
...@@ -824,12 +824,12 @@ static void qdi6580dp_set_piomode(struct ata_port *ap, struct ata_device *adev) ...@@ -824,12 +824,12 @@ static void qdi6580dp_set_piomode(struct ata_port *ap, struct ata_device *adev)
} }
timing = (recovery << 4) | active | 0x08; timing = (recovery << 4) | active | 0x08;
qdi->clock[adev->devno] = timing; ld_qdi->clock[adev->devno] = timing;
outb(timing, qdi->timing + 2 * ap->port_no); outb(timing, ld_qdi->timing + 2 * ap->port_no);
/* Clear the FIFO */ /* Clear the FIFO */
if (adev->class != ATA_DEV_ATA) if (adev->class != ATA_DEV_ATA)
outb(0x5F, qdi->timing + 3); outb(0x5F, ld_qdi->timing + 3);
} }
/** /**
...@@ -845,14 +845,14 @@ static void qdi6580dp_set_piomode(struct ata_port *ap, struct ata_device *adev) ...@@ -845,14 +845,14 @@ static void qdi6580dp_set_piomode(struct ata_port *ap, struct ata_device *adev)
static void qdi6580_set_piomode(struct ata_port *ap, struct ata_device *adev) static void qdi6580_set_piomode(struct ata_port *ap, struct ata_device *adev)
{ {
struct ata_timing t; struct ata_timing t;
struct legacy_data *qdi = ap->host->private_data; struct legacy_data *ld_qdi = ap->host->private_data;
int active, recovery; int active, recovery;
u8 timing; u8 timing;
/* Get the timing data in cycles */ /* Get the timing data in cycles */
ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000); ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
if (qdi->fast) { if (ld_qdi->fast) {
active = 8 - FIT(t.active, 1, 8); active = 8 - FIT(t.active, 1, 8);
recovery = 18 - FIT(t.recover, 3, 18); recovery = 18 - FIT(t.recover, 3, 18);
} else { } else {
...@@ -860,11 +860,11 @@ static void qdi6580_set_piomode(struct ata_port *ap, struct ata_device *adev) ...@@ -860,11 +860,11 @@ static void qdi6580_set_piomode(struct ata_port *ap, struct ata_device *adev)
recovery = 15 - FIT(t.recover, 0, 15); recovery = 15 - FIT(t.recover, 0, 15);
} }
timing = (recovery << 4) | active | 0x08; timing = (recovery << 4) | active | 0x08;
qdi->clock[adev->devno] = timing; ld_qdi->clock[adev->devno] = timing;
outb(timing, qdi->timing + 2 * adev->devno); outb(timing, ld_qdi->timing + 2 * adev->devno);
/* Clear the FIFO */ /* Clear the FIFO */
if (adev->class != ATA_DEV_ATA) if (adev->class != ATA_DEV_ATA)
outb(0x5F, qdi->timing + 3); outb(0x5F, ld_qdi->timing + 3);
} }
/** /**
...@@ -879,12 +879,12 @@ static unsigned int qdi_qc_issue_prot(struct ata_queued_cmd *qc) ...@@ -879,12 +879,12 @@ static unsigned int qdi_qc_issue_prot(struct ata_queued_cmd *qc)
{ {
struct ata_port *ap = qc->ap; struct ata_port *ap = qc->ap;
struct ata_device *adev = qc->dev; struct ata_device *adev = qc->dev;
struct legacy_data *qdi = ap->host->private_data; struct legacy_data *ld_qdi = ap->host->private_data;
if (qdi->clock[adev->devno] != qdi->last) { if (ld_qdi->clock[adev->devno] != ld_qdi->last) {
if (adev->pio_mode) { if (adev->pio_mode) {
qdi->last = qdi->clock[adev->devno]; ld_qdi->last = ld_qdi->clock[adev->devno];
outb(qdi->clock[adev->devno], qdi->timing + outb(ld_qdi->clock[adev->devno], ld_qdi->timing +
2 * ap->port_no); 2 * ap->port_no);
} }
} }
...@@ -1037,12 +1037,12 @@ static u8 winbond_readcfg(unsigned long port, u8 reg) ...@@ -1037,12 +1037,12 @@ static u8 winbond_readcfg(unsigned long port, u8 reg)
static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev) static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
{ {
struct ata_timing t; struct ata_timing t;
struct legacy_data *winbond = ap->host->private_data; struct legacy_data *ld_winbond = ap->host->private_data;
int active, recovery; int active, recovery;
u8 reg; u8 reg;
int timing = 0x88 + (ap->port_no * 4) + (adev->devno * 2); int timing = 0x88 + (ap->port_no * 4) + (adev->devno * 2);
reg = winbond_readcfg(winbond->timing, 0x81); reg = winbond_readcfg(ld_winbond->timing, 0x81);
/* Get the timing data in cycles */ /* Get the timing data in cycles */
if (reg & 0x40) /* Fast VLB bus, assume 50MHz */ if (reg & 0x40) /* Fast VLB bus, assume 50MHz */
...@@ -1053,7 +1053,7 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev) ...@@ -1053,7 +1053,7 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
active = (FIT(t.active, 3, 17) - 1) & 0x0F; active = (FIT(t.active, 3, 17) - 1) & 0x0F;
recovery = (FIT(t.recover, 1, 15) + 1) & 0x0F; recovery = (FIT(t.recover, 1, 15) + 1) & 0x0F;
timing = (active << 4) | recovery; timing = (active << 4) | recovery;
winbond_writecfg(winbond->timing, timing, reg); winbond_writecfg(ld_winbond->timing, timing, reg);
/* Load the setup timing */ /* Load the setup timing */
...@@ -1063,7 +1063,7 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev) ...@@ -1063,7 +1063,7 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
if (!ata_pio_need_iordy(adev)) if (!ata_pio_need_iordy(adev))
reg |= 0x02; /* IORDY off */ reg |= 0x02; /* IORDY off */
reg |= (FIT(t.setup, 0, 3) << 6); reg |= (FIT(t.setup, 0, 3) << 6);
winbond_writecfg(winbond->timing, timing + 1, reg); winbond_writecfg(ld_winbond->timing, timing + 1, reg);
} }
static int winbond_port(struct platform_device *dev, static int winbond_port(struct platform_device *dev,
......
...@@ -870,7 +870,7 @@ static void mv_start_dma(struct ata_port *ap, void __iomem *port_mmio, ...@@ -870,7 +870,7 @@ static void mv_start_dma(struct ata_port *ap, void __iomem *port_mmio,
struct mv_host_priv *hpriv = ap->host->private_data; struct mv_host_priv *hpriv = ap->host->private_data;
int hard_port = mv_hardport_from_port(ap->port_no); int hard_port = mv_hardport_from_port(ap->port_no);
void __iomem *hc_mmio = mv_hc_base_from_port( void __iomem *hc_mmio = mv_hc_base_from_port(
ap->host->iomap[MV_PRIMARY_BAR], hard_port); mv_host_base(ap->host), hard_port);
u32 hc_irq_cause, ipending; u32 hc_irq_cause, ipending;
/* clear EDMA event indicators, if any */ /* clear EDMA event indicators, if any */
...@@ -2947,7 +2947,8 @@ static int mv_platform_probe(struct platform_device *pdev) ...@@ -2947,7 +2947,8 @@ static int mv_platform_probe(struct platform_device *pdev)
hpriv->n_ports = n_ports; hpriv->n_ports = n_ports;
host->iomap = NULL; host->iomap = NULL;
hpriv->base = ioremap(res->start, res->end - res->start + 1); hpriv->base = devm_ioremap(&pdev->dev, res->start,
res->end - res->start + 1);
hpriv->base -= MV_SATAHC0_REG_BASE; hpriv->base -= MV_SATAHC0_REG_BASE;
rc = mv_create_dma_pools(hpriv, &pdev->dev); rc = mv_create_dma_pools(hpriv, &pdev->dev);
...@@ -2979,11 +2980,8 @@ static int __devexit mv_platform_remove(struct platform_device *pdev) ...@@ -2979,11 +2980,8 @@ static int __devexit mv_platform_remove(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct ata_host *host = dev_get_drvdata(dev); struct ata_host *host = dev_get_drvdata(dev);
struct mv_host_priv *hpriv = host->private_data;
void __iomem *base = hpriv->base;
ata_host_detach(host); ata_host_detach(host);
iounmap(base);
return 0; return 0;
} }
...@@ -3194,6 +3192,7 @@ MODULE_DESCRIPTION("SCSI low-level driver for Marvell SATA controllers"); ...@@ -3194,6 +3192,7 @@ MODULE_DESCRIPTION("SCSI low-level driver for Marvell SATA controllers");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DEVICE_TABLE(pci, mv_pci_tbl); MODULE_DEVICE_TABLE(pci, mv_pci_tbl);
MODULE_VERSION(DRV_VERSION); MODULE_VERSION(DRV_VERSION);
MODULE_ALIAS("platform:sata_mv");
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
module_param(msi, int, 0444); module_param(msi, int, 0444);
......
...@@ -1197,7 +1197,7 @@ static inline struct ata_link *ata_port_next_link(struct ata_link *link) ...@@ -1197,7 +1197,7 @@ static inline struct ata_link *ata_port_next_link(struct ata_link *link)
return ap->pmp_link; return ap->pmp_link;
} }
if (++link - ap->pmp_link < ap->nr_pmp_links) if (++link < ap->nr_pmp_links + ap->pmp_link)
return link; return link;
return NULL; return NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment