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.diff

File ath-mib-irq-status-mini.diff, 1.9 kB (added by valins@soften.ktu.lt, 13 years ago)

Reset radio if ath_hal_mibevent() fails to reset HAL_INT_MIB flag. Simpler way to solve the soft-lock up problem.

  • madwifi-ng/ath/if_ath.c

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