Ticket #1370: madwifi-0.9.3-athlock-irq.diff

File madwifi-0.9.3-athlock-irq.diff, 6.9 kB (added by mtaylor, 5 years ago)
  • trunk-r2436-hack/ath/if_ath.c

    old new  
    19581958        HAL_STATUS status; 
    19591959        int error = 0; 
    19601960 
    1961         ATH_LOCK(sc); 
     1961        ATH_LOCK_IRQ(sc); 
    19621962 
    19631963        DPRINTF(sc, ATH_DEBUG_RESET, "%s: mode %d\n", __func__, ic->ic_opmode); 
    19641964 
     
    20592059#endif 
    20602060 
    20612061done: 
    2062         ATH_UNLOCK(sc); 
     2062        ATH_UNLOCK_IRQ(sc); 
    20632063        return error; 
    20642064} 
    20652065 
     
    21442144        struct ath_softc *sc = dev->priv; 
    21452145        int error; 
    21462146 
    2147         ATH_LOCK(sc); 
     2147        ATH_LOCK_IRQ(sc); 
    21482148 
    21492149        if (!sc->sc_invalid) 
    21502150                ath_hal_setpower(sc->sc_ah, HAL_PM_AWAKE); 
     
    21652165                ath_hal_setpower(sc->sc_ah, HAL_PM_FULL_SLEEP); 
    21662166        } 
    21672167#endif 
    2168         ATH_UNLOCK(sc); 
     2168        ATH_UNLOCK_IRQ(sc); 
    21692169 
    21702170        return error; 
    21712171} 
     
    93149314                mac->sa_data[0], mac->sa_data[1], mac->sa_data[2], 
    93159315                mac->sa_data[3], mac->sa_data[4], mac->sa_data[5]); 
    93169316 
    9317         ATH_LOCK(sc); 
     9317        ATH_LOCK_IRQ(sc); 
    93189318        /* XXX not right for multiple VAPs */ 
    93199319        IEEE80211_ADDR_COPY(ic->ic_myaddr, mac->sa_data); 
    93209320        IEEE80211_ADDR_COPY(dev->dev_addr, mac->sa_data); 
     
    93229322        if ((dev->flags & IFF_RUNNING) && !sc->sc_invalid) { 
    93239323                error = ath_reset(dev); 
    93249324        } 
    9325         ATH_UNLOCK(sc); 
     9325        ATH_UNLOCK_IRQ(sc); 
    93269326 
    93279327        return error; 
    93289328} 
     
    93409340        } 
    93419341        DPRINTF(sc, ATH_DEBUG_ANY, "%s: %d\n", __func__, mtu); 
    93429342 
    9343         ATH_LOCK(sc); 
     9343        ATH_LOCK_IRQ(sc); 
    93449344        dev->mtu = mtu; 
    93459345        if ((dev->flags & IFF_RUNNING) && !sc->sc_invalid) { 
    93469346                /* NB: the rx buffers may need to be reallocated */ 
     
    93489348                error = ath_reset(dev); 
    93499349                tasklet_enable(&sc->sc_rxtq); 
    93509350        } 
    9351         ATH_UNLOCK(sc); 
     9351        ATH_UNLOCK_IRQ(sc); 
    93529352 
    93539353        return error; 
    93549354} 
     
    94199419{ 
    94209420        struct ath_softc *sc = dev->priv; 
    94219421        struct ieee80211com *ic = &sc->sc_ic; 
    9422         int error
     9422        int error = -EINVAL
    94239423 
    9424         ATH_LOCK(sc); 
    9425         switch (cmd) { 
    9426         case SIOCGATHSTATS: 
    9427                 sc->sc_stats.ast_tx_packets = sc->sc_devstats.tx_packets; 
    9428                 sc->sc_stats.ast_rx_packets = sc->sc_devstats.rx_packets; 
    9429                 sc->sc_stats.ast_rx_rssi = ieee80211_getrssi(ic); 
    9430                 if (copy_to_user(ifr->ifr_data, &sc->sc_stats, sizeof (sc->sc_stats))) 
    9431                         error = -EFAULT; 
    9432                 else 
    9433                         error = 0; 
    9434                 break; 
    9435         case SIOCGATHDIAG: 
    9436                 if (!capable(CAP_NET_ADMIN)) 
    9437                         error = -EPERM; 
    9438                 else 
    9439                         error = ath_ioctl_diag(sc, (struct ath_diag *) ifr); 
    9440                 break; 
    9441         case SIOCETHTOOL: 
    9442                 if (copy_from_user(&cmd, ifr->ifr_data, sizeof(cmd))) 
    9443                         error = -EFAULT; 
    9444                 else 
    9445                         error = ath_ioctl_ethtool(sc, cmd, ifr->ifr_data); 
    9446                 break; 
    9447         case SIOC80211IFCREATE: 
     9424        if(SIOC80211IFCREATE == cmd) { 
     9425/*  
     9426XXX: ATH_UNLOCK and ATH_LOCK are temporary evil until I figure out a fix for  
     9427        ieee80211_ioctl_create_vap working when interrupts are disabled  
     9428        Ideally interrupts are disabled while we are playing with the driver 
     9429        configuration. 
     9430*/ 
     9431                ATH_LOCK(sc); 
    94489432                error = ieee80211_ioctl_create_vap(ic, ifr, dev); 
    9449                 break; 
    9450         default: 
    9451                 error = -EINVAL; 
    9452                 break; 
     9433                ATH_UNLOCK(sc); 
     9434        } 
     9435        else { 
     9436                ATH_LOCK_IRQ(sc); 
     9437                switch (cmd) { 
     9438                case SIOCGATHSTATS: 
     9439                        sc->sc_stats.ast_tx_packets = sc->sc_devstats.tx_packets; 
     9440                        sc->sc_stats.ast_rx_packets = sc->sc_devstats.rx_packets; 
     9441                        sc->sc_stats.ast_rx_rssi = ieee80211_getrssi(ic); 
     9442                        if (copy_to_user(ifr->ifr_data, &sc->sc_stats, sizeof (sc->sc_stats))) 
     9443                                error = -EFAULT; 
     9444                        else 
     9445                                error = 0; 
     9446                        break; 
     9447                case SIOCGATHDIAG: 
     9448                        if (!capable(CAP_NET_ADMIN)) 
     9449                                error = -EPERM; 
     9450                        else 
     9451                                error = ath_ioctl_diag(sc, (struct ath_diag *) ifr); 
     9452                        break; 
     9453                case SIOCETHTOOL: 
     9454                        if (copy_from_user(&cmd, ifr->ifr_data, sizeof(cmd))) 
     9455                                error = -EFAULT; 
     9456                        else 
     9457                                error = ath_ioctl_ethtool(sc, cmd, ifr->ifr_data); 
     9458                        break; 
     9459                default: 
     9460                        break; 
     9461                } 
     9462                ATH_UNLOCK_IRQ(sc); 
    94539463        } 
    9454         ATH_UNLOCK(sc); 
    94559464        return error; 
    94569465} 
    94579466 
     
    94999508        u_int val; 
    95009509        int ret; 
    95019510 
     9511        ATH_LOCK_IRQ(sc); 
    95029512        ctl->data = &val; 
    95039513        ctl->maxlen = sizeof(val); 
    95049514        if (write) { 
     
    95489558                                 * 2 = antenna port 2 
    95499559                                 */ 
    95509560                                if (val > 2) 
    9551                                         return -EINVAL; 
     9561                                        ret = -EINVAL; 
    95529562                                else 
    95539563                                        sc->sc_txantenna = val; 
    95549564                                break; 
     
    95609570                                 * 2 = antenna port 2 
    95619571                                 */ 
    95629572                                if (val > 2) 
    9563                                         return -EINVAL; 
     9573                                        ret = -EINVAL; 
    95649574                                else 
    95659575                                        ath_setdefantenna(sc, val); 
    95669576                                break; 
     
    95709580                                 * 1 = allow use of diversity 
    95719581                                 */ 
    95729582                                if (val > 1) 
    9573                                         return -EINVAL; 
     9583                                        ret = -EINVAL; 
    95749584                                /* Don't enable diversity if XR is enabled */ 
    95759585                                if (((!sc->sc_hasdiversity) || (sc->sc_xrtxq != NULL)) && val) 
    9576                                         return -EINVAL; 
     9586                                        ret = -EINVAL; 
    95779587                                sc->sc_diversity = val; 
    95789588                                ath_hal_setdiversity(ah, val); 
    95799589                                break; 
     
    95899599                                struct ieee80211com *ic = &sc->sc_ic; 
    95909600 
    95919601                                if (!ath_hal_hastkipmic(ah)) 
    9592                                         return -EINVAL; 
     9602                                        ret = -EINVAL; 
    95939603                                ath_hal_settkipmic(ah, val); 
    95949604                                if (val) 
    95959605                                        ic->ic_caps |= IEEE80211_C_TKIPMIC; 
     
    96199629                                ath_set_ack_bitrate(sc, sc->sc_ackrate); 
    96209630                                break; 
    96219631                        default: 
    9622                                 return -EINVAL; 
     9632                                ret = -EINVAL; 
     9633                                break; 
    96239634                        } 
    96249635                } 
    96259636        } else { 
     
    96789689                        val = sc->sc_ackrate; 
    96799690                        break; 
    96809691                default: 
    9681                         return -EINVAL; 
     9692                        ret = -EINVAL; 
     9693                        break; 
    96829694                } 
    96839695                ret = ATH_SYSCTL_PROC_DOINTVEC(ctl, write, filp, buffer, lenp, ppos); 
    96849696        } 
     9697        ATH_UNLOCK_IRQ(sc); 
    96859698        return ret; 
    96869699} 
    96879700 
  • trunk-r2436-hack/ath/if_athvar.h

    old new  
    533533        struct ieee80211com sc_ic;              /* NB: must be first */ 
    534534        struct net_device *sc_dev; 
    535535        void __iomem *sc_iobase;                /* address of the device */ 
    536         struct semaphore sc_lock;              /* dev-level lock */ 
     536        spinlock_t sc_lock;                     /* dev-level lock */ 
    537537        struct net_device_stats sc_devstats;    /* device statistics */ 
    538538        struct ath_stats sc_stats;              /* private statistics */ 
    539539        int devid; 
     
    750750        spin_unlock_irqrestore(&(_sc)->sc_rxbuflock, __rxbuflockflags); 
    751751 
    752752/* Protects the device from concurrent accesses */ 
    753 #define ATH_LOCK_INIT(_sc)              init_MUTEX(&(_sc)->sc_lock) 
     753#define ATH_LOCK_INIT(_sc)              spin_lock_init(&(_sc)->sc_lock) 
    754754#define ATH_LOCK_DESTROY(_sc) 
    755 #define ATH_LOCK(_sc)                   down(&(_sc)->sc_lock) 
    756 #define ATH_UNLOCK(_sc)                 up(&(_sc)->sc_lock) 
     755#define ATH_LOCK_IRQ(_sc)               do {    \ 
     756        unsigned long __lockflags;              \ 
     757        spin_lock_irqsave(&(_sc)->sc_lock, __lockflags); 
     758#define ATH_UNLOCK_IRQ(_sc)                     \ 
     759        spin_unlock_irqrestore(&(_sc)->sc_lock, __lockflags); \ 
     760} while (0) 
     761#define ATH_UNLOCK_IRQ_EARLY(_sc)               \ 
     762        spin_unlock_irqrestore(&(_sc)->sc_lock, __lockflags); 
     763/*  
     764XXX: ATH_UNLOCK and ATH_LOCK are temporary evil until I figure out a fix for  
     765        ieee80211_ioctl_create_vap working when interrupts are disabled  
     766        Ideally interrupts are disabled while we are playing with the driver 
     767        configuration. 
     768*/ 
     769#define ATH_UNLOCK(_sc)         \ 
     770        spin_unlock(&(_sc)->sc_lock); 
     771#define ATH_LOCK(_sc)           \ 
     772        spin_lock(&(_sc)->sc_lock); 
    757773 
    758774int ath_attach(u_int16_t, struct net_device *, HAL_BUS_TAG); 
    759775int ath_detach(struct net_device *);