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: ahci: RAID mode SATA patch for Intel Ibex Peak DeviceIDs pata_sil680: remove duplicate pcim_enable_device libata-sff: kill spurious WARN_ON() in ata_hsm_move() sata_nv: disable hardreset for generic ahci: disable PMP for marvell ahcis sata_mv: add RocketRaid 1720 PCI ID to driver ahci, pata_marvell: play nicely together
This commit is contained in:
commit
e228c1b51e
|
@ -448,8 +448,10 @@ config PATA_MARVELL
|
||||||
tristate "Marvell PATA support via legacy mode"
|
tristate "Marvell PATA support via legacy mode"
|
||||||
depends on PCI
|
depends on PCI
|
||||||
help
|
help
|
||||||
This option enables limited support for the Marvell 88SE6145 ATA
|
This option enables limited support for the Marvell 88SE61xx ATA
|
||||||
controller.
|
controllers. If you wish to use only the SATA ports then select
|
||||||
|
the AHCI driver alone. If you wish to the use the PATA port or
|
||||||
|
both SATA and PATA include this driver.
|
||||||
|
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
|
|
|
@ -420,7 +420,7 @@ static const struct ata_port_info ahci_port_info[] = {
|
||||||
/* board_ahci_mv */
|
/* board_ahci_mv */
|
||||||
{
|
{
|
||||||
AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_MSI |
|
AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_MSI |
|
||||||
AHCI_HFLAG_MV_PATA),
|
AHCI_HFLAG_MV_PATA | AHCI_HFLAG_NO_PMP),
|
||||||
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
||||||
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA,
|
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA,
|
||||||
.pio_mask = 0x1f, /* pio0-4 */
|
.pio_mask = 0x1f, /* pio0-4 */
|
||||||
|
@ -487,7 +487,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||||
{ PCI_VDEVICE(INTEL, 0x3a05), board_ahci }, /* ICH10 */
|
{ PCI_VDEVICE(INTEL, 0x3a05), board_ahci }, /* ICH10 */
|
||||||
{ PCI_VDEVICE(INTEL, 0x3a25), board_ahci }, /* ICH10 */
|
{ PCI_VDEVICE(INTEL, 0x3a25), board_ahci }, /* ICH10 */
|
||||||
{ PCI_VDEVICE(INTEL, 0x3b24), board_ahci }, /* PCH RAID */
|
{ PCI_VDEVICE(INTEL, 0x3b24), board_ahci }, /* PCH RAID */
|
||||||
|
{ PCI_VDEVICE(INTEL, 0x3b25), board_ahci }, /* PCH RAID */
|
||||||
{ PCI_VDEVICE(INTEL, 0x3b2b), board_ahci }, /* PCH RAID */
|
{ PCI_VDEVICE(INTEL, 0x3b2b), board_ahci }, /* PCH RAID */
|
||||||
|
{ PCI_VDEVICE(INTEL, 0x3b2c), board_ahci }, /* PCH RAID */
|
||||||
|
|
||||||
/* JMicron 360/1/3/5/6, match class to avoid IDE function */
|
/* JMicron 360/1/3/5/6, match class to avoid IDE function */
|
||||||
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
||||||
|
@ -610,6 +612,15 @@ module_param(ahci_em_messages, int, 0444);
|
||||||
MODULE_PARM_DESC(ahci_em_messages,
|
MODULE_PARM_DESC(ahci_em_messages,
|
||||||
"Set AHCI Enclosure Management Message type (0 = disabled, 1 = LED");
|
"Set AHCI Enclosure Management Message type (0 = disabled, 1 = LED");
|
||||||
|
|
||||||
|
#if defined(CONFIG_PATA_MARVELL) || defined(CONFIG_PATA_MARVELL_MODULE)
|
||||||
|
static int marvell_enable;
|
||||||
|
#else
|
||||||
|
static int marvell_enable = 1;
|
||||||
|
#endif
|
||||||
|
module_param(marvell_enable, int, 0644);
|
||||||
|
MODULE_PARM_DESC(marvell_enable, "Marvell SATA via AHCI (1 = enabled)");
|
||||||
|
|
||||||
|
|
||||||
static inline int ahci_nr_ports(u32 cap)
|
static inline int ahci_nr_ports(u32 cap)
|
||||||
{
|
{
|
||||||
return (cap & 0x1f) + 1;
|
return (cap & 0x1f) + 1;
|
||||||
|
@ -732,6 +743,8 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
|
||||||
"MV_AHCI HACK: port_map %x -> %x\n",
|
"MV_AHCI HACK: port_map %x -> %x\n",
|
||||||
port_map,
|
port_map,
|
||||||
port_map & mv);
|
port_map & mv);
|
||||||
|
dev_printk(KERN_ERR, &pdev->dev,
|
||||||
|
"Disabling your PATA port. Use the boot option 'ahci.marvell_enable=0' to avoid this.\n");
|
||||||
|
|
||||||
port_map &= mv;
|
port_map &= mv;
|
||||||
}
|
}
|
||||||
|
@ -2533,6 +2546,12 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
if (!printed_version++)
|
if (!printed_version++)
|
||||||
dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
|
dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
|
||||||
|
|
||||||
|
/* The AHCI driver can only drive the SATA ports, the PATA driver
|
||||||
|
can drive them all so if both drivers are selected make sure
|
||||||
|
AHCI stays out of the way */
|
||||||
|
if (pdev->vendor == PCI_VENDOR_ID_MARVELL && !marvell_enable)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
/* acquire resources */
|
/* acquire resources */
|
||||||
rc = pcim_enable_device(pdev);
|
rc = pcim_enable_device(pdev);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
|
|
@ -1315,11 +1315,6 @@ int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HSM_ST_ERR:
|
case HSM_ST_ERR:
|
||||||
/* make sure qc->err_mask is available to
|
|
||||||
* know what's wrong and recover
|
|
||||||
*/
|
|
||||||
WARN_ON(!(qc->err_mask & (AC_ERR_DEV | AC_ERR_HSM)));
|
|
||||||
|
|
||||||
ap->hsm_task_state = HSM_ST_IDLE;
|
ap->hsm_task_state = HSM_ST_IDLE;
|
||||||
|
|
||||||
/* complete taskfile transaction */
|
/* complete taskfile transaction */
|
||||||
|
|
|
@ -20,7 +20,42 @@
|
||||||
#include <linux/ata.h>
|
#include <linux/ata.h>
|
||||||
|
|
||||||
#define DRV_NAME "pata_marvell"
|
#define DRV_NAME "pata_marvell"
|
||||||
#define DRV_VERSION "0.1.4"
|
#define DRV_VERSION "0.1.6"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* marvell_pata_active - check if PATA is active
|
||||||
|
* @pdev: PCI device
|
||||||
|
*
|
||||||
|
* Returns 1 if the PATA port may be active. We know how to check this
|
||||||
|
* for the 6145 but not the other devices
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int marvell_pata_active(struct pci_dev *pdev)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u32 devices;
|
||||||
|
void __iomem *barp;
|
||||||
|
|
||||||
|
/* We don't yet know how to do this for other devices */
|
||||||
|
if (pdev->device != 0x6145)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
barp = pci_iomap(pdev, 5, 0x10);
|
||||||
|
if (barp == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
printk("BAR5:");
|
||||||
|
for(i = 0; i <= 0x0F; i++)
|
||||||
|
printk("%02X:%02X ", i, ioread8(barp + i));
|
||||||
|
printk("\n");
|
||||||
|
|
||||||
|
devices = ioread32(barp + 0x0C);
|
||||||
|
pci_iounmap(pdev, barp);
|
||||||
|
|
||||||
|
if (devices & 0x10)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* marvell_pre_reset - check for 40/80 pin
|
* marvell_pre_reset - check for 40/80 pin
|
||||||
|
@ -34,26 +69,10 @@ static int marvell_pre_reset(struct ata_link *link, unsigned long deadline)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = link->ap;
|
struct ata_port *ap = link->ap;
|
||||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||||
u32 devices;
|
|
||||||
void __iomem *barp;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Check if our port is enabled */
|
if (pdev->device == 0x6145 && ap->port_no == 0 &&
|
||||||
|
!marvell_pata_active(pdev)) /* PATA enable ? */
|
||||||
barp = pci_iomap(pdev, 5, 0x10);
|
return -ENOENT;
|
||||||
if (barp == NULL)
|
|
||||||
return -ENOMEM;
|
|
||||||
printk("BAR5:");
|
|
||||||
for(i = 0; i <= 0x0F; i++)
|
|
||||||
printk("%02X:%02X ", i, ioread8(barp + i));
|
|
||||||
printk("\n");
|
|
||||||
|
|
||||||
devices = ioread32(barp + 0x0C);
|
|
||||||
pci_iounmap(pdev, barp);
|
|
||||||
|
|
||||||
if ((pdev->device == 0x6145) && (ap->port_no == 0) &&
|
|
||||||
(!(devices & 0x10))) /* PATA enable ? */
|
|
||||||
return -ENOENT;
|
|
||||||
|
|
||||||
return ata_sff_prereset(link, deadline);
|
return ata_sff_prereset(link, deadline);
|
||||||
}
|
}
|
||||||
|
@ -128,6 +147,12 @@ static int marvell_init_one (struct pci_dev *pdev, const struct pci_device_id *i
|
||||||
if (pdev->device == 0x6101)
|
if (pdev->device == 0x6101)
|
||||||
ppi[1] = &ata_dummy_port_info;
|
ppi[1] = &ata_dummy_port_info;
|
||||||
|
|
||||||
|
#if defined(CONFIG_AHCI) || defined(CONFIG_AHCI_MODULE)
|
||||||
|
if (!marvell_pata_active(pdev)) {
|
||||||
|
printk(KERN_INFO DRV_NAME ": PATA port not active, deferring to AHCI driver.\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return ata_pci_sff_init_one(pdev, ppi, &marvell_sht, NULL);
|
return ata_pci_sff_init_one(pdev, ppi, &marvell_sht, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -322,9 +322,6 @@ static int __devinit sil680_init_one(struct pci_dev *pdev,
|
||||||
/* Try to acquire MMIO resources and fallback to PIO if
|
/* Try to acquire MMIO resources and fallback to PIO if
|
||||||
* that fails
|
* that fails
|
||||||
*/
|
*/
|
||||||
rc = pcim_enable_device(pdev);
|
|
||||||
if (rc)
|
|
||||||
return rc;
|
|
||||||
rc = pcim_iomap_regions(pdev, 1 << SIL680_MMIO_BAR, DRV_NAME);
|
rc = pcim_iomap_regions(pdev, 1 << SIL680_MMIO_BAR, DRV_NAME);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto use_ioports;
|
goto use_ioports;
|
||||||
|
|
|
@ -667,7 +667,8 @@ static const struct pci_device_id mv_pci_tbl[] = {
|
||||||
{ PCI_VDEVICE(MARVELL, 0x5041), chip_504x },
|
{ PCI_VDEVICE(MARVELL, 0x5041), chip_504x },
|
||||||
{ PCI_VDEVICE(MARVELL, 0x5080), chip_5080 },
|
{ PCI_VDEVICE(MARVELL, 0x5080), chip_5080 },
|
||||||
{ PCI_VDEVICE(MARVELL, 0x5081), chip_508x },
|
{ PCI_VDEVICE(MARVELL, 0x5081), chip_508x },
|
||||||
/* RocketRAID 1740/174x have different identifiers */
|
/* RocketRAID 1720/174x have different identifiers */
|
||||||
|
{ PCI_VDEVICE(TTI, 0x1720), chip_6042 },
|
||||||
{ PCI_VDEVICE(TTI, 0x1740), chip_508x },
|
{ PCI_VDEVICE(TTI, 0x1740), chip_508x },
|
||||||
{ PCI_VDEVICE(TTI, 0x1742), chip_508x },
|
{ PCI_VDEVICE(TTI, 0x1742), chip_508x },
|
||||||
|
|
||||||
|
|
|
@ -309,8 +309,6 @@ static void nv_nf2_freeze(struct ata_port *ap);
|
||||||
static void nv_nf2_thaw(struct ata_port *ap);
|
static void nv_nf2_thaw(struct ata_port *ap);
|
||||||
static void nv_ck804_freeze(struct ata_port *ap);
|
static void nv_ck804_freeze(struct ata_port *ap);
|
||||||
static void nv_ck804_thaw(struct ata_port *ap);
|
static void nv_ck804_thaw(struct ata_port *ap);
|
||||||
static int nv_hardreset(struct ata_link *link, unsigned int *class,
|
|
||||||
unsigned long deadline);
|
|
||||||
static int nv_adma_slave_config(struct scsi_device *sdev);
|
static int nv_adma_slave_config(struct scsi_device *sdev);
|
||||||
static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
||||||
static void nv_adma_qc_prep(struct ata_queued_cmd *qc);
|
static void nv_adma_qc_prep(struct ata_queued_cmd *qc);
|
||||||
|
@ -407,7 +405,7 @@ static struct scsi_host_template nv_swncq_sht = {
|
||||||
|
|
||||||
static struct ata_port_operations nv_generic_ops = {
|
static struct ata_port_operations nv_generic_ops = {
|
||||||
.inherits = &ata_bmdma_port_ops,
|
.inherits = &ata_bmdma_port_ops,
|
||||||
.hardreset = nv_hardreset,
|
.hardreset = ATA_OP_NULL,
|
||||||
.scr_read = nv_scr_read,
|
.scr_read = nv_scr_read,
|
||||||
.scr_write = nv_scr_write,
|
.scr_write = nv_scr_write,
|
||||||
};
|
};
|
||||||
|
@ -1588,21 +1586,6 @@ static void nv_mcp55_thaw(struct ata_port *ap)
|
||||||
ata_sff_thaw(ap);
|
ata_sff_thaw(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nv_hardreset(struct ata_link *link, unsigned int *class,
|
|
||||||
unsigned long deadline)
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
/* SATA hardreset fails to retrieve proper device signature on
|
|
||||||
* some controllers. Request follow up SRST. For more info,
|
|
||||||
* see http://bugzilla.kernel.org/show_bug.cgi?id=3352
|
|
||||||
*/
|
|
||||||
rc = sata_sff_hardreset(link, class, deadline);
|
|
||||||
if (rc)
|
|
||||||
return rc;
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void nv_adma_error_handler(struct ata_port *ap)
|
static void nv_adma_error_handler(struct ata_port *ap)
|
||||||
{
|
{
|
||||||
struct nv_adma_port_priv *pp = ap->private_data;
|
struct nv_adma_port_priv *pp = ap->private_data;
|
||||||
|
|
Loading…
Reference in New Issue