lkml.org 
[lkml]   [2011]   [Feb]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[20/68] isdn: hisax: Replace the bogus access to irq stats
    2.6.32-longterm review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Thomas Gleixner <tglx@linutronix.de>

    commit 40f08a724fcc21285cf3a75aec957aef908605c6 upstream.

    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>
    Cc: maximilian attems <max@stro.at>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/isdn/hisax/config.c | 18 ++++++++++++++----
    drivers/isdn/hisax/hisax.h | 1 +
    2 files changed, 15 insertions(+), 4 deletions(-)

    --- a/drivers/isdn/hisax/config.c
    +++ b/drivers/isdn/hisax/config.c
    @@ -800,6 +800,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;
    @@ -808,10 +818,10 @@ static int init_card(struct IsdnCardStat
    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;
    @@ -821,8 +831,8 @@ static int init_card(struct IsdnCardStat
    /* 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);
    --- a/drivers/isdn/hisax/hisax.h
    +++ b/drivers/isdn/hisax/hisax.h
    @@ -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;



    \
     
     \ /
      Last update: 2011-02-28 17:51    [W:0.021 / U:61.036 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site