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: issue DIPM enable commands with LPM state updated libata: no special completion processing for EH commands pata_mpc52xx: driver needs BMDMA pata_cs5536: Add support for non-X86_32 platforms libata-sff: fix HSM_ST_ERR handling in __ata_sff_port_intr()
This commit is contained in:
commit
dfe80f6329
6 changed files with 56 additions and 34 deletions
|
@ -128,16 +128,6 @@ config PDC_ADMA
|
||||||
|
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
config PATA_MPC52xx
|
|
||||||
tristate "Freescale MPC52xx SoC internal IDE"
|
|
||||||
depends on PPC_MPC52xx && PPC_BESTCOMM
|
|
||||||
select PPC_BESTCOMM_ATA
|
|
||||||
help
|
|
||||||
This option enables support for integrated IDE controller
|
|
||||||
of the Freescale MPC52xx SoC.
|
|
||||||
|
|
||||||
If unsure, say N.
|
|
||||||
|
|
||||||
config PATA_OCTEON_CF
|
config PATA_OCTEON_CF
|
||||||
tristate "OCTEON Boot Bus Compact Flash support"
|
tristate "OCTEON Boot Bus Compact Flash support"
|
||||||
depends on CPU_CAVIUM_OCTEON
|
depends on CPU_CAVIUM_OCTEON
|
||||||
|
@ -366,7 +356,7 @@ config PATA_CS5535
|
||||||
|
|
||||||
config PATA_CS5536
|
config PATA_CS5536
|
||||||
tristate "CS5536 PATA support"
|
tristate "CS5536 PATA support"
|
||||||
depends on PCI && X86 && !X86_64
|
depends on PCI
|
||||||
help
|
help
|
||||||
This option enables support for the AMD CS5536
|
This option enables support for the AMD CS5536
|
||||||
companion chip used with the Geode LX processor family.
|
companion chip used with the Geode LX processor family.
|
||||||
|
@ -491,6 +481,16 @@ config PATA_MARVELL
|
||||||
|
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
|
config PATA_MPC52xx
|
||||||
|
tristate "Freescale MPC52xx SoC internal IDE"
|
||||||
|
depends on PPC_MPC52xx && PPC_BESTCOMM
|
||||||
|
select PPC_BESTCOMM_ATA
|
||||||
|
help
|
||||||
|
This option enables support for integrated IDE controller
|
||||||
|
of the Freescale MPC52xx SoC.
|
||||||
|
|
||||||
|
If unsure, say N.
|
||||||
|
|
||||||
config PATA_NETCELL
|
config PATA_NETCELL
|
||||||
tristate "NETCELL Revolution RAID support"
|
tristate "NETCELL Revolution RAID support"
|
||||||
depends on PCI
|
depends on PCI
|
||||||
|
|
|
@ -11,7 +11,6 @@ obj-$(CONFIG_SATA_DWC) += sata_dwc_460ex.o
|
||||||
|
|
||||||
# SFF w/ custom DMA
|
# SFF w/ custom DMA
|
||||||
obj-$(CONFIG_PDC_ADMA) += pdc_adma.o
|
obj-$(CONFIG_PDC_ADMA) += pdc_adma.o
|
||||||
obj-$(CONFIG_PATA_MPC52xx) += pata_mpc52xx.o
|
|
||||||
obj-$(CONFIG_PATA_OCTEON_CF) += pata_octeon_cf.o
|
obj-$(CONFIG_PATA_OCTEON_CF) += pata_octeon_cf.o
|
||||||
obj-$(CONFIG_SATA_QSTOR) += sata_qstor.o
|
obj-$(CONFIG_SATA_QSTOR) += sata_qstor.o
|
||||||
obj-$(CONFIG_SATA_SX4) += sata_sx4.o
|
obj-$(CONFIG_SATA_SX4) += sata_sx4.o
|
||||||
|
@ -52,6 +51,7 @@ obj-$(CONFIG_PATA_IT821X) += pata_it821x.o
|
||||||
obj-$(CONFIG_PATA_JMICRON) += pata_jmicron.o
|
obj-$(CONFIG_PATA_JMICRON) += pata_jmicron.o
|
||||||
obj-$(CONFIG_PATA_MACIO) += pata_macio.o
|
obj-$(CONFIG_PATA_MACIO) += pata_macio.o
|
||||||
obj-$(CONFIG_PATA_MARVELL) += pata_marvell.o
|
obj-$(CONFIG_PATA_MARVELL) += pata_marvell.o
|
||||||
|
obj-$(CONFIG_PATA_MPC52xx) += pata_mpc52xx.o
|
||||||
obj-$(CONFIG_PATA_NETCELL) += pata_netcell.o
|
obj-$(CONFIG_PATA_NETCELL) += pata_netcell.o
|
||||||
obj-$(CONFIG_PATA_NINJA32) += pata_ninja32.o
|
obj-$(CONFIG_PATA_NINJA32) += pata_ninja32.o
|
||||||
obj-$(CONFIG_PATA_NS87415) += pata_ns87415.o
|
obj-$(CONFIG_PATA_NS87415) += pata_ns87415.o
|
||||||
|
|
|
@ -4807,9 +4807,6 @@ static void ata_verify_xfer(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_device *dev = qc->dev;
|
struct ata_device *dev = qc->dev;
|
||||||
|
|
||||||
if (ata_tag_internal(qc->tag))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (ata_is_nodata(qc->tf.protocol))
|
if (ata_is_nodata(qc->tf.protocol))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -4858,14 +4855,23 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
|
||||||
if (unlikely(qc->err_mask))
|
if (unlikely(qc->err_mask))
|
||||||
qc->flags |= ATA_QCFLAG_FAILED;
|
qc->flags |= ATA_QCFLAG_FAILED;
|
||||||
|
|
||||||
if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) {
|
/*
|
||||||
/* always fill result TF for failed qc */
|
* Finish internal commands without any further processing
|
||||||
|
* and always with the result TF filled.
|
||||||
|
*/
|
||||||
|
if (unlikely(ata_tag_internal(qc->tag))) {
|
||||||
fill_result_tf(qc);
|
fill_result_tf(qc);
|
||||||
|
__ata_qc_complete(qc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!ata_tag_internal(qc->tag))
|
/*
|
||||||
ata_qc_schedule_eh(qc);
|
* Non-internal qc has failed. Fill the result TF and
|
||||||
else
|
* summon EH.
|
||||||
__ata_qc_complete(qc);
|
*/
|
||||||
|
if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) {
|
||||||
|
fill_result_tf(qc);
|
||||||
|
ata_qc_schedule_eh(qc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3275,6 +3275,7 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
||||||
struct ata_port *ap = ata_is_host_link(link) ? link->ap : NULL;
|
struct ata_port *ap = ata_is_host_link(link) ? link->ap : NULL;
|
||||||
struct ata_eh_context *ehc = &link->eh_context;
|
struct ata_eh_context *ehc = &link->eh_context;
|
||||||
struct ata_device *dev, *link_dev = NULL, *lpm_dev = NULL;
|
struct ata_device *dev, *link_dev = NULL, *lpm_dev = NULL;
|
||||||
|
enum ata_lpm_policy old_policy = link->lpm_policy;
|
||||||
unsigned int hints = ATA_LPM_EMPTY | ATA_LPM_HIPM;
|
unsigned int hints = ATA_LPM_EMPTY | ATA_LPM_HIPM;
|
||||||
unsigned int err_mask;
|
unsigned int err_mask;
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -3338,6 +3339,14 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Low level driver acked the transition. Issue DIPM command
|
||||||
|
* with the new policy set.
|
||||||
|
*/
|
||||||
|
link->lpm_policy = policy;
|
||||||
|
if (ap && ap->slave_link)
|
||||||
|
ap->slave_link->lpm_policy = policy;
|
||||||
|
|
||||||
/* host config updated, enable DIPM if transitioning to MIN_POWER */
|
/* host config updated, enable DIPM if transitioning to MIN_POWER */
|
||||||
ata_for_each_dev(dev, link, ENABLED) {
|
ata_for_each_dev(dev, link, ENABLED) {
|
||||||
if (policy == ATA_LPM_MIN_POWER && ata_id_has_dipm(dev->id)) {
|
if (policy == ATA_LPM_MIN_POWER && ata_id_has_dipm(dev->id)) {
|
||||||
|
@ -3353,12 +3362,14 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
link->lpm_policy = policy;
|
|
||||||
if (ap && ap->slave_link)
|
|
||||||
ap->slave_link->lpm_policy = policy;
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
/* restore the old policy */
|
||||||
|
link->lpm_policy = old_policy;
|
||||||
|
if (ap && ap->slave_link)
|
||||||
|
ap->slave_link->lpm_policy = old_policy;
|
||||||
|
|
||||||
/* if no device or only one more chance is left, disable LPM */
|
/* if no device or only one more chance is left, disable LPM */
|
||||||
if (!dev || ehc->tries[dev->devno] <= 2) {
|
if (!dev || ehc->tries[dev->devno] <= 2) {
|
||||||
ata_link_printk(link, KERN_WARNING,
|
ata_link_printk(link, KERN_WARNING,
|
||||||
|
|
|
@ -1532,11 +1532,10 @@ static unsigned int __ata_sff_port_intr(struct ata_port *ap,
|
||||||
if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR))
|
if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR))
|
||||||
return ata_sff_idle_irq(ap);
|
return ata_sff_idle_irq(ap);
|
||||||
break;
|
break;
|
||||||
case HSM_ST:
|
case HSM_ST_IDLE:
|
||||||
case HSM_ST_LAST:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return ata_sff_idle_irq(ap);
|
return ata_sff_idle_irq(ap);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check main status, clearing INTRQ if needed */
|
/* check main status, clearing INTRQ if needed */
|
||||||
|
|
|
@ -37,10 +37,20 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/libata.h>
|
#include <linux/libata.h>
|
||||||
#include <scsi/scsi_host.h>
|
#include <scsi/scsi_host.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_32
|
||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
|
static int use_msr;
|
||||||
|
module_param_named(msr, use_msr, int, 0644);
|
||||||
|
MODULE_PARM_DESC(msr, "Force using MSR to configure IDE function (Default: 0)");
|
||||||
|
#else
|
||||||
|
#define rdmsr(x, y, z) do { } while (0)
|
||||||
|
#define wrmsr(x, y, z) do { } while (0)
|
||||||
|
#define use_msr 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DRV_NAME "pata_cs5536"
|
#define DRV_NAME "pata_cs5536"
|
||||||
#define DRV_VERSION "0.0.7"
|
#define DRV_VERSION "0.0.8"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CFG = 0,
|
CFG = 0,
|
||||||
|
@ -75,8 +85,6 @@ enum {
|
||||||
IDE_ETC_NODMA = 0x03,
|
IDE_ETC_NODMA = 0x03,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int use_msr;
|
|
||||||
|
|
||||||
static const u32 msr_reg[4] = {
|
static const u32 msr_reg[4] = {
|
||||||
MSR_IDE_CFG, MSR_IDE_DTC, MSR_IDE_CAST, MSR_IDE_ETC,
|
MSR_IDE_CFG, MSR_IDE_DTC, MSR_IDE_CAST, MSR_IDE_ETC,
|
||||||
};
|
};
|
||||||
|
@ -88,7 +96,7 @@ static const u8 pci_reg[4] = {
|
||||||
static inline int cs5536_read(struct pci_dev *pdev, int reg, u32 *val)
|
static inline int cs5536_read(struct pci_dev *pdev, int reg, u32 *val)
|
||||||
{
|
{
|
||||||
if (unlikely(use_msr)) {
|
if (unlikely(use_msr)) {
|
||||||
u32 dummy;
|
u32 dummy __maybe_unused;
|
||||||
|
|
||||||
rdmsr(msr_reg[reg], *val, dummy);
|
rdmsr(msr_reg[reg], *val, dummy);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -294,8 +302,6 @@ MODULE_DESCRIPTION("low-level driver for the CS5536 IDE controller");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_DEVICE_TABLE(pci, cs5536);
|
MODULE_DEVICE_TABLE(pci, cs5536);
|
||||||
MODULE_VERSION(DRV_VERSION);
|
MODULE_VERSION(DRV_VERSION);
|
||||||
module_param_named(msr, use_msr, int, 0644);
|
|
||||||
MODULE_PARM_DESC(msr, "Force using MSR to configure IDE function (Default: 0)");
|
|
||||||
|
|
||||||
module_init(cs5536_init);
|
module_init(cs5536_init);
|
||||||
module_exit(cs5536_exit);
|
module_exit(cs5536_exit);
|
||||||
|
|
Loading…
Add table
Reference in a new issue