isdn: hisax: Replace the bogus access to irq stats
Abusing irq stats in a driver for counting interrupts is a horrible idea and not safe with shared interrupts. Replace it by a local interrupt counter. Noticed by the attempt to remove the irq stats export. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Родитель
154cd387cd
Коммит
40f08a724f
|
@ -801,6 +801,16 @@ static void closecard(int cardnr)
|
|||
ll_unload(csta);
|
||||
}
|
||||
|
||||
static irqreturn_t card_irq(int intno, void *dev_id)
|
||||
{
|
||||
struct IsdnCardState *cs = dev_id;
|
||||
irqreturn_t ret = cs->irq_func(intno, cs);
|
||||
|
||||
if (ret == IRQ_HANDLED)
|
||||
cs->irq_cnt++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int init_card(struct IsdnCardState *cs)
|
||||
{
|
||||
int irq_cnt, cnt = 3, ret;
|
||||
|
@ -809,10 +819,10 @@ static int init_card(struct IsdnCardState *cs)
|
|||
ret = cs->cardmsg(cs, CARD_INIT, NULL);
|
||||
return(ret);
|
||||
}
|
||||
irq_cnt = kstat_irqs(cs->irq);
|
||||
irq_cnt = cs->irq_cnt = 0;
|
||||
printk(KERN_INFO "%s: IRQ %d count %d\n", CardType[cs->typ],
|
||||
cs->irq, irq_cnt);
|
||||
if (request_irq(cs->irq, cs->irq_func, cs->irq_flags, "HiSax", cs)) {
|
||||
if (request_irq(cs->irq, card_irq, cs->irq_flags, "HiSax", cs)) {
|
||||
printk(KERN_WARNING "HiSax: couldn't get interrupt %d\n",
|
||||
cs->irq);
|
||||
return 1;
|
||||
|
@ -822,8 +832,8 @@ static int init_card(struct IsdnCardState *cs)
|
|||
/* Timeout 10ms */
|
||||
msleep(10);
|
||||
printk(KERN_INFO "%s: IRQ %d count %d\n",
|
||||
CardType[cs->typ], cs->irq, kstat_irqs(cs->irq));
|
||||
if (kstat_irqs(cs->irq) == irq_cnt) {
|
||||
CardType[cs->typ], cs->irq, cs->irq_cnt);
|
||||
if (cs->irq_cnt == irq_cnt) {
|
||||
printk(KERN_WARNING
|
||||
"%s: IRQ(%d) getting no interrupts during init %d\n",
|
||||
CardType[cs->typ], cs->irq, 4 - cnt);
|
||||
|
|
|
@ -959,6 +959,7 @@ struct IsdnCardState {
|
|||
u_long event;
|
||||
struct work_struct tqueue;
|
||||
struct timer_list dbusytimer;
|
||||
unsigned int irq_cnt;
|
||||
#ifdef ERROR_STATISTIC
|
||||
int err_crc;
|
||||
int err_tx;
|
||||
|
|
Загрузка…
Ссылка в новой задаче