Skip to content

Commit 94dc07d

Browse files
committed
Merge tag 'ata-7.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux
Pull ata fixes from Damien Le Moal: - Interrupt initialization and handling fixes for the Designware ahci_dwc driver (Rosen) - Avoid possible infinite loop when scanning completion in the Designware ahci_dwc driver (Rosen) * tag 'ata-7.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux: ata: sata_dwc_460ex: fix infinite loop in NCQ tag completion bit-scanning ata: sata_dwc_460ex: fix clear_interrupt_bit() clearing all pending interrupts ata: sata_dwc_460ex: use platform_get_irq() ata: sata_dwc_460ex: enable SATA interrupts only after IRQ handler is registered
2 parents 7d6ca51 + c2130f6 commit 94dc07d

1 file changed

Lines changed: 12 additions & 26 deletions

File tree

drivers/ata/sata_dwc_460ex.c

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#include <linux/device.h>
2020
#include <linux/dmaengine.h>
2121
#include <linux/of.h>
22-
#include <linux/of_irq.h>
2322
#include <linux/platform_device.h>
2423
#include <linux/phy/phy.h>
2524
#include <linux/libata.h>
@@ -226,7 +225,6 @@ static int sata_dwc_dma_init_old(struct platform_device *pdev,
226225
struct sata_dwc_device *hsdev)
227226
{
228227
struct device *dev = &pdev->dev;
229-
struct device_node *np = dev->of_node;
230228

231229
hsdev->dma = devm_kzalloc(dev, sizeof(*hsdev->dma), GFP_KERNEL);
232230
if (!hsdev->dma)
@@ -236,11 +234,9 @@ static int sata_dwc_dma_init_old(struct platform_device *pdev,
236234
hsdev->dma->id = pdev->id;
237235

238236
/* Get SATA DMA interrupt number */
239-
hsdev->dma->irq = irq_of_parse_and_map(np, 1);
240-
if (!hsdev->dma->irq) {
241-
dev_err(dev, "no SATA DMA irq\n");
242-
return -ENODEV;
243-
}
237+
hsdev->dma->irq = platform_get_irq(pdev, 1);
238+
if (hsdev->dma->irq < 0)
239+
return hsdev->dma->irq;
244240

245241
/* Get physical SATA DMA register base address */
246242
hsdev->dma->regs = devm_platform_ioremap_resource(pdev, 1);
@@ -398,8 +394,7 @@ static void clear_serror(struct ata_port *ap)
398394

399395
static void clear_interrupt_bit(struct sata_dwc_device *hsdev, u32 bit)
400396
{
401-
sata_dwc_writel(&hsdev->sata_dwc_regs->intpr,
402-
sata_dwc_readl(&hsdev->sata_dwc_regs->intpr));
397+
sata_dwc_writel(&hsdev->sata_dwc_regs->intpr, bit);
403398
}
404399

405400
static u32 qcmd_tag_to_mask(u8 tag)
@@ -612,14 +607,9 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance)
612607
status = ap->ops->sff_check_status(ap);
613608
dev_dbg(ap->dev, "%s ATA status register=0x%x\n", __func__, status);
614609

615-
tag = 0;
616610
while (tag_mask) {
617-
while (!(tag_mask & 0x00000001)) {
618-
tag++;
619-
tag_mask <<= 1;
620-
}
621-
622-
tag_mask &= (~0x00000001);
611+
tag = __ffs(tag_mask);
612+
tag_mask &= ~(1U << tag);
623613
qc = ata_qc_from_tag(ap, tag);
624614
if (unlikely(!qc)) {
625615
dev_err(ap->dev, "failed to get qc");
@@ -1126,7 +1116,6 @@ static const struct ata_port_info sata_dwc_port_info[] = {
11261116
static int sata_dwc_probe(struct platform_device *ofdev)
11271117
{
11281118
struct device *dev = &ofdev->dev;
1129-
struct device_node *np = dev->of_node;
11301119
struct sata_dwc_device *hsdev;
11311120
u32 idr, versionr;
11321121
char *ver = (char *)&versionr;
@@ -1169,18 +1158,13 @@ static int sata_dwc_probe(struct platform_device *ofdev)
11691158
/* Save dev for later use in dev_xxx() routines */
11701159
hsdev->dev = dev;
11711160

1172-
/* Enable SATA Interrupts */
1173-
sata_dwc_enable_interrupts(hsdev);
1174-
11751161
/* Get SATA interrupt number */
1176-
irq = irq_of_parse_and_map(np, 0);
1177-
if (!irq) {
1178-
dev_err(dev, "no SATA DMA irq\n");
1179-
return -ENODEV;
1180-
}
1162+
irq = platform_get_irq(ofdev, 0);
1163+
if (irq < 0)
1164+
return irq;
11811165

11821166
#ifdef CONFIG_SATA_DWC_OLD_DMA
1183-
if (!of_property_present(np, "dmas")) {
1167+
if (!of_property_present(dev->of_node, "dmas")) {
11841168
err = sata_dwc_dma_init_old(ofdev, hsdev);
11851169
if (err)
11861170
return err;
@@ -1204,6 +1188,8 @@ static int sata_dwc_probe(struct platform_device *ofdev)
12041188
if (err)
12051189
dev_err(dev, "failed to activate host");
12061190

1191+
/* Enable SATA Interrupts */
1192+
sata_dwc_enable_interrupts(hsdev);
12071193
return 0;
12081194

12091195
error_out:

0 commit comments

Comments
 (0)