···177177178178config ATM_NICSTAR179179 tristate "IDT 77201 (NICStAR) (ForeRunnerLE)"180180- depends on PCI && !64BIT && VIRT_TO_BUS180180+ depends on PCI181181 help182182 The NICStAR chipset family is used in a large number of ATM NICs for183183 25 and for 155 Mbps, including IDT cards and the Fore ForeRunnerLE
+218-162
drivers/atm/nicstar.c
···3838#include <linux/atmdev.h>3939#include <linux/atm.h>4040#include <linux/pci.h>4141+#include <linux/dma-mapping.h>4142#include <linux/types.h>4243#include <linux/string.h>4344#include <linux/delay.h>···4847#include <linux/interrupt.h>4948#include <linux/bitops.h>5049#include <linux/slab.h>5050+#include <linux/idr.h>5151#include <asm/io.h>5252#include <asm/uaccess.h>5353#include <asm/atomic.h>···5957#ifdef CONFIG_ATM_NICSTAR_USE_IDT771056058#include "idt77105.h"6159#endif /* CONFIG_ATM_NICSTAR_USE_IDT77105 */6262-6363-#if BITS_PER_LONG != 326464-# error FIXME: this driver requires a 32-bit platform6565-#endif66606761/* Additional code */6862···107109108110#define NS_DELAY mdelay(1)109111110110-#define ALIGN_BUS_ADDR(addr, alignment) \111111- ((((u32) (addr)) + (((u32) (alignment)) - 1)) & ~(((u32) (alignment)) - 1))112112-#define ALIGN_ADDRESS(addr, alignment) \113113- bus_to_virt(ALIGN_BUS_ADDR(virt_to_bus(addr), alignment))114114-115115-#undef CEIL112112+#define PTR_DIFF(a, b) ((u32)((unsigned long)(a) - (unsigned long)(b)))116113117114#ifndef ATM_SKB118115#define ATM_SKB(s) (&(s)->atm)119116#endif117117+118118+#define scq_virt_to_bus(scq, p) \119119+ (scq->dma + ((unsigned long)(p) - (unsigned long)(scq)->org))120120121121/* Function declarations */122122···123127 int count);124128static int __devinit ns_init_card(int i, struct pci_dev *pcidev);125129static void __devinit ns_init_card_error(ns_dev * card, int error);126126-static scq_info *get_scq(int size, u32 scd);127127-static void free_scq(scq_info * scq, struct atm_vcc *vcc);130130+static scq_info *get_scq(ns_dev *card, int size, u32 scd);131131+static void free_scq(ns_dev *card, scq_info * scq, struct atm_vcc *vcc);128132static void push_rxbufs(ns_dev *, struct sk_buff *);129133static irqreturn_t ns_irq_handler(int irq, void *dev_id);130134static int ns_open(struct atm_vcc *vcc);···149153static void dequeue_lg_buf(ns_dev * card, struct sk_buff *lb);150154static int ns_proc_read(struct atm_dev *dev, loff_t * pos, char *page);151155static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user * arg);156156+#ifdef EXTRA_DEBUG152157static void which_list(ns_dev * card, struct sk_buff *skb);158158+#endif153159static void ns_poll(unsigned long arg);154160static int ns_parse_mac(char *mac, unsigned char *esi);155161static short ns_h2i(char c);···247249 dev_kfree_skb_any(lb);248250 while ((sb = skb_dequeue(&card->sbpool.queue)) != NULL)249251 dev_kfree_skb_any(sb);250250- free_scq(card->scq0, NULL);252252+ free_scq(card, card->scq0, NULL);251253 for (j = 0; j < NS_FRSCD_NUM; j++) {252254 if (card->scd2vc[j] != NULL)253253- free_scq(card->scd2vc[j]->scq, card->scd2vc[j]->tx_vcc);255255+ free_scq(card, card->scd2vc[j]->scq, card->scd2vc[j]->tx_vcc);254256 }255255- kfree(card->rsq.org);256256- kfree(card->tsq.org);257257+ idr_remove_all(&card->idr);258258+ idr_destroy(&card->idr);259259+ pci_free_consistent(card->pcidev, NS_RSQSIZE + NS_RSQ_ALIGNMENT,260260+ card->rsq.org, card->rsq.dma);261261+ pci_free_consistent(card->pcidev, NS_TSQSIZE + NS_TSQ_ALIGNMENT,262262+ card->tsq.org, card->tsq.dma);257263 free_irq(card->pcidev->irq, card);258264 iounmap(card->membase);259265 kfree(card);···373371 ns_init_card_error(card, error);374372 return error;375373 }374374+ if ((pci_set_dma_mask(pcidev, DMA_BIT_MASK(32)) != 0) ||375375+ (pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32)) != 0)) {376376+ printk(KERN_WARNING377377+ "nicstar%d: No suitable DMA available.\n", i);378378+ error = 2;379379+ ns_init_card_error(card, error);380380+ return error;381381+ }376382377383 if ((card = kmalloc(sizeof(ns_dev), GFP_KERNEL)) == NULL) {378384 printk···407397 ns_init_card_error(card, error);408398 return error;409399 }410410- PRINTK("nicstar%d: membase at 0x%x.\n", i, card->membase);400400+ PRINTK("nicstar%d: membase at 0x%p.\n", i, card->membase);411401412402 pci_set_master(pcidev);413403···538528 writel(0x00000000, card->membase + VPM);539529540530 /* Initialize TSQ */541541- card->tsq.org = kmalloc(NS_TSQSIZE + NS_TSQ_ALIGNMENT, GFP_KERNEL);531531+ card->tsq.org = pci_alloc_consistent(card->pcidev,532532+ NS_TSQSIZE + NS_TSQ_ALIGNMENT,533533+ &card->tsq.dma);542534 if (card->tsq.org == NULL) {543535 printk("nicstar%d: can't allocate TSQ.\n", i);544536 error = 10;545537 ns_init_card_error(card, error);546538 return error;547539 }548548- card->tsq.base =549549- (ns_tsi *) ALIGN_ADDRESS(card->tsq.org, NS_TSQ_ALIGNMENT);540540+ card->tsq.base = PTR_ALIGN(card->tsq.org, NS_TSQ_ALIGNMENT);550541 card->tsq.next = card->tsq.base;551542 card->tsq.last = card->tsq.base + (NS_TSQ_NUM_ENTRIES - 1);552543 for (j = 0; j < NS_TSQ_NUM_ENTRIES; j++)553544 ns_tsi_init(card->tsq.base + j);554545 writel(0x00000000, card->membase + TSQH);555555- writel((u32) virt_to_bus(card->tsq.base), card->membase + TSQB);556556- PRINTK("nicstar%d: TSQ base at 0x%x 0x%x 0x%x.\n", i,557557- (u32) card->tsq.base, (u32) virt_to_bus(card->tsq.base),558558- readl(card->membase + TSQB));546546+ writel(ALIGN(card->tsq.dma, NS_TSQ_ALIGNMENT), card->membase + TSQB);547547+ PRINTK("nicstar%d: TSQ base at 0x%p.\n", i, card->tsq.base);559548560549 /* Initialize RSQ */561561- card->rsq.org = kmalloc(NS_RSQSIZE + NS_RSQ_ALIGNMENT, GFP_KERNEL);550550+ card->rsq.org = pci_alloc_consistent(card->pcidev,551551+ NS_RSQSIZE + NS_RSQ_ALIGNMENT,552552+ &card->rsq.dma);562553 if (card->rsq.org == NULL) {563554 printk("nicstar%d: can't allocate RSQ.\n", i);564555 error = 11;565556 ns_init_card_error(card, error);566557 return error;567558 }568568- card->rsq.base =569569- (ns_rsqe *) ALIGN_ADDRESS(card->rsq.org, NS_RSQ_ALIGNMENT);559559+ card->rsq.base = PTR_ALIGN(card->rsq.org, NS_RSQ_ALIGNMENT);570560 card->rsq.next = card->rsq.base;571561 card->rsq.last = card->rsq.base + (NS_RSQ_NUM_ENTRIES - 1);572562 for (j = 0; j < NS_RSQ_NUM_ENTRIES; j++)573563 ns_rsqe_init(card->rsq.base + j);574564 writel(0x00000000, card->membase + RSQH);575575- writel((u32) virt_to_bus(card->rsq.base), card->membase + RSQB);576576- PRINTK("nicstar%d: RSQ base at 0x%x.\n", i, (u32) card->rsq.base);565565+ writel(ALIGN(card->rsq.dma, NS_RSQ_ALIGNMENT), card->membase + RSQB);566566+ PRINTK("nicstar%d: RSQ base at 0x%p.\n", i, card->rsq.base);577567578568 /* Initialize SCQ0, the only VBR SCQ used */579569 card->scq1 = NULL;580570 card->scq2 = NULL;581581- card->scq0 = get_scq(VBR_SCQSIZE, NS_VRSCD0);571571+ card->scq0 = get_scq(card, VBR_SCQSIZE, NS_VRSCD0);582572 if (card->scq0 == NULL) {583573 printk("nicstar%d: can't get SCQ0.\n", i);584574 error = 12;585575 ns_init_card_error(card, error);586576 return error;587577 }588588- u32d[0] = (u32) virt_to_bus(card->scq0->base);578578+ u32d[0] = scq_virt_to_bus(card->scq0, card->scq0->base);589579 u32d[1] = (u32) 0x00000000;590580 u32d[2] = (u32) 0xffffffff;591581 u32d[3] = (u32) 0x00000000;···593583 ns_write_sram(card, NS_VRSCD1, u32d, 4); /* These last two won't be used */594584 ns_write_sram(card, NS_VRSCD2, u32d, 4); /* but are initialized, just in case... */595585 card->scq0->scd = NS_VRSCD0;596596- PRINTK("nicstar%d: VBR-SCQ0 base at 0x%x.\n", i,597597- (u32) card->scq0->base);586586+ PRINTK("nicstar%d: VBR-SCQ0 base at 0x%p.\n", i, card->scq0->base);598587599588 /* Initialize TSTs */600589 card->tst_addr = NS_TST0;···649640650641 card->efbie = 1; /* To prevent push_rxbufs from enabling the interrupt */651642643643+ idr_init(&card->idr);644644+652645 /* Pre-allocate some huge buffers */653646 skb_queue_head_init(&card->hbpool.queue);654647 card->hbpool.count = 0;···665654 ns_init_card_error(card, error);666655 return error;667656 }668668- NS_SKB_CB(hb)->buf_type = BUF_NONE;657657+ NS_PRV_BUFTYPE(hb) = BUF_NONE;669658 skb_queue_tail(&card->hbpool.queue, hb);670659 card->hbpool.count++;671660 }···684673 ns_init_card_error(card, error);685674 return error;686675 }687687- NS_SKB_CB(lb)->buf_type = BUF_LG;676676+ NS_PRV_BUFTYPE(lb) = BUF_LG;688677 skb_queue_tail(&card->lbpool.queue, lb);689678 skb_reserve(lb, NS_SMBUFSIZE);690679 push_rxbufs(card, lb);691680 /* Due to the implementation of push_rxbufs() this is 1, not 0 */692681 if (j == 1) {693682 card->rcbuf = lb;694694- card->rawch = (u32) virt_to_bus(lb->data);683683+ card->rawcell = (struct ns_rcqe *) lb->data;684684+ card->rawch = NS_PRV_DMA(lb);695685 }696686 }697687 /* Test for strange behaviour which leads to crashes */···720708 ns_init_card_error(card, error);721709 return error;722710 }723723- NS_SKB_CB(sb)->buf_type = BUF_SM;711711+ NS_PRV_BUFTYPE(sb) = BUF_SM;724712 skb_queue_tail(&card->sbpool.queue, sb);725713 skb_reserve(sb, NS_AAL0_HEADER);726714 push_rxbufs(card, sb);···750738 ns_init_card_error(card, error);751739 return error;752740 }753753- NS_SKB_CB(iovb)->buf_type = BUF_NONE;741741+ NS_PRV_BUFTYPE(iovb) = BUF_NONE;754742 skb_queue_tail(&card->iovpool.queue, iovb);755743 card->iovpool.count++;756744 }···837825 struct sk_buff *sb;838826 while ((sb = skb_dequeue(&card->sbpool.queue)) != NULL)839827 dev_kfree_skb_any(sb);840840- free_scq(card->scq0, NULL);828828+ free_scq(card, card->scq0, NULL);841829 }842830 if (error >= 14) {843831 struct sk_buff *lb;···867855 }868856}869857870870-static scq_info *get_scq(int size, u32 scd)858858+static scq_info *get_scq(ns_dev *card, int size, u32 scd)871859{872860 scq_info *scq;873861 int i;···876864 return NULL;877865878866 scq = kmalloc(sizeof(scq_info), GFP_KERNEL);879879- if (scq == NULL)867867+ if (!scq)880868 return NULL;881881- scq->org = kmalloc(2 * size, GFP_KERNEL);882882- if (scq->org == NULL) {869869+ scq->org = pci_alloc_consistent(card->pcidev, 2 * size, &scq->dma);870870+ if (!scq->org) {883871 kfree(scq);884872 return NULL;885873 }886874 scq->skb = kmalloc(sizeof(struct sk_buff *) *887875 (size / NS_SCQE_SIZE), GFP_KERNEL);888888- if (scq->skb == NULL) {876876+ if (!scq->skb) {889877 kfree(scq->org);890878 kfree(scq);891879 return NULL;892880 }893881 scq->num_entries = size / NS_SCQE_SIZE;894894- scq->base = (ns_scqe *) ALIGN_ADDRESS(scq->org, size);882882+ scq->base = PTR_ALIGN(scq->org, size);895883 scq->next = scq->base;896884 scq->last = scq->base + (scq->num_entries - 1);897885 scq->tail = scq->last;···909897}910898911899/* For variable rate SCQ vcc must be NULL */912912-static void free_scq(scq_info * scq, struct atm_vcc *vcc)900900+static void free_scq(ns_dev *card, scq_info *scq, struct atm_vcc *vcc)913901{914902 int i;915903···940928 }941929 }942930 kfree(scq->skb);943943- kfree(scq->org);931931+ pci_free_consistent(card->pcidev,932932+ 2 * (scq->num_entries == VBR_SCQ_NUM_ENTRIES ?933933+ VBR_SCQSIZE : CBR_SCQSIZE),934934+ scq->org, scq->dma);944935 kfree(scq);945936}946937···951936 or large buffer(s) cast to u32. */952937static void push_rxbufs(ns_dev * card, struct sk_buff *skb)953938{954954- struct ns_skb_cb *cb = NS_SKB_CB(skb);955955- u32 handle1, addr1;956956- u32 handle2, addr2;939939+ struct sk_buff *handle1, *handle2;940940+ u32 id1 = 0, id2 = 0;941941+ u32 addr1, addr2;957942 u32 stat;958943 unsigned long flags;944944+ int err;959945960946 /* *BARF* */961961- handle2 = addr2 = 0;962962- handle1 = (u32) skb;963963- addr1 = (u32) virt_to_bus(skb->data);947947+ handle2 = NULL;948948+ addr2 = 0;949949+ handle1 = skb;950950+ addr1 = pci_map_single(card->pcidev,951951+ skb->data,952952+ (NS_PRV_BUFTYPE(skb) == BUF_SM953953+ ? NS_SMSKBSIZE : NS_LGSKBSIZE),954954+ PCI_DMA_TODEVICE);955955+ NS_PRV_DMA(skb) = addr1; /* save so we can unmap later */964956965957#ifdef GENERAL_DEBUG966958 if (!addr1)···978956 stat = readl(card->membase + STAT);979957 card->sbfqc = ns_stat_sfbqc_get(stat);980958 card->lbfqc = ns_stat_lfbqc_get(stat);981981- if (cb->buf_type == BUF_SM) {959959+ if (NS_PRV_BUFTYPE(skb) == BUF_SM) {982960 if (!addr2) {983961 if (card->sm_addr) {984962 addr2 = card->sm_addr;···1008986 }10099871010988 if (addr2) {10111011- if (cb->buf_type == BUF_SM) {989989+ if (NS_PRV_BUFTYPE(skb) == BUF_SM) {1012990 if (card->sbfqc >= card->sbnr.max) {10131013- skb_unlink((struct sk_buff *)handle1,10141014- &card->sbpool.queue);10151015- dev_kfree_skb_any((struct sk_buff *)handle1);10161016- skb_unlink((struct sk_buff *)handle2,10171017- &card->sbpool.queue);10181018- dev_kfree_skb_any((struct sk_buff *)handle2);991991+ skb_unlink(handle1, &card->sbpool.queue);992992+ dev_kfree_skb_any(handle1);993993+ skb_unlink(handle2, &card->sbpool.queue);994994+ dev_kfree_skb_any(handle2);1019995 return;1020996 } else1021997 card->sbfqc += 2;1022998 } else { /* (buf_type == BUF_LG) */102399910241000 if (card->lbfqc >= card->lbnr.max) {10251025- skb_unlink((struct sk_buff *)handle1,10261026- &card->lbpool.queue);10271027- dev_kfree_skb_any((struct sk_buff *)handle1);10281028- skb_unlink((struct sk_buff *)handle2,10291029- &card->lbpool.queue);10301030- dev_kfree_skb_any((struct sk_buff *)handle2);10011001+ skb_unlink(handle1, &card->lbpool.queue);10021002+ dev_kfree_skb_any(handle1);10031003+ skb_unlink(handle2, &card->lbpool.queue);10041004+ dev_kfree_skb_any(handle2);10311005 return;10321006 } else10331007 card->lbfqc += 2;10341008 }1035100910361036- spin_lock_irqsave(&card->res_lock, flags);10101010+ do {10111011+ if (!idr_pre_get(&card->idr, GFP_ATOMIC)) {10121012+ printk(KERN_ERR10131013+ "nicstar%d: no free memory for idr\n",10141014+ card->index);10151015+ goto out;10161016+ }1037101710181018+ if (!id1)10191019+ err = idr_get_new_above(&card->idr, handle1, 0, &id1);10201020+10211021+ if (!id2 && err == 0)10221022+ err = idr_get_new_above(&card->idr, handle2, 0, &id2);10231023+10241024+ } while (err == -EAGAIN);10251025+10261026+ if (err)10271027+ goto out;10281028+10291029+ spin_lock_irqsave(&card->res_lock, flags);10381030 while (CMD_BUSY(card)) ;10391031 writel(addr2, card->membase + DR3);10401040- writel(handle2, card->membase + DR2);10321032+ writel(id2, card->membase + DR2);10411033 writel(addr1, card->membase + DR1);10421042- writel(handle1, card->membase + DR0);10431043- writel(NS_CMD_WRITE_FREEBUFQ | cb->buf_type,10341034+ writel(id1, card->membase + DR0);10351035+ writel(NS_CMD_WRITE_FREEBUFQ | NS_PRV_BUFTYPE(skb),10441036 card->membase + CMD);10451045-10461037 spin_unlock_irqrestore(&card->res_lock, flags);1047103810481039 XPRINTK("nicstar%d: Pushing %s buffers at 0x%x and 0x%x.\n",10491040 card->index,10501050- (cb->buf_type == BUF_SM ? "small" : "large"), addr1,10511051- addr2);10411041+ (NS_PRV_BUFTYPE(skb) == BUF_SM ? "small" : "large"),10421042+ addr1, addr2);10521043 }1053104410541045 if (!card->efbie && card->sbfqc >= card->sbnr.min &&···10711036 card->membase + CFG);10721037 }1073103810391039+out:10741040 return;10751041}10761042···11671131 next interrupt. As this preliminary support is only meant to11681132 avoid buffer leakage, this is not an issue. */11691133 while (readl(card->membase + RAWCT) != card->rawch) {11701170- ns_rcqe *rawcell;1171113411721172- rawcell = (ns_rcqe *) bus_to_virt(card->rawch);11731173- if (ns_rcqe_islast(rawcell)) {11351135+ if (ns_rcqe_islast(card->rawcell)) {11741136 struct sk_buff *oldbuf;1175113711761138 oldbuf = card->rcbuf;11771177- card->rcbuf =11781178- (struct sk_buff *)11791179- ns_rcqe_nextbufhandle(rawcell);11801180- card->rawch =11811181- (u32) virt_to_bus(card->rcbuf->data);11391139+ card->rcbuf = idr_find(&card->idr,11401140+ ns_rcqe_nextbufhandle(card->rawcell));11411141+ card->rawch = NS_PRV_DMA(card->rcbuf);11421142+ card->rawcell = (struct ns_rcqe *)11431143+ card->rcbuf->data;11821144 recycle_rx_buf(card, oldbuf);11831183- } else11451145+ } else {11841146 card->rawch += NS_RCQE_SIZE;11471147+ card->rawcell++;11481148+ }11851149 }11861150 }11871151···12011165 card->efbie = 0;12021166 break;12031167 }12041204- NS_SKB_CB(sb)->buf_type = BUF_SM;11681168+ NS_PRV_BUFTYPE(sb) = BUF_SM;12051169 skb_queue_tail(&card->sbpool.queue, sb);12061170 skb_reserve(sb, NS_AAL0_HEADER);12071171 push_rxbufs(card, sb);···12261190 card->efbie = 0;12271191 break;12281192 }12291229- NS_SKB_CB(lb)->buf_type = BUF_LG;11931193+ NS_PRV_BUFTYPE(lb) = BUF_LG;12301194 skb_queue_tail(&card->lbpool.queue, lb);12311195 skb_reserve(lb, NS_SMBUFSIZE);12321196 push_rxbufs(card, lb);···1374133813751339 vc->cbr_scd = NS_FRSCD + frscdi * NS_FRSCD_SIZE;1376134013771377- scq = get_scq(CBR_SCQSIZE, vc->cbr_scd);13411341+ scq = get_scq(card, CBR_SCQSIZE, vc->cbr_scd);13781342 if (scq == NULL) {13791343 PRINTK("nicstar%d: can't get fixed rate SCQ.\n",13801344 card->index);···13851349 return -ENOMEM;13861350 }13871351 vc->scq = scq;13881388- u32d[0] = (u32) virt_to_bus(scq->base);13521352+ u32d[0] = scq_virt_to_bus(scq, scq->base);13891353 u32d[1] = (u32) 0x00000000;13901354 u32d[2] = (u32) 0xffffffff;13911355 u32d[3] = (u32) 0x00000000;···14701434 card->index);14711435 iovb = vc->rx_iov;14721436 recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data,14731473- NS_SKB(iovb)->iovcnt);14741474- NS_SKB(iovb)->iovcnt = 0;14751475- NS_SKB(iovb)->vcc = NULL;14371437+ NS_PRV_IOVCNT(iovb));14381438+ NS_PRV_IOVCNT(iovb) = 0;14761439 spin_lock_irqsave(&card->int_lock, flags);14771440 recycle_iov_buf(card, iovb);14781441 spin_unlock_irqrestore(&card->int_lock, flags);···15221487 scq->next = scq->base;15231488 else15241489 scq->next++;15251525- data = (u32) virt_to_bus(scq->next);14901490+ data = scq_virt_to_bus(scq, scq->next);15261491 ns_write_sram(card, scq->scd, &data, 1);15271492 }15281493 spin_unlock_irqrestore(&scq->lock, flags);···15411506 }1542150715431508 card->scd2vc[(vc->cbr_scd - NS_FRSCD) / NS_FRSCD_SIZE] = NULL;15441544- free_scq(vc->scq, vcc);15091509+ free_scq(card, vc->scq, vcc);15451510 }1546151115471512 /* remove all references to vcc before deleting it */···15741539 cfg = readl(card->membase + CFG);15751540 printk("STAT = 0x%08X CFG = 0x%08X \n", stat, cfg);15761541 printk15771577- ("TSQ: base = 0x%08X next = 0x%08X last = 0x%08X TSQT = 0x%08X \n",15781578- (u32) card->tsq.base, (u32) card->tsq.next,15791579- (u32) card->tsq.last, readl(card->membase + TSQT));15421542+ ("TSQ: base = 0x%p next = 0x%p last = 0x%p TSQT = 0x%08X \n",15431543+ card->tsq.base, card->tsq.next,15441544+ card->tsq.last, readl(card->membase + TSQT));15801545 printk15811581- ("RSQ: base = 0x%08X next = 0x%08X last = 0x%08X RSQT = 0x%08X \n",15821582- (u32) card->rsq.base, (u32) card->rsq.next,15831583- (u32) card->rsq.last, readl(card->membase + RSQT));15461546+ ("RSQ: base = 0x%p next = 0x%p last = 0x%p RSQT = 0x%08X \n",15471547+ card->rsq.base, card->rsq.next,15481548+ card->rsq.last, readl(card->membase + RSQT));15841549 printk("Empty free buffer queue interrupt %s \n",15851550 card->efbie ? "enabled" : "disabled");15861551 printk("SBCNT = %d count = %d LBCNT = %d count = %d \n",···1686165116871652 ATM_SKB(skb)->vcc = vcc;1688165316541654+ NS_PRV_DMA(skb) = pci_map_single(card->pcidev, skb->data,16551655+ skb->len, PCI_DMA_TODEVICE);16561656+16891657 if (vcc->qos.aal == ATM_AAL5) {16901658 buflen = (skb->len + 47 + 8) / 48 * 48; /* Multiple of 48 */16911659 flags = NS_TBD_AAL5;16921692- scqe.word_2 = cpu_to_le32((u32) virt_to_bus(skb->data));16931693- scqe.word_3 = cpu_to_le32((u32) skb->len);16601660+ scqe.word_2 = cpu_to_le32(NS_PRV_DMA(skb));16611661+ scqe.word_3 = cpu_to_le32(skb->len);16941662 scqe.word_4 =16951663 ns_tbd_mkword_4(0, (u32) vcc->vpi, (u32) vcc->vci, 0,16961664 ATM_SKB(skb)->···1703166517041666 buflen = ATM_CELL_PAYLOAD; /* i.e., 48 bytes */17051667 flags = NS_TBD_AAL0;17061706- scqe.word_2 =17071707- cpu_to_le32((u32) virt_to_bus(skb->data) + NS_AAL0_HEADER);16681668+ scqe.word_2 = cpu_to_le32(NS_PRV_DMA(skb) + NS_AAL0_HEADER);17081669 scqe.word_3 = cpu_to_le32(0x00000000);17091670 if (*skb->data & 0x02) /* Payload type 1 - end of pdu */17101671 flags |= NS_TBD_EOPDU;···17701733 *scq->next = *tbd;17711734 index = (int)(scq->next - scq->base);17721735 scq->skb[index] = skb;17731773- XPRINTK("nicstar%d: sending skb at 0x%x (pos %d).\n",17741774- card->index, (u32) skb, index);17751775- XPRINTK("nicstar%d: TBD written:\n0x%x\n0x%x\n0x%x\n0x%x\n at 0x%x.\n",17361736+ XPRINTK("nicstar%d: sending skb at 0x%p (pos %d).\n",17371737+ card->index, skb, index);17381738+ XPRINTK("nicstar%d: TBD written:\n0x%x\n0x%x\n0x%x\n0x%x\n at 0x%p.\n",17761739 card->index, le32_to_cpu(tbd->word_1), le32_to_cpu(tbd->word_2),17771740 le32_to_cpu(tbd->word_3), le32_to_cpu(tbd->word_4),17781778- (u32) scq->next);17411741+ scq->next);17791742 if (scq->next == scq->last)17801743 scq->next = scq->base;17811744 else···1794175717951758 while (scq->tail == scq->next) {17961759 if (in_interrupt()) {17971797- data = (u32) virt_to_bus(scq->next);17601760+ data = scq_virt_to_bus(scq, scq->next);17981761 ns_write_sram(card, scq->scd, &data, 1);17991762 spin_unlock_irqrestore(&scq->lock, flags);18001763 printk("nicstar%d: Error pushing TSR.\n",···18261789 index = (int)scqi;18271790 scq->skb[index] = NULL;18281791 XPRINTK18291829- ("nicstar%d: TSR written:\n0x%x\n0x%x\n0x%x\n0x%x\n at 0x%x.\n",17921792+ ("nicstar%d: TSR written:\n0x%x\n0x%x\n0x%x\n0x%x\n at 0x%p.\n",18301793 card->index, le32_to_cpu(tsr.word_1),18311794 le32_to_cpu(tsr.word_2), le32_to_cpu(tsr.word_3),18321832- le32_to_cpu(tsr.word_4), (u32) scq->next);17951795+ le32_to_cpu(tsr.word_4), scq->next);18331796 if (scq->next == scq->last)18341797 scq->next = scq->base;18351798 else···18401803 PRINTK("nicstar%d: Timeout pushing TSR.\n",18411804 card->index);18421805 }18431843- data = (u32) virt_to_bus(scq->next);18061806+ data = scq_virt_to_bus(scq, scq->next);18441807 ns_write_sram(card, scq->scd, &data, 1);1845180818461809 spin_unlock_irqrestore(&scq->lock, flags);···19181881 two_ahead = one_ahead + 1;19191882 }1920188319211921- if (serviced_entries) {19221922- writel((((u32) previous) - ((u32) card->tsq.base)),18841884+ if (serviced_entries)18851885+ writel(PTR_DIFF(previous, card->tsq.base),19231886 card->membase + TSQH);19241924- }19251887}1926188819271889static void drain_scq(ns_dev * card, scq_info * scq, int pos)···19301894 int i;19311895 unsigned long flags;1932189619331933- XPRINTK("nicstar%d: drain_scq() called, scq at 0x%x, pos %d.\n",19341934- card->index, (u32) scq, pos);18971897+ XPRINTK("nicstar%d: drain_scq() called, scq at 0x%p, pos %d.\n",18981898+ card->index, scq, pos);19351899 if (pos >= scq->num_entries) {19361900 printk("nicstar%d: Bad index on drain_scq().\n", card->index);19371901 return;···19431907 i = 0;19441908 while (i != pos) {19451909 skb = scq->skb[i];19461946- XPRINTK("nicstar%d: freeing skb at 0x%x (index %d).\n",19471947- card->index, (u32) skb, i);19101910+ XPRINTK("nicstar%d: freeing skb at 0x%p (index %d).\n",19111911+ card->index, skb, i);19481912 if (skb != NULL) {19131913+ pci_unmap_single(card->pcidev,19141914+ NS_PRV_DMA(skb),19151915+ skb->len,19161916+ PCI_DMA_TODEVICE);19491917 vcc = ATM_SKB(skb)->vcc;19501918 if (vcc && vcc->pop != NULL) {19511919 vcc->pop(vcc, skb);···19801940 else19811941 card->rsq.next++;19821942 } while (ns_rsqe_valid(card->rsq.next));19831983- writel((((u32) previous) - ((u32) card->rsq.base)),19841984- card->membase + RSQH);19431943+ writel(PTR_DIFF(previous, card->rsq.base), card->membase + RSQH);19851944}1986194519871946static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe)···19941955 unsigned short aal5_len;19951956 int len;19961957 u32 stat;19581958+ u32 id;1997195919981960 stat = readl(card->membase + STAT);19991961 card->sbfqc = ns_stat_sfbqc_get(stat);20001962 card->lbfqc = ns_stat_lfbqc_get(stat);2001196320022002- skb = (struct sk_buff *)le32_to_cpu(rsqe->buffer_handle);19641964+ id = le32_to_cpu(rsqe->buffer_handle);19651965+ skb = idr_find(&card->idr, id);19661966+ if (!skb) {19671967+ RXPRINTK(KERN_ERR19681968+ "nicstar%d: idr_find() failed!\n", card->index);19691969+ return;19701970+ }19711971+ idr_remove(&card->idr, id);19721972+ pci_dma_sync_single_for_cpu(card->pcidev,19731973+ NS_PRV_DMA(skb),19741974+ (NS_PRV_BUFTYPE(skb) == BUF_SM19751975+ ? NS_SMSKBSIZE : NS_LGSKBSIZE),19761976+ PCI_DMA_FROMDEVICE);19771977+ pci_unmap_single(card->pcidev,19781978+ NS_PRV_DMA(skb),19791979+ (NS_PRV_BUFTYPE(skb) == BUF_SM19801980+ ? NS_SMSKBSIZE : NS_LGSKBSIZE),19811981+ PCI_DMA_FROMDEVICE);20031982 vpi = ns_rsqe_vpi(rsqe);20041983 vci = ns_rsqe_vci(rsqe);20051984 if (vpi >= 1UL << card->vpibits || vci >= 1UL << card->vcibits) {···20912034 recycle_rx_buf(card, skb);20922035 return;20932036 }20942094- NS_SKB_CB(iovb)->buf_type = BUF_NONE;20372037+ NS_PRV_BUFTYPE(iovb) = BUF_NONE;20952038 } else if (--card->iovpool.count < card->iovnr.min) {20962039 struct sk_buff *new_iovb;20972040 if ((new_iovb =20982041 alloc_skb(NS_IOVBUFSIZE, GFP_ATOMIC)) != NULL) {20992099- NS_SKB_CB(iovb)->buf_type = BUF_NONE;20422042+ NS_PRV_BUFTYPE(iovb) = BUF_NONE;21002043 skb_queue_tail(&card->iovpool.queue, new_iovb);21012044 card->iovpool.count++;21022045 }21032046 }21042047 vc->rx_iov = iovb;21052105- NS_SKB(iovb)->iovcnt = 0;20482048+ NS_PRV_IOVCNT(iovb) = 0;21062049 iovb->len = 0;21072050 iovb->data = iovb->head;21082051 skb_reset_tail_pointer(iovb);21092109- NS_SKB(iovb)->vcc = vcc;21102052 /* IMPORTANT: a pointer to the sk_buff containing the small or large21112053 buffer is stored as iovec base, NOT a pointer to the21122054 small or large buffer itself. */21132113- } else if (NS_SKB(iovb)->iovcnt >= NS_MAX_IOVECS) {20552055+ } else if (NS_PRV_IOVCNT(iovb) >= NS_MAX_IOVECS) {21142056 printk("nicstar%d: received too big AAL5 SDU.\n", card->index);21152057 atomic_inc(&vcc->stats->rx_err);21162058 recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data,21172059 NS_MAX_IOVECS);21182118- NS_SKB(iovb)->iovcnt = 0;20602060+ NS_PRV_IOVCNT(iovb) = 0;21192061 iovb->len = 0;21202062 iovb->data = iovb->head;21212063 skb_reset_tail_pointer(iovb);21222122- NS_SKB(iovb)->vcc = vcc;21232064 }21242124- iov = &((struct iovec *)iovb->data)[NS_SKB(iovb)->iovcnt++];20652065+ iov = &((struct iovec *)iovb->data)[NS_PRV_IOVCNT(iovb)++];21252066 iov->iov_base = (void *)skb;21262067 iov->iov_len = ns_rsqe_cellcount(rsqe) * 48;21272068 iovb->len += iov->iov_len;2128206921292129- if (NS_SKB(iovb)->iovcnt == 1) {21302130- if (NS_SKB_CB(skb)->buf_type != BUF_SM) {20702070+#ifdef EXTRA_DEBUG20712071+ if (NS_PRV_IOVCNT(iovb) == 1) {20722072+ if (NS_PRV_BUFTYPE(skb) != BUF_SM) {21312073 printk21322074 ("nicstar%d: Expected a small buffer, and this is not one.\n",21332075 card->index);···21372081 recycle_iov_buf(card, iovb);21382082 return;21392083 }21402140- } else { /* NS_SKB(iovb)->iovcnt >= 2 */20842084+ } else { /* NS_PRV_IOVCNT(iovb) >= 2 */2141208521422142- if (NS_SKB_CB(skb)->buf_type != BUF_LG) {20862086+ if (NS_PRV_BUFTYPE(skb) != BUF_LG) {21432087 printk21442088 ("nicstar%d: Expected a large buffer, and this is not one.\n",21452089 card->index);21462090 which_list(card, skb);21472091 atomic_inc(&vcc->stats->rx_err);21482092 recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data,21492149- NS_SKB(iovb)->iovcnt);20932093+ NS_PRV_IOVCNT(iovb));21502094 vc->rx_iov = NULL;21512095 recycle_iov_buf(card, iovb);21522096 return;21532097 }21542098 }20992099+#endif /* EXTRA_DEBUG */2155210021562101 if (ns_rsqe_eopdu(rsqe)) {21572102 /* This works correctly regardless of the endianness of the host */21582158- unsigned char *L1L2 = (unsigned char *)((u32) skb->data +21592159- iov->iov_len - 6);21032103+ unsigned char *L1L2 = (unsigned char *)21042104+ (skb->data + iov->iov_len - 6);21602105 aal5_len = L1L2[0] << 8 | L1L2[1];21612106 len = (aal5_len == 0x0000) ? 0x10000 : aal5_len;21622107 if (ns_rsqe_crcerr(rsqe) ||···21692112 printk(".\n");21702113 atomic_inc(&vcc->stats->rx_err);21712114 recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data,21722172- NS_SKB(iovb)->iovcnt);21152115+ NS_PRV_IOVCNT(iovb));21732116 vc->rx_iov = NULL;21742117 recycle_iov_buf(card, iovb);21752118 return;···2177212021782121 /* By this point we (hopefully) have a complete SDU without errors. */2179212221802180- if (NS_SKB(iovb)->iovcnt == 1) { /* Just a small buffer */21232123+ if (NS_PRV_IOVCNT(iovb) == 1) { /* Just a small buffer */21812124 /* skb points to a small buffer */21822125 if (!atm_charge(vcc, skb->truesize)) {21832126 push_rxbufs(card, skb);···21932136 vcc->push(vcc, skb);21942137 atomic_inc(&vcc->stats->rx);21952138 }21962196- } else if (NS_SKB(iovb)->iovcnt == 2) { /* One small plus one large buffer */21392139+ } else if (NS_PRV_IOVCNT(iovb) == 2) { /* One small plus one large buffer */21972140 struct sk_buff *sb;2198214121992142 sb = (struct sk_buff *)(iov - 1)->iov_base;···22592202 recycle_iovec_rx_bufs(card,22602203 (struct iovec *)22612204 iovb->data,22622262- NS_SKB(iovb)->22632263- iovcnt);22052205+ NS_PRV_IOVCNT(iovb));22642206 vc->rx_iov = NULL;22652207 recycle_iov_buf(card, iovb);22662208 return;···22732217 card->hbpool.count++;22742218 }22752219 }22762276- NS_SKB_CB(hb)->buf_type = BUF_NONE;22202220+ NS_PRV_BUFTYPE(hb) = BUF_NONE;22772221 } else if (--card->hbpool.count < card->hbnr.min) {22782222 struct sk_buff *new_hb;22792223 if ((new_hb =22802224 dev_alloc_skb(NS_HBUFSIZE)) != NULL) {22812281- NS_SKB_CB(new_hb)->buf_type = BUF_NONE;22252225+ NS_PRV_BUFTYPE(new_hb) = BUF_NONE;22822226 skb_queue_tail(&card->hbpool.queue,22832227 new_hb);22842228 card->hbpool.count++;···22872231 if ((new_hb =22882232 dev_alloc_skb(NS_HBUFSIZE)) !=22892233 NULL) {22902290- NS_SKB_CB(new_hb)->buf_type =22342234+ NS_PRV_BUFTYPE(new_hb) =22912235 BUF_NONE;22922236 skb_queue_tail(&card->hbpool.22932237 queue, new_hb);···2300224423012245 if (!atm_charge(vcc, hb->truesize)) {23022246 recycle_iovec_rx_bufs(card, iov,23032303- NS_SKB(iovb)->iovcnt);22472247+ NS_PRV_IOVCNT(iovb));23042248 if (card->hbpool.count < card->hbnr.max) {23052249 skb_queue_tail(&card->hbpool.queue, hb);23062250 card->hbpool.count++;···23192263 push_rxbufs(card, sb);2320226423212265 /* Copy all large buffers to the huge buffer and free them */23222322- for (j = 1; j < NS_SKB(iovb)->iovcnt; j++) {22662266+ for (j = 1; j < NS_PRV_IOVCNT(iovb); j++) {23232267 lb = (struct sk_buff *)iov->iov_base;23242268 tocopy =23252269 min_t(int, remaining, iov->iov_len);···23692313 sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL);23702314 if (sb == NULL)23712315 break;23722372- NS_SKB_CB(sb)->buf_type = BUF_SM;23162316+ NS_PRV_BUFTYPE(sb) = BUF_SM;23732317 skb_queue_tail(&card->sbpool.queue, sb);23742318 skb_reserve(sb, NS_AAL0_HEADER);23752319 push_rxbufs(card, sb);···23902334 lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL);23912335 if (lb == NULL)23922336 break;23932393- NS_SKB_CB(lb)->buf_type = BUF_LG;23372337+ NS_PRV_BUFTYPE(lb) = BUF_LG;23942338 skb_queue_tail(&card->lbpool.queue, lb);23952339 skb_reserve(lb, NS_SMBUFSIZE);23962340 push_rxbufs(card, lb);···24072351 hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL);24082352 if (hb == NULL)24092353 break;24102410- NS_SKB_CB(hb)->buf_type = BUF_NONE;23542354+ NS_PRV_BUFTYPE(hb) = BUF_NONE;24112355 skb_queue_tail(&card->hbpool.queue, hb);24122356 card->hbpool.count++;24132357 }···2417236124182362static void recycle_rx_buf(ns_dev * card, struct sk_buff *skb)24192363{24202420- struct ns_skb_cb *cb = NS_SKB_CB(skb);24212421-24222422- if (unlikely(cb->buf_type == BUF_NONE)) {23642364+ if (unlikely(NS_PRV_BUFTYPE(skb) == BUF_NONE)) {24232365 printk("nicstar%d: What kind of rx buffer is this?\n",24242366 card->index);24252367 dev_kfree_skb_any(skb);···24492395 if (card->sbfqc < card->sbnr.init) {24502396 struct sk_buff *new_sb;24512397 if ((new_sb = dev_alloc_skb(NS_SMSKBSIZE)) != NULL) {24522452- NS_SKB_CB(new_sb)->buf_type = BUF_SM;23982398+ NS_PRV_BUFTYPE(new_sb) = BUF_SM;24532399 skb_queue_tail(&card->sbpool.queue, new_sb);24542400 skb_reserve(new_sb, NS_AAL0_HEADER);24552401 push_rxbufs(card, new_sb);···24602406 {24612407 struct sk_buff *new_sb;24622408 if ((new_sb = dev_alloc_skb(NS_SMSKBSIZE)) != NULL) {24632463- NS_SKB_CB(new_sb)->buf_type = BUF_SM;24092409+ NS_PRV_BUFTYPE(new_sb) = BUF_SM;24642410 skb_queue_tail(&card->sbpool.queue, new_sb);24652411 skb_reserve(new_sb, NS_AAL0_HEADER);24662412 push_rxbufs(card, new_sb);···24772423 if (card->lbfqc < card->lbnr.init) {24782424 struct sk_buff *new_lb;24792425 if ((new_lb = dev_alloc_skb(NS_LGSKBSIZE)) != NULL) {24802480- NS_SKB_CB(new_lb)->buf_type = BUF_LG;24262426+ NS_PRV_BUFTYPE(new_lb) = BUF_LG;24812427 skb_queue_tail(&card->lbpool.queue, new_lb);24822428 skb_reserve(new_lb, NS_SMBUFSIZE);24832429 push_rxbufs(card, new_lb);···24882434 {24892435 struct sk_buff *new_lb;24902436 if ((new_lb = dev_alloc_skb(NS_LGSKBSIZE)) != NULL) {24912491- NS_SKB_CB(new_lb)->buf_type = BUF_LG;24372437+ NS_PRV_BUFTYPE(new_lb) = BUF_LG;24922438 skb_queue_tail(&card->lbpool.queue, new_lb);24932439 skb_reserve(new_lb, NS_SMBUFSIZE);24942440 push_rxbufs(card, new_lb);···26792625 sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL);26802626 if (sb == NULL)26812627 return -ENOMEM;26822682- NS_SKB_CB(sb)->buf_type = BUF_SM;26282628+ NS_PRV_BUFTYPE(sb) = BUF_SM;26832629 skb_queue_tail(&card->sbpool.queue, sb);26842630 skb_reserve(sb, NS_AAL0_HEADER);26852631 push_rxbufs(card, sb);···26932639 lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL);26942640 if (lb == NULL)26952641 return -ENOMEM;26962696- NS_SKB_CB(lb)->buf_type = BUF_LG;26422642+ NS_PRV_BUFTYPE(lb) = BUF_LG;26972643 skb_queue_tail(&card->lbpool.queue, lb);26982644 skb_reserve(lb, NS_SMBUFSIZE);26992645 push_rxbufs(card, lb);···27222668 hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL);27232669 if (hb == NULL)27242670 return -ENOMEM;27252725- NS_SKB_CB(hb)->buf_type = BUF_NONE;26712671+ NS_PRV_BUFTYPE(hb) = BUF_NONE;27262672 spin_lock_irqsave(&card->int_lock, flags);27272673 skb_queue_tail(&card->hbpool.queue, hb);27282674 card->hbpool.count++;···27522698 iovb = alloc_skb(NS_IOVBUFSIZE, GFP_KERNEL);27532699 if (iovb == NULL)27542700 return -ENOMEM;27552755- NS_SKB_CB(iovb)->buf_type = BUF_NONE;27012701+ NS_PRV_BUFTYPE(iovb) = BUF_NONE;27562702 spin_lock_irqsave(&card->int_lock, flags);27572703 skb_queue_tail(&card->iovpool.queue, iovb);27582704 card->iovpool.count++;···27772723 }27782724}2779272527262726+#ifdef EXTRA_DEBUG27802727static void which_list(ns_dev * card, struct sk_buff *skb)27812728{27822782- printk("skb buf_type: 0x%08x\n", NS_SKB_CB(skb)->buf_type);27292729+ printk("skb buf_type: 0x%08x\n", NS_PRV_BUFTYPE(skb));27832730}27312731+#endif /* EXTRA_DEBUG */2784273227852733static void ns_poll(unsigned long arg)27862734{···28592803 card = dev->dev_data;28602804 spin_lock_irqsave(&card->res_lock, flags);28612805 while (CMD_BUSY(card)) ;28622862- writel((unsigned long)value, card->membase + DR0);28062806+ writel((u32) value, card->membase + DR0);28632807 writel(NS_CMD_WRITE_UTILITY | 0x00000200 | (addr & 0x000000FF),28642808 card->membase + CMD);28652809 spin_unlock_irqrestore(&card->res_lock, flags);···28692813{28702814 ns_dev *card;28712815 unsigned long flags;28722872- unsigned long data;28162816+ u32 data;2873281728742818 card = dev->dev_data;28752819 spin_lock_irqsave(&card->res_lock, flags);
+17-11
drivers/atm/nicstar.h
···16161717#include <linux/types.h>1818#include <linux/pci.h>1919+#include <linux/idr.h>1920#include <linux/uio.h>2021#include <linux/skbuff.h>2122#include <linux/atmdev.h>···637636638637/* Device driver structures */639638640640-struct ns_skb_cb {639639+struct ns_skb_prv {641640 u32 buf_type; /* BUF_SM/BUF_LG/BUF_NONE */641641+ u32 dma;642642+ int iovcnt;642643};643644644644-#define NS_SKB_CB(skb) ((struct ns_skb_cb *)((skb)->cb))645645+#define NS_PRV_BUFTYPE(skb) \646646+ (((struct ns_skb_prv *)(ATM_SKB(skb)+1))->buf_type)647647+#define NS_PRV_DMA(skb) \648648+ (((struct ns_skb_prv *)(ATM_SKB(skb)+1))->dma)649649+#define NS_PRV_IOVCNT(skb) \650650+ (((struct ns_skb_prv *)(ATM_SKB(skb)+1))->iovcnt)645651646652typedef struct tsq_info {647653 void *org;654654+ dma_addr_t dma;648655 ns_tsi *base;649656 ns_tsi *next;650657 ns_tsi *last;···660651661652typedef struct scq_info {662653 void *org;654654+ dma_addr_t dma;663655 ns_scqe *base;664656 ns_scqe *last;665657 ns_scqe *next;···678668679669typedef struct rsq_info {680670 void *org;671671+ dma_addr_t dma;681672 ns_rsqe *base;682673 ns_rsqe *next;683674 ns_rsqe *last;···704693 int tbd_count;705694} vc_map;706695707707-struct ns_skb_data {708708- struct atm_vcc *vcc;709709- int iovcnt;710710-};711711-712712-#define NS_SKB(skb) (((struct ns_skb_data *) (skb)->cb))713713-714696typedef struct ns_dev {715697 int index; /* Card ID to the device driver */716698 int sram_size; /* In k x 32bit words. 32 or 128 */···713709 int vpibits;714710 int vcibits;715711 struct pci_dev *pcidev;712712+ struct idr idr;716713 struct atm_dev *atmdev;717714 tsq_info tsq;718715 rsq_info rsq;···734729 buf_nr iovnr;735730 int sbfqc;736731 int lbfqc;737737- u32 sm_handle;732732+ struct sk_buff *sm_handle;738733 u32 sm_addr;739739- u32 lg_handle;734734+ struct sk_buff *lg_handle;740735 u32 lg_addr;741736 struct sk_buff *rcbuf; /* Current raw cell buffer */737737+ struct ns_rcqe *rawcell;742738 u32 rawch; /* Raw cell queue head */743739 unsigned intcnt; /* Interrupt counter */744740 spinlock_t int_lock; /* Interrupt lock */