0001
0002
0003
0004
0005
0006
0007 #include <linux/module.h>
0008 #include <linux/kernel.h>
0009 #include <linux/mm.h>
0010 #include <linux/pci.h>
0011 #include <linux/errno.h>
0012 #include <linux/atm.h>
0013 #include <linux/atmdev.h>
0014 #include <linux/sonet.h>
0015 #include <linux/skbuff.h>
0016 #include <linux/time.h>
0017 #include <linux/delay.h>
0018 #include <linux/uio.h>
0019 #include <linux/init.h>
0020 #include <linux/atm_eni.h>
0021 #include <linux/bitops.h>
0022 #include <linux/slab.h>
0023 #include <asm/io.h>
0024 #include <linux/atomic.h>
0025 #include <linux/uaccess.h>
0026 #include <asm/string.h>
0027 #include <asm/byteorder.h>
0028
0029 #include "tonga.h"
0030 #include "midway.h"
0031 #include "suni.h"
0032 #include "eni.h"
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 #if 0
0060 #define DPRINTK(format,args...) printk(KERN_DEBUG format,##args)
0061 #else
0062 #define DPRINTK(format,args...)
0063 #endif
0064
0065
0066 #ifndef CONFIG_ATM_ENI_TUNE_BURST
0067 #define CONFIG_ATM_ENI_BURST_TX_8W
0068 #define CONFIG_ATM_ENI_BURST_RX_4W
0069 #endif
0070
0071
0072 #ifndef CONFIG_ATM_ENI_DEBUG
0073
0074
0075 #define NULLCHECK(x)
0076
0077 #define EVENT(s,a,b)
0078
0079
0080 static void event_dump(void)
0081 {
0082 }
0083
0084
0085 #else
0086
0087
0088
0089
0090
0091
0092 #define NULLCHECK(x) \
0093 if ((unsigned long) (x) < 0x30) \
0094 printk(KERN_CRIT #x "==0x%lx\n",(unsigned long) (x))
0095
0096
0097
0098
0099
0100
0101 #define EV 64
0102
0103 static const char *ev[EV];
0104 static unsigned long ev_a[EV],ev_b[EV];
0105 static int ec = 0;
0106
0107
0108 static void EVENT(const char *s,unsigned long a,unsigned long b)
0109 {
0110 ev[ec] = s;
0111 ev_a[ec] = a;
0112 ev_b[ec] = b;
0113 ec = (ec+1) % EV;
0114 }
0115
0116
0117 static void event_dump(void)
0118 {
0119 int n,i;
0120
0121 for (n = 0; n < EV; n++) {
0122 i = (ec+n) % EV;
0123 printk(KERN_NOTICE);
0124 printk(ev[i] ? ev[i] : "(null)",ev_a[i],ev_b[i]);
0125 }
0126 }
0127
0128
0129 #endif
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139 #define NEPJOK(a0,a1,b) \
0140 ((a0) < (a1) ? (b) <= (a0) || (b) > (a1) : (b) <= (a0) && (b) > (a1))
0141 #define EEPJOK(a0,a1,b) \
0142 ((a0) < (a1) ? (b) < (a0) || (b) >= (a1) : (b) < (a0) && (b) >= (a1))
0143 #define NEPMOK(a0,d,b,c) NEPJOK(a0,(a0+d) & (c-1),b)
0144 #define EEPMOK(a0,d,b,c) EEPJOK(a0,(a0+d) & (c-1),b)
0145
0146
0147 static int tx_complete = 0,dma_complete = 0,queued = 0,requeued = 0,
0148 backlogged = 0,rx_enqueued = 0,rx_dequeued = 0,pushed = 0,submitted = 0,
0149 putting = 0;
0150
0151 static struct atm_dev *eni_boards = NULL;
0152
0153
0154 #define eni_in(r) readl(eni_dev->reg+(r)*4)
0155 #define eni_out(v,r) writel((v),eni_dev->reg+(r)*4)
0156
0157
0158
0159
0160
0161 static void dump_mem(struct eni_dev *eni_dev)
0162 {
0163 int i;
0164
0165 for (i = 0; i < eni_dev->free_len; i++)
0166 printk(KERN_DEBUG " %d: %p %d\n",i,
0167 eni_dev->free_list[i].start,
0168 1 << eni_dev->free_list[i].order);
0169 }
0170
0171
0172 static void dump(struct atm_dev *dev)
0173 {
0174 struct eni_dev *eni_dev;
0175
0176 int i;
0177
0178 eni_dev = ENI_DEV(dev);
0179 printk(KERN_NOTICE "Free memory\n");
0180 dump_mem(eni_dev);
0181 printk(KERN_NOTICE "TX buffers\n");
0182 for (i = 0; i < NR_CHAN; i++)
0183 if (eni_dev->tx[i].send)
0184 printk(KERN_NOTICE " TX %d @ %p: %ld\n",i,
0185 eni_dev->tx[i].send,eni_dev->tx[i].words*4);
0186 printk(KERN_NOTICE "RX buffers\n");
0187 for (i = 0; i < 1024; i++)
0188 if (eni_dev->rx_map[i] && ENI_VCC(eni_dev->rx_map[i])->rx)
0189 printk(KERN_NOTICE " RX %d @ %p: %ld\n",i,
0190 ENI_VCC(eni_dev->rx_map[i])->recv,
0191 ENI_VCC(eni_dev->rx_map[i])->words*4);
0192 printk(KERN_NOTICE "----\n");
0193 }
0194
0195
0196 static void eni_put_free(struct eni_dev *eni_dev, void __iomem *start,
0197 unsigned long size)
0198 {
0199 struct eni_free *list;
0200 int len,order;
0201
0202 DPRINTK("init 0x%lx+%ld(0x%lx)\n",start,size,size);
0203 start += eni_dev->base_diff;
0204 list = eni_dev->free_list;
0205 len = eni_dev->free_len;
0206 while (size) {
0207 if (len >= eni_dev->free_list_size) {
0208 printk(KERN_CRIT "eni_put_free overflow (%p,%ld)\n",
0209 start,size);
0210 break;
0211 }
0212 for (order = 0; !(((unsigned long)start | size) & (1 << order)); order++);
0213 if (MID_MIN_BUF_SIZE > (1 << order)) {
0214 printk(KERN_CRIT "eni_put_free: order %d too small\n",
0215 order);
0216 break;
0217 }
0218 list[len].start = (void __iomem *) start;
0219 list[len].order = order;
0220 len++;
0221 start += 1 << order;
0222 size -= 1 << order;
0223 }
0224 eni_dev->free_len = len;
0225
0226 }
0227
0228
0229 static void __iomem *eni_alloc_mem(struct eni_dev *eni_dev, unsigned long *size)
0230 {
0231 struct eni_free *list;
0232 void __iomem *start;
0233 int len,i,order,best_order,index;
0234
0235 list = eni_dev->free_list;
0236 len = eni_dev->free_len;
0237 if (*size < MID_MIN_BUF_SIZE) *size = MID_MIN_BUF_SIZE;
0238 if (*size > MID_MAX_BUF_SIZE) return NULL;
0239 for (order = 0; (1 << order) < *size; order++)
0240 ;
0241 DPRINTK("trying: %ld->%d\n",*size,order);
0242 best_order = 65;
0243 index = 0;
0244 for (i = 0; i < len; i++)
0245 if (list[i].order == order) {
0246 best_order = order;
0247 index = i;
0248 break;
0249 }
0250 else if (best_order > list[i].order && list[i].order > order) {
0251 best_order = list[i].order;
0252 index = i;
0253 }
0254 if (best_order == 65) return NULL;
0255 start = list[index].start-eni_dev->base_diff;
0256 list[index] = list[--len];
0257 eni_dev->free_len = len;
0258 *size = 1 << order;
0259 eni_put_free(eni_dev,start+*size,(1 << best_order)-*size);
0260 DPRINTK("%ld bytes (order %d) at 0x%lx\n",*size,order,start);
0261 memset_io(start,0,*size);
0262
0263 return start;
0264 }
0265
0266
0267 static void eni_free_mem(struct eni_dev *eni_dev, void __iomem *start,
0268 unsigned long size)
0269 {
0270 struct eni_free *list;
0271 int len,i,order;
0272
0273 start += eni_dev->base_diff;
0274 list = eni_dev->free_list;
0275 len = eni_dev->free_len;
0276 for (order = -1; size; order++) size >>= 1;
0277 DPRINTK("eni_free_mem: %p+0x%lx (order %d)\n",start,size,order);
0278 for (i = 0; i < len; i++)
0279 if (((unsigned long) list[i].start) == ((unsigned long)start^(1 << order)) &&
0280 list[i].order == order) {
0281 DPRINTK("match[%d]: 0x%lx/0x%lx(0x%x), %d/%d\n",i,
0282 list[i].start,start,1 << order,list[i].order,order);
0283 list[i] = list[--len];
0284 start = (void __iomem *) ((unsigned long) start & ~(unsigned long) (1 << order));
0285 order++;
0286 i = -1;
0287 continue;
0288 }
0289 if (len >= eni_dev->free_list_size) {
0290 printk(KERN_ALERT "eni_free_mem overflow (%p,%d)\n",start,
0291 order);
0292 return;
0293 }
0294 list[len].start = start;
0295 list[len].order = order;
0296 eni_dev->free_len = len+1;
0297
0298 }
0299
0300
0301
0302
0303
0304 #define ENI_VCC_NOS ((struct atm_vcc *) 1)
0305
0306
0307 static void rx_ident_err(struct atm_vcc *vcc)
0308 {
0309 struct atm_dev *dev;
0310 struct eni_dev *eni_dev;
0311 struct eni_vcc *eni_vcc;
0312
0313 dev = vcc->dev;
0314 eni_dev = ENI_DEV(dev);
0315
0316 eni_out(eni_in(MID_MC_S) &
0317 ~(MID_DMA_ENABLE | MID_TX_ENABLE | MID_RX_ENABLE),MID_MC_S);
0318
0319 eni_vcc = ENI_VCC(vcc);
0320 printk(KERN_ALERT DEV_LABEL "(itf %d): driver error - RX ident "
0321 "mismatch\n",dev->number);
0322 printk(KERN_ALERT " VCI %d, rxing %d, words %ld\n",vcc->vci,
0323 eni_vcc->rxing,eni_vcc->words);
0324 printk(KERN_ALERT " host descr 0x%lx, rx pos 0x%lx, descr value "
0325 "0x%x\n",eni_vcc->descr,eni_vcc->rx_pos,
0326 (unsigned) readl(eni_vcc->recv+eni_vcc->descr*4));
0327 printk(KERN_ALERT " last %p, servicing %d\n",eni_vcc->last,
0328 eni_vcc->servicing);
0329 EVENT("---dump ends here---\n",0,0);
0330 printk(KERN_NOTICE "---recent events---\n");
0331 event_dump();
0332 ENI_DEV(dev)->fast = NULL;
0333 ENI_DEV(dev)->slow = NULL;
0334 skb_queue_head_init(&ENI_DEV(dev)->rx_queue);
0335 }
0336
0337
0338 static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb,
0339 unsigned long skip,unsigned long size,unsigned long eff)
0340 {
0341 struct eni_dev *eni_dev;
0342 struct eni_vcc *eni_vcc;
0343 u32 dma_rd,dma_wr;
0344 u32 dma[RX_DMA_BUF*2];
0345 dma_addr_t paddr;
0346 unsigned long here;
0347 int i,j;
0348
0349 eni_dev = ENI_DEV(vcc->dev);
0350 eni_vcc = ENI_VCC(vcc);
0351 paddr = 0;
0352 if (skb) {
0353 paddr = dma_map_single(&eni_dev->pci_dev->dev,skb->data,skb->len,
0354 DMA_FROM_DEVICE);
0355 if (dma_mapping_error(&eni_dev->pci_dev->dev, paddr))
0356 goto dma_map_error;
0357 ENI_PRV_PADDR(skb) = paddr;
0358 if (paddr & 3)
0359 printk(KERN_CRIT DEV_LABEL "(itf %d): VCI %d has "
0360 "mis-aligned RX data (0x%lx)\n",vcc->dev->number,
0361 vcc->vci,(unsigned long) paddr);
0362 ENI_PRV_SIZE(skb) = size+skip;
0363
0364 ATM_SKB(skb)->vcc = vcc;
0365 }
0366 j = 0;
0367 if ((eff && skip) || 1) {
0368 here = (eni_vcc->descr+skip) & (eni_vcc->words-1);
0369 dma[j++] = (here << MID_DMA_COUNT_SHIFT) | (vcc->vci
0370 << MID_DMA_VCI_SHIFT) | MID_DT_JK;
0371 dma[j++] = 0;
0372 }
0373 here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1);
0374 if (!eff) size += skip;
0375 else {
0376 unsigned long words;
0377
0378 if (!size) {
0379 DPRINTK("strange things happen ...\n");
0380 EVENT("strange things happen ... (skip=%ld,eff=%ld)\n",
0381 size,eff);
0382 }
0383 words = eff;
0384 if (paddr & 15) {
0385 unsigned long init;
0386
0387 init = 4-((paddr & 15) >> 2);
0388 if (init > words) init = words;
0389 dma[j++] = MID_DT_WORD | (init << MID_DMA_COUNT_SHIFT) |
0390 (vcc->vci << MID_DMA_VCI_SHIFT);
0391 dma[j++] = paddr;
0392 paddr += init << 2;
0393 words -= init;
0394 }
0395 #ifdef CONFIG_ATM_ENI_BURST_RX_16W
0396 if (words & ~15) {
0397 dma[j++] = MID_DT_16W | ((words >> 4) <<
0398 MID_DMA_COUNT_SHIFT) | (vcc->vci <<
0399 MID_DMA_VCI_SHIFT);
0400 dma[j++] = paddr;
0401 paddr += (words & ~15) << 2;
0402 words &= 15;
0403 }
0404 #endif
0405 #ifdef CONFIG_ATM_ENI_BURST_RX_8W
0406 if (words & ~7) {
0407 dma[j++] = MID_DT_8W | ((words >> 3) <<
0408 MID_DMA_COUNT_SHIFT) | (vcc->vci <<
0409 MID_DMA_VCI_SHIFT);
0410 dma[j++] = paddr;
0411 paddr += (words & ~7) << 2;
0412 words &= 7;
0413 }
0414 #endif
0415 #ifdef CONFIG_ATM_ENI_BURST_RX_4W
0416 if (words & ~3) {
0417 dma[j++] = MID_DT_4W | ((words >> 2) <<
0418 MID_DMA_COUNT_SHIFT) | (vcc->vci <<
0419 MID_DMA_VCI_SHIFT);
0420 dma[j++] = paddr;
0421 paddr += (words & ~3) << 2;
0422 words &= 3;
0423 }
0424 #endif
0425 #ifdef CONFIG_ATM_ENI_BURST_RX_2W
0426 if (words & ~1) {
0427 dma[j++] = MID_DT_2W | ((words >> 1) <<
0428 MID_DMA_COUNT_SHIFT) | (vcc->vci <<
0429 MID_DMA_VCI_SHIFT);
0430 dma[j++] = paddr;
0431 paddr += (words & ~1) << 2;
0432 words &= 1;
0433 }
0434 #endif
0435 if (words) {
0436 dma[j++] = MID_DT_WORD | (words << MID_DMA_COUNT_SHIFT)
0437 | (vcc->vci << MID_DMA_VCI_SHIFT);
0438 dma[j++] = paddr;
0439 }
0440 }
0441 if (size != eff) {
0442 dma[j++] = (here << MID_DMA_COUNT_SHIFT) |
0443 (vcc->vci << MID_DMA_VCI_SHIFT) | MID_DT_JK;
0444 dma[j++] = 0;
0445 }
0446 if (!j || j > 2*RX_DMA_BUF) {
0447 printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n");
0448 goto trouble;
0449 }
0450 dma[j-2] |= MID_DMA_END;
0451 j = j >> 1;
0452 dma_wr = eni_in(MID_DMA_WR_RX);
0453 dma_rd = eni_in(MID_DMA_RD_RX);
0454
0455
0456
0457
0458 if (!NEPMOK(dma_wr,j+j+1,dma_rd,NR_DMA_RX)) {
0459 printk(KERN_WARNING DEV_LABEL "(itf %d): RX DMA full\n",
0460 vcc->dev->number);
0461 goto trouble;
0462 }
0463 for (i = 0; i < j; i++) {
0464 writel(dma[i*2],eni_dev->rx_dma+dma_wr*8);
0465 writel(dma[i*2+1],eni_dev->rx_dma+dma_wr*8+4);
0466 dma_wr = (dma_wr+1) & (NR_DMA_RX-1);
0467 }
0468 if (skb) {
0469 ENI_PRV_POS(skb) = eni_vcc->descr+size+1;
0470 skb_queue_tail(&eni_dev->rx_queue,skb);
0471 eni_vcc->last = skb;
0472 rx_enqueued++;
0473 }
0474 eni_vcc->descr = here;
0475 eni_out(dma_wr,MID_DMA_WR_RX);
0476 return 0;
0477
0478 trouble:
0479 if (paddr)
0480 dma_unmap_single(&eni_dev->pci_dev->dev,paddr,skb->len,
0481 DMA_FROM_DEVICE);
0482 dma_map_error:
0483 if (skb) dev_kfree_skb_irq(skb);
0484 return -1;
0485 }
0486
0487
0488 static void discard(struct atm_vcc *vcc,unsigned long size)
0489 {
0490 struct eni_vcc *eni_vcc;
0491
0492 eni_vcc = ENI_VCC(vcc);
0493 EVENT("discard (size=%ld)\n",size,0);
0494 while (do_rx_dma(vcc,NULL,1,size,0)) EVENT("BUSY LOOP",0,0);
0495
0496 if (eni_vcc->rxing) ENI_PRV_POS(eni_vcc->last) += size+1;
0497 else eni_vcc->rx_pos = (eni_vcc->rx_pos+size+1) & (eni_vcc->words-1);
0498 }
0499
0500
0501
0502
0503
0504
0505
0506 static int rx_aal0(struct atm_vcc *vcc)
0507 {
0508 struct eni_vcc *eni_vcc;
0509 unsigned long descr;
0510 unsigned long length;
0511 struct sk_buff *skb;
0512
0513 DPRINTK(">rx_aal0\n");
0514 eni_vcc = ENI_VCC(vcc);
0515 descr = readl(eni_vcc->recv+eni_vcc->descr*4);
0516 if ((descr & MID_RED_IDEN) != (MID_RED_RX_ID << MID_RED_SHIFT)) {
0517 rx_ident_err(vcc);
0518 return 1;
0519 }
0520 if (descr & MID_RED_T) {
0521 DPRINTK(DEV_LABEL "(itf %d): trashing empty cell\n",
0522 vcc->dev->number);
0523 length = 0;
0524 atomic_inc(&vcc->stats->rx_err);
0525 }
0526 else {
0527 length = ATM_CELL_SIZE-1;
0528 }
0529 skb = length ? atm_alloc_charge(vcc,length,GFP_ATOMIC) : NULL;
0530 if (!skb) {
0531 discard(vcc,length >> 2);
0532 return 0;
0533 }
0534 skb_put(skb,length);
0535 skb->tstamp = eni_vcc->timestamp;
0536 DPRINTK("got len %ld\n",length);
0537 if (do_rx_dma(vcc,skb,1,length >> 2,length >> 2)) return 1;
0538 eni_vcc->rxing++;
0539 return 0;
0540 }
0541
0542
0543 static int rx_aal5(struct atm_vcc *vcc)
0544 {
0545 struct eni_vcc *eni_vcc;
0546 unsigned long descr;
0547 unsigned long size,eff,length;
0548 struct sk_buff *skb;
0549
0550 EVENT("rx_aal5\n",0,0);
0551 DPRINTK(">rx_aal5\n");
0552 eni_vcc = ENI_VCC(vcc);
0553 descr = readl(eni_vcc->recv+eni_vcc->descr*4);
0554 if ((descr & MID_RED_IDEN) != (MID_RED_RX_ID << MID_RED_SHIFT)) {
0555 rx_ident_err(vcc);
0556 return 1;
0557 }
0558 if (descr & (MID_RED_T | MID_RED_CRC_ERR)) {
0559 if (descr & MID_RED_T) {
0560 EVENT("empty cell (descr=0x%lx)\n",descr,0);
0561 DPRINTK(DEV_LABEL "(itf %d): trashing empty cell\n",
0562 vcc->dev->number);
0563 size = 0;
0564 }
0565 else {
0566 static unsigned long silence = 0;
0567
0568 if (time_after(jiffies, silence) || silence == 0) {
0569 printk(KERN_WARNING DEV_LABEL "(itf %d): "
0570 "discarding PDU(s) with CRC error\n",
0571 vcc->dev->number);
0572 silence = (jiffies+2*HZ)|1;
0573 }
0574 size = (descr & MID_RED_COUNT)*(ATM_CELL_PAYLOAD >> 2);
0575 EVENT("CRC error (descr=0x%lx,size=%ld)\n",descr,
0576 size);
0577 }
0578 eff = length = 0;
0579 atomic_inc(&vcc->stats->rx_err);
0580 }
0581 else {
0582 size = (descr & MID_RED_COUNT)*(ATM_CELL_PAYLOAD >> 2);
0583 DPRINTK("size=%ld\n",size);
0584 length = readl(eni_vcc->recv+(((eni_vcc->descr+size-1) &
0585 (eni_vcc->words-1)))*4) & 0xffff;
0586
0587 if (length && length <= (size << 2)-8 && length <=
0588 ATM_MAX_AAL5_PDU) eff = (length+3) >> 2;
0589 else {
0590 EVENT("bad PDU (descr=0x08%lx,length=%ld)\n",descr,
0591 length);
0592 printk(KERN_ERR DEV_LABEL "(itf %d): bad AAL5 PDU "
0593 "(VCI=%d,length=%ld,size=%ld (descr 0x%lx))\n",
0594 vcc->dev->number,vcc->vci,length,size << 2,descr);
0595 length = eff = 0;
0596 atomic_inc(&vcc->stats->rx_err);
0597 }
0598 }
0599 skb = eff ? atm_alloc_charge(vcc,eff << 2,GFP_ATOMIC) : NULL;
0600 if (!skb) {
0601 discard(vcc,size);
0602 return 0;
0603 }
0604 skb_put(skb,length);
0605 DPRINTK("got len %ld\n",length);
0606 if (do_rx_dma(vcc,skb,1,size,eff)) return 1;
0607 eni_vcc->rxing++;
0608 return 0;
0609 }
0610
0611
0612 static inline int rx_vcc(struct atm_vcc *vcc)
0613 {
0614 void __iomem *vci_dsc;
0615 unsigned long tmp;
0616 struct eni_vcc *eni_vcc;
0617
0618 eni_vcc = ENI_VCC(vcc);
0619 vci_dsc = ENI_DEV(vcc->dev)->vci+vcc->vci*16;
0620 EVENT("rx_vcc(1)\n",0,0);
0621 while (eni_vcc->descr != (tmp = (readl(vci_dsc+4) & MID_VCI_DESCR) >>
0622 MID_VCI_DESCR_SHIFT)) {
0623 EVENT("rx_vcc(2: host dsc=0x%lx, nic dsc=0x%lx)\n",
0624 eni_vcc->descr,tmp);
0625 DPRINTK("CB_DESCR %ld REG_DESCR %d\n",ENI_VCC(vcc)->descr,
0626 (((unsigned) readl(vci_dsc+4) & MID_VCI_DESCR) >>
0627 MID_VCI_DESCR_SHIFT));
0628 if (ENI_VCC(vcc)->rx(vcc)) return 1;
0629 }
0630
0631 writel(readl(vci_dsc) & ~MID_VCI_IN_SERVICE,vci_dsc);
0632
0633
0634
0635
0636
0637 EVENT("rx_vcc(3)\n",0,0);
0638 while (ENI_VCC(vcc)->descr != (tmp = (readl(vci_dsc+4) & MID_VCI_DESCR)
0639 >> MID_VCI_DESCR_SHIFT)) {
0640 EVENT("rx_vcc(4: host dsc=0x%lx, nic dsc=0x%lx)\n",
0641 eni_vcc->descr,tmp);
0642 DPRINTK("CB_DESCR %ld REG_DESCR %d\n",ENI_VCC(vcc)->descr,
0643 (((unsigned) readl(vci_dsc+4) & MID_VCI_DESCR) >>
0644 MID_VCI_DESCR_SHIFT));
0645 if (ENI_VCC(vcc)->rx(vcc)) return 1;
0646 }
0647 return 0;
0648 }
0649
0650
0651 static void poll_rx(struct atm_dev *dev)
0652 {
0653 struct eni_dev *eni_dev;
0654 struct atm_vcc *curr;
0655
0656 eni_dev = ENI_DEV(dev);
0657 while ((curr = eni_dev->fast)) {
0658 EVENT("poll_rx.fast\n",0,0);
0659 if (rx_vcc(curr)) return;
0660 eni_dev->fast = ENI_VCC(curr)->next;
0661 ENI_VCC(curr)->next = ENI_VCC_NOS;
0662 barrier();
0663 ENI_VCC(curr)->servicing--;
0664 }
0665 while ((curr = eni_dev->slow)) {
0666 EVENT("poll_rx.slow\n",0,0);
0667 if (rx_vcc(curr)) return;
0668 eni_dev->slow = ENI_VCC(curr)->next;
0669 ENI_VCC(curr)->next = ENI_VCC_NOS;
0670 barrier();
0671 ENI_VCC(curr)->servicing--;
0672 }
0673 }
0674
0675
0676 static void get_service(struct atm_dev *dev)
0677 {
0678 struct eni_dev *eni_dev;
0679 struct atm_vcc *vcc;
0680 unsigned long vci;
0681
0682 DPRINTK(">get_service\n");
0683 eni_dev = ENI_DEV(dev);
0684 while (eni_in(MID_SERV_WRITE) != eni_dev->serv_read) {
0685 vci = readl(eni_dev->service+eni_dev->serv_read*4);
0686 eni_dev->serv_read = (eni_dev->serv_read+1) & (NR_SERVICE-1);
0687 vcc = eni_dev->rx_map[vci & 1023];
0688 if (!vcc) {
0689 printk(KERN_CRIT DEV_LABEL "(itf %d): VCI %ld not "
0690 "found\n",dev->number,vci);
0691 continue;
0692
0693 }
0694 EVENT("getting from service\n",0,0);
0695 if (ENI_VCC(vcc)->next != ENI_VCC_NOS) {
0696 EVENT("double service\n",0,0);
0697 DPRINTK("Grr, servicing VCC %ld twice\n",vci);
0698 continue;
0699 }
0700 ENI_VCC(vcc)->timestamp = ktime_get_real();
0701 ENI_VCC(vcc)->next = NULL;
0702 if (vcc->qos.rxtp.traffic_class == ATM_CBR) {
0703 if (eni_dev->fast)
0704 ENI_VCC(eni_dev->last_fast)->next = vcc;
0705 else eni_dev->fast = vcc;
0706 eni_dev->last_fast = vcc;
0707 }
0708 else {
0709 if (eni_dev->slow)
0710 ENI_VCC(eni_dev->last_slow)->next = vcc;
0711 else eni_dev->slow = vcc;
0712 eni_dev->last_slow = vcc;
0713 }
0714 putting++;
0715 ENI_VCC(vcc)->servicing++;
0716 }
0717 }
0718
0719
0720 static void dequeue_rx(struct atm_dev *dev)
0721 {
0722 struct eni_dev *eni_dev;
0723 struct eni_vcc *eni_vcc;
0724 struct atm_vcc *vcc;
0725 struct sk_buff *skb;
0726 void __iomem *vci_dsc;
0727 int first;
0728
0729 eni_dev = ENI_DEV(dev);
0730 first = 1;
0731 while (1) {
0732 skb = skb_dequeue(&eni_dev->rx_queue);
0733 if (!skb) {
0734 if (first) {
0735 DPRINTK(DEV_LABEL "(itf %d): RX but not "
0736 "rxing\n",dev->number);
0737 EVENT("nothing to dequeue\n",0,0);
0738 }
0739 break;
0740 }
0741 EVENT("dequeued (size=%ld,pos=0x%lx)\n",ENI_PRV_SIZE(skb),
0742 ENI_PRV_POS(skb));
0743 rx_dequeued++;
0744 vcc = ATM_SKB(skb)->vcc;
0745 eni_vcc = ENI_VCC(vcc);
0746 first = 0;
0747 vci_dsc = eni_dev->vci+vcc->vci*16;
0748 if (!EEPMOK(eni_vcc->rx_pos,ENI_PRV_SIZE(skb),
0749 (readl(vci_dsc+4) & MID_VCI_READ) >> MID_VCI_READ_SHIFT,
0750 eni_vcc->words)) {
0751 EVENT("requeuing\n",0,0);
0752 skb_queue_head(&eni_dev->rx_queue,skb);
0753 break;
0754 }
0755 eni_vcc->rxing--;
0756 eni_vcc->rx_pos = ENI_PRV_POS(skb) & (eni_vcc->words-1);
0757 dma_unmap_single(&eni_dev->pci_dev->dev,ENI_PRV_PADDR(skb),skb->len,
0758 DMA_TO_DEVICE);
0759 if (!skb->len) dev_kfree_skb_irq(skb);
0760 else {
0761 EVENT("pushing (len=%ld)\n",skb->len,0);
0762 if (vcc->qos.aal == ATM_AAL0)
0763 *(unsigned long *) skb->data =
0764 ntohl(*(unsigned long *) skb->data);
0765 memset(skb->cb,0,sizeof(struct eni_skb_prv));
0766 vcc->push(vcc,skb);
0767 pushed++;
0768 }
0769 atomic_inc(&vcc->stats->rx);
0770 }
0771 wake_up(&eni_dev->rx_wait);
0772 }
0773
0774
0775 static int open_rx_first(struct atm_vcc *vcc)
0776 {
0777 struct eni_dev *eni_dev;
0778 struct eni_vcc *eni_vcc;
0779 unsigned long size;
0780
0781 DPRINTK("open_rx_first\n");
0782 eni_dev = ENI_DEV(vcc->dev);
0783 eni_vcc = ENI_VCC(vcc);
0784 eni_vcc->rx = NULL;
0785 if (vcc->qos.rxtp.traffic_class == ATM_NONE) return 0;
0786 size = vcc->qos.rxtp.max_sdu*eni_dev->rx_mult/100;
0787 if (size > MID_MAX_BUF_SIZE && vcc->qos.rxtp.max_sdu <=
0788 MID_MAX_BUF_SIZE)
0789 size = MID_MAX_BUF_SIZE;
0790 eni_vcc->recv = eni_alloc_mem(eni_dev,&size);
0791 DPRINTK("rx at 0x%lx\n",eni_vcc->recv);
0792 eni_vcc->words = size >> 2;
0793 if (!eni_vcc->recv) return -ENOBUFS;
0794 eni_vcc->rx = vcc->qos.aal == ATM_AAL5 ? rx_aal5 : rx_aal0;
0795 eni_vcc->descr = 0;
0796 eni_vcc->rx_pos = 0;
0797 eni_vcc->rxing = 0;
0798 eni_vcc->servicing = 0;
0799 eni_vcc->next = ENI_VCC_NOS;
0800 return 0;
0801 }
0802
0803
0804 static int open_rx_second(struct atm_vcc *vcc)
0805 {
0806 void __iomem *here;
0807 struct eni_dev *eni_dev;
0808 struct eni_vcc *eni_vcc;
0809 unsigned long size;
0810 int order;
0811
0812 DPRINTK("open_rx_second\n");
0813 eni_dev = ENI_DEV(vcc->dev);
0814 eni_vcc = ENI_VCC(vcc);
0815 if (!eni_vcc->rx) return 0;
0816
0817 here = eni_dev->vci+vcc->vci*16;
0818 DPRINTK("loc 0x%x\n",(unsigned) (eni_vcc->recv-eni_dev->ram)/4);
0819 size = eni_vcc->words >> 8;
0820 for (order = -1; size; order++) size >>= 1;
0821 writel(0,here+4);
0822 writel(0,here+8);
0823 if (eni_dev->rx_map[vcc->vci])
0824 printk(KERN_CRIT DEV_LABEL "(itf %d): BUG - VCI %d already "
0825 "in use\n",vcc->dev->number,vcc->vci);
0826 eni_dev->rx_map[vcc->vci] = vcc;
0827 writel(((vcc->qos.aal != ATM_AAL5 ? MID_MODE_RAW : MID_MODE_AAL5) <<
0828 MID_VCI_MODE_SHIFT) | MID_VCI_PTI_MODE |
0829 (((eni_vcc->recv-eni_dev->ram) >> (MID_LOC_SKIP+2)) <<
0830 MID_VCI_LOCATION_SHIFT) | (order << MID_VCI_SIZE_SHIFT),here);
0831 return 0;
0832 }
0833
0834
0835 static void close_rx(struct atm_vcc *vcc)
0836 {
0837 DECLARE_WAITQUEUE(wait,current);
0838 void __iomem *here;
0839 struct eni_dev *eni_dev;
0840 struct eni_vcc *eni_vcc;
0841
0842 eni_vcc = ENI_VCC(vcc);
0843 if (!eni_vcc->rx) return;
0844 eni_dev = ENI_DEV(vcc->dev);
0845 if (vcc->vpi != ATM_VPI_UNSPEC && vcc->vci != ATM_VCI_UNSPEC) {
0846 here = eni_dev->vci+vcc->vci*16;
0847
0848 writel((readl(here) & ~MID_VCI_MODE) | (MID_MODE_TRASH <<
0849 MID_VCI_MODE_SHIFT),here);
0850
0851 udelay(27);
0852
0853 writel(readl(here) & ~MID_VCI_IN_SERVICE,here);
0854
0855 eni_dev->rx_map[vcc->vci] = NULL;
0856
0857 DPRINTK("eni_close: waiting for RX ...\n");
0858 EVENT("RX closing\n",0,0);
0859 add_wait_queue(&eni_dev->rx_wait,&wait);
0860 set_current_state(TASK_UNINTERRUPTIBLE);
0861 barrier();
0862 for (;;) {
0863
0864 if (!eni_vcc->servicing) {
0865 barrier();
0866 if (!eni_vcc->rxing) break;
0867 }
0868 EVENT("drain PDUs (rx %ld, serv %ld)\n",eni_vcc->rxing,
0869 eni_vcc->servicing);
0870 printk(KERN_INFO "%d+%d RX left\n",eni_vcc->servicing,
0871 eni_vcc->rxing);
0872 schedule();
0873 set_current_state(TASK_UNINTERRUPTIBLE);
0874 }
0875 for (;;) {
0876 int at_end;
0877 u32 tmp;
0878
0879 tasklet_disable(&eni_dev->task);
0880 tmp = readl(eni_dev->vci+vcc->vci*16+4) & MID_VCI_READ;
0881 at_end = eni_vcc->rx_pos == tmp >> MID_VCI_READ_SHIFT;
0882 tasklet_enable(&eni_dev->task);
0883 if (at_end) break;
0884 EVENT("drain discard (host 0x%lx, nic 0x%lx)\n",
0885 eni_vcc->rx_pos,tmp);
0886 printk(KERN_INFO "draining RX: host 0x%lx, nic 0x%x\n",
0887 eni_vcc->rx_pos,tmp);
0888 schedule();
0889 set_current_state(TASK_UNINTERRUPTIBLE);
0890 }
0891 set_current_state(TASK_RUNNING);
0892 remove_wait_queue(&eni_dev->rx_wait,&wait);
0893 }
0894 eni_free_mem(eni_dev,eni_vcc->recv,eni_vcc->words << 2);
0895 eni_vcc->rx = NULL;
0896 }
0897
0898
0899 static int start_rx(struct atm_dev *dev)
0900 {
0901 struct eni_dev *eni_dev;
0902
0903 eni_dev = ENI_DEV(dev);
0904 eni_dev->rx_map = (struct atm_vcc **) get_zeroed_page(GFP_KERNEL);
0905 if (!eni_dev->rx_map) {
0906 printk(KERN_ERR DEV_LABEL "(itf %d): couldn't get free page\n",
0907 dev->number);
0908 free_page((unsigned long) eni_dev->free_list);
0909 return -ENOMEM;
0910 }
0911 eni_dev->rx_mult = DEFAULT_RX_MULT;
0912 eni_dev->fast = eni_dev->last_fast = NULL;
0913 eni_dev->slow = eni_dev->last_slow = NULL;
0914 init_waitqueue_head(&eni_dev->rx_wait);
0915 skb_queue_head_init(&eni_dev->rx_queue);
0916 eni_dev->serv_read = eni_in(MID_SERV_WRITE);
0917 eni_out(0,MID_DMA_WR_RX);
0918 return 0;
0919 }
0920
0921
0922
0923
0924
0925 enum enq_res { enq_ok,enq_next,enq_jam };
0926
0927
0928 static inline void put_dma(int chan,u32 *dma,int *j,dma_addr_t paddr,
0929 u32 size)
0930 {
0931 u32 init,words;
0932
0933 DPRINTK("put_dma: 0x%lx+0x%x\n",(unsigned long) paddr,size);
0934 EVENT("put_dma: 0x%lx+0x%lx\n",(unsigned long) paddr,size);
0935 #if 0
0936 if (paddr & 3)
0937 printk(KERN_ERR "put_dma: unaligned addr (0x%lx)\n",paddr);
0938 if (size & 3)
0939 printk(KERN_ERR "put_dma: unaligned size (0x%lx)\n",size);
0940 #endif
0941 if (paddr & 3) {
0942 init = 4-(paddr & 3);
0943 if (init > size || size < 7) init = size;
0944 DPRINTK("put_dma: %lx DMA: %d/%d bytes\n",
0945 (unsigned long) paddr,init,size);
0946 dma[(*j)++] = MID_DT_BYTE | (init << MID_DMA_COUNT_SHIFT) |
0947 (chan << MID_DMA_CHAN_SHIFT);
0948 dma[(*j)++] = paddr;
0949 paddr += init;
0950 size -= init;
0951 }
0952 words = size >> 2;
0953 size &= 3;
0954 if (words && (paddr & 31)) {
0955 init = 8-((paddr & 31) >> 2);
0956 if (init > words) init = words;
0957 DPRINTK("put_dma: %lx DMA: %d/%d words\n",
0958 (unsigned long) paddr,init,words);
0959 dma[(*j)++] = MID_DT_WORD | (init << MID_DMA_COUNT_SHIFT) |
0960 (chan << MID_DMA_CHAN_SHIFT);
0961 dma[(*j)++] = paddr;
0962 paddr += init << 2;
0963 words -= init;
0964 }
0965 #ifdef CONFIG_ATM_ENI_BURST_TX_16W
0966 if (words & ~15) {
0967 DPRINTK("put_dma: %lx DMA: %d*16/%d words\n",
0968 (unsigned long) paddr,words >> 4,words);
0969 dma[(*j)++] = MID_DT_16W | ((words >> 4) << MID_DMA_COUNT_SHIFT)
0970 | (chan << MID_DMA_CHAN_SHIFT);
0971 dma[(*j)++] = paddr;
0972 paddr += (words & ~15) << 2;
0973 words &= 15;
0974 }
0975 #endif
0976 #ifdef CONFIG_ATM_ENI_BURST_TX_8W
0977 if (words & ~7) {
0978 DPRINTK("put_dma: %lx DMA: %d*8/%d words\n",
0979 (unsigned long) paddr,words >> 3,words);
0980 dma[(*j)++] = MID_DT_8W | ((words >> 3) << MID_DMA_COUNT_SHIFT)
0981 | (chan << MID_DMA_CHAN_SHIFT);
0982 dma[(*j)++] = paddr;
0983 paddr += (words & ~7) << 2;
0984 words &= 7;
0985 }
0986 #endif
0987 #ifdef CONFIG_ATM_ENI_BURST_TX_4W
0988 if (words & ~3) {
0989 DPRINTK("put_dma: %lx DMA: %d*4/%d words\n",
0990 (unsigned long) paddr,words >> 2,words);
0991 dma[(*j)++] = MID_DT_4W | ((words >> 2) << MID_DMA_COUNT_SHIFT)
0992 | (chan << MID_DMA_CHAN_SHIFT);
0993 dma[(*j)++] = paddr;
0994 paddr += (words & ~3) << 2;
0995 words &= 3;
0996 }
0997 #endif
0998 #ifdef CONFIG_ATM_ENI_BURST_TX_2W
0999 if (words & ~1) {
1000 DPRINTK("put_dma: %lx DMA: %d*2/%d words\n",
1001 (unsigned long) paddr,words >> 1,words);
1002 dma[(*j)++] = MID_DT_2W | ((words >> 1) << MID_DMA_COUNT_SHIFT)
1003 | (chan << MID_DMA_CHAN_SHIFT);
1004 dma[(*j)++] = paddr;
1005 paddr += (words & ~1) << 2;
1006 words &= 1;
1007 }
1008 #endif
1009 if (words) {
1010 DPRINTK("put_dma: %lx DMA: %d words\n",(unsigned long) paddr,
1011 words);
1012 dma[(*j)++] = MID_DT_WORD | (words << MID_DMA_COUNT_SHIFT) |
1013 (chan << MID_DMA_CHAN_SHIFT);
1014 dma[(*j)++] = paddr;
1015 paddr += words << 2;
1016 }
1017 if (size) {
1018 DPRINTK("put_dma: %lx DMA: %d bytes\n",(unsigned long) paddr,
1019 size);
1020 dma[(*j)++] = MID_DT_BYTE | (size << MID_DMA_COUNT_SHIFT) |
1021 (chan << MID_DMA_CHAN_SHIFT);
1022 dma[(*j)++] = paddr;
1023 }
1024 }
1025
1026
1027 static enum enq_res do_tx(struct sk_buff *skb)
1028 {
1029 struct atm_vcc *vcc;
1030 struct eni_dev *eni_dev;
1031 struct eni_vcc *eni_vcc;
1032 struct eni_tx *tx;
1033 dma_addr_t paddr;
1034 u32 dma_rd,dma_wr;
1035 u32 size;
1036 int aal5,dma_size,i,j;
1037 unsigned char skb_data3;
1038
1039 DPRINTK(">do_tx\n");
1040 NULLCHECK(skb);
1041 EVENT("do_tx: skb=0x%lx, %ld bytes\n",(unsigned long) skb,skb->len);
1042 vcc = ATM_SKB(skb)->vcc;
1043 NULLCHECK(vcc);
1044 eni_dev = ENI_DEV(vcc->dev);
1045 NULLCHECK(eni_dev);
1046 eni_vcc = ENI_VCC(vcc);
1047 tx = eni_vcc->tx;
1048 NULLCHECK(tx);
1049 #if 0
1050 {
1051 unsigned int hack = *((char *) skb->data)-'0';
1052
1053 if (hack < 8) {
1054 skb->data += hack;
1055 skb->len -= hack;
1056 }
1057 }
1058 #endif
1059 #if 0
1060 if ((unsigned long) skb->data & 3)
1061 printk(KERN_ERR DEV_LABEL "(itf %d): VCI %d has mis-aligned "
1062 "TX data\n",vcc->dev->number,vcc->vci);
1063 #endif
1064
1065
1066
1067
1068
1069
1070 aal5 = vcc->qos.aal == ATM_AAL5;
1071
1072 if (!aal5)
1073 size = (ATM_CELL_PAYLOAD >> 2)+TX_DESCR_SIZE;
1074
1075
1076 else {
1077 size = skb->len+4*AAL5_TRAILER+ATM_CELL_PAYLOAD-1;
1078
1079 size = ((size-(size % ATM_CELL_PAYLOAD)) >> 2)+TX_DESCR_SIZE;
1080
1081 }
1082
1083
1084
1085
1086
1087 if (!NEPMOK(tx->tx_pos,size+TX_GAP,
1088 eni_in(MID_TX_RDPTR(tx->index)),tx->words)) {
1089 DPRINTK(DEV_LABEL "(itf %d): TX full (size %d)\n",
1090 vcc->dev->number,size);
1091 return enq_next;
1092 }
1093
1094 dma_wr = eni_in(MID_DMA_WR_TX);
1095 dma_rd = eni_in(MID_DMA_RD_TX);
1096 dma_size = 3;
1097
1098 DPRINTK("iovcnt = %d\n",skb_shinfo(skb)->nr_frags);
1099 if (!skb_shinfo(skb)->nr_frags) dma_size += 5;
1100 else dma_size += 5*(skb_shinfo(skb)->nr_frags+1);
1101 if (dma_size > TX_DMA_BUF) {
1102 printk(KERN_CRIT DEV_LABEL "(itf %d): needs %d DMA entries "
1103 "(got only %d)\n",vcc->dev->number,dma_size,TX_DMA_BUF);
1104 }
1105 DPRINTK("dma_wr is %d, tx_pos is %ld\n",dma_wr,tx->tx_pos);
1106 if (dma_wr != dma_rd && ((dma_rd+NR_DMA_TX-dma_wr) & (NR_DMA_TX-1)) <
1107 dma_size) {
1108 printk(KERN_WARNING DEV_LABEL "(itf %d): TX DMA full\n",
1109 vcc->dev->number);
1110 return enq_jam;
1111 }
1112 skb_data3 = skb->data[3];
1113 paddr = dma_map_single(&eni_dev->pci_dev->dev,skb->data,skb->len,
1114 DMA_TO_DEVICE);
1115 if (dma_mapping_error(&eni_dev->pci_dev->dev, paddr))
1116 return enq_next;
1117 ENI_PRV_PADDR(skb) = paddr;
1118
1119 j = 0;
1120 eni_dev->dma[j++] = (((tx->tx_pos+TX_DESCR_SIZE) & (tx->words-1)) <<
1121 MID_DMA_COUNT_SHIFT) | (tx->index << MID_DMA_CHAN_SHIFT) |
1122 MID_DT_JK;
1123 j++;
1124 if (!skb_shinfo(skb)->nr_frags)
1125 if (aal5) put_dma(tx->index,eni_dev->dma,&j,paddr,skb->len);
1126 else put_dma(tx->index,eni_dev->dma,&j,paddr+4,skb->len-4);
1127 else {
1128 DPRINTK("doing direct send\n");
1129 for (i = -1; i < skb_shinfo(skb)->nr_frags; i++)
1130 if (i == -1)
1131 put_dma(tx->index,eni_dev->dma,&j,(unsigned long)
1132 skb->data,
1133 skb_headlen(skb));
1134 else
1135 put_dma(tx->index,eni_dev->dma,&j,(unsigned long)
1136 skb_frag_page(&skb_shinfo(skb)->frags[i]) +
1137 skb_frag_off(&skb_shinfo(skb)->frags[i]),
1138 skb_frag_size(&skb_shinfo(skb)->frags[i]));
1139 }
1140 if (skb->len & 3) {
1141 put_dma(tx->index, eni_dev->dma, &j, eni_dev->zero.dma,
1142 4 - (skb->len & 3));
1143 }
1144
1145 eni_dev->dma[j++] = (((tx->tx_pos+size) & (tx->words-1)) <<
1146 MID_DMA_COUNT_SHIFT) | (tx->index << MID_DMA_CHAN_SHIFT) |
1147 MID_DMA_END | MID_DT_JK;
1148 j++;
1149 DPRINTK("DMA at end: %d\n",j);
1150
1151 writel((MID_SEG_TX_ID << MID_SEG_ID_SHIFT) |
1152 (aal5 ? MID_SEG_AAL5 : 0) | (tx->prescaler << MID_SEG_PR_SHIFT) |
1153 (tx->resolution << MID_SEG_RATE_SHIFT) |
1154 (size/(ATM_CELL_PAYLOAD/4)),tx->send+tx->tx_pos*4);
1155
1156 writel((vcc->vci << MID_SEG_VCI_SHIFT) |
1157 (aal5 ? 0 : (skb_data3 & 0xf)) |
1158 (ATM_SKB(skb)->atm_options & ATM_ATMOPT_CLP ? MID_SEG_CLP : 0),
1159 tx->send+((tx->tx_pos+1) & (tx->words-1))*4);
1160 DPRINTK("size: %d, len:%d\n",size,skb->len);
1161 if (aal5)
1162 writel(skb->len,tx->send+
1163 ((tx->tx_pos+size-AAL5_TRAILER) & (tx->words-1))*4);
1164 j = j >> 1;
1165 for (i = 0; i < j; i++) {
1166 writel(eni_dev->dma[i*2],eni_dev->tx_dma+dma_wr*8);
1167 writel(eni_dev->dma[i*2+1],eni_dev->tx_dma+dma_wr*8+4);
1168 dma_wr = (dma_wr+1) & (NR_DMA_TX-1);
1169 }
1170 ENI_PRV_POS(skb) = tx->tx_pos;
1171 ENI_PRV_SIZE(skb) = size;
1172 ENI_VCC(vcc)->txing += size;
1173 tx->tx_pos = (tx->tx_pos+size) & (tx->words-1);
1174 DPRINTK("dma_wr set to %d, tx_pos is now %ld\n",dma_wr,tx->tx_pos);
1175 eni_out(dma_wr,MID_DMA_WR_TX);
1176 skb_queue_tail(&eni_dev->tx_queue,skb);
1177 queued++;
1178 return enq_ok;
1179 }
1180
1181
1182 static void poll_tx(struct atm_dev *dev)
1183 {
1184 struct eni_tx *tx;
1185 struct sk_buff *skb;
1186 enum enq_res res;
1187 int i;
1188
1189 DPRINTK(">poll_tx\n");
1190 for (i = NR_CHAN-1; i >= 0; i--) {
1191 tx = &ENI_DEV(dev)->tx[i];
1192 if (tx->send)
1193 while ((skb = skb_dequeue(&tx->backlog))) {
1194 res = do_tx(skb);
1195 if (res == enq_ok) continue;
1196 DPRINTK("re-queuing TX PDU\n");
1197 skb_queue_head(&tx->backlog,skb);
1198 requeued++;
1199 if (res == enq_jam) return;
1200 break;
1201 }
1202 }
1203 }
1204
1205
1206 static void dequeue_tx(struct atm_dev *dev)
1207 {
1208 struct eni_dev *eni_dev;
1209 struct atm_vcc *vcc;
1210 struct sk_buff *skb;
1211 struct eni_tx *tx;
1212
1213 NULLCHECK(dev);
1214 eni_dev = ENI_DEV(dev);
1215 NULLCHECK(eni_dev);
1216 while ((skb = skb_dequeue(&eni_dev->tx_queue))) {
1217 vcc = ATM_SKB(skb)->vcc;
1218 NULLCHECK(vcc);
1219 tx = ENI_VCC(vcc)->tx;
1220 NULLCHECK(ENI_VCC(vcc)->tx);
1221 DPRINTK("dequeue_tx: next 0x%lx curr 0x%x\n",ENI_PRV_POS(skb),
1222 (unsigned) eni_in(MID_TX_DESCRSTART(tx->index)));
1223 if (ENI_VCC(vcc)->txing < tx->words && ENI_PRV_POS(skb) ==
1224 eni_in(MID_TX_DESCRSTART(tx->index))) {
1225 skb_queue_head(&eni_dev->tx_queue,skb);
1226 break;
1227 }
1228 ENI_VCC(vcc)->txing -= ENI_PRV_SIZE(skb);
1229 dma_unmap_single(&eni_dev->pci_dev->dev,ENI_PRV_PADDR(skb),skb->len,
1230 DMA_TO_DEVICE);
1231 if (vcc->pop) vcc->pop(vcc,skb);
1232 else dev_kfree_skb_irq(skb);
1233 atomic_inc(&vcc->stats->tx);
1234 wake_up(&eni_dev->tx_wait);
1235 dma_complete++;
1236 }
1237 }
1238
1239
1240 static struct eni_tx *alloc_tx(struct eni_dev *eni_dev,int ubr)
1241 {
1242 int i;
1243
1244 for (i = !ubr; i < NR_CHAN; i++)
1245 if (!eni_dev->tx[i].send) return eni_dev->tx+i;
1246 return NULL;
1247 }
1248
1249
1250 static int comp_tx(struct eni_dev *eni_dev,int *pcr,int reserved,int *pre,
1251 int *res,int unlimited)
1252 {
1253 static const int pre_div[] = { 4,16,128,2048 };
1254
1255
1256 if (unlimited) *pre = *res = 0;
1257 else {
1258 if (*pcr > 0) {
1259 int div;
1260
1261 for (*pre = 0; *pre < 3; (*pre)++)
1262 if (TS_CLOCK/pre_div[*pre]/64 <= *pcr) break;
1263 div = pre_div[*pre]**pcr;
1264 DPRINTK("min div %d\n",div);
1265 *res = TS_CLOCK/div-1;
1266 }
1267 else {
1268 int div;
1269
1270 if (!*pcr) *pcr = eni_dev->tx_bw+reserved;
1271 for (*pre = 3; *pre >= 0; (*pre)--)
1272 if (TS_CLOCK/pre_div[*pre]/64 > -*pcr) break;
1273 if (*pre < 3) (*pre)++;
1274 div = pre_div[*pre]*-*pcr;
1275 DPRINTK("max div %d\n",div);
1276 *res = DIV_ROUND_UP(TS_CLOCK, div)-1;
1277 }
1278 if (*res < 0) *res = 0;
1279 if (*res > MID_SEG_MAX_RATE) *res = MID_SEG_MAX_RATE;
1280 }
1281 *pcr = TS_CLOCK/pre_div[*pre]/(*res+1);
1282 DPRINTK("out pcr: %d (%d:%d)\n",*pcr,*pre,*res);
1283 return 0;
1284 }
1285
1286
1287 static int reserve_or_set_tx(struct atm_vcc *vcc,struct atm_trafprm *txtp,
1288 int set_rsv,int set_shp)
1289 {
1290 struct eni_dev *eni_dev = ENI_DEV(vcc->dev);
1291 struct eni_vcc *eni_vcc = ENI_VCC(vcc);
1292 struct eni_tx *tx;
1293 unsigned long size;
1294 void __iomem *mem;
1295 int rate,ubr,unlimited,new_tx;
1296 int pre,res,order;
1297 int error;
1298
1299 rate = atm_pcr_goal(txtp);
1300 ubr = txtp->traffic_class == ATM_UBR;
1301 unlimited = ubr && (!rate || rate <= -ATM_OC3_PCR ||
1302 rate >= ATM_OC3_PCR);
1303 if (!unlimited) {
1304 size = txtp->max_sdu*eni_dev->tx_mult/100;
1305 if (size > MID_MAX_BUF_SIZE && txtp->max_sdu <=
1306 MID_MAX_BUF_SIZE)
1307 size = MID_MAX_BUF_SIZE;
1308 }
1309 else {
1310 if (eni_dev->ubr) {
1311 eni_vcc->tx = eni_dev->ubr;
1312 txtp->pcr = ATM_OC3_PCR;
1313 return 0;
1314 }
1315 size = UBR_BUFFER;
1316 }
1317 new_tx = !eni_vcc->tx;
1318 mem = NULL;
1319 if (!new_tx) tx = eni_vcc->tx;
1320 else {
1321 mem = eni_alloc_mem(eni_dev,&size);
1322 if (!mem) return -ENOBUFS;
1323 tx = alloc_tx(eni_dev,unlimited);
1324 if (!tx) {
1325 eni_free_mem(eni_dev,mem,size);
1326 return -EBUSY;
1327 }
1328 DPRINTK("got chan %d\n",tx->index);
1329 tx->reserved = tx->shaping = 0;
1330 tx->send = mem;
1331 tx->words = size >> 2;
1332 skb_queue_head_init(&tx->backlog);
1333 for (order = 0; size > (1 << (order+10)); order++);
1334 eni_out((order << MID_SIZE_SHIFT) |
1335 ((tx->send-eni_dev->ram) >> (MID_LOC_SKIP+2)),
1336 MID_TX_PLACE(tx->index));
1337 tx->tx_pos = eni_in(MID_TX_DESCRSTART(tx->index)) &
1338 MID_DESCR_START;
1339 }
1340 error = comp_tx(eni_dev,&rate,tx->reserved,&pre,&res,unlimited);
1341 if (!error && txtp->min_pcr > rate) error = -EINVAL;
1342 if (!error && txtp->max_pcr && txtp->max_pcr != ATM_MAX_PCR &&
1343 txtp->max_pcr < rate) error = -EINVAL;
1344 if (!error && !ubr && rate > eni_dev->tx_bw+tx->reserved)
1345 error = -EINVAL;
1346 if (!error && set_rsv && !set_shp && rate < tx->shaping)
1347 error = -EINVAL;
1348 if (!error && !set_rsv && rate > tx->reserved && !ubr)
1349 error = -EINVAL;
1350 if (error) {
1351 if (new_tx) {
1352 tx->send = NULL;
1353 eni_free_mem(eni_dev,mem,size);
1354 }
1355 return error;
1356 }
1357 txtp->pcr = rate;
1358 if (set_rsv && !ubr) {
1359 eni_dev->tx_bw += tx->reserved;
1360 tx->reserved = rate;
1361 eni_dev->tx_bw -= rate;
1362 }
1363 if (set_shp || (unlimited && new_tx)) {
1364 if (unlimited && new_tx) eni_dev->ubr = tx;
1365 tx->prescaler = pre;
1366 tx->resolution = res;
1367 tx->shaping = rate;
1368 }
1369 if (set_shp) eni_vcc->tx = tx;
1370 DPRINTK("rsv %d shp %d\n",tx->reserved,tx->shaping);
1371 return 0;
1372 }
1373
1374
1375 static int open_tx_first(struct atm_vcc *vcc)
1376 {
1377 ENI_VCC(vcc)->tx = NULL;
1378 if (vcc->qos.txtp.traffic_class == ATM_NONE) return 0;
1379 ENI_VCC(vcc)->txing = 0;
1380 return reserve_or_set_tx(vcc,&vcc->qos.txtp,1,1);
1381 }
1382
1383
1384 static int open_tx_second(struct atm_vcc *vcc)
1385 {
1386 return 0;
1387 }
1388
1389
1390 static void close_tx(struct atm_vcc *vcc)
1391 {
1392 DECLARE_WAITQUEUE(wait,current);
1393 struct eni_dev *eni_dev;
1394 struct eni_vcc *eni_vcc;
1395
1396 eni_vcc = ENI_VCC(vcc);
1397 if (!eni_vcc->tx) return;
1398 eni_dev = ENI_DEV(vcc->dev);
1399
1400 DPRINTK("eni_close: waiting for TX ...\n");
1401 add_wait_queue(&eni_dev->tx_wait,&wait);
1402 set_current_state(TASK_UNINTERRUPTIBLE);
1403 for (;;) {
1404 int txing;
1405
1406 tasklet_disable(&eni_dev->task);
1407 txing = skb_peek(&eni_vcc->tx->backlog) || eni_vcc->txing;
1408 tasklet_enable(&eni_dev->task);
1409 if (!txing) break;
1410 DPRINTK("%d TX left\n",eni_vcc->txing);
1411 schedule();
1412 set_current_state(TASK_UNINTERRUPTIBLE);
1413 }
1414 set_current_state(TASK_RUNNING);
1415 remove_wait_queue(&eni_dev->tx_wait,&wait);
1416 if (eni_vcc->tx != eni_dev->ubr) {
1417
1418
1419
1420
1421
1422 while (eni_in(MID_TX_RDPTR(eni_vcc->tx->index)) !=
1423 eni_in(MID_TX_DESCRSTART(eni_vcc->tx->index)))
1424 schedule();
1425 eni_free_mem(eni_dev,eni_vcc->tx->send,eni_vcc->tx->words << 2);
1426 eni_vcc->tx->send = NULL;
1427 eni_dev->tx_bw += eni_vcc->tx->reserved;
1428 }
1429 eni_vcc->tx = NULL;
1430 }
1431
1432
1433 static int start_tx(struct atm_dev *dev)
1434 {
1435 struct eni_dev *eni_dev;
1436 int i;
1437
1438 eni_dev = ENI_DEV(dev);
1439 eni_dev->lost = 0;
1440 eni_dev->tx_bw = ATM_OC3_PCR;
1441 eni_dev->tx_mult = DEFAULT_TX_MULT;
1442 init_waitqueue_head(&eni_dev->tx_wait);
1443 eni_dev->ubr = NULL;
1444 skb_queue_head_init(&eni_dev->tx_queue);
1445 eni_out(0,MID_DMA_WR_TX);
1446 for (i = 0; i < NR_CHAN; i++) {
1447 eni_dev->tx[i].send = NULL;
1448 eni_dev->tx[i].index = i;
1449 }
1450 return 0;
1451 }
1452
1453
1454
1455
1456
1457 #if 0
1458
1459 static void foo(void)
1460 {
1461 printk(KERN_INFO
1462 "tx_complete=%d,dma_complete=%d,queued=%d,requeued=%d,sub=%d,\n"
1463 "backlogged=%d,rx_enqueued=%d,rx_dequeued=%d,putting=%d,pushed=%d\n",
1464 tx_complete,dma_complete,queued,requeued,submitted,backlogged,
1465 rx_enqueued,rx_dequeued,putting,pushed);
1466 if (eni_boards) printk(KERN_INFO "loss: %ld\n",ENI_DEV(eni_boards)->lost);
1467 }
1468
1469 #endif
1470
1471
1472 static void bug_int(struct atm_dev *dev,unsigned long reason)
1473 {
1474 DPRINTK(">bug_int\n");
1475 if (reason & MID_DMA_ERR_ACK)
1476 printk(KERN_CRIT DEV_LABEL "(itf %d): driver error - DMA "
1477 "error\n",dev->number);
1478 if (reason & MID_TX_IDENT_MISM)
1479 printk(KERN_CRIT DEV_LABEL "(itf %d): driver error - ident "
1480 "mismatch\n",dev->number);
1481 if (reason & MID_TX_DMA_OVFL)
1482 printk(KERN_CRIT DEV_LABEL "(itf %d): driver error - DMA "
1483 "overflow\n",dev->number);
1484 EVENT("---dump ends here---\n",0,0);
1485 printk(KERN_NOTICE "---recent events---\n");
1486 event_dump();
1487 }
1488
1489
1490 static irqreturn_t eni_int(int irq,void *dev_id)
1491 {
1492 struct atm_dev *dev;
1493 struct eni_dev *eni_dev;
1494 u32 reason;
1495
1496 DPRINTK(">eni_int\n");
1497 dev = dev_id;
1498 eni_dev = ENI_DEV(dev);
1499 reason = eni_in(MID_ISA);
1500 DPRINTK(DEV_LABEL ": int 0x%lx\n",(unsigned long) reason);
1501
1502
1503
1504
1505
1506
1507 if (reason & MID_STAT_OVFL) {
1508 EVENT("stat overflow\n",0,0);
1509 eni_dev->lost += eni_in(MID_STAT) & MID_OVFL_TRASH;
1510 }
1511 if (reason & MID_SUNI_INT) {
1512 EVENT("SUNI int\n",0,0);
1513 dev->phy->interrupt(dev);
1514 #if 0
1515 foo();
1516 #endif
1517 }
1518 spin_lock(&eni_dev->lock);
1519 eni_dev->events |= reason;
1520 spin_unlock(&eni_dev->lock);
1521 tasklet_schedule(&eni_dev->task);
1522 return IRQ_HANDLED;
1523 }
1524
1525
1526 static void eni_tasklet(unsigned long data)
1527 {
1528 struct atm_dev *dev = (struct atm_dev *) data;
1529 struct eni_dev *eni_dev = ENI_DEV(dev);
1530 unsigned long flags;
1531 u32 events;
1532
1533 DPRINTK("eni_tasklet (dev %p)\n",dev);
1534 spin_lock_irqsave(&eni_dev->lock,flags);
1535 events = xchg(&eni_dev->events,0);
1536 spin_unlock_irqrestore(&eni_dev->lock,flags);
1537 if (events & MID_RX_DMA_COMPLETE) {
1538 EVENT("INT: RX DMA complete, starting dequeue_rx\n",0,0);
1539 dequeue_rx(dev);
1540 EVENT("dequeue_rx done, starting poll_rx\n",0,0);
1541 poll_rx(dev);
1542 EVENT("poll_rx done\n",0,0);
1543
1544 }
1545 if (events & MID_SERVICE) {
1546 EVENT("INT: service, starting get_service\n",0,0);
1547 get_service(dev);
1548 EVENT("get_service done, starting poll_rx\n",0,0);
1549 poll_rx(dev);
1550 EVENT("poll_rx done\n",0,0);
1551 }
1552 if (events & MID_TX_DMA_COMPLETE) {
1553 EVENT("INT: TX DMA COMPLETE\n",0,0);
1554 dequeue_tx(dev);
1555 }
1556 if (events & MID_TX_COMPLETE) {
1557 EVENT("INT: TX COMPLETE\n",0,0);
1558 tx_complete++;
1559 wake_up(&eni_dev->tx_wait);
1560
1561 }
1562 if (events & (MID_DMA_ERR_ACK | MID_TX_IDENT_MISM | MID_TX_DMA_OVFL)) {
1563 EVENT("bug interrupt\n",0,0);
1564 bug_int(dev,events);
1565 }
1566 poll_tx(dev);
1567 }
1568
1569
1570
1571
1572
1573 static char * const media_name[] = {
1574 "MMF", "SMF", "MMF", "03?",
1575 "UTP", "05?", "06?", "07?",
1576 "TAXI","09?", "10?", "11?",
1577 "12?", "13?", "14?", "15?",
1578 "MMF", "SMF", "18?", "19?",
1579 "UTP", "21?", "22?", "23?",
1580 "24?", "25?", "26?", "27?",
1581 "28?", "29?", "30?", "31?"
1582 };
1583
1584
1585 #define SET_SEPROM \
1586 ({ if (!error && !pci_error) { \
1587 pci_error = pci_write_config_byte(eni_dev->pci_dev,PCI_TONGA_CTRL,tonga); \
1588 udelay(10); \
1589 } })
1590 #define GET_SEPROM \
1591 ({ if (!error && !pci_error) { \
1592 pci_error = pci_read_config_byte(eni_dev->pci_dev,PCI_TONGA_CTRL,&tonga); \
1593 udelay(10); \
1594 } })
1595
1596
1597 static int get_esi_asic(struct atm_dev *dev)
1598 {
1599 struct eni_dev *eni_dev;
1600 unsigned char tonga;
1601 int error,failed,pci_error;
1602 int address,i,j;
1603
1604 eni_dev = ENI_DEV(dev);
1605 error = pci_error = 0;
1606 tonga = SEPROM_MAGIC | SEPROM_DATA | SEPROM_CLK;
1607 SET_SEPROM;
1608 for (i = 0; i < ESI_LEN && !error && !pci_error; i++) {
1609
1610 tonga |= SEPROM_DATA;
1611 SET_SEPROM;
1612 tonga |= SEPROM_CLK;
1613 SET_SEPROM;
1614 tonga &= ~SEPROM_DATA;
1615 SET_SEPROM;
1616 tonga &= ~SEPROM_CLK;
1617 SET_SEPROM;
1618
1619 address = ((i+SEPROM_ESI_BASE) << 1)+1;
1620 for (j = 7; j >= 0; j--) {
1621 tonga = (address >> j) & 1 ? tonga | SEPROM_DATA :
1622 tonga & ~SEPROM_DATA;
1623 SET_SEPROM;
1624 tonga |= SEPROM_CLK;
1625 SET_SEPROM;
1626 tonga &= ~SEPROM_CLK;
1627 SET_SEPROM;
1628 }
1629
1630 tonga |= SEPROM_DATA;
1631 SET_SEPROM;
1632 tonga |= SEPROM_CLK;
1633 SET_SEPROM;
1634 GET_SEPROM;
1635 failed = tonga & SEPROM_DATA;
1636 tonga &= ~SEPROM_CLK;
1637 SET_SEPROM;
1638 tonga |= SEPROM_DATA;
1639 SET_SEPROM;
1640 if (failed) error = -EIO;
1641 else {
1642 dev->esi[i] = 0;
1643 for (j = 7; j >= 0; j--) {
1644 dev->esi[i] <<= 1;
1645 tonga |= SEPROM_DATA;
1646 SET_SEPROM;
1647 tonga |= SEPROM_CLK;
1648 SET_SEPROM;
1649 GET_SEPROM;
1650 if (tonga & SEPROM_DATA) dev->esi[i] |= 1;
1651 tonga &= ~SEPROM_CLK;
1652 SET_SEPROM;
1653 tonga |= SEPROM_DATA;
1654 SET_SEPROM;
1655 }
1656
1657 tonga |= SEPROM_DATA;
1658 SET_SEPROM;
1659 tonga |= SEPROM_CLK;
1660 SET_SEPROM;
1661 GET_SEPROM;
1662 if (!(tonga & SEPROM_DATA)) error = -EIO;
1663 tonga &= ~SEPROM_CLK;
1664 SET_SEPROM;
1665 tonga |= SEPROM_DATA;
1666 SET_SEPROM;
1667 }
1668
1669 tonga &= ~SEPROM_DATA;
1670 SET_SEPROM;
1671 tonga |= SEPROM_CLK;
1672 SET_SEPROM;
1673 tonga |= SEPROM_DATA;
1674 SET_SEPROM;
1675 }
1676 if (pci_error) {
1677 printk(KERN_ERR DEV_LABEL "(itf %d): error reading ESI "
1678 "(0x%02x)\n",dev->number,pci_error);
1679 error = -EIO;
1680 }
1681 return error;
1682 }
1683
1684
1685 #undef SET_SEPROM
1686 #undef GET_SEPROM
1687
1688
1689 static int get_esi_fpga(struct atm_dev *dev, void __iomem *base)
1690 {
1691 void __iomem *mac_base;
1692 int i;
1693
1694 mac_base = base+EPROM_SIZE-sizeof(struct midway_eprom);
1695 for (i = 0; i < ESI_LEN; i++) dev->esi[i] = readb(mac_base+(i^3));
1696 return 0;
1697 }
1698
1699
1700 static int eni_do_init(struct atm_dev *dev)
1701 {
1702 struct midway_eprom __iomem *eprom;
1703 struct eni_dev *eni_dev;
1704 struct pci_dev *pci_dev;
1705 unsigned long real_base;
1706 void __iomem *base;
1707 int error,i,last;
1708
1709 DPRINTK(">eni_init\n");
1710 dev->ci_range.vpi_bits = 0;
1711 dev->ci_range.vci_bits = NR_VCI_LD;
1712 dev->link_rate = ATM_OC3_PCR;
1713 eni_dev = ENI_DEV(dev);
1714 pci_dev = eni_dev->pci_dev;
1715 real_base = pci_resource_start(pci_dev, 0);
1716 eni_dev->irq = pci_dev->irq;
1717 if ((error = pci_write_config_word(pci_dev,PCI_COMMAND,
1718 PCI_COMMAND_MEMORY |
1719 (eni_dev->asic ? PCI_COMMAND_PARITY | PCI_COMMAND_SERR : 0)))) {
1720 printk(KERN_ERR DEV_LABEL "(itf %d): can't enable memory "
1721 "(0x%02x)\n",dev->number,error);
1722 return -EIO;
1723 }
1724 printk(KERN_NOTICE DEV_LABEL "(itf %d): rev.%d,base=0x%lx,irq=%d,",
1725 dev->number,pci_dev->revision,real_base,eni_dev->irq);
1726 if (!(base = ioremap(real_base,MAP_MAX_SIZE))) {
1727 printk("\n");
1728 printk(KERN_ERR DEV_LABEL "(itf %d): can't set up page "
1729 "mapping\n",dev->number);
1730 return -ENOMEM;
1731 }
1732 eni_dev->ioaddr = base;
1733 eni_dev->base_diff = real_base - (unsigned long) base;
1734
1735 if (!eni_dev->asic) {
1736 eprom = (base+EPROM_SIZE-sizeof(struct midway_eprom));
1737 if (readl(&eprom->magic) != ENI155_MAGIC) {
1738 printk("\n");
1739 printk(KERN_ERR DEV_LABEL
1740 "(itf %d): bad magic - expected 0x%x, got 0x%x\n",
1741 dev->number, ENI155_MAGIC,
1742 (unsigned)readl(&eprom->magic));
1743 error = -EINVAL;
1744 goto unmap;
1745 }
1746 }
1747 eni_dev->phy = base+PHY_BASE;
1748 eni_dev->reg = base+REG_BASE;
1749 eni_dev->ram = base+RAM_BASE;
1750 last = MAP_MAX_SIZE-RAM_BASE;
1751 for (i = last-RAM_INCREMENT; i >= 0; i -= RAM_INCREMENT) {
1752 writel(0x55555555,eni_dev->ram+i);
1753 if (readl(eni_dev->ram+i) != 0x55555555) last = i;
1754 else {
1755 writel(0xAAAAAAAA,eni_dev->ram+i);
1756 if (readl(eni_dev->ram+i) != 0xAAAAAAAA) last = i;
1757 else writel(i,eni_dev->ram+i);
1758 }
1759 }
1760 for (i = 0; i < last; i += RAM_INCREMENT)
1761 if (readl(eni_dev->ram+i) != i) break;
1762 eni_dev->mem = i;
1763 memset_io(eni_dev->ram,0,eni_dev->mem);
1764
1765 printk("mem=%dkB (",eni_dev->mem >> 10);
1766
1767 if (!(eni_in(MID_RES_ID_MCON) & 0x200) != !eni_dev->asic) {
1768 printk(")\n");
1769 printk(KERN_ERR DEV_LABEL "(itf %d): ERROR - wrong id 0x%x\n",
1770 dev->number,(unsigned) eni_in(MID_RES_ID_MCON));
1771 error = -EINVAL;
1772 goto unmap;
1773 }
1774 error = eni_dev->asic ? get_esi_asic(dev) : get_esi_fpga(dev,base);
1775 if (error)
1776 goto unmap;
1777 for (i = 0; i < ESI_LEN; i++)
1778 printk("%s%02X",i ? "-" : "",dev->esi[i]);
1779 printk(")\n");
1780 printk(KERN_NOTICE DEV_LABEL "(itf %d): %s,%s\n",dev->number,
1781 eni_in(MID_RES_ID_MCON) & 0x200 ? "ASIC" : "FPGA",
1782 media_name[eni_in(MID_RES_ID_MCON) & DAUGHTER_ID]);
1783
1784 error = suni_init(dev);
1785 if (error)
1786 goto unmap;
1787 out:
1788 return error;
1789 unmap:
1790 iounmap(base);
1791 goto out;
1792 }
1793
1794 static void eni_do_release(struct atm_dev *dev)
1795 {
1796 struct eni_dev *ed = ENI_DEV(dev);
1797
1798 dev->phy->stop(dev);
1799 dev->phy = NULL;
1800 iounmap(ed->ioaddr);
1801 }
1802
1803 static int eni_start(struct atm_dev *dev)
1804 {
1805 struct eni_dev *eni_dev;
1806
1807 void __iomem *buf;
1808 unsigned long buffer_mem;
1809 int error;
1810
1811 DPRINTK(">eni_start\n");
1812 eni_dev = ENI_DEV(dev);
1813 if (request_irq(eni_dev->irq,&eni_int,IRQF_SHARED,DEV_LABEL,dev)) {
1814 printk(KERN_ERR DEV_LABEL "(itf %d): IRQ%d is already in use\n",
1815 dev->number,eni_dev->irq);
1816 error = -EAGAIN;
1817 goto out;
1818 }
1819 pci_set_master(eni_dev->pci_dev);
1820 if ((error = pci_write_config_word(eni_dev->pci_dev,PCI_COMMAND,
1821 PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
1822 (eni_dev->asic ? PCI_COMMAND_PARITY | PCI_COMMAND_SERR : 0)))) {
1823 printk(KERN_ERR DEV_LABEL "(itf %d): can't enable memory+"
1824 "master (0x%02x)\n",dev->number,error);
1825 goto free_irq;
1826 }
1827 if ((error = pci_write_config_byte(eni_dev->pci_dev,PCI_TONGA_CTRL,
1828 END_SWAP_DMA))) {
1829 printk(KERN_ERR DEV_LABEL "(itf %d): can't set endian swap "
1830 "(0x%02x)\n",dev->number,error);
1831 goto free_irq;
1832 }
1833
1834 eni_dev->vci = eni_dev->ram;
1835 eni_dev->rx_dma = eni_dev->ram+NR_VCI*16;
1836 eni_dev->tx_dma = eni_dev->rx_dma+NR_DMA_RX*8;
1837 eni_dev->service = eni_dev->tx_dma+NR_DMA_TX*8;
1838 buf = eni_dev->service+NR_SERVICE*4;
1839 DPRINTK("vci 0x%lx,rx 0x%lx, tx 0x%lx,srv 0x%lx,buf 0x%lx\n",
1840 eni_dev->vci,eni_dev->rx_dma,eni_dev->tx_dma,
1841 eni_dev->service,buf);
1842 spin_lock_init(&eni_dev->lock);
1843 tasklet_init(&eni_dev->task,eni_tasklet,(unsigned long) dev);
1844 eni_dev->events = 0;
1845
1846 buffer_mem = eni_dev->mem - (buf - eni_dev->ram);
1847 eni_dev->free_list_size = buffer_mem/MID_MIN_BUF_SIZE/2;
1848 eni_dev->free_list = kmalloc_array(eni_dev->free_list_size + 1,
1849 sizeof(*eni_dev->free_list),
1850 GFP_KERNEL);
1851 if (!eni_dev->free_list) {
1852 printk(KERN_ERR DEV_LABEL "(itf %d): couldn't get free page\n",
1853 dev->number);
1854 error = -ENOMEM;
1855 goto free_irq;
1856 }
1857 eni_dev->free_len = 0;
1858 eni_put_free(eni_dev,buf,buffer_mem);
1859 memset_io(eni_dev->vci,0,16*NR_VCI);
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869 eni_out(0xffffffff,MID_IE);
1870 error = start_tx(dev);
1871 if (error) goto free_list;
1872 error = start_rx(dev);
1873 if (error) goto free_list;
1874 error = dev->phy->start(dev);
1875 if (error) goto free_list;
1876 eni_out(eni_in(MID_MC_S) | (1 << MID_INT_SEL_SHIFT) |
1877 MID_TX_LOCK_MODE | MID_DMA_ENABLE | MID_TX_ENABLE | MID_RX_ENABLE,
1878 MID_MC_S);
1879
1880 (void) eni_in(MID_ISA);
1881 return 0;
1882
1883 free_list:
1884 kfree(eni_dev->free_list);
1885
1886 free_irq:
1887 free_irq(eni_dev->irq, dev);
1888
1889 out:
1890 return error;
1891 }
1892
1893
1894 static void eni_close(struct atm_vcc *vcc)
1895 {
1896 DPRINTK(">eni_close\n");
1897 if (!ENI_VCC(vcc)) return;
1898 clear_bit(ATM_VF_READY,&vcc->flags);
1899 close_rx(vcc);
1900 close_tx(vcc);
1901 DPRINTK("eni_close: done waiting\n");
1902
1903 kfree(ENI_VCC(vcc));
1904 vcc->dev_data = NULL;
1905 clear_bit(ATM_VF_ADDR,&vcc->flags);
1906
1907 }
1908
1909
1910 static int eni_open(struct atm_vcc *vcc)
1911 {
1912 struct eni_vcc *eni_vcc;
1913 int error;
1914 short vpi = vcc->vpi;
1915 int vci = vcc->vci;
1916
1917 DPRINTK(">eni_open\n");
1918 EVENT("eni_open\n",0,0);
1919 if (!test_bit(ATM_VF_PARTIAL,&vcc->flags))
1920 vcc->dev_data = NULL;
1921 if (vci != ATM_VPI_UNSPEC && vpi != ATM_VCI_UNSPEC)
1922 set_bit(ATM_VF_ADDR,&vcc->flags);
1923 if (vcc->qos.aal != ATM_AAL0 && vcc->qos.aal != ATM_AAL5)
1924 return -EINVAL;
1925 DPRINTK(DEV_LABEL "(itf %d): open %d.%d\n",vcc->dev->number,vcc->vpi,
1926 vcc->vci);
1927 if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) {
1928 eni_vcc = kmalloc(sizeof(struct eni_vcc),GFP_KERNEL);
1929 if (!eni_vcc) return -ENOMEM;
1930 vcc->dev_data = eni_vcc;
1931 eni_vcc->tx = NULL;
1932 if ((error = open_rx_first(vcc))) {
1933 eni_close(vcc);
1934 return error;
1935 }
1936 if ((error = open_tx_first(vcc))) {
1937 eni_close(vcc);
1938 return error;
1939 }
1940 }
1941 if (vci == ATM_VPI_UNSPEC || vpi == ATM_VCI_UNSPEC) return 0;
1942 if ((error = open_rx_second(vcc))) {
1943 eni_close(vcc);
1944 return error;
1945 }
1946 if ((error = open_tx_second(vcc))) {
1947 eni_close(vcc);
1948 return error;
1949 }
1950 set_bit(ATM_VF_READY,&vcc->flags);
1951
1952 return 0;
1953 }
1954
1955
1956 static int eni_change_qos(struct atm_vcc *vcc,struct atm_qos *qos,int flgs)
1957 {
1958 struct eni_dev *eni_dev = ENI_DEV(vcc->dev);
1959 struct eni_tx *tx = ENI_VCC(vcc)->tx;
1960 struct sk_buff *skb;
1961 int error,rate,rsv,shp;
1962
1963 if (qos->txtp.traffic_class == ATM_NONE) return 0;
1964 if (tx == eni_dev->ubr) return -EBADFD;
1965 rate = atm_pcr_goal(&qos->txtp);
1966 if (rate < 0) rate = -rate;
1967 rsv = shp = 0;
1968 if ((flgs & ATM_MF_DEC_RSV) && rate && rate < tx->reserved) rsv = 1;
1969 if ((flgs & ATM_MF_INC_RSV) && (!rate || rate > tx->reserved)) rsv = 1;
1970 if ((flgs & ATM_MF_DEC_SHP) && rate && rate < tx->shaping) shp = 1;
1971 if ((flgs & ATM_MF_INC_SHP) && (!rate || rate > tx->shaping)) shp = 1;
1972 if (!rsv && !shp) return 0;
1973 error = reserve_or_set_tx(vcc,&qos->txtp,rsv,shp);
1974 if (error) return error;
1975 if (shp && !(flgs & ATM_MF_IMMED)) return 0;
1976
1977
1978
1979
1980 tasklet_disable(&eni_dev->task);
1981 skb_queue_walk(&eni_dev->tx_queue, skb) {
1982 void __iomem *dsc;
1983
1984 if (ATM_SKB(skb)->vcc != vcc) continue;
1985 dsc = tx->send+ENI_PRV_POS(skb)*4;
1986 writel((readl(dsc) & ~(MID_SEG_RATE | MID_SEG_PR)) |
1987 (tx->prescaler << MID_SEG_PR_SHIFT) |
1988 (tx->resolution << MID_SEG_RATE_SHIFT), dsc);
1989 }
1990 tasklet_enable(&eni_dev->task);
1991 return 0;
1992 }
1993
1994
1995 static int eni_ioctl(struct atm_dev *dev,unsigned int cmd,void __user *arg)
1996 {
1997 struct eni_dev *eni_dev = ENI_DEV(dev);
1998
1999 if (cmd == ENI_MEMDUMP) {
2000 if (!capable(CAP_NET_ADMIN)) return -EPERM;
2001 printk(KERN_WARNING "Please use /proc/atm/" DEV_LABEL ":%d "
2002 "instead of obsolete ioctl ENI_MEMDUMP\n",dev->number);
2003 dump(dev);
2004 return 0;
2005 }
2006 if (cmd == ENI_SETMULT) {
2007 struct eni_multipliers mult;
2008
2009 if (!capable(CAP_NET_ADMIN)) return -EPERM;
2010 if (copy_from_user(&mult, arg,
2011 sizeof(struct eni_multipliers)))
2012 return -EFAULT;
2013 if ((mult.tx && mult.tx <= 100) || (mult.rx &&mult.rx <= 100) ||
2014 mult.tx > 65536 || mult.rx > 65536)
2015 return -EINVAL;
2016 if (mult.tx) eni_dev->tx_mult = mult.tx;
2017 if (mult.rx) eni_dev->rx_mult = mult.rx;
2018 return 0;
2019 }
2020 if (cmd == ATM_SETCIRANGE) {
2021 struct atm_cirange ci;
2022
2023 if (copy_from_user(&ci, arg,sizeof(struct atm_cirange)))
2024 return -EFAULT;
2025 if ((ci.vpi_bits == 0 || ci.vpi_bits == ATM_CI_MAX) &&
2026 (ci.vci_bits == NR_VCI_LD || ci.vpi_bits == ATM_CI_MAX))
2027 return 0;
2028 return -EINVAL;
2029 }
2030 if (!dev->phy->ioctl) return -ENOIOCTLCMD;
2031 return dev->phy->ioctl(dev,cmd,arg);
2032 }
2033
2034 static int eni_send(struct atm_vcc *vcc,struct sk_buff *skb)
2035 {
2036 enum enq_res res;
2037
2038 DPRINTK(">eni_send\n");
2039 if (!ENI_VCC(vcc)->tx) {
2040 if (vcc->pop) vcc->pop(vcc,skb);
2041 else dev_kfree_skb(skb);
2042 return -EINVAL;
2043 }
2044 if (!skb) {
2045 printk(KERN_CRIT "!skb in eni_send ?\n");
2046 if (vcc->pop) vcc->pop(vcc,skb);
2047 return -EINVAL;
2048 }
2049 if (vcc->qos.aal == ATM_AAL0) {
2050 if (skb->len != ATM_CELL_SIZE-1) {
2051 if (vcc->pop) vcc->pop(vcc,skb);
2052 else dev_kfree_skb(skb);
2053 return -EINVAL;
2054 }
2055 *(u32 *) skb->data = htonl(*(u32 *) skb->data);
2056 }
2057 submitted++;
2058 ATM_SKB(skb)->vcc = vcc;
2059 tasklet_disable_in_atomic(&ENI_DEV(vcc->dev)->task);
2060 res = do_tx(skb);
2061 tasklet_enable(&ENI_DEV(vcc->dev)->task);
2062 if (res == enq_ok) return 0;
2063 skb_queue_tail(&ENI_VCC(vcc)->tx->backlog,skb);
2064 backlogged++;
2065 tasklet_schedule(&ENI_DEV(vcc->dev)->task);
2066 return 0;
2067 }
2068
2069 static void eni_phy_put(struct atm_dev *dev,unsigned char value,
2070 unsigned long addr)
2071 {
2072 writel(value,ENI_DEV(dev)->phy+addr*4);
2073 }
2074
2075
2076
2077 static unsigned char eni_phy_get(struct atm_dev *dev,unsigned long addr)
2078 {
2079 return readl(ENI_DEV(dev)->phy+addr*4);
2080 }
2081
2082
2083 static int eni_proc_read(struct atm_dev *dev,loff_t *pos,char *page)
2084 {
2085 struct sock *s;
2086 static const char *signal[] = { "LOST","unknown","okay" };
2087 struct eni_dev *eni_dev = ENI_DEV(dev);
2088 struct atm_vcc *vcc;
2089 int left,i;
2090
2091 left = *pos;
2092 if (!left)
2093 return sprintf(page,DEV_LABEL "(itf %d) signal %s, %dkB, "
2094 "%d cps remaining\n",dev->number,signal[(int) dev->signal],
2095 eni_dev->mem >> 10,eni_dev->tx_bw);
2096 if (!--left)
2097 return sprintf(page,"%4sBursts: TX"
2098 #if !defined(CONFIG_ATM_ENI_BURST_TX_16W) && \
2099 !defined(CONFIG_ATM_ENI_BURST_TX_8W) && \
2100 !defined(CONFIG_ATM_ENI_BURST_TX_4W) && \
2101 !defined(CONFIG_ATM_ENI_BURST_TX_2W)
2102 " none"
2103 #endif
2104 #ifdef CONFIG_ATM_ENI_BURST_TX_16W
2105 " 16W"
2106 #endif
2107 #ifdef CONFIG_ATM_ENI_BURST_TX_8W
2108 " 8W"
2109 #endif
2110 #ifdef CONFIG_ATM_ENI_BURST_TX_4W
2111 " 4W"
2112 #endif
2113 #ifdef CONFIG_ATM_ENI_BURST_TX_2W
2114 " 2W"
2115 #endif
2116 ", RX"
2117 #if !defined(CONFIG_ATM_ENI_BURST_RX_16W) && \
2118 !defined(CONFIG_ATM_ENI_BURST_RX_8W) && \
2119 !defined(CONFIG_ATM_ENI_BURST_RX_4W) && \
2120 !defined(CONFIG_ATM_ENI_BURST_RX_2W)
2121 " none"
2122 #endif
2123 #ifdef CONFIG_ATM_ENI_BURST_RX_16W
2124 " 16W"
2125 #endif
2126 #ifdef CONFIG_ATM_ENI_BURST_RX_8W
2127 " 8W"
2128 #endif
2129 #ifdef CONFIG_ATM_ENI_BURST_RX_4W
2130 " 4W"
2131 #endif
2132 #ifdef CONFIG_ATM_ENI_BURST_RX_2W
2133 " 2W"
2134 #endif
2135 #ifndef CONFIG_ATM_ENI_TUNE_BURST
2136 " (default)"
2137 #endif
2138 "\n","");
2139 if (!--left)
2140 return sprintf(page,"%4sBuffer multipliers: tx %d%%, rx %d%%\n",
2141 "",eni_dev->tx_mult,eni_dev->rx_mult);
2142 for (i = 0; i < NR_CHAN; i++) {
2143 struct eni_tx *tx = eni_dev->tx+i;
2144
2145 if (!tx->send) continue;
2146 if (!--left) {
2147 return sprintf(page, "tx[%d]: 0x%lx-0x%lx "
2148 "(%6ld bytes), rsv %d cps, shp %d cps%s\n",i,
2149 (unsigned long) (tx->send - eni_dev->ram),
2150 tx->send-eni_dev->ram+tx->words*4-1,tx->words*4,
2151 tx->reserved,tx->shaping,
2152 tx == eni_dev->ubr ? " (UBR)" : "");
2153 }
2154 if (--left) continue;
2155 return sprintf(page,"%10sbacklog %u packets\n","",
2156 skb_queue_len(&tx->backlog));
2157 }
2158 read_lock(&vcc_sklist_lock);
2159 for(i = 0; i < VCC_HTABLE_SIZE; ++i) {
2160 struct hlist_head *head = &vcc_hash[i];
2161
2162 sk_for_each(s, head) {
2163 struct eni_vcc *eni_vcc;
2164 int length;
2165
2166 vcc = atm_sk(s);
2167 if (vcc->dev != dev)
2168 continue;
2169 eni_vcc = ENI_VCC(vcc);
2170 if (--left) continue;
2171 length = sprintf(page,"vcc %4d: ",vcc->vci);
2172 if (eni_vcc->rx) {
2173 length += sprintf(page+length, "0x%lx-0x%lx "
2174 "(%6ld bytes)",
2175 (unsigned long) (eni_vcc->recv - eni_dev->ram),
2176 eni_vcc->recv-eni_dev->ram+eni_vcc->words*4-1,
2177 eni_vcc->words*4);
2178 if (eni_vcc->tx) length += sprintf(page+length,", ");
2179 }
2180 if (eni_vcc->tx)
2181 length += sprintf(page+length,"tx[%d], txing %d bytes",
2182 eni_vcc->tx->index,eni_vcc->txing);
2183 page[length] = '\n';
2184 read_unlock(&vcc_sklist_lock);
2185 return length+1;
2186 }
2187 }
2188 read_unlock(&vcc_sklist_lock);
2189 for (i = 0; i < eni_dev->free_len; i++) {
2190 struct eni_free *fe = eni_dev->free_list+i;
2191 unsigned long offset;
2192
2193 if (--left) continue;
2194 offset = (unsigned long) eni_dev->ram+eni_dev->base_diff;
2195 return sprintf(page,"free %p-%p (%6d bytes)\n",
2196 fe->start-offset,fe->start-offset+(1 << fe->order)-1,
2197 1 << fe->order);
2198 }
2199 return 0;
2200 }
2201
2202
2203 static const struct atmdev_ops ops = {
2204 .open = eni_open,
2205 .close = eni_close,
2206 .ioctl = eni_ioctl,
2207 .send = eni_send,
2208 .phy_put = eni_phy_put,
2209 .phy_get = eni_phy_get,
2210 .change_qos = eni_change_qos,
2211 .proc_read = eni_proc_read
2212 };
2213
2214
2215 static int eni_init_one(struct pci_dev *pci_dev,
2216 const struct pci_device_id *ent)
2217 {
2218 struct atm_dev *dev;
2219 struct eni_dev *eni_dev;
2220 struct eni_zero *zero;
2221 int rc;
2222
2223 rc = pci_enable_device(pci_dev);
2224 if (rc < 0)
2225 goto out;
2226
2227 rc = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32));
2228 if (rc < 0)
2229 goto err_disable;
2230
2231 rc = -ENOMEM;
2232 eni_dev = kmalloc(sizeof(struct eni_dev), GFP_KERNEL);
2233 if (!eni_dev)
2234 goto err_disable;
2235
2236 zero = &eni_dev->zero;
2237 zero->addr = dma_alloc_coherent(&pci_dev->dev,
2238 ENI_ZEROES_SIZE, &zero->dma, GFP_KERNEL);
2239 if (!zero->addr)
2240 goto err_kfree;
2241
2242 dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &ops, -1, NULL);
2243 if (!dev)
2244 goto err_free_consistent;
2245
2246 dev->dev_data = eni_dev;
2247 pci_set_drvdata(pci_dev, dev);
2248 eni_dev->pci_dev = pci_dev;
2249 eni_dev->asic = ent->driver_data;
2250
2251 rc = eni_do_init(dev);
2252 if (rc < 0)
2253 goto err_unregister;
2254
2255 rc = eni_start(dev);
2256 if (rc < 0)
2257 goto err_eni_release;
2258
2259 eni_dev->more = eni_boards;
2260 eni_boards = dev;
2261 out:
2262 return rc;
2263
2264 err_eni_release:
2265 dev->phy = NULL;
2266 iounmap(ENI_DEV(dev)->ioaddr);
2267 err_unregister:
2268 atm_dev_deregister(dev);
2269 err_free_consistent:
2270 dma_free_coherent(&pci_dev->dev, ENI_ZEROES_SIZE, zero->addr, zero->dma);
2271 err_kfree:
2272 kfree(eni_dev);
2273 err_disable:
2274 pci_disable_device(pci_dev);
2275 goto out;
2276 }
2277
2278
2279 static const struct pci_device_id eni_pci_tbl[] = {
2280 { PCI_VDEVICE(EF, PCI_DEVICE_ID_EF_ATM_FPGA), 0 },
2281 { PCI_VDEVICE(EF, PCI_DEVICE_ID_EF_ATM_ASIC), 1 },
2282 { 0, }
2283 };
2284 MODULE_DEVICE_TABLE(pci,eni_pci_tbl);
2285
2286
2287 static void eni_remove_one(struct pci_dev *pdev)
2288 {
2289 struct atm_dev *dev = pci_get_drvdata(pdev);
2290 struct eni_dev *ed = ENI_DEV(dev);
2291 struct eni_zero *zero = &ed->zero;
2292
2293 eni_do_release(dev);
2294 atm_dev_deregister(dev);
2295 dma_free_coherent(&pdev->dev, ENI_ZEROES_SIZE, zero->addr, zero->dma);
2296 kfree(ed);
2297 pci_disable_device(pdev);
2298 }
2299
2300
2301 static struct pci_driver eni_driver = {
2302 .name = DEV_LABEL,
2303 .id_table = eni_pci_tbl,
2304 .probe = eni_init_one,
2305 .remove = eni_remove_one,
2306 };
2307
2308
2309 static int __init eni_init(void)
2310 {
2311 struct sk_buff *skb;
2312
2313 BUILD_BUG_ON(sizeof(skb->cb) < sizeof(struct eni_skb_prv));
2314 return pci_register_driver(&eni_driver);
2315 }
2316
2317
2318 module_init(eni_init);
2319
2320
2321 MODULE_LICENSE("GPL");