Commit 03529d9f authored by Linus Torvalds's avatar Linus Torvalds

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

* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev:
  [PATCH] ata_piix: add ICH6/7/8 to Kconfig
  [PATCH] sata_sil: disable hotplug interrupts on two ATI IXPs
  [PATCH] libata: cosmetic updates
  [PATCH] ata: add some NVIDIA chipset IDs
  [PATCH] libata reduce timeouts
  [PATCH] libata: implement ata_port_max_devices()
  [PATCH] libata: make two functions global
  [PATCH] libata: update ata_do_simple_cmd()
  [PATCH] libata: move ata_do_simple_cmd() below ata_exec_internal()
  [PATCH] libata: clear EH action on device detach
  [PATCH] libata: implement and use ata_deh_dev_action()
  [PATCH] libata: move ata_eh_clear_action() upward
  [PATCH] libata.h needs scatterlist.h
  [libata] sata_vsc: partially revert a PCI ID-related commit
  [libata] Bump versions
parents 11bcab90 2154cfa6
...@@ -75,6 +75,7 @@ static struct amd_ide_chip { ...@@ -75,6 +75,7 @@ static struct amd_ide_chip {
{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, 0x50, AMD_UDMA_133 },
{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, 0x50, AMD_UDMA_133 },
{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, 0x50, AMD_UDMA_133 },
{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, 0x50, AMD_UDMA_133 },
{ PCI_DEVICE_ID_AMD_CS5536_IDE, 0x40, AMD_UDMA_100 }, { PCI_DEVICE_ID_AMD_CS5536_IDE, 0x40, AMD_UDMA_100 },
{ 0 } { 0 }
}; };
...@@ -490,7 +491,8 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { ...@@ -490,7 +491,8 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
/* 15 */ DECLARE_NV_DEV("NFORCE-MCP51"), /* 15 */ DECLARE_NV_DEV("NFORCE-MCP51"),
/* 16 */ DECLARE_NV_DEV("NFORCE-MCP55"), /* 16 */ DECLARE_NV_DEV("NFORCE-MCP55"),
/* 17 */ DECLARE_NV_DEV("NFORCE-MCP61"), /* 17 */ DECLARE_NV_DEV("NFORCE-MCP61"),
/* 18 */ DECLARE_AMD_DEV("AMD5536"), /* 18 */ DECLARE_NV_DEV("NFORCE-MCP65"),
/* 19 */ DECLARE_AMD_DEV("AMD5536"),
}; };
static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id) static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id)
...@@ -528,7 +530,8 @@ static struct pci_device_id amd74xx_pci_tbl[] = { ...@@ -528,7 +530,8 @@ static struct pci_device_id amd74xx_pci_tbl[] = {
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 },
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16 },
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 },
{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18 },
{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 19 },
{ 0, }, { 0, },
}; };
MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl); MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl);
......
...@@ -501,7 +501,7 @@ config SCSI_ATA_PIIX ...@@ -501,7 +501,7 @@ config SCSI_ATA_PIIX
tristate "Intel PIIX/ICH SATA support" tristate "Intel PIIX/ICH SATA support"
depends on SCSI_SATA && PCI depends on SCSI_SATA && PCI
help help
This option enables support for ICH5 Serial ATA. This option enables support for ICH5/6/7/8 Serial ATA.
If PATA support was enabled previously, this enables If PATA support was enabled previously, this enables
support for select Intel PIIX/ICH PATA host controllers. support for select Intel PIIX/ICH PATA host controllers.
......
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
#include <asm/io.h> #include <asm/io.h>
#define DRV_NAME "ahci" #define DRV_NAME "ahci"
#define DRV_VERSION "1.3" #define DRV_VERSION "2.0"
enum { enum {
......
...@@ -93,7 +93,7 @@ ...@@ -93,7 +93,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "ata_piix" #define DRV_NAME "ata_piix"
#define DRV_VERSION "1.10" #define DRV_VERSION "2.00"
enum { enum {
PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ PIIX_IOCFG = 0x54, /* IDE I/O configuration register */
......
...@@ -88,6 +88,10 @@ int libata_fua = 0; ...@@ -88,6 +88,10 @@ int libata_fua = 0;
module_param_named(fua, libata_fua, int, 0444); module_param_named(fua, libata_fua, int, 0444);
MODULE_PARM_DESC(fua, "FUA support (0=off, 1=on)"); MODULE_PARM_DESC(fua, "FUA support (0=off, 1=on)");
static int ata_probe_timeout = ATA_TMOUT_INTERNAL / HZ;
module_param(ata_probe_timeout, int, 0444);
MODULE_PARM_DESC(ata_probe_timeout, "Set ATA probing timeout (seconds)");
MODULE_AUTHOR("Jeff Garzik"); MODULE_AUTHOR("Jeff Garzik");
MODULE_DESCRIPTION("Library module for ATA devices"); MODULE_DESCRIPTION("Library module for ATA devices");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -777,11 +781,9 @@ void ata_std_dev_select (struct ata_port *ap, unsigned int device) ...@@ -777,11 +781,9 @@ void ata_std_dev_select (struct ata_port *ap, unsigned int device)
void ata_dev_select(struct ata_port *ap, unsigned int device, void ata_dev_select(struct ata_port *ap, unsigned int device,
unsigned int wait, unsigned int can_sleep) unsigned int wait, unsigned int can_sleep)
{ {
if (ata_msg_probe(ap)) { if (ata_msg_probe(ap))
ata_port_printk(ap, KERN_INFO, "ata_dev_select: ENTER, ata%u: " ata_port_printk(ap, KERN_INFO, "ata_dev_select: ENTER, ata%u: "
"device %u, wait %u\n", "device %u, wait %u\n", ap->id, device, wait);
ap->id, device, wait);
}
if (wait) if (wait)
ata_wait_idle(ap); ata_wait_idle(ap);
...@@ -950,7 +952,8 @@ void ata_port_flush_task(struct ata_port *ap) ...@@ -950,7 +952,8 @@ void ata_port_flush_task(struct ata_port *ap)
*/ */
if (!cancel_delayed_work(&ap->port_task)) { if (!cancel_delayed_work(&ap->port_task)) {
if (ata_msg_ctl(ap)) if (ata_msg_ctl(ap))
ata_port_printk(ap, KERN_DEBUG, "%s: flush #2\n", __FUNCTION__); ata_port_printk(ap, KERN_DEBUG, "%s: flush #2\n",
__FUNCTION__);
flush_workqueue(ata_wq); flush_workqueue(ata_wq);
} }
...@@ -1059,7 +1062,7 @@ unsigned ata_exec_internal(struct ata_device *dev, ...@@ -1059,7 +1062,7 @@ unsigned ata_exec_internal(struct ata_device *dev,
spin_unlock_irqrestore(ap->lock, flags); spin_unlock_irqrestore(ap->lock, flags);
rc = wait_for_completion_timeout(&wait, ATA_TMOUT_INTERNAL); rc = wait_for_completion_timeout(&wait, ata_probe_timeout);
ata_port_flush_task(ap); ata_port_flush_task(ap);
...@@ -1081,7 +1084,7 @@ unsigned ata_exec_internal(struct ata_device *dev, ...@@ -1081,7 +1084,7 @@ unsigned ata_exec_internal(struct ata_device *dev,
if (ata_msg_warn(ap)) if (ata_msg_warn(ap))
ata_dev_printk(dev, KERN_WARNING, ata_dev_printk(dev, KERN_WARNING,
"qc timeout (cmd 0x%x)\n", command); "qc timeout (cmd 0x%x)\n", command);
} }
spin_unlock_irqrestore(ap->lock, flags); spin_unlock_irqrestore(ap->lock, flags);
...@@ -1093,9 +1096,9 @@ unsigned ata_exec_internal(struct ata_device *dev, ...@@ -1093,9 +1096,9 @@ unsigned ata_exec_internal(struct ata_device *dev,
if (qc->flags & ATA_QCFLAG_FAILED && !qc->err_mask) { if (qc->flags & ATA_QCFLAG_FAILED && !qc->err_mask) {
if (ata_msg_warn(ap)) if (ata_msg_warn(ap))
ata_dev_printk(dev, KERN_WARNING, ata_dev_printk(dev, KERN_WARNING,
"zero err_mask for failed " "zero err_mask for failed "
"internal command, assuming AC_ERR_OTHER\n"); "internal command, assuming AC_ERR_OTHER\n");
qc->err_mask |= AC_ERR_OTHER; qc->err_mask |= AC_ERR_OTHER;
} }
...@@ -1131,6 +1134,33 @@ unsigned ata_exec_internal(struct ata_device *dev, ...@@ -1131,6 +1134,33 @@ unsigned ata_exec_internal(struct ata_device *dev,
return err_mask; return err_mask;
} }
/**
* ata_do_simple_cmd - execute simple internal command
* @dev: Device to which the command is sent
* @cmd: Opcode to execute
*
* Execute a 'simple' command, that only consists of the opcode
* 'cmd' itself, without filling any other registers
*
* LOCKING:
* Kernel thread context (may sleep).
*
* RETURNS:
* Zero on success, AC_ERR_* mask on failure
*/
unsigned int ata_do_simple_cmd(struct ata_device *dev, u8 cmd)
{
struct ata_taskfile tf;
ata_tf_init(dev, &tf);
tf.command = cmd;
tf.flags |= ATA_TFLAG_DEVICE;
tf.protocol = ATA_PROT_NODATA;
return ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
}
/** /**
* ata_pio_need_iordy - check if iordy needed * ata_pio_need_iordy - check if iordy needed
* @adev: ATA device * @adev: ATA device
...@@ -1193,8 +1223,8 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, ...@@ -1193,8 +1223,8 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
int rc; int rc;
if (ata_msg_ctl(ap)) if (ata_msg_ctl(ap))
ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER, host %u, dev %u\n", ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER, host %u, dev %u\n",
__FUNCTION__, ap->id, dev->devno); __FUNCTION__, ap->id, dev->devno);
ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */ ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */
...@@ -1263,9 +1293,9 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, ...@@ -1263,9 +1293,9 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
return 0; return 0;
err_out: err_out:
if (ata_msg_warn(ap)) if (ata_msg_warn(ap))
ata_dev_printk(dev, KERN_WARNING, "failed to IDENTIFY " ata_dev_printk(dev, KERN_WARNING, "failed to IDENTIFY "
"(%s, err_mask=0x%x)\n", reason, err_mask); "(%s, err_mask=0x%x)\n", reason, err_mask);
return rc; return rc;
} }
...@@ -1318,19 +1348,21 @@ int ata_dev_configure(struct ata_device *dev, int print_info) ...@@ -1318,19 +1348,21 @@ int ata_dev_configure(struct ata_device *dev, int print_info)
int i, rc; int i, rc;
if (!ata_dev_enabled(dev) && ata_msg_info(ap)) { if (!ata_dev_enabled(dev) && ata_msg_info(ap)) {
ata_dev_printk(dev, KERN_INFO, "%s: ENTER/EXIT (host %u, dev %u) -- nodev\n", ata_dev_printk(dev, KERN_INFO,
__FUNCTION__, ap->id, dev->devno); "%s: ENTER/EXIT (host %u, dev %u) -- nodev\n",
__FUNCTION__, ap->id, dev->devno);
return 0; return 0;
} }
if (ata_msg_probe(ap)) if (ata_msg_probe(ap))
ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER, host %u, dev %u\n", ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER, host %u, dev %u\n",
__FUNCTION__, ap->id, dev->devno); __FUNCTION__, ap->id, dev->devno);
/* print device capabilities */ /* print device capabilities */
if (ata_msg_probe(ap)) if (ata_msg_probe(ap))
ata_dev_printk(dev, KERN_DEBUG, "%s: cfg 49:%04x 82:%04x 83:%04x " ata_dev_printk(dev, KERN_DEBUG,
"84:%04x 85:%04x 86:%04x 87:%04x 88:%04x\n", "%s: cfg 49:%04x 82:%04x 83:%04x 84:%04x "
"85:%04x 86:%04x 87:%04x 88:%04x\n",
__FUNCTION__, __FUNCTION__,
id[49], id[82], id[83], id[84], id[49], id[82], id[83], id[84],
id[85], id[86], id[87], id[88]); id[85], id[86], id[87], id[88]);
...@@ -1402,14 +1434,16 @@ int ata_dev_configure(struct ata_device *dev, int print_info) ...@@ -1402,14 +1434,16 @@ int ata_dev_configure(struct ata_device *dev, int print_info)
ata_id_major_version(id), ata_id_major_version(id),
ata_mode_string(xfer_mask), ata_mode_string(xfer_mask),
(unsigned long long)dev->n_sectors, (unsigned long long)dev->n_sectors,
dev->cylinders, dev->heads, dev->sectors); dev->cylinders, dev->heads,
dev->sectors);
} }
if (dev->id[59] & 0x100) { if (dev->id[59] & 0x100) {
dev->multi_count = dev->id[59] & 0xff; dev->multi_count = dev->id[59] & 0xff;
if (ata_msg_info(ap)) if (ata_msg_info(ap))
ata_dev_printk(dev, KERN_INFO, "ata%u: dev %u multi count %u\n", ata_dev_printk(dev, KERN_INFO,
ap->id, dev->devno, dev->multi_count); "ata%u: dev %u multi count %u\n",
ap->id, dev->devno, dev->multi_count);
} }
dev->cdb_len = 16; dev->cdb_len = 16;
...@@ -1422,8 +1456,8 @@ int ata_dev_configure(struct ata_device *dev, int print_info) ...@@ -1422,8 +1456,8 @@ int ata_dev_configure(struct ata_device *dev, int print_info)
rc = atapi_cdb_len(id); rc = atapi_cdb_len(id);
if ((rc < 12) || (rc > ATAPI_CDB_LEN)) { if ((rc < 12) || (rc > ATAPI_CDB_LEN)) {
if (ata_msg_warn(ap)) if (ata_msg_warn(ap))
ata_dev_printk(dev, KERN_WARNING, ata_dev_printk(dev, KERN_WARNING,
"unsupported CDB len\n"); "unsupported CDB len\n");
rc = -EINVAL; rc = -EINVAL;
goto err_out_nosup; goto err_out_nosup;
} }
...@@ -1466,8 +1500,8 @@ int ata_dev_configure(struct ata_device *dev, int print_info) ...@@ -1466,8 +1500,8 @@ int ata_dev_configure(struct ata_device *dev, int print_info)
err_out_nosup: err_out_nosup:
if (ata_msg_probe(ap)) if (ata_msg_probe(ap))
ata_dev_printk(dev, KERN_DEBUG, ata_dev_printk(dev, KERN_DEBUG,
"%s: EXIT, err\n", __FUNCTION__); "%s: EXIT, err\n", __FUNCTION__);
return rc; return rc;
} }
...@@ -3527,7 +3561,7 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) ...@@ -3527,7 +3561,7 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)
* Inherited from caller. * Inherited from caller.
*/ */
void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf, void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
unsigned int buflen, int write_data) unsigned int buflen, int write_data)
{ {
struct ata_port *ap = adev->ap; struct ata_port *ap = adev->ap;
...@@ -3573,7 +3607,7 @@ void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf, ...@@ -3573,7 +3607,7 @@ void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
* Inherited from caller. * Inherited from caller.
*/ */
void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf, void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf,
unsigned int buflen, int write_data) unsigned int buflen, int write_data)
{ {
struct ata_port *ap = adev->ap; struct ata_port *ap = adev->ap;
...@@ -3607,7 +3641,7 @@ void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf, ...@@ -3607,7 +3641,7 @@ void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf,
* @buflen: buffer length * @buflen: buffer length
* @write_data: read/write * @write_data: read/write
* *
* Transfer data from/to the device data register by PIO. Do the * Transfer data from/to the device data register by PIO. Do the
* transfer with interrupts disabled. * transfer with interrupts disabled.
* *
* LOCKING: * LOCKING:
...@@ -4946,31 +4980,9 @@ int ata_port_offline(struct ata_port *ap) ...@@ -4946,31 +4980,9 @@ int ata_port_offline(struct ata_port *ap)
return 0; return 0;
} }
/* int ata_flush_cache(struct ata_device *dev)
* Execute a 'simple' command, that only consists of the opcode 'cmd' itself,
* without filling any other registers
*/
static int ata_do_simple_cmd(struct ata_device *dev, u8 cmd)
{
struct ata_taskfile tf;
int err;
ata_tf_init(dev, &tf);
tf.command = cmd;
tf.flags |= ATA_TFLAG_DEVICE;
tf.protocol = ATA_PROT_NODATA;
err = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
if (err)
ata_dev_printk(dev, KERN_ERR, "%s: ata command failed: %d\n",
__FUNCTION__, err);
return err;
}
static int ata_flush_cache(struct ata_device *dev)
{ {
unsigned int err_mask;
u8 cmd; u8 cmd;
if (!ata_try_flush_cache(dev)) if (!ata_try_flush_cache(dev))
...@@ -4981,17 +4993,41 @@ static int ata_flush_cache(struct ata_device *dev) ...@@ -4981,17 +4993,41 @@ static int ata_flush_cache(struct ata_device *dev)
else else
cmd = ATA_CMD_FLUSH; cmd = ATA_CMD_FLUSH;
return ata_do_simple_cmd(dev, cmd); err_mask = ata_do_simple_cmd(dev, cmd);
if (err_mask) {
ata_dev_printk(dev, KERN_ERR, "failed to flush cache\n");
return -EIO;
}
return 0;
} }
static int ata_standby_drive(struct ata_device *dev) static int ata_standby_drive(struct ata_device *dev)
{ {
return ata_do_simple_cmd(dev, ATA_CMD_STANDBYNOW1); unsigned int err_mask;
err_mask = ata_do_simple_cmd(dev, ATA_CMD_STANDBYNOW1);
if (err_mask) {
ata_dev_printk(dev, KERN_ERR, "failed to standby drive "
"(err_mask=0x%x)\n", err_mask);
return -EIO;
}
return 0;
} }
static int ata_start_drive(struct ata_device *dev) static int ata_start_drive(struct ata_device *dev)
{ {
return ata_do_simple_cmd(dev, ATA_CMD_IDLEIMMEDIATE); unsigned int err_mask;
err_mask = ata_do_simple_cmd(dev, ATA_CMD_IDLEIMMEDIATE);
if (err_mask) {
ata_dev_printk(dev, KERN_ERR, "failed to start drive "
"(err_mask=0x%x)\n", err_mask);
return -EIO;
}
return 0;
} }
/** /**
...@@ -5212,7 +5248,7 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host, ...@@ -5212,7 +5248,7 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,
ap->msg_enable = 0x00FF; ap->msg_enable = 0x00FF;
#elif defined(ATA_DEBUG) #elif defined(ATA_DEBUG)
ap->msg_enable = ATA_MSG_DRV | ATA_MSG_INFO | ATA_MSG_CTL | ATA_MSG_WARN | ATA_MSG_ERR; ap->msg_enable = ATA_MSG_DRV | ATA_MSG_INFO | ATA_MSG_CTL | ATA_MSG_WARN | ATA_MSG_ERR;
#else #else
ap->msg_enable = ATA_MSG_DRV | ATA_MSG_ERR | ATA_MSG_WARN; ap->msg_enable = ATA_MSG_DRV | ATA_MSG_ERR | ATA_MSG_WARN;
#endif #endif
...@@ -5709,6 +5745,7 @@ int ata_pci_device_resume(struct pci_dev *pdev) ...@@ -5709,6 +5745,7 @@ int ata_pci_device_resume(struct pci_dev *pdev)
static int __init ata_init(void) static int __init ata_init(void)
{ {
ata_probe_timeout *= HZ;
ata_wq = create_workqueue("ata"); ata_wq = create_workqueue("ata");
if (!ata_wq) if (!ata_wq)
return -ENOMEM; return -ENOMEM;
......
...@@ -93,6 +93,38 @@ static int ata_ering_map(struct ata_ering *ering, ...@@ -93,6 +93,38 @@ static int ata_ering_map(struct ata_ering *ering,
return rc; return rc;
} }
static unsigned int ata_eh_dev_action(struct ata_device *dev)
{
struct ata_eh_context *ehc = &dev->ap->eh_context;
return ehc->i.action | ehc->i.dev_action[dev->devno];
}
static void ata_eh_clear_action(struct ata_device *dev,
struct ata_eh_info *ehi, unsigned int action)
{
int i;
if (!dev) {
ehi->action &= ~action;
for (i = 0; i < ATA_MAX_DEVICES; i++)
ehi->dev_action[i] &= ~action;
} else {
/* doesn't make sense for port-wide EH actions */
WARN_ON(!(action & ATA_EH_PERDEV_MASK));
/* break ehi->action into ehi->dev_action */
if (ehi->action & action) {
for (i = 0; i < ATA_MAX_DEVICES; i++)
ehi->dev_action[i] |= ehi->action & action;
ehi->action &= ~action;
}
/* turn off the specified per-dev action */
ehi->dev_action[dev->devno] &= ~action;
}
}
/** /**
* ata_scsi_timed_out - SCSI layer time out callback * ata_scsi_timed_out - SCSI layer time out callback
* @cmd: timed out SCSI command * @cmd: timed out SCSI command
...@@ -702,32 +734,11 @@ static void ata_eh_detach_dev(struct ata_device *dev) ...@@ -702,32 +734,11 @@ static void ata_eh_detach_dev(struct ata_device *dev)
ap->flags |= ATA_FLAG_SCSI_HOTPLUG; ap->flags |= ATA_FLAG_SCSI_HOTPLUG;
} }
spin_unlock_irqrestore(ap->lock, flags); /* clear per-dev EH actions */
} ata_eh_clear_action(dev, &ap->eh_info, ATA_EH_PERDEV_MASK);
ata_eh_clear_action(dev, &ap->eh_context.i, ATA_EH_PERDEV_MASK);
static void ata_eh_clear_action(struct ata_device *dev,
struct ata_eh_info *ehi, unsigned int action)
{
int i;
if (!dev) { spin_unlock_irqrestore(ap->lock, flags);
ehi->action &= ~action;
for (i = 0; i < ATA_MAX_DEVICES; i++)
ehi->dev_action[i] &= ~action;
} else {
/* doesn't make sense for port-wide EH actions */
WARN_ON(!(action & ATA_EH_PERDEV_MASK));
/* break ehi->action into ehi->dev_action */
if (ehi->action & action) {
for (i = 0; i < ATA_MAX_DEVICES; i++)
ehi->dev_action[i] |= ehi->action & action;
ehi->action &= ~action;
}
/* turn off the specified per-dev action */
ehi->dev_action[dev->devno] &= ~action;
}
} }
/** /**
...@@ -1592,7 +1603,7 @@ static int ata_eh_revalidate_and_attach(struct ata_port *ap, ...@@ -1592,7 +1603,7 @@ static int ata_eh_revalidate_and_attach(struct ata_port *ap,
unsigned int action; unsigned int action;
dev = &ap->device[i]; dev = &ap->device[i];
action = ehc->i.action | ehc->i.dev_action[dev->devno]; action = ata_eh_dev_action(dev);
if (action & ATA_EH_REVALIDATE && ata_dev_enabled(dev)) { if (action & ATA_EH_REVALIDATE && ata_dev_enabled(dev)) {
if (ata_port_offline(ap)) { if (ata_port_offline(ap)) {
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#define __LIBATA_H__ #define __LIBATA_H__
#define DRV_NAME "libata" #define DRV_NAME "libata"
#define DRV_VERSION "1.30" /* must be exactly four chars */ #define DRV_VERSION "2.00" /* must be exactly four chars */
struct ata_scsi_args { struct ata_scsi_args {
struct ata_device *dev; struct ata_device *dev;
...@@ -50,6 +50,7 @@ extern void ata_port_flush_task(struct ata_port *ap); ...@@ -50,6 +50,7 @@ extern void ata_port_flush_task(struct ata_port *ap);
extern unsigned ata_exec_internal(struct ata_device *dev, extern unsigned ata_exec_internal(struct ata_device *dev,
struct ata_taskfile *tf, const u8 *cdb, struct ata_taskfile *tf, const u8 *cdb,
int dma_dir, void *buf, unsigned int buflen); int dma_dir, void *buf, unsigned int buflen);
extern unsigned int ata_do_simple_cmd(struct ata_device *dev, u8 cmd);
extern int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, extern int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
int post_reset, u16 *id); int post_reset, u16 *id);
extern int ata_dev_configure(struct ata_device *dev, int print_info); extern int ata_dev_configure(struct ata_device *dev, int print_info);
...@@ -64,6 +65,7 @@ extern int ata_check_atapi_dma(struct ata_queued_cmd *qc); ...@@ -64,6 +65,7 @@ extern int ata_check_atapi_dma(struct ata_queued_cmd *qc);
extern void ata_dev_select(struct ata_port *ap, unsigned int device, extern void ata_dev_select(struct ata_port *ap, unsigned int device,
unsigned int wait, unsigned int can_sleep); unsigned int wait, unsigned int can_sleep);
extern void swap_buf_le16(u16 *buf, unsigned int buf_words); extern void swap_buf_le16(u16 *buf, unsigned int buf_words);
extern int ata_flush_cache(struct ata_device *dev);
extern void ata_dev_init(struct ata_device *dev); extern void ata_dev_init(struct ata_device *dev);
extern int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg); extern int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg);
extern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg); extern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg);
......
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "sata_nv" #define DRV_NAME "sata_nv"
#define DRV_VERSION "0.9" #define DRV_VERSION "2.0"
enum { enum {
NV_PORTS = 2, NV_PORTS = 2,
......
...@@ -46,12 +46,13 @@ ...@@ -46,12 +46,13 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "sata_sil" #define DRV_NAME "sata_sil"
#define DRV_VERSION "1.0" #define DRV_VERSION "2.0"
enum { enum {
/* /*
* host flags * host flags
*/ */
SIL_FLAG_NO_SATA_IRQ = (1 << 28),
SIL_FLAG_RERR_ON_DMA_ACT = (1 << 29), SIL_FLAG_RERR_ON_DMA_ACT = (1 << 29),
SIL_FLAG_MOD15WRITE = (1 << 30), SIL_FLAG_MOD15WRITE = (1 << 30),
...@@ -62,8 +63,9 @@ enum { ...@@ -62,8 +63,9 @@ enum {
* Controller IDs * Controller IDs
*/ */
sil_3112 = 0, sil_3112 = 0,
sil_3512 = 1, sil_3112_no_sata_irq = 1,
sil_3114 = 2, sil_3512 = 2,
sil_3114 = 3,
/* /*
* Register offsets * Register offsets
...@@ -123,8 +125,8 @@ static const struct pci_device_id sil_pci_tbl[] = { ...@@ -123,8 +125,8 @@ static const struct pci_device_id sil_pci_tbl[] = {
{ 0x1095, 0x3512, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3512 }, { 0x1095, 0x3512, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3512 },
{ 0x1095, 0x3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3114 }, { 0x1095, 0x3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3114 },
{ 0x1002, 0x436e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, { 0x1002, 0x436e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
{ 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, { 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_no_sata_irq },
{ 0x1002, 0x437a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, { 0x1002, 0x437a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_no_sata_irq },
{ } /* terminate list */ { } /* terminate list */
}; };
...@@ -217,6 +219,16 @@ static const struct ata_port_info sil_port_info[] = { ...@@ -217,6 +219,16 @@ static const struct ata_port_info sil_port_info[] = {
.udma_mask = 0x3f, /* udma0-5 */ .udma_mask = 0x3f, /* udma0-5 */
.port_ops = &sil_ops, .port_ops = &sil_ops,
}, },
/* sil_3112_no_sata_irq */
{
.sht = &sil_sht,
.host_flags = SIL_DFL_HOST_FLAGS | SIL_FLAG_MOD15WRITE |
SIL_FLAG_NO_SATA_IRQ,
.pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x3f, /* udma0-5 */
.port_ops = &sil_ops,
},
/* sil_3512 */ /* sil_3512 */
{ {
.sht = &sil_sht, .sht = &sil_sht,
...@@ -437,6 +449,10 @@ static irqreturn_t sil_interrupt(int irq, void *dev_instance, ...@@ -437,6 +449,10 @@ static irqreturn_t sil_interrupt(int irq, void *dev_instance,
if (unlikely(!ap || ap->flags & ATA_FLAG_DISABLED)) if (unlikely(!ap || ap->flags & ATA_FLAG_DISABLED))
continue; continue;
/* turn off SATA_IRQ if not supported */
if (ap->flags & SIL_FLAG_NO_SATA_IRQ)
bmdma2 &= ~SIL_DMA_SATA_IRQ;
if (bmdma2 == 0xffffffff || if (bmdma2 == 0xffffffff ||
!(bmdma2 & (SIL_DMA_COMPLETE | SIL_DMA_SATA_IRQ))) !(bmdma2 & (SIL_DMA_COMPLETE | SIL_DMA_SATA_IRQ)))
continue; continue;
...@@ -474,8 +490,9 @@ static void sil_thaw(struct ata_port *ap) ...@@ -474,8 +490,9 @@ static void sil_thaw(struct ata_port *ap)
ata_chk_status(ap); ata_chk_status(ap);
ata_bmdma_irq_clear(ap); ata_bmdma_irq_clear(ap);
/* turn on SATA IRQ */ /* turn on SATA IRQ if supported */
writel(SIL_SIEN_N, mmio_base + sil_port[ap->port_no].sien); if (!(ap->flags & SIL_FLAG_NO_SATA_IRQ))
writel(SIL_SIEN_N, mmio_base + sil_port[ap->port_no].sien);
/* turn on IRQ */ /* turn on IRQ */
tmp = readl(mmio_base + SIL_SYSCFG); tmp = readl(mmio_base + SIL_SYSCFG);
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#include <asm/io.h> #include <asm/io.h>
#define DRV_NAME "sata_sil24" #define DRV_NAME "sata_sil24"
#define DRV_VERSION "0.24" #define DRV_VERSION "0.3"
/* /*
* Port request block (PRB) 32 bytes * Port request block (PRB) 32 bytes
......
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
#endif /* CONFIG_PPC_OF */ #endif /* CONFIG_PPC_OF */
#define DRV_NAME "sata_svw" #define DRV_NAME "sata_svw"
#define DRV_VERSION "1.8" #define DRV_VERSION "2.0"
enum { enum {
/* Taskfile registers offsets */ /* Taskfile registers offsets */
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "sata_uli" #define DRV_NAME "sata_uli"
#define DRV_VERSION "0.6" #define DRV_VERSION "1.0"
enum { enum {
uli_5289 = 0, uli_5289 = 0,
......
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
#include <asm/io.h> #include <asm/io.h>
#define DRV_NAME "sata_via" #define DRV_NAME "sata_via"
#define DRV_VERSION "1.2" #define DRV_VERSION "2.0"
enum board_ids_enum { enum board_ids_enum {
vt6420, vt6420,
......
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "sata_vsc" #define DRV_NAME "sata_vsc"
#define DRV_VERSION "1.2" #define DRV_VERSION "2.0"
enum { enum {
/* Interrupt register offsets (from chip base address) */ /* Interrupt register offsets (from chip base address) */
...@@ -443,16 +443,12 @@ err_out: ...@@ -443,16 +443,12 @@ err_out:
} }
/*
* Intel 31244 is supposed to be identical.
* Compatibility is untested as of yet.
*/
static const struct pci_device_id vsc_sata_pci_tbl[] = { static const struct pci_device_id vsc_sata_pci_tbl[] = {
{ PCI_VENDOR_ID_VITESSE, PCI_DEVICE_ID_VITESSE_VSC7174, { PCI_VENDOR_ID_VITESSE, 0x7174,
PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 }, PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 },
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_GD31244, { PCI_VENDOR_ID_INTEL, 0x3200,
PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 }, PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 },
{ } { } /* terminate list */
}; };
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <asm/scatterlist.h>
#include <asm/io.h> #include <asm/io.h>
#include <linux/ata.h> #include <linux/ata.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
...@@ -887,6 +888,9 @@ static inline unsigned int ata_tag_internal(unsigned int tag) ...@@ -887,6 +888,9 @@ static inline unsigned int ata_tag_internal(unsigned int tag)
return tag == ATA_MAX_QUEUE - 1; return tag == ATA_MAX_QUEUE - 1;
} }
/*
* device helpers
*/
static inline unsigned int ata_class_enabled(unsigned int class) static inline unsigned int ata_class_enabled(unsigned int class)
{ {
return class == ATA_DEV_ATA || class == ATA_DEV_ATAPI; return class == ATA_DEV_ATA || class == ATA_DEV_ATAPI;
...@@ -917,6 +921,17 @@ static inline unsigned int ata_dev_absent(const struct ata_device *dev) ...@@ -917,6 +921,17 @@ static inline unsigned int ata_dev_absent(const struct ata_device *dev)
return ata_class_absent(dev->class); return ata_class_absent(dev->class);
} }
/*
* port helpers
*/
static inline int ata_port_max_devices(const struct ata_port *ap)
{
if (ap->flags & ATA_FLAG_SLAVE_POSS)
return 2;
return 1;
}
static inline u8 ata_chk_status(struct ata_port *ap) static inline u8 ata_chk_status(struct ata_port *ap)
{ {
return ap->ops->check_status(ap); return ap->ops->check_status(ap);
......
...@@ -1202,6 +1202,7 @@ ...@@ -1202,6 +1202,7 @@
#define PCI_DEVICE_ID_NVIDIA_NVENET_19 0x03EF #define PCI_DEVICE_ID_NVIDIA_NVENET_19 0x03EF
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2 0x03F6 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2 0x03F6
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3 0x03F7 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3 0x03F7
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE 0x0448
#define PCI_DEVICE_ID_NVIDIA_NVENET_20 0x0450 #define PCI_DEVICE_ID_NVIDIA_NVENET_20 0x0450
#define PCI_DEVICE_ID_NVIDIA_NVENET_21 0x0451 #define PCI_DEVICE_ID_NVIDIA_NVENET_21 0x0451
#define PCI_DEVICE_ID_NVIDIA_NVENET_22 0x0452 #define PCI_DEVICE_ID_NVIDIA_NVENET_22 0x0452
...@@ -2170,7 +2171,6 @@ ...@@ -2170,7 +2171,6 @@
#define PCI_DEVICE_ID_INTEL_ICH8_4 0x2815 #define PCI_DEVICE_ID_INTEL_ICH8_4 0x2815
#define PCI_DEVICE_ID_INTEL_ICH8_5 0x283e #define PCI_DEVICE_ID_INTEL_ICH8_5 0x283e
#define PCI_DEVICE_ID_INTEL_ICH8_6 0x2850 #define PCI_DEVICE_ID_INTEL_ICH8_6 0x2850
#define PCI_DEVICE_ID_INTEL_GD31244 0x3200
#define PCI_DEVICE_ID_INTEL_82855PM_HB 0x3340 #define PCI_DEVICE_ID_INTEL_82855PM_HB 0x3340
#define PCI_DEVICE_ID_INTEL_82830_HB 0x3575 #define PCI_DEVICE_ID_INTEL_82830_HB 0x3575
#define PCI_DEVICE_ID_INTEL_82830_CGC 0x3577 #define PCI_DEVICE_ID_INTEL_82830_CGC 0x3577
......
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