Ticket #1252: tmp.diff
| File tmp.diff, 6.3 kB (added by mentor, 5 years ago) |
|---|
-
ath/if_athvar.h
old new 382 382 /* XXX: combine this with bf_skbaddr if it ever changes to accommodate 383 383 * multiple segments. 384 384 */ 385 u_int16_t bf_numdesc ff; /* number of descs used for FF (these are extra) */385 u_int16_t bf_numdesc; /* number of descs used for FF (these are extra) */ 386 386 u_int32_t bf_queueage; /* "age" of txq when this buffer placed on stageq */ 387 387 dma_addr_t bf_skbaddrff[ATH_TXDESC - 1]; /* extra addrs for FF */ 388 388 #endif -
ath/if_ath.c
old new 2311 2311 2312 2312 bf->bf_skb = skb; 2313 2313 bf->bf_node = NULL; 2314 #ifdef ATH_SUPERG_FF 2315 bf->bf_numdescff = 0; 2314 2315 #ifdef ATH_SUPERG_FF 2316 bf->bf_numdesc = 1; 2316 2317 #endif 2317 2318 2318 2319 /* setup descriptors */ … … 4892 4893 */ 4893 4894 while (bf) { 4894 4895 #ifdef ATH_SUPERG_FF 4895 ds = &bf->bf_desc[bf->bf_numdesc ff];4896 ds = &bf->bf_desc[bf->bf_numdesc - 1]; 4896 4897 #else 4897 4898 ds = bf->bf_desc; /* NB: last descriptor */ 4898 4899 #endif … … 4925 4926 * link the descriptors 4926 4927 */ 4927 4928 #ifdef ATH_SUPERG_FF 4928 ds = &prev->bf_desc[prev->bf_numdesc ff];4929 ds = &prev->bf_desc[prev->bf_numdesc - 1]; 4929 4930 #else 4930 4931 ds = prev->bf_desc; /* NB: last descriptor */ 4931 4932 #endif … … 4950 4951 bf = STAILQ_NEXT(prev, bf_list); 4951 4952 if (!bf) { /* prev is the last one on the list */ 4952 4953 #ifdef ATH_SUPERG_FF 4953 ds = &prev->bf_desc[prev->bf_numdesc ff];4954 ds = &prev->bf_desc[prev->bf_numdesc - 1]; 4954 4955 #else 4955 4956 ds = prev->bf_desc; /* NB: last descriptor */ 4956 4957 #endif … … 5023 5024 */ 5024 5025 while (bf) { 5025 5026 #ifdef ATH_SUPERG_FF 5026 ds = &bf->bf_desc[bf->bf_numdesc ff];5027 ds = &bf->bf_desc[bf->bf_numdesc - 1]; 5027 5028 #else 5028 5029 ds = bf->bf_desc; /* NB: last descriptor */ 5029 5030 #endif … … 5098 5099 bf = STAILQ_NEXT(prev, bf_list); 5099 5100 if (!bf) { /* prev is the last one on the list */ 5100 5101 #ifdef ATH_SUPERG_FF 5101 ds = &prev->bf_desc[prev->bf_numdesc ff];5102 ds = &prev->bf_desc[prev->bf_numdesc - 1]; 5102 5103 #else 5103 5104 ds = prev->bf_desc; /* NB: last descriptor */ 5104 5105 #endif … … 5162 5163 bf = STAILQ_FIRST(&txq->axq_q); 5163 5164 while (bf) { 5164 5165 #ifdef ATH_SUPERG_FF 5165 ds = &bf->bf_desc[bf->bf_numdesc ff];5166 ds = &bf->bf_desc[bf->bf_numdesc - 1]; 5166 5167 #else 5167 5168 ds = bf->bf_desc; /* NB: last descriptor */ 5168 5169 #endif … … 6672 6673 DPRINTF(sc, ATH_DEBUG_XMIT, "%s: skb %p [data %p len %u] skbaddr %llx\n", 6673 6674 __func__, skb, skb->data, skb->len, ito64(bf->bf_skbaddr)); 6674 6675 #else /* ATH_SUPERG_FF case */ 6675 bf->bf_skbaddr = bus_map_single(sc->sc_bdev,6676 skb->data, skb->len, BUS_DMA_TODEVICE);6677 DPRINTF(sc, ATH_DEBUG_XMIT, "%s: skb %p [data %p len %u] skbaddr %llx\n",6678 __func__, skb, skb->data, skb->len, ito64(bf->bf_skbaddr));6679 6676 /* NB: ensure skb->len had been updated for each skb so we don't need pktlen */ 6680 6677 { 6681 6678 struct sk_buff *skbtmp = skb; 6682 unsignedint i = 0;6679 int i = 0; 6683 6680 6681 bf->bf_skbaddr = bus_map_single(sc->sc_bdev, 6682 skb->data, skb->len, BUS_DMA_TODEVICE); 6683 DPRINTF(sc, ATH_DEBUG_XMIT, "%s: skb%d %p [data %p len %u] skbaddr %llx\n", 6684 __func__, i, skb, skb->data, skb->len, ito64(bf->bf_skbaddr)); 6684 6685 while ((skbtmp = skbtmp->next)) { 6685 bf->bf_skbaddrff[i ] = bus_map_single(sc->sc_bdev,6686 bf->bf_skbaddrff[i++] = bus_map_single(sc->sc_bdev, 6686 6687 skbtmp->data, skbtmp->len, BUS_DMA_TODEVICE); 6687 DPRINTF(sc, ATH_DEBUG_XMIT, "%s: skb%d (FF)%p [data %p len %u] skbaddr %llx\n",6688 DPRINTF(sc, ATH_DEBUG_XMIT, "%s: skb%d %p [data %p len %u] skbaddr %llx\n", 6688 6689 __func__, i, skbtmp, skbtmp->data, skbtmp->len, 6689 ito64(bf->bf_skbaddrff[i])); 6690 i++; 6690 ito64(bf->bf_skbaddrff[i-1])); 6691 6691 } 6692 bf->bf_numdesc ff = i;6692 bf->bf_numdesc = i + 1; 6693 6693 } 6694 6694 #endif /* ATH_SUPERG_FF */ 6695 6695 bf->bf_skb = skb; … … 7099 7099 __func__, M_FLAG_GET(skb, M_UAPSD) ? 0 : txq->axq_qnum, 7100 7100 ds, ds->ds_link, ds->ds_data, ds->ds_ctl0, ds->ds_ctl1, 7101 7101 ds->ds_hw[0], ds->ds_hw[1]); 7102 for (i = 0, skbtmp = skbtmp->next; i < bf->bf_numdesc ff; i++, skbtmp = skbtmp->next) {7102 for (i = 0, skbtmp = skbtmp->next; i < bf->bf_numdesc - 1; i++, skbtmp = skbtmp->next) { 7103 7103 ds++; 7104 7104 ds->ds_link = (skbtmp->next == NULL) ? 0 : bf->bf_daddr + (sizeof(*ds) * (i + 2)); 7105 7105 ds->ds_data = bf->bf_skbaddrff[i]; … … 7190 7190 } 7191 7191 7192 7192 #ifdef ATH_SUPERG_FF 7193 ds = &bf->bf_desc[bf->bf_numdesc ff];7193 ds = &bf->bf_desc[bf->bf_numdesc - 1]; 7194 7194 DPRINTF(sc, ATH_DEBUG_TX_PROC, "%s: frame's last desc: %p\n", 7195 7195 __func__, ds); 7196 7196 #else … … 7223 7223 sc->sc_stats.ast_ant_tx[txant]++; 7224 7224 sc->sc_ant_tx[txant]++; 7225 7225 #ifdef ATH_SUPERG_FF 7226 if (bf->bf_numdesc ff > 0)7226 if (bf->bf_numdesc > 1) 7227 7227 ni->ni_vap->iv_stats.is_tx_ffokcnt++; 7228 7228 #endif 7229 7229 if (ds->ds_txstat.ts_rate & HAL_TXSTAT_ALTRATE) … … 7238 7238 ni->ni_inact = ni->ni_inact_reload; 7239 7239 } else { 7240 7240 #ifdef ATH_SUPERG_FF 7241 if (bf->bf_numdesc ff > 0)7241 if (bf->bf_numdesc > 1) 7242 7242 ni->ni_vap->iv_stats.is_tx_fferrcnt++; 7243 7243 #endif 7244 7244 if (ds->ds_txstat.ts_status & HAL_TXERR_XRETRY) { … … 7315 7315 } 7316 7316 } 7317 7317 7318 DPRINTF(sc, ATH_DEBUG_TX_PROC, "%s: free skb %p\n", __func__, bf->bf_skb);7319 ath_tx_capture(sc->sc_dev, ds, bf->bf_skb);7320 7321 7318 #ifdef ATH_SUPERG_FF 7322 7319 { 7323 struct sk_buff *skb next = bf->bf_skb, *skb = NULL;7324 unsignedint i;7320 struct sk_buff *skbfree, *skb = bf->bf_skb; 7321 int i; 7325 7322 7326 for (i = 0; i < bf->bf_numdescff; i++) { 7327 skb = skbnext; 7328 skbnext = skb->next; 7329 bus_unmap_single(sc->sc_bdev, bf->bf_skbaddrff[i], 7330 skb->len, BUS_DMA_TODEVICE); 7323 skbfree = skb; 7324 skb = skb->next; 7325 DPRINTF(sc, ATH_DEBUG_TX_PROC, "%s: free skb %p\n", 7326 __func__, skbfree); 7327 ath_tx_capture(sc->sc_dev, ds, skbfree); 7328 for (i = 1; i < bf->bf_numdesc; i++) { 7329 bus_unmap_single(sc->sc_bdev, bf->bf_skbaddrff[i-1], 7330 skb->len, BUS_DMA_TODEVICE); 7331 skbfree = skb; 7332 skb = skb->next; 7331 7333 DPRINTF(sc, ATH_DEBUG_TX_PROC, "%s: free skb %p\n", 7332 __func__, skb );7333 ath_tx_capture(sc->sc_dev, ds, skb );7334 __func__, skbfree); 7335 ath_tx_capture(sc->sc_dev, ds, skbfree); 7334 7336 } 7335 7337 } 7336 bf->bf_numdescff = 0; 7338 bf->bf_numdesc = 0; 7339 #else 7340 DPRINTF(sc, ATH_DEBUG_TX_PROC, "%s: free skb %p\n", __func__, bf->bf_skb); 7341 ath_tx_capture(sc->sc_dev, ds, bf->bf_skb); 7337 7342 #endif 7338 7339 7343 bf->bf_skb = NULL; 7340 7344 bf->bf_node = NULL; 7341 7345
