Commit 1fe6e687 authored by Dan Carpenter's avatar Dan Carpenter Committed by Willy Tarreau

mISDN: fix a loop count

commit 40d24c4d 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: cae86d4a ('mISDN: Add driver for Infineon ISDN chipset family')
Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
(cherry picked from commit 7eb2a015)
Signed-off-by: default avatarWilly Tarreau <w@1wt.eu>
parent 0dbf4344
...@@ -1154,7 +1154,7 @@ mISDNipac_irq(struct ipac_hw *ipac, int maxloop) ...@@ -1154,7 +1154,7 @@ mISDNipac_irq(struct ipac_hw *ipac, int maxloop)
if (ipac->type & IPAC_TYPE_IPACX) { if (ipac->type & IPAC_TYPE_IPACX) {
ista = ReadIPAC(ipac, ISACX_ISTA); ista = ReadIPAC(ipac, ISACX_ISTA);
while (ista && cnt--) { while (ista && --cnt) {
pr_debug("%s: ISTA %02x\n", ipac->name, ista); pr_debug("%s: ISTA %02x\n", ipac->name, ista);
if (ista & IPACX__ICA) if (ista & IPACX__ICA)
ipac_irq(&ipac->hscx[0], ista); ipac_irq(&ipac->hscx[0], ista);
...@@ -1166,7 +1166,7 @@ mISDNipac_irq(struct ipac_hw *ipac, int maxloop) ...@@ -1166,7 +1166,7 @@ mISDNipac_irq(struct ipac_hw *ipac, int maxloop)
} }
} else if (ipac->type & IPAC_TYPE_IPAC) { } else if (ipac->type & IPAC_TYPE_IPAC) {
ista = ReadIPAC(ipac, IPAC_ISTA); ista = ReadIPAC(ipac, IPAC_ISTA);
while (ista && cnt--) { while (ista && --cnt) {
pr_debug("%s: ISTA %02x\n", ipac->name, ista); pr_debug("%s: ISTA %02x\n", ipac->name, ista);
if (ista & (IPAC__ICD | IPAC__EXD)) { if (ista & (IPAC__ICD | IPAC__EXD)) {
istad = ReadISAC(isac, ISAC_ISTA); istad = ReadISAC(isac, ISAC_ISTA);
...@@ -1184,7 +1184,7 @@ mISDNipac_irq(struct ipac_hw *ipac, int maxloop) ...@@ -1184,7 +1184,7 @@ mISDNipac_irq(struct ipac_hw *ipac, int maxloop)
ista = ReadIPAC(ipac, IPAC_ISTA); ista = ReadIPAC(ipac, IPAC_ISTA);
} }
} else if (ipac->type & IPAC_TYPE_HSCX) { } else if (ipac->type & IPAC_TYPE_HSCX) {
while (cnt) { while (--cnt) {
ista = ReadIPAC(ipac, IPAC_ISTAB + ipac->hscx[1].off); ista = ReadIPAC(ipac, IPAC_ISTAB + ipac->hscx[1].off);
pr_debug("%s: B2 ISTA %02x\n", ipac->name, ista); pr_debug("%s: B2 ISTA %02x\n", ipac->name, ista);
if (ista) if (ista)
...@@ -1195,7 +1195,6 @@ mISDNipac_irq(struct ipac_hw *ipac, int maxloop) ...@@ -1195,7 +1195,6 @@ mISDNipac_irq(struct ipac_hw *ipac, int maxloop)
mISDNisac_irq(isac, istad); mISDNisac_irq(isac, istad);
if (0 == (ista | istad)) if (0 == (ista | istad))
break; break;
cnt--;
} }
} }
if (cnt > maxloop) /* only for ISAC/HSCX without PCI IRQ test */ if (cnt > maxloop) /* only for ISAC/HSCX without PCI IRQ test */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment