• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/module.h>
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>
17 #include <linux/uio.h>
18 #include <linux/init.h>
19 #include <linux/interrupt.h>
20 #include <linux/dma-mapping.h>
21 #include <linux/atm_zatm.h>
22 #include <linux/capability.h>
23 #include <linux/bitops.h>
24 #include <linux/wait.h>
25 #include <linux/slab.h>
26 #include <linux/nospec.h>
27 #include <asm/byteorder.h>
28 #include <asm/string.h>
29 #include <asm/io.h>
30 #include <linux/atomic.h>
31 #include <asm/uaccess.h>
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 
event_dump(void)66 static 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 
88 static const char *ev[EV];
89 static unsigned long ev_a[EV],ev_b[EV];
90 static int ec = 0;
91 
92 
EVENT(const char * s,unsigned long a,unsigned long b)93 static 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 
event_dump(void)102 static 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 
122 static struct atm_dev *zatm_boards = NULL;
123 static 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() do {} while (zin(CMR) & uPD98401_BUSY)
130 
131 /* RX0, RX1, TX0, TX1 */
132 static const int mbx_entries[NR_MBX] = { 1024,1024,1024,1024 };
133 static 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 
zpokel(struct zatm_dev * zatm_dev,u32 value,u32 addr)141 static 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 
zpeekl(struct zatm_dev * zatm_dev,u32 addr)150 static 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 
172 struct 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 
refill_pool(struct atm_dev * dev,int pool)179 static 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 
drain_free(struct atm_dev * dev,int pool)257 static void drain_free(struct atm_dev *dev,int pool)
258 {
259 	skb_queue_purge(&ZATM_DEV(dev)->pool[pool]);
260 }
261 
262 
pool_index(int max_pdu)263 static 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 
use_pool(struct atm_dev * dev,int pool)279 static 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 
unuse_pool(struct atm_dev * dev,int pool)307 static 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
317 static 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 
340 static 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 
poll_rx(struct atm_dev * dev,int mbx)360 static 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
382 printk("RX IND: 0x%x, 0x%x, 0x%x, 0x%x\n",here[0],here[1],here[2],here[3]);
383 {
384 unsigned 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 		}
400 EVENT("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;
403 		__net_timestamp(skb);
404 #if 0
405 printk("[-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
412 printk("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]) {
420 			int pos;
421 			vcc = zatm_dev->rx_map[chan];
422 			pos = ZATM_VCC(vcc)->pool;
423 			if (skb == zatm_dev->last_free[pos])
424 				zatm_dev->last_free[pos] = NULL;
425 			skb_unlink(skb, zatm_dev->pool + pos);
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 
open_rx_first(struct atm_vcc * vcc)483 static 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 */
501 		cells = DIV_ROUND_UP(vcc->qos.rxtp.max_sdu + ATM_AAL5_TRAILER,
502 				ATM_CELL_PAYLOAD);
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 
open_rx_second(struct atm_vcc * vcc)535 static 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 
close_rx(struct atm_vcc * vcc)557 static 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 
start_rx(struct atm_dev * dev)599 static int start_rx(struct atm_dev *dev)
600 {
601 	struct zatm_dev *zatm_dev;
602 	int size,i;
603 
604 DPRINTK("start_rx\n");
605 	zatm_dev = ZATM_DEV(dev);
606 	size = sizeof(struct atm_vcc *)*zatm_dev->chans;
607 	zatm_dev->rx_map =  kzalloc(size,GFP_KERNEL);
608 	if (!zatm_dev->rx_map) return -ENOMEM;
609 	/* set VPI/VCI split (use all VCIs and give what's left to VPIs) */
610 	zpokel(zatm_dev,(1 << dev->ci_range.vci_bits)-1,uPD98401_VRR);
611 	/* prepare free buffer pools */
612 	for (i = 0; i <= ZATM_LAST_POOL; i++) {
613 		zatm_dev->pool_info[i].ref_count = 0;
614 		zatm_dev->pool_info[i].rqa_count = 0;
615 		zatm_dev->pool_info[i].rqu_count = 0;
616 		zatm_dev->pool_info[i].low_water = LOW_MARK;
617 		zatm_dev->pool_info[i].high_water = HIGH_MARK;
618 		zatm_dev->pool_info[i].offset = 0;
619 		zatm_dev->pool_info[i].next_off = 0;
620 		zatm_dev->pool_info[i].next_cnt = 0;
621 		zatm_dev->pool_info[i].next_thres = OFF_CNG_THRES;
622 	}
623 	return 0;
624 }
625 
626 
627 /*----------------------------------- TX ------------------------------------*/
628 
629 
do_tx(struct sk_buff * skb)630 static int do_tx(struct sk_buff *skb)
631 {
632 	struct atm_vcc *vcc;
633 	struct zatm_dev *zatm_dev;
634 	struct zatm_vcc *zatm_vcc;
635 	u32 *dsc;
636 	unsigned long flags;
637 
638 	EVENT("do_tx\n",0,0);
639 	DPRINTK("sending skb %p\n",skb);
640 	vcc = ATM_SKB(skb)->vcc;
641 	zatm_dev = ZATM_DEV(vcc->dev);
642 	zatm_vcc = ZATM_VCC(vcc);
643 	EVENT("iovcnt=%d\n",skb_shinfo(skb)->nr_frags,0);
644 	spin_lock_irqsave(&zatm_dev->lock, flags);
645 	if (!skb_shinfo(skb)->nr_frags) {
646 		if (zatm_vcc->txing == RING_ENTRIES-1) {
647 			spin_unlock_irqrestore(&zatm_dev->lock, flags);
648 			return RING_BUSY;
649 		}
650 		zatm_vcc->txing++;
651 		dsc = zatm_vcc->ring+zatm_vcc->ring_curr;
652 		zatm_vcc->ring_curr = (zatm_vcc->ring_curr+RING_WORDS) &
653 		    (RING_ENTRIES*RING_WORDS-1);
654 		dsc[1] = 0;
655 		dsc[2] = skb->len;
656 		dsc[3] = virt_to_bus(skb->data);
657 		mb();
658 		dsc[0] = uPD98401_TXPD_V | uPD98401_TXPD_DP | uPD98401_TXPD_SM
659 		    | (vcc->qos.aal == ATM_AAL5 ? uPD98401_TXPD_AAL5 : 0 |
660 		    (ATM_SKB(skb)->atm_options & ATM_ATMOPT_CLP ?
661 		    uPD98401_CLPM_1 : uPD98401_CLPM_0));
662 		EVENT("dsc (0x%lx)\n",(unsigned long) dsc,0);
663 	}
664 	else {
665 printk("NONONONOO!!!!\n");
666 		dsc = NULL;
667 #if 0
668 		u32 *put;
669 		int i;
670 
671 		dsc = kmalloc(uPD98401_TXPD_SIZE * 2 +
672 			uPD98401_TXBD_SIZE * ATM_SKB(skb)->iovcnt, GFP_ATOMIC);
673 		if (!dsc) {
674 			if (vcc->pop)
675 				vcc->pop(vcc, skb);
676 			else
677 				dev_kfree_skb_irq(skb);
678 			return -EAGAIN;
679 		}
680 		/* @@@ should check alignment */
681 		put = dsc+8;
682 		dsc[0] = uPD98401_TXPD_V | uPD98401_TXPD_DP |
683 		    (vcc->aal == ATM_AAL5 ? uPD98401_TXPD_AAL5 : 0 |
684 		    (ATM_SKB(skb)->atm_options & ATM_ATMOPT_CLP ?
685 		    uPD98401_CLPM_1 : uPD98401_CLPM_0));
686 		dsc[1] = 0;
687 		dsc[2] = ATM_SKB(skb)->iovcnt * uPD98401_TXBD_SIZE;
688 		dsc[3] = virt_to_bus(put);
689 		for (i = 0; i < ATM_SKB(skb)->iovcnt; i++) {
690 			*put++ = ((struct iovec *) skb->data)[i].iov_len;
691 			*put++ = virt_to_bus(((struct iovec *)
692 			    skb->data)[i].iov_base);
693 		}
694 		put[-2] |= uPD98401_TXBD_LAST;
695 #endif
696 	}
697 	ZATM_PRV_DSC(skb) = dsc;
698 	skb_queue_tail(&zatm_vcc->tx_queue,skb);
699 	DPRINTK("QRP=0x%08lx\n",zpeekl(zatm_dev,zatm_vcc->tx_chan*VC_SIZE/4+
700 	  uPD98401_TXVC_QRP));
701 	zwait();
702 	zout(uPD98401_TX_READY | (zatm_vcc->tx_chan <<
703 	    uPD98401_CHAN_ADDR_SHIFT),CMR);
704 	spin_unlock_irqrestore(&zatm_dev->lock, flags);
705 	EVENT("done\n",0,0);
706 	return 0;
707 }
708 
709 
dequeue_tx(struct atm_vcc * vcc)710 static inline void dequeue_tx(struct atm_vcc *vcc)
711 {
712 	struct zatm_vcc *zatm_vcc;
713 	struct sk_buff *skb;
714 
715 	EVENT("dequeue_tx\n",0,0);
716 	zatm_vcc = ZATM_VCC(vcc);
717 	skb = skb_dequeue(&zatm_vcc->tx_queue);
718 	if (!skb) {
719 		printk(KERN_CRIT DEV_LABEL "(itf %d): dequeue_tx but not "
720 		    "txing\n",vcc->dev->number);
721 		return;
722 	}
723 #if 0 /* @@@ would fail on CLP */
724 if (*ZATM_PRV_DSC(skb) != (uPD98401_TXPD_V | uPD98401_TXPD_DP |
725   uPD98401_TXPD_SM | uPD98401_TXPD_AAL5)) printk("@#*$!!!!  (%08x)\n",
726   *ZATM_PRV_DSC(skb));
727 #endif
728 	*ZATM_PRV_DSC(skb) = 0; /* mark as invalid */
729 	zatm_vcc->txing--;
730 	if (vcc->pop) vcc->pop(vcc,skb);
731 	else dev_kfree_skb_irq(skb);
732 	while ((skb = skb_dequeue(&zatm_vcc->backlog)))
733 		if (do_tx(skb) == RING_BUSY) {
734 			skb_queue_head(&zatm_vcc->backlog,skb);
735 			break;
736 		}
737 	atomic_inc(&vcc->stats->tx);
738 	wake_up(&zatm_vcc->tx_wait);
739 }
740 
741 
poll_tx(struct atm_dev * dev,int mbx)742 static void poll_tx(struct atm_dev *dev,int mbx)
743 {
744 	struct zatm_dev *zatm_dev;
745 	unsigned long pos;
746 	u32 x;
747 
748 	EVENT("poll_tx\n",0,0);
749 	zatm_dev = ZATM_DEV(dev);
750 	pos = (zatm_dev->mbx_start[mbx] & ~0xffffUL) | zin(MTA(mbx));
751 	while (x = zin(MWA(mbx)), (pos & 0xffff) != x) {
752 		int chan;
753 
754 #if 1
755 		u32 data,*addr;
756 
757 		EVENT("MBX: host 0x%lx, nic 0x%x\n",pos,x);
758 		addr = (u32 *) pos;
759 		data = *addr;
760 		chan = (data & uPD98401_TXI_CONN) >> uPD98401_TXI_CONN_SHIFT;
761 		EVENT("addr = 0x%lx, data = 0x%08x,",(unsigned long) addr,
762 		    data);
763 		EVENT("chan = %d\n",chan,0);
764 #else
765 NO !
766 		chan = (zatm_dev->mbx_start[mbx][pos >> 2] & uPD98401_TXI_CONN)
767 		>> uPD98401_TXI_CONN_SHIFT;
768 #endif
769 		if (chan < zatm_dev->chans && zatm_dev->tx_map[chan])
770 			dequeue_tx(zatm_dev->tx_map[chan]);
771 		else {
772 			printk(KERN_CRIT DEV_LABEL "(itf %d): TX indication "
773 			    "for non-existing channel %d\n",dev->number,chan);
774 			event_dump();
775 		}
776 		if (((pos += 4) & 0xffff) == zatm_dev->mbx_end[mbx])
777 			pos = zatm_dev->mbx_start[mbx];
778 	}
779 	zout(pos & 0xffff,MTA(mbx));
780 }
781 
782 
783 /*
784  * BUG BUG BUG: Doesn't handle "new-style" rate specification yet.
785  */
786 
alloc_shaper(struct atm_dev * dev,int * pcr,int min,int max,int ubr)787 static int alloc_shaper(struct atm_dev *dev,int *pcr,int min,int max,int ubr)
788 {
789 	struct zatm_dev *zatm_dev;
790 	unsigned long flags;
791 	unsigned long i,m,c;
792 	int shaper;
793 
794 	DPRINTK("alloc_shaper (min = %d, max = %d)\n",min,max);
795 	zatm_dev = ZATM_DEV(dev);
796 	if (!zatm_dev->free_shapers) return -EAGAIN;
797 	for (shaper = 0; !((zatm_dev->free_shapers >> shaper) & 1); shaper++);
798 	zatm_dev->free_shapers &= ~1 << shaper;
799 	if (ubr) {
800 		c = 5;
801 		i = m = 1;
802 		zatm_dev->ubr_ref_cnt++;
803 		zatm_dev->ubr = shaper;
804 		*pcr = 0;
805 	}
806 	else {
807 		if (min) {
808 			if (min <= 255) {
809 				i = min;
810 				m = ATM_OC3_PCR;
811 			}
812 			else {
813 				i = 255;
814 				m = ATM_OC3_PCR*255/min;
815 			}
816 		}
817 		else {
818 			if (max > zatm_dev->tx_bw) max = zatm_dev->tx_bw;
819 			if (max <= 255) {
820 				i = max;
821 				m = ATM_OC3_PCR;
822 			}
823 			else {
824 				i = 255;
825 				m = DIV_ROUND_UP(ATM_OC3_PCR*255, max);
826 			}
827 		}
828 		if (i > m) {
829 			printk(KERN_CRIT DEV_LABEL "shaper algorithm botched "
830 			    "[%d,%d] -> i=%ld,m=%ld\n",min,max,i,m);
831 			m = i;
832 		}
833 		*pcr = i*ATM_OC3_PCR/m;
834 		c = 20; /* @@@ should use max_cdv ! */
835 		if ((min && *pcr < min) || (max && *pcr > max)) return -EINVAL;
836 		if (zatm_dev->tx_bw < *pcr) return -EAGAIN;
837 		zatm_dev->tx_bw -= *pcr;
838 	}
839 	spin_lock_irqsave(&zatm_dev->lock, flags);
840 	DPRINTK("i = %d, m = %d, PCR = %d\n",i,m,*pcr);
841 	zpokel(zatm_dev,(i << uPD98401_IM_I_SHIFT) | m,uPD98401_IM(shaper));
842 	zpokel(zatm_dev,c << uPD98401_PC_C_SHIFT,uPD98401_PC(shaper));
843 	zpokel(zatm_dev,0,uPD98401_X(shaper));
844 	zpokel(zatm_dev,0,uPD98401_Y(shaper));
845 	zpokel(zatm_dev,uPD98401_PS_E,uPD98401_PS(shaper));
846 	spin_unlock_irqrestore(&zatm_dev->lock, flags);
847 	return shaper;
848 }
849 
850 
dealloc_shaper(struct atm_dev * dev,int shaper)851 static void dealloc_shaper(struct atm_dev *dev,int shaper)
852 {
853 	struct zatm_dev *zatm_dev;
854 	unsigned long flags;
855 
856 	zatm_dev = ZATM_DEV(dev);
857 	if (shaper == zatm_dev->ubr) {
858 		if (--zatm_dev->ubr_ref_cnt) return;
859 		zatm_dev->ubr = -1;
860 	}
861 	spin_lock_irqsave(&zatm_dev->lock, flags);
862 	zpokel(zatm_dev,zpeekl(zatm_dev,uPD98401_PS(shaper)) & ~uPD98401_PS_E,
863 	    uPD98401_PS(shaper));
864 	spin_unlock_irqrestore(&zatm_dev->lock, flags);
865 	zatm_dev->free_shapers |= 1 << shaper;
866 }
867 
868 
close_tx(struct atm_vcc * vcc)869 static void close_tx(struct atm_vcc *vcc)
870 {
871 	struct zatm_dev *zatm_dev;
872 	struct zatm_vcc *zatm_vcc;
873 	unsigned long flags;
874 	int chan;
875 
876 	zatm_vcc = ZATM_VCC(vcc);
877 	zatm_dev = ZATM_DEV(vcc->dev);
878 	chan = zatm_vcc->tx_chan;
879 	if (!chan) return;
880 	DPRINTK("close_tx\n");
881 	if (skb_peek(&zatm_vcc->backlog)) {
882 		printk("waiting for backlog to drain ...\n");
883 		event_dump();
884 		wait_event(zatm_vcc->tx_wait, !skb_peek(&zatm_vcc->backlog));
885 	}
886 	if (skb_peek(&zatm_vcc->tx_queue)) {
887 		printk("waiting for TX queue to drain ...\n");
888 		event_dump();
889 		wait_event(zatm_vcc->tx_wait, !skb_peek(&zatm_vcc->tx_queue));
890 	}
891 	spin_lock_irqsave(&zatm_dev->lock, flags);
892 #if 0
893 	zwait();
894 	zout(uPD98401_DEACT_CHAN | (chan << uPD98401_CHAN_ADDR_SHIFT),CMR);
895 #endif
896 	zwait();
897 	zout(uPD98401_CLOSE_CHAN | (chan << uPD98401_CHAN_ADDR_SHIFT),CMR);
898 	zwait();
899 	if (!(zin(CMR) & uPD98401_CHAN_ADDR))
900 		printk(KERN_CRIT DEV_LABEL "(itf %d): can't close TX channel "
901 		    "%d\n",vcc->dev->number,chan);
902 	spin_unlock_irqrestore(&zatm_dev->lock, flags);
903 	zatm_vcc->tx_chan = 0;
904 	zatm_dev->tx_map[chan] = NULL;
905 	if (zatm_vcc->shaper != zatm_dev->ubr) {
906 		zatm_dev->tx_bw += vcc->qos.txtp.min_pcr;
907 		dealloc_shaper(vcc->dev,zatm_vcc->shaper);
908 	}
909 	kfree(zatm_vcc->ring);
910 }
911 
912 
open_tx_first(struct atm_vcc * vcc)913 static int open_tx_first(struct atm_vcc *vcc)
914 {
915 	struct zatm_dev *zatm_dev;
916 	struct zatm_vcc *zatm_vcc;
917 	unsigned long flags;
918 	u32 *loop;
919 	unsigned short chan;
920 	int unlimited;
921 
922 	DPRINTK("open_tx_first\n");
923 	zatm_dev = ZATM_DEV(vcc->dev);
924 	zatm_vcc = ZATM_VCC(vcc);
925 	zatm_vcc->tx_chan = 0;
926 	if (vcc->qos.txtp.traffic_class == ATM_NONE) return 0;
927 	spin_lock_irqsave(&zatm_dev->lock, flags);
928 	zwait();
929 	zout(uPD98401_OPEN_CHAN,CMR);
930 	zwait();
931 	DPRINTK("0x%x 0x%x\n",zin(CMR),zin(CER));
932 	chan = (zin(CMR) & uPD98401_CHAN_ADDR) >> uPD98401_CHAN_ADDR_SHIFT;
933 	spin_unlock_irqrestore(&zatm_dev->lock, flags);
934 	DPRINTK("chan is %d\n",chan);
935 	if (!chan) return -EAGAIN;
936 	unlimited = vcc->qos.txtp.traffic_class == ATM_UBR &&
937 	    (!vcc->qos.txtp.max_pcr || vcc->qos.txtp.max_pcr == ATM_MAX_PCR ||
938 	    vcc->qos.txtp.max_pcr >= ATM_OC3_PCR);
939 	if (unlimited && zatm_dev->ubr != -1) zatm_vcc->shaper = zatm_dev->ubr;
940 	else {
941 		int uninitialized_var(pcr);
942 
943 		if (unlimited) vcc->qos.txtp.max_sdu = ATM_MAX_AAL5_PDU;
944 		if ((zatm_vcc->shaper = alloc_shaper(vcc->dev,&pcr,
945 		    vcc->qos.txtp.min_pcr,vcc->qos.txtp.max_pcr,unlimited))
946 		    < 0) {
947 			close_tx(vcc);
948 			return zatm_vcc->shaper;
949 		}
950 		if (pcr > ATM_OC3_PCR) pcr = ATM_OC3_PCR;
951 		vcc->qos.txtp.min_pcr = vcc->qos.txtp.max_pcr = pcr;
952 	}
953 	zatm_vcc->tx_chan = chan;
954 	skb_queue_head_init(&zatm_vcc->tx_queue);
955 	init_waitqueue_head(&zatm_vcc->tx_wait);
956 	/* initialize ring */
957 	zatm_vcc->ring = kzalloc(RING_SIZE,GFP_KERNEL);
958 	if (!zatm_vcc->ring) return -ENOMEM;
959 	loop = zatm_vcc->ring+RING_ENTRIES*RING_WORDS;
960 	loop[0] = uPD98401_TXPD_V;
961 	loop[1] = loop[2] = 0;
962 	loop[3] = virt_to_bus(zatm_vcc->ring);
963 	zatm_vcc->ring_curr = 0;
964 	zatm_vcc->txing = 0;
965 	skb_queue_head_init(&zatm_vcc->backlog);
966 	zpokel(zatm_dev,virt_to_bus(zatm_vcc->ring),
967 	    chan*VC_SIZE/4+uPD98401_TXVC_QRP);
968 	return 0;
969 }
970 
971 
open_tx_second(struct atm_vcc * vcc)972 static int open_tx_second(struct atm_vcc *vcc)
973 {
974 	struct zatm_dev *zatm_dev;
975 	struct zatm_vcc *zatm_vcc;
976 	unsigned long flags;
977 
978 	DPRINTK("open_tx_second\n");
979 	zatm_dev = ZATM_DEV(vcc->dev);
980 	zatm_vcc = ZATM_VCC(vcc);
981 	if (!zatm_vcc->tx_chan) return 0;
982 	/* set up VC descriptor */
983 	spin_lock_irqsave(&zatm_dev->lock, flags);
984 	zpokel(zatm_dev,0,zatm_vcc->tx_chan*VC_SIZE/4);
985 	zpokel(zatm_dev,uPD98401_TXVC_L | (zatm_vcc->shaper <<
986 	    uPD98401_TXVC_SHP_SHIFT) | (vcc->vpi << uPD98401_TXVC_VPI_SHIFT) |
987 	    vcc->vci,zatm_vcc->tx_chan*VC_SIZE/4+1);
988 	zpokel(zatm_dev,0,zatm_vcc->tx_chan*VC_SIZE/4+2);
989 	spin_unlock_irqrestore(&zatm_dev->lock, flags);
990 	zatm_dev->tx_map[zatm_vcc->tx_chan] = vcc;
991 	return 0;
992 }
993 
994 
start_tx(struct atm_dev * dev)995 static int start_tx(struct atm_dev *dev)
996 {
997 	struct zatm_dev *zatm_dev;
998 	int i;
999 
1000 	DPRINTK("start_tx\n");
1001 	zatm_dev = ZATM_DEV(dev);
1002 	zatm_dev->tx_map = kmalloc(sizeof(struct atm_vcc *)*
1003 	    zatm_dev->chans,GFP_KERNEL);
1004 	if (!zatm_dev->tx_map) return -ENOMEM;
1005 	zatm_dev->tx_bw = ATM_OC3_PCR;
1006 	zatm_dev->free_shapers = (1 << NR_SHAPERS)-1;
1007 	zatm_dev->ubr = -1;
1008 	zatm_dev->ubr_ref_cnt = 0;
1009 	/* initialize shapers */
1010 	for (i = 0; i < NR_SHAPERS; i++) zpokel(zatm_dev,0,uPD98401_PS(i));
1011 	return 0;
1012 }
1013 
1014 
1015 /*------------------------------- interrupts --------------------------------*/
1016 
1017 
zatm_int(int irq,void * dev_id)1018 static irqreturn_t zatm_int(int irq,void *dev_id)
1019 {
1020 	struct atm_dev *dev;
1021 	struct zatm_dev *zatm_dev;
1022 	u32 reason;
1023 	int handled = 0;
1024 
1025 	dev = dev_id;
1026 	zatm_dev = ZATM_DEV(dev);
1027 	while ((reason = zin(GSR))) {
1028 		handled = 1;
1029 		EVENT("reason 0x%x\n",reason,0);
1030 		if (reason & uPD98401_INT_PI) {
1031 			EVENT("PHY int\n",0,0);
1032 			dev->phy->interrupt(dev);
1033 		}
1034 		if (reason & uPD98401_INT_RQA) {
1035 			unsigned long pools;
1036 			int i;
1037 
1038 			pools = zin(RQA);
1039 			EVENT("RQA (0x%08x)\n",pools,0);
1040 			for (i = 0; pools; i++) {
1041 				if (pools & 1) {
1042 					refill_pool(dev,i);
1043 					zatm_dev->pool_info[i].rqa_count++;
1044 				}
1045 				pools >>= 1;
1046 			}
1047 		}
1048 		if (reason & uPD98401_INT_RQU) {
1049 			unsigned long pools;
1050 			int i;
1051 			pools = zin(RQU);
1052 			printk(KERN_WARNING DEV_LABEL "(itf %d): RQU 0x%08lx\n",
1053 			    dev->number,pools);
1054 			event_dump();
1055 			for (i = 0; pools; i++) {
1056 				if (pools & 1) {
1057 					refill_pool(dev,i);
1058 					zatm_dev->pool_info[i].rqu_count++;
1059 				}
1060 				pools >>= 1;
1061 			}
1062 		}
1063 		/* don't handle RD */
1064 		if (reason & uPD98401_INT_SPE)
1065 			printk(KERN_ALERT DEV_LABEL "(itf %d): system parity "
1066 			    "error at 0x%08x\n",dev->number,zin(ADDR));
1067 		if (reason & uPD98401_INT_CPE)
1068 			printk(KERN_ALERT DEV_LABEL "(itf %d): control memory "
1069 			    "parity error at 0x%08x\n",dev->number,zin(ADDR));
1070 		if (reason & uPD98401_INT_SBE) {
1071 			printk(KERN_ALERT DEV_LABEL "(itf %d): system bus "
1072 			    "error at 0x%08x\n",dev->number,zin(ADDR));
1073 			event_dump();
1074 		}
1075 		/* don't handle IND */
1076 		if (reason & uPD98401_INT_MF) {
1077 			printk(KERN_CRIT DEV_LABEL "(itf %d): mailbox full "
1078 			    "(0x%x)\n",dev->number,(reason & uPD98401_INT_MF)
1079 			    >> uPD98401_INT_MF_SHIFT);
1080 			event_dump();
1081 			    /* @@@ should try to recover */
1082 		}
1083 		if (reason & uPD98401_INT_MM) {
1084 			if (reason & 1) poll_rx(dev,0);
1085 			if (reason & 2) poll_rx(dev,1);
1086 			if (reason & 4) poll_tx(dev,2);
1087 			if (reason & 8) poll_tx(dev,3);
1088 		}
1089 		/* @@@ handle RCRn */
1090 	}
1091 	return IRQ_RETVAL(handled);
1092 }
1093 
1094 
1095 /*----------------------------- (E)EPROM access -----------------------------*/
1096 
1097 
eprom_set(struct zatm_dev * zatm_dev,unsigned long value,unsigned short cmd)1098 static void eprom_set(struct zatm_dev *zatm_dev, unsigned long value,
1099 		      unsigned short cmd)
1100 {
1101 	int error;
1102 
1103 	if ((error = pci_write_config_dword(zatm_dev->pci_dev,cmd,value)))
1104 		printk(KERN_ERR DEV_LABEL ": PCI write failed (0x%02x)\n",
1105 		    error);
1106 }
1107 
1108 
eprom_get(struct zatm_dev * zatm_dev,unsigned short cmd)1109 static unsigned long eprom_get(struct zatm_dev *zatm_dev, unsigned short cmd)
1110 {
1111 	unsigned int value;
1112 	int error;
1113 
1114 	if ((error = pci_read_config_dword(zatm_dev->pci_dev,cmd,&value)))
1115 		printk(KERN_ERR DEV_LABEL ": PCI read failed (0x%02x)\n",
1116 		    error);
1117 	return value;
1118 }
1119 
1120 
eprom_put_bits(struct zatm_dev * zatm_dev,unsigned long data,int bits,unsigned short cmd)1121 static void eprom_put_bits(struct zatm_dev *zatm_dev, unsigned long data,
1122 			   int bits, unsigned short cmd)
1123 {
1124 	unsigned long value;
1125 	int i;
1126 
1127 	for (i = bits-1; i >= 0; i--) {
1128 		value = ZEPROM_CS | (((data >> i) & 1) ? ZEPROM_DI : 0);
1129 		eprom_set(zatm_dev,value,cmd);
1130 		eprom_set(zatm_dev,value | ZEPROM_SK,cmd);
1131 		eprom_set(zatm_dev,value,cmd);
1132 	}
1133 }
1134 
1135 
eprom_get_byte(struct zatm_dev * zatm_dev,unsigned char * byte,unsigned short cmd)1136 static void eprom_get_byte(struct zatm_dev *zatm_dev, unsigned char *byte,
1137 			   unsigned short cmd)
1138 {
1139 	int i;
1140 
1141 	*byte = 0;
1142 	for (i = 8; i; i--) {
1143 		eprom_set(zatm_dev,ZEPROM_CS,cmd);
1144 		eprom_set(zatm_dev,ZEPROM_CS | ZEPROM_SK,cmd);
1145 		*byte <<= 1;
1146 		if (eprom_get(zatm_dev,cmd) & ZEPROM_DO) *byte |= 1;
1147 		eprom_set(zatm_dev,ZEPROM_CS,cmd);
1148 	}
1149 }
1150 
1151 
eprom_try_esi(struct atm_dev * dev,unsigned short cmd,int offset,int swap)1152 static int eprom_try_esi(struct atm_dev *dev, unsigned short cmd, int offset,
1153 			 int swap)
1154 {
1155 	unsigned char buf[ZEPROM_SIZE];
1156 	struct zatm_dev *zatm_dev;
1157 	int i;
1158 
1159 	zatm_dev = ZATM_DEV(dev);
1160 	for (i = 0; i < ZEPROM_SIZE; i += 2) {
1161 		eprom_set(zatm_dev,ZEPROM_CS,cmd); /* select EPROM */
1162 		eprom_put_bits(zatm_dev,ZEPROM_CMD_READ,ZEPROM_CMD_LEN,cmd);
1163 		eprom_put_bits(zatm_dev,i >> 1,ZEPROM_ADDR_LEN,cmd);
1164 		eprom_get_byte(zatm_dev,buf+i+swap,cmd);
1165 		eprom_get_byte(zatm_dev,buf+i+1-swap,cmd);
1166 		eprom_set(zatm_dev,0,cmd); /* deselect EPROM */
1167 	}
1168 	memcpy(dev->esi,buf+offset,ESI_LEN);
1169 	return memcmp(dev->esi,"\0\0\0\0\0",ESI_LEN); /* assumes ESI_LEN == 6 */
1170 }
1171 
1172 
eprom_get_esi(struct atm_dev * dev)1173 static void eprom_get_esi(struct atm_dev *dev)
1174 {
1175 	if (eprom_try_esi(dev,ZEPROM_V1_REG,ZEPROM_V1_ESI_OFF,1)) return;
1176 	(void) eprom_try_esi(dev,ZEPROM_V2_REG,ZEPROM_V2_ESI_OFF,0);
1177 }
1178 
1179 
1180 /*--------------------------------- entries ---------------------------------*/
1181 
1182 
zatm_init(struct atm_dev * dev)1183 static int zatm_init(struct atm_dev *dev)
1184 {
1185 	struct zatm_dev *zatm_dev;
1186 	struct pci_dev *pci_dev;
1187 	unsigned short command;
1188 	int error,i,last;
1189 	unsigned long t0,t1,t2;
1190 
1191 	DPRINTK(">zatm_init\n");
1192 	zatm_dev = ZATM_DEV(dev);
1193 	spin_lock_init(&zatm_dev->lock);
1194 	pci_dev = zatm_dev->pci_dev;
1195 	zatm_dev->base = pci_resource_start(pci_dev, 0);
1196 	zatm_dev->irq = pci_dev->irq;
1197 	if ((error = pci_read_config_word(pci_dev,PCI_COMMAND,&command))) {
1198 		printk(KERN_ERR DEV_LABEL "(itf %d): init error 0x%02x\n",
1199 		    dev->number,error);
1200 		return -EINVAL;
1201 	}
1202 	if ((error = pci_write_config_word(pci_dev,PCI_COMMAND,
1203 	    command | PCI_COMMAND_IO | PCI_COMMAND_MASTER))) {
1204 		printk(KERN_ERR DEV_LABEL "(itf %d): can't enable IO (0x%02x)"
1205 		    "\n",dev->number,error);
1206 		return -EIO;
1207 	}
1208 	eprom_get_esi(dev);
1209 	printk(KERN_NOTICE DEV_LABEL "(itf %d): rev.%d,base=0x%x,irq=%d,",
1210 	    dev->number,pci_dev->revision,zatm_dev->base,zatm_dev->irq);
1211 	/* reset uPD98401 */
1212 	zout(0,SWR);
1213 	while (!(zin(GSR) & uPD98401_INT_IND));
1214 	zout(uPD98401_GMR_ONE /*uPD98401_BURST4*/,GMR);
1215 	last = MAX_CRAM_SIZE;
1216 	for (i = last-RAM_INCREMENT; i >= 0; i -= RAM_INCREMENT) {
1217 		zpokel(zatm_dev,0x55555555,i);
1218 		if (zpeekl(zatm_dev,i) != 0x55555555) last = i;
1219 		else {
1220 			zpokel(zatm_dev,0xAAAAAAAA,i);
1221 			if (zpeekl(zatm_dev,i) != 0xAAAAAAAA) last = i;
1222 			else zpokel(zatm_dev,i,i);
1223 		}
1224 	}
1225 	for (i = 0; i < last; i += RAM_INCREMENT)
1226 		if (zpeekl(zatm_dev,i) != i) break;
1227 	zatm_dev->mem = i << 2;
1228 	while (i) zpokel(zatm_dev,0,--i);
1229 	/* reset again to rebuild memory pointers */
1230 	zout(0,SWR);
1231 	while (!(zin(GSR) & uPD98401_INT_IND));
1232 	zout(uPD98401_GMR_ONE | uPD98401_BURST8 | uPD98401_BURST4 |
1233 	    uPD98401_BURST2 | uPD98401_GMR_PM | uPD98401_GMR_DR,GMR);
1234 	/* TODO: should shrink allocation now */
1235 	printk("mem=%dkB,%s (",zatm_dev->mem >> 10,zatm_dev->copper ? "UTP" :
1236 	    "MMF");
1237 	for (i = 0; i < ESI_LEN; i++)
1238 		printk("%02X%s",dev->esi[i],i == ESI_LEN-1 ? ")\n" : "-");
1239 	do {
1240 		unsigned long flags;
1241 
1242 		spin_lock_irqsave(&zatm_dev->lock, flags);
1243 		t0 = zpeekl(zatm_dev,uPD98401_TSR);
1244 		udelay(10);
1245 		t1 = zpeekl(zatm_dev,uPD98401_TSR);
1246 		udelay(1010);
1247 		t2 = zpeekl(zatm_dev,uPD98401_TSR);
1248 		spin_unlock_irqrestore(&zatm_dev->lock, flags);
1249 	}
1250 	while (t0 > t1 || t1 > t2); /* loop if wrapping ... */
1251 	zatm_dev->khz = t2-2*t1+t0;
1252 	printk(KERN_NOTICE DEV_LABEL "(itf %d): uPD98401 %d.%d at %d.%03d "
1253 	    "MHz\n",dev->number,
1254 	    (zin(VER) & uPD98401_MAJOR) >> uPD98401_MAJOR_SHIFT,
1255             zin(VER) & uPD98401_MINOR,zatm_dev->khz/1000,zatm_dev->khz % 1000);
1256 	return uPD98402_init(dev);
1257 }
1258 
1259 
zatm_start(struct atm_dev * dev)1260 static int zatm_start(struct atm_dev *dev)
1261 {
1262 	struct zatm_dev *zatm_dev = ZATM_DEV(dev);
1263 	struct pci_dev *pdev = zatm_dev->pci_dev;
1264 	unsigned long curr;
1265 	int pools,vccs,rx;
1266 	int error, i, ld;
1267 
1268 	DPRINTK("zatm_start\n");
1269 	zatm_dev->rx_map = zatm_dev->tx_map = NULL;
1270  	for (i = 0; i < NR_MBX; i++)
1271  		zatm_dev->mbx_start[i] = 0;
1272  	error = request_irq(zatm_dev->irq, zatm_int, IRQF_SHARED, DEV_LABEL, dev);
1273 	if (error < 0) {
1274  		printk(KERN_ERR DEV_LABEL "(itf %d): IRQ%d is already in use\n",
1275  		    dev->number,zatm_dev->irq);
1276 		goto done;
1277 	}
1278 	/* define memory regions */
1279 	pools = NR_POOLS;
1280 	if (NR_SHAPERS*SHAPER_SIZE > pools*POOL_SIZE)
1281 		pools = NR_SHAPERS*SHAPER_SIZE/POOL_SIZE;
1282 	vccs = (zatm_dev->mem-NR_SHAPERS*SHAPER_SIZE-pools*POOL_SIZE)/
1283 	    (2*VC_SIZE+RX_SIZE);
1284 	ld = -1;
1285 	for (rx = 1; rx < vccs; rx <<= 1) ld++;
1286 	dev->ci_range.vpi_bits = 0; /* @@@ no VPI for now */
1287 	dev->ci_range.vci_bits = ld;
1288 	dev->link_rate = ATM_OC3_PCR;
1289 	zatm_dev->chans = vccs; /* ??? */
1290 	curr = rx*RX_SIZE/4;
1291 	DPRINTK("RX pool 0x%08lx\n",curr);
1292 	zpokel(zatm_dev,curr,uPD98401_PMA); /* receive pool */
1293 	zatm_dev->pool_base = curr;
1294 	curr += pools*POOL_SIZE/4;
1295 	DPRINTK("Shapers 0x%08lx\n",curr);
1296 	zpokel(zatm_dev,curr,uPD98401_SMA); /* shapers */
1297 	curr += NR_SHAPERS*SHAPER_SIZE/4;
1298 	DPRINTK("Free    0x%08lx\n",curr);
1299 	zpokel(zatm_dev,curr,uPD98401_TOS); /* free pool */
1300 	printk(KERN_INFO DEV_LABEL "(itf %d): %d shapers, %d pools, %d RX, "
1301 	    "%ld VCs\n",dev->number,NR_SHAPERS,pools,rx,
1302 	    (zatm_dev->mem-curr*4)/VC_SIZE);
1303 	/* create mailboxes */
1304 	for (i = 0; i < NR_MBX; i++) {
1305 		void *mbx;
1306 		dma_addr_t mbx_dma;
1307 
1308 		if (!mbx_entries[i])
1309 			continue;
1310 		mbx = dma_alloc_coherent(&pdev->dev,
1311 					 2 * MBX_SIZE(i), &mbx_dma, GFP_KERNEL);
1312 		if (!mbx) {
1313 			error = -ENOMEM;
1314 			goto out;
1315 		}
1316 		/*
1317 		 * Alignment provided by dma_alloc_coherent() isn't enough
1318 		 * for this device.
1319 		 */
1320 		if (((unsigned long)mbx ^ mbx_dma) & 0xffff) {
1321 			printk(KERN_ERR DEV_LABEL "(itf %d): system "
1322 			       "bus incompatible with driver\n", dev->number);
1323 			dma_free_coherent(&pdev->dev, 2*MBX_SIZE(i), mbx, mbx_dma);
1324 			error = -ENODEV;
1325 			goto out;
1326 		}
1327 		DPRINTK("mbx@0x%08lx-0x%08lx\n", mbx, mbx + MBX_SIZE(i));
1328 		zatm_dev->mbx_start[i] = (unsigned long)mbx;
1329 		zatm_dev->mbx_dma[i] = mbx_dma;
1330 		zatm_dev->mbx_end[i] = (zatm_dev->mbx_start[i] + MBX_SIZE(i)) &
1331 					0xffff;
1332 		zout(mbx_dma >> 16, MSH(i));
1333 		zout(mbx_dma, MSL(i));
1334 		zout(zatm_dev->mbx_end[i], MBA(i));
1335 		zout((unsigned long)mbx & 0xffff, MTA(i));
1336 		zout((unsigned long)mbx & 0xffff, MWA(i));
1337 	}
1338 	error = start_tx(dev);
1339 	if (error)
1340 		goto out;
1341 	error = start_rx(dev);
1342 	if (error)
1343 		goto out_tx;
1344 	error = dev->phy->start(dev);
1345 	if (error)
1346 		goto out_rx;
1347 	zout(0xffffffff,IMR); /* enable interrupts */
1348 	/* enable TX & RX */
1349 	zout(zin(GMR) | uPD98401_GMR_SE | uPD98401_GMR_RE,GMR);
1350 done:
1351 	return error;
1352 
1353 out_rx:
1354 	kfree(zatm_dev->rx_map);
1355 out_tx:
1356 	kfree(zatm_dev->tx_map);
1357 out:
1358 	while (i-- > 0) {
1359 		dma_free_coherent(&pdev->dev, 2 * MBX_SIZE(i),
1360 				  (void *)zatm_dev->mbx_start[i],
1361 				  zatm_dev->mbx_dma[i]);
1362 	}
1363 	free_irq(zatm_dev->irq, dev);
1364 	goto done;
1365 }
1366 
1367 
zatm_close(struct atm_vcc * vcc)1368 static void zatm_close(struct atm_vcc *vcc)
1369 {
1370         DPRINTK(">zatm_close\n");
1371         if (!ZATM_VCC(vcc)) return;
1372 	clear_bit(ATM_VF_READY,&vcc->flags);
1373         close_rx(vcc);
1374 	EVENT("close_tx\n",0,0);
1375         close_tx(vcc);
1376         DPRINTK("zatm_close: done waiting\n");
1377         /* deallocate memory */
1378         kfree(ZATM_VCC(vcc));
1379 	vcc->dev_data = NULL;
1380 	clear_bit(ATM_VF_ADDR,&vcc->flags);
1381 }
1382 
1383 
zatm_open(struct atm_vcc * vcc)1384 static int zatm_open(struct atm_vcc *vcc)
1385 {
1386 	struct zatm_dev *zatm_dev;
1387 	struct zatm_vcc *zatm_vcc;
1388 	short vpi = vcc->vpi;
1389 	int vci = vcc->vci;
1390 	int error;
1391 
1392 	DPRINTK(">zatm_open\n");
1393 	zatm_dev = ZATM_DEV(vcc->dev);
1394 	if (!test_bit(ATM_VF_PARTIAL,&vcc->flags))
1395 		vcc->dev_data = NULL;
1396 	if (vci != ATM_VPI_UNSPEC && vpi != ATM_VCI_UNSPEC)
1397 		set_bit(ATM_VF_ADDR,&vcc->flags);
1398 	if (vcc->qos.aal != ATM_AAL5) return -EINVAL; /* @@@ AAL0 */
1399 	DPRINTK(DEV_LABEL "(itf %d): open %d.%d\n",vcc->dev->number,vcc->vpi,
1400 	    vcc->vci);
1401 	if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) {
1402 		zatm_vcc = kmalloc(sizeof(struct zatm_vcc),GFP_KERNEL);
1403 		if (!zatm_vcc) {
1404 			clear_bit(ATM_VF_ADDR,&vcc->flags);
1405 			return -ENOMEM;
1406 		}
1407 		vcc->dev_data = zatm_vcc;
1408 		ZATM_VCC(vcc)->tx_chan = 0; /* for zatm_close after open_rx */
1409 		if ((error = open_rx_first(vcc))) {
1410 	                zatm_close(vcc);
1411 	                return error;
1412 	        }
1413 		if ((error = open_tx_first(vcc))) {
1414 			zatm_close(vcc);
1415 			return error;
1416 	        }
1417 	}
1418 	if (vci == ATM_VPI_UNSPEC || vpi == ATM_VCI_UNSPEC) return 0;
1419 	if ((error = open_rx_second(vcc))) {
1420 		zatm_close(vcc);
1421 		return error;
1422         }
1423 	if ((error = open_tx_second(vcc))) {
1424 		zatm_close(vcc);
1425 		return error;
1426         }
1427 	set_bit(ATM_VF_READY,&vcc->flags);
1428         return 0;
1429 }
1430 
1431 
zatm_change_qos(struct atm_vcc * vcc,struct atm_qos * qos,int flags)1432 static int zatm_change_qos(struct atm_vcc *vcc,struct atm_qos *qos,int flags)
1433 {
1434 	printk("Not yet implemented\n");
1435 	return -ENOSYS;
1436 	/* @@@ */
1437 }
1438 
1439 
zatm_ioctl(struct atm_dev * dev,unsigned int cmd,void __user * arg)1440 static int zatm_ioctl(struct atm_dev *dev,unsigned int cmd,void __user *arg)
1441 {
1442 	struct zatm_dev *zatm_dev;
1443 	unsigned long flags;
1444 
1445 	zatm_dev = ZATM_DEV(dev);
1446 	switch (cmd) {
1447 		case ZATM_GETPOOLZ:
1448 			if (!capable(CAP_NET_ADMIN)) return -EPERM;
1449 			/* fall through */
1450 		case ZATM_GETPOOL:
1451 			{
1452 				struct zatm_pool_info info;
1453 				int pool;
1454 
1455 				if (get_user(pool,
1456 				    &((struct zatm_pool_req __user *) arg)->pool_num))
1457 					return -EFAULT;
1458 				if (pool < 0 || pool > ZATM_LAST_POOL)
1459 					return -EINVAL;
1460 				pool = array_index_nospec(pool,
1461 							  ZATM_LAST_POOL + 1);
1462 				spin_lock_irqsave(&zatm_dev->lock, flags);
1463 				info = zatm_dev->pool_info[pool];
1464 				if (cmd == ZATM_GETPOOLZ) {
1465 					zatm_dev->pool_info[pool].rqa_count = 0;
1466 					zatm_dev->pool_info[pool].rqu_count = 0;
1467 				}
1468 				spin_unlock_irqrestore(&zatm_dev->lock, flags);
1469 				return copy_to_user(
1470 				    &((struct zatm_pool_req __user *) arg)->info,
1471 				    &info,sizeof(info)) ? -EFAULT : 0;
1472 			}
1473 		case ZATM_SETPOOL:
1474 			{
1475 				struct zatm_pool_info info;
1476 				int pool;
1477 
1478 				if (!capable(CAP_NET_ADMIN)) return -EPERM;
1479 				if (get_user(pool,
1480 				    &((struct zatm_pool_req __user *) arg)->pool_num))
1481 					return -EFAULT;
1482 				if (pool < 0 || pool > ZATM_LAST_POOL)
1483 					return -EINVAL;
1484 				pool = array_index_nospec(pool,
1485 							  ZATM_LAST_POOL + 1);
1486 				if (copy_from_user(&info,
1487 				    &((struct zatm_pool_req __user *) arg)->info,
1488 				    sizeof(info))) return -EFAULT;
1489 				if (!info.low_water)
1490 					info.low_water = zatm_dev->
1491 					    pool_info[pool].low_water;
1492 				if (!info.high_water)
1493 					info.high_water = zatm_dev->
1494 					    pool_info[pool].high_water;
1495 				if (!info.next_thres)
1496 					info.next_thres = zatm_dev->
1497 					    pool_info[pool].next_thres;
1498 				if (info.low_water >= info.high_water ||
1499 				    info.low_water < 0)
1500 					return -EINVAL;
1501 				spin_lock_irqsave(&zatm_dev->lock, flags);
1502 				zatm_dev->pool_info[pool].low_water =
1503 				    info.low_water;
1504 				zatm_dev->pool_info[pool].high_water =
1505 				    info.high_water;
1506 				zatm_dev->pool_info[pool].next_thres =
1507 				    info.next_thres;
1508 				spin_unlock_irqrestore(&zatm_dev->lock, flags);
1509 				return 0;
1510 			}
1511 		default:
1512         		if (!dev->phy->ioctl) return -ENOIOCTLCMD;
1513 		        return dev->phy->ioctl(dev,cmd,arg);
1514 	}
1515 }
1516 
1517 
zatm_getsockopt(struct atm_vcc * vcc,int level,int optname,void __user * optval,int optlen)1518 static int zatm_getsockopt(struct atm_vcc *vcc,int level,int optname,
1519     void __user *optval,int optlen)
1520 {
1521 	return -EINVAL;
1522 }
1523 
1524 
zatm_setsockopt(struct atm_vcc * vcc,int level,int optname,void __user * optval,unsigned int optlen)1525 static int zatm_setsockopt(struct atm_vcc *vcc,int level,int optname,
1526     void __user *optval,unsigned int optlen)
1527 {
1528 	return -EINVAL;
1529 }
1530 
zatm_send(struct atm_vcc * vcc,struct sk_buff * skb)1531 static int zatm_send(struct atm_vcc *vcc,struct sk_buff *skb)
1532 {
1533 	int error;
1534 
1535 	EVENT(">zatm_send 0x%lx\n",(unsigned long) skb,0);
1536 	if (!ZATM_VCC(vcc)->tx_chan || !test_bit(ATM_VF_READY,&vcc->flags)) {
1537 		if (vcc->pop) vcc->pop(vcc,skb);
1538 		else dev_kfree_skb(skb);
1539 		return -EINVAL;
1540 	}
1541 	if (!skb) {
1542 		printk(KERN_CRIT "!skb in zatm_send ?\n");
1543 		if (vcc->pop) vcc->pop(vcc,skb);
1544 		return -EINVAL;
1545 	}
1546 	ATM_SKB(skb)->vcc = vcc;
1547 	error = do_tx(skb);
1548 	if (error != RING_BUSY) return error;
1549 	skb_queue_tail(&ZATM_VCC(vcc)->backlog,skb);
1550 	return 0;
1551 }
1552 
1553 
zatm_phy_put(struct atm_dev * dev,unsigned char value,unsigned long addr)1554 static void zatm_phy_put(struct atm_dev *dev,unsigned char value,
1555     unsigned long addr)
1556 {
1557 	struct zatm_dev *zatm_dev;
1558 
1559 	zatm_dev = ZATM_DEV(dev);
1560 	zwait();
1561 	zout(value,CER);
1562 	zout(uPD98401_IND_ACC | uPD98401_IA_B0 |
1563 	    (uPD98401_IA_TGT_PHY << uPD98401_IA_TGT_SHIFT) | addr,CMR);
1564 }
1565 
1566 
zatm_phy_get(struct atm_dev * dev,unsigned long addr)1567 static unsigned char zatm_phy_get(struct atm_dev *dev,unsigned long addr)
1568 {
1569 	struct zatm_dev *zatm_dev;
1570 
1571 	zatm_dev = ZATM_DEV(dev);
1572 	zwait();
1573 	zout(uPD98401_IND_ACC | uPD98401_IA_B0 | uPD98401_IA_RW |
1574 	  (uPD98401_IA_TGT_PHY << uPD98401_IA_TGT_SHIFT) | addr,CMR);
1575 	zwait();
1576 	return zin(CER) & 0xff;
1577 }
1578 
1579 
1580 static const struct atmdev_ops ops = {
1581 	.open		= zatm_open,
1582 	.close		= zatm_close,
1583 	.ioctl		= zatm_ioctl,
1584 	.getsockopt	= zatm_getsockopt,
1585 	.setsockopt	= zatm_setsockopt,
1586 	.send		= zatm_send,
1587 	.phy_put	= zatm_phy_put,
1588 	.phy_get	= zatm_phy_get,
1589 	.change_qos	= zatm_change_qos,
1590 };
1591 
zatm_init_one(struct pci_dev * pci_dev,const struct pci_device_id * ent)1592 static int zatm_init_one(struct pci_dev *pci_dev,
1593 			 const struct pci_device_id *ent)
1594 {
1595 	struct atm_dev *dev;
1596 	struct zatm_dev *zatm_dev;
1597 	int ret = -ENOMEM;
1598 
1599 	zatm_dev = kmalloc(sizeof(*zatm_dev), GFP_KERNEL);
1600 	if (!zatm_dev) {
1601 		printk(KERN_EMERG "%s: memory shortage\n", DEV_LABEL);
1602 		goto out;
1603 	}
1604 
1605 	dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &ops, -1, NULL);
1606 	if (!dev)
1607 		goto out_free;
1608 
1609 	ret = pci_enable_device(pci_dev);
1610 	if (ret < 0)
1611 		goto out_deregister;
1612 
1613 	ret = pci_request_regions(pci_dev, DEV_LABEL);
1614 	if (ret < 0)
1615 		goto out_disable;
1616 
1617 	ret = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32));
1618 	if (ret < 0)
1619 		goto out_disable;
1620 
1621 	zatm_dev->pci_dev = pci_dev;
1622 	dev->dev_data = zatm_dev;
1623 	zatm_dev->copper = (int)ent->driver_data;
1624 	if ((ret = zatm_init(dev)) || (ret = zatm_start(dev)))
1625 		goto out_release;
1626 
1627 	pci_set_drvdata(pci_dev, dev);
1628 	zatm_dev->more = zatm_boards;
1629 	zatm_boards = dev;
1630 	ret = 0;
1631 out:
1632 	return ret;
1633 
1634 out_release:
1635 	pci_release_regions(pci_dev);
1636 out_disable:
1637 	pci_disable_device(pci_dev);
1638 out_deregister:
1639 	atm_dev_deregister(dev);
1640 out_free:
1641 	kfree(zatm_dev);
1642 	goto out;
1643 }
1644 
1645 
1646 MODULE_LICENSE("GPL");
1647 
1648 static struct pci_device_id zatm_pci_tbl[] = {
1649 	{ PCI_VDEVICE(ZEITNET, PCI_DEVICE_ID_ZEITNET_1221), ZATM_COPPER },
1650 	{ PCI_VDEVICE(ZEITNET, PCI_DEVICE_ID_ZEITNET_1225), 0 },
1651 	{ 0, }
1652 };
1653 MODULE_DEVICE_TABLE(pci, zatm_pci_tbl);
1654 
1655 static struct pci_driver zatm_driver = {
1656 	.name =		DEV_LABEL,
1657 	.id_table =	zatm_pci_tbl,
1658 	.probe =	zatm_init_one,
1659 };
1660 
zatm_init_module(void)1661 static int __init zatm_init_module(void)
1662 {
1663 	return pci_register_driver(&zatm_driver);
1664 }
1665 
1666 module_init(zatm_init_module);
1667 /* module_exit not defined so not unloadable */
1668