Commit 8019aa94 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: (79 commits)
  ata-acpi: don't call _GTF for disabled drive
  sata_mv add temporary 3 second init delay for SiliconImage PMs
  sata_mv remove redundant edma init code
  sata_mv add basic port multiplier support
  sata_mv fix SOC flags, enable NCQ on SOC
  sata_mv disable hotplug for now
  sata_mv cosmetics
  sata_mv hardreset rework
  [libata] improve Kconfig help text for new PMP, SFF options
  libata: make EH fail gracefully if no reset method is available
  libata: Be a bit more slack about early devices
  libata: cable logic
  libata: move link onlineness check out of softreset methods
  libata: kill dead code paths in reset path
  pata_scc: fix build breakage
  libata: make PMP support optional
  libata: implement PMP helpers
  libata: separate PMP support code from core code
  libata: make SFF support optional
  libata: don't use ap->ioaddr in non-SFF drivers
  ...
parents 73e3e648 48feb3c4
...@@ -28,7 +28,7 @@ config ATA_NONSTANDARD ...@@ -28,7 +28,7 @@ config ATA_NONSTANDARD
default n default n
config ATA_ACPI config ATA_ACPI
bool bool "ATA ACPI Support"
depends on ACPI && PCI depends on ACPI && PCI
select ACPI_DOCK select ACPI_DOCK
default y default y
...@@ -41,6 +41,13 @@ config ATA_ACPI ...@@ -41,6 +41,13 @@ config ATA_ACPI
You can disable this at kernel boot time by using the You can disable this at kernel boot time by using the
option libata.noacpi=1 option libata.noacpi=1
config SATA_PMP
bool "SATA Port Multiplier support"
default y
help
This option adds support for SATA Port Multipliers
(the SATA version of an ethernet hub, or SAS expander).
config SATA_AHCI config SATA_AHCI
tristate "AHCI SATA support" tristate "AHCI SATA support"
depends on PCI depends on PCI
...@@ -49,6 +56,43 @@ config SATA_AHCI ...@@ -49,6 +56,43 @@ config SATA_AHCI
If unsure, say N. If unsure, say N.
config SATA_SIL24
tristate "Silicon Image 3124/3132 SATA support"
depends on PCI
help
This option enables support for Silicon Image 3124/3132 Serial ATA.
If unsure, say N.
config SATA_FSL
tristate "Freescale 3.0Gbps SATA support"
depends on FSL_SOC
help
This option enables support for Freescale 3.0Gbps SATA controller.
It can be found on MPC837x and MPC8315.
If unsure, say N.
config ATA_SFF
bool "ATA SFF support"
default y
help
This option adds support for ATA controllers with SFF
compliant or similar programming interface.
SFF is the legacy IDE interface that has been around since
the dawn of time. Almost all PATA controllers have an
SFF interface. Many SATA controllers have an SFF interface
when configured into a legacy compatibility mode.
For users with exclusively modern controllers like AHCI,
Silicon Image 3124, or Marvell 6440, you may choose to
disable this uneeded SFF support.
If unsure, say Y.
if ATA_SFF
config SATA_SVW config SATA_SVW
tristate "ServerWorks Frodo / Apple K2 SATA support" tristate "ServerWorks Frodo / Apple K2 SATA support"
depends on PCI depends on PCI
...@@ -125,14 +169,6 @@ config SATA_SIL ...@@ -125,14 +169,6 @@ config SATA_SIL
If unsure, say N. If unsure, say N.
config SATA_SIL24
tristate "Silicon Image 3124/3132 SATA support"
depends on PCI
help
This option enables support for Silicon Image 3124/3132 Serial ATA.
If unsure, say N.
config SATA_SIS config SATA_SIS
tristate "SiS 964/965/966/180 SATA support" tristate "SiS 964/965/966/180 SATA support"
depends on PCI depends on PCI
...@@ -183,15 +219,6 @@ config PATA_ACPI ...@@ -183,15 +219,6 @@ config PATA_ACPI
firmware in the BIOS. This driver can sometimes handle firmware in the BIOS. This driver can sometimes handle
otherwise unsupported hardware. otherwise unsupported hardware.
config SATA_FSL
tristate "Freescale 3.0Gbps SATA support"
depends on FSL_SOC
help
This option enables support for Freescale 3.0Gbps SATA controller.
It can be found on MPC837x and MPC8315.
If unsure, say N.
config PATA_ALI config PATA_ALI
tristate "ALi PATA support (Experimental)" tristate "ALi PATA support (Experimental)"
depends on PCI && EXPERIMENTAL depends on PCI && EXPERIMENTAL
...@@ -679,4 +706,5 @@ config PATA_BF54X ...@@ -679,4 +706,5 @@ config PATA_BF54X
If unsure, say N. If unsure, say N.
endif # ATA_SFF
endif # ATA endif # ATA
...@@ -78,6 +78,7 @@ obj-$(CONFIG_ATA_GENERIC) += ata_generic.o ...@@ -78,6 +78,7 @@ obj-$(CONFIG_ATA_GENERIC) += ata_generic.o
# Should be last libata driver # Should be last libata driver
obj-$(CONFIG_PATA_LEGACY) += pata_legacy.o obj-$(CONFIG_PATA_LEGACY) += pata_legacy.o
libata-objs := libata-core.o libata-scsi.o libata-sff.o libata-eh.o \ libata-objs := libata-core.o libata-scsi.o libata-eh.o
libata-pmp.o libata-$(CONFIG_ATA_SFF) += libata-sff.o
libata-$(CONFIG_SATA_PMP) += libata-pmp.o
libata-$(CONFIG_ATA_ACPI) += libata-acpi.o libata-$(CONFIG_ATA_ACPI) += libata-acpi.o
This diff is collapsed.
...@@ -95,53 +95,13 @@ static int generic_set_mode(struct ata_link *link, struct ata_device **unused) ...@@ -95,53 +95,13 @@ static int generic_set_mode(struct ata_link *link, struct ata_device **unused)
} }
static struct scsi_host_template generic_sht = { static struct scsi_host_template generic_sht = {
.module = THIS_MODULE, ATA_BMDMA_SHT(DRV_NAME),
.name = DRV_NAME,
.ioctl = ata_scsi_ioctl,
.queuecommand = ata_scsi_queuecmd,
.can_queue = ATA_DEF_QUEUE,
.this_id = ATA_SHT_THIS_ID,
.sg_tablesize = LIBATA_MAX_PRD,
.cmd_per_lun = ATA_SHT_CMD_PER_LUN,
.emulated = ATA_SHT_EMULATED,
.use_clustering = ATA_SHT_USE_CLUSTERING,
.proc_name = DRV_NAME,
.dma_boundary = ATA_DMA_BOUNDARY,
.slave_configure = ata_scsi_slave_config,
.slave_destroy = ata_scsi_slave_destroy,
.bios_param = ata_std_bios_param,
}; };
static struct ata_port_operations generic_port_ops = { static struct ata_port_operations generic_port_ops = {
.set_mode = generic_set_mode, .inherits = &ata_bmdma_port_ops,
.tf_load = ata_tf_load,
.tf_read = ata_tf_read,
.check_status = ata_check_status,
.exec_command = ata_exec_command,
.dev_select = ata_std_dev_select,
.bmdma_setup = ata_bmdma_setup,
.bmdma_start = ata_bmdma_start,
.bmdma_stop = ata_bmdma_stop,
.bmdma_status = ata_bmdma_status,
.data_xfer = ata_data_xfer,
.freeze = ata_bmdma_freeze,
.thaw = ata_bmdma_thaw,
.error_handler = ata_bmdma_error_handler,
.post_internal_cmd = ata_bmdma_post_internal_cmd,
.cable_detect = ata_cable_unknown, .cable_detect = ata_cable_unknown,
.set_mode = generic_set_mode,
.qc_prep = ata_qc_prep,
.qc_issue = ata_qc_issue_prot,
.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_on = ata_irq_on,
.port_start = ata_sff_port_start,
}; };
static int all_generic_ide; /* Set to claim all devices */ static int all_generic_ide; /* Set to claim all devices */
...@@ -160,7 +120,6 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id ...@@ -160,7 +120,6 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id
{ {
u16 command; u16 command;
static const struct ata_port_info info = { static const struct ata_port_info info = {
.sht = &generic_sht,
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
...@@ -191,9 +150,9 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id ...@@ -191,9 +150,9 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id
return -ENODEV; return -ENODEV;
if (dev->vendor == PCI_VENDOR_ID_AL) if (dev->vendor == PCI_VENDOR_ID_AL)
ata_pci_clear_simplex(dev); ata_pci_bmdma_clear_simplex(dev);
return ata_pci_init_one(dev, ppi); return ata_pci_sff_init_one(dev, ppi, &generic_sht, NULL);
} }
static struct pci_device_id ata_generic[] = { static struct pci_device_id ata_generic[] = {
......
This diff is collapsed.
...@@ -77,7 +77,7 @@ void ata_acpi_associate_sata_port(struct ata_port *ap) ...@@ -77,7 +77,7 @@ void ata_acpi_associate_sata_port(struct ata_port *ap)
{ {
WARN_ON(!(ap->flags & ATA_FLAG_ACPI_SATA)); WARN_ON(!(ap->flags & ATA_FLAG_ACPI_SATA));
if (!ap->nr_pmp_links) { if (!sata_pmp_attached(ap)) {
acpi_integer adr = SATA_ADR(ap->port_no, NO_PORT_MULT); acpi_integer adr = SATA_ADR(ap->port_no, NO_PORT_MULT);
ap->link.device->acpi_handle = ap->link.device->acpi_handle =
...@@ -839,7 +839,8 @@ void ata_acpi_on_resume(struct ata_port *ap) ...@@ -839,7 +839,8 @@ void ata_acpi_on_resume(struct ata_port *ap)
*/ */
ata_link_for_each_dev(dev, &ap->link) { ata_link_for_each_dev(dev, &ap->link) {
ata_acpi_clear_gtf(dev); ata_acpi_clear_gtf(dev);
if (ata_dev_get_GTF(dev, NULL) >= 0) if (ata_dev_enabled(dev) &&
ata_dev_get_GTF(dev, NULL) >= 0)
dev->flags |= ATA_DFLAG_ACPI_PENDING; dev->flags |= ATA_DFLAG_ACPI_PENDING;
} }
} else { } else {
...@@ -849,7 +850,8 @@ void ata_acpi_on_resume(struct ata_port *ap) ...@@ -849,7 +850,8 @@ void ata_acpi_on_resume(struct ata_port *ap)
*/ */
ata_link_for_each_dev(dev, &ap->link) { ata_link_for_each_dev(dev, &ap->link) {
ata_acpi_clear_gtf(dev); ata_acpi_clear_gtf(dev);
dev->flags |= ATA_DFLAG_ACPI_PENDING; if (ata_dev_enabled(dev))
dev->flags |= ATA_DFLAG_ACPI_PENDING;
} }
} }
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -2393,7 +2393,9 @@ static void atapi_request_sense(struct ata_queued_cmd *qc) ...@@ -2393,7 +2393,9 @@ static void atapi_request_sense(struct ata_queued_cmd *qc)
/* FIXME: is this needed? */ /* FIXME: is this needed? */
memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
ap->ops->tf_read(ap, &qc->tf); #ifdef CONFIG_ATA_SFF
ap->ops->sff_tf_read(ap, &qc->tf);
#endif
/* fill these in, for the case where they are -not- overwritten */ /* fill these in, for the case where they are -not- overwritten */
cmd->sense_buffer[0] = 0x70; cmd->sense_buffer[0] = 0x70;
...@@ -2615,7 +2617,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) ...@@ -2615,7 +2617,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
static struct ata_device *ata_find_dev(struct ata_port *ap, int devno) static struct ata_device *ata_find_dev(struct ata_port *ap, int devno)
{ {
if (ap->nr_pmp_links == 0) { if (!sata_pmp_attached(ap)) {
if (likely(devno < ata_link_max_devices(&ap->link))) if (likely(devno < ata_link_max_devices(&ap->link)))
return &ap->link.device[devno]; return &ap->link.device[devno];
} else { } else {
...@@ -2632,7 +2634,7 @@ static struct ata_device *__ata_scsi_find_dev(struct ata_port *ap, ...@@ -2632,7 +2634,7 @@ static struct ata_device *__ata_scsi_find_dev(struct ata_port *ap,
int devno; int devno;
/* skip commands not addressed to targets we simulate */ /* skip commands not addressed to targets we simulate */
if (ap->nr_pmp_links == 0) { if (!sata_pmp_attached(ap)) {
if (unlikely(scsidev->channel || scsidev->lun)) if (unlikely(scsidev->channel || scsidev->lun))
return NULL; return NULL;
devno = scsidev->id; devno = scsidev->id;
...@@ -3490,7 +3492,7 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel, ...@@ -3490,7 +3492,7 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
if (lun != SCAN_WILD_CARD && lun) if (lun != SCAN_WILD_CARD && lun)
return -EINVAL; return -EINVAL;
if (ap->nr_pmp_links == 0) { if (!sata_pmp_attached(ap)) {
if (channel != SCAN_WILD_CARD && channel) if (channel != SCAN_WILD_CARD && channel)
return -EINVAL; return -EINVAL;
devno = id; devno = id;
...@@ -3507,8 +3509,8 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel, ...@@ -3507,8 +3509,8 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
ata_port_for_each_link(link, ap) { ata_port_for_each_link(link, ap) {
struct ata_eh_info *ehi = &link->eh_info; struct ata_eh_info *ehi = &link->eh_info;
ehi->probe_mask |= (1 << ata_link_max_devices(link)) - 1; ehi->probe_mask |= ATA_ALL_DEVICES;
ehi->action |= ATA_EH_SOFTRESET; ehi->action |= ATA_EH_RESET;
} }
} else { } else {
struct ata_device *dev = ata_find_dev(ap, devno); struct ata_device *dev = ata_find_dev(ap, devno);
...@@ -3516,8 +3518,7 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel, ...@@ -3516,8 +3518,7 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
if (dev) { if (dev) {
struct ata_eh_info *ehi = &dev->link->eh_info; struct ata_eh_info *ehi = &dev->link->eh_info;
ehi->probe_mask |= 1 << dev->devno; ehi->probe_mask |= 1 << dev->devno;
ehi->action |= ATA_EH_SOFTRESET; ehi->action |= ATA_EH_RESET;
ehi->flags |= ATA_EHI_RESUME_LINK;
} else } else
rc = -EINVAL; rc = -EINVAL;
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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