make oldconfig will rebuild these...
[linux-2.4.21-pre4.git] / drivers / atm / zatm.c
1 /* drivers/atm/zatm.c - ZeitNet ZN122x device driver */
2  
3 /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
4
5
6 #include <linux/config.h>
7 #include <linux/module.h>
8 #include <linux/sched.h>
9 #include <linux/kernel.h>
10 #include <linux/mm.h>
11 #include <linux/pci.h>
12 #include <linux/errno.h>
13 #include <linux/atm.h>
14 #include <linux/atmdev.h>
15 #include <linux/sonet.h>
16 #include <linux/skbuff.h>
17 #include <linux/netdevice.h>
18 #include <linux/delay.h>
19 #include <linux/ioport.h> /* for request_region */
20 #include <linux/uio.h>
21 #include <linux/init.h>
22 #include <linux/atm_zatm.h>
23 #include <linux/capability.h>
24 #include <linux/bitops.h>
25 #include <asm/byteorder.h>
26 #include <asm/system.h>
27 #include <asm/string.h>
28 #include <asm/io.h>
29 #include <asm/atomic.h>
30 #include <asm/uaccess.h>
31
32 #include "uPD98401.h"
33 #include "uPD98402.h"
34 #include "zeprom.h"
35 #include "zatm.h"
36
37
38 /*
39  * TODO:
40  *
41  * Minor features
42  *  - support 64 kB SDUs (will have to use multibuffer batches then :-( )
43  *  - proper use of CDV, credit = max(1,CDVT*PCR)
44  *  - AAL0
45  *  - better receive timestamps
46  *  - OAM
47  */
48
49 #if 0
50 #define DPRINTK(format,args...) printk(KERN_DEBUG format,##args)
51 #else
52 #define DPRINTK(format,args...)
53 #endif
54
55 #ifndef __i386__
56 #ifdef CONFIG_ATM_ZATM_EXACT_TS
57 #warning Precise timestamping only available on i386 platform
58 #undef CONFIG_ATM_ZATM_EXACT_TS
59 #endif
60 #endif
61
62 #ifndef CONFIG_ATM_ZATM_DEBUG
63
64
65 #define NULLCHECK(x)
66
67 #define EVENT(s,a,b)
68
69
70 static void event_dump(void)
71 {
72 }
73
74
75 #else
76
77
78 /* 
79  * NULL pointer checking
80  */
81
82 #define NULLCHECK(x) \
83   if ((unsigned long) (x) < 0x30) printk(KERN_CRIT #x "==0x%x\n", (int) (x))
84
85 /*
86  * Very extensive activity logging. Greatly improves bug detection speed but
87  * costs a few Mbps if enabled.
88  */
89
90 #define EV 64
91
92 static const char *ev[EV];
93 static unsigned long ev_a[EV],ev_b[EV];
94 static int ec = 0;
95
96
97 static void EVENT(const char *s,unsigned long a,unsigned long b)
98 {
99         ev[ec] = s; 
100         ev_a[ec] = a;
101         ev_b[ec] = b;
102         ec = (ec+1) % EV;
103 }
104
105
106 static void event_dump(void)
107 {
108         int n,i;
109
110         printk(KERN_NOTICE "----- event dump follows -----\n");
111         for (n = 0; n < EV; n++) {
112                 i = (ec+n) % EV;
113                 printk(KERN_NOTICE);
114                 printk(ev[i] ? ev[i] : "(null)",ev_a[i],ev_b[i]);
115         }
116         printk(KERN_NOTICE "----- event dump ends here -----\n");
117 }
118
119
120 #endif /* CONFIG_ATM_ZATM_DEBUG */
121
122
123 #define RING_BUSY       1       /* indication from do_tx that PDU has to be
124                                    backlogged */
125
126 static struct atm_dev *zatm_boards = NULL;
127 static unsigned long dummy[2] = {0,0};
128
129
130 #define zin_n(r) inl(zatm_dev->base+r*4)
131 #define zin(r) inl(zatm_dev->base+uPD98401_##r*4)
132 #define zout(v,r) outl(v,zatm_dev->base+uPD98401_##r*4)
133 #define zwait while (zin(CMR) & uPD98401_BUSY)
134
135 /* RX0, RX1, TX0, TX1 */
136 static const int mbx_entries[NR_MBX] = { 1024,1024,1024,1024 };
137 static const int mbx_esize[NR_MBX] = { 16,16,4,4 }; /* entry size in bytes */
138
139 #define MBX_SIZE(i) (mbx_entries[i]*mbx_esize[i])
140
141
142 /*-------------------------------- utilities --------------------------------*/
143
144
145 static void zpokel(struct zatm_dev *zatm_dev,u32 value,u32 addr)
146 {
147         zwait;
148         zout(value,CER);
149         zout(uPD98401_IND_ACC | uPD98401_IA_BALL |
150             (uPD98401_IA_TGT_CM << uPD98401_IA_TGT_SHIFT) | addr,CMR);
151 }
152
153
154 static u32 zpeekl(struct zatm_dev *zatm_dev,u32 addr)
155 {
156         zwait;
157         zout(uPD98401_IND_ACC | uPD98401_IA_BALL | uPD98401_IA_RW |
158           (uPD98401_IA_TGT_CM << uPD98401_IA_TGT_SHIFT) | addr,CMR);
159         zwait;
160         return zin(CER);
161 }
162
163
164 /*------------------------------- free lists --------------------------------*/
165
166
167 /*
168  * Free buffer head structure:
169  *   [0] pointer to buffer (for SAR)
170  *   [1] buffer descr link pointer (for SAR)
171  *   [2] back pointer to skb (for poll_rx)
172  *   [3] data
173  *   ...
174  */
175
176 struct rx_buffer_head {
177         u32             buffer; /* pointer to buffer (for SAR) */
178         u32             link;   /* buffer descriptor link pointer (for SAR) */
179         struct sk_buff  *skb;   /* back pointer to skb (for poll_rx) */
180 };
181
182
183 static void refill_pool(struct atm_dev *dev,int pool)
184 {
185         struct zatm_dev *zatm_dev;
186         struct sk_buff *skb;
187         struct rx_buffer_head *first;
188         unsigned long flags;
189         int align,offset,free,count,size;
190
191         EVENT("refill_pool\n",0,0);
192         zatm_dev = ZATM_DEV(dev);
193         size = (64 << (pool <= ZATM_AAL5_POOL_BASE ? 0 :
194             pool-ZATM_AAL5_POOL_BASE))+sizeof(struct rx_buffer_head);
195         if (size < PAGE_SIZE) {
196                 align = 32; /* for 32 byte alignment */
197                 offset = sizeof(struct rx_buffer_head);
198         }
199         else {
200                 align = 4096;
201                 offset = zatm_dev->pool_info[pool].offset+
202                     sizeof(struct rx_buffer_head);
203         }
204         size += align;
205         save_flags(flags);
206         cli();
207         free = zpeekl(zatm_dev,zatm_dev->pool_base+2*pool) &
208             uPD98401_RXFP_REMAIN;
209         restore_flags(flags);
210         if (free >= zatm_dev->pool_info[pool].low_water) return;
211         EVENT("starting ... POOL: 0x%x, 0x%x\n",
212             zpeekl(zatm_dev,zatm_dev->pool_base+2*pool),
213             zpeekl(zatm_dev,zatm_dev->pool_base+2*pool+1));
214         EVENT("dummy: 0x%08lx, 0x%08lx\n",dummy[0],dummy[1]);
215         count = 0;
216         first = NULL;
217         while (free < zatm_dev->pool_info[pool].high_water) {
218                 struct rx_buffer_head *head;
219
220                 skb = alloc_skb(size,GFP_ATOMIC);
221                 if (!skb) {
222                         printk(KERN_WARNING DEV_LABEL "(Itf %d): got no new "
223                             "skb (%d) with %d free\n",dev->number,size,free);
224                         break;
225                 }
226                 skb_reserve(skb,(unsigned char *) ((((unsigned long) skb->data+
227                     align+offset-1) & ~(unsigned long) (align-1))-offset)-
228                     skb->data);
229                 head = (struct rx_buffer_head *) skb->data;
230                 skb_reserve(skb,sizeof(struct rx_buffer_head));
231                 if (!first) first = head;
232                 count++;
233                 head->buffer = virt_to_bus(skb->data);
234                 head->link = 0;
235                 head->skb = skb;
236                 EVENT("enq skb 0x%08lx/0x%08lx\n",(unsigned long) skb,
237                     (unsigned long) head);
238                 cli();
239                 if (zatm_dev->last_free[pool])
240                         ((struct rx_buffer_head *) (zatm_dev->last_free[pool]->
241                             data))[-1].link = virt_to_bus(head);
242                 zatm_dev->last_free[pool] = skb;
243                 skb_queue_tail(&zatm_dev->pool[pool],skb);
244                 restore_flags(flags);
245                 free++;
246         }
247         if (first) {
248                 cli();
249                 zwait;
250                 zout(virt_to_bus(first),CER);
251                 zout(uPD98401_ADD_BAT | (pool << uPD98401_POOL_SHIFT) | count,
252                     CMR);
253                 restore_flags(flags);
254                 EVENT ("POOL: 0x%x, 0x%x\n",
255                     zpeekl(zatm_dev,zatm_dev->pool_base+2*pool),
256                     zpeekl(zatm_dev,zatm_dev->pool_base+2*pool+1));
257                 EVENT("dummy: 0x%08lx, 0x%08lx\n",dummy[0],dummy[1]);
258         }
259 }
260
261
262 static void drain_free(struct atm_dev *dev,int pool)
263 {
264         skb_queue_purge(&ZATM_DEV(dev)->pool[pool]);
265 }
266
267
268 static int pool_index(int max_pdu)
269 {
270         int i;
271
272         if (max_pdu % ATM_CELL_PAYLOAD)
273                 printk(KERN_ERR DEV_LABEL ": driver error in pool_index: "
274                     "max_pdu is %d\n",max_pdu);
275         if (max_pdu > 65536) return -1;
276         for (i = 0; (64 << i) < max_pdu; i++);
277         return i+ZATM_AAL5_POOL_BASE;
278 }
279
280
281 /* use_pool isn't reentrant */
282
283
284 static void use_pool(struct atm_dev *dev,int pool)
285 {
286         struct zatm_dev *zatm_dev;
287         unsigned long flags;
288         int size;
289
290         zatm_dev = ZATM_DEV(dev);
291         if (!(zatm_dev->pool_info[pool].ref_count++)) {
292                 skb_queue_head_init(&zatm_dev->pool[pool]);
293                 size = pool-ZATM_AAL5_POOL_BASE;
294                 if (size < 0) size = 0; /* 64B... */
295                 else if (size > 10) size = 10; /* ... 64kB */
296                 save_flags(flags);
297                 cli();
298                 zpokel(zatm_dev,((zatm_dev->pool_info[pool].low_water/4) <<
299                     uPD98401_RXFP_ALERT_SHIFT) |
300                     (1 << uPD98401_RXFP_BTSZ_SHIFT) |
301                     (size << uPD98401_RXFP_BFSZ_SHIFT),
302                     zatm_dev->pool_base+pool*2);
303                 zpokel(zatm_dev,(unsigned long) dummy,zatm_dev->pool_base+
304                     pool*2+1);
305                 restore_flags(flags);
306                 zatm_dev->last_free[pool] = NULL;
307                 refill_pool(dev,pool);
308         }
309         DPRINTK("pool %d: %d\n",pool,zatm_dev->pool_info[pool].ref_count);
310 }
311
312
313 static void unuse_pool(struct atm_dev *dev,int pool)
314 {
315         if (!(--ZATM_DEV(dev)->pool_info[pool].ref_count))
316                 drain_free(dev,pool);
317 }
318
319
320 static void zatm_feedback(struct atm_vcc *vcc,struct sk_buff *skb,
321     unsigned long start,unsigned long dest,int len)
322 {
323         struct zatm_pool_info *pool;
324         unsigned long offset,flags;
325
326         DPRINTK("start 0x%08lx dest 0x%08lx len %d\n",start,dest,len);
327         if (len < PAGE_SIZE) return;
328         pool = &ZATM_DEV(vcc->dev)->pool_info[ZATM_VCC(vcc)->pool];
329         offset = (dest-start) & (PAGE_SIZE-1);
330         save_flags(flags);
331         cli();
332         if (!offset || pool->offset == offset) {
333                 pool->next_cnt = 0;
334                 restore_flags(flags);
335                 return;
336         }
337         if (offset != pool->next_off) {
338                 pool->next_off = offset;
339                 pool->next_cnt = 0;
340                 restore_flags(flags);
341                 return;
342         }
343         if (++pool->next_cnt >= pool->next_thres) {
344                 pool->offset = pool->next_off;
345                 pool->next_cnt = 0;
346         }
347         restore_flags(flags);
348 }
349
350
351 /*----------------------- high-precision timestamps -------------------------*/
352
353
354 #ifdef CONFIG_ATM_ZATM_EXACT_TS
355
356 static struct timer_list sync_timer;
357
358
359 /*
360  * Note: the exact time is not normalized, i.e. tv_usec can be > 1000000.
361  * This must be handled by higher layers.
362  */
363
364 static inline struct timeval exact_time(struct zatm_dev *zatm_dev,u32 ticks)
365 {
366         struct timeval tmp;
367
368         tmp = zatm_dev->last_time;
369         tmp.tv_usec += ((s64) (ticks-zatm_dev->last_clk)*
370             (s64) zatm_dev->factor) >> TIMER_SHIFT;
371         return tmp;
372 }
373
374
375 static void zatm_clock_sync(unsigned long dummy)
376 {
377         struct atm_dev *atm_dev;
378         struct zatm_dev *zatm_dev;
379
380         for (atm_dev = zatm_boards; atm_dev; atm_dev = zatm_dev->more) {
381                 unsigned long flags,interval;
382                 int diff;
383                 struct timeval now,expected;
384                 u32 ticks;
385
386                 zatm_dev = ZATM_DEV(atm_dev);
387                 save_flags(flags);
388                 cli();
389                 ticks = zpeekl(zatm_dev,uPD98401_TSR);
390                 do_gettimeofday(&now);
391                 restore_flags(flags);
392                 expected = exact_time(zatm_dev,ticks);
393                 diff = 1000000*(expected.tv_sec-now.tv_sec)+
394                     (expected.tv_usec-now.tv_usec);
395                 zatm_dev->timer_history[zatm_dev->th_curr].real = now;
396                 zatm_dev->timer_history[zatm_dev->th_curr].expected = expected;
397                 zatm_dev->th_curr = (zatm_dev->th_curr+1) &
398                     (ZATM_TIMER_HISTORY_SIZE-1);
399                 interval = 1000000*(now.tv_sec-zatm_dev->last_real_time.tv_sec)
400                     +(now.tv_usec-zatm_dev->last_real_time.tv_usec);
401                 if (diff >= -ADJ_REP_THRES && diff <= ADJ_REP_THRES)
402                         zatm_dev->timer_diffs = 0;
403                 else
404 #ifndef AGGRESSIVE_DEBUGGING
405                         if (++zatm_dev->timer_diffs >= ADJ_MSG_THRES)
406 #endif
407                         {
408                         zatm_dev->timer_diffs = 0;
409                         printk(KERN_INFO DEV_LABEL ": TSR update after %ld us:"
410                             " calculation differed by %d us\n",interval,diff);
411 #ifdef AGGRESSIVE_DEBUGGING
412                         printk(KERN_DEBUG "  %d.%08d -> %d.%08d (%lu)\n",
413                             zatm_dev->last_real_time.tv_sec,
414                             zatm_dev->last_real_time.tv_usec,
415                             now.tv_sec,now.tv_usec,interval);
416                         printk(KERN_DEBUG "  %u -> %u (%d)\n",
417                             zatm_dev->last_clk,ticks,ticks-zatm_dev->last_clk);
418                         printk(KERN_DEBUG "  factor %u\n",zatm_dev->factor);
419 #endif
420                 }
421                 if (diff < -ADJ_IGN_THRES || diff > ADJ_IGN_THRES) {
422                     /* filter out any major changes (e.g. time zone setup and
423                        such) */
424                         zatm_dev->last_time = now;
425                         zatm_dev->factor =
426                             (1000 << TIMER_SHIFT)/(zatm_dev->khz+1);
427                 }
428                 else {
429                         zatm_dev->last_time = expected;
430                         /*
431                          * Is the accuracy of udelay really only about 1:300 on
432                          * a 90 MHz Pentium ? Well, the following line avoids
433                          * the problem, but ...
434                          *
435                          * What it does is simply:
436                          *
437                          * zatm_dev->factor = (interval << TIMER_SHIFT)/
438                          *     (ticks-zatm_dev->last_clk);
439                          */
440 #define S(x) #x         /* "stringification" ... */
441 #define SX(x) S(x)
442                         asm("movl %2,%%ebx\n\t"
443                             "subl %3,%%ebx\n\t"
444                             "xorl %%edx,%%edx\n\t"
445                             "shldl $" SX(TIMER_SHIFT) ",%1,%%edx\n\t"
446                             "shl $" SX(TIMER_SHIFT) ",%1\n\t"
447                             "divl %%ebx\n\t"
448                             : "=a" (zatm_dev->factor)
449                             : "0" (interval-diff),"g" (ticks),
450                               "g" (zatm_dev->last_clk)
451                             : "ebx","edx","cc");
452 #undef S
453 #undef SX
454 #ifdef AGGRESSIVE_DEBUGGING
455                         printk(KERN_DEBUG "  (%ld << %d)/(%u-%u) = %u\n",
456                             interval,TIMER_SHIFT,ticks,zatm_dev->last_clk,
457                             zatm_dev->factor);
458 #endif
459                 }
460                 zatm_dev->last_real_time = now;
461                 zatm_dev->last_clk = ticks;
462         }
463         mod_timer(&sync_timer,sync_timer.expires+POLL_INTERVAL*HZ);
464 }
465
466
467 static void __init zatm_clock_init(struct zatm_dev *zatm_dev)
468 {
469         static int start_timer = 1;
470         unsigned long flags;
471
472         zatm_dev->factor = (1000 << TIMER_SHIFT)/(zatm_dev->khz+1);
473         zatm_dev->timer_diffs = 0;
474         memset(zatm_dev->timer_history,0,sizeof(zatm_dev->timer_history));
475         zatm_dev->th_curr = 0;
476         save_flags(flags);
477         cli();
478         do_gettimeofday(&zatm_dev->last_time);
479         zatm_dev->last_clk = zpeekl(zatm_dev,uPD98401_TSR);
480         if (start_timer) {
481                 start_timer = 0;
482                 init_timer(&sync_timer);
483                 sync_timer.expires = jiffies+POLL_INTERVAL*HZ;
484                 sync_timer.function = zatm_clock_sync;
485                 add_timer(&sync_timer);
486         }
487         restore_flags(flags);
488 }
489
490
491 #endif
492
493
494 /*----------------------------------- RX ------------------------------------*/
495
496
497 #if 0
498 static void exception(struct atm_vcc *vcc)
499 {
500    static int count = 0;
501    struct zatm_dev *zatm_dev = ZATM_DEV(vcc->dev);
502    struct zatm_vcc *zatm_vcc = ZATM_VCC(vcc);
503    unsigned long *qrp;
504    int i;
505
506    if (count++ > 2) return;
507    for (i = 0; i < 8; i++)
508         printk("TX%d: 0x%08lx\n",i,
509           zpeekl(zatm_dev,zatm_vcc->tx_chan*VC_SIZE/4+i));
510    for (i = 0; i < 5; i++)
511         printk("SH%d: 0x%08lx\n",i,
512           zpeekl(zatm_dev,uPD98401_IM(zatm_vcc->shaper)+16*i));
513    qrp = (unsigned long *) zpeekl(zatm_dev,zatm_vcc->tx_chan*VC_SIZE/4+
514      uPD98401_TXVC_QRP);
515    printk("qrp=0x%08lx\n",(unsigned long) qrp);
516    for (i = 0; i < 4; i++) printk("QRP[%d]: 0x%08lx",i,qrp[i]);
517 }
518 #endif
519
520
521 static const char *err_txt[] = {
522         "No error",
523         "RX buf underflow",
524         "RX FIFO overrun",
525         "Maximum len violation",
526         "CRC error",
527         "User abort",
528         "Length violation",
529         "T1 error",
530         "Deactivated",
531         "???",
532         "???",
533         "???",
534         "???",
535         "???",
536         "???",
537         "???"
538 };
539
540
541 static void poll_rx(struct atm_dev *dev,int mbx)
542 {
543         struct zatm_dev *zatm_dev;
544         unsigned long pos;
545         u32 x;
546         int error;
547
548         EVENT("poll_rx\n",0,0);
549         zatm_dev = ZATM_DEV(dev);
550         pos = (zatm_dev->mbx_start[mbx] & ~0xffffUL) | zin(MTA(mbx));
551         while (x = zin(MWA(mbx)), (pos & 0xffff) != x) {
552                 u32 *here;
553                 struct sk_buff *skb;
554                 struct atm_vcc *vcc;
555                 int cells,size,chan;
556
557                 EVENT("MBX: host 0x%lx, nic 0x%x\n",pos,x);
558                 here = (u32 *) pos;
559                 if (((pos += 16) & 0xffff) == zatm_dev->mbx_end[mbx])
560                         pos = zatm_dev->mbx_start[mbx];
561                 cells = here[0] & uPD98401_AAL5_SIZE;
562 #if 0
563 printk("RX IND: 0x%x, 0x%x, 0x%x, 0x%x\n",here[0],here[1],here[2],here[3]);
564 {
565 unsigned long *x;
566                 printk("POOL: 0x%08x, 0x%08x\n",zpeekl(zatm_dev,
567                       zatm_dev->pool_base),
568                       zpeekl(zatm_dev,zatm_dev->pool_base+1));
569                 x = (unsigned long *) here[2];
570                 printk("[0..3] = 0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx\n",
571                     x[0],x[1],x[2],x[3]);
572 }
573 #endif
574                 error = 0;
575                 if (here[3] & uPD98401_AAL5_ERR) {
576                         error = (here[3] & uPD98401_AAL5_ES) >>
577                             uPD98401_AAL5_ES_SHIFT;
578                         if (error == uPD98401_AAL5_ES_DEACT ||
579                             error == uPD98401_AAL5_ES_FREE) continue;
580                 }
581 EVENT("error code 0x%x/0x%x\n",(here[3] & uPD98401_AAL5_ES) >>
582   uPD98401_AAL5_ES_SHIFT,error);
583                 skb = ((struct rx_buffer_head *) bus_to_virt(here[2]))->skb;
584 #ifdef CONFIG_ATM_ZATM_EXACT_TS
585                 skb->stamp = exact_time(zatm_dev,here[1]);
586 #else
587                 skb->stamp = xtime;
588 #endif
589 #if 0
590 printk("[-3..0] 0x%08lx 0x%08lx 0x%08lx 0x%08lx\n",((unsigned *) skb->data)[-3],
591   ((unsigned *) skb->data)[-2],((unsigned *) skb->data)[-1],
592   ((unsigned *) skb->data)[0]);
593 #endif
594                 EVENT("skb 0x%lx, here 0x%lx\n",(unsigned long) skb,
595                     (unsigned long) here);
596 #if 0
597 printk("dummy: 0x%08lx, 0x%08lx\n",dummy[0],dummy[1]);
598 #endif
599                 size = error ? 0 : ntohs(((u16 *) skb->data)[cells*
600                     ATM_CELL_PAYLOAD/sizeof(u16)-3]);
601                 EVENT("got skb 0x%lx, size %d\n",(unsigned long) skb,size);
602                 chan = (here[3] & uPD98401_AAL5_CHAN) >>
603                     uPD98401_AAL5_CHAN_SHIFT;
604                 if (chan < zatm_dev->chans && zatm_dev->rx_map[chan]) {
605                         vcc = zatm_dev->rx_map[chan];
606                         if (skb == zatm_dev->last_free[ZATM_VCC(vcc)->pool])
607                                 zatm_dev->last_free[ZATM_VCC(vcc)->pool] = NULL;
608                         skb_unlink(skb);
609                 }
610                 else {
611                         printk(KERN_ERR DEV_LABEL "(itf %d): RX indication "
612                             "for non-existing channel\n",dev->number);
613                         size = 0;
614                         vcc = NULL;
615                         event_dump();
616                 }
617                 if (error) {
618                         static unsigned long silence = 0;
619                         static int last_error = 0;
620
621                         if (error != last_error ||
622                             time_after(jiffies, silence)  || silence == 0){
623                                 printk(KERN_WARNING DEV_LABEL "(itf %d): "
624                                     "chan %d error %s\n",dev->number,chan,
625                                     err_txt[error]);
626                                 last_error = error;
627                                 silence = (jiffies+2*HZ)|1;
628                         }
629                         size = 0;
630                 }
631                 if (size && (size > cells*ATM_CELL_PAYLOAD-ATM_AAL5_TRAILER ||
632                     size <= (cells-1)*ATM_CELL_PAYLOAD-ATM_AAL5_TRAILER)) {
633                         printk(KERN_ERR DEV_LABEL "(itf %d): size %d with %d "
634                             "cells\n",dev->number,size,cells);
635                         size = 0;
636                         event_dump();
637                 }
638                 if (size > ATM_MAX_AAL5_PDU) {
639                         printk(KERN_ERR DEV_LABEL "(itf %d): size too big "
640                             "(%d)\n",dev->number,size);
641                         size = 0;
642                         event_dump();
643                 }
644                 if (!size) {
645                         dev_kfree_skb_irq(skb);
646                         if (vcc) atomic_inc(&vcc->stats->rx_err);
647                         continue;
648                 }
649                 if (!atm_charge(vcc,skb->truesize)) {
650                         dev_kfree_skb_irq(skb);
651                         continue;
652                 }
653                 skb->len = size;
654                 ATM_SKB(skb)->vcc = vcc;
655                 vcc->push(vcc,skb);
656                 atomic_inc(&vcc->stats->rx);
657         }
658         zout(pos & 0xffff,MTA(mbx));
659 #if 0 /* probably a stupid idea */
660         refill_pool(dev,zatm_vcc->pool);
661                 /* maybe this saves us a few interrupts */
662 #endif
663 }
664
665
666 static int open_rx_first(struct atm_vcc *vcc)
667 {
668         struct zatm_dev *zatm_dev;
669         struct zatm_vcc *zatm_vcc;
670         unsigned long flags;
671         unsigned short chan;
672         int cells;
673
674         DPRINTK("open_rx_first (0x%x)\n",inb_p(0xc053));
675         zatm_dev = ZATM_DEV(vcc->dev);
676         zatm_vcc = ZATM_VCC(vcc);
677         zatm_vcc->rx_chan = 0;
678         if (vcc->qos.rxtp.traffic_class == ATM_NONE) return 0;
679         if (vcc->qos.aal == ATM_AAL5) {
680                 if (vcc->qos.rxtp.max_sdu > 65464)
681                         vcc->qos.rxtp.max_sdu = 65464;
682                         /* fix this - we may want to receive 64kB SDUs
683                            later */
684                 cells = (vcc->qos.rxtp.max_sdu+ATM_AAL5_TRAILER+
685                     ATM_CELL_PAYLOAD-1)/ATM_CELL_PAYLOAD;
686                 zatm_vcc->pool = pool_index(cells*ATM_CELL_PAYLOAD);
687         }
688         else {
689                 cells = 1;
690                 zatm_vcc->pool = ZATM_AAL0_POOL;
691         }
692         if (zatm_vcc->pool < 0) return -EMSGSIZE;
693         save_flags(flags);
694         cli();
695         zwait;
696         zout(uPD98401_OPEN_CHAN,CMR);
697         zwait;
698         DPRINTK("0x%x 0x%x\n",zin(CMR),zin(CER));
699         chan = (zin(CMR) & uPD98401_CHAN_ADDR) >> uPD98401_CHAN_ADDR_SHIFT;
700         restore_flags(flags);
701         DPRINTK("chan is %d\n",chan);
702         if (!chan) return -EAGAIN;
703         use_pool(vcc->dev,zatm_vcc->pool);
704         DPRINTK("pool %d\n",zatm_vcc->pool);
705         /* set up VC descriptor */
706         cli();
707         zpokel(zatm_dev,zatm_vcc->pool << uPD98401_RXVC_POOL_SHIFT,
708             chan*VC_SIZE/4);
709         zpokel(zatm_dev,uPD98401_RXVC_OD | (vcc->qos.aal == ATM_AAL5 ?
710             uPD98401_RXVC_AR : 0) | cells,chan*VC_SIZE/4+1);
711         zpokel(zatm_dev,0,chan*VC_SIZE/4+2);
712         zatm_vcc->rx_chan = chan;
713         zatm_dev->rx_map[chan] = vcc;
714         restore_flags(flags);
715         return 0;
716 }
717
718
719 static int open_rx_second(struct atm_vcc *vcc)
720 {
721         struct zatm_dev *zatm_dev;
722         struct zatm_vcc *zatm_vcc;
723         unsigned long flags;
724         int pos,shift;
725
726         DPRINTK("open_rx_second (0x%x)\n",inb_p(0xc053));
727         zatm_dev = ZATM_DEV(vcc->dev);
728         zatm_vcc = ZATM_VCC(vcc);
729         if (!zatm_vcc->rx_chan) return 0;
730         save_flags(flags);
731         cli();
732         /* should also handle VPI @@@ */
733         pos = vcc->vci >> 1;
734         shift = (1-(vcc->vci & 1)) << 4;
735         zpokel(zatm_dev,(zpeekl(zatm_dev,pos) & ~(0xffff << shift)) |
736             ((zatm_vcc->rx_chan | uPD98401_RXLT_ENBL) << shift),pos);
737         restore_flags(flags);
738         return 0;
739 }
740
741
742 static void close_rx(struct atm_vcc *vcc)
743 {
744         struct zatm_dev *zatm_dev;
745         struct zatm_vcc *zatm_vcc;
746         unsigned long flags;
747         int pos,shift;
748
749         zatm_vcc = ZATM_VCC(vcc);
750         zatm_dev = ZATM_DEV(vcc->dev);
751         if (!zatm_vcc->rx_chan) return;
752         DPRINTK("close_rx\n");
753         /* disable receiver */
754         save_flags(flags);
755         if (vcc->vpi != ATM_VPI_UNSPEC && vcc->vci != ATM_VCI_UNSPEC) {
756                 cli();
757                 pos = vcc->vci >> 1;
758                 shift = (1-(vcc->vci & 1)) << 4;
759                 zpokel(zatm_dev,zpeekl(zatm_dev,pos) & ~(0xffff << shift),pos);
760                 zwait;
761                 zout(uPD98401_NOP,CMR);
762                 zwait;
763                 zout(uPD98401_NOP,CMR);
764                 restore_flags(flags);
765         }
766         cli();
767         zwait;
768         zout(uPD98401_DEACT_CHAN | uPD98401_CHAN_RT | (zatm_vcc->rx_chan <<
769             uPD98401_CHAN_ADDR_SHIFT),CMR);
770         zwait;
771         udelay(10); /* why oh why ... ? */
772         zout(uPD98401_CLOSE_CHAN | uPD98401_CHAN_RT | (zatm_vcc->rx_chan <<
773             uPD98401_CHAN_ADDR_SHIFT),CMR);
774         zwait;
775         if (!(zin(CMR) & uPD98401_CHAN_ADDR))
776                 printk(KERN_CRIT DEV_LABEL "(itf %d): can't close RX channel "
777                     "%d\n",vcc->dev->number,zatm_vcc->rx_chan);
778         restore_flags(flags);
779         zatm_dev->rx_map[zatm_vcc->rx_chan] = NULL;
780         zatm_vcc->rx_chan = 0;
781         unuse_pool(vcc->dev,zatm_vcc->pool);
782 }
783
784
785 static int start_rx(struct atm_dev *dev)
786 {
787         struct zatm_dev *zatm_dev;
788         int size,i;
789
790 DPRINTK("start_rx\n");
791         zatm_dev = ZATM_DEV(dev);
792         size = sizeof(struct atm_vcc *)*zatm_dev->chans;
793         zatm_dev->rx_map = (struct atm_vcc **) kmalloc(size,GFP_KERNEL);
794         if (!zatm_dev->rx_map) return -ENOMEM;
795         memset(zatm_dev->rx_map,0,size);
796         /* set VPI/VCI split (use all VCIs and give what's left to VPIs) */
797         zpokel(zatm_dev,(1 << dev->ci_range.vci_bits)-1,uPD98401_VRR);
798         /* prepare free buffer pools */
799         for (i = 0; i <= ZATM_LAST_POOL; i++) {
800                 zatm_dev->pool_info[i].ref_count = 0;
801                 zatm_dev->pool_info[i].rqa_count = 0;
802                 zatm_dev->pool_info[i].rqu_count = 0;
803                 zatm_dev->pool_info[i].low_water = LOW_MARK;
804                 zatm_dev->pool_info[i].high_water = HIGH_MARK;
805                 zatm_dev->pool_info[i].offset = 0;
806                 zatm_dev->pool_info[i].next_off = 0;
807                 zatm_dev->pool_info[i].next_cnt = 0;
808                 zatm_dev->pool_info[i].next_thres = OFF_CNG_THRES;
809         }
810         return 0;
811 }
812
813
814 /*----------------------------------- TX ------------------------------------*/
815
816
817 static int do_tx(struct sk_buff *skb)
818 {
819         struct atm_vcc *vcc;
820         struct zatm_dev *zatm_dev;
821         struct zatm_vcc *zatm_vcc;
822         u32 *dsc;
823         unsigned long flags;
824
825         EVENT("do_tx\n",0,0);
826         DPRINTK("sending skb %p\n",skb);
827         vcc = ATM_SKB(skb)->vcc;
828         zatm_dev = ZATM_DEV(vcc->dev);
829         zatm_vcc = ZATM_VCC(vcc);
830         EVENT("iovcnt=%d\n",ATM_SKB(skb)->iovcnt,0);
831         save_flags(flags);
832         cli();
833         if (!ATM_SKB(skb)->iovcnt) {
834                 if (zatm_vcc->txing == RING_ENTRIES-1) {
835                         restore_flags(flags);
836                         return RING_BUSY;
837                 }
838                 zatm_vcc->txing++;
839                 dsc = zatm_vcc->ring+zatm_vcc->ring_curr;
840                 zatm_vcc->ring_curr = (zatm_vcc->ring_curr+RING_WORDS) &
841                     (RING_ENTRIES*RING_WORDS-1);
842                 dsc[1] = 0;
843                 dsc[2] = skb->len;
844                 dsc[3] = virt_to_bus(skb->data);
845                 mb();
846                 dsc[0] = uPD98401_TXPD_V | uPD98401_TXPD_DP | uPD98401_TXPD_SM
847                     | (vcc->qos.aal == ATM_AAL5 ? uPD98401_TXPD_AAL5 : 0 |
848                     (ATM_SKB(skb)->atm_options & ATM_ATMOPT_CLP ?
849                     uPD98401_CLPM_1 : uPD98401_CLPM_0));
850                 EVENT("dsc (0x%lx)\n",(unsigned long) dsc,0);
851         }
852         else {
853 printk("NONONONOO!!!!\n");
854                 dsc = NULL;
855 #if 0
856                 u32 *put;
857                 int i;
858
859                 dsc = (u32 *) kmalloc(uPD98401_TXPD_SIZE*2+
860                     uPD98401_TXBD_SIZE*ATM_SKB(skb)->iovcnt,GFP_ATOMIC);
861                 if (!dsc) {
862                         if (vcc->pop) vcc->pop(vcc,skb);
863                         else dev_kfree_skb_irq(skb);
864                         return -EAGAIN;
865                 }
866                 /* @@@ should check alignment */
867                 put = dsc+8;
868                 dsc[0] = uPD98401_TXPD_V | uPD98401_TXPD_DP |
869                     (vcc->aal == ATM_AAL5 ? uPD98401_TXPD_AAL5 : 0 |
870                     (ATM_SKB(skb)->atm_options & ATM_ATMOPT_CLP ?
871                     uPD98401_CLPM_1 : uPD98401_CLPM_0));
872                 dsc[1] = 0;
873                 dsc[2] = ATM_SKB(skb)->iovcnt*uPD98401_TXBD_SIZE;
874                 dsc[3] = virt_to_bus(put);
875                 for (i = 0; i < ATM_SKB(skb)->iovcnt; i++) {
876                         *put++ = ((struct iovec *) skb->data)[i].iov_len;
877                         *put++ = virt_to_bus(((struct iovec *)
878                             skb->data)[i].iov_base);
879                 }
880                 put[-2] |= uPD98401_TXBD_LAST;
881 #endif
882         }
883         ZATM_PRV_DSC(skb) = dsc;
884         skb_queue_tail(&zatm_vcc->tx_queue,skb);
885         DPRINTK("QRP=0x%08lx\n",zpeekl(zatm_dev,zatm_vcc->tx_chan*VC_SIZE/4+
886           uPD98401_TXVC_QRP));
887         zwait;
888         zout(uPD98401_TX_READY | (zatm_vcc->tx_chan <<
889             uPD98401_CHAN_ADDR_SHIFT),CMR);
890         restore_flags(flags);
891         EVENT("done\n",0,0);
892         return 0;
893 }
894
895
896 static inline void dequeue_tx(struct atm_vcc *vcc)
897 {
898         struct zatm_vcc *zatm_vcc;
899         struct sk_buff *skb;
900
901         EVENT("dequeue_tx\n",0,0);
902         zatm_vcc = ZATM_VCC(vcc);
903         skb = skb_dequeue(&zatm_vcc->tx_queue);
904         if (!skb) {
905                 printk(KERN_CRIT DEV_LABEL "(itf %d): dequeue_tx but not "
906                     "txing\n",vcc->dev->number);
907                 return;
908         }
909 #if 0 /* @@@ would fail on CLP */
910 if (*ZATM_PRV_DSC(skb) != (uPD98401_TXPD_V | uPD98401_TXPD_DP |
911   uPD98401_TXPD_SM | uPD98401_TXPD_AAL5)) printk("@#*$!!!!  (%08x)\n",
912   *ZATM_PRV_DSC(skb));
913 #endif
914         *ZATM_PRV_DSC(skb) = 0; /* mark as invalid */
915         zatm_vcc->txing--;
916         if (vcc->pop) vcc->pop(vcc,skb);
917         else dev_kfree_skb_irq(skb);
918         while ((skb = skb_dequeue(&zatm_vcc->backlog)))
919                 if (do_tx(skb) == RING_BUSY) {
920                         skb_queue_head(&zatm_vcc->backlog,skb);
921                         break;
922                 }
923         atomic_inc(&vcc->stats->tx);
924         wake_up(&zatm_vcc->tx_wait);
925 }
926
927
928 static void poll_tx(struct atm_dev *dev,int mbx)
929 {
930         struct zatm_dev *zatm_dev;
931         unsigned long pos;
932         u32 x;
933
934         EVENT("poll_tx\n",0,0);
935         zatm_dev = ZATM_DEV(dev);
936         pos = (zatm_dev->mbx_start[mbx] & ~0xffffUL) | zin(MTA(mbx));
937         while (x = zin(MWA(mbx)), (pos & 0xffff) != x) {
938                 int chan;
939
940 #if 1
941                 u32 data,*addr;
942
943                 EVENT("MBX: host 0x%lx, nic 0x%x\n",pos,x);
944                 addr = (u32 *) pos;
945                 data = *addr;
946                 chan = (data & uPD98401_TXI_CONN) >> uPD98401_TXI_CONN_SHIFT;
947                 EVENT("addr = 0x%lx, data = 0x%08x,",(unsigned long) addr,
948                     data);
949                 EVENT("chan = %d\n",chan,0);
950 #else
951 NO !
952                 chan = (zatm_dev->mbx_start[mbx][pos >> 2] & uPD98401_TXI_CONN)
953                 >> uPD98401_TXI_CONN_SHIFT;
954 #endif
955                 if (chan < zatm_dev->chans && zatm_dev->tx_map[chan])
956                         dequeue_tx(zatm_dev->tx_map[chan]);
957                 else {
958                         printk(KERN_CRIT DEV_LABEL "(itf %d): TX indication "
959                             "for non-existing channel %d\n",dev->number,chan);
960                         event_dump();
961                 }
962                 if (((pos += 4) & 0xffff) == zatm_dev->mbx_end[mbx])
963                         pos = zatm_dev->mbx_start[mbx];
964         }
965         zout(pos & 0xffff,MTA(mbx));
966 }
967
968
969 /*
970  * BUG BUG BUG: Doesn't handle "new-style" rate specification yet.
971  */
972
973 static int alloc_shaper(struct atm_dev *dev,int *pcr,int min,int max,int ubr)
974 {
975         struct zatm_dev *zatm_dev;
976         unsigned long flags;
977         unsigned long i,m,c;
978         int shaper;
979
980         DPRINTK("alloc_shaper (min = %d, max = %d)\n",min,max);
981         zatm_dev = ZATM_DEV(dev);
982         if (!zatm_dev->free_shapers) return -EAGAIN;
983         for (shaper = 0; !((zatm_dev->free_shapers >> shaper) & 1); shaper++);
984         zatm_dev->free_shapers &= ~1 << shaper;
985         if (ubr) {
986                 c = 5;
987                 i = m = 1;
988                 zatm_dev->ubr_ref_cnt++;
989                 zatm_dev->ubr = shaper;
990         }
991         else {
992                 if (min) {
993                         if (min <= 255) {
994                                 i = min;
995                                 m = ATM_OC3_PCR;
996                         }
997                         else {
998                                 i = 255;
999                                 m = ATM_OC3_PCR*255/min;
1000                         }
1001                 }
1002                 else {
1003                         if (max > zatm_dev->tx_bw) max = zatm_dev->tx_bw;
1004                         if (max <= 255) {
1005                                 i = max;
1006                                 m = ATM_OC3_PCR;
1007                         }
1008                         else {
1009                                 i = 255;
1010                                 m = (ATM_OC3_PCR*255+max-1)/max;
1011                         }
1012                 }
1013                 if (i > m) {
1014                         printk(KERN_CRIT DEV_LABEL "shaper algorithm botched "
1015                             "[%d,%d] -> i=%ld,m=%ld\n",min,max,i,m);
1016                         m = i;
1017                 }
1018                 *pcr = i*ATM_OC3_PCR/m;
1019                 c = 20; /* @@@ should use max_cdv ! */
1020                 if ((min && *pcr < min) || (max && *pcr > max)) return -EINVAL;
1021                 if (zatm_dev->tx_bw < *pcr) return -EAGAIN;
1022                 zatm_dev->tx_bw -= *pcr;
1023         }
1024         save_flags(flags);
1025         cli();
1026         DPRINTK("i = %d, m = %d, PCR = %d\n",i,m,*pcr);
1027         zpokel(zatm_dev,(i << uPD98401_IM_I_SHIFT) | m,uPD98401_IM(shaper));
1028         zpokel(zatm_dev,c << uPD98401_PC_C_SHIFT,uPD98401_PC(shaper));
1029         zpokel(zatm_dev,0,uPD98401_X(shaper));
1030         zpokel(zatm_dev,0,uPD98401_Y(shaper));
1031         zpokel(zatm_dev,uPD98401_PS_E,uPD98401_PS(shaper));
1032         restore_flags(flags);
1033         return shaper;
1034 }
1035
1036
1037 static void dealloc_shaper(struct atm_dev *dev,int shaper)
1038 {
1039         struct zatm_dev *zatm_dev;
1040         unsigned long flags;
1041
1042         zatm_dev = ZATM_DEV(dev);
1043         if (shaper == zatm_dev->ubr) {
1044                 if (--zatm_dev->ubr_ref_cnt) return;
1045                 zatm_dev->ubr = -1;
1046         }
1047         save_flags(flags);
1048         cli();
1049         zpokel(zatm_dev,zpeekl(zatm_dev,uPD98401_PS(shaper)) & ~uPD98401_PS_E,
1050             uPD98401_PS(shaper));
1051         restore_flags(flags);
1052         zatm_dev->free_shapers |= 1 << shaper;
1053 }
1054
1055
1056 static void close_tx(struct atm_vcc *vcc)
1057 {
1058         struct zatm_dev *zatm_dev;
1059         struct zatm_vcc *zatm_vcc;
1060         unsigned long flags;
1061         int chan;
1062 struct sk_buff *skb;
1063 int once = 1;
1064
1065         zatm_vcc = ZATM_VCC(vcc);
1066         zatm_dev = ZATM_DEV(vcc->dev);
1067         chan = zatm_vcc->tx_chan;
1068         if (!chan) return;
1069         DPRINTK("close_tx\n");
1070         save_flags(flags);
1071         cli();
1072         while (skb_peek(&zatm_vcc->backlog)) {
1073 if (once) {
1074 printk("waiting for backlog to drain ...\n");
1075 event_dump();
1076 once = 0;
1077 }
1078                 sleep_on(&zatm_vcc->tx_wait);
1079         }
1080 once = 1;
1081         while ((skb = skb_peek(&zatm_vcc->tx_queue))) {
1082 if (once) {
1083 printk("waiting for TX queue to drain ... %p\n",skb);
1084 event_dump();
1085 once = 0;
1086 }
1087                 DPRINTK("waiting for TX queue to drain ... %p\n",skb);
1088                 sleep_on(&zatm_vcc->tx_wait);
1089         }
1090 #if 0
1091         zwait;
1092         zout(uPD98401_DEACT_CHAN | (chan << uPD98401_CHAN_ADDR_SHIFT),CMR);
1093 #endif
1094         zwait;
1095         zout(uPD98401_CLOSE_CHAN | (chan << uPD98401_CHAN_ADDR_SHIFT),CMR);
1096         zwait;
1097         if (!(zin(CMR) & uPD98401_CHAN_ADDR))
1098                 printk(KERN_CRIT DEV_LABEL "(itf %d): can't close TX channel "
1099                     "%d\n",vcc->dev->number,chan);
1100         restore_flags(flags);
1101         zatm_vcc->tx_chan = 0;
1102         zatm_dev->tx_map[chan] = NULL;
1103         if (zatm_vcc->shaper != zatm_dev->ubr) {
1104                 zatm_dev->tx_bw += vcc->qos.txtp.min_pcr;
1105                 dealloc_shaper(vcc->dev,zatm_vcc->shaper);
1106         }
1107         if (zatm_vcc->ring) kfree(zatm_vcc->ring);
1108 }
1109
1110
1111 static int open_tx_first(struct atm_vcc *vcc)
1112 {
1113         struct zatm_dev *zatm_dev;
1114         struct zatm_vcc *zatm_vcc;
1115         unsigned long flags;
1116         u32 *loop;
1117         unsigned short chan;
1118         int pcr,unlimited;
1119
1120         DPRINTK("open_tx_first\n");
1121         zatm_dev = ZATM_DEV(vcc->dev);
1122         zatm_vcc = ZATM_VCC(vcc);
1123         zatm_vcc->tx_chan = 0;
1124         if (vcc->qos.txtp.traffic_class == ATM_NONE) return 0;
1125         save_flags(flags);
1126         cli();
1127         zwait;
1128         zout(uPD98401_OPEN_CHAN,CMR);
1129         zwait;
1130         DPRINTK("0x%x 0x%x\n",zin(CMR),zin(CER));
1131         chan = (zin(CMR) & uPD98401_CHAN_ADDR) >> uPD98401_CHAN_ADDR_SHIFT;
1132         restore_flags(flags);
1133         DPRINTK("chan is %d\n",chan);
1134         if (!chan) return -EAGAIN;
1135         unlimited = vcc->qos.txtp.traffic_class == ATM_UBR &&
1136             (!vcc->qos.txtp.max_pcr || vcc->qos.txtp.max_pcr == ATM_MAX_PCR ||
1137             vcc->qos.txtp.max_pcr >= ATM_OC3_PCR);
1138         if (unlimited && zatm_dev->ubr != -1) zatm_vcc->shaper = zatm_dev->ubr;
1139         else {
1140                 if (unlimited) vcc->qos.txtp.max_sdu = ATM_MAX_AAL5_PDU;
1141                 if ((zatm_vcc->shaper = alloc_shaper(vcc->dev,&pcr,
1142                     vcc->qos.txtp.min_pcr,vcc->qos.txtp.max_pcr,unlimited))
1143                     < 0) {
1144                         close_tx(vcc);
1145                         return zatm_vcc->shaper;
1146                 }
1147                 if (pcr > ATM_OC3_PCR) pcr = ATM_OC3_PCR;
1148                 vcc->qos.txtp.min_pcr = vcc->qos.txtp.max_pcr = pcr;
1149         }
1150         zatm_vcc->tx_chan = chan;
1151         skb_queue_head_init(&zatm_vcc->tx_queue);
1152         init_waitqueue_head(&zatm_vcc->tx_wait);
1153         /* initialize ring */
1154         zatm_vcc->ring = kmalloc(RING_SIZE,GFP_KERNEL);
1155         if (!zatm_vcc->ring) return -ENOMEM;
1156         memset(zatm_vcc->ring,0,RING_SIZE);
1157         loop = zatm_vcc->ring+RING_ENTRIES*RING_WORDS;
1158         loop[0] = uPD98401_TXPD_V;
1159         loop[1] = loop[2] = 0;
1160         loop[3] = virt_to_bus(zatm_vcc->ring);
1161         zatm_vcc->ring_curr = 0;
1162         zatm_vcc->txing = 0;
1163         skb_queue_head_init(&zatm_vcc->backlog);
1164         zpokel(zatm_dev,virt_to_bus(zatm_vcc->ring),
1165             chan*VC_SIZE/4+uPD98401_TXVC_QRP);
1166         return 0;
1167 }
1168
1169
1170 static int open_tx_second(struct atm_vcc *vcc)
1171 {
1172         struct zatm_dev *zatm_dev;
1173         struct zatm_vcc *zatm_vcc;
1174         unsigned long flags;
1175
1176         DPRINTK("open_tx_second\n");
1177         zatm_dev = ZATM_DEV(vcc->dev);
1178         zatm_vcc = ZATM_VCC(vcc);
1179         if (!zatm_vcc->tx_chan) return 0;
1180         save_flags(flags);
1181         /* set up VC descriptor */
1182         cli();
1183         zpokel(zatm_dev,0,zatm_vcc->tx_chan*VC_SIZE/4);
1184         zpokel(zatm_dev,uPD98401_TXVC_L | (zatm_vcc->shaper <<
1185             uPD98401_TXVC_SHP_SHIFT) | (vcc->vpi << uPD98401_TXVC_VPI_SHIFT) |
1186             vcc->vci,zatm_vcc->tx_chan*VC_SIZE/4+1);
1187         zpokel(zatm_dev,0,zatm_vcc->tx_chan*VC_SIZE/4+2);
1188         restore_flags(flags);
1189         zatm_dev->tx_map[zatm_vcc->tx_chan] = vcc;
1190         return 0;
1191 }
1192
1193
1194 static int start_tx(struct atm_dev *dev)
1195 {
1196         struct zatm_dev *zatm_dev;
1197         int i;
1198
1199         DPRINTK("start_tx\n");
1200         zatm_dev = ZATM_DEV(dev);
1201         zatm_dev->tx_map = (struct atm_vcc **) kmalloc(sizeof(struct atm_vcc *)*
1202             zatm_dev->chans,GFP_KERNEL);
1203         if (!zatm_dev->tx_map) return -ENOMEM;
1204         zatm_dev->tx_bw = ATM_OC3_PCR;
1205         zatm_dev->free_shapers = (1 << NR_SHAPERS)-1;
1206         zatm_dev->ubr = -1;
1207         zatm_dev->ubr_ref_cnt = 0;
1208         /* initialize shapers */
1209         for (i = 0; i < NR_SHAPERS; i++) zpokel(zatm_dev,0,uPD98401_PS(i));
1210         return 0;
1211 }
1212
1213
1214 /*------------------------------- interrupts --------------------------------*/
1215
1216
1217 static void zatm_int(int irq,void *dev_id,struct pt_regs *regs)
1218 {
1219         struct atm_dev *dev;
1220         struct zatm_dev *zatm_dev;
1221         u32 reason;
1222
1223         dev = dev_id;
1224         zatm_dev = ZATM_DEV(dev);
1225         while ((reason = zin(GSR))) {
1226                 EVENT("reason 0x%x\n",reason,0);
1227                 if (reason & uPD98401_INT_PI) {
1228                         EVENT("PHY int\n",0,0);
1229                         dev->phy->interrupt(dev);
1230                 }
1231                 if (reason & uPD98401_INT_RQA) {
1232                         unsigned long pools;
1233                         int i;
1234
1235                         pools = zin(RQA);
1236                         EVENT("RQA (0x%08x)\n",pools,0);
1237                         for (i = 0; pools; i++) {
1238                                 if (pools & 1) {
1239                                         refill_pool(dev,i);
1240                                         zatm_dev->pool_info[i].rqa_count++;
1241                                 }
1242                                 pools >>= 1;
1243                         }
1244                 }
1245                 if (reason & uPD98401_INT_RQU) {
1246                         unsigned long pools;
1247                         int i;
1248                         pools = zin(RQU);
1249                         printk(KERN_WARNING DEV_LABEL "(itf %d): RQU 0x%08lx\n",
1250                             dev->number,pools);
1251                         event_dump();
1252                         for (i = 0; pools; i++) {
1253                                 if (pools & 1) {
1254                                         refill_pool(dev,i);
1255                                         zatm_dev->pool_info[i].rqu_count++;
1256                                 }
1257                                 pools >>= 1;
1258                         }
1259                 }
1260                 /* don't handle RD */
1261                 if (reason & uPD98401_INT_SPE)
1262                         printk(KERN_ALERT DEV_LABEL "(itf %d): system parity "
1263                             "error at 0x%08x\n",dev->number,zin(ADDR));
1264                 if (reason & uPD98401_INT_CPE)
1265                         printk(KERN_ALERT DEV_LABEL "(itf %d): control memory "
1266                             "parity error at 0x%08x\n",dev->number,zin(ADDR));
1267                 if (reason & uPD98401_INT_SBE) {
1268                         printk(KERN_ALERT DEV_LABEL "(itf %d): system bus "
1269                             "error at 0x%08x\n",dev->number,zin(ADDR));
1270                         event_dump();
1271                 }
1272                 /* don't handle IND */
1273                 if (reason & uPD98401_INT_MF) {
1274                         printk(KERN_CRIT DEV_LABEL "(itf %d): mailbox full "
1275                             "(0x%x)\n",dev->number,(reason & uPD98401_INT_MF)
1276                             >> uPD98401_INT_MF_SHIFT);
1277                         event_dump();
1278                             /* @@@ should try to recover */
1279                 }
1280                 if (reason & uPD98401_INT_MM) {
1281                         if (reason & 1) poll_rx(dev,0);
1282                         if (reason & 2) poll_rx(dev,1);
1283                         if (reason & 4) poll_tx(dev,2);
1284                         if (reason & 8) poll_tx(dev,3);
1285                 }
1286                 /* @@@ handle RCRn */
1287         }
1288 }
1289
1290
1291 /*----------------------------- (E)EPROM access -----------------------------*/
1292
1293
1294 static void __init eprom_set(struct zatm_dev *zatm_dev,unsigned long value,
1295     unsigned short cmd)
1296 {
1297         int error;
1298
1299         if ((error = pci_write_config_dword(zatm_dev->pci_dev,cmd,value)))
1300                 printk(KERN_ERR DEV_LABEL ": PCI write failed (0x%02x)\n",
1301                     error);
1302 }
1303
1304
1305 static unsigned long __init eprom_get(struct zatm_dev *zatm_dev,
1306     unsigned short cmd)
1307 {
1308         unsigned int value;
1309         int error;
1310
1311         if ((error = pci_read_config_dword(zatm_dev->pci_dev,cmd,&value)))
1312                 printk(KERN_ERR DEV_LABEL ": PCI read failed (0x%02x)\n",
1313                     error);
1314         return value;
1315 }
1316
1317
1318 static void __init eprom_put_bits(struct zatm_dev *zatm_dev,
1319     unsigned long data,int bits,unsigned short cmd)
1320 {
1321         unsigned long value;
1322         int i;
1323
1324         for (i = bits-1; i >= 0; i--) {
1325                 value = ZEPROM_CS | (((data >> i) & 1) ? ZEPROM_DI : 0);
1326                 eprom_set(zatm_dev,value,cmd);
1327                 eprom_set(zatm_dev,value | ZEPROM_SK,cmd);
1328                 eprom_set(zatm_dev,value,cmd);
1329         }
1330 }
1331
1332
1333 static void __init eprom_get_byte(struct zatm_dev *zatm_dev,
1334     unsigned char *byte,unsigned short cmd)
1335 {
1336         int i;
1337
1338         *byte = 0;
1339         for (i = 8; i; i--) {
1340                 eprom_set(zatm_dev,ZEPROM_CS,cmd);
1341                 eprom_set(zatm_dev,ZEPROM_CS | ZEPROM_SK,cmd);
1342                 *byte <<= 1;
1343                 if (eprom_get(zatm_dev,cmd) & ZEPROM_DO) *byte |= 1;
1344                 eprom_set(zatm_dev,ZEPROM_CS,cmd);
1345         }
1346 }
1347
1348
1349 static unsigned char __init eprom_try_esi(struct atm_dev *dev,
1350     unsigned short cmd,int offset,int swap)
1351 {
1352         unsigned char buf[ZEPROM_SIZE];
1353         struct zatm_dev *zatm_dev;
1354         int i;
1355
1356         zatm_dev = ZATM_DEV(dev);
1357         for (i = 0; i < ZEPROM_SIZE; i += 2) {
1358                 eprom_set(zatm_dev,ZEPROM_CS,cmd); /* select EPROM */
1359                 eprom_put_bits(zatm_dev,ZEPROM_CMD_READ,ZEPROM_CMD_LEN,cmd);
1360                 eprom_put_bits(zatm_dev,i >> 1,ZEPROM_ADDR_LEN,cmd);
1361                 eprom_get_byte(zatm_dev,buf+i+swap,cmd);
1362                 eprom_get_byte(zatm_dev,buf+i+1-swap,cmd);
1363                 eprom_set(zatm_dev,0,cmd); /* deselect EPROM */
1364         }
1365         memcpy(dev->esi,buf+offset,ESI_LEN);
1366         return memcmp(dev->esi,"\0\0\0\0\0",ESI_LEN); /* assumes ESI_LEN == 6 */
1367 }
1368
1369
1370 static void __init eprom_get_esi(struct atm_dev *dev)
1371 {
1372         if (eprom_try_esi(dev,ZEPROM_V1_REG,ZEPROM_V1_ESI_OFF,1)) return;
1373         (void) eprom_try_esi(dev,ZEPROM_V2_REG,ZEPROM_V2_ESI_OFF,0);
1374 }
1375
1376
1377 /*--------------------------------- entries ---------------------------------*/
1378
1379
1380 static int __init zatm_init(struct atm_dev *dev)
1381 {
1382         struct zatm_dev *zatm_dev;
1383         struct pci_dev *pci_dev;
1384         unsigned short command;
1385         unsigned char revision;
1386         int error,i,last;
1387         unsigned long t0,t1,t2;
1388
1389         DPRINTK(">zatm_init\n");
1390         zatm_dev = ZATM_DEV(dev);
1391         pci_dev = zatm_dev->pci_dev;
1392         zatm_dev->base = pci_resource_start(pci_dev, 0);
1393         zatm_dev->irq = pci_dev->irq;
1394         if ((error = pci_read_config_word(pci_dev,PCI_COMMAND,&command)) ||
1395             (error = pci_read_config_byte(pci_dev,PCI_REVISION_ID,&revision))) {
1396                 printk(KERN_ERR DEV_LABEL "(itf %d): init error 0x%02x\n",
1397                     dev->number,error);
1398                 return -EINVAL;
1399         }
1400         if ((error = pci_write_config_word(pci_dev,PCI_COMMAND,
1401             command | PCI_COMMAND_IO | PCI_COMMAND_MASTER))) {
1402                 printk(KERN_ERR DEV_LABEL "(itf %d): can't enable IO (0x%02x)"
1403                     "\n",dev->number,error);
1404                 return -EIO;
1405         }
1406         eprom_get_esi(dev);
1407         printk(KERN_NOTICE DEV_LABEL "(itf %d): rev.%d,base=0x%x,irq=%d,",
1408             dev->number,revision,zatm_dev->base,zatm_dev->irq);
1409         /* reset uPD98401 */
1410         zout(0,SWR);
1411         while (!(zin(GSR) & uPD98401_INT_IND));
1412         zout(uPD98401_GMR_ONE /*uPD98401_BURST4*/,GMR);
1413         last = MAX_CRAM_SIZE;
1414         for (i = last-RAM_INCREMENT; i >= 0; i -= RAM_INCREMENT) {
1415                 zpokel(zatm_dev,0x55555555,i);
1416                 if (zpeekl(zatm_dev,i) != 0x55555555) last = i;
1417                 else {
1418                         zpokel(zatm_dev,0xAAAAAAAA,i);
1419                         if (zpeekl(zatm_dev,i) != 0xAAAAAAAA) last = i;
1420                         else zpokel(zatm_dev,i,i);
1421                 }
1422         }
1423         for (i = 0; i < last; i += RAM_INCREMENT)
1424                 if (zpeekl(zatm_dev,i) != i) break;
1425         zatm_dev->mem = i << 2;
1426         while (i) zpokel(zatm_dev,0,--i);
1427         /* reset again to rebuild memory pointers */
1428         zout(0,SWR);
1429         while (!(zin(GSR) & uPD98401_INT_IND));
1430         zout(uPD98401_GMR_ONE | uPD98401_BURST8 | uPD98401_BURST4 |
1431             uPD98401_BURST2 | uPD98401_GMR_PM | uPD98401_GMR_DR,GMR);
1432         /* TODO: should shrink allocation now */
1433         printk("mem=%dkB,%s (",zatm_dev->mem >> 10,zatm_dev->copper ? "UTP" :
1434             "MMF");
1435         for (i = 0; i < ESI_LEN; i++)
1436                 printk("%02X%s",dev->esi[i],i == ESI_LEN-1 ? ")\n" : "-");
1437         do {
1438                 unsigned long flags;
1439
1440                 save_flags(flags);
1441                 cli();
1442                 t0 = zpeekl(zatm_dev,uPD98401_TSR);
1443                 udelay(10);
1444                 t1 = zpeekl(zatm_dev,uPD98401_TSR);
1445                 udelay(1010);
1446                 t2 = zpeekl(zatm_dev,uPD98401_TSR);
1447                 restore_flags(flags);
1448         }
1449         while (t0 > t1 || t1 > t2); /* loop if wrapping ... */
1450         zatm_dev->khz = t2-2*t1+t0;
1451         printk(KERN_NOTICE DEV_LABEL "(itf %d): uPD98401 %d.%d at %d.%03d "
1452             "MHz\n",dev->number,
1453             (zin(VER) & uPD98401_MAJOR) >> uPD98401_MAJOR_SHIFT,
1454             zin(VER) & uPD98401_MINOR,zatm_dev->khz/1000,zatm_dev->khz % 1000);
1455 #ifdef CONFIG_ATM_ZATM_EXACT_TS
1456         zatm_clock_init(zatm_dev);
1457 #endif
1458         return uPD98402_init(dev);
1459 }
1460
1461
1462 static int __init zatm_start(struct atm_dev *dev)
1463 {
1464         struct zatm_dev *zatm_dev;
1465         unsigned long curr;
1466         int pools,vccs,rx;
1467         int error,i,ld;
1468
1469         DPRINTK("zatm_start\n");
1470         zatm_dev = ZATM_DEV(dev);
1471         zatm_dev->rx_map = zatm_dev->tx_map = NULL;
1472         for (i = 0; i < NR_MBX; i++)
1473                 zatm_dev->mbx_start[i] = 0;
1474         if (request_irq(zatm_dev->irq,&zatm_int,SA_SHIRQ,DEV_LABEL,dev)) {
1475                 printk(KERN_ERR DEV_LABEL "(itf %d): IRQ%d is already in use\n",
1476                     dev->number,zatm_dev->irq);
1477                 return -EAGAIN;
1478         }
1479         request_region(zatm_dev->base,uPD98401_PORTS,DEV_LABEL);
1480         /* define memory regions */
1481         pools = NR_POOLS;
1482         if (NR_SHAPERS*SHAPER_SIZE > pools*POOL_SIZE)
1483                 pools = NR_SHAPERS*SHAPER_SIZE/POOL_SIZE;
1484         vccs = (zatm_dev->mem-NR_SHAPERS*SHAPER_SIZE-pools*POOL_SIZE)/
1485             (2*VC_SIZE+RX_SIZE);
1486         ld = -1;
1487         for (rx = 1; rx < vccs; rx <<= 1) ld++;
1488         dev->ci_range.vpi_bits = 0; /* @@@ no VPI for now */
1489         dev->ci_range.vci_bits = ld;
1490         dev->link_rate = ATM_OC3_PCR;
1491         zatm_dev->chans = vccs; /* ??? */
1492         curr = rx*RX_SIZE/4;
1493         DPRINTK("RX pool 0x%08lx\n",curr);
1494         zpokel(zatm_dev,curr,uPD98401_PMA); /* receive pool */
1495         zatm_dev->pool_base = curr;
1496         curr += pools*POOL_SIZE/4;
1497         DPRINTK("Shapers 0x%08lx\n",curr);
1498         zpokel(zatm_dev,curr,uPD98401_SMA); /* shapers */
1499         curr += NR_SHAPERS*SHAPER_SIZE/4;
1500         DPRINTK("Free    0x%08lx\n",curr);
1501         zpokel(zatm_dev,curr,uPD98401_TOS); /* free pool */
1502         printk(KERN_INFO DEV_LABEL "(itf %d): %d shapers, %d pools, %d RX, "
1503             "%ld VCs\n",dev->number,NR_SHAPERS,pools,rx,
1504             (zatm_dev->mem-curr*4)/VC_SIZE);
1505         /* create mailboxes */
1506         for (i = 0; i < NR_MBX; i++)
1507                 if (mbx_entries[i]) {
1508                         unsigned long here;
1509
1510                         here = (unsigned long) kmalloc(2*MBX_SIZE(i),
1511                             GFP_KERNEL);
1512                         if (!here) {
1513                                 error = -ENOMEM;
1514                                 goto out;
1515                         }
1516                         if ((here^(here+MBX_SIZE(i))) & ~0xffffUL)/* paranoia */
1517                                 here = (here & ~0xffffUL)+0x10000;
1518                         zatm_dev->mbx_start[i] = here;
1519                         if ((here^virt_to_bus((void *) here)) & 0xffff) {
1520                                 printk(KERN_ERR DEV_LABEL "(itf %d): system "
1521                                     "bus incompatible with driver\n",
1522                                     dev->number);
1523                                 error = -ENODEV;
1524                                 goto out;
1525                         }
1526                         DPRINTK("mbx@0x%08lx-0x%08lx\n",here,here+MBX_SIZE(i));
1527                         zatm_dev->mbx_end[i] = (here+MBX_SIZE(i)) & 0xffff;
1528                         zout(virt_to_bus((void *) here) >> 16,MSH(i));
1529                         zout(virt_to_bus((void *) here),MSL(i));
1530                         zout((here+MBX_SIZE(i)) & 0xffff,MBA(i));
1531                         zout(here & 0xffff,MTA(i));
1532                         zout(here & 0xffff,MWA(i));
1533                 }
1534         error = start_tx(dev);
1535         if (error) goto out;
1536         error = start_rx(dev);
1537         if (error) goto out;
1538         error = dev->phy->start(dev);
1539         if (error) goto out;
1540         zout(0xffffffff,IMR); /* enable interrupts */
1541         /* enable TX & RX */
1542         zout(zin(GMR) | uPD98401_GMR_SE | uPD98401_GMR_RE,GMR);
1543         return 0;
1544     out:
1545         for (i = 0; i < NR_MBX; i++)
1546                 if (zatm_dev->mbx_start[i] != 0)
1547                         kfree((void *) zatm_dev->mbx_start[i]);
1548         if (zatm_dev->rx_map != NULL)
1549                 kfree(zatm_dev->rx_map);
1550         if (zatm_dev->tx_map != NULL)
1551                 kfree(zatm_dev->tx_map);
1552         free_irq(zatm_dev->irq, dev);
1553         return error;
1554 }
1555
1556
1557 static void zatm_close(struct atm_vcc *vcc)
1558 {
1559         DPRINTK(">zatm_close\n");
1560         if (!ZATM_VCC(vcc)) return;
1561         clear_bit(ATM_VF_READY,&vcc->flags);
1562         close_rx(vcc);
1563         EVENT("close_tx\n",0,0);
1564         close_tx(vcc);
1565         DPRINTK("zatm_close: done waiting\n");
1566         /* deallocate memory */
1567         kfree(ZATM_VCC(vcc));
1568         ZATM_VCC(vcc) = NULL;
1569         clear_bit(ATM_VF_ADDR,&vcc->flags);
1570 }
1571
1572
1573 static int zatm_open(struct atm_vcc *vcc,short vpi,int vci)
1574 {
1575         struct zatm_dev *zatm_dev;
1576         struct zatm_vcc *zatm_vcc;
1577         int error;
1578
1579         DPRINTK(">zatm_open\n");
1580         zatm_dev = ZATM_DEV(vcc->dev);
1581         if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) ZATM_VCC(vcc) = NULL;
1582         error = atm_find_ci(vcc,&vpi,&vci);
1583         if (error) return error;
1584         vcc->vpi = vpi;
1585         vcc->vci = vci;
1586         if (vci != ATM_VPI_UNSPEC && vpi != ATM_VCI_UNSPEC)
1587                 set_bit(ATM_VF_ADDR,&vcc->flags);
1588         if (vcc->qos.aal != ATM_AAL5) return -EINVAL; /* @@@ AAL0 */
1589         DPRINTK(DEV_LABEL "(itf %d): open %d.%d\n",vcc->dev->number,vcc->vpi,
1590             vcc->vci);
1591         if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) {
1592                 zatm_vcc = kmalloc(sizeof(struct zatm_vcc),GFP_KERNEL);
1593                 if (!zatm_vcc) {
1594                         clear_bit(ATM_VF_ADDR,&vcc->flags);
1595                         return -ENOMEM;
1596                 }
1597                 ZATM_VCC(vcc) = zatm_vcc;
1598                 ZATM_VCC(vcc)->tx_chan = 0; /* for zatm_close after open_rx */
1599                 if ((error = open_rx_first(vcc))) {
1600                         zatm_close(vcc);
1601                         return error;
1602                 }
1603                 if ((error = open_tx_first(vcc))) {
1604                         zatm_close(vcc);
1605                         return error;
1606                 }
1607         }
1608         if (vci == ATM_VPI_UNSPEC || vpi == ATM_VCI_UNSPEC) return 0;
1609         if ((error = open_rx_second(vcc))) {
1610                 zatm_close(vcc);
1611                 return error;
1612         }
1613         if ((error = open_tx_second(vcc))) {
1614                 zatm_close(vcc);
1615                 return error;
1616         }
1617         set_bit(ATM_VF_READY,&vcc->flags);
1618         return 0;
1619 }
1620
1621
1622 static int zatm_change_qos(struct atm_vcc *vcc,struct atm_qos *qos,int flags)
1623 {
1624         printk("Not yet implemented\n");
1625         return -ENOSYS;
1626         /* @@@ */
1627 }
1628
1629
1630 static int zatm_ioctl(struct atm_dev *dev,unsigned int cmd,void *arg)
1631 {
1632         struct zatm_dev *zatm_dev;
1633         unsigned long flags;
1634
1635         zatm_dev = ZATM_DEV(dev);
1636         switch (cmd) {
1637                 case ZATM_GETPOOLZ:
1638                         if (!capable(CAP_NET_ADMIN)) return -EPERM;
1639                         /* fall through */
1640                 case ZATM_GETPOOL:
1641                         {
1642                                 struct zatm_pool_info info;
1643                                 int pool;
1644
1645                                 if (get_user(pool,
1646                                     &((struct zatm_pool_req *) arg)->pool_num))
1647                                         return -EFAULT;
1648                                 if (pool < 0 || pool > ZATM_LAST_POOL)
1649                                         return -EINVAL;
1650                                 save_flags(flags);
1651                                 cli();
1652                                 info = zatm_dev->pool_info[pool];
1653                                 if (cmd == ZATM_GETPOOLZ) {
1654                                         zatm_dev->pool_info[pool].rqa_count = 0;
1655                                         zatm_dev->pool_info[pool].rqu_count = 0;
1656                                 }
1657                                 restore_flags(flags);
1658                                 return copy_to_user(
1659                                     &((struct zatm_pool_req *) arg)->info,
1660                                     &info,sizeof(info)) ? -EFAULT : 0;
1661                         }
1662                 case ZATM_SETPOOL:
1663                         {
1664                                 struct zatm_pool_info info;
1665                                 int pool;
1666
1667                                 if (!capable(CAP_NET_ADMIN)) return -EPERM;
1668                                 if (get_user(pool,
1669                                     &((struct zatm_pool_req *) arg)->pool_num))
1670                                         return -EFAULT;
1671                                 if (pool < 0 || pool > ZATM_LAST_POOL)
1672                                         return -EINVAL;
1673                                 if (copy_from_user(&info,
1674                                     &((struct zatm_pool_req *) arg)->info,
1675                                     sizeof(info))) return -EFAULT;
1676                                 if (!info.low_water)
1677                                         info.low_water = zatm_dev->
1678                                             pool_info[pool].low_water;
1679                                 if (!info.high_water)
1680                                         info.high_water = zatm_dev->
1681                                             pool_info[pool].high_water;
1682                                 if (!info.next_thres)
1683                                         info.next_thres = zatm_dev->
1684                                             pool_info[pool].next_thres;
1685                                 if (info.low_water >= info.high_water ||
1686                                     info.low_water < 0)
1687                                         return -EINVAL;
1688                                 save_flags(flags);
1689                                 cli();
1690                                 zatm_dev->pool_info[pool].low_water =
1691                                     info.low_water;
1692                                 zatm_dev->pool_info[pool].high_water =
1693                                     info.high_water;
1694                                 zatm_dev->pool_info[pool].next_thres =
1695                                     info.next_thres;
1696                                 restore_flags(flags);
1697                                 return 0;
1698                         }
1699 #ifdef CONFIG_ATM_ZATM_EXACT_TS
1700                 case ZATM_GETTHIST:
1701                         {
1702                                 int i;
1703                                 struct zatm_t_hist hs[ZATM_TIMER_HISTORY_SIZE];
1704                                 save_flags(flags);
1705                                 cli();
1706                                 for (i = 0; i < ZATM_TIMER_HISTORY_SIZE; i++)
1707                                         hs[i] = zatm_dev->timer_history[
1708                                             (zatm_dev->th_curr+i) &
1709                                             (ZATM_TIMER_HISTORY_SIZE-1)];
1710                                 restore_flags(flags);
1711                                 return copy_to_user((struct zatm_t_hist *) arg,
1712                                     hs, sizeof(hs)) ? -EFAULT : 0;
1713                         }
1714 #endif
1715                 default:
1716                         if (!dev->phy->ioctl) return -ENOIOCTLCMD;
1717                         return dev->phy->ioctl(dev,cmd,arg);
1718         }
1719 }
1720
1721
1722 static int zatm_getsockopt(struct atm_vcc *vcc,int level,int optname,
1723     void *optval,int optlen)
1724 {
1725         return -EINVAL;
1726 }
1727
1728
1729 static int zatm_setsockopt(struct atm_vcc *vcc,int level,int optname,
1730     void *optval,int optlen)
1731 {
1732         return -EINVAL;
1733 }
1734
1735
1736 #if 0
1737 static int zatm_sg_send(struct atm_vcc *vcc,unsigned long start,
1738     unsigned long size)
1739 {
1740         return vcc->aal == ATM_AAL5;
1741            /* @@@ should check size and maybe alignment*/
1742 }
1743 #endif
1744
1745
1746 static int zatm_send(struct atm_vcc *vcc,struct sk_buff *skb)
1747 {
1748         int error;
1749
1750         EVENT(">zatm_send 0x%lx\n",(unsigned long) skb,0);
1751         if (!ZATM_VCC(vcc)->tx_chan || !test_bit(ATM_VF_READY,&vcc->flags)) {
1752                 if (vcc->pop) vcc->pop(vcc,skb);
1753                 else dev_kfree_skb(skb);
1754                 return -EINVAL;
1755         }
1756         if (!skb) {
1757                 printk(KERN_CRIT "!skb in zatm_send ?\n");
1758                 if (vcc->pop) vcc->pop(vcc,skb);
1759                 return -EINVAL;
1760         }
1761         ATM_SKB(skb)->vcc = vcc;
1762         error = do_tx(skb);
1763         if (error != RING_BUSY) return error;
1764         skb_queue_tail(&ZATM_VCC(vcc)->backlog,skb);
1765         return 0;
1766 }
1767
1768
1769 static void zatm_phy_put(struct atm_dev *dev,unsigned char value,
1770     unsigned long addr)
1771 {
1772         struct zatm_dev *zatm_dev;
1773
1774         zatm_dev = ZATM_DEV(dev);
1775         zwait;
1776         zout(value,CER);
1777         zout(uPD98401_IND_ACC | uPD98401_IA_B0 |
1778             (uPD98401_IA_TGT_PHY << uPD98401_IA_TGT_SHIFT) | addr,CMR);
1779 }
1780
1781
1782 static unsigned char zatm_phy_get(struct atm_dev *dev,unsigned long addr)
1783 {
1784         struct zatm_dev *zatm_dev;
1785
1786         zatm_dev = ZATM_DEV(dev);
1787         zwait;
1788         zout(uPD98401_IND_ACC | uPD98401_IA_B0 | uPD98401_IA_RW |
1789           (uPD98401_IA_TGT_PHY << uPD98401_IA_TGT_SHIFT) | addr,CMR);
1790         zwait;
1791         return zin(CER) & 0xff;
1792 }
1793
1794
1795 static const struct atmdev_ops ops = {
1796         open:           zatm_open,
1797         close:          zatm_close,
1798         ioctl:          zatm_ioctl,
1799         getsockopt:     zatm_getsockopt,
1800         setsockopt:     zatm_setsockopt,
1801         send:           zatm_send,
1802         /*zatm_sg_send*/
1803         phy_put:        zatm_phy_put,
1804         phy_get:        zatm_phy_get,
1805         feedback:       zatm_feedback,
1806         change_qos:     zatm_change_qos,
1807 };
1808
1809
1810 int __init zatm_detect(void)
1811 {
1812         struct atm_dev *dev;
1813         struct zatm_dev *zatm_dev;
1814         int devs,type;
1815
1816         zatm_dev = (struct zatm_dev *) kmalloc(sizeof(struct zatm_dev),
1817             GFP_KERNEL);
1818         if (!zatm_dev) return -ENOMEM;
1819         devs = 0;
1820         for (type = 0; type < 2; type++) {
1821                 struct pci_dev *pci_dev;
1822
1823                 pci_dev = NULL;
1824                 while ((pci_dev = pci_find_device(PCI_VENDOR_ID_ZEITNET,type ?
1825                     PCI_DEVICE_ID_ZEITNET_1225 : PCI_DEVICE_ID_ZEITNET_1221,
1826                     pci_dev))) {
1827                         if (pci_enable_device(pci_dev)) break;
1828                         dev = atm_dev_register(DEV_LABEL,&ops,-1,NULL);
1829                         if (!dev) break;
1830                         zatm_dev->pci_dev = pci_dev;
1831                         ZATM_DEV(dev) = zatm_dev;
1832                         zatm_dev->copper = type;
1833                         if (zatm_init(dev) || zatm_start(dev)) {
1834                                 atm_dev_deregister(dev);
1835                                 break;
1836                         }
1837                         zatm_dev->more = zatm_boards;
1838                         zatm_boards = dev;
1839                         devs++;
1840                         zatm_dev = (struct zatm_dev *) kmalloc(sizeof(struct
1841                             zatm_dev),GFP_KERNEL);
1842                         if (!zatm_dev) {
1843                                 printk(KERN_EMERG "zatm.c: memory shortage\n");
1844                                 return devs;
1845                         }
1846                 }
1847         }
1848         kfree(zatm_dev);
1849         return devs;
1850 }
1851
1852
1853 #ifdef MODULE
1854  
1855 MODULE_LICENSE("GPL");
1856
1857 int init_module(void)
1858 {
1859         if (!zatm_detect()) {
1860                 printk(KERN_ERR DEV_LABEL ": no adapter found\n");
1861                 return -ENXIO;
1862         }
1863         MOD_INC_USE_COUNT;
1864         return 0;
1865 }
1866  
1867  
1868 void cleanup_module(void)
1869 {
1870         /*
1871          * Well, there's no way to get rid of the driver yet, so we don't
1872          * have to clean up, right ? :-)
1873          */
1874 }
1875  
1876 #endif