Please note: This project is no longer active. The website is kept online for historic purposes only.
If you´re looking for a Linux driver for your Atheros WLAN device, you should continue here .

Ticket #900: ath-mib-irq-status-mini.2.diff

File ath-mib-irq-status-mini.2.diff, 2.5 kB (added by Ċ½ilvinas Valinskas <valins@soften.ktu.lt>, 13 years ago)

Signed-off-by: Ċ½ilvinas Valinskas <valins@soften.ktu.lt>

  • madwifi-ng/ath/if_ath.c

    old new  
    16881688                        ATH_SCHEDULE_TQUEUE(&sc->sc_bmisstq, &needmark); 
    16891689                } 
    16901690                if (status & HAL_INT_MIB) { 
     1691                        int i; 
     1692                        HAL_INT mibstatus; 
     1693 
    16911694                        sc->sc_stats.ast_mib++; 
    1692                         /* 
    1693                          * Disable interrupts until we service the MIB 
    1694                          * interrupt; otherwise it will continue to fire. 
    1695                          */ 
    1696                         ath_hal_intrset(ah, 0); 
    1697                         /* 
    1698                          * Let the hal handle the event.  We assume it will 
    1699                          * clear whatever condition caused the interrupt. 
     1695 
     1696                        for(i=0; i<3; i++) { 
     1697                                /* 
     1698                                 * Disable interrupts until we service the MIB 
     1699                                 * interrupt; otherwise it will continue to fire. 
     1700                                 */ 
     1701                                ath_hal_intrset(ah, 0); 
     1702 
     1703                                /* 
     1704                                 * Let the hal handle the event.  We assume it will 
     1705                                 * clear whatever condition caused the interrupt. 
     1706                                 */ 
     1707                                ath_hal_mibevent(ah, &sc->sc_halstats); 
     1708                                ath_hal_intrset(ah, sc->sc_imask); 
     1709 
     1710                                ath_hal_getisr(ah, &mibstatus); 
     1711                                if (!(mibstatus & HAL_INT_MIB)) 
     1712                                        break; 
     1713                        } 
     1714 
     1715                        if (i > 0) { 
     1716                                printk("ath_intr(): MIB retry count: %d, status: 0x%0X, mibstatus: 0x%0X\n", 
     1717                                       i, status, mibstatus); 
     1718                        } 
     1719 
     1720                        /* HAL_INT_MIB should have been cleared by now ?! 
     1721                         * Anyway that is just a guess. If radio is not reset 
     1722                         * here - soft-lockup will happen as a result of IRQ 
     1723                         * flood/storm. 
     1724                         * 
     1725                         * This helps to survice stress tests. 
    17001726                         */ 
    1701                         ath_hal_mibevent(ah, &sc->sc_halstats); 
    1702                         ath_hal_intrset(ah, sc->sc_imask); 
     1727                        if (mibstatus & HAL_INT_MIB) { 
     1728                                printk("ath_intr(): mibstatus: 0x%0X, HAL_INT_MIB is not cleared.\n", 
     1729                                               mibstatus); 
     1730                                sc->sc_stats.ast_hardware++; 
     1731                                ath_hal_intrset(ah, 0);         /* disable intr's until reset */ 
     1732                                ATH_SCHEDULE_TQUEUE(&sc->sc_fataltq, &needmark); 
     1733                        } 
    17031734                } 
    17041735        } 
    17051736        if (needmark)