| From 40d24c4d8a7430aa4dfd7a665fa3faf3b05b673f Mon Sep 17 00:00:00 2001 |
| From: Dan Carpenter <dan.carpenter@oracle.com> |
| Date: Tue, 15 Dec 2015 13:07:52 +0300 |
| Subject: mISDN: fix a loop count |
| |
| commit 40d24c4d8a7430aa4dfd7a665fa3faf3b05b673f upstream. |
| |
| There are two issue here. |
| 1) cnt starts as maxloop + 1 so all these loops iterate one more time |
| than intended. |
| 2) At the end of the loop we test for "if (maxloop && !cnt)" but for |
| the first two loops, we end with cnt equal to -1. Changing this to |
| a pre-op means we end with cnt set to 0. |
| |
| Fixes: cae86d4a4e56 ('mISDN: Add driver for Infineon ISDN chipset family') |
| Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Zefan Li <lizefan@huawei.com> |
| --- |
| drivers/isdn/hardware/mISDN/mISDNipac.c | 7 +++---- |
| 1 file changed, 3 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/isdn/hardware/mISDN/mISDNipac.c |
| +++ b/drivers/isdn/hardware/mISDN/mISDNipac.c |
| @@ -1156,7 +1156,7 @@ mISDNipac_irq(struct ipac_hw *ipac, int |
| |
| if (ipac->type & IPAC_TYPE_IPACX) { |
| ista = ReadIPAC(ipac, ISACX_ISTA); |
| - while (ista && cnt--) { |
| + while (ista && --cnt) { |
| pr_debug("%s: ISTA %02x\n", ipac->name, ista); |
| if (ista & IPACX__ICA) |
| ipac_irq(&ipac->hscx[0], ista); |
| @@ -1168,7 +1168,7 @@ mISDNipac_irq(struct ipac_hw *ipac, int |
| } |
| } else if (ipac->type & IPAC_TYPE_IPAC) { |
| ista = ReadIPAC(ipac, IPAC_ISTA); |
| - while (ista && cnt--) { |
| + while (ista && --cnt) { |
| pr_debug("%s: ISTA %02x\n", ipac->name, ista); |
| if (ista & (IPAC__ICD | IPAC__EXD)) { |
| istad = ReadISAC(isac, ISAC_ISTA); |
| @@ -1186,7 +1186,7 @@ mISDNipac_irq(struct ipac_hw *ipac, int |
| ista = ReadIPAC(ipac, IPAC_ISTA); |
| } |
| } else if (ipac->type & IPAC_TYPE_HSCX) { |
| - while (cnt) { |
| + while (--cnt) { |
| ista = ReadIPAC(ipac, IPAC_ISTAB + ipac->hscx[1].off); |
| pr_debug("%s: B2 ISTA %02x\n", ipac->name, ista); |
| if (ista) |
| @@ -1197,7 +1197,6 @@ mISDNipac_irq(struct ipac_hw *ipac, int |
| mISDNisac_irq(isac, istad); |
| if (0 == (ista | istad)) |
| break; |
| - cnt--; |
| } |
| } |
| if (cnt > maxloop) /* only for ISAC/HSCX without PCI IRQ test */ |