Ticket #1252: tmp.diff

File tmp.diff, 6.3 kB (added by mentor, 5 years ago)

Patch to change fast frame buffer handling

  • ath/if_athvar.h

    old new  
    382382        /* XXX: combine this with bf_skbaddr if it ever changes to accommodate 
    383383         *      multiple segments. 
    384384         */ 
    385         u_int16_t bf_numdescff;                               /* number of descs used for FF (these are extra) */ 
     385        u_int16_t bf_numdesc;                         /* number of descs used for FF (these are extra) */ 
    386386        u_int32_t bf_queueage;                          /* "age" of txq when this buffer placed on stageq */ 
    387387        dma_addr_t bf_skbaddrff[ATH_TXDESC - 1];        /* extra addrs for FF */ 
    388388#endif 
  • ath/if_ath.c

    old new  
    23112311         
    23122312        bf->bf_skb = skb; 
    23132313        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; 
    23162317#endif 
    23172318         
    23182319        /* setup descriptors */ 
     
    48924893                         */ 
    48934894                        while (bf) { 
    48944895#ifdef ATH_SUPERG_FF 
    4895                                 ds = &bf->bf_desc[bf->bf_numdescff]; 
     4896                                ds = &bf->bf_desc[bf->bf_numdesc - 1]; 
    48964897#else 
    48974898                                ds = bf->bf_desc;               /* NB: last descriptor */ 
    48984899#endif 
     
    49254926                                                 * link the descriptors 
    49264927                                                 */ 
    49274928#ifdef ATH_SUPERG_FF 
    4928                                                 ds = &prev->bf_desc[prev->bf_numdescff]; 
     4929                                                ds = &prev->bf_desc[prev->bf_numdesc - 1]; 
    49294930#else 
    49304931                                                ds = prev->bf_desc;     /* NB: last descriptor */ 
    49314932#endif 
     
    49504951                                        bf = STAILQ_NEXT(prev, bf_list); 
    49514952                                        if (!bf) { /* prev is the last one on the list */ 
    49524953#ifdef ATH_SUPERG_FF 
    4953                                                 ds = &prev->bf_desc[prev->bf_numdescff]; 
     4954                                                ds = &prev->bf_desc[prev->bf_numdesc - 1]; 
    49544955#else 
    49554956                                                ds = prev->bf_desc;     /* NB: last descriptor */ 
    49564957#endif 
     
    50235024                 */ 
    50245025                while (bf) { 
    50255026#ifdef ATH_SUPERG_FF 
    5026                         ds = &bf->bf_desc[bf->bf_numdescff]; 
     5027                        ds = &bf->bf_desc[bf->bf_numdesc - 1]; 
    50275028#else 
    50285029                        ds = bf->bf_desc;               /* NB: last descriptor */ 
    50295030#endif 
     
    50985099                                bf = STAILQ_NEXT(prev, bf_list); 
    50995100                                if (!bf) { /* prev is the last one on the list */ 
    51005101#ifdef ATH_SUPERG_FF 
    5101                                         ds = &prev->bf_desc[prev->bf_numdescff]; 
     5102                                        ds = &prev->bf_desc[prev->bf_numdesc - 1]; 
    51025103#else 
    51035104                                        ds = prev->bf_desc;     /* NB: last descriptor */ 
    51045105#endif 
     
    51625163                                bf = STAILQ_FIRST(&txq->axq_q); 
    51635164                                while (bf) { 
    51645165#ifdef ATH_SUPERG_FF 
    5165                                         ds = &bf->bf_desc[bf->bf_numdescff]; 
     5166                                        ds = &bf->bf_desc[bf->bf_numdesc - 1]; 
    51665167#else 
    51675168                                        ds = bf->bf_desc;       /* NB: last descriptor */ 
    51685169#endif 
     
    66726673        DPRINTF(sc, ATH_DEBUG_XMIT, "%s: skb %p [data %p len %u] skbaddr %llx\n", 
    66736674                __func__, skb, skb->data, skb->len, ito64(bf->bf_skbaddr)); 
    66746675#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)); 
    66796676        /* NB: ensure skb->len had been updated for each skb so we don't need pktlen */ 
    66806677        { 
    66816678                struct sk_buff *skbtmp = skb; 
    6682                 unsigned int i = 0; 
     6679                int i = 0; 
    66836680 
     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)); 
    66846685                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, 
    66866687                                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", 
    66886689                                __func__, i, skbtmp, skbtmp->data, skbtmp->len, 
    6689                                 ito64(bf->bf_skbaddrff[i])); 
    6690                         i++; 
     6690                                ito64(bf->bf_skbaddrff[i-1])); 
    66916691                } 
    6692                 bf->bf_numdescff = i
     6692                bf->bf_numdesc = i + 1
    66936693        } 
    66946694#endif /* ATH_SUPERG_FF */ 
    66956695        bf->bf_skb = skb; 
     
    70997099                        __func__, M_FLAG_GET(skb, M_UAPSD) ? 0 : txq->axq_qnum, 
    71007100                        ds, ds->ds_link, ds->ds_data, ds->ds_ctl0, ds->ds_ctl1, 
    71017101                        ds->ds_hw[0], ds->ds_hw[1]); 
    7102                 for (i = 0, skbtmp = skbtmp->next; i < bf->bf_numdescff; i++, skbtmp = skbtmp->next) { 
     7102                for (i = 0, skbtmp = skbtmp->next; i < bf->bf_numdesc - 1; i++, skbtmp = skbtmp->next) { 
    71037103                        ds++; 
    71047104                        ds->ds_link = (skbtmp->next == NULL) ? 0 : bf->bf_daddr + (sizeof(*ds) * (i + 2)); 
    71057105                        ds->ds_data = bf->bf_skbaddrff[i]; 
     
    71907190                } 
    71917191 
    71927192#ifdef ATH_SUPERG_FF 
    7193                 ds = &bf->bf_desc[bf->bf_numdescff]; 
     7193                ds = &bf->bf_desc[bf->bf_numdesc - 1]; 
    71947194                DPRINTF(sc, ATH_DEBUG_TX_PROC, "%s: frame's last desc: %p\n", 
    71957195                        __func__, ds); 
    71967196#else 
     
    72237223                                sc->sc_stats.ast_ant_tx[txant]++; 
    72247224                                sc->sc_ant_tx[txant]++; 
    72257225#ifdef ATH_SUPERG_FF 
    7226                                 if (bf->bf_numdescff > 0
     7226                                if (bf->bf_numdesc > 1
    72277227                                        ni->ni_vap->iv_stats.is_tx_ffokcnt++; 
    72287228#endif 
    72297229                                if (ds->ds_txstat.ts_rate & HAL_TXSTAT_ALTRATE) 
     
    72387238                                ni->ni_inact = ni->ni_inact_reload; 
    72397239                        } else { 
    72407240#ifdef ATH_SUPERG_FF 
    7241                                 if (bf->bf_numdescff > 0
     7241                                if (bf->bf_numdesc > 1
    72427242                                        ni->ni_vap->iv_stats.is_tx_fferrcnt++; 
    72437243#endif 
    72447244                                if (ds->ds_txstat.ts_status & HAL_TXERR_XRETRY) { 
     
    73157315                        } 
    73167316                } 
    73177317 
    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  
    73217318#ifdef ATH_SUPERG_FF 
    73227319                { 
    7323                         struct sk_buff *skbnext = bf->bf_skb, *skb = NULL
    7324                         unsigned int i; 
     7320                        struct sk_buff *skbfree, *skb = bf->bf_skb
     7321                        int i; 
    73257322 
    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; 
    73317333                                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); 
    73347336                        } 
    73357337                } 
    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); 
    73377342#endif 
    7338  
    73397343                bf->bf_skb = NULL; 
    73407344                bf->bf_node = NULL; 
    73417345