Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 94f8c66e authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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

parents da1f136c d0bd9929
Loading
Loading
Loading
Loading
+21 −31
Original line number Original line Diff line number Diff line
@@ -189,7 +189,6 @@ static void ahci_irq_clear(struct ata_port *ap);
static void ahci_eng_timeout(struct ata_port *ap);
static void ahci_eng_timeout(struct ata_port *ap);
static int ahci_port_start(struct ata_port *ap);
static int ahci_port_start(struct ata_port *ap);
static void ahci_port_stop(struct ata_port *ap);
static void ahci_port_stop(struct ata_port *ap);
static void ahci_host_stop(struct ata_host_set *host_set);
static void ahci_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
static void ahci_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
static void ahci_qc_prep(struct ata_queued_cmd *qc);
static void ahci_qc_prep(struct ata_queued_cmd *qc);
static u8 ahci_check_status(struct ata_port *ap);
static u8 ahci_check_status(struct ata_port *ap);
@@ -242,7 +241,6 @@ static struct ata_port_operations ahci_ops = {


	.port_start		= ahci_port_start,
	.port_start		= ahci_port_start,
	.port_stop		= ahci_port_stop,
	.port_stop		= ahci_port_stop,
	.host_stop		= ahci_host_stop,
};
};


static struct ata_port_info ahci_port_info[] = {
static struct ata_port_info ahci_port_info[] = {
@@ -296,17 +294,9 @@ static inline unsigned long ahci_port_base_ul (unsigned long base, unsigned int
	return base + 0x100 + (port * 0x80);
	return base + 0x100 + (port * 0x80);
}
}


static inline void *ahci_port_base (void *base, unsigned int port)
static inline void __iomem *ahci_port_base (void __iomem *base, unsigned int port)
{
{
	return (void *) ahci_port_base_ul((unsigned long)base, port);
	return (void __iomem *) ahci_port_base_ul((unsigned long)base, port);
}

static void ahci_host_stop(struct ata_host_set *host_set)
{
	struct ahci_host_priv *hpriv = host_set->private_data;
	kfree(hpriv);

	ata_host_stop(host_set);
}
}


static int ahci_port_start(struct ata_port *ap)
static int ahci_port_start(struct ata_port *ap)
@@ -314,8 +304,9 @@ static int ahci_port_start(struct ata_port *ap)
	struct device *dev = ap->host_set->dev;
	struct device *dev = ap->host_set->dev;
	struct ahci_host_priv *hpriv = ap->host_set->private_data;
	struct ahci_host_priv *hpriv = ap->host_set->private_data;
	struct ahci_port_priv *pp;
	struct ahci_port_priv *pp;
	void *mem, *mmio = ap->host_set->mmio_base;
	void __iomem *mmio = ap->host_set->mmio_base;
	void *port_mmio = ahci_port_base(mmio, ap->port_no);
	void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
	void *mem;
	dma_addr_t mem_dma;
	dma_addr_t mem_dma;


