diff options
author | chas williams - CONTRACTOR <chas@cmf.nrl.navy.mil> | 2010-05-29 05:04:25 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-05-31 03:27:46 -0400 |
commit | 864a3ff635fa73dae15455524e048da5c89352ac (patch) | |
tree | 61b9abd5a99ce1a944224efee8090b85327dfb1b | |
parent | 098fde114bf6655f4b75d71dbea208d039fc1de3 (diff) |
atm: [nicstar] remove virt_to_bus() and support 64-bit platforms
Signed-off-by: Chas Williams - CONTRACTOR <chas@cmf.nrl.navy.mil>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/atm/Kconfig | 2 | ||||
-rw-r--r-- | drivers/atm/nicstar.c | 382 | ||||
-rw-r--r-- | drivers/atm/nicstar.h | 28 |
3 files changed, 237 insertions, 175 deletions
diff --git a/drivers/atm/Kconfig b/drivers/atm/Kconfig index f1a0a00b3b07..be7461c9a87e 100644 --- a/drivers/atm/Kconfig +++ b/drivers/atm/Kconfig | |||
@@ -177,7 +177,7 @@ config ATM_ZATM_DEBUG | |||
177 | 177 | ||
178 | config ATM_NICSTAR | 178 | config ATM_NICSTAR |
179 | tristate "IDT 77201 (NICStAR) (ForeRunnerLE)" | 179 | tristate "IDT 77201 (NICStAR) (ForeRunnerLE)" |
180 | depends on PCI && !64BIT && VIRT_TO_BUS | 180 | depends on PCI |
181 | help | 181 | help |
182 | The NICStAR chipset family is used in a large number of ATM NICs for | 182 | The NICStAR chipset family is used in a large number of ATM NICs for |
183 | 25 and for 155 Mbps, including IDT cards and the Fore ForeRunnerLE | 183 | 25 and for 155 Mbps, including IDT cards and the Fore ForeRunnerLE |
diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c index a07b6b7fc7d8..59876c66a92a 100644 --- a/drivers/atm/nicstar.c +++ b/drivers/atm/nicstar.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <linux/atmdev.h> | 38 | #include <linux/atmdev.h> |
39 | #include <linux/atm.h> | 39 | #include <linux/atm.h> |
40 | #include <linux/pci.h> | 40 | #include <linux/pci.h> |
41 | #include <linux/dma-mapping.h> | ||
41 | #include <linux/types.h> | 42 | #include <linux/types.h> |
42 | #include <linux/string.h> | 43 | #include <linux/string.h> |
43 | #include <linux/delay.h> | 44 | #include <linux/delay.h> |
@@ -47,6 +48,7 @@ | |||
47 | #include <linux/interrupt.h> | 48 | #include <linux/interrupt.h> |
48 | #include <linux/bitops.h> | 49 | #include <linux/bitops.h> |
49 | #include <linux/slab.h> | 50 | #include <linux/slab.h> |
51 | #include <linux/idr.h> | ||
50 | #include <asm/io.h> | 52 | #include <asm/io.h> |
51 | #include <asm/uaccess.h> | 53 | #include <asm/uaccess.h> |
52 | #include <asm/atomic.h> | 54 | #include <asm/atomic.h> |
@@ -58,10 +60,6 @@ | |||
58 | #include "idt77105.h" | 60 | #include "idt77105.h" |
59 | #endif /* CONFIG_ATM_NICSTAR_USE_IDT77105 */ | 61 | #endif /* CONFIG_ATM_NICSTAR_USE_IDT77105 */ |
60 | 62 | ||
61 | #if BITS_PER_LONG != 32 | ||
62 | # error FIXME: this driver requires a 32-bit platform | ||
63 | #endif | ||
64 | |||
65 | /* Additional code */ | 63 | /* Additional code */ |
66 | 64 | ||
67 | #include "nicstarmac.c" | 65 | #include "nicstarmac.c" |
@@ -109,17 +107,15 @@ | |||
109 | 107 | ||
110 | #define NS_DELAY mdelay(1) | 108 | #define NS_DELAY mdelay(1) |
111 | 109 | ||
112 | #define ALIGN_BUS_ADDR(addr, alignment) \ | 110 | #define PTR_DIFF(a, b) ((u32)((unsigned long)(a) - (unsigned long)(b))) |
113 | ((((u32) (addr)) + (((u32) (alignment)) - 1)) & ~(((u32) (alignment)) - 1)) | ||
114 | #define ALIGN_ADDRESS(addr, alignment) \ | ||
115 | bus_to_virt(ALIGN_BUS_ADDR(virt_to_bus(addr), alignment)) | ||
116 | |||
117 | #undef CEIL | ||
118 | 111 | ||
119 | #ifndef ATM_SKB | 112 | #ifndef ATM_SKB |
120 | #define ATM_SKB(s) (&(s)->atm) | 113 | #define ATM_SKB(s) (&(s)->atm) |
121 | #endif | 114 | #endif |
122 | 115 | ||
116 | #define scq_virt_to_bus(scq, p) \ | ||
117 | (scq->dma + ((unsigned long)(p) - (unsigned long)(scq)->org)) | ||
118 | |||
123 | /* Function declarations */ | 119 | /* Function declarations */ |
124 | 120 | ||
125 | static u32 ns_read_sram(ns_dev * card, u32 sram_address); | 121 | static u32 ns_read_sram(ns_dev * card, u32 sram_address); |
@@ -127,8 +123,8 @@ static void ns_write_sram(ns_dev * card, u32 sram_address, u32 * value, | |||
127 | int count); | 123 | int count); |
128 | static int __devinit ns_init_card(int i, struct pci_dev *pcidev); | 124 | static int __devinit ns_init_card(int i, struct pci_dev *pcidev); |
129 | static void __devinit ns_init_card_error(ns_dev * card, int error); | 125 | static void __devinit ns_init_card_error(ns_dev * card, int error); |
130 | static scq_info *get_scq(int size, u32 scd); | 126 | static scq_info *get_scq(ns_dev *card, int size, u32 scd); |
131 | static void free_scq(scq_info * scq, struct atm_vcc *vcc); | 127 | static void free_scq(ns_dev *card, scq_info * scq, struct atm_vcc *vcc); |
132 | static void push_rxbufs(ns_dev *, struct sk_buff *); | 128 | static void push_rxbufs(ns_dev *, struct sk_buff *); |
133 | static irqreturn_t ns_irq_handler(int irq, void *dev_id); | 129 | static irqreturn_t ns_irq_handler(int irq, void *dev_id); |
134 | static int ns_open(struct atm_vcc *vcc); | 130 | static int ns_open(struct atm_vcc *vcc); |
@@ -153,7 +149,9 @@ static void dequeue_sm_buf(ns_dev * card, struct sk_buff *sb); | |||
153 | static void dequeue_lg_buf(ns_dev * card, struct sk_buff *lb); | 149 | static void dequeue_lg_buf(ns_dev * card, struct sk_buff *lb); |
154 | static int ns_proc_read(struct atm_dev *dev, loff_t * pos, char *page); | 150 | static int ns_proc_read(struct atm_dev *dev, loff_t * pos, char *page); |
155 | static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user * arg); | 151 | static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user * arg); |
152 | #ifdef EXTRA_DEBUG | ||
156 | static void which_list(ns_dev * card, struct sk_buff *skb); | 153 | static void which_list(ns_dev * card, struct sk_buff *skb); |
154 | #endif | ||
157 | static void ns_poll(unsigned long arg); | 155 | static void ns_poll(unsigned long arg); |
158 | static int ns_parse_mac(char *mac, unsigned char *esi); | 156 | static int ns_parse_mac(char *mac, unsigned char *esi); |
159 | static short ns_h2i(char c); | 157 | static short ns_h2i(char c); |
@@ -249,13 +247,17 @@ static void __devexit nicstar_remove_one(struct pci_dev *pcidev) | |||
249 | dev_kfree_skb_any(lb); | 247 | dev_kfree_skb_any(lb); |
250 | while ((sb = skb_dequeue(&card->sbpool.queue)) != NULL) | 248 | while ((sb = skb_dequeue(&card->sbpool.queue)) != NULL) |
251 | dev_kfree_skb_any(sb); | 249 | dev_kfree_skb_any(sb); |
252 | free_scq(card->scq0, NULL); | 250 | free_scq(card, card->scq0, NULL); |
253 | for (j = 0; j < NS_FRSCD_NUM; j++) { | 251 | for (j = 0; j < NS_FRSCD_NUM; j++) { |
254 | if (card->scd2vc[j] != NULL) | 252 | if (card->scd2vc[j] != NULL) |
255 | free_scq(card->scd2vc[j]->scq, card->scd2vc[j]->tx_vcc); | 253 | free_scq(card, card->scd2vc[j]->scq, card->scd2vc[j]->tx_vcc); |
256 | } | 254 | } |
257 | kfree(card->rsq.org); | 255 | idr_remove_all(&card->idr); |
258 | kfree(card->tsq.org); | 256 | idr_destroy(&card->idr); |
257 | pci_free_consistent(card->pcidev, NS_RSQSIZE + NS_RSQ_ALIGNMENT, | ||
258 | card->rsq.org, card->rsq.dma); | ||
259 | pci_free_consistent(card->pcidev, NS_TSQSIZE + NS_TSQ_ALIGNMENT, | ||
260 | card->tsq.org, card->tsq.dma); | ||
259 | free_irq(card->pcidev->irq, card); | 261 | free_irq(card->pcidev->irq, card); |
260 | iounmap(card->membase); | 262 | iounmap(card->membase); |
261 | kfree(card); | 263 | kfree(card); |
@@ -371,6 +373,14 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev) | |||
371 | ns_init_card_error(card, error); | 373 | ns_init_card_error(card, error); |
372 | return error; | 374 | return error; |
373 | } | 375 | } |
376 | if ((pci_set_dma_mask(pcidev, DMA_BIT_MASK(32)) != 0) || | ||
377 | (pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32)) != 0)) { | ||
378 | printk(KERN_WARNING | ||
379 | "nicstar%d: No suitable DMA available.\n", i); | ||
380 | error = 2; | ||
381 | ns_init_card_error(card, error); | ||
382 | return error; | ||
383 | } | ||
374 | 384 | ||
375 | if ((card = kmalloc(sizeof(ns_dev), GFP_KERNEL)) == NULL) { | 385 | if ((card = kmalloc(sizeof(ns_dev), GFP_KERNEL)) == NULL) { |
376 | printk | 386 | printk |
@@ -397,7 +407,7 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev) | |||
397 | ns_init_card_error(card, error); | 407 | ns_init_card_error(card, error); |
398 | return error; | 408 | return error; |
399 | } | 409 | } |
400 | PRINTK("nicstar%d: membase at 0x%x.\n", i, card->membase); | 410 | PRINTK("nicstar%d: membase at 0x%p.\n", i, card->membase); |
401 | 411 | ||
402 | pci_set_master(pcidev); | 412 | pci_set_master(pcidev); |
403 | 413 | ||
@@ -528,54 +538,54 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev) | |||
528 | writel(0x00000000, card->membase + VPM); | 538 | writel(0x00000000, card->membase + VPM); |
529 | 539 | ||
530 | /* Initialize TSQ */ | 540 | /* Initialize TSQ */ |
531 | card->tsq.org = kmalloc(NS_TSQSIZE + NS_TSQ_ALIGNMENT, GFP_KERNEL); | 541 | card->tsq.org = pci_alloc_consistent(card->pcidev, |
542 | NS_TSQSIZE + NS_TSQ_ALIGNMENT, | ||
543 | &card->tsq.dma); | ||
532 | if (card->tsq.org == NULL) { | 544 | if (card->tsq.org == NULL) { |
533 | printk("nicstar%d: can't allocate TSQ.\n", i); | 545 | printk("nicstar%d: can't allocate TSQ.\n", i); |
534 | error = 10; | 546 | error = 10; |
535 | ns_init_card_error(card, error); | 547 | ns_init_card_error(card, error); |
536 | return error; | 548 | return error; |
537 | } | 549 | } |
538 | card->tsq.base = | 550 | card->tsq.base = PTR_ALIGN(card->tsq.org, NS_TSQ_ALIGNMENT); |
539 | (ns_tsi *) ALIGN_ADDRESS(card->tsq.org, NS_TSQ_ALIGNMENT); | ||
540 | card->tsq.next = card->tsq.base; | 551 | card->tsq.next = card->tsq.base; |
541 | card->tsq.last = card->tsq.base + (NS_TSQ_NUM_ENTRIES - 1); | 552 | card->tsq.last = card->tsq.base + (NS_TSQ_NUM_ENTRIES - 1); |
542 | for (j = 0; j < NS_TSQ_NUM_ENTRIES; j++) | 553 | for (j = 0; j < NS_TSQ_NUM_ENTRIES; j++) |
543 | ns_tsi_init(card->tsq.base + j); | 554 | ns_tsi_init(card->tsq.base + j); |
544 | writel(0x00000000, card->membase + TSQH); | 555 | writel(0x00000000, card->membase + TSQH); |
545 | writel((u32) virt_to_bus(card->tsq.base), card->membase + TSQB); | 556 | writel(ALIGN(card->tsq.dma, NS_TSQ_ALIGNMENT), card->membase + TSQB); |
546 | PRINTK("nicstar%d: TSQ base at 0x%x 0x%x 0x%x.\n", i, | 557 | PRINTK("nicstar%d: TSQ base at 0x%p.\n", i, card->tsq.base); |
547 | (u32) card->tsq.base, (u32) virt_to_bus(card->tsq.base), | ||
548 | readl(card->membase + TSQB)); | ||
549 | 558 | ||
550 | /* Initialize RSQ */ | 559 | /* Initialize RSQ */ |
551 | card->rsq.org = kmalloc(NS_RSQSIZE + NS_RSQ_ALIGNMENT, GFP_KERNEL); | 560 | card->rsq.org = pci_alloc_consistent(card->pcidev, |
561 | NS_RSQSIZE + NS_RSQ_ALIGNMENT, | ||
562 | &card->rsq.dma); | ||
552 | if (card->rsq.org == NULL) { | 563 | if (card->rsq.org == NULL) { |
553 | printk("nicstar%d: can't allocate RSQ.\n", i); | 564 | printk("nicstar%d: can't allocate RSQ.\n", i); |
554 | error = 11; | 565 | error = 11; |
555 | ns_init_card_error(card, error); | 566 | ns_init_card_error(card, error); |
556 | return error; | 567 | return error; |
557 | } | 568 | } |
558 | card->rsq.base = | 569 | card->rsq.base = PTR_ALIGN(card->rsq.org, NS_RSQ_ALIGNMENT); |
559 | (ns_rsqe *) ALIGN_ADDRESS(card->rsq.org, NS_RSQ_ALIGNMENT); | ||
560 | card->rsq.next = card->rsq.base; | 570 | card->rsq.next = card->rsq.base; |
561 | card->rsq.last = card->rsq.base + (NS_RSQ_NUM_ENTRIES - 1); | 571 | card->rsq.last = card->rsq.base + (NS_RSQ_NUM_ENTRIES - 1); |
562 | for (j = 0; j < NS_RSQ_NUM_ENTRIES; j++) | 572 | for (j = 0; j < NS_RSQ_NUM_ENTRIES; j++) |
563 | ns_rsqe_init(card->rsq.base + j); | 573 | ns_rsqe_init(card->rsq.base + j); |
564 | writel(0x00000000, card->membase + RSQH); | 574 | writel(0x00000000, card->membase + RSQH); |
565 | writel((u32) virt_to_bus(card->rsq.base), card->membase + RSQB); | 575 | writel(ALIGN(card->rsq.dma, NS_RSQ_ALIGNMENT), card->membase + RSQB); |
566 | PRINTK("nicstar%d: RSQ base at 0x%x.\n", i, (u32) card->rsq.base); | 576 | PRINTK("nicstar%d: RSQ base at 0x%p.\n", i, card->rsq.base); |
567 | 577 | ||
568 | /* Initialize SCQ0, the only VBR SCQ used */ | 578 | /* Initialize SCQ0, the only VBR SCQ used */ |
569 | card->scq1 = NULL; | 579 | card->scq1 = NULL; |
570 | card->scq2 = NULL; | 580 | card->scq2 = NULL; |
571 | card->scq0 = get_scq(VBR_SCQSIZE, NS_VRSCD0); | 581 | card->scq0 = get_scq(card, VBR_SCQSIZE, NS_VRSCD0); |
572 | if (card->scq0 == NULL) { | 582 | if (card->scq0 == NULL) { |
573 | printk("nicstar%d: can't get SCQ0.\n", i); | 583 | printk("nicstar%d: can't get SCQ0.\n", i); |
574 | error = 12; | 584 | error = 12; |
575 | ns_init_card_error(card, error); | 585 | ns_init_card_error(card, error); |
576 | return error; | 586 | return error; |
577 | } | 587 | } |
578 | u32d[0] = (u32) virt_to_bus(card->scq0->base); | 588 | u32d[0] = scq_virt_to_bus(card->scq0, card->scq0->base); |
579 | u32d[1] = (u32) 0x00000000; | 589 | u32d[1] = (u32) 0x00000000; |
580 | u32d[2] = (u32) 0xffffffff; | 590 | u32d[2] = (u32) 0xffffffff; |
581 | u32d[3] = (u32) 0x00000000; | 591 | u32d[3] = (u32) 0x00000000; |
@@ -583,8 +593,7 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev) | |||
583 | ns_write_sram(card, NS_VRSCD1, u32d, 4); /* These last two won't be used */ | 593 | ns_write_sram(card, NS_VRSCD1, u32d, 4); /* These last two won't be used */ |
584 | ns_write_sram(card, NS_VRSCD2, u32d, 4); /* but are initialized, just in case... */ | 594 | ns_write_sram(card, NS_VRSCD2, u32d, 4); /* but are initialized, just in case... */ |
585 | card->scq0->scd = NS_VRSCD0; | 595 | card->scq0->scd = NS_VRSCD0; |
586 | PRINTK("nicstar%d: VBR-SCQ0 base at 0x%x.\n", i, | 596 | PRINTK("nicstar%d: VBR-SCQ0 base at 0x%p.\n", i, card->scq0->base); |
587 | (u32) card->scq0->base); | ||
588 | 597 | ||
589 | /* Initialize TSTs */ | 598 | /* Initialize TSTs */ |
590 | card->tst_addr = NS_TST0; | 599 | card->tst_addr = NS_TST0; |
@@ -640,6 +649,8 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev) | |||
640 | 649 | ||
641 | card->efbie = 1; /* To prevent push_rxbufs from enabling the interrupt */ | 650 | card->efbie = 1; /* To prevent push_rxbufs from enabling the interrupt */ |
642 | 651 | ||
652 | idr_init(&card->idr); | ||
653 | |||
643 | /* Pre-allocate some huge buffers */ | 654 | /* Pre-allocate some huge buffers */ |
644 | skb_queue_head_init(&card->hbpool.queue); | 655 | skb_queue_head_init(&card->hbpool.queue); |
645 | card->hbpool.count = 0; | 656 | card->hbpool.count = 0; |
@@ -654,7 +665,7 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev) | |||
654 | ns_init_card_error(card, error); | 665 | ns_init_card_error(card, error); |
655 | return error; | 666 | return error; |
656 | } | 667 | } |
657 | NS_SKB_CB(hb)->buf_type = BUF_NONE; | 668 | NS_PRV_BUFTYPE(hb) = BUF_NONE; |
658 | skb_queue_tail(&card->hbpool.queue, hb); | 669 | skb_queue_tail(&card->hbpool.queue, hb); |
659 | card->hbpool.count++; | 670 | card->hbpool.count++; |
660 | } | 671 | } |
@@ -673,14 +684,15 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev) | |||
673 | ns_init_card_error(card, error); | 684 | ns_init_card_error(card, error); |
674 | return error; | 685 | return error; |
675 | } | 686 | } |
676 | NS_SKB_CB(lb)->buf_type = BUF_LG; | 687 | NS_PRV_BUFTYPE(lb) = BUF_LG; |
677 | skb_queue_tail(&card->lbpool.queue, lb); | 688 | skb_queue_tail(&card->lbpool.queue, lb); |
678 | skb_reserve(lb, NS_SMBUFSIZE); | 689 | skb_reserve(lb, NS_SMBUFSIZE); |
679 | push_rxbufs(card, lb); | 690 | push_rxbufs(card, lb); |
680 | /* Due to the implementation of push_rxbufs() this is 1, not 0 */ | 691 | /* Due to the implementation of push_rxbufs() this is 1, not 0 */ |
681 | if (j == 1) { | 692 | if (j == 1) { |
682 | card->rcbuf = lb; | 693 | card->rcbuf = lb; |
683 | card->rawch = (u32) virt_to_bus(lb->data); | 694 | card->rawcell = (struct ns_rcqe *) lb->data; |
695 | card->rawch = NS_PRV_DMA(lb); | ||
684 | } | 696 | } |
685 | } | 697 | } |
686 | /* Test for strange behaviour which leads to crashes */ | 698 | /* Test for strange behaviour which leads to crashes */ |
@@ -708,7 +720,7 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev) | |||
708 | ns_init_card_error(card, error); | 720 | ns_init_card_error(card, error); |
709 | return error; | 721 | return error; |
710 | } | 722 | } |
711 | NS_SKB_CB(sb)->buf_type = BUF_SM; | 723 | NS_PRV_BUFTYPE(sb) = BUF_SM; |
712 | skb_queue_tail(&card->sbpool.queue, sb); | 724 | skb_queue_tail(&card->sbpool.queue, sb); |
713 | skb_reserve(sb, NS_AAL0_HEADER); | 725 | skb_reserve(sb, NS_AAL0_HEADER); |
714 | push_rxbufs(card, sb); | 726 | push_rxbufs(card, sb); |
@@ -738,7 +750,7 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev) | |||
738 | ns_init_card_error(card, error); | 750 | ns_init_card_error(card, error); |
739 | return error; | 751 | return error; |
740 | } | 752 | } |
741 | NS_SKB_CB(iovb)->buf_type = BUF_NONE; | 753 | NS_PRV_BUFTYPE(iovb) = BUF_NONE; |
742 | skb_queue_tail(&card->iovpool.queue, iovb); | 754 | skb_queue_tail(&card->iovpool.queue, iovb); |
743 | card->iovpool.count++; | 755 | card->iovpool.count++; |
744 | } | 756 | } |
@@ -825,7 +837,7 @@ static void __devinit ns_init_card_error(ns_dev * card, int error) | |||
825 | struct sk_buff *sb; | 837 | struct sk_buff *sb; |
826 | while ((sb = skb_dequeue(&card->sbpool.queue)) != NULL) | 838 | while ((sb = skb_dequeue(&card->sbpool.queue)) != NULL) |
827 | dev_kfree_skb_any(sb); | 839 | dev_kfree_skb_any(sb); |
828 | free_scq(card->scq0, NULL); | 840 | free_scq(card, card->scq0, NULL); |
829 | } | 841 | } |
830 | if (error >= 14) { | 842 | if (error >= 14) { |
831 | struct sk_buff *lb; | 843 | struct sk_buff *lb; |
@@ -855,7 +867,7 @@ static void __devinit ns_init_card_error(ns_dev * card, int error) | |||
855 | } | 867 | } |
856 | } | 868 | } |
857 | 869 | ||
858 | static scq_info *get_scq(int size, u32 scd) | 870 | static scq_info *get_scq(ns_dev *card, int size, u32 scd) |
859 | { | 871 | { |
860 | scq_info *scq; | 872 | scq_info *scq; |
861 | int i; | 873 | int i; |
@@ -864,22 +876,22 @@ static scq_info *get_scq(int size, u32 scd) | |||
864 | return NULL; | 876 | return NULL; |
865 | 877 | ||
866 | scq = kmalloc(sizeof(scq_info), GFP_KERNEL); | 878 | scq = kmalloc(sizeof(scq_info), GFP_KERNEL); |
867 | if (scq == NULL) | 879 | if (!scq) |
868 | return NULL; | 880 | return NULL; |
869 | scq->org = kmalloc(2 * size, GFP_KERNEL); | 881 | scq->org = pci_alloc_consistent(card->pcidev, 2 * size, &scq->dma); |
870 | if (scq->org == NULL) { | 882 | if (!scq->org) { |
871 | kfree(scq); | 883 | kfree(scq); |
872 | return NULL; | 884 | return NULL; |
873 | } | 885 | } |
874 | scq->skb = kmalloc(sizeof(struct sk_buff *) * | 886 | scq->skb = kmalloc(sizeof(struct sk_buff *) * |
875 | (size / NS_SCQE_SIZE), GFP_KERNEL); | 887 | (size / NS_SCQE_SIZE), GFP_KERNEL); |
876 | if (scq->skb == NULL) { | 888 | if (!scq->skb) { |
877 | kfree(scq->org); | 889 | kfree(scq->org); |
878 | kfree(scq); | 890 | kfree(scq); |
879 | return NULL; | 891 | return NULL; |
880 | } | 892 | } |
881 | scq->num_entries = size / NS_SCQE_SIZE; | 893 | scq->num_entries = size / NS_SCQE_SIZE; |
882 | scq->base = (ns_scqe *) ALIGN_ADDRESS(scq->org, size); | 894 | scq->base = PTR_ALIGN(scq->org, size); |
883 | scq->next = scq->base; | 895 | scq->next = scq->base; |
884 | scq->last = scq->base + (scq->num_entries - 1); | 896 | scq->last = scq->base + (scq->num_entries - 1); |
885 | scq->tail = scq->last; | 897 | scq->tail = scq->last; |
@@ -897,7 +909,7 @@ static scq_info *get_scq(int size, u32 scd) | |||
897 | } | 909 | } |
898 | 910 | ||
899 | /* For variable rate SCQ vcc must be NULL */ | 911 | /* For variable rate SCQ vcc must be NULL */ |
900 | static void free_scq(scq_info * scq, struct atm_vcc *vcc) | 912 | static void free_scq(ns_dev *card, scq_info *scq, struct atm_vcc *vcc) |
901 | { | 913 | { |
902 | int i; | 914 | int i; |
903 | 915 | ||
@@ -928,7 +940,10 @@ static void free_scq(scq_info * scq, struct atm_vcc *vcc) | |||
928 | } | 940 | } |
929 | } | 941 | } |
930 | kfree(scq->skb); | 942 | kfree(scq->skb); |
931 | kfree(scq->org); | 943 | pci_free_consistent(card->pcidev, |
944 | 2 * (scq->num_entries == VBR_SCQ_NUM_ENTRIES ? | ||
945 | VBR_SCQSIZE : CBR_SCQSIZE), | ||
946 | scq->org, scq->dma); | ||
932 | kfree(scq); | 947 | kfree(scq); |
933 | } | 948 | } |
934 | 949 | ||
@@ -936,16 +951,23 @@ static void free_scq(scq_info * scq, struct atm_vcc *vcc) | |||
936 | or large buffer(s) cast to u32. */ | 951 | or large buffer(s) cast to u32. */ |
937 | static void push_rxbufs(ns_dev * card, struct sk_buff *skb) | 952 | static void push_rxbufs(ns_dev * card, struct sk_buff *skb) |
938 | { | 953 | { |
939 | struct ns_skb_cb *cb = NS_SKB_CB(skb); | 954 | struct sk_buff *handle1, *handle2; |
940 | u32 handle1, addr1; | 955 | u32 id1 = 0, id2 = 0; |
941 | u32 handle2, addr2; | 956 | u32 addr1, addr2; |
942 | u32 stat; | 957 | u32 stat; |
943 | unsigned long flags; | 958 | unsigned long flags; |
959 | int err; | ||
944 | 960 | ||
945 | /* *BARF* */ | 961 | /* *BARF* */ |
946 | handle2 = addr2 = 0; | 962 | handle2 = NULL; |
947 | handle1 = (u32) skb; | 963 | addr2 = 0; |
948 | addr1 = (u32) virt_to_bus(skb->data); | 964 | handle1 = skb; |
965 | addr1 = pci_map_single(card->pcidev, | ||
966 | skb->data, | ||
967 | (NS_PRV_BUFTYPE(skb) == BUF_SM | ||
968 | ? NS_SMSKBSIZE : NS_LGSKBSIZE), | ||
969 | PCI_DMA_TODEVICE); | ||
970 | NS_PRV_DMA(skb) = addr1; /* save so we can unmap later */ | ||
949 | 971 | ||
950 | #ifdef GENERAL_DEBUG | 972 | #ifdef GENERAL_DEBUG |
951 | if (!addr1) | 973 | if (!addr1) |
@@ -956,7 +978,7 @@ static void push_rxbufs(ns_dev * card, struct sk_buff *skb) | |||
956 | stat = readl(card->membase + STAT); | 978 | stat = readl(card->membase + STAT); |
957 | card->sbfqc = ns_stat_sfbqc_get(stat); | 979 | card->sbfqc = ns_stat_sfbqc_get(stat); |
958 | card->lbfqc = ns_stat_lfbqc_get(stat); | 980 | card->lbfqc = ns_stat_lfbqc_get(stat); |
959 | if (cb->buf_type == BUF_SM) { | 981 | if (NS_PRV_BUFTYPE(skb) == BUF_SM) { |
960 | if (!addr2) { | 982 | if (!addr2) { |
961 | if (card->sm_addr) { | 983 | if (card->sm_addr) { |
962 | addr2 = card->sm_addr; | 984 | addr2 = card->sm_addr; |
@@ -986,47 +1008,60 @@ static void push_rxbufs(ns_dev * card, struct sk_buff *skb) | |||
986 | } | 1008 | } |
987 | 1009 | ||
988 | if (addr2) { | 1010 | if (addr2) { |
989 | if (cb->buf_type == BUF_SM) { | 1011 | if (NS_PRV_BUFTYPE(skb) == BUF_SM) { |
990 | if (card->sbfqc >= card->sbnr.max) { | 1012 | if (card->sbfqc >= card->sbnr.max) { |
991 | skb_unlink((struct sk_buff *)handle1, | 1013 | skb_unlink(handle1, &card->sbpool.queue); |
992 | &card->sbpool.queue); | 1014 | dev_kfree_skb_any(handle1); |
993 | dev_kfree_skb_any((struct sk_buff *)handle1); | 1015 | skb_unlink(handle2, &card->sbpool.queue); |
994 | skb_unlink((struct sk_buff *)handle2, | 1016 | dev_kfree_skb_any(handle2); |
995 | &card->sbpool.queue); | ||
996 | dev_kfree_skb_any((struct sk_buff *)handle2); | ||
997 | return; | 1017 | return; |
998 | } else | 1018 | } else |
999 | card->sbfqc += 2; | 1019 | card->sbfqc += 2; |
1000 | } else { /* (buf_type == BUF_LG) */ | 1020 | } else { /* (buf_type == BUF_LG) */ |
1001 | 1021 | ||
1002 | if (card->lbfqc >= card->lbnr.max) { | 1022 | if (card->lbfqc >= card->lbnr.max) { |
1003 | skb_unlink((struct sk_buff *)handle1, | 1023 | skb_unlink(handle1, &card->lbpool.queue); |
1004 | &card->lbpool.queue); | 1024 | dev_kfree_skb_any(handle1); |
1005 | dev_kfree_skb_any((struct sk_buff *)handle1); | 1025 | skb_unlink(handle2, &card->lbpool.queue); |
1006 | skb_unlink((struct sk_buff *)handle2, | 1026 | dev_kfree_skb_any(handle2); |
1007 | &card->lbpool.queue); | ||
1008 | dev_kfree_skb_any((struct sk_buff *)handle2); | ||
1009 | return; | 1027 | return; |
1010 | } else | 1028 | } else |
1011 | card->lbfqc += 2; | 1029 | card->lbfqc += 2; |
1012 | } | 1030 | } |
1013 | 1031 | ||
1014 | spin_lock_irqsave(&card->res_lock, flags); | 1032 | do { |
1033 | if (!idr_pre_get(&card->idr, GFP_ATOMIC)) { | ||
1034 | printk(KERN_ERR | ||
1035 | "nicstar%d: no free memory for idr\n", | ||
1036 | card->index); | ||
1037 | goto out; | ||
1038 | } | ||
1039 | |||
1040 | if (!id1) | ||
1041 | err = idr_get_new_above(&card->idr, handle1, 0, &id1); | ||
1042 | |||
1043 | if (!id2 && err == 0) | ||
1044 | err = idr_get_new_above(&card->idr, handle2, 0, &id2); | ||
1045 | |||
1046 | } while (err == -EAGAIN); | ||
1015 | 1047 | ||
1048 | if (err) | ||
1049 | goto out; | ||
1050 | |||
1051 | spin_lock_irqsave(&card->res_lock, flags); | ||
1016 | while (CMD_BUSY(card)) ; | 1052 | while (CMD_BUSY(card)) ; |
1017 | writel(addr2, card->membase + DR3); | 1053 | writel(addr2, card->membase + DR3); |
1018 | writel(handle2, card->membase + DR2); | 1054 | writel(id2, card->membase + DR2); |
1019 | writel(addr1, card->membase + DR1); | 1055 | writel(addr1, card->membase + DR1); |
1020 | writel(handle1, card->membase + DR0); | 1056 | writel(id1, card->membase + DR0); |
1021 | writel(NS_CMD_WRITE_FREEBUFQ | cb->buf_type, | 1057 | writel(NS_CMD_WRITE_FREEBUFQ | NS_PRV_BUFTYPE(skb), |
1022 | card->membase + CMD); | 1058 | card->membase + CMD); |
1023 | |||
1024 | spin_unlock_irqrestore(&card->res_lock, flags); | 1059 | spin_unlock_irqrestore(&card->res_lock, flags); |
1025 | 1060 | ||
1026 | XPRINTK("nicstar%d: Pushing %s buffers at 0x%x and 0x%x.\n", | 1061 | XPRINTK("nicstar%d: Pushing %s buffers at 0x%x and 0x%x.\n", |
1027 | card->index, | 1062 | card->index, |
1028 | (cb->buf_type == BUF_SM ? "small" : "large"), addr1, | 1063 | (NS_PRV_BUFTYPE(skb) == BUF_SM ? "small" : "large"), |
1029 | addr2); | 1064 | addr1, addr2); |
1030 | } | 1065 | } |
1031 | 1066 | ||
1032 | if (!card->efbie && card->sbfqc >= card->sbnr.min && | 1067 | if (!card->efbie && card->sbfqc >= card->sbnr.min && |
@@ -1036,6 +1071,7 @@ static void push_rxbufs(ns_dev * card, struct sk_buff *skb) | |||
1036 | card->membase + CFG); | 1071 | card->membase + CFG); |
1037 | } | 1072 | } |
1038 | 1073 | ||
1074 | out: | ||
1039 | return; | 1075 | return; |
1040 | } | 1076 | } |
1041 | 1077 | ||
@@ -1131,21 +1167,21 @@ static irqreturn_t ns_irq_handler(int irq, void *dev_id) | |||
1131 | next interrupt. As this preliminary support is only meant to | 1167 | next interrupt. As this preliminary support is only meant to |
1132 | avoid buffer leakage, this is not an issue. */ | 1168 | avoid buffer leakage, this is not an issue. */ |
1133 | while (readl(card->membase + RAWCT) != card->rawch) { | 1169 | while (readl(card->membase + RAWCT) != card->rawch) { |
1134 | ns_rcqe *rawcell; | ||
1135 | 1170 | ||
1136 | rawcell = (ns_rcqe *) bus_to_virt(card->rawch); | 1171 | if (ns_rcqe_islast(card->rawcell)) { |
1137 | if (ns_rcqe_islast(rawcell)) { | ||
1138 | struct sk_buff *oldbuf; | 1172 | struct sk_buff *oldbuf; |
1139 | 1173 | ||
1140 | oldbuf = card->rcbuf; | 1174 | oldbuf = card->rcbuf; |
1141 | card->rcbuf = | 1175 | card->rcbuf = idr_find(&card->idr, |
1142 | (struct sk_buff *) | 1176 | ns_rcqe_nextbufhandle(card->rawcell)); |
1143 | ns_rcqe_nextbufhandle(rawcell); | 1177 | card->rawch = NS_PRV_DMA(card->rcbuf); |
1144 | card->rawch = | 1178 | card->rawcell = (struct ns_rcqe *) |
1145 | (u32) virt_to_bus(card->rcbuf->data); | 1179 | card->rcbuf->data; |
1146 | recycle_rx_buf(card, oldbuf); | 1180 | recycle_rx_buf(card, oldbuf); |
1147 | } else | 1181 | } else { |
1148 | card->rawch += NS_RCQE_SIZE; | 1182 | card->rawch += NS_RCQE_SIZE; |
1183 | card->rawcell++; | ||
1184 | } | ||
1149 | } | 1185 | } |
1150 | } | 1186 | } |
1151 | 1187 | ||
@@ -1165,7 +1201,7 @@ static irqreturn_t ns_irq_handler(int irq, void *dev_id) | |||
1165 | card->efbie = 0; | 1201 | card->efbie = 0; |
1166 | break; | 1202 | break; |
1167 | } | 1203 | } |
1168 | NS_SKB_CB(sb)->buf_type = BUF_SM; | 1204 | NS_PRV_BUFTYPE(sb) = BUF_SM; |
1169 | skb_queue_tail(&card->sbpool.queue, sb); | 1205 | skb_queue_tail(&card->sbpool.queue, sb); |
1170 | skb_reserve(sb, NS_AAL0_HEADER); | 1206 | skb_reserve(sb, NS_AAL0_HEADER); |
1171 | push_rxbufs(card, sb); | 1207 | push_rxbufs(card, sb); |
@@ -1190,7 +1226,7 @@ static irqreturn_t ns_irq_handler(int irq, void *dev_id) | |||
1190 | card->efbie = 0; | 1226 | card->efbie = 0; |
1191 | break; | 1227 | break; |
1192 | } | 1228 | } |
1193 | NS_SKB_CB(lb)->buf_type = BUF_LG; | 1229 | NS_PRV_BUFTYPE(lb) = BUF_LG; |
1194 | skb_queue_tail(&card->lbpool.queue, lb); | 1230 | skb_queue_tail(&card->lbpool.queue, lb); |
1195 | skb_reserve(lb, NS_SMBUFSIZE); | 1231 | skb_reserve(lb, NS_SMBUFSIZE); |
1196 | push_rxbufs(card, lb); | 1232 | push_rxbufs(card, lb); |
@@ -1338,7 +1374,7 @@ static int ns_open(struct atm_vcc *vcc) | |||
1338 | 1374 | ||
1339 | vc->cbr_scd = NS_FRSCD + frscdi * NS_FRSCD_SIZE; | 1375 | vc->cbr_scd = NS_FRSCD + frscdi * NS_FRSCD_SIZE; |
1340 | 1376 | ||
1341 | scq = get_scq(CBR_SCQSIZE, vc->cbr_scd); | 1377 | scq = get_scq(card, CBR_SCQSIZE, vc->cbr_scd); |
1342 | if (scq == NULL) { | 1378 | if (scq == NULL) { |
1343 | PRINTK("nicstar%d: can't get fixed rate SCQ.\n", | 1379 | PRINTK("nicstar%d: can't get fixed rate SCQ.\n", |
1344 | card->index); | 1380 | card->index); |
@@ -1349,7 +1385,7 @@ static int ns_open(struct atm_vcc *vcc) | |||
1349 | return -ENOMEM; | 1385 | return -ENOMEM; |
1350 | } | 1386 | } |
1351 | vc->scq = scq; | 1387 | vc->scq = scq; |
1352 | u32d[0] = (u32) virt_to_bus(scq->base); | 1388 | u32d[0] = scq_virt_to_bus(scq, scq->base); |
1353 | u32d[1] = (u32) 0x00000000; | 1389 | u32d[1] = (u32) 0x00000000; |
1354 | u32d[2] = (u32) 0xffffffff; | 1390 | u32d[2] = (u32) 0xffffffff; |
1355 | u32d[3] = (u32) 0x00000000; | 1391 | u32d[3] = (u32) 0x00000000; |
@@ -1434,9 +1470,8 @@ static void ns_close(struct atm_vcc *vcc) | |||
1434 | card->index); | 1470 | card->index); |
1435 | iovb = vc->rx_iov; | 1471 | iovb = vc->rx_iov; |
1436 | recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, | 1472 | recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, |
1437 | NS_SKB(iovb)->iovcnt); | 1473 | NS_PRV_IOVCNT(iovb)); |
1438 | NS_SKB(iovb)->iovcnt = 0; | 1474 | NS_PRV_IOVCNT(iovb) = 0; |
1439 | NS_SKB(iovb)->vcc = NULL; | ||
1440 | spin_lock_irqsave(&card->int_lock, flags); | 1475 | spin_lock_irqsave(&card->int_lock, flags); |
1441 | recycle_iov_buf(card, iovb); | 1476 | recycle_iov_buf(card, iovb); |
1442 | spin_unlock_irqrestore(&card->int_lock, flags); | 1477 | spin_unlock_irqrestore(&card->int_lock, flags); |
@@ -1487,7 +1522,7 @@ static void ns_close(struct atm_vcc *vcc) | |||
1487 | scq->next = scq->base; | 1522 | scq->next = scq->base; |
1488 | else | 1523 | else |
1489 | scq->next++; | 1524 | scq->next++; |
1490 | data = (u32) virt_to_bus(scq->next); | 1525 | data = scq_virt_to_bus(scq, scq->next); |
1491 | ns_write_sram(card, scq->scd, &data, 1); | 1526 | ns_write_sram(card, scq->scd, &data, 1); |
1492 | } | 1527 | } |
1493 | spin_unlock_irqrestore(&scq->lock, flags); | 1528 | spin_unlock_irqrestore(&scq->lock, flags); |
@@ -1506,7 +1541,7 @@ static void ns_close(struct atm_vcc *vcc) | |||
1506 | } | 1541 | } |
1507 | 1542 | ||
1508 | card->scd2vc[(vc->cbr_scd - NS_FRSCD) / NS_FRSCD_SIZE] = NULL; | 1543 | card->scd2vc[(vc->cbr_scd - NS_FRSCD) / NS_FRSCD_SIZE] = NULL; |
1509 | free_scq(vc->scq, vcc); | 1544 | free_scq(card, vc->scq, vcc); |
1510 | } | 1545 | } |
1511 | 1546 | ||
1512 | /* remove all references to vcc before deleting it */ | 1547 | /* remove all references to vcc before deleting it */ |
@@ -1539,13 +1574,13 @@ static void ns_close(struct atm_vcc *vcc) | |||
1539 | cfg = readl(card->membase + CFG); | 1574 | cfg = readl(card->membase + CFG); |
1540 | printk("STAT = 0x%08X CFG = 0x%08X \n", stat, cfg); | 1575 | printk("STAT = 0x%08X CFG = 0x%08X \n", stat, cfg); |
1541 | printk | 1576 | printk |
1542 | ("TSQ: base = 0x%08X next = 0x%08X last = 0x%08X TSQT = 0x%08X \n", | 1577 | ("TSQ: base = 0x%p next = 0x%p last = 0x%p TSQT = 0x%08X \n", |
1543 | (u32) card->tsq.base, (u32) card->tsq.next, | 1578 | card->tsq.base, card->tsq.next, |
1544 | (u32) card->tsq.last, readl(card->membase + TSQT)); | 1579 | card->tsq.last, readl(card->membase + TSQT)); |
1545 | printk | 1580 | printk |
1546 | ("RSQ: base = 0x%08X next = 0x%08X last = 0x%08X RSQT = 0x%08X \n", | 1581 | ("RSQ: base = 0x%p next = 0x%p last = 0x%p RSQT = 0x%08X \n", |
1547 | (u32) card->rsq.base, (u32) card->rsq.next, | 1582 | card->rsq.base, card->rsq.next, |
1548 | (u32) card->rsq.last, readl(card->membase + RSQT)); | 1583 | card->rsq.last, readl(card->membase + RSQT)); |
1549 | printk("Empty free buffer queue interrupt %s \n", | 1584 | printk("Empty free buffer queue interrupt %s \n", |
1550 | card->efbie ? "enabled" : "disabled"); | 1585 | card->efbie ? "enabled" : "disabled"); |
1551 | printk("SBCNT = %d count = %d LBCNT = %d count = %d \n", | 1586 | printk("SBCNT = %d count = %d LBCNT = %d count = %d \n", |
@@ -1651,11 +1686,14 @@ static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb) | |||
1651 | 1686 | ||
1652 | ATM_SKB(skb)->vcc = vcc; | 1687 | ATM_SKB(skb)->vcc = vcc; |
1653 | 1688 | ||
1689 | NS_PRV_DMA(skb) = pci_map_single(card->pcidev, skb->data, | ||
1690 | skb->len, PCI_DMA_TODEVICE); | ||
1691 | |||
1654 | if (vcc->qos.aal == ATM_AAL5) { | 1692 | if (vcc->qos.aal == ATM_AAL5) { |
1655 | buflen = (skb->len + 47 + 8) / 48 * 48; /* Multiple of 48 */ | 1693 | buflen = (skb->len + 47 + 8) / 48 * 48; /* Multiple of 48 */ |
1656 | flags = NS_TBD_AAL5; | 1694 | flags = NS_TBD_AAL5; |
1657 | scqe.word_2 = cpu_to_le32((u32) virt_to_bus(skb->data)); | 1695 | scqe.word_2 = cpu_to_le32(NS_PRV_DMA(skb)); |
1658 | scqe.word_3 = cpu_to_le32((u32) skb->len); | 1696 | scqe.word_3 = cpu_to_le32(skb->len); |
1659 | scqe.word_4 = | 1697 | scqe.word_4 = |
1660 | ns_tbd_mkword_4(0, (u32) vcc->vpi, (u32) vcc->vci, 0, | 1698 | ns_tbd_mkword_4(0, (u32) vcc->vpi, (u32) vcc->vci, 0, |
1661 | ATM_SKB(skb)-> | 1699 | ATM_SKB(skb)-> |
@@ -1665,8 +1703,7 @@ static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb) | |||
1665 | 1703 | ||
1666 | buflen = ATM_CELL_PAYLOAD; /* i.e., 48 bytes */ | 1704 | buflen = ATM_CELL_PAYLOAD; /* i.e., 48 bytes */ |
1667 | flags = NS_TBD_AAL0; | 1705 | flags = NS_TBD_AAL0; |
1668 | scqe.word_2 = | 1706 | scqe.word_2 = cpu_to_le32(NS_PRV_DMA(skb) + NS_AAL0_HEADER); |
1669 | cpu_to_le32((u32) virt_to_bus(skb->data) + NS_AAL0_HEADER); | ||
1670 | scqe.word_3 = cpu_to_le32(0x00000000); | 1707 | scqe.word_3 = cpu_to_le32(0x00000000); |
1671 | if (*skb->data & 0x02) /* Payload type 1 - end of pdu */ | 1708 | if (*skb->data & 0x02) /* Payload type 1 - end of pdu */ |
1672 | flags |= NS_TBD_EOPDU; | 1709 | flags |= NS_TBD_EOPDU; |
@@ -1733,12 +1770,12 @@ static int push_scqe(ns_dev * card, vc_map * vc, scq_info * scq, ns_scqe * tbd, | |||
1733 | *scq->next = *tbd; | 1770 | *scq->next = *tbd; |
1734 | index = (int)(scq->next - scq->base); | 1771 | index = (int)(scq->next - scq->base); |
1735 | scq->skb[index] = skb; | 1772 | scq->skb[index] = skb; |
1736 | XPRINTK("nicstar%d: sending skb at 0x%x (pos %d).\n", | 1773 | XPRINTK("nicstar%d: sending skb at 0x%p (pos %d).\n", |
1737 | card->index, (u32) skb, index); | 1774 | card->index, skb, index); |
1738 | XPRINTK("nicstar%d: TBD written:\n0x%x\n0x%x\n0x%x\n0x%x\n at 0x%x.\n", | 1775 | XPRINTK("nicstar%d: TBD written:\n0x%x\n0x%x\n0x%x\n0x%x\n at 0x%p.\n", |
1739 | card->index, le32_to_cpu(tbd->word_1), le32_to_cpu(tbd->word_2), | 1776 | card->index, le32_to_cpu(tbd->word_1), le32_to_cpu(tbd->word_2), |
1740 | le32_to_cpu(tbd->word_3), le32_to_cpu(tbd->word_4), | 1777 | le32_to_cpu(tbd->word_3), le32_to_cpu(tbd->word_4), |
1741 | (u32) scq->next); | 1778 | scq->next); |
1742 | if (scq->next == scq->last) | 1779 | if (scq->next == scq->last) |
1743 | scq->next = scq->base; | 1780 | scq->next = scq->base; |
1744 | else | 1781 | else |
@@ -1757,7 +1794,7 @@ static int push_scqe(ns_dev * card, vc_map * vc, scq_info * scq, ns_scqe * tbd, | |||
1757 | 1794 | ||
1758 | while (scq->tail == scq->next) { | 1795 | while (scq->tail == scq->next) { |
1759 | if (in_interrupt()) { | 1796 | if (in_interrupt()) { |
1760 | data = (u32) virt_to_bus(scq->next); | 1797 | data = scq_virt_to_bus(scq, scq->next); |
1761 | ns_write_sram(card, scq->scd, &data, 1); | 1798 | ns_write_sram(card, scq->scd, &data, 1); |
1762 | spin_unlock_irqrestore(&scq->lock, flags); | 1799 | spin_unlock_irqrestore(&scq->lock, flags); |
1763 | printk("nicstar%d: Error pushing TSR.\n", | 1800 | printk("nicstar%d: Error pushing TSR.\n", |
@@ -1789,10 +1826,10 @@ static int push_scqe(ns_dev * card, vc_map * vc, scq_info * scq, ns_scqe * tbd, | |||
1789 | index = (int)scqi; | 1826 | index = (int)scqi; |
1790 | scq->skb[index] = NULL; | 1827 | scq->skb[index] = NULL; |
1791 | XPRINTK | 1828 | XPRINTK |
1792 | ("nicstar%d: TSR written:\n0x%x\n0x%x\n0x%x\n0x%x\n at 0x%x.\n", | 1829 | ("nicstar%d: TSR written:\n0x%x\n0x%x\n0x%x\n0x%x\n at 0x%p.\n", |
1793 | card->index, le32_to_cpu(tsr.word_1), | 1830 | card->index, le32_to_cpu(tsr.word_1), |
1794 | le32_to_cpu(tsr.word_2), le32_to_cpu(tsr.word_3), | 1831 | le32_to_cpu(tsr.word_2), le32_to_cpu(tsr.word_3), |
1795 | le32_to_cpu(tsr.word_4), (u32) scq->next); | 1832 | le32_to_cpu(tsr.word_4), scq->next); |
1796 | if (scq->next == scq->last) | 1833 | if (scq->next == scq->last) |
1797 | scq->next = scq->base; | 1834 | scq->next = scq->base; |
1798 | else | 1835 | else |
@@ -1803,7 +1840,7 @@ static int push_scqe(ns_dev * card, vc_map * vc, scq_info * scq, ns_scqe * tbd, | |||
1803 | PRINTK("nicstar%d: Timeout pushing TSR.\n", | 1840 | PRINTK("nicstar%d: Timeout pushing TSR.\n", |
1804 | card->index); | 1841 | card->index); |
1805 | } | 1842 | } |
1806 | data = (u32) virt_to_bus(scq->next); | 1843 | data = scq_virt_to_bus(scq, scq->next); |
1807 | ns_write_sram(card, scq->scd, &data, 1); | 1844 | ns_write_sram(card, scq->scd, &data, 1); |
1808 | 1845 | ||
1809 | spin_unlock_irqrestore(&scq->lock, flags); | 1846 | spin_unlock_irqrestore(&scq->lock, flags); |
@@ -1881,10 +1918,9 @@ static void process_tsq(ns_dev * card) | |||
1881 | two_ahead = one_ahead + 1; | 1918 | two_ahead = one_ahead + 1; |
1882 | } | 1919 | } |
1883 | 1920 | ||
1884 | if (serviced_entries) { | 1921 | if (serviced_entries) |
1885 | writel((((u32) previous) - ((u32) card->tsq.base)), | 1922 | writel(PTR_DIFF(previous, card->tsq.base), |
1886 | card->membase + TSQH); | 1923 | card->membase + TSQH); |
1887 | } | ||
1888 | } | 1924 | } |
1889 | 1925 | ||
1890 | static void drain_scq(ns_dev * card, scq_info * scq, int pos) | 1926 | static void drain_scq(ns_dev * card, scq_info * scq, int pos) |
@@ -1894,8 +1930,8 @@ static void drain_scq(ns_dev * card, scq_info * scq, int pos) | |||
1894 | int i; | 1930 | int i; |
1895 | unsigned long flags; | 1931 | unsigned long flags; |
1896 | 1932 | ||
1897 | XPRINTK("nicstar%d: drain_scq() called, scq at 0x%x, pos %d.\n", | 1933 | XPRINTK("nicstar%d: drain_scq() called, scq at 0x%p, pos %d.\n", |
1898 | card->index, (u32) scq, pos); | 1934 | card->index, scq, pos); |
1899 | if (pos >= scq->num_entries) { | 1935 | if (pos >= scq->num_entries) { |
1900 | printk("nicstar%d: Bad index on drain_scq().\n", card->index); | 1936 | printk("nicstar%d: Bad index on drain_scq().\n", card->index); |
1901 | return; | 1937 | return; |
@@ -1907,9 +1943,13 @@ static void drain_scq(ns_dev * card, scq_info * scq, int pos) | |||
1907 | i = 0; | 1943 | i = 0; |
1908 | while (i != pos) { | 1944 | while (i != pos) { |
1909 | skb = scq->skb[i]; | 1945 | skb = scq->skb[i]; |
1910 | XPRINTK("nicstar%d: freeing skb at 0x%x (index %d).\n", | 1946 | XPRINTK("nicstar%d: freeing skb at 0x%p (index %d).\n", |
1911 | card->index, (u32) skb, i); | 1947 | card->index, skb, i); |
1912 | if (skb != NULL) { | 1948 | if (skb != NULL) { |
1949 | pci_unmap_single(card->pcidev, | ||
1950 | NS_PRV_DMA(skb), | ||
1951 | skb->len, | ||
1952 | PCI_DMA_TODEVICE); | ||
1913 | vcc = ATM_SKB(skb)->vcc; | 1953 | vcc = ATM_SKB(skb)->vcc; |
1914 | if (vcc && vcc->pop != NULL) { | 1954 | if (vcc && vcc->pop != NULL) { |
1915 | vcc->pop(vcc, skb); | 1955 | vcc->pop(vcc, skb); |
@@ -1940,8 +1980,7 @@ static void process_rsq(ns_dev * card) | |||
1940 | else | 1980 | else |
1941 | card->rsq.next++; | 1981 | card->rsq.next++; |
1942 | } while (ns_rsqe_valid(card->rsq.next)); | 1982 | } while (ns_rsqe_valid(card->rsq.next)); |
1943 | writel((((u32) previous) - ((u32) card->rsq.base)), | 1983 | writel(PTR_DIFF(previous, card->rsq.base), card->membase + RSQH); |
1944 | card->membase + RSQH); | ||
1945 | } | 1984 | } |
1946 | 1985 | ||
1947 | static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) | 1986 | static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) |
@@ -1955,12 +1994,30 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) | |||
1955 | unsigned short aal5_len; | 1994 | unsigned short aal5_len; |
1956 | int len; | 1995 | int len; |
1957 | u32 stat; | 1996 | u32 stat; |
1997 | u32 id; | ||
1958 | 1998 | ||
1959 | stat = readl(card->membase + STAT); | 1999 | stat = readl(card->membase + STAT); |
1960 | card->sbfqc = ns_stat_sfbqc_get(stat); | 2000 | card->sbfqc = ns_stat_sfbqc_get(stat); |
1961 | card->lbfqc = ns_stat_lfbqc_get(stat); | 2001 | card->lbfqc = ns_stat_lfbqc_get(stat); |
1962 | 2002 | ||
1963 | skb = (struct sk_buff *)le32_to_cpu(rsqe->buffer_handle); | 2003 | id = le32_to_cpu(rsqe->buffer_handle); |
2004 | skb = idr_find(&card->idr, id); | ||
2005 | if (!skb) { | ||
2006 | RXPRINTK(KERN_ERR | ||
2007 | "nicstar%d: idr_find() failed!\n", card->index); | ||
2008 | return; | ||
2009 | } | ||
2010 | idr_remove(&card->idr, id); | ||
2011 | pci_dma_sync_single_for_cpu(card->pcidev, | ||
2012 | NS_PRV_DMA(skb), | ||
2013 | (NS_PRV_BUFTYPE(skb) == BUF_SM | ||
2014 | ? NS_SMSKBSIZE : NS_LGSKBSIZE), | ||
2015 | PCI_DMA_FROMDEVICE); | ||
2016 | pci_unmap_single(card->pcidev, | ||
2017 | NS_PRV_DMA(skb), | ||
2018 | (NS_PRV_BUFTYPE(skb) == BUF_SM | ||
2019 | ? NS_SMSKBSIZE : NS_LGSKBSIZE), | ||
2020 | PCI_DMA_FROMDEVICE); | ||
1964 | vpi = ns_rsqe_vpi(rsqe); | 2021 | vpi = ns_rsqe_vpi(rsqe); |
1965 | vci = ns_rsqe_vci(rsqe); | 2022 | vci = ns_rsqe_vci(rsqe); |
1966 | if (vpi >= 1UL << card->vpibits || vci >= 1UL << card->vcibits) { | 2023 | if (vpi >= 1UL << card->vpibits || vci >= 1UL << card->vcibits) { |
@@ -2034,43 +2091,42 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) | |||
2034 | recycle_rx_buf(card, skb); | 2091 | recycle_rx_buf(card, skb); |
2035 | return; | 2092 | return; |
2036 | } | 2093 | } |
2037 | NS_SKB_CB(iovb)->buf_type = BUF_NONE; | 2094 | NS_PRV_BUFTYPE(iovb) = BUF_NONE; |
2038 | } else if (--card->iovpool.count < card->iovnr.min) { | 2095 | } else if (--card->iovpool.count < card->iovnr.min) { |
2039 | struct sk_buff *new_iovb; | 2096 | struct sk_buff *new_iovb; |
2040 | if ((new_iovb = | 2097 | if ((new_iovb = |
2041 | alloc_skb(NS_IOVBUFSIZE, GFP_ATOMIC)) != NULL) { | 2098 | alloc_skb(NS_IOVBUFSIZE, GFP_ATOMIC)) != NULL) { |
2042 | NS_SKB_CB(iovb)->buf_type = BUF_NONE; | 2099 | NS_PRV_BUFTYPE(iovb) = BUF_NONE; |
2043 | skb_queue_tail(&card->iovpool.queue, new_iovb); | 2100 | skb_queue_tail(&card->iovpool.queue, new_iovb); |
2044 | card->iovpool.count++; | 2101 | card->iovpool.count++; |
2045 | } | 2102 | } |
2046 | } | 2103 | } |
2047 | vc->rx_iov = iovb; | 2104 | vc->rx_iov = iovb; |
2048 | NS_SKB(iovb)->iovcnt = 0; | 2105 | NS_PRV_IOVCNT(iovb) = 0; |
2049 | iovb->len = 0; | 2106 | iovb->len = 0; |
2050 | iovb->data = iovb->head; | 2107 | iovb->data = iovb->head; |
2051 | skb_reset_tail_pointer(iovb); | 2108 | skb_reset_tail_pointer(iovb); |
2052 | NS_SKB(iovb)->vcc = vcc; | ||
2053 | /* IMPORTANT: a pointer to the sk_buff containing the small or large | 2109 | /* IMPORTANT: a pointer to the sk_buff containing the small or large |
2054 | buffer is stored as iovec base, NOT a pointer to the | 2110 | buffer is stored as iovec base, NOT a pointer to the |
2055 | small or large buffer itself. */ | 2111 | small or large buffer itself. */ |
2056 | } else if (NS_SKB(iovb)->iovcnt >= NS_MAX_IOVECS) { | 2112 | } else if (NS_PRV_IOVCNT(iovb) >= NS_MAX_IOVECS) { |
2057 | printk("nicstar%d: received too big AAL5 SDU.\n", card->index); | 2113 | printk("nicstar%d: received too big AAL5 SDU.\n", card->index); |
2058 | atomic_inc(&vcc->stats->rx_err); | 2114 | atomic_inc(&vcc->stats->rx_err); |
2059 | recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, | 2115 | recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, |
2060 | NS_MAX_IOVECS); | 2116 | NS_MAX_IOVECS); |
2061 | NS_SKB(iovb)->iovcnt = 0; | 2117 | NS_PRV_IOVCNT(iovb) = 0; |
2062 | iovb->len = 0; | 2118 | iovb->len = 0; |
2063 | iovb->data = iovb->head; | 2119 | iovb->data = iovb->head; |
2064 | skb_reset_tail_pointer(iovb); | 2120 | skb_reset_tail_pointer(iovb); |
2065 | NS_SKB(iovb)->vcc = vcc; | ||
2066 | } | 2121 | } |
2067 | iov = &((struct iovec *)iovb->data)[NS_SKB(iovb)->iovcnt++]; | 2122 | iov = &((struct iovec *)iovb->data)[NS_PRV_IOVCNT(iovb)++]; |
2068 | iov->iov_base = (void *)skb; | 2123 | iov->iov_base = (void *)skb; |
2069 | iov->iov_len = ns_rsqe_cellcount(rsqe) * 48; | 2124 | iov->iov_len = ns_rsqe_cellcount(rsqe) * 48; |
2070 | iovb->len += iov->iov_len; | 2125 | iovb->len += iov->iov_len; |
2071 | 2126 | ||
2072 | if (NS_SKB(iovb)->iovcnt == 1) { | 2127 | #ifdef EXTRA_DEBUG |
2073 | if (NS_SKB_CB(skb)->buf_type != BUF_SM) { | 2128 | if (NS_PRV_IOVCNT(iovb) == 1) { |
2129 | if (NS_PRV_BUFTYPE(skb) != BUF_SM) { | ||
2074 | printk | 2130 | printk |
2075 | ("nicstar%d: Expected a small buffer, and this is not one.\n", | 2131 | ("nicstar%d: Expected a small buffer, and this is not one.\n", |
2076 | card->index); | 2132 | card->index); |
@@ -2081,26 +2137,27 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) | |||
2081 | recycle_iov_buf(card, iovb); | 2137 | recycle_iov_buf(card, iovb); |
2082 | return; | 2138 | return; |
2083 | } | 2139 | } |
2084 | } else { /* NS_SKB(iovb)->iovcnt >= 2 */ | 2140 | } else { /* NS_PRV_IOVCNT(iovb) >= 2 */ |
2085 | 2141 | ||
2086 | if (NS_SKB_CB(skb)->buf_type != BUF_LG) { | 2142 | if (NS_PRV_BUFTYPE(skb) != BUF_LG) { |
2087 | printk | 2143 | printk |
2088 | ("nicstar%d: Expected a large buffer, and this is not one.\n", | 2144 | ("nicstar%d: Expected a large buffer, and this is not one.\n", |
2089 | card->index); | 2145 | card->index); |
2090 | which_list(card, skb); | 2146 | which_list(card, skb); |
2091 | atomic_inc(&vcc->stats->rx_err); | 2147 | atomic_inc(&vcc->stats->rx_err); |
2092 | recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, | 2148 | recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, |
2093 | NS_SKB(iovb)->iovcnt); | 2149 | NS_PRV_IOVCNT(iovb)); |
2094 | vc->rx_iov = NULL; | 2150 | vc->rx_iov = NULL; |
2095 | recycle_iov_buf(card, iovb); | 2151 | recycle_iov_buf(card, iovb); |
2096 | return; | 2152 | return; |
2097 | } | 2153 | } |
2098 | } | 2154 | } |
2155 | #endif /* EXTRA_DEBUG */ | ||
2099 | 2156 | ||
2100 | if (ns_rsqe_eopdu(rsqe)) { | 2157 | if (ns_rsqe_eopdu(rsqe)) { |
2101 | /* This works correctly regardless of the endianness of the host */ | 2158 | /* This works correctly regardless of the endianness of the host */ |
2102 | unsigned char *L1L2 = (unsigned char *)((u32) skb->data + | 2159 | unsigned char *L1L2 = (unsigned char *) |
2103 | iov->iov_len - 6); | 2160 | (skb->data + iov->iov_len - 6); |
2104 | aal5_len = L1L2[0] << 8 | L1L2[1]; | 2161 | aal5_len = L1L2[0] << 8 | L1L2[1]; |
2105 | len = (aal5_len == 0x0000) ? 0x10000 : aal5_len; | 2162 | len = (aal5_len == 0x0000) ? 0x10000 : aal5_len; |
2106 | if (ns_rsqe_crcerr(rsqe) || | 2163 | if (ns_rsqe_crcerr(rsqe) || |
@@ -2112,7 +2169,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) | |||
2112 | printk(".\n"); | 2169 | printk(".\n"); |
2113 | atomic_inc(&vcc->stats->rx_err); | 2170 | atomic_inc(&vcc->stats->rx_err); |
2114 | recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, | 2171 | recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, |
2115 | NS_SKB(iovb)->iovcnt); | 2172 | NS_PRV_IOVCNT(iovb)); |
2116 | vc->rx_iov = NULL; | 2173 | vc->rx_iov = NULL; |
2117 | recycle_iov_buf(card, iovb); | 2174 | recycle_iov_buf(card, iovb); |
2118 | return; | 2175 | return; |
@@ -2120,7 +2177,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) | |||
2120 | 2177 | ||
2121 | /* By this point we (hopefully) have a complete SDU without errors. */ | 2178 | /* By this point we (hopefully) have a complete SDU without errors. */ |
2122 | 2179 | ||
2123 | if (NS_SKB(iovb)->iovcnt == 1) { /* Just a small buffer */ | 2180 | if (NS_PRV_IOVCNT(iovb) == 1) { /* Just a small buffer */ |
2124 | /* skb points to a small buffer */ | 2181 | /* skb points to a small buffer */ |
2125 | if (!atm_charge(vcc, skb->truesize)) { | 2182 | if (!atm_charge(vcc, skb->truesize)) { |
2126 | push_rxbufs(card, skb); | 2183 | push_rxbufs(card, skb); |
@@ -2136,7 +2193,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) | |||
2136 | vcc->push(vcc, skb); | 2193 | vcc->push(vcc, skb); |
2137 | atomic_inc(&vcc->stats->rx); | 2194 | atomic_inc(&vcc->stats->rx); |
2138 | } | 2195 | } |
2139 | } else if (NS_SKB(iovb)->iovcnt == 2) { /* One small plus one large buffer */ | 2196 | } else if (NS_PRV_IOVCNT(iovb) == 2) { /* One small plus one large buffer */ |
2140 | struct sk_buff *sb; | 2197 | struct sk_buff *sb; |
2141 | 2198 | ||
2142 | sb = (struct sk_buff *)(iov - 1)->iov_base; | 2199 | sb = (struct sk_buff *)(iov - 1)->iov_base; |
@@ -2202,8 +2259,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) | |||
2202 | recycle_iovec_rx_bufs(card, | 2259 | recycle_iovec_rx_bufs(card, |
2203 | (struct iovec *) | 2260 | (struct iovec *) |
2204 | iovb->data, | 2261 | iovb->data, |
2205 | NS_SKB(iovb)-> | 2262 | NS_PRV_IOVCNT(iovb)); |
2206 | iovcnt); | ||
2207 | vc->rx_iov = NULL; | 2263 | vc->rx_iov = NULL; |
2208 | recycle_iov_buf(card, iovb); | 2264 | recycle_iov_buf(card, iovb); |
2209 | return; | 2265 | return; |
@@ -2217,12 +2273,12 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) | |||
2217 | card->hbpool.count++; | 2273 | card->hbpool.count++; |
2218 | } | 2274 | } |
2219 | } | 2275 | } |
2220 | NS_SKB_CB(hb)->buf_type = BUF_NONE; | 2276 | NS_PRV_BUFTYPE(hb) = BUF_NONE; |
2221 | } else if (--card->hbpool.count < card->hbnr.min) { | 2277 | } else if (--card->hbpool.count < card->hbnr.min) { |
2222 | struct sk_buff *new_hb; | 2278 | struct sk_buff *new_hb; |
2223 | if ((new_hb = | 2279 | if ((new_hb = |
2224 | dev_alloc_skb(NS_HBUFSIZE)) != NULL) { | 2280 | dev_alloc_skb(NS_HBUFSIZE)) != NULL) { |
2225 | NS_SKB_CB(new_hb)->buf_type = BUF_NONE; | 2281 | NS_PRV_BUFTYPE(new_hb) = BUF_NONE; |
2226 | skb_queue_tail(&card->hbpool.queue, | 2282 | skb_queue_tail(&card->hbpool.queue, |
2227 | new_hb); | 2283 | new_hb); |
2228 | card->hbpool.count++; | 2284 | card->hbpool.count++; |
@@ -2231,7 +2287,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) | |||
2231 | if ((new_hb = | 2287 | if ((new_hb = |
2232 | dev_alloc_skb(NS_HBUFSIZE)) != | 2288 | dev_alloc_skb(NS_HBUFSIZE)) != |
2233 | NULL) { | 2289 | NULL) { |
2234 | NS_SKB_CB(new_hb)->buf_type = | 2290 | NS_PRV_BUFTYPE(new_hb) = |
2235 | BUF_NONE; | 2291 | BUF_NONE; |
2236 | skb_queue_tail(&card->hbpool. | 2292 | skb_queue_tail(&card->hbpool. |
2237 | queue, new_hb); | 2293 | queue, new_hb); |
@@ -2244,7 +2300,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) | |||
2244 | 2300 | ||
2245 | if (!atm_charge(vcc, hb->truesize)) { | 2301 | if (!atm_charge(vcc, hb->truesize)) { |
2246 | recycle_iovec_rx_bufs(card, iov, | 2302 | recycle_iovec_rx_bufs(card, iov, |
2247 | NS_SKB(iovb)->iovcnt); | 2303 | NS_PRV_IOVCNT(iovb)); |
2248 | if (card->hbpool.count < card->hbnr.max) { | 2304 | if (card->hbpool.count < card->hbnr.max) { |
2249 | skb_queue_tail(&card->hbpool.queue, hb); | 2305 | skb_queue_tail(&card->hbpool.queue, hb); |
2250 | card->hbpool.count++; | 2306 | card->hbpool.count++; |
@@ -2263,7 +2319,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) | |||
2263 | push_rxbufs(card, sb); | 2319 | push_rxbufs(card, sb); |
2264 | 2320 | ||
2265 | /* Copy all large buffers to the huge buffer and free them */ | 2321 | /* Copy all large buffers to the huge buffer and free them */ |
2266 | for (j = 1; j < NS_SKB(iovb)->iovcnt; j++) { | 2322 | for (j = 1; j < NS_PRV_IOVCNT(iovb); j++) { |
2267 | lb = (struct sk_buff *)iov->iov_base; | 2323 | lb = (struct sk_buff *)iov->iov_base; |
2268 | tocopy = | 2324 | tocopy = |
2269 | min_t(int, remaining, iov->iov_len); | 2325 | min_t(int, remaining, iov->iov_len); |
@@ -2313,7 +2369,7 @@ static void ns_sb_destructor(struct sk_buff *sb) | |||
2313 | sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL); | 2369 | sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL); |
2314 | if (sb == NULL) | 2370 | if (sb == NULL) |
2315 | break; | 2371 | break; |
2316 | NS_SKB_CB(sb)->buf_type = BUF_SM; | 2372 | NS_PRV_BUFTYPE(sb) = BUF_SM; |
2317 | skb_queue_tail(&card->sbpool.queue, sb); | 2373 | skb_queue_tail(&card->sbpool.queue, sb); |
2318 | skb_reserve(sb, NS_AAL0_HEADER); | 2374 | skb_reserve(sb, NS_AAL0_HEADER); |
2319 | push_rxbufs(card, sb); | 2375 | push_rxbufs(card, sb); |
@@ -2334,7 +2390,7 @@ static void ns_lb_destructor(struct sk_buff *lb) | |||
2334 | lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL); | 2390 | lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL); |
2335 | if (lb == NULL) | 2391 | if (lb == NULL) |
2336 | break; | 2392 | break; |
2337 | NS_SKB_CB(lb)->buf_type = BUF_LG; | 2393 | NS_PRV_BUFTYPE(lb) = BUF_LG; |
2338 | skb_queue_tail(&card->lbpool.queue, lb); | 2394 | skb_queue_tail(&card->lbpool.queue, lb); |
2339 | skb_reserve(lb, NS_SMBUFSIZE); | 2395 | skb_reserve(lb, NS_SMBUFSIZE); |
2340 | push_rxbufs(card, lb); | 2396 | push_rxbufs(card, lb); |
@@ -2351,7 +2407,7 @@ static void ns_hb_destructor(struct sk_buff *hb) | |||
2351 | hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL); | 2407 | hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL); |
2352 | if (hb == NULL) | 2408 | if (hb == NULL) |
2353 | break; | 2409 | break; |
2354 | NS_SKB_CB(hb)->buf_type = BUF_NONE; | 2410 | NS_PRV_BUFTYPE(hb) = BUF_NONE; |
2355 | skb_queue_tail(&card->hbpool.queue, hb); | 2411 | skb_queue_tail(&card->hbpool.queue, hb); |
2356 | card->hbpool.count++; | 2412 | card->hbpool.count++; |
2357 | } | 2413 | } |
@@ -2361,9 +2417,7 @@ static void ns_hb_destructor(struct sk_buff *hb) | |||
2361 | 2417 | ||
2362 | static void recycle_rx_buf(ns_dev * card, struct sk_buff *skb) | 2418 | static void recycle_rx_buf(ns_dev * card, struct sk_buff *skb) |
2363 | { | 2419 | { |
2364 | struct ns_skb_cb *cb = NS_SKB_CB(skb); | 2420 | if (unlikely(NS_PRV_BUFTYPE(skb) == BUF_NONE)) { |
2365 | |||
2366 | if (unlikely(cb->buf_type == BUF_NONE)) { | ||
2367 | printk("nicstar%d: What kind of rx buffer is this?\n", | 2421 | printk("nicstar%d: What kind of rx buffer is this?\n", |
2368 | card->index); | 2422 | card->index); |
2369 | dev_kfree_skb_any(skb); | 2423 | dev_kfree_skb_any(skb); |
@@ -2395,7 +2449,7 @@ static void dequeue_sm_buf(ns_dev * card, struct sk_buff *sb) | |||
2395 | if (card->sbfqc < card->sbnr.init) { | 2449 | if (card->sbfqc < card->sbnr.init) { |
2396 | struct sk_buff *new_sb; | 2450 | struct sk_buff *new_sb; |
2397 | if ((new_sb = dev_alloc_skb(NS_SMSKBSIZE)) != NULL) { | 2451 | if ((new_sb = dev_alloc_skb(NS_SMSKBSIZE)) != NULL) { |
2398 | NS_SKB_CB(new_sb)->buf_type = BUF_SM; | 2452 | NS_PRV_BUFTYPE(new_sb) = BUF_SM; |
2399 | skb_queue_tail(&card->sbpool.queue, new_sb); | 2453 | skb_queue_tail(&card->sbpool.queue, new_sb); |
2400 | skb_reserve(new_sb, NS_AAL0_HEADER); | 2454 | skb_reserve(new_sb, NS_AAL0_HEADER); |
2401 | push_rxbufs(card, new_sb); | 2455 | push_rxbufs(card, new_sb); |
@@ -2406,7 +2460,7 @@ static void dequeue_sm_buf(ns_dev * card, struct sk_buff *sb) | |||
2406 | { | 2460 | { |
2407 | struct sk_buff *new_sb; | 2461 | struct sk_buff *new_sb; |
2408 | if ((new_sb = dev_alloc_skb(NS_SMSKBSIZE)) != NULL) { | 2462 | if ((new_sb = dev_alloc_skb(NS_SMSKBSIZE)) != NULL) { |
2409 | NS_SKB_CB(new_sb)->buf_type = BUF_SM; | 2463 | NS_PRV_BUFTYPE(new_sb) = BUF_SM; |
2410 | skb_queue_tail(&card->sbpool.queue, new_sb); | 2464 | skb_queue_tail(&card->sbpool.queue, new_sb); |
2411 | skb_reserve(new_sb, NS_AAL0_HEADER); | 2465 | skb_reserve(new_sb, NS_AAL0_HEADER); |
2412 | push_rxbufs(card, new_sb); | 2466 | push_rxbufs(card, new_sb); |
@@ -2423,7 +2477,7 @@ static void dequeue_lg_buf(ns_dev * card, struct sk_buff *lb) | |||
2423 | if (card->lbfqc < card->lbnr.init) { | 2477 | if (card->lbfqc < card->lbnr.init) { |
2424 | struct sk_buff *new_lb; | 2478 | struct sk_buff *new_lb; |
2425 | if ((new_lb = dev_alloc_skb(NS_LGSKBSIZE)) != NULL) { | 2479 | if ((new_lb = dev_alloc_skb(NS_LGSKBSIZE)) != NULL) { |
2426 | NS_SKB_CB(new_lb)->buf_type = BUF_LG; | 2480 | NS_PRV_BUFTYPE(new_lb) = BUF_LG; |
2427 | skb_queue_tail(&card->lbpool.queue, new_lb); | 2481 | skb_queue_tail(&card->lbpool.queue, new_lb); |
2428 | skb_reserve(new_lb, NS_SMBUFSIZE); | 2482 | skb_reserve(new_lb, NS_SMBUFSIZE); |
2429 | push_rxbufs(card, new_lb); | 2483 | push_rxbufs(card, new_lb); |
@@ -2434,7 +2488,7 @@ static void dequeue_lg_buf(ns_dev * card, struct sk_buff *lb) | |||
2434 | { | 2488 | { |
2435 | struct sk_buff *new_lb; | 2489 | struct sk_buff *new_lb; |
2436 | if ((new_lb = dev_alloc_skb(NS_LGSKBSIZE)) != NULL) { | 2490 | if ((new_lb = dev_alloc_skb(NS_LGSKBSIZE)) != NULL) { |
2437 | NS_SKB_CB(new_lb)->buf_type = BUF_LG; | 2491 | NS_PRV_BUFTYPE(new_lb) = BUF_LG; |
2438 | skb_queue_tail(&card->lbpool.queue, new_lb); | 2492 | skb_queue_tail(&card->lbpool.queue, new_lb); |
2439 | skb_reserve(new_lb, NS_SMBUFSIZE); | 2493 | skb_reserve(new_lb, NS_SMBUFSIZE); |
2440 | push_rxbufs(card, new_lb); | 2494 | push_rxbufs(card, new_lb); |
@@ -2625,7 +2679,7 @@ static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user * arg) | |||
2625 | sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL); | 2679 | sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL); |
2626 | if (sb == NULL) | 2680 | if (sb == NULL) |
2627 | return -ENOMEM; | 2681 | return -ENOMEM; |
2628 | NS_SKB_CB(sb)->buf_type = BUF_SM; | 2682 | NS_PRV_BUFTYPE(sb) = BUF_SM; |
2629 | skb_queue_tail(&card->sbpool.queue, sb); | 2683 | skb_queue_tail(&card->sbpool.queue, sb); |
2630 | skb_reserve(sb, NS_AAL0_HEADER); | 2684 | skb_reserve(sb, NS_AAL0_HEADER); |
2631 | push_rxbufs(card, sb); | 2685 | push_rxbufs(card, sb); |
@@ -2639,7 +2693,7 @@ static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user * arg) | |||
2639 | lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL); | 2693 | lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL); |
2640 | if (lb == NULL) | 2694 | if (lb == NULL) |
2641 | return -ENOMEM; | 2695 | return -ENOMEM; |
2642 | NS_SKB_CB(lb)->buf_type = BUF_LG; | 2696 | NS_PRV_BUFTYPE(lb) = BUF_LG; |
2643 | skb_queue_tail(&card->lbpool.queue, lb); | 2697 | skb_queue_tail(&card->lbpool.queue, lb); |
2644 | skb_reserve(lb, NS_SMBUFSIZE); | 2698 | skb_reserve(lb, NS_SMBUFSIZE); |
2645 | push_rxbufs(card, lb); | 2699 | push_rxbufs(card, lb); |
@@ -2668,7 +2722,7 @@ static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user * arg) | |||
2668 | hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL); | 2722 | hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL); |
2669 | if (hb == NULL) | 2723 | if (hb == NULL) |
2670 | return -ENOMEM; | 2724 | return -ENOMEM; |
2671 | NS_SKB_CB(hb)->buf_type = BUF_NONE; | 2725 | NS_PRV_BUFTYPE(hb) = BUF_NONE; |
2672 | spin_lock_irqsave(&card->int_lock, flags); | 2726 | spin_lock_irqsave(&card->int_lock, flags); |
2673 | skb_queue_tail(&card->hbpool.queue, hb); | 2727 | skb_queue_tail(&card->hbpool.queue, hb); |
2674 | card->hbpool.count++; | 2728 | card->hbpool.count++; |
@@ -2698,7 +2752,7 @@ static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user * arg) | |||
2698 | iovb = alloc_skb(NS_IOVBUFSIZE, GFP_KERNEL); | 2752 | iovb = alloc_skb(NS_IOVBUFSIZE, GFP_KERNEL); |
2699 | if (iovb == NULL) | 2753 | if (iovb == NULL) |
2700 | return -ENOMEM; | 2754 | return -ENOMEM; |
2701 | NS_SKB_CB(iovb)->buf_type = BUF_NONE; | 2755 | NS_PRV_BUFTYPE(iovb) = BUF_NONE; |
2702 | spin_lock_irqsave(&card->int_lock, flags); | 2756 | spin_lock_irqsave(&card->int_lock, flags); |
2703 | skb_queue_tail(&card->iovpool.queue, iovb); | 2757 | skb_queue_tail(&card->iovpool.queue, iovb); |
2704 | card->iovpool.count++; | 2758 | card->iovpool.count++; |
@@ -2723,10 +2777,12 @@ static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user * arg) | |||
2723 | } | 2777 | } |
2724 | } | 2778 | } |
2725 | 2779 | ||
2780 | #ifdef EXTRA_DEBUG | ||
2726 | static void which_list(ns_dev * card, struct sk_buff *skb) | 2781 | static void which_list(ns_dev * card, struct sk_buff *skb) |
2727 | { | 2782 | { |
2728 | printk("skb buf_type: 0x%08x\n", NS_SKB_CB(skb)->buf_type); | 2783 | printk("skb buf_type: 0x%08x\n", NS_PRV_BUFTYPE(skb)); |
2729 | } | 2784 | } |
2785 | #endif /* EXTRA_DEBUG */ | ||
2730 | 2786 | ||
2731 | static void ns_poll(unsigned long arg) | 2787 | static void ns_poll(unsigned long arg) |
2732 | { | 2788 | { |
@@ -2803,7 +2859,7 @@ static void ns_phy_put(struct atm_dev *dev, unsigned char value, | |||
2803 | card = dev->dev_data; | 2859 | card = dev->dev_data; |
2804 | spin_lock_irqsave(&card->res_lock, flags); | 2860 | spin_lock_irqsave(&card->res_lock, flags); |
2805 | while (CMD_BUSY(card)) ; | 2861 | while (CMD_BUSY(card)) ; |
2806 | writel((unsigned long)value, card->membase + DR0); | 2862 | writel((u32) value, card->membase + DR0); |
2807 | writel(NS_CMD_WRITE_UTILITY | 0x00000200 | (addr & 0x000000FF), | 2863 | writel(NS_CMD_WRITE_UTILITY | 0x00000200 | (addr & 0x000000FF), |
2808 | card->membase + CMD); | 2864 | card->membase + CMD); |
2809 | spin_unlock_irqrestore(&card->res_lock, flags); | 2865 | spin_unlock_irqrestore(&card->res_lock, flags); |
@@ -2813,7 +2869,7 @@ static unsigned char ns_phy_get(struct atm_dev *dev, unsigned long addr) | |||
2813 | { | 2869 | { |
2814 | ns_dev *card; | 2870 | ns_dev *card; |
2815 | unsigned long flags; | 2871 | unsigned long flags; |
2816 | unsigned long data; | 2872 | u32 data; |
2817 | 2873 | ||
2818 | card = dev->dev_data; | 2874 | card = dev->dev_data; |
2819 | spin_lock_irqsave(&card->res_lock, flags); | 2875 | spin_lock_irqsave(&card->res_lock, flags); |
diff --git a/drivers/atm/nicstar.h b/drivers/atm/nicstar.h index 43eb2db1fb88..9bc27ea5088e 100644 --- a/drivers/atm/nicstar.h +++ b/drivers/atm/nicstar.h | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | #include <linux/types.h> | 17 | #include <linux/types.h> |
18 | #include <linux/pci.h> | 18 | #include <linux/pci.h> |
19 | #include <linux/idr.h> | ||
19 | #include <linux/uio.h> | 20 | #include <linux/uio.h> |
20 | #include <linux/skbuff.h> | 21 | #include <linux/skbuff.h> |
21 | #include <linux/atmdev.h> | 22 | #include <linux/atmdev.h> |
@@ -636,14 +637,22 @@ enum ns_regs { | |||
636 | 637 | ||
637 | /* Device driver structures */ | 638 | /* Device driver structures */ |
638 | 639 | ||
639 | struct ns_skb_cb { | 640 | struct ns_skb_prv { |
640 | u32 buf_type; /* BUF_SM/BUF_LG/BUF_NONE */ | 641 | u32 buf_type; /* BUF_SM/BUF_LG/BUF_NONE */ |
642 | u32 dma; | ||
643 | int iovcnt; | ||
641 | }; | 644 | }; |
642 | 645 | ||
643 | #define NS_SKB_CB(skb) ((struct ns_skb_cb *)((skb)->cb)) | 646 | #define NS_PRV_BUFTYPE(skb) \ |
647 | (((struct ns_skb_prv *)(ATM_SKB(skb)+1))->buf_type) | ||
648 | #define NS_PRV_DMA(skb) \ | ||
649 | (((struct ns_skb_prv *)(ATM_SKB(skb)+1))->dma) | ||
650 | #define NS_PRV_IOVCNT(skb) \ | ||
651 | (((struct ns_skb_prv *)(ATM_SKB(skb)+1))->iovcnt) | ||
644 | 652 | ||
645 | typedef struct tsq_info { | 653 | typedef struct tsq_info { |
646 | void *org; | 654 | void *org; |
655 | dma_addr_t dma; | ||
647 | ns_tsi *base; | 656 | ns_tsi *base; |
648 | ns_tsi *next; | 657 | ns_tsi *next; |
649 | ns_tsi *last; | 658 | ns_tsi *last; |
@@ -651,6 +660,7 @@ typedef struct tsq_info { | |||
651 | 660 | ||
652 | typedef struct scq_info { | 661 | typedef struct scq_info { |
653 | void *org; | 662 | void *org; |
663 | dma_addr_t dma; | ||
654 | ns_scqe *base; | 664 | ns_scqe *base; |
655 | ns_scqe *last; | 665 | ns_scqe *last; |
656 | ns_scqe *next; | 666 | ns_scqe *next; |
@@ -668,6 +678,7 @@ typedef struct scq_info { | |||
668 | 678 | ||
669 | typedef struct rsq_info { | 679 | typedef struct rsq_info { |
670 | void *org; | 680 | void *org; |
681 | dma_addr_t dma; | ||
671 | ns_rsqe *base; | 682 | ns_rsqe *base; |
672 | ns_rsqe *next; | 683 | ns_rsqe *next; |
673 | ns_rsqe *last; | 684 | ns_rsqe *last; |
@@ -693,13 +704,6 @@ typedef struct vc_map { | |||
693 | int tbd_count; | 704 | int tbd_count; |
694 | } vc_map; | 705 | } vc_map; |
695 | 706 | ||
696 | struct ns_skb_data { | ||
697 | struct atm_vcc *vcc; | ||
698 | int iovcnt; | ||
699 | }; | ||
700 | |||
701 | #define NS_SKB(skb) (((struct ns_skb_data *) (skb)->cb)) | ||
702 | |||
703 | typedef struct ns_dev { | 707 | typedef struct ns_dev { |
704 | int index; /* Card ID to the device driver */ | 708 | int index; /* Card ID to the device driver */ |
705 | int sram_size; /* In k x 32bit words. 32 or 128 */ | 709 | int sram_size; /* In k x 32bit words. 32 or 128 */ |
@@ -709,6 +713,7 @@ typedef struct ns_dev { | |||
709 | int vpibits; | 713 | int vpibits; |
710 | int vcibits; | 714 | int vcibits; |
711 | struct pci_dev *pcidev; | 715 | struct pci_dev *pcidev; |
716 | struct idr idr; | ||
712 | struct atm_dev *atmdev; | 717 | struct atm_dev *atmdev; |
713 | tsq_info tsq; | 718 | tsq_info tsq; |
714 | rsq_info rsq; | 719 | rsq_info rsq; |
@@ -729,11 +734,12 @@ typedef struct ns_dev { | |||
729 | buf_nr iovnr; | 734 | buf_nr iovnr; |
730 | int sbfqc; | 735 | int sbfqc; |
731 | int lbfqc; | 736 | int lbfqc; |
732 | u32 sm_handle; | 737 | struct sk_buff *sm_handle; |
733 | u32 sm_addr; | 738 | u32 sm_addr; |
734 | u32 lg_handle; | 739 | struct sk_buff *lg_handle; |
735 | u32 lg_addr; | 740 | u32 lg_addr; |
736 | struct sk_buff *rcbuf; /* Current raw cell buffer */ | 741 | struct sk_buff *rcbuf; /* Current raw cell buffer */ |
742 | struct ns_rcqe *rawcell; | ||
737 | u32 rawch; /* Raw cell queue head */ | 743 | u32 rawch; /* Raw cell queue head */ |
738 | unsigned intcnt; /* Interrupt counter */ | 744 | unsigned intcnt; /* Interrupt counter */ |
739 | spinlock_t int_lock; /* Interrupt lock */ | 745 | spinlock_t int_lock; /* Interrupt lock */ |