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