	pp = kmalloc(sizeof(*pp), GFP_KERNEL);
	pp = kmalloc(sizeof(*pp), GFP_KERNEL);
@@ -383,8 +374,8 @@ static void ahci_port_stop(struct ata_port *ap)
{
{
	struct device *dev = ap->host_set->dev;
	struct device *dev = ap->host_set->dev;
	struct ahci_port_priv *pp = ap->private_data;
	struct ahci_port_priv *pp = ap->private_data;
	void *mmio = ap->host_set->mmio_base;
	void __iomem *mmio = ap->host_set->mmio_base;
	void *port_mmio = ahci_port_base(mmio, ap->port_no);
	void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
	u32 tmp;
	u32 tmp;


	tmp = readl(port_mmio + PORT_CMD);
	tmp = readl(port_mmio + PORT_CMD);
@@ -546,8 +537,8 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc)


static void ahci_intr_error(struct ata_port *ap, u32 irq_stat)
static void ahci_intr_error(struct ata_port *ap, u32 irq_stat)
{
{
	void *mmio = ap->host_set->mmio_base;
	void __iomem *mmio = ap->host_set->mmio_base;
	void *port_mmio = ahci_port_base(mmio, ap->port_no);
	void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
	u32 tmp;
	u32 tmp;
	int work;
	int work;


@@ -595,8 +586,8 @@ static void ahci_intr_error(struct ata_port *ap, u32 irq_stat)
static void ahci_eng_timeout(struct ata_port *ap)
static void ahci_eng_timeout(struct ata_port *ap)
{
{
	struct ata_host_set *host_set = ap->host_set;
	struct ata_host_set *host_set = ap->host_set;
	void *mmio = host_set->mmio_base;
	void __iomem *mmio = host_set->mmio_base;
	void *port_mmio = ahci_port_base(mmio, ap->port_no);
	void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
	struct ata_queued_cmd *qc;
	struct ata_queued_cmd *qc;
	unsigned long flags;
	unsigned long flags;


@@ -626,8 +617,8 @@ static void ahci_eng_timeout(struct ata_port *ap)


static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
{
{
	void *mmio = ap->host_set->mmio_base;
	void __iomem *mmio = ap->host_set->mmio_base;
	void *port_mmio = ahci_port_base(mmio, ap->port_no);
	void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
	u32 status, serr, ci;
	u32 status, serr, ci;


	serr = readl(port_mmio + PORT_SCR_ERR);
	serr = readl(port_mmio + PORT_SCR_ERR);
@@ -663,7 +654,7 @@ static irqreturn_t ahci_interrupt (int irq, void *dev_instance, struct pt_regs *
	struct ata_host_set *host_set = dev_instance;
	struct ata_host_set *host_set = dev_instance;
	struct ahci_host_priv *hpriv;
	struct ahci_host_priv *hpriv;
	unsigned int i, handled = 0;
	unsigned int i, handled = 0;
	void *mmio;
	void __iomem *mmio;
	u32 irq_stat, irq_ack = 0;
	u32 irq_stat, irq_ack = 0;


	VPRINTK("ENTER\n");
	VPRINTK("ENTER\n");
@@ -709,7 +700,7 @@ static irqreturn_t ahci_interrupt (int irq, void *dev_instance, struct pt_regs *
static int ahci_qc_issue(struct ata_queued_cmd *qc)
static int ahci_qc_issue(struct ata_queued_cmd *qc)
{
{
	struct ata_port *ap = qc->ap;
	struct ata_port *ap = qc->ap;
	void *port_mmio = (void *) ap->ioaddr.cmd_addr;
	void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr;


	writel(1, port_mmio + PORT_CMD_ISSUE);
	writel(1, port_mmio + PORT_CMD_ISSUE);
	readl(port_mmio + PORT_CMD_ISSUE);	/* flush */
	readl(port_mmio + PORT_CMD_ISSUE);	/* flush */
@@ -894,7 +885,7 @@ static void ahci_print_info(struct ata_probe_ent *probe_ent)
{
{
	struct ahci_host_priv *hpriv = probe_ent->private_data;
	struct ahci_host_priv *hpriv = probe_ent->private_data;
	struct pci_dev *pdev = to_pci_dev(probe_ent->dev);
	struct pci_dev *pdev = to_pci_dev(probe_ent->dev);
	void *mmio = probe_ent->mmio_base;
	void __iomem *mmio = probe_ent->mmio_base;
	u32 vers, cap, impl, speed;
	u32 vers, cap, impl, speed;
	const char *speed_s;
	const char *speed_s;
	u16 cc;
	u16 cc;
@@ -967,7 +958,7 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
	struct ata_probe_ent *probe_ent = NULL;
	struct ata_probe_ent *probe_ent = NULL;
	struct ahci_host_priv *hpriv;
	struct ahci_host_priv *hpriv;
	unsigned long base;
	unsigned long base;
	void *mmio_base;
	void __iomem *mmio_base;
	unsigned int board_idx = (unsigned int) ent->driver_data;
	unsigned int board_idx = (unsigned int) ent->driver_data;
	int have_msi, pci_dev_busy = 0;
	int have_msi, pci_dev_busy = 0;
	int rc;
	int rc;
@@ -1004,8 +995,7 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
	probe_ent->dev = pci_dev_to_dev(pdev);
	probe_ent->dev = pci_dev_to_dev(pdev);
	INIT_LIST_HEAD(&probe_ent->node);
	INIT_LIST_HEAD(&probe_ent->node);


	mmio_base = ioremap(pci_resource_start(pdev, AHCI_PCI_BAR),
	mmio_base = pci_iomap(pdev, AHCI_PCI_BAR, 0);
		            pci_resource_len(pdev, AHCI_PCI_BAR));
	if (mmio_base == NULL) {
	if (mmio_base == NULL) {
		rc = -ENOMEM;
		rc = -ENOMEM;
		goto err_out_free_ent;
		goto err_out_free_ent;
@@ -1049,7 +1039,7 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
err_out_hpriv:
err_out_hpriv:
	kfree(hpriv);
	kfree(hpriv);
err_out_iounmap:
err_out_iounmap:
	iounmap(mmio_base);
	pci_iounmap(pdev, mmio_base);
err_out_free_ent:
err_out_free_ent:
	kfree(probe_ent);
	kfree(probe_ent);
err_out_msi:
err_out_msi:
@@ -1089,7 +1079,8 @@ static void ahci_remove_one (struct pci_dev *pdev)
		scsi_host_put(ap->host);
		scsi_host_put(ap->host);
	}
	}


	host_set->ops->host_stop(host_set);
	kfree(hpriv);
	pci_iounmap(pdev, host_set->mmio_base);
	kfree(host_set);
	kfree(host_set);


	if (have_msi)
	if (have_msi)
@@ -1106,7 +1097,6 @@ static int __init ahci_init(void)
	return pci_module_init(&ahci_pci_driver);
	return pci_module_init(&ahci_pci_driver);
}
}



static void __exit ahci_exit(void)
static void __exit ahci_exit(void)
{
{
	pci_unregister_driver(&ahci_pci_driver);
	pci_unregister_driver(&ahci_pci_driver);
+5 −6
Original line number Original line Diff line number Diff line
@@ -583,8 +583,7 @@ static void pci_enable_intx(struct pci_dev *pdev)
#define AHCI_ENABLE (1 << 31)
#define AHCI_ENABLE (1 << 31)
static int piix_disable_ahci(struct pci_dev *pdev)
static int piix_disable_ahci(struct pci_dev *pdev)
{
{
	void *mmio;
	void __iomem *mmio;
	unsigned long addr;
	u32 tmp;
	u32 tmp;
	int rc = 0;
	int rc = 0;


@@ -592,11 +591,11 @@ static int piix_disable_ahci(struct pci_dev *pdev)
	 * works because this device is usually set up by BIOS.
	 * works because this device is usually set up by BIOS.
	 */
	 */


	addr = pci_resource_start(pdev, AHCI_PCI_BAR);
	if (!pci_resource_start(pdev, AHCI_PCI_BAR) ||
	if (!addr || !pci_resource_len(pdev, AHCI_PCI_BAR))
	    !pci_resource_len(pdev, AHCI_PCI_BAR))
		return 0;
		return 0;


	mmio = ioremap(addr, 64);
	mmio = pci_iomap(pdev, AHCI_PCI_BAR, 64);
	if (!mmio)
	if (!mmio)
		return -ENOMEM;
		return -ENOMEM;


@@ -610,7 +609,7 @@ static int piix_disable_ahci(struct pci_dev *pdev)
			rc = -EIO;
			rc = -EIO;
	}
	}


	iounmap(mmio);
	pci_iounmap(pdev, mmio);
	return rc;
	return rc;
}
}


+14 −1
Original line number Original line Diff line number Diff line
@@ -75,6 +75,10 @@ static void __ata_qc_complete(struct ata_queued_cmd *qc);
static unsigned int ata_unique_id = 1;
static unsigned int ata_unique_id = 1;
static struct workqueue_struct *ata_wq;
static struct workqueue_struct *ata_wq;


int atapi_enabled = 0;
module_param(atapi_enabled, int, 0444);
MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)");

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");
@@ -4200,6 +4204,15 @@ ata_probe_ent_alloc(struct device *dev, struct ata_port_info *port)






#ifdef CONFIG_PCI

void ata_pci_host_stop (struct ata_host_set *host_set)
{
	struct pci_dev *pdev = to_pci_dev(host_set->dev);

	pci_iounmap(pdev, host_set->mmio_base);
}

/**
/**
 *	ata_pci_init_native_mode - Initialize native-mode driver
 *	ata_pci_init_native_mode - Initialize native-mode driver
 *	@pdev:  pci device to be initialized
 *	@pdev:  pci device to be initialized
@@ -4212,7 +4225,6 @@ ata_probe_ent_alloc(struct device *dev, struct ata_port_info *port)
 *	ata_probe_ent structure should then be freed with kfree().
 *	ata_probe_ent structure should then be freed with kfree().
 */
 */


#ifdef CONFIG_PCI
struct ata_probe_ent *
struct ata_probe_ent *
ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port)
ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port)
{
{
@@ -4595,6 +4607,7 @@ EXPORT_SYMBOL_GPL(ata_scsi_simulate);


#ifdef CONFIG_PCI
#ifdef CONFIG_PCI
EXPORT_SYMBOL_GPL(pci_test_config_bits);
EXPORT_SYMBOL_GPL(pci_test_config_bits);
EXPORT_SYMBOL_GPL(ata_pci_host_stop);
EXPORT_SYMBOL_GPL(ata_pci_init_native_mode);
EXPORT_SYMBOL_GPL(ata_pci_init_native_mode);
EXPORT_SYMBOL_GPL(ata_pci_init_one);
EXPORT_SYMBOL_GPL(ata_pci_init_one);
EXPORT_SYMBOL_GPL(ata_pci_remove_one);
EXPORT_SYMBOL_GPL(ata_pci_remove_one);
+4 −4
Original line number Original line Diff line number Diff line
@@ -1470,10 +1470,10 @@ ata_scsi_find_dev(struct ata_port *ap, struct scsi_device *scsidev)
	if (unlikely(!ata_dev_present(dev)))
	if (unlikely(!ata_dev_present(dev)))
		return NULL;
		return NULL;


#ifndef ATA_ENABLE_ATAPI
	if (!atapi_enabled) {
		if (unlikely(dev->class == ATA_DEV_ATAPI))
		if (unlikely(dev->class == ATA_DEV_ATAPI))
			return NULL;
			return NULL;
#endif
	}


	return dev;
	return dev;
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -38,6 +38,7 @@ struct ata_scsi_args {
};
};


/* libata-core.c */
/* libata-core.c */
extern int atapi_enabled;
extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
				      struct ata_device *dev);
				      struct ata_device *dev);
extern void ata_qc_free(struct ata_queued_cmd *qc);
extern void ata_qc_free(struct ata_queued_cmd *qc);
Loading