Message ID | 1298259096-3426-1-git-send-email-prabhakar@freescale.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
The patch changes the code to: > if (ap->nr_pmp_links) { > + int dev_num; > dereg = ioread32(hcr_base + DE); ... > + dev_num = ffs(dereg)-1; > + if (dev_num < ap->nr_pmp_links) { > + link = &ap->pmp_link[dev_num]; On the off chance that no bits are set in 'DE' this code depends on nr_pmp_links being unsigned (since dev_num becomes -1. Changing 'dev_num' to 'unsigned int' would be better. David
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c index b0214d0..895771c 100644 --- a/drivers/ata/sata_fsl.c +++ b/drivers/ata/sata_fsl.c @@ -1040,12 +1040,14 @@ static void sata_fsl_error_intr(struct ata_port *ap) /* find out the offending link and qc */ if (ap->nr_pmp_links) { + int dev_num; dereg = ioread32(hcr_base + DE); iowrite32(dereg, hcr_base + DE); iowrite32(cereg, hcr_base + CE); - if (dereg < ap->nr_pmp_links) { - link = &ap->pmp_link[dereg]; + dev_num = ffs(dereg)-1; + if (dev_num < ap->nr_pmp_links) { + link = &ap->pmp_link[dev_num]; ehi = &link->eh_info; qc = ata_qc_from_tag(ap, link->active_tag); /*