[Madwifi-cvs] revision 1783 committed
Status: Beta
Brought to you by:
otaku
From: David K. <svn...@ma...> - 2006-10-27 00:05:09
|
Project : madwifi Revision : 1783 Author : dwhedon (David Kimdon) Date : 2006-10-27 02:04:54 +0200 (Fri, 27 Oct 2006) Log Message : Remove hardcoded limit of 4 bss's. Allocate bss structures when new bss's are brought up. * README.dadwifi : Update. * ath/if_ath.h : Add prototypes for ath_descdma_setup() and ath_descdma_cleanup(). * ath/if_athvar.h : Remove some vap structures. In d80211 we use different structures. * ath/if_ath_d80211.c (ath_d80211_add_interface) : Add some more to debug message. Allocate beacon structures for new bss. (ath_d80211_remove_interface) : Add some more info to debug message. * ath/if_ath.c : ath_descdma_setup() and ath_descdma_cleanup() are now non-static. (ath_beacon_generate,ath_descdma_cleanup) : Remove unneeded net80211 code. Remove bss->ab_bcbuf initialization from here, this now happens when the interface is brought up. (ath_desc_alloc) : Remove allocation of beacon descriptors, this is now done when a new bss is brought up. Affected Files: * branches/dadwifi/README.dadwifi updated * branches/dadwifi/ath/if_ath.c updated * branches/dadwifi/ath/if_ath.h updated * branches/dadwifi/ath/if_ath_d80211.c updated * branches/dadwifi/ath/if_athvar.h updated Modified: branches/dadwifi/README.dadwifi =================================================================== --- branches/dadwifi/README.dadwifi 2006-10-26 00:57:13 UTC (rev 1782) +++ branches/dadwifi/README.dadwifi 2006-10-27 00:04:54 UTC (rev 1783) @@ -89,8 +89,6 @@ before doing anything about it. - short preamble - we should reclaim beacon resources when a bss is removed - - should allocated beacon descriptors dynamically with new bss's rather than - having a hard-coded 4 allocated - We need to put logic into add_interface which prohibit unsupported configurations. - multicast : The multicast filter is currently disabled. Modified: branches/dadwifi/ath/if_ath.c =================================================================== --- branches/dadwifi/ath/if_ath.c 2006-10-26 00:57:13 UTC (rev 1782) +++ branches/dadwifi/ath/if_ath.c 2006-10-27 00:04:54 UTC (rev 1783) @@ -276,10 +276,6 @@ static void ath_dynamic_sysctl_unregister(struct ath_softc *); #endif /* CONFIG_SYSCTL */ static void ath_announce(struct net_device *); -static int ath_descdma_setup(struct ath_softc *, struct ath_descdma *, - ath_bufhead *, const char *, int, int); -static void ath_descdma_cleanup(struct ath_softc *, struct ath_descdma *, - ath_bufhead *, int); #if 0 static void ath_check_dfs_clear(unsigned long); #endif @@ -4156,33 +4152,13 @@ * Generate beacon frame and queue cab data for a vap. */ static struct ath_buf * -#ifdef CONFIG_NET80211 -ath_beacon_generate(struct ath_softc *sc, struct ieee80211vap *vap, int *needmark) -#else ath_beacon_generate(struct ath_softc *sc, struct ath_bss *bss) -#endif { -#ifdef CONFIG_NET80211 - struct ath_hal *ah = sc->sc_ah; - struct ieee80211_node *ni; - struct ath_vap *avp; -#else struct net_device *dev = sc->sc_dev; struct ath_buf *bf; -#endif struct sk_buff *skb; struct ieee80211_tx_control control; -#ifdef CONFIG_NET80211 - int ncabq; - unsigned int curlen; - - if (vap->iv_state != IEEE80211_S_RUN) { - DPRINTF(sc, ATH_DEBUG_BEACON_PROC, "%s: skip vap in %s state\n", - __func__, ieee80211_state_name[vap->iv_state]); - return NULL; - } -#endif #ifdef ATH_SUPERG_XR if (vap->iv_flags & IEEE80211_F_XR) { vap->iv_xrbcnwait++; @@ -4192,17 +4168,6 @@ vap->iv_xrbcnwait = 0; } #endif -#ifdef CONFIG_NET80211 - avp = ATH_VAP(vap); - if (avp->av_bcbuf == NULL) { - DPRINTF(sc, ATH_DEBUG_ANY, "%s: avp=%p av_bcbuf=%p\n", - __func__, avp, avp->av_bcbuf); - return NULL; - } - bf = avp->av_bcbuf; - ni = bf->bf_node; - -#endif #ifdef ATH_SUPERG_DYNTURBO /* * If we are using dynamic turbo, update the @@ -4216,33 +4181,6 @@ ath_beacon_dturbo_update(vap, needmark, dtim); } #endif -#ifdef CONFIG_NET80211 - /* - * Update dynamic beacon contents. If this returns - * non-zero then we need to remap the memory because - * the beacon frame changed size (probably because - * of the TIM bitmap). - */ - skb = bf->bf_skb; - curlen = skb->len; - ncabq = avp->av_mcastq.axq_depth; - if (ieee80211_beacon_update(ni, &avp->av_boff, skb, ncabq)) { - bus_unmap_single(sc->sc_bdev, - bf->bf_skbaddr, curlen, BUS_DMA_TODEVICE); - bf->bf_skbaddr = bus_map_single(sc->sc_bdev, - skb->data, skb->len, BUS_DMA_TODEVICE); - } -#else - if (bss->ab_bcbuf == NULL) { - bss->ab_bcbuf = STAILQ_FIRST(&sc->sc_bbuf); - if (!bss->ab_bcbuf) { - DPRINTF(sc, ATH_DEBUG_BEACON_PROC, "%s: no buffers\n", - __func__); - return NULL; - } - STAILQ_REMOVE_HEAD(&sc->sc_bbuf, bf_list); - } - bf = bss->ab_bcbuf; memset(&control, 0, sizeof(control)); @@ -4260,7 +4198,6 @@ bf->bf_skbaddr = bus_map_single(sc->sc_bdev, skb->data, skb->len, BUS_DMA_TODEVICE); -#endif #if 0 /* * if the CABQ traffic from previous DTIM is pending and the current @@ -4633,12 +4570,6 @@ dev_kfree_skb(bf->bf_skb); bf->bf_skb = NULL; } -#ifdef CONFIG_NET80211 - if (bf->bf_node != NULL) { - ieee80211_free_node(bf->bf_node); - bf->bf_node = NULL; - } -#endif } } @@ -4871,7 +4802,7 @@ #endif } -static int +int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, ath_bufhead *head, const char *name, int nbuf, int ndesc) @@ -4926,14 +4857,11 @@ #undef DS2PHYS } -static void +void ath_descdma_cleanup(struct ath_softc *sc, struct ath_descdma *dd, ath_bufhead *head, int dir) { struct ath_buf *bf; -#if 0 - struct ieee80211_node *ni; -#endif STAILQ_FOREACH(bf, head, bf_list) { if (bf->bf_skb != NULL) { @@ -4947,16 +4875,6 @@ dev_kfree_skb(bf->bf_skb); bf->bf_skb = NULL; } -#if 0 - ni = bf->bf_node; - bf->bf_node = NULL; - if (ni != NULL) { - /* - * Reclaim node reference. - */ - ieee80211_free_node(ni); - } -#endif } /* Free memory associated with descriptors */ @@ -4986,9 +4904,6 @@ return error; } - /* XXX allocate beacon state together with vap */ - error = ath_descdma_setup(sc, &sc->sc_bdma, &sc->sc_bbuf, - "beacon", ATH_BCBUF, 1); if (error != 0) { ath_descdma_cleanup(sc, &sc->sc_txdma, &sc->sc_txbuf, BUS_DMA_TODEVICE); Modified: branches/dadwifi/ath/if_ath.h =================================================================== --- branches/dadwifi/ath/if_ath.h 2006-10-26 00:57:13 UTC (rev 1782) +++ branches/dadwifi/ath/if_ath.h 2006-10-27 00:04:54 UTC (rev 1783) @@ -45,6 +45,10 @@ int ath_reset(struct net_device *dev); int ath_d80211_tx(struct net_device *dev, struct sk_buff *skb, struct ieee80211_tx_control *control); +int ath_descdma_setup(struct ath_softc *, struct ath_descdma *, ath_bufhead *, + const char *, int, int); +void ath_descdma_cleanup(struct ath_softc *, struct ath_descdma *, + ath_bufhead *, int); #define AR_DEBUG Modified: branches/dadwifi/ath/if_ath_d80211.c =================================================================== --- branches/dadwifi/ath/if_ath_d80211.c 2006-10-26 00:57:13 UTC (rev 1782) +++ branches/dadwifi/ath/if_ath_d80211.c 2006-10-27 00:04:54 UTC (rev 1783) @@ -50,6 +50,7 @@ #include "if_athvar.h" #include "if_ath_d80211.h" #include "if_ath.h" +#include "if_ath_pci.h" #include <net/d80211.h> @@ -320,7 +321,8 @@ int error = 0; int reset; - DPRINTF(sc, ATH_DEBUG_D80211, "%s\n", __func__); + DPRINTF(sc, ATH_DEBUG_D80211, "%s: if_id %d, type %d\n", __func__, + conf->if_id, conf->type); ATH_LOCK(sc); @@ -338,6 +340,10 @@ if (sc->sc_num_alloced_bss < sc->sc_num_bss + 1) { struct ath_bss *bss; + struct ath_descdma bdma; + ath_bufhead bbuf; + struct ath_hal *ah = sc->sc_ah; + int i; bss = kzalloc((sc->sc_num_bss + 1) * sizeof(bss[0]), GFP_KERNEL); @@ -347,16 +353,34 @@ goto done; } + error = ath_descdma_setup(sc, &bdma, &bbuf, "beacon", + sc->sc_num_bss + 1, 1); + + if (error) { + kfree(bss); + goto done; + } + spin_lock_irqsave(&sc->sc_bss_lock, flags); + ath_hal_stoptxdma(ah, sc->sc_bhalq); + ath_descdma_cleanup(sc, &sc->sc_bdma, &sc->sc_bbuf, + BUS_DMA_TODEVICE); + sc->sc_bdma = bdma; + sc->sc_bbuf = bbuf; + memcpy(bss, sc->sc_bss, sc->sc_num_bss * sizeof(bss[0])); kfree(sc->sc_bss); sc->sc_bss = bss; sc->sc_bss[sc->sc_num_bss].ab_if_id = conf->if_id; - /* FIXME: Allocate ab_bcbuf here. */ sc->sc_num_bss++; + for (i = 0; i < sc->sc_num_bss; i++) { + sc->sc_bss[i].ab_bcbuf = STAILQ_FIRST(&sc->sc_bbuf); + STAILQ_REMOVE_HEAD(&sc->sc_bbuf, bf_list); + } + spin_unlock_irqrestore(&sc->sc_bss_lock, flags); sc->sc_num_alloced_bss++; @@ -399,7 +423,8 @@ unsigned long flags; int i; - DPRINTF(sc, ATH_DEBUG_D80211, "%s\n", __func__); + DPRINTF(sc, ATH_DEBUG_D80211, "%s: if_id %d, type %d\n", __func__, + conf->if_id, conf->type); ATH_LOCK(sc); Modified: branches/dadwifi/ath/if_athvar.h =================================================================== --- branches/dadwifi/ath/if_athvar.h 2006-10-26 00:57:13 UTC (rev 1782) +++ branches/dadwifi/ath/if_athvar.h 2006-10-27 00:04:54 UTC (rev 1783) @@ -193,8 +193,6 @@ #define ATH_RXBUF 40 /* number of RX buffers */ #define ATH_TXBUF 200 /* number of TX buffers */ -#define ATH_BCBUF 4 /* number of beacon buffers */ - /* free buffer threshold to restart net dev */ #define ATH_TXBUF_FREE_THRESHOLD (ATH_TXBUF / 20) @@ -446,23 +444,6 @@ u_int axq_compbufsz; /* scratch comp buffer size */ }; -/* driver-specific vap state */ -struct ath_vap { -#ifdef CONFIG_NET80211 - struct ieee80211vap av_vap; /* base class */ - int (*av_newstate)(struct ieee80211vap *, enum ieee80211_state, int); -#endif - /* XXX beacon state */ - struct ath_buf *av_bcbuf; /* beacon buffer */ -#ifdef CONFIG_NET80211 - struct ieee80211_beacon_offsets av_boff;/* dynamic update state */ -#endif - int av_bslot; /* beacon slot index */ - struct ath_txq av_mcastq; /* multicast transmit queue */ - u_int8_t av_dfswait_run; -}; -#define ATH_VAP(_v) ((struct ath_vap *)(_v)) - /* ath_bss includes per BSS information used by AP mode */ struct ath_bss { int ab_if_id; /* if_id from ieee80211_if_init_conf */ @@ -669,7 +650,6 @@ COMMIT /* beacon sent, commit change */ } sc_updateslot; /* slot time update fsm */ int sc_slotupdate; /* slot to next advance fsm */ - struct ieee80211vap *sc_bslot[ATH_BCBUF];/* beacon xmit slots */ int sc_bnext; /* next slot for beacon xmit */ struct timer_list sc_cal_ch; /* calibration timer */ |