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 1958 1958 HAL_STATUS status; 1959 1959 int error = 0; 1960 1960 1961 ATH_LOCK (sc);1961 ATH_LOCK_IRQ(sc); 1962 1962 1963 1963 DPRINTF(sc, ATH_DEBUG_RESET, "%s: mode %d\n", __func__, ic->ic_opmode); 1964 1964 … … 2059 2059 #endif 2060 2060 2061 2061 done: 2062 ATH_UNLOCK (sc);2062 ATH_UNLOCK_IRQ(sc); 2063 2063 return error; 2064 2064 } 2065 2065 … … 2144 2144 struct ath_softc *sc = dev->priv; 2145 2145 int error; 2146 2146 2147 ATH_LOCK (sc);2147 ATH_LOCK_IRQ(sc); 2148 2148 2149 2149 if (!sc->sc_invalid) 2150 2150 ath_hal_setpower(sc->sc_ah, HAL_PM_AWAKE); … … 2165 2165 ath_hal_setpower(sc->sc_ah, HAL_PM_FULL_SLEEP); 2166 2166 } 2167 2167 #endif 2168 ATH_UNLOCK (sc);2168 ATH_UNLOCK_IRQ(sc); 2169 2169 2170 2170 return error; 2171 2171 } … … 9314 9314 mac->sa_data[0], mac->sa_data[1], mac->sa_data[2], 9315 9315 mac->sa_data[3], mac->sa_data[4], mac->sa_data[5]); 9316 9316 9317 ATH_LOCK (sc);9317 ATH_LOCK_IRQ(sc); 9318 9318 /* XXX not right for multiple VAPs */ 9319 9319 IEEE80211_ADDR_COPY(ic->ic_myaddr, mac->sa_data); 9320 9320 IEEE80211_ADDR_COPY(dev->dev_addr, mac->sa_data); … … 9322 9322 if ((dev->flags & IFF_RUNNING) && !sc->sc_invalid) { 9323 9323 error = ath_reset(dev); 9324 9324 } 9325 ATH_UNLOCK (sc);9325 ATH_UNLOCK_IRQ(sc); 9326 9326 9327 9327 return error; 9328 9328 } … … 9340 9340 } 9341 9341 DPRINTF(sc, ATH_DEBUG_ANY, "%s: %d\n", __func__, mtu); 9342 9342 9343 ATH_LOCK (sc);9343 ATH_LOCK_IRQ(sc); 9344 9344 dev->mtu = mtu; 9345 9345 if ((dev->flags & IFF_RUNNING) && !sc->sc_invalid) { 9346 9346 /* NB: the rx buffers may need to be reallocated */ … … 9348 9348 error = ath_reset(dev); 9349 9349 tasklet_enable(&sc->sc_rxtq); 9350 9350 } 9351 ATH_UNLOCK (sc);9351 ATH_UNLOCK_IRQ(sc); 9352 9352 9353 9353 return error; 9354 9354 } … … 9419 9419 { 9420 9420 struct ath_softc *sc = dev->priv; 9421 9421 struct ieee80211com *ic = &sc->sc_ic; 9422 int error ;9422 int error = -EINVAL; 9423 9423 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 /* 9426 XXX: 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); 9448 9432 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); 9453 9463 } 9454 ATH_UNLOCK(sc);9455 9464 return error; 9456 9465 } 9457 9466 … … 9499 9508 u_int val; 9500 9509 int ret; 9501 9510 9511 ATH_LOCK_IRQ(sc); 9502 9512 ctl->data = &val; 9503 9513 ctl->maxlen = sizeof(val); 9504 9514 if (write) { … … 9548 9558 * 2 = antenna port 2 9549 9559 */ 9550 9560 if (val > 2) 9551 ret urn-EINVAL;9561 ret = -EINVAL; 9552 9562 else 9553 9563 sc->sc_txantenna = val; 9554 9564 break; … … 9560 9570 * 2 = antenna port 2 9561 9571 */ 9562 9572 if (val > 2) 9563 ret urn-EINVAL;9573 ret = -EINVAL; 9564 9574 else 9565 9575 ath_setdefantenna(sc, val); 9566 9576 break; … … 9570 9580 * 1 = allow use of diversity 9571 9581 */ 9572 9582 if (val > 1) 9573 ret urn-EINVAL;9583 ret = -EINVAL; 9574 9584 /* Don't enable diversity if XR is enabled */ 9575 9585 if (((!sc->sc_hasdiversity) || (sc->sc_xrtxq != NULL)) && val) 9576 ret urn-EINVAL;9586 ret = -EINVAL; 9577 9587 sc->sc_diversity = val; 9578 9588 ath_hal_setdiversity(ah, val); 9579 9589 break; … … 9589 9599 struct ieee80211com *ic = &sc->sc_ic; 9590 9600 9591 9601 if (!ath_hal_hastkipmic(ah)) 9592 ret urn-EINVAL;9602 ret = -EINVAL; 9593 9603 ath_hal_settkipmic(ah, val); 9594 9604 if (val) 9595 9605 ic->ic_caps |= IEEE80211_C_TKIPMIC; … … 9619 9629 ath_set_ack_bitrate(sc, sc->sc_ackrate); 9620 9630 break; 9621 9631 default: 9622 return -EINVAL; 9632 ret = -EINVAL; 9633 break; 9623 9634 } 9624 9635 } 9625 9636 } else { … … 9678 9689 val = sc->sc_ackrate; 9679 9690 break; 9680 9691 default: 9681 return -EINVAL; 9692 ret = -EINVAL; 9693 break; 9682 9694 } 9683 9695 ret = ATH_SYSCTL_PROC_DOINTVEC(ctl, write, filp, buffer, lenp, ppos); 9684 9696 } 9697 ATH_UNLOCK_IRQ(sc); 9685 9698 return ret; 9686 9699 } 9687 9700 -
trunk-r2436-hack/ath/if_athvar.h
old new 533 533 struct ieee80211com sc_ic; /* NB: must be first */ 534 534 struct net_device *sc_dev; 535 535 void __iomem *sc_iobase; /* address of the device */ 536 s truct semaphore sc_lock;/* dev-level lock */536 spinlock_t sc_lock; /* dev-level lock */ 537 537 struct net_device_stats sc_devstats; /* device statistics */ 538 538 struct ath_stats sc_stats; /* private statistics */ 539 539 int devid; … … 750 750 spin_unlock_irqrestore(&(_sc)->sc_rxbuflock, __rxbuflockflags); 751 751 752 752 /* 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) 754 754 #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 /* 764 XXX: 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); 757 773 758 774 int ath_attach(u_int16_t, struct net_device *, HAL_BUS_TAG); 759 775 int ath_detach(struct net_device *);
