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.
|
||||
|
||||
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
|
||||
tristate "OCTEON Boot Bus Compact Flash support"
|
||||
depends on CPU_CAVIUM_OCTEON
|
||||
|
@ -366,7 +356,7 @@ config PATA_CS5535
|
|||
|
||||
config PATA_CS5536
|
||||
tristate "CS5536 PATA support"
|
||||
depends on PCI && X86 && !X86_64
|
||||
depends on PCI
|
||||
help
|
||||
This option enables support for the AMD CS5536
|
||||
companion chip used with the Geode LX processor family.
|
||||
|
@ -491,6 +481,16 @@ config PATA_MARVELL
|
|||
|
||||
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
|
||||
tristate "NETCELL Revolution RAID support"
|
||||
depends on PCI
|
||||
|
|
|
@ -11,7 +11,6 @@ obj-$(CONFIG_SATA_DWC) += sata_dwc_460ex.o
|
|||
|
||||
# SFF w/ custom DMA
|
||||
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_SATA_QSTOR) += sata_qstor.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_MACIO) += pata_macio.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_NINJA32) += pata_ninja32.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;
|
||||
|
||||
if (ata_tag_internal(qc->tag))
|
||||
return;
|
||||
|
||||
if (ata_is_nodata(qc->tf.protocol))
|
||||
return;
|
||||
|
||||
|
@ -4858,14 +4855,23 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
|
|||
if (unlikely(qc->err_mask))
|
||||
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);
|
||||
__ata_qc_complete(qc);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ata_tag_internal(qc->tag))
|
||||
ata_qc_schedule_eh(qc);
|
||||
else
|
||||
__ata_qc_complete(qc);
|
||||
/*
|
||||
* Non-internal qc has failed. Fill the result TF and
|
||||
* summon EH.
|
||||
*/
|
||||
if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) {
|
||||
fill_result_tf(qc);
|
||||
ata_qc_schedule_eh(qc);
|
||||
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_eh_context *ehc = &link->eh_context;
|
||||
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 err_mask;
|
||||
int rc;
|
||||
|
@ -3338,6 +3339,14 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
|||
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 */
|
||||
ata_for_each_dev(dev, link, ENABLED) {
|
||||
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;
|
||||
|
||||
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 (!dev || ehc->tries[dev->devno] <= 2) {
|
||||
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))
|
||||
return ata_sff_idle_irq(ap);
|
||||
break;
|
||||
case HSM_ST:
|
||||
case HSM_ST_LAST:
|
||||
break;
|
||||
default:
|
||||
case HSM_ST_IDLE:
|
||||
return ata_sff_idle_irq(ap);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* check main status, clearing INTRQ if needed */
|
||||
|
|
|
@ -37,10 +37,20 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/libata.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
#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_VERSION "0.0.7"
|
||||
#define DRV_VERSION "0.0.8"
|
||||
|
||||
enum {
|
||||
CFG = 0,
|
||||
|
@ -75,8 +85,6 @@ enum {
|
|||
IDE_ETC_NODMA = 0x03,
|
||||
};
|
||||
|
||||
static int use_msr;
|
||||
|
||||
static const u32 msr_reg[4] = {
|
||||
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)
|
||||
{
|
||||
if (unlikely(use_msr)) {
|
||||
u32 dummy;
|
||||
u32 dummy __maybe_unused;
|
||||
|
||||
rdmsr(msr_reg[reg], *val, dummy);
|
||||
return 0;
|
||||
|
@ -294,8 +302,6 @@ MODULE_DESCRIPTION("low-level driver for the CS5536 IDE controller");
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_DEVICE_TABLE(pci, cs5536);
|
||||
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_exit(cs5536_exit);
|
||||
|
|
Loading…
Reference in a new issue