Changeset 41

Show
Ignore:
Timestamp:
03/15/03 19:31:49 (6 years ago)
Author:
sam
Message:

Replicated Change 73 by sam@borg_greg on 2003/03/03 13:09:17<<<

o rename sc_pci_dev to sc_pdev
o remove sc_unit and sc_devno (not used)
o calculate rx buffer size based on mtu and cache line size

and align rx buffers to cache line size

o change ath_startrecv calling convention
o change sc_txbuf handling to remove the buffer early in

ath_start so we can unlock the queue (eventually) in the
shortest window possible

o move ATH_MAXCHAN to if_ath.c since it's only used to size

the channel array passed to the hal

o change ATH_TXDESC from 4 to 1; with skbuff's everythng is

in one contiguous chunk

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • cvs-import/trunk/driver/if_ath.c

    r40 r41  
    7676static void     ath_draintxq(struct ath_softc *); 
    7777static void     ath_stoprecv(struct ath_softc *); 
    78 static int      ath_startrecv(struct ath_softc *); 
     78static int      ath_startrecv(struct net_device *); 
    7979static void     ath_next_scan(unsigned long); 
    8080static void     ath_calibrate(unsigned long); 
     
    117117        int i, error = 0, ix; 
    118118        u_int8_t *r; 
     119#define ATH_MAXCHAN     32              /* number of potential channels */ 
    119120        HAL_CHANNEL chans[ATH_MAXCHAN];         /* XXX get off stack */ 
    120121        HAL_STATUS status; 
    121  
    122         DPRINTF(("ath_attach: unit %d devid 0x%x\n", sc->sc_unit, devid)); 
     122        u8 cache_line_size; 
     123 
     124        DPRINTF(("ath_attach: devid 0x%x\n", devid)); 
    123125 
    124126        spin_lock_init(&sc->sc_lock); 
    125127        skb_queue_head_init(&sc->sc_sndq); 
     128 
     129        /* 
     130         * NB: cache line size is used to size rx buffers and align 
     131         *     various data structures. 
     132         */ 
     133        pci_read_config_byte(sc->sc_pdev, PCI_CACHE_LINE_SIZE, 
     134                &cache_line_size); 
     135        sc->sc_cachelsz = cache_line_size << 4; 
    126136 
    127137        ah = ath_hal_attach(devid, sc, 0, (void *) dev->mem_start, &status); 
     
    412422        if (ic->ic_flags & IEEE80211_F_WEPON) 
    413423                ath_initkeytable(sc); 
    414         if (ath_startrecv(sc) != 0) { 
     424        if (ath_startrecv(dev) != 0) { 
    415425                printk("%s: unable to start recv logic\n", dev->name); 
    416426                return EIO; 
     
    495505        /* free transmit queue */ 
    496506        while ((bf = TAILQ_FIRST(&sc->sc_txq)) != NULL) { 
    497                 pci_unmap_single(sc->sc_pci_dev, 
     507                pci_unmap_single(sc->sc_pdev, 
    498508                        bf->bf_skbaddr, bf->bf_skb->len, PCI_DMA_FROMDEVICE); 
    499509                dev_kfree_skb(bf->bf_skb); 
     
    556566                                break; 
    557567                        } 
     568                        TAILQ_REMOVE(&sc->sc_txbuf, bf, bf_list); 
    558569                        skb = skb_dequeue(&ic->ic_mgtq); 
    559570                        wh = (struct ieee80211_frame *) skb->data; 
     
    588599                                break; 
    589600                        } 
     601                        TAILQ_REMOVE(&sc->sc_txbuf, bf, bf_list); 
    590602                        skb = skb_dequeue(&sc->sc_sndq); 
    591603                        ic->ic_stats.tx_packets++; 
     
    598610                                sc->sc_stats.ast_tx_encap++; 
    599611                                ic->ic_stats.tx_errors++; 
     612                                TAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list); 
    600613                                continue; 
    601614                        } 
     
    614627                        sc->sc_stats.ast_tx_nonode++; 
    615628                        ic->ic_stats.tx_errors++; 
     629                        TAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list); 
    616630                        continue; 
    617631                } 
     
    634648                if (ath_tx_start(sc, ni, bf, skb)) { 
    635649                        ic->ic_stats.tx_errors++; 
     650                        TAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list); 
    636651                        continue; 
    637652                } 
     
    732747        bf = sc->sc_bcbuf; 
    733748        if (bf->bf_skb != NULL) { 
    734                 pci_unmap_single(sc->sc_pci_dev, 
     749                pci_unmap_single(sc->sc_pdev, 
    735750                        bf->bf_skbaddr, bf->bf_skb->len, PCI_DMA_TODEVICE); 
    736751                dev_kfree_skb(bf->bf_skb); 
     
    804819        skb_trim(skb, frm - skb->data); 
    805820 
    806         bf->bf_skbaddr = pci_map_single(sc->sc_pci_dev, 
     821        bf->bf_skbaddr = pci_map_single(sc->sc_pdev, 
    807822                skb->data, skb->len, PCI_DMA_TODEVICE); 
    808823        DPRINTF2(("ath_beacon_alloc: skb %p [data %p len %u] skbaddr %p\n", 
     
    849864                return; 
    850865        } 
    851         pci_dma_sync_single(sc->sc_pci_dev, 
     866        pci_dma_sync_single(sc->sc_pdev, 
    852867                bf->bf_skbaddr, bf->bf_skb->len, PCI_DMA_TODEVICE); 
    853868        ath_hal_qbeacon(ah, bf); 
     
    868883 
    869884        if (bf->bf_skb != NULL) { 
    870                 pci_unmap_single(sc->sc_pci_dev, 
     885                pci_unmap_single(sc->sc_pdev, 
    871886                        bf->bf_skbaddr, bf->bf_skb->len, PCI_DMA_TODEVICE); 
    872887                dev_kfree_skb(bf->bf_skb); 
     
    886901        sc->sc_desc_len = sizeof(struct ath_desc) * 
    887902                                (ATH_TXBUF * ATH_TXDESC + ATH_RXBUF + 1); 
    888         sc->sc_desc = pci_alloc_consistent(sc->sc_pci_dev, 
     903        sc->sc_desc = pci_alloc_consistent(sc->sc_pdev, 
    889904                                sc->sc_desc_len, &sc->sc_desc_daddr); 
    890905        if (sc->sc_desc == NULL) 
     
    901916        memset(bf, 0, bsize); 
    902917        sc->sc_bufptr = bf; 
     918 
    903919        TAILQ_INIT(&sc->sc_rxbuf); 
    904920        for (i = 0; i < ATH_RXBUF; i++, bf++, ds++) { 
     
    908924                TAILQ_INSERT_TAIL(&sc->sc_rxbuf, bf, bf_list); 
    909925        } 
     926 
    910927        TAILQ_INIT(&sc->sc_txbuf); 
    911928        for (i = 0; i < ATH_TXBUF; i++, bf++, ds += ATH_TXDESC) { 
     
    916933        } 
    917934        TAILQ_INIT(&sc->sc_txq); 
     935 
    918936        /* beacon buffer */ 
    919937        bf->bf_desc = ds; 
     
    921939        sc->sc_bcbuf = bf; 
    922940        return 0; 
    923  
    924941bad: 
    925         pci_free_consistent(sc->sc_pci_dev, sc->sc_desc_len, 
     942        pci_free_consistent(sc->sc_pdev, sc->sc_desc_len, 
    926943                sc->sc_desc, sc->sc_desc_daddr); 
    927944        sc->sc_desc = NULL; 
     
    935952 
    936953        TAILQ_FOREACH(bf, &sc->sc_txq, bf_list) { 
    937                 pci_unmap_single(sc->sc_pci_dev, 
     954                pci_unmap_single(sc->sc_pdev, 
    938955                        bf->bf_skbaddr, bf->bf_skb->len, PCI_DMA_TODEVICE); 
    939956                dev_kfree_skb(bf->bf_skb); 
     
    942959        TAILQ_FOREACH(bf, &sc->sc_rxbuf, bf_list) 
    943960                if (bf->bf_skb != NULL) { 
    944                         pci_unmap_single(sc->sc_pci_dev, 
     961                        pci_unmap_single(sc->sc_pdev, 
    945962                                bf->bf_skbaddr, bf->bf_skb->len, 
    946963                                PCI_DMA_FROMDEVICE); 
     
    950967        if (sc->sc_bcbuf != NULL) { 
    951968                bf = sc->sc_bcbuf; 
    952                 pci_unmap_single(sc->sc_pci_dev, bf->bf_skbaddr, 
     969                pci_unmap_single(sc->sc_pdev, bf->bf_skbaddr, 
    953970                        bf->bf_skb->len, PCI_DMA_TODEVICE); 
    954971                sc->sc_bcbuf = NULL; 
    955972        } 
    956973 
    957         pci_free_consistent(sc->sc_pci_dev, sc->sc_desc_len, 
     974        pci_free_consistent(sc->sc_pdev, sc->sc_desc_len, 
    958975                sc->sc_desc, sc->sc_desc_daddr); 
    959976 
     
    9851002        skb = bf->bf_skb; 
    9861003        if (skb == NULL) { 
    987                 skb = dev_alloc_skb(IEEE80211_MAX_LEN); 
     1004                int off; 
     1005 
     1006                skb = dev_alloc_skb(sc->sc_rxbufsize); 
    9881007                if (skb == NULL) 
    9891008                        return ENOMEM; 
    9901009                skb->dev = &sc->sc_ic.ic_dev; 
    9911010                bf->bf_skb = skb; 
    992         } 
    993         bf->bf_skbaddr = pci_map_single(sc->sc_pci_dev, 
    994                 skb->data, skb->len, PCI_DMA_FROMDEVICE); 
     1011 
     1012                /* align to cache line size, buffer is assumed large enough */ 
     1013                off = ((unsigned long) skb->data) % sc->sc_cachelsz; 
     1014                if (off) 
     1015                        skb_reserve(skb, sc->sc_cachelsz - off); 
     1016                bf->bf_skbaddr = pci_map_single(sc->sc_pdev, 
     1017                        skb->data, skb->len, PCI_DMA_FROMDEVICE); 
     1018        } 
    9951019 
    9961020        /* setup descriptors */ 
     
    10361060                if (rate == 72) 
    10371061                        rate = 54; 
    1038                 pci_dma_sync_single(sc->sc_pci_dev, 
     1062                pci_dma_sync_single(sc->sc_pdev, 
    10391063                        bf->bf_skbaddr, skb->len, PCI_DMA_FROMDEVICE); 
    10401064 
     
    10961120                        goto rx_next; 
    10971121                } 
    1098                 pci_unmap_single(sc->sc_pci_dev, 
     1122                pci_unmap_single(sc->sc_pdev, 
    10991123                        bf->bf_skbaddr, skb->len, PCI_DMA_FROMDEVICE); 
    11001124                bf->bf_skb = NULL; 
     
    11821206         * also calculates the number of descriptors we need. 
    11831207         */ 
    1184         bf->bf_skbaddr = pci_map_single(sc->sc_pci_dev, 
     1208        bf->bf_skbaddr = pci_map_single(sc->sc_pdev, 
    11851209                skb->data, skb->len, PCI_DMA_TODEVICE); 
    11861210        DPRINTF2(("ath_tx_start: skb %p [data %p len %u] skbaddr %x\n", 
     
    12311255            ds->ds_link, ds->ds_data, ds->ds_ctl0, ds->ds_ctl1)); 
    12321256 
    1233         TAILQ_REMOVE(&sc->sc_txbuf, bf, bf_list); 
    12341257        TAILQ_INSERT_TAIL(&sc->sc_txq, bf, bf_list); 
    12351258        if (sc->sc_txlink == NULL) { 
     
    12881311                            ATH_BITVAL(ds->ds_status0, AR_LongRetryCnt); 
    12891312                } 
    1290                 pci_unmap_single(sc->sc_pci_dev, 
     1313                pci_unmap_single(sc->sc_pdev, 
    12911314                        bf->bf_skbaddr, bf->bf_skb->len, PCI_DMA_TODEVICE); 
    12921315                dev_kfree_skb(bf->bf_skb); 
     
    13261349                        ath_printtxbuf(bf); 
    13271350#endif /* AR_DEBUG */ 
    1328                 pci_unmap_single(sc->sc_pci_dev, 
     1351                pci_unmap_single(sc->sc_pdev, 
    13291352                        bf->bf_skbaddr, bf->bf_skb->len, PCI_DMA_TODEVICE); 
    13301353                dev_kfree_skb(bf->bf_skb); 
     
    13701393 */ 
    13711394static int 
    1372 ath_startrecv(struct ath_softc *sc) 
    1373 
     1395ath_startrecv(struct net_device *dev) 
     1396
     1397        struct ath_softc *sc = dev->priv; 
    13741398        struct ath_hal *ah = sc->sc_ah; 
    13751399        struct ath_buf *bf; 
     1400 
     1401        sc->sc_rxbufsize = dev->mtu + IEEE80211_CRC_LEN + 
     1402                (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + 
     1403                 IEEE80211_WEP_CRCLEN) + (sc->sc_cachelsz - 1); 
     1404        DPRINTF(("ath_startrecv: mtu %u cachelsz %u rxbufsize %u\n", 
     1405                dev->mtu, sc->sc_cachelsz, sc->sc_rxbufsize)); 
    13761406 
    13771407        sc->sc_rxlink = NULL; 
     
    13841414                } 
    13851415        } 
     1416 
    13861417        bf = TAILQ_FIRST(&sc->sc_rxbuf); 
    13871418        ath_hal_putrxbuf(ah, bf->bf_daddr); 
     
    14471478                 * Re-enable rx framework. 
    14481479                 */ 
    1449                 if (ath_startrecv(sc) != 0) { 
     1480                if (ath_startrecv(dev) != 0) { 
    14501481                        printk("%s: ath_chan_set: unable to restart recv logic\n", dev->name); 
    14511482                        return EIO; 
  • cvs-import/trunk/driver/if_ath_pci.c

    r38 r41  
    122122        dev->priv = sc; 
    123123 
    124         sc->aps_sc.sc_pci_dev = pdev; 
     124        sc->aps_sc.sc_pdev = pdev; 
    125125 
    126126        pci_set_drvdata(pdev, dev); 
  • cvs-import/trunk/driver/if_athvar.h

    r39 r41  
    4040#define ATH_RXBUF       40              /* number of RX buffers */ 
    4141#define ATH_TXBUF       10              /* number of TX buffers */ 
    42 #define ATH_TXDESC      4               /* number of descriptors per buffer */ 
    43 #define ATH_MAXCHAN     32              /* number of potential channels */ 
     42#define ATH_TXDESC      1               /* number of descriptors per buffer */ 
    4443 
    4544/* statistics for node */ 
     
    9190        spinlock_t              sc_lock; 
    9291        struct ath_hal          *sc_ah;         /* Atheros HAL */ 
    93         struct pci_dev          *sc_pci_dev;    /* associated pci device */ 
    94         int                     sc_unit;        /* logical card number */ 
    95         int                     sc_devno;       /* PCI device # */ 
     92        struct pci_dev          *sc_pdev;       /* associated pci device */ 
    9693        int                     (*sc_enable)(struct ath_softc *); 
    9794        void                    (*sc_disable)(struct ath_softc *); 
     
    9996                                sc_invalid  : 1,/* ??? deactivated */ 
    10097                                sc_oactive  : 1;/* output processing active */ 
     98        int                     sc_cachelsz;    /* system cache line size */ 
     99        int                     sc_rxbufsize;   /* rx size based on mtu */ 
    101100        TAILQ_HEAD(, ath_buf)   sc_rxbuf,       /* receive buffer */ 
    102101                                sc_txbuf,       /* transmit buffer */