xref: /linux/drivers/atm/iphase.c (revision 7effbd18e496a954540fb6319db0d87d28a70496)
1 /******************************************************************************
2          iphase.c: Device driver for Interphase ATM PCI adapter cards
3                     Author: Peter Wang  <pwang@iphase.com>
4 		   Some fixes: Arnaldo Carvalho de Melo <acme@conectiva.com.br>
5                    Interphase Corporation  <www.iphase.com>
6                                Version: 1.0
7 *******************************************************************************
8 
9       This software may be used and distributed according to the terms
10       of the GNU General Public License (GPL), incorporated herein by reference.
11       Drivers based on this skeleton fall under the GPL and must retain
12       the authorship (implicit copyright) notice.
13 
14       This program is distributed in the hope that it will be useful, but
15       WITHOUT ANY WARRANTY; without even the implied warranty of
16       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17       General Public License for more details.
18 
19       Modified from an incomplete driver for Interphase 5575 1KVC 1M card which
20       was originally written by Monalisa Agrawal at UNH. Now this driver
21       supports a variety of varients of Interphase ATM PCI (i)Chip adapter
22       card family (See www.iphase.com/products/ClassSheet.cfm?ClassID=ATM)
23       in terms of PHY type, the size of control memory and the size of
24       packet memory. The following are the change log and history:
25 
26           Bugfix the Mona's UBR driver.
27           Modify the basic memory allocation and dma logic.
28           Port the driver to the latest kernel from 2.0.46.
29           Complete the ABR logic of the driver, and added the ABR work-
30               around for the hardware anormalies.
31           Add the CBR support.
32 	  Add the flow control logic to the driver to allow rate-limit VC.
33           Add 4K VC support to the board with 512K control memory.
34           Add the support of all the variants of the Interphase ATM PCI
35           (i)Chip adapter cards including x575 (155M OC3 and UTP155), x525
36           (25M UTP25) and x531 (DS3 and E3).
37           Add SMP support.
38 
39       Support and updates available at: ftp://ftp.iphase.com/pub/atm
40 
41 *******************************************************************************/
42 
43 #include <linux/module.h>
44 #include <linux/kernel.h>
45 #include <linux/mm.h>
46 #include <linux/pci.h>
47 #include <linux/errno.h>
48 #include <linux/atm.h>
49 #include <linux/atmdev.h>
50 #include <linux/ctype.h>
51 #include <linux/sonet.h>
52 #include <linux/skbuff.h>
53 #include <linux/time.h>
54 #include <linux/delay.h>
55 #include <linux/uio.h>
56 #include <linux/init.h>
57 #include <linux/interrupt.h>
58 #include <linux/wait.h>
59 #include <linux/slab.h>
60 #include <asm/io.h>
61 #include <linux/atomic.h>
62 #include <linux/uaccess.h>
63 #include <asm/string.h>
64 #include <asm/byteorder.h>
65 #include <linux/vmalloc.h>
66 #include <linux/jiffies.h>
67 #include <linux/nospec.h>
68 #include "iphase.h"
69 #include "suni.h"
70 #define swap_byte_order(x) (((x & 0xff) << 8) | ((x & 0xff00) >> 8))
71 
72 #define PRIV(dev) ((struct suni_priv *) dev->phy_data)
73 
74 static unsigned char ia_phy_get(struct atm_dev *dev, unsigned long addr);
75 static void desc_dbg(IADEV *iadev);
76 
77 static IADEV *ia_dev[8];
78 static struct atm_dev *_ia_dev[8];
79 static int iadev_count;
80 static void ia_led_timer(struct timer_list *unused);
81 static DEFINE_TIMER(ia_timer, ia_led_timer);
82 static int IA_TX_BUF = DFL_TX_BUFFERS, IA_TX_BUF_SZ = DFL_TX_BUF_SZ;
83 static int IA_RX_BUF = DFL_RX_BUFFERS, IA_RX_BUF_SZ = DFL_RX_BUF_SZ;
84 static uint IADebugFlag = /* IF_IADBG_ERR | IF_IADBG_CBR| IF_IADBG_INIT_ADAPTER
85             |IF_IADBG_ABR | IF_IADBG_EVENT*/ 0;
86 
87 module_param(IA_TX_BUF, int, 0);
88 module_param(IA_TX_BUF_SZ, int, 0);
89 module_param(IA_RX_BUF, int, 0);
90 module_param(IA_RX_BUF_SZ, int, 0);
91 module_param(IADebugFlag, uint, 0644);
92 
93 MODULE_LICENSE("GPL");
94 
95 /**************************** IA_LIB **********************************/
96 
97 static void ia_init_rtn_q (IARTN_Q *que)
98 {
99    que->next = NULL;
100    que->tail = NULL;
101 }
102 
103 static void ia_enque_head_rtn_q (IARTN_Q *que, IARTN_Q * data)
104 {
105    data->next = NULL;
106    if (que->next == NULL)
107       que->next = que->tail = data;
108    else {
109       data->next = que->next;
110       que->next = data;
111    }
112    return;
113 }
114 
115 static int ia_enque_rtn_q (IARTN_Q *que, struct desc_tbl_t data) {
116    IARTN_Q *entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
117    if (!entry)
118       return -ENOMEM;
119    entry->data = data;
120    entry->next = NULL;
121    if (que->next == NULL)
122       que->next = que->tail = entry;
123    else {
124       que->tail->next = entry;
125       que->tail = que->tail->next;
126    }
127    return 1;
128 }
129 
130 static IARTN_Q * ia_deque_rtn_q (IARTN_Q *que) {
131    IARTN_Q *tmpdata;
132    if (que->next == NULL)
133       return NULL;
134    tmpdata = que->next;
135    if ( que->next == que->tail)
136       que->next = que->tail = NULL;
137    else
138       que->next = que->next->next;
139    return tmpdata;
140 }
141 
142 static void ia_hack_tcq(IADEV *dev) {
143 
144   u_short 		desc1;
145   u_short		tcq_wr;
146   struct ia_vcc         *iavcc_r = NULL;
147 
148   tcq_wr = readl(dev->seg_reg+TCQ_WR_PTR) & 0xffff;
149   while (dev->host_tcq_wr != tcq_wr) {
150      desc1 = *(u_short *)(dev->seg_ram + dev->host_tcq_wr);
151      if (!desc1) ;
152      else if (!dev->desc_tbl[desc1 -1].timestamp) {
153         IF_ABR(printk(" Desc %d is reset at %ld\n", desc1 -1, jiffies);)
154         *(u_short *) (dev->seg_ram + dev->host_tcq_wr) = 0;
155      }
156      else if (dev->desc_tbl[desc1 -1].timestamp) {
157         if (!(iavcc_r = dev->desc_tbl[desc1 -1].iavcc)) {
158            printk("IA: Fatal err in get_desc\n");
159            continue;
160         }
161         iavcc_r->vc_desc_cnt--;
162         dev->desc_tbl[desc1 -1].timestamp = 0;
163         IF_EVENT(printk("ia_hack: return_q skb = 0x%p desc = %d\n",
164                                    dev->desc_tbl[desc1 -1].txskb, desc1);)
165         if (iavcc_r->pcr < dev->rate_limit) {
166            IA_SKB_STATE (dev->desc_tbl[desc1-1].txskb) |= IA_TX_DONE;
167            if (ia_enque_rtn_q(&dev->tx_return_q, dev->desc_tbl[desc1 -1]) < 0)
168               printk("ia_hack_tcq: No memory available\n");
169         }
170         dev->desc_tbl[desc1 -1].iavcc = NULL;
171         dev->desc_tbl[desc1 -1].txskb = NULL;
172      }
173      dev->host_tcq_wr += 2;
174      if (dev->host_tcq_wr > dev->ffL.tcq_ed)
175         dev->host_tcq_wr = dev->ffL.tcq_st;
176   }
177 } /* ia_hack_tcq */
178 
179 static u16 get_desc (IADEV *dev, struct ia_vcc *iavcc) {
180   u_short 		desc_num, i;
181   struct ia_vcc         *iavcc_r = NULL;
182   unsigned long delta;
183   static unsigned long timer = 0;
184   int ltimeout;
185 
186   ia_hack_tcq (dev);
187   if((time_after(jiffies,timer+50)) || ((dev->ffL.tcq_rd==dev->host_tcq_wr))) {
188      timer = jiffies;
189      i=0;
190      while (i < dev->num_tx_desc) {
191         if (!dev->desc_tbl[i].timestamp) {
192            i++;
193            continue;
194         }
195         ltimeout = dev->desc_tbl[i].iavcc->ltimeout;
196         delta = jiffies - dev->desc_tbl[i].timestamp;
197         if (delta >= ltimeout) {
198            IF_ABR(printk("RECOVER run!! desc_tbl %d = %d  delta = %ld, time = %ld\n", i,dev->desc_tbl[i].timestamp, delta, jiffies);)
199            if (dev->ffL.tcq_rd == dev->ffL.tcq_st)
200               dev->ffL.tcq_rd =  dev->ffL.tcq_ed;
201            else
202               dev->ffL.tcq_rd -= 2;
203            *(u_short *)(dev->seg_ram + dev->ffL.tcq_rd) = i+1;
204            if (!dev->desc_tbl[i].txskb || !(iavcc_r = dev->desc_tbl[i].iavcc))
205               printk("Fatal err, desc table vcc or skb is NULL\n");
206            else
207               iavcc_r->vc_desc_cnt--;
208            dev->desc_tbl[i].timestamp = 0;
209            dev->desc_tbl[i].iavcc = NULL;
210            dev->desc_tbl[i].txskb = NULL;
211         }
212         i++;
213      } /* while */
214   }
215   if (dev->ffL.tcq_rd == dev->host_tcq_wr)
216      return 0xFFFF;
217 
218   /* Get the next available descriptor number from TCQ */
219   desc_num = *(u_short *)(dev->seg_ram + dev->ffL.tcq_rd);
220 
221   while (!desc_num || (dev->desc_tbl[desc_num -1]).timestamp) {
222      dev->ffL.tcq_rd += 2;
223      if (dev->ffL.tcq_rd > dev->ffL.tcq_ed)
224 	dev->ffL.tcq_rd = dev->ffL.tcq_st;
225      if (dev->ffL.tcq_rd == dev->host_tcq_wr)
226         return 0xFFFF;
227      desc_num = *(u_short *)(dev->seg_ram + dev->ffL.tcq_rd);
228   }
229 
230   /* get system time */
231   dev->desc_tbl[desc_num -1].timestamp = jiffies;
232   return desc_num;
233 }
234 
235 static void clear_lockup (struct atm_vcc *vcc, IADEV *dev) {
236   u_char          	foundLockUp;
237   vcstatus_t		*vcstatus;
238   u_short               *shd_tbl;
239   u_short               tempCellSlot, tempFract;
240   struct main_vc *abr_vc = (struct main_vc *)dev->MAIN_VC_TABLE_ADDR;
241   struct ext_vc *eabr_vc = (struct ext_vc *)dev->EXT_VC_TABLE_ADDR;
242   u_int  i;
243 
244   if (vcc->qos.txtp.traffic_class == ATM_ABR) {
245      vcstatus = (vcstatus_t *) &(dev->testTable[vcc->vci]->vc_status);
246      vcstatus->cnt++;
247      foundLockUp = 0;
248      if( vcstatus->cnt == 0x05 ) {
249         abr_vc += vcc->vci;
250 	eabr_vc += vcc->vci;
251 	if( eabr_vc->last_desc ) {
252 	   if( (abr_vc->status & 0x07) == ABR_STATE /* 0x2 */ ) {
253               /* Wait for 10 Micro sec */
254               udelay(10);
255 	      if ((eabr_vc->last_desc)&&((abr_vc->status & 0x07)==ABR_STATE))
256 		 foundLockUp = 1;
257            }
258 	   else {
259 	      tempCellSlot = abr_vc->last_cell_slot;
260               tempFract    = abr_vc->fraction;
261               if((tempCellSlot == dev->testTable[vcc->vci]->lastTime)
262                          && (tempFract == dev->testTable[vcc->vci]->fract))
263 	         foundLockUp = 1;
264               dev->testTable[vcc->vci]->lastTime = tempCellSlot;
265               dev->testTable[vcc->vci]->fract = tempFract;
266 	   }
267         } /* last descriptor */
268         vcstatus->cnt = 0;
269      } /* vcstatus->cnt */
270 
271      if (foundLockUp) {
272         IF_ABR(printk("LOCK UP found\n");)
273 	writew(0xFFFD, dev->seg_reg+MODE_REG_0);
274         /* Wait for 10 Micro sec */
275         udelay(10);
276         abr_vc->status &= 0xFFF8;
277         abr_vc->status |= 0x0001;  /* state is idle */
278 	shd_tbl = (u_short *)dev->ABR_SCHED_TABLE_ADDR;
279 	for( i = 0; ((i < dev->num_vc) && (shd_tbl[i])); i++ );
280 	if (i < dev->num_vc)
281            shd_tbl[i] = vcc->vci;
282         else
283            IF_ERR(printk("ABR Seg. may not continue on VC %x\n",vcc->vci);)
284         writew(T_ONLINE, dev->seg_reg+MODE_REG_0);
285         writew(~(TRANSMIT_DONE|TCQ_NOT_EMPTY), dev->seg_reg+SEG_MASK_REG);
286         writew(TRANSMIT_DONE, dev->seg_reg+SEG_INTR_STATUS_REG);
287 	vcstatus->cnt = 0;
288      } /* foundLockUp */
289 
290   } /* if an ABR VC */
291 
292 
293 }
294 
295 /*
296 ** Conversion of 24-bit cellrate (cells/sec) to 16-bit floating point format.
297 **
298 **  +----+----+------------------+-------------------------------+
299 **  |  R | NZ |  5-bit exponent  |        9-bit mantissa         |
300 **  +----+----+------------------+-------------------------------+
301 **
302 **    R = reserved (written as 0)
303 **    NZ = 0 if 0 cells/sec; 1 otherwise
304 **
305 **    if NZ = 1, rate = 1.mmmmmmmmm x 2^(eeeee) cells/sec
306 */
307 static u16
308 cellrate_to_float(u32 cr)
309 {
310 
311 #define	NZ 		0x4000
312 #define	M_BITS		9		/* Number of bits in mantissa */
313 #define	E_BITS		5		/* Number of bits in exponent */
314 #define	M_MASK		0x1ff
315 #define	E_MASK		0x1f
316   u16   flot;
317   u32	tmp = cr & 0x00ffffff;
318   int 	i   = 0;
319   if (cr == 0)
320      return 0;
321   while (tmp != 1) {
322      tmp >>= 1;
323      i++;
324   }
325   if (i == M_BITS)
326      flot = NZ | (i << M_BITS) | (cr & M_MASK);
327   else if (i < M_BITS)
328      flot = NZ | (i << M_BITS) | ((cr << (M_BITS - i)) & M_MASK);
329   else
330      flot = NZ | (i << M_BITS) | ((cr >> (i - M_BITS)) & M_MASK);
331   return flot;
332 }
333 
334 #if 0
335 /*
336 ** Conversion of 16-bit floating point format to 24-bit cellrate (cells/sec).
337 */
338 static u32
339 float_to_cellrate(u16 rate)
340 {
341   u32   exp, mantissa, cps;
342   if ((rate & NZ) == 0)
343      return 0;
344   exp = (rate >> M_BITS) & E_MASK;
345   mantissa = rate & M_MASK;
346   if (exp == 0)
347      return 1;
348   cps = (1 << M_BITS) | mantissa;
349   if (exp == M_BITS)
350      cps = cps;
351   else if (exp > M_BITS)
352      cps <<= (exp - M_BITS);
353   else
354      cps >>= (M_BITS - exp);
355   return cps;
356 }
357 #endif
358 
359 static void init_abr_vc (IADEV *dev, srv_cls_param_t *srv_p) {
360   srv_p->class_type = ATM_ABR;
361   srv_p->pcr        = dev->LineRate;
362   srv_p->mcr        = 0;
363   srv_p->icr        = 0x055cb7;
364   srv_p->tbe        = 0xffffff;
365   srv_p->frtt       = 0x3a;
366   srv_p->rif        = 0xf;
367   srv_p->rdf        = 0xb;
368   srv_p->nrm        = 0x4;
369   srv_p->trm        = 0x7;
370   srv_p->cdf        = 0x3;
371   srv_p->adtf       = 50;
372 }
373 
374 static int
375 ia_open_abr_vc(IADEV *dev, srv_cls_param_t *srv_p,
376                                                 struct atm_vcc *vcc, u8 flag)
377 {
378   f_vc_abr_entry  *f_abr_vc;
379   r_vc_abr_entry  *r_abr_vc;
380   u32		icr;
381   u8		trm, nrm, crm;
382   u16		adtf, air, *ptr16;
383   f_abr_vc =(f_vc_abr_entry *)dev->MAIN_VC_TABLE_ADDR;
384   f_abr_vc += vcc->vci;
385   switch (flag) {
386      case 1: /* FFRED initialization */
387 #if 0  /* sanity check */
388        if (srv_p->pcr == 0)
389           return INVALID_PCR;
390        if (srv_p->pcr > dev->LineRate)
391           srv_p->pcr = dev->LineRate;
392        if ((srv_p->mcr + dev->sum_mcr) > dev->LineRate)
393 	  return MCR_UNAVAILABLE;
394        if (srv_p->mcr > srv_p->pcr)
395 	  return INVALID_MCR;
396        if (!(srv_p->icr))
397 	  srv_p->icr = srv_p->pcr;
398        if ((srv_p->icr < srv_p->mcr) || (srv_p->icr > srv_p->pcr))
399 	  return INVALID_ICR;
400        if ((srv_p->tbe < MIN_TBE) || (srv_p->tbe > MAX_TBE))
401 	  return INVALID_TBE;
402        if ((srv_p->frtt < MIN_FRTT) || (srv_p->frtt > MAX_FRTT))
403 	  return INVALID_FRTT;
404        if (srv_p->nrm > MAX_NRM)
405 	  return INVALID_NRM;
406        if (srv_p->trm > MAX_TRM)
407 	  return INVALID_TRM;
408        if (srv_p->adtf > MAX_ADTF)
409           return INVALID_ADTF;
410        else if (srv_p->adtf == 0)
411 	  srv_p->adtf = 1;
412        if (srv_p->cdf > MAX_CDF)
413 	  return INVALID_CDF;
414        if (srv_p->rif > MAX_RIF)
415 	  return INVALID_RIF;
416        if (srv_p->rdf > MAX_RDF)
417 	  return INVALID_RDF;
418 #endif
419        memset ((caddr_t)f_abr_vc, 0, sizeof(*f_abr_vc));
420        f_abr_vc->f_vc_type = ABR;
421        nrm = 2 << srv_p->nrm;     /* (2 ** (srv_p->nrm +1)) */
422 			          /* i.e 2**n = 2 << (n-1) */
423        f_abr_vc->f_nrm = nrm << 8 | nrm;
424        trm = 100000/(2 << (16 - srv_p->trm));
425        if ( trm == 0) trm = 1;
426        f_abr_vc->f_nrmexp =(((srv_p->nrm +1) & 0x0f) << 12)|(MRM << 8) | trm;
427        crm = srv_p->tbe / nrm;
428        if (crm == 0) crm = 1;
429        f_abr_vc->f_crm = crm & 0xff;
430        f_abr_vc->f_pcr = cellrate_to_float(srv_p->pcr);
431        icr = min( srv_p->icr, (srv_p->tbe > srv_p->frtt) ?
432 				((srv_p->tbe/srv_p->frtt)*1000000) :
433 				(1000000/(srv_p->frtt/srv_p->tbe)));
434        f_abr_vc->f_icr = cellrate_to_float(icr);
435        adtf = (10000 * srv_p->adtf)/8192;
436        if (adtf == 0) adtf = 1;
437        f_abr_vc->f_cdf = ((7 - srv_p->cdf) << 12 | adtf) & 0xfff;
438        f_abr_vc->f_mcr = cellrate_to_float(srv_p->mcr);
439        f_abr_vc->f_acr = f_abr_vc->f_icr;
440        f_abr_vc->f_status = 0x0042;
441        break;
442     case 0: /* RFRED initialization */
443        ptr16 = (u_short *)(dev->reass_ram + REASS_TABLE*dev->memSize);
444        *(ptr16 + vcc->vci) = NO_AAL5_PKT | REASS_ABR;
445        r_abr_vc = (r_vc_abr_entry*)(dev->reass_ram+ABR_VC_TABLE*dev->memSize);
446        r_abr_vc += vcc->vci;
447        r_abr_vc->r_status_rdf = (15 - srv_p->rdf) & 0x000f;
448        air = srv_p->pcr << (15 - srv_p->rif);
449        if (air == 0) air = 1;
450        r_abr_vc->r_air = cellrate_to_float(air);
451        dev->testTable[vcc->vci]->vc_status = VC_ACTIVE | VC_ABR;
452        dev->sum_mcr	   += srv_p->mcr;
453        dev->n_abr++;
454        break;
455     default:
456        break;
457   }
458   return	0;
459 }
460 static int ia_cbr_setup (IADEV *dev, struct atm_vcc *vcc) {
461    u32 rateLow=0, rateHigh, rate;
462    int entries;
463    struct ia_vcc *ia_vcc;
464 
465    int   idealSlot =0, testSlot, toBeAssigned, inc;
466    u32   spacing;
467    u16  *SchedTbl, *TstSchedTbl;
468    u16  cbrVC, vcIndex;
469    u32   fracSlot    = 0;
470    u32   sp_mod      = 0;
471    u32   sp_mod2     = 0;
472 
473    /* IpAdjustTrafficParams */
474    if (vcc->qos.txtp.max_pcr <= 0) {
475       IF_ERR(printk("PCR for CBR not defined\n");)
476       return -1;
477    }
478    rate = vcc->qos.txtp.max_pcr;
479    entries = rate / dev->Granularity;
480    IF_CBR(printk("CBR: CBR entries=0x%x for rate=0x%x & Gran=0x%x\n",
481                                 entries, rate, dev->Granularity);)
482    if (entries < 1)
483       IF_CBR(printk("CBR: Bandwidth smaller than granularity of CBR table\n");)
484    rateLow  =  entries * dev->Granularity;
485    rateHigh = (entries + 1) * dev->Granularity;
486    if (3*(rate - rateLow) > (rateHigh - rate))
487       entries++;
488    if (entries > dev->CbrRemEntries) {
489       IF_CBR(printk("CBR: Not enough bandwidth to support this PCR.\n");)
490       IF_CBR(printk("Entries = 0x%x, CbrRemEntries = 0x%x.\n",
491                                        entries, dev->CbrRemEntries);)
492       return -EBUSY;
493    }
494 
495    ia_vcc = INPH_IA_VCC(vcc);
496    ia_vcc->NumCbrEntry = entries;
497    dev->sum_mcr += entries * dev->Granularity;
498    /* IaFFrednInsertCbrSched */
499    // Starting at an arbitrary location, place the entries into the table
500    // as smoothly as possible
501    cbrVC   = 0;
502    spacing = dev->CbrTotEntries / entries;
503    sp_mod  = dev->CbrTotEntries % entries; // get modulo
504    toBeAssigned = entries;
505    fracSlot = 0;
506    vcIndex  = vcc->vci;
507    IF_CBR(printk("Vci=0x%x,Spacing=0x%x,Sp_mod=0x%x\n",vcIndex,spacing,sp_mod);)
508    while (toBeAssigned)
509    {
510       // If this is the first time, start the table loading for this connection
511       // as close to entryPoint as possible.
512       if (toBeAssigned == entries)
513       {
514          idealSlot = dev->CbrEntryPt;
515          dev->CbrEntryPt += 2;    // Adding 2 helps to prevent clumping
516          if (dev->CbrEntryPt >= dev->CbrTotEntries)
517             dev->CbrEntryPt -= dev->CbrTotEntries;// Wrap if necessary
518       } else {
519          idealSlot += (u32)(spacing + fracSlot); // Point to the next location
520          // in the table that would be  smoothest
521          fracSlot = ((sp_mod + sp_mod2) / entries);  // get new integer part
522          sp_mod2  = ((sp_mod + sp_mod2) % entries);  // calc new fractional part
523       }
524       if (idealSlot >= (int)dev->CbrTotEntries)
525          idealSlot -= dev->CbrTotEntries;
526       // Continuously check around this ideal value until a null
527       // location is encountered.
528       SchedTbl = (u16*)(dev->seg_ram+CBR_SCHED_TABLE*dev->memSize);
529       inc = 0;
530       testSlot = idealSlot;
531       TstSchedTbl = (u16*)(SchedTbl+testSlot);  //set index and read in value
532       IF_CBR(printk("CBR Testslot 0x%x AT Location 0x%p, NumToAssign=%d\n",
533                                 testSlot, TstSchedTbl,toBeAssigned);)
534       memcpy((caddr_t)&cbrVC,(caddr_t)TstSchedTbl,sizeof(cbrVC));
535       while (cbrVC)  // If another VC at this location, we have to keep looking
536       {
537           inc++;
538           testSlot = idealSlot - inc;
539           if (testSlot < 0) { // Wrap if necessary
540              testSlot += dev->CbrTotEntries;
541              IF_CBR(printk("Testslot Wrap. STable Start=0x%p,Testslot=%d\n",
542                                                        SchedTbl,testSlot);)
543           }
544           TstSchedTbl = (u16 *)(SchedTbl + testSlot);  // set table index
545           memcpy((caddr_t)&cbrVC,(caddr_t)TstSchedTbl,sizeof(cbrVC));
546           if (!cbrVC)
547              break;
548           testSlot = idealSlot + inc;
549           if (testSlot >= (int)dev->CbrTotEntries) { // Wrap if necessary
550              testSlot -= dev->CbrTotEntries;
551              IF_CBR(printk("TotCbrEntries=%d",dev->CbrTotEntries);)
552              IF_CBR(printk(" Testslot=0x%x ToBeAssgned=%d\n",
553                                             testSlot, toBeAssigned);)
554           }
555           // set table index and read in value
556           TstSchedTbl = (u16*)(SchedTbl + testSlot);
557           IF_CBR(printk("Reading CBR Tbl from 0x%p, CbrVal=0x%x Iteration %d\n",
558                           TstSchedTbl,cbrVC,inc);)
559           memcpy((caddr_t)&cbrVC,(caddr_t)TstSchedTbl,sizeof(cbrVC));
560        } /* while */
561        // Move this VCI number into this location of the CBR Sched table.
562        memcpy((caddr_t)TstSchedTbl, (caddr_t)&vcIndex, sizeof(*TstSchedTbl));
563        dev->CbrRemEntries--;
564        toBeAssigned--;
565    } /* while */
566 
567    /* IaFFrednCbrEnable */
568    dev->NumEnabledCBR++;
569    if (dev->NumEnabledCBR == 1) {
570        writew((CBR_EN | UBR_EN | ABR_EN | (0x23 << 2)), dev->seg_reg+STPARMS);
571        IF_CBR(printk("CBR is enabled\n");)
572    }
573    return 0;
574 }
575 static void ia_cbrVc_close (struct atm_vcc *vcc) {
576    IADEV *iadev;
577    u16 *SchedTbl, NullVci = 0;
578    u32 i, NumFound;
579 
580    iadev = INPH_IA_DEV(vcc->dev);
581    iadev->NumEnabledCBR--;
582    SchedTbl = (u16*)(iadev->seg_ram+CBR_SCHED_TABLE*iadev->memSize);
583    if (iadev->NumEnabledCBR == 0) {
584       writew((UBR_EN | ABR_EN | (0x23 << 2)), iadev->seg_reg+STPARMS);
585       IF_CBR (printk("CBR support disabled\n");)
586    }
587    NumFound = 0;
588    for (i=0; i < iadev->CbrTotEntries; i++)
589    {
590       if (*SchedTbl == vcc->vci) {
591          iadev->CbrRemEntries++;
592          *SchedTbl = NullVci;
593          IF_CBR(NumFound++;)
594       }
595       SchedTbl++;
596    }
597    IF_CBR(printk("Exit ia_cbrVc_close, NumRemoved=%d\n",NumFound);)
598 }
599 
600 static int ia_avail_descs(IADEV *iadev) {
601    int tmp = 0;
602    ia_hack_tcq(iadev);
603    if (iadev->host_tcq_wr >= iadev->ffL.tcq_rd)
604       tmp = (iadev->host_tcq_wr - iadev->ffL.tcq_rd) / 2;
605    else
606       tmp = (iadev->ffL.tcq_ed - iadev->ffL.tcq_rd + 2 + iadev->host_tcq_wr -
607                    iadev->ffL.tcq_st) / 2;
608    return tmp;
609 }
610 
611 static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb);
612 
613 static int ia_que_tx (IADEV *iadev) {
614    struct sk_buff *skb;
615    int num_desc;
616    struct atm_vcc *vcc;
617    num_desc = ia_avail_descs(iadev);
618 
619    while (num_desc && (skb = skb_dequeue(&iadev->tx_backlog))) {
620       if (!(vcc = ATM_SKB(skb)->vcc)) {
621          dev_kfree_skb_any(skb);
622          printk("ia_que_tx: Null vcc\n");
623          break;
624       }
625       if (!test_bit(ATM_VF_READY,&vcc->flags)) {
626          dev_kfree_skb_any(skb);
627          printk("Free the SKB on closed vci %d \n", vcc->vci);
628          break;
629       }
630       if (ia_pkt_tx (vcc, skb)) {
631          skb_queue_head(&iadev->tx_backlog, skb);
632       }
633       num_desc--;
634    }
635    return 0;
636 }
637 
638 static void ia_tx_poll (IADEV *iadev) {
639    struct atm_vcc *vcc = NULL;
640    struct sk_buff *skb = NULL, *skb1 = NULL;
641    struct ia_vcc *iavcc;
642    IARTN_Q *  rtne;
643 
644    ia_hack_tcq(iadev);
645    while ( (rtne = ia_deque_rtn_q(&iadev->tx_return_q))) {
646        skb = rtne->data.txskb;
647        if (!skb) {
648            printk("ia_tx_poll: skb is null\n");
649            goto out;
650        }
651        vcc = ATM_SKB(skb)->vcc;
652        if (!vcc) {
653            printk("ia_tx_poll: vcc is null\n");
654            dev_kfree_skb_any(skb);
655 	   goto out;
656        }
657 
658        iavcc = INPH_IA_VCC(vcc);
659        if (!iavcc) {
660            printk("ia_tx_poll: iavcc is null\n");
661            dev_kfree_skb_any(skb);
662 	   goto out;
663        }
664 
665        skb1 = skb_dequeue(&iavcc->txing_skb);
666        while (skb1 && (skb1 != skb)) {
667           if (!(IA_SKB_STATE(skb1) & IA_TX_DONE)) {
668              printk("IA_tx_intr: Vci %d lost pkt!!!\n", vcc->vci);
669           }
670           IF_ERR(printk("Release the SKB not match\n");)
671           if ((vcc->pop) && (skb1->len != 0))
672           {
673              vcc->pop(vcc, skb1);
674              IF_EVENT(printk("Transmit Done - skb 0x%lx return\n",
675                                                           (long)skb1);)
676           }
677           else
678              dev_kfree_skb_any(skb1);
679           skb1 = skb_dequeue(&iavcc->txing_skb);
680        }
681        if (!skb1) {
682           IF_EVENT(printk("IA: Vci %d - skb not found requeued\n",vcc->vci);)
683           ia_enque_head_rtn_q (&iadev->tx_return_q, rtne);
684           break;
685        }
686        if ((vcc->pop) && (skb->len != 0))
687        {
688           vcc->pop(vcc, skb);
689           IF_EVENT(printk("Tx Done - skb 0x%lx return\n",(long)skb);)
690        }
691        else
692           dev_kfree_skb_any(skb);
693        kfree(rtne);
694     }
695     ia_que_tx(iadev);
696 out:
697     return;
698 }
699 #if 0
700 static void ia_eeprom_put (IADEV *iadev, u32 addr, u_short val)
701 {
702         u32	t;
703 	int	i;
704 	/*
705 	 * Issue a command to enable writes to the NOVRAM
706 	 */
707 	NVRAM_CMD (EXTEND + EWEN);
708 	NVRAM_CLR_CE;
709 	/*
710 	 * issue the write command
711 	 */
712 	NVRAM_CMD(IAWRITE + addr);
713 	/*
714 	 * Send the data, starting with D15, then D14, and so on for 16 bits
715 	 */
716 	for (i=15; i>=0; i--) {
717 		NVRAM_CLKOUT (val & 0x8000);
718 		val <<= 1;
719 	}
720 	NVRAM_CLR_CE;
721 	CFG_OR(NVCE);
722 	t = readl(iadev->reg+IPHASE5575_EEPROM_ACCESS);
723 	while (!(t & NVDO))
724 		t = readl(iadev->reg+IPHASE5575_EEPROM_ACCESS);
725 
726 	NVRAM_CLR_CE;
727 	/*
728 	 * disable writes again
729 	 */
730 	NVRAM_CMD(EXTEND + EWDS)
731 	NVRAM_CLR_CE;
732 	CFG_AND(~NVDI);
733 }
734 #endif
735 
736 static u16 ia_eeprom_get (IADEV *iadev, u32 addr)
737 {
738 	u_short	val;
739         u32	t;
740 	int	i;
741 	/*
742 	 * Read the first bit that was clocked with the falling edge of
743 	 * the last command data clock
744 	 */
745 	NVRAM_CMD(IAREAD + addr);
746 	/*
747 	 * Now read the rest of the bits, the next bit read is D14, then D13,
748 	 * and so on.
749 	 */
750 	val = 0;
751 	for (i=15; i>=0; i--) {
752 		NVRAM_CLKIN(t);
753 		val |= (t << i);
754 	}
755 	NVRAM_CLR_CE;
756 	CFG_AND(~NVDI);
757 	return val;
758 }
759 
760 static void ia_hw_type(IADEV *iadev) {
761    u_short memType = ia_eeprom_get(iadev, 25);
762    iadev->memType = memType;
763    if ((memType & MEM_SIZE_MASK) == MEM_SIZE_1M) {
764       iadev->num_tx_desc = IA_TX_BUF;
765       iadev->tx_buf_sz = IA_TX_BUF_SZ;
766       iadev->num_rx_desc = IA_RX_BUF;
767       iadev->rx_buf_sz = IA_RX_BUF_SZ;
768    } else if ((memType & MEM_SIZE_MASK) == MEM_SIZE_512K) {
769       if (IA_TX_BUF == DFL_TX_BUFFERS)
770         iadev->num_tx_desc = IA_TX_BUF / 2;
771       else
772         iadev->num_tx_desc = IA_TX_BUF;
773       iadev->tx_buf_sz = IA_TX_BUF_SZ;
774       if (IA_RX_BUF == DFL_RX_BUFFERS)
775         iadev->num_rx_desc = IA_RX_BUF / 2;
776       else
777         iadev->num_rx_desc = IA_RX_BUF;
778       iadev->rx_buf_sz = IA_RX_BUF_SZ;
779    }
780    else {
781       if (IA_TX_BUF == DFL_TX_BUFFERS)
782         iadev->num_tx_desc = IA_TX_BUF / 8;
783       else
784         iadev->num_tx_desc = IA_TX_BUF;
785       iadev->tx_buf_sz = IA_TX_BUF_SZ;
786       if (IA_RX_BUF == DFL_RX_BUFFERS)
787         iadev->num_rx_desc = IA_RX_BUF / 8;
788       else
789         iadev->num_rx_desc = IA_RX_BUF;
790       iadev->rx_buf_sz = IA_RX_BUF_SZ;
791    }
792    iadev->rx_pkt_ram = TX_PACKET_RAM + (iadev->num_tx_desc * iadev->tx_buf_sz);
793    IF_INIT(printk("BUF: tx=%d,sz=%d rx=%d sz= %d rx_pkt_ram=%d\n",
794          iadev->num_tx_desc, iadev->tx_buf_sz, iadev->num_rx_desc,
795          iadev->rx_buf_sz, iadev->rx_pkt_ram);)
796 
797 #if 0
798    if ((memType & FE_MASK) == FE_SINGLE_MODE) {
799       iadev->phy_type = PHY_OC3C_S;
800    else if ((memType & FE_MASK) == FE_UTP_OPTION)
801       iadev->phy_type = PHY_UTP155;
802    else
803      iadev->phy_type = PHY_OC3C_M;
804 #endif
805 
806    iadev->phy_type = memType & FE_MASK;
807    IF_INIT(printk("memType = 0x%x iadev->phy_type = 0x%x\n",
808                                          memType,iadev->phy_type);)
809    if (iadev->phy_type == FE_25MBIT_PHY)
810       iadev->LineRate = (u32)(((25600000/8)*26)/(27*53));
811    else if (iadev->phy_type == FE_DS3_PHY)
812       iadev->LineRate = (u32)(((44736000/8)*26)/(27*53));
813    else if (iadev->phy_type == FE_E3_PHY)
814       iadev->LineRate = (u32)(((34368000/8)*26)/(27*53));
815    else
816        iadev->LineRate = (u32)(ATM_OC3_PCR);
817    IF_INIT(printk("iadev->LineRate = %d \n", iadev->LineRate);)
818 
819 }
820 
821 static u32 ia_phy_read32(struct iadev_priv *ia, unsigned int reg)
822 {
823 	return readl(ia->phy + (reg >> 2));
824 }
825 
826 static void ia_phy_write32(struct iadev_priv *ia, unsigned int reg, u32 val)
827 {
828 	writel(val, ia->phy + (reg >> 2));
829 }
830 
831 static void ia_frontend_intr(struct iadev_priv *iadev)
832 {
833 	u32 status;
834 
835 	if (iadev->phy_type & FE_25MBIT_PHY) {
836 		status = ia_phy_read32(iadev, MB25_INTR_STATUS);
837 		iadev->carrier_detect = (status & MB25_IS_GSB) ? 1 : 0;
838 	} else if (iadev->phy_type & FE_DS3_PHY) {
839 		ia_phy_read32(iadev, SUNI_DS3_FRM_INTR_STAT);
840 		status = ia_phy_read32(iadev, SUNI_DS3_FRM_STAT);
841 		iadev->carrier_detect = (status & SUNI_DS3_LOSV) ? 0 : 1;
842 	} else if (iadev->phy_type & FE_E3_PHY) {
843 		ia_phy_read32(iadev, SUNI_E3_FRM_MAINT_INTR_IND);
844 		status = ia_phy_read32(iadev, SUNI_E3_FRM_FRAM_INTR_IND_STAT);
845 		iadev->carrier_detect = (status & SUNI_E3_LOS) ? 0 : 1;
846 	} else {
847 		status = ia_phy_read32(iadev, SUNI_RSOP_STATUS);
848 		iadev->carrier_detect = (status & SUNI_LOSV) ? 0 : 1;
849 	}
850 
851 	printk(KERN_INFO "IA: SUNI carrier %s\n",
852 		iadev->carrier_detect ? "detected" : "lost signal");
853 }
854 
855 static void ia_mb25_init(struct iadev_priv *iadev)
856 {
857 #if 0
858    mb25->mb25_master_ctrl = MB25_MC_DRIC | MB25_MC_DREC | MB25_MC_ENABLED;
859 #endif
860 	ia_phy_write32(iadev, MB25_MASTER_CTRL, MB25_MC_DRIC | MB25_MC_DREC);
861 	ia_phy_write32(iadev, MB25_DIAG_CONTROL, 0);
862 
863 	iadev->carrier_detect =
864 		(ia_phy_read32(iadev, MB25_INTR_STATUS) & MB25_IS_GSB) ? 1 : 0;
865 }
866 
867 struct ia_reg {
868 	u16 reg;
869 	u16 val;
870 };
871 
872 static void ia_phy_write(struct iadev_priv *iadev,
873 			 const struct ia_reg *regs, int len)
874 {
875 	while (len--) {
876 		ia_phy_write32(iadev, regs->reg, regs->val);
877 		regs++;
878 	}
879 }
880 
881 static void ia_suni_pm7345_init_ds3(struct iadev_priv *iadev)
882 {
883 	static const struct ia_reg suni_ds3_init[] = {
884 		{ SUNI_DS3_FRM_INTR_ENBL,	0x17 },
885 		{ SUNI_DS3_FRM_CFG,		0x01 },
886 		{ SUNI_DS3_TRAN_CFG,		0x01 },
887 		{ SUNI_CONFIG,			0 },
888 		{ SUNI_SPLR_CFG,		0 },
889 		{ SUNI_SPLT_CFG,		0 }
890 	};
891 	u32 status;
892 
893 	status = ia_phy_read32(iadev, SUNI_DS3_FRM_STAT);
894 	iadev->carrier_detect = (status & SUNI_DS3_LOSV) ? 0 : 1;
895 
896 	ia_phy_write(iadev, suni_ds3_init, ARRAY_SIZE(suni_ds3_init));
897 }
898 
899 static void ia_suni_pm7345_init_e3(struct iadev_priv *iadev)
900 {
901 	static const struct ia_reg suni_e3_init[] = {
902 		{ SUNI_E3_FRM_FRAM_OPTIONS,		0x04 },
903 		{ SUNI_E3_FRM_MAINT_OPTIONS,		0x20 },
904 		{ SUNI_E3_FRM_FRAM_INTR_ENBL,		0x1d },
905 		{ SUNI_E3_FRM_MAINT_INTR_ENBL,		0x30 },
906 		{ SUNI_E3_TRAN_STAT_DIAG_OPTIONS,	0 },
907 		{ SUNI_E3_TRAN_FRAM_OPTIONS,		0x01 },
908 		{ SUNI_CONFIG,				SUNI_PM7345_E3ENBL },
909 		{ SUNI_SPLR_CFG,			0x41 },
910 		{ SUNI_SPLT_CFG,			0x41 }
911 	};
912 	u32 status;
913 
914 	status = ia_phy_read32(iadev, SUNI_E3_FRM_FRAM_INTR_IND_STAT);
915 	iadev->carrier_detect = (status & SUNI_E3_LOS) ? 0 : 1;
916 	ia_phy_write(iadev, suni_e3_init, ARRAY_SIZE(suni_e3_init));
917 }
918 
919 static void ia_suni_pm7345_init(struct iadev_priv *iadev)
920 {
921 	static const struct ia_reg suni_init[] = {
922 		/* Enable RSOP loss of signal interrupt. */
923 		{ SUNI_INTR_ENBL,		0x28 },
924 		/* Clear error counters. */
925 		{ SUNI_ID_RESET,		0 },
926 		/* Clear "PMCTST" in master test register. */
927 		{ SUNI_MASTER_TEST,		0 },
928 
929 		{ SUNI_RXCP_CTRL,		0x2c },
930 		{ SUNI_RXCP_FCTRL,		0x81 },
931 
932 		{ SUNI_RXCP_IDLE_PAT_H1,	0 },
933 		{ SUNI_RXCP_IDLE_PAT_H2,	0 },
934 		{ SUNI_RXCP_IDLE_PAT_H3,	0 },
935 		{ SUNI_RXCP_IDLE_PAT_H4,	0x01 },
936 
937 		{ SUNI_RXCP_IDLE_MASK_H1,	0xff },
938 		{ SUNI_RXCP_IDLE_MASK_H2,	0xff },
939 		{ SUNI_RXCP_IDLE_MASK_H3,	0xff },
940 		{ SUNI_RXCP_IDLE_MASK_H4,	0xfe },
941 
942 		{ SUNI_RXCP_CELL_PAT_H1,	0 },
943 		{ SUNI_RXCP_CELL_PAT_H2,	0 },
944 		{ SUNI_RXCP_CELL_PAT_H3,	0 },
945 		{ SUNI_RXCP_CELL_PAT_H4,	0x01 },
946 
947 		{ SUNI_RXCP_CELL_MASK_H1,	0xff },
948 		{ SUNI_RXCP_CELL_MASK_H2,	0xff },
949 		{ SUNI_RXCP_CELL_MASK_H3,	0xff },
950 		{ SUNI_RXCP_CELL_MASK_H4,	0xff },
951 
952 		{ SUNI_TXCP_CTRL,		0xa4 },
953 		{ SUNI_TXCP_INTR_EN_STS,	0x10 },
954 		{ SUNI_TXCP_IDLE_PAT_H5,	0x55 }
955 	};
956 
957 	if (iadev->phy_type & FE_DS3_PHY)
958 		ia_suni_pm7345_init_ds3(iadev);
959 	else
960 		ia_suni_pm7345_init_e3(iadev);
961 
962 	ia_phy_write(iadev, suni_init, ARRAY_SIZE(suni_init));
963 
964 	ia_phy_write32(iadev, SUNI_CONFIG, ia_phy_read32(iadev, SUNI_CONFIG) &
965 		~(SUNI_PM7345_LLB | SUNI_PM7345_CLB |
966 		  SUNI_PM7345_DLB | SUNI_PM7345_PLB));
967 #ifdef __SNMP__
968    suni_pm7345->suni_rxcp_intr_en_sts |= SUNI_OOCDE;
969 #endif /* __SNMP__ */
970    return;
971 }
972 
973 
974 /***************************** IA_LIB END *****************************/
975 
976 #ifdef CONFIG_ATM_IA_DEBUG
977 static int tcnter = 0;
978 static void xdump( u_char*  cp, int  length, char*  prefix )
979 {
980     int col, count;
981     u_char prntBuf[120];
982     u_char*  pBuf = prntBuf;
983     count = 0;
984     while(count < length){
985         pBuf += sprintf( pBuf, "%s", prefix );
986         for(col = 0;count + col < length && col < 16; col++){
987             if (col != 0 && (col % 4) == 0)
988                 pBuf += sprintf( pBuf, " " );
989             pBuf += sprintf( pBuf, "%02X ", cp[count + col] );
990         }
991         while(col++ < 16){      /* pad end of buffer with blanks */
992             if ((col % 4) == 0)
993                 sprintf( pBuf, " " );
994             pBuf += sprintf( pBuf, "   " );
995         }
996         pBuf += sprintf( pBuf, "  " );
997         for(col = 0;count + col < length && col < 16; col++){
998 		u_char c = cp[count + col];
999 
1000 		if (isascii(c) && isprint(c))
1001 			pBuf += sprintf(pBuf, "%c", c);
1002 		else
1003 			pBuf += sprintf(pBuf, ".");
1004                 }
1005         printk("%s\n", prntBuf);
1006         count += col;
1007         pBuf = prntBuf;
1008     }
1009 
1010 }  /* close xdump(... */
1011 #endif /* CONFIG_ATM_IA_DEBUG */
1012 
1013 
1014 static struct atm_dev *ia_boards = NULL;
1015 
1016 #define ACTUAL_RAM_BASE \
1017 	RAM_BASE*((iadev->mem)/(128 * 1024))
1018 #define ACTUAL_SEG_RAM_BASE \
1019 	IPHASE5575_FRAG_CONTROL_RAM_BASE*((iadev->mem)/(128 * 1024))
1020 #define ACTUAL_REASS_RAM_BASE \
1021 	IPHASE5575_REASS_CONTROL_RAM_BASE*((iadev->mem)/(128 * 1024))
1022 
1023 
1024 /*-- some utilities and memory allocation stuff will come here -------------*/
1025 
1026 static void desc_dbg(IADEV *iadev) {
1027 
1028   u_short tcq_wr_ptr, tcq_st_ptr, tcq_ed_ptr;
1029   u32 i;
1030   void __iomem *tmp;
1031   // regval = readl((u32)ia_cmds->maddr);
1032   tcq_wr_ptr =  readw(iadev->seg_reg+TCQ_WR_PTR);
1033   printk("B_tcq_wr = 0x%x desc = %d last desc = %d\n",
1034                      tcq_wr_ptr, readw(iadev->seg_ram+tcq_wr_ptr),
1035                      readw(iadev->seg_ram+tcq_wr_ptr-2));
1036   printk(" host_tcq_wr = 0x%x  host_tcq_rd = 0x%x \n",  iadev->host_tcq_wr,
1037                    iadev->ffL.tcq_rd);
1038   tcq_st_ptr =  readw(iadev->seg_reg+TCQ_ST_ADR);
1039   tcq_ed_ptr =  readw(iadev->seg_reg+TCQ_ED_ADR);
1040   printk("tcq_st_ptr = 0x%x    tcq_ed_ptr = 0x%x \n", tcq_st_ptr, tcq_ed_ptr);
1041   i = 0;
1042   while (tcq_st_ptr != tcq_ed_ptr) {
1043       tmp = iadev->seg_ram+tcq_st_ptr;
1044       printk("TCQ slot %d desc = %d  Addr = %p\n", i++, readw(tmp), tmp);
1045       tcq_st_ptr += 2;
1046   }
1047   for(i=0; i <iadev->num_tx_desc; i++)
1048       printk("Desc_tbl[%d] = %d \n", i, iadev->desc_tbl[i].timestamp);
1049 }
1050 
1051 
1052 /*----------------------------- Receiving side stuff --------------------------*/
1053 
1054 static void rx_excp_rcvd(struct atm_dev *dev)
1055 {
1056 #if 0 /* closing the receiving size will cause too many excp int */
1057   IADEV *iadev;
1058   u_short state;
1059   u_short excpq_rd_ptr;
1060   //u_short *ptr;
1061   int vci, error = 1;
1062   iadev = INPH_IA_DEV(dev);
1063   state = readl(iadev->reass_reg + STATE_REG) & 0xffff;
1064   while((state & EXCPQ_EMPTY) != EXCPQ_EMPTY)
1065   { printk("state = %x \n", state);
1066         excpq_rd_ptr = readw(iadev->reass_reg + EXCP_Q_RD_PTR) & 0xffff;
1067  printk("state = %x excpq_rd_ptr = %x \n", state, excpq_rd_ptr);
1068         if (excpq_rd_ptr == *(u16*)(iadev->reass_reg + EXCP_Q_WR_PTR))
1069             IF_ERR(printk("excpq_rd_ptr is wrong!!!\n");)
1070         // TODO: update exception stat
1071 	vci = readw(iadev->reass_ram+excpq_rd_ptr);
1072 	error = readw(iadev->reass_ram+excpq_rd_ptr+2) & 0x0007;
1073         // pwang_test
1074 	excpq_rd_ptr += 4;
1075 	if (excpq_rd_ptr > (readw(iadev->reass_reg + EXCP_Q_ED_ADR)& 0xffff))
1076  	    excpq_rd_ptr = readw(iadev->reass_reg + EXCP_Q_ST_ADR)& 0xffff;
1077 	writew( excpq_rd_ptr, iadev->reass_reg + EXCP_Q_RD_PTR);
1078         state = readl(iadev->reass_reg + STATE_REG) & 0xffff;
1079   }
1080 #endif
1081 }
1082 
1083 static void free_desc(struct atm_dev *dev, int desc)
1084 {
1085 	IADEV *iadev;
1086 	iadev = INPH_IA_DEV(dev);
1087         writew(desc, iadev->reass_ram+iadev->rfL.fdq_wr);
1088 	iadev->rfL.fdq_wr +=2;
1089 	if (iadev->rfL.fdq_wr > iadev->rfL.fdq_ed)
1090 		iadev->rfL.fdq_wr =  iadev->rfL.fdq_st;
1091 	writew(iadev->rfL.fdq_wr, iadev->reass_reg+FREEQ_WR_PTR);
1092 }
1093 
1094 
1095 static int rx_pkt(struct atm_dev *dev)
1096 {
1097 	IADEV *iadev;
1098 	struct atm_vcc *vcc;
1099 	unsigned short status;
1100 	struct rx_buf_desc __iomem *buf_desc_ptr;
1101 	int desc;
1102 	struct dle* wr_ptr;
1103 	int len;
1104 	struct sk_buff *skb;
1105 	u_int buf_addr, dma_addr;
1106 
1107 	iadev = INPH_IA_DEV(dev);
1108 	if (iadev->rfL.pcq_rd == (readw(iadev->reass_reg+PCQ_WR_PTR)&0xffff))
1109 	{
1110    	    printk(KERN_ERR DEV_LABEL "(itf %d) Receive queue empty\n", dev->number);
1111 	    return -EINVAL;
1112 	}
1113 	/* mask 1st 3 bits to get the actual descno. */
1114 	desc = readw(iadev->reass_ram+iadev->rfL.pcq_rd) & 0x1fff;
1115         IF_RX(printk("reass_ram = %p iadev->rfL.pcq_rd = 0x%x desc = %d\n",
1116                                     iadev->reass_ram, iadev->rfL.pcq_rd, desc);
1117               printk(" pcq_wr_ptr = 0x%x\n",
1118                                readw(iadev->reass_reg+PCQ_WR_PTR)&0xffff);)
1119 	/* update the read pointer  - maybe we shud do this in the end*/
1120 	if ( iadev->rfL.pcq_rd== iadev->rfL.pcq_ed)
1121 		iadev->rfL.pcq_rd = iadev->rfL.pcq_st;
1122 	else
1123 		iadev->rfL.pcq_rd += 2;
1124 	writew(iadev->rfL.pcq_rd, iadev->reass_reg+PCQ_RD_PTR);
1125 
1126 	/* get the buffer desc entry.
1127 		update stuff. - doesn't seem to be any update necessary
1128 	*/
1129 	buf_desc_ptr = iadev->RX_DESC_BASE_ADDR;
1130 	/* make the ptr point to the corresponding buffer desc entry */
1131 	buf_desc_ptr += desc;
1132         if (!desc || (desc > iadev->num_rx_desc) ||
1133                       ((buf_desc_ptr->vc_index & 0xffff) >= iadev->num_vc)) {
1134             free_desc(dev, desc);
1135             IF_ERR(printk("IA: bad descriptor desc = %d \n", desc);)
1136             return -1;
1137         }
1138 	vcc = iadev->rx_open[buf_desc_ptr->vc_index & 0xffff];
1139 	if (!vcc)
1140 	{
1141                 free_desc(dev, desc);
1142 		printk("IA: null vcc, drop PDU\n");
1143 		return -1;
1144 	}
1145 
1146 
1147 	/* might want to check the status bits for errors */
1148 	status = (u_short) (buf_desc_ptr->desc_mode);
1149 	if (status & (RX_CER | RX_PTE | RX_OFL))
1150 	{
1151                 atomic_inc(&vcc->stats->rx_err);
1152 		IF_ERR(printk("IA: bad packet, dropping it");)
1153                 if (status & RX_CER) {
1154                     IF_ERR(printk(" cause: packet CRC error\n");)
1155                 }
1156                 else if (status & RX_PTE) {
1157                     IF_ERR(printk(" cause: packet time out\n");)
1158                 }
1159                 else {
1160                     IF_ERR(printk(" cause: buffer overflow\n");)
1161                 }
1162 		goto out_free_desc;
1163 	}
1164 
1165 	/*
1166 		build DLE.
1167 	*/
1168 
1169 	buf_addr = (buf_desc_ptr->buf_start_hi << 16) | buf_desc_ptr->buf_start_lo;
1170 	dma_addr = (buf_desc_ptr->dma_start_hi << 16) | buf_desc_ptr->dma_start_lo;
1171 	len = dma_addr - buf_addr;
1172         if (len > iadev->rx_buf_sz) {
1173            printk("Over %d bytes sdu received, dropped!!!\n", iadev->rx_buf_sz);
1174            atomic_inc(&vcc->stats->rx_err);
1175 	   goto out_free_desc;
1176         }
1177 
1178         if (!(skb = atm_alloc_charge(vcc, len, GFP_ATOMIC))) {
1179            if (vcc->vci < 32)
1180               printk("Drop control packets\n");
1181 	   goto out_free_desc;
1182         }
1183 	skb_put(skb,len);
1184         // pwang_test
1185         ATM_SKB(skb)->vcc = vcc;
1186         ATM_DESC(skb) = desc;
1187 	skb_queue_tail(&iadev->rx_dma_q, skb);
1188 
1189 	/* Build the DLE structure */
1190 	wr_ptr = iadev->rx_dle_q.write;
1191 	wr_ptr->sys_pkt_addr = dma_map_single(&iadev->pci->dev, skb->data,
1192 					      len, DMA_FROM_DEVICE);
1193 	wr_ptr->local_pkt_addr = buf_addr;
1194 	wr_ptr->bytes = len;	/* We don't know this do we ?? */
1195 	wr_ptr->mode = DMA_INT_ENABLE;
1196 
1197 	/* shud take care of wrap around here too. */
1198         if(++wr_ptr == iadev->rx_dle_q.end)
1199              wr_ptr = iadev->rx_dle_q.start;
1200 	iadev->rx_dle_q.write = wr_ptr;
1201 	udelay(1);
1202 	/* Increment transaction counter */
1203 	writel(1, iadev->dma+IPHASE5575_RX_COUNTER);
1204 out:	return 0;
1205 out_free_desc:
1206         free_desc(dev, desc);
1207         goto out;
1208 }
1209 
1210 static void rx_intr(struct atm_dev *dev)
1211 {
1212   IADEV *iadev;
1213   u_short status;
1214   u_short state, i;
1215 
1216   iadev = INPH_IA_DEV(dev);
1217   status = readl(iadev->reass_reg+REASS_INTR_STATUS_REG) & 0xffff;
1218   IF_EVENT(printk("rx_intr: status = 0x%x\n", status);)
1219   if (status & RX_PKT_RCVD)
1220   {
1221 	/* do something */
1222 	/* Basically recvd an interrupt for receiving a packet.
1223 	A descriptor would have been written to the packet complete
1224 	queue. Get all the descriptors and set up dma to move the
1225 	packets till the packet complete queue is empty..
1226 	*/
1227 	state = readl(iadev->reass_reg + STATE_REG) & 0xffff;
1228         IF_EVENT(printk("Rx intr status: RX_PKT_RCVD %08x\n", status);)
1229 	while(!(state & PCQ_EMPTY))
1230 	{
1231              rx_pkt(dev);
1232 	     state = readl(iadev->reass_reg + STATE_REG) & 0xffff;
1233 	}
1234         iadev->rxing = 1;
1235   }
1236   if (status & RX_FREEQ_EMPT)
1237   {
1238      if (iadev->rxing) {
1239         iadev->rx_tmp_cnt = iadev->rx_pkt_cnt;
1240         iadev->rx_tmp_jif = jiffies;
1241         iadev->rxing = 0;
1242      }
1243      else if ((time_after(jiffies, iadev->rx_tmp_jif + 50)) &&
1244                ((iadev->rx_pkt_cnt - iadev->rx_tmp_cnt) == 0)) {
1245         for (i = 1; i <= iadev->num_rx_desc; i++)
1246                free_desc(dev, i);
1247 printk("Test logic RUN!!!!\n");
1248         writew( ~(RX_FREEQ_EMPT|RX_EXCP_RCVD),iadev->reass_reg+REASS_MASK_REG);
1249         iadev->rxing = 1;
1250      }
1251      IF_EVENT(printk("Rx intr status: RX_FREEQ_EMPT %08x\n", status);)
1252   }
1253 
1254   if (status & RX_EXCP_RCVD)
1255   {
1256 	/* probably need to handle the exception queue also. */
1257 	IF_EVENT(printk("Rx intr status: RX_EXCP_RCVD %08x\n", status);)
1258 	rx_excp_rcvd(dev);
1259   }
1260 
1261 
1262   if (status & RX_RAW_RCVD)
1263   {
1264 	/* need to handle the raw incoming cells. This deepnds on
1265 	whether we have programmed to receive the raw cells or not.
1266 	Else ignore. */
1267 	IF_EVENT(printk("Rx intr status:  RX_RAW_RCVD %08x\n", status);)
1268   }
1269 }
1270 
1271 
1272 static void rx_dle_intr(struct atm_dev *dev)
1273 {
1274   IADEV *iadev;
1275   struct atm_vcc *vcc;
1276   struct sk_buff *skb;
1277   int desc;
1278   u_short state;
1279   struct dle *dle, *cur_dle;
1280   u_int dle_lp;
1281   int len;
1282   iadev = INPH_IA_DEV(dev);
1283 
1284   /* free all the dles done, that is just update our own dle read pointer
1285 	- do we really need to do this. Think not. */
1286   /* DMA is done, just get all the recevie buffers from the rx dma queue
1287 	and push them up to the higher layer protocol. Also free the desc
1288 	associated with the buffer. */
1289   dle = iadev->rx_dle_q.read;
1290   dle_lp = readl(iadev->dma+IPHASE5575_RX_LIST_ADDR) & (sizeof(struct dle)*DLE_ENTRIES - 1);
1291   cur_dle = (struct dle*)(iadev->rx_dle_q.start + (dle_lp >> 4));
1292   while(dle != cur_dle)
1293   {
1294       /* free the DMAed skb */
1295       skb = skb_dequeue(&iadev->rx_dma_q);
1296       if (!skb)
1297          goto INCR_DLE;
1298       desc = ATM_DESC(skb);
1299       free_desc(dev, desc);
1300 
1301       if (!(len = skb->len))
1302       {
1303           printk("rx_dle_intr: skb len 0\n");
1304 	  dev_kfree_skb_any(skb);
1305       }
1306       else
1307       {
1308           struct cpcs_trailer *trailer;
1309           u_short length;
1310           struct ia_vcc *ia_vcc;
1311 
1312 	  dma_unmap_single(&iadev->pci->dev, iadev->rx_dle_q.write->sys_pkt_addr,
1313 			   len, DMA_FROM_DEVICE);
1314           /* no VCC related housekeeping done as yet. lets see */
1315           vcc = ATM_SKB(skb)->vcc;
1316 	  if (!vcc) {
1317 	      printk("IA: null vcc\n");
1318               dev_kfree_skb_any(skb);
1319               goto INCR_DLE;
1320           }
1321           ia_vcc = INPH_IA_VCC(vcc);
1322           if (ia_vcc == NULL)
1323           {
1324              atomic_inc(&vcc->stats->rx_err);
1325              atm_return(vcc, skb->truesize);
1326              dev_kfree_skb_any(skb);
1327              goto INCR_DLE;
1328            }
1329           // get real pkt length  pwang_test
1330           trailer = (struct cpcs_trailer*)((u_char *)skb->data +
1331                                  skb->len - sizeof(*trailer));
1332 	  length = swap_byte_order(trailer->length);
1333           if ((length > iadev->rx_buf_sz) || (length >
1334                               (skb->len - sizeof(struct cpcs_trailer))))
1335           {
1336              atomic_inc(&vcc->stats->rx_err);
1337              IF_ERR(printk("rx_dle_intr: Bad  AAL5 trailer %d (skb len %d)",
1338                                                             length, skb->len);)
1339              atm_return(vcc, skb->truesize);
1340              dev_kfree_skb_any(skb);
1341              goto INCR_DLE;
1342           }
1343           skb_trim(skb, length);
1344 
1345 	  /* Display the packet */
1346 	  IF_RXPKT(printk("\nDmad Recvd data: len = %d \n", skb->len);
1347           xdump(skb->data, skb->len, "RX: ");
1348           printk("\n");)
1349 
1350 	  IF_RX(printk("rx_dle_intr: skb push");)
1351 	  vcc->push(vcc,skb);
1352 	  atomic_inc(&vcc->stats->rx);
1353           iadev->rx_pkt_cnt++;
1354       }
1355 INCR_DLE:
1356       if (++dle == iadev->rx_dle_q.end)
1357     	  dle = iadev->rx_dle_q.start;
1358   }
1359   iadev->rx_dle_q.read = dle;
1360 
1361   /* if the interrupts are masked because there were no free desc available,
1362 		unmask them now. */
1363   if (!iadev->rxing) {
1364      state = readl(iadev->reass_reg + STATE_REG) & 0xffff;
1365      if (!(state & FREEQ_EMPTY)) {
1366         state = readl(iadev->reass_reg + REASS_MASK_REG) & 0xffff;
1367         writel(state & ~(RX_FREEQ_EMPT |/* RX_EXCP_RCVD |*/ RX_PKT_RCVD),
1368                                       iadev->reass_reg+REASS_MASK_REG);
1369         iadev->rxing++;
1370      }
1371   }
1372 }
1373 
1374 
1375 static int open_rx(struct atm_vcc *vcc)
1376 {
1377 	IADEV *iadev;
1378 	u_short __iomem *vc_table;
1379 	u_short __iomem *reass_ptr;
1380 	IF_EVENT(printk("iadev: open_rx %d.%d\n", vcc->vpi, vcc->vci);)
1381 
1382 	if (vcc->qos.rxtp.traffic_class == ATM_NONE) return 0;
1383 	iadev = INPH_IA_DEV(vcc->dev);
1384         if (vcc->qos.rxtp.traffic_class == ATM_ABR) {
1385            if (iadev->phy_type & FE_25MBIT_PHY) {
1386                printk("IA:  ABR not support\n");
1387                return -EINVAL;
1388            }
1389         }
1390 	/* Make only this VCI in the vc table valid and let all
1391 		others be invalid entries */
1392 	vc_table = iadev->reass_ram+RX_VC_TABLE*iadev->memSize;
1393 	vc_table += vcc->vci;
1394 	/* mask the last 6 bits and OR it with 3 for 1K VCs */
1395 
1396         *vc_table = vcc->vci << 6;
1397 	/* Also keep a list of open rx vcs so that we can attach them with
1398 		incoming PDUs later. */
1399 	if ((vcc->qos.rxtp.traffic_class == ATM_ABR) ||
1400                                 (vcc->qos.txtp.traffic_class == ATM_ABR))
1401 	{
1402                 srv_cls_param_t srv_p;
1403                 init_abr_vc(iadev, &srv_p);
1404                 ia_open_abr_vc(iadev, &srv_p, vcc, 0);
1405 	}
1406        	else {  /* for UBR  later may need to add CBR logic */
1407         	reass_ptr = iadev->reass_ram+REASS_TABLE*iadev->memSize;
1408            	reass_ptr += vcc->vci;
1409            	*reass_ptr = NO_AAL5_PKT;
1410        	}
1411 
1412 	if (iadev->rx_open[vcc->vci])
1413 		printk(KERN_CRIT DEV_LABEL "(itf %d): VCI %d already open\n",
1414 			vcc->dev->number, vcc->vci);
1415 	iadev->rx_open[vcc->vci] = vcc;
1416 	return 0;
1417 }
1418 
1419 static int rx_init(struct atm_dev *dev)
1420 {
1421 	IADEV *iadev;
1422 	struct rx_buf_desc __iomem *buf_desc_ptr;
1423 	unsigned long rx_pkt_start = 0;
1424 	void *dle_addr;
1425 	struct abr_vc_table  *abr_vc_table;
1426 	u16 *vc_table;
1427 	u16 *reass_table;
1428 	int i,j, vcsize_sel;
1429 	u_short freeq_st_adr;
1430 	u_short *freeq_start;
1431 
1432 	iadev = INPH_IA_DEV(dev);
1433   //    spin_lock_init(&iadev->rx_lock);
1434 
1435 	/* Allocate 4k bytes - more aligned than needed (4k boundary) */
1436 	dle_addr = dma_alloc_coherent(&iadev->pci->dev, DLE_TOTAL_SIZE,
1437 				      &iadev->rx_dle_dma, GFP_KERNEL);
1438 	if (!dle_addr)  {
1439 		printk(KERN_ERR DEV_LABEL "can't allocate DLEs\n");
1440 		goto err_out;
1441 	}
1442 	iadev->rx_dle_q.start = (struct dle *)dle_addr;
1443 	iadev->rx_dle_q.read = iadev->rx_dle_q.start;
1444 	iadev->rx_dle_q.write = iadev->rx_dle_q.start;
1445 	iadev->rx_dle_q.end = (struct dle*)((unsigned long)dle_addr+sizeof(struct dle)*DLE_ENTRIES);
1446 	/* the end of the dle q points to the entry after the last
1447 	DLE that can be used. */
1448 
1449 	/* write the upper 20 bits of the start address to rx list address register */
1450 	/* We know this is 32bit bus addressed so the following is safe */
1451 	writel(iadev->rx_dle_dma & 0xfffff000,
1452 	       iadev->dma + IPHASE5575_RX_LIST_ADDR);
1453 	IF_INIT(printk("Tx Dle list addr: 0x%p value: 0x%0x\n",
1454                       iadev->dma+IPHASE5575_TX_LIST_ADDR,
1455                       readl(iadev->dma + IPHASE5575_TX_LIST_ADDR));
1456 	printk("Rx Dle list addr: 0x%p value: 0x%0x\n",
1457                       iadev->dma+IPHASE5575_RX_LIST_ADDR,
1458                       readl(iadev->dma + IPHASE5575_RX_LIST_ADDR));)
1459 
1460 	writew(0xffff, iadev->reass_reg+REASS_MASK_REG);
1461 	writew(0, iadev->reass_reg+MODE_REG);
1462 	writew(RESET_REASS, iadev->reass_reg+REASS_COMMAND_REG);
1463 
1464 	/* Receive side control memory map
1465 	   -------------------------------
1466 
1467 		Buffer descr	0x0000 (736 - 23K)
1468 		VP Table	0x5c00 (256 - 512)
1469 		Except q	0x5e00 (128 - 512)
1470 		Free buffer q	0x6000 (1K - 2K)
1471 		Packet comp q	0x6800 (1K - 2K)
1472 		Reass Table	0x7000 (1K - 2K)
1473 		VC Table	0x7800 (1K - 2K)
1474 		ABR VC Table	0x8000 (1K - 32K)
1475 	*/
1476 
1477 	/* Base address for Buffer Descriptor Table */
1478 	writew(RX_DESC_BASE >> 16, iadev->reass_reg+REASS_DESC_BASE);
1479 	/* Set the buffer size register */
1480 	writew(iadev->rx_buf_sz, iadev->reass_reg+BUF_SIZE);
1481 
1482 	/* Initialize each entry in the Buffer Descriptor Table */
1483         iadev->RX_DESC_BASE_ADDR = iadev->reass_ram+RX_DESC_BASE*iadev->memSize;
1484 	buf_desc_ptr = iadev->RX_DESC_BASE_ADDR;
1485 	memset_io(buf_desc_ptr, 0, sizeof(*buf_desc_ptr));
1486 	buf_desc_ptr++;
1487 	rx_pkt_start = iadev->rx_pkt_ram;
1488 	for(i=1; i<=iadev->num_rx_desc; i++)
1489 	{
1490 		memset_io(buf_desc_ptr, 0, sizeof(*buf_desc_ptr));
1491 		buf_desc_ptr->buf_start_hi = rx_pkt_start >> 16;
1492 		buf_desc_ptr->buf_start_lo = rx_pkt_start & 0x0000ffff;
1493 		buf_desc_ptr++;
1494 		rx_pkt_start += iadev->rx_buf_sz;
1495 	}
1496 	IF_INIT(printk("Rx Buffer desc ptr: 0x%p\n", buf_desc_ptr);)
1497         i = FREE_BUF_DESC_Q*iadev->memSize;
1498 	writew(i >> 16,  iadev->reass_reg+REASS_QUEUE_BASE);
1499         writew(i, iadev->reass_reg+FREEQ_ST_ADR);
1500         writew(i+iadev->num_rx_desc*sizeof(u_short),
1501                                          iadev->reass_reg+FREEQ_ED_ADR);
1502         writew(i, iadev->reass_reg+FREEQ_RD_PTR);
1503         writew(i+iadev->num_rx_desc*sizeof(u_short),
1504                                         iadev->reass_reg+FREEQ_WR_PTR);
1505 	/* Fill the FREEQ with all the free descriptors. */
1506 	freeq_st_adr = readw(iadev->reass_reg+FREEQ_ST_ADR);
1507 	freeq_start = (u_short *)(iadev->reass_ram+freeq_st_adr);
1508 	for(i=1; i<=iadev->num_rx_desc; i++)
1509 	{
1510 		*freeq_start = (u_short)i;
1511 		freeq_start++;
1512 	}
1513 	IF_INIT(printk("freeq_start: 0x%p\n", freeq_start);)
1514         /* Packet Complete Queue */
1515         i = (PKT_COMP_Q * iadev->memSize) & 0xffff;
1516         writew(i, iadev->reass_reg+PCQ_ST_ADR);
1517         writew(i+iadev->num_vc*sizeof(u_short), iadev->reass_reg+PCQ_ED_ADR);
1518         writew(i, iadev->reass_reg+PCQ_RD_PTR);
1519         writew(i, iadev->reass_reg+PCQ_WR_PTR);
1520 
1521         /* Exception Queue */
1522         i = (EXCEPTION_Q * iadev->memSize) & 0xffff;
1523         writew(i, iadev->reass_reg+EXCP_Q_ST_ADR);
1524         writew(i + NUM_RX_EXCP * sizeof(RX_ERROR_Q),
1525                                              iadev->reass_reg+EXCP_Q_ED_ADR);
1526         writew(i, iadev->reass_reg+EXCP_Q_RD_PTR);
1527         writew(i, iadev->reass_reg+EXCP_Q_WR_PTR);
1528 
1529     	/* Load local copy of FREEQ and PCQ ptrs */
1530         iadev->rfL.fdq_st = readw(iadev->reass_reg+FREEQ_ST_ADR) & 0xffff;
1531        	iadev->rfL.fdq_ed = readw(iadev->reass_reg+FREEQ_ED_ADR) & 0xffff ;
1532 	iadev->rfL.fdq_rd = readw(iadev->reass_reg+FREEQ_RD_PTR) & 0xffff;
1533 	iadev->rfL.fdq_wr = readw(iadev->reass_reg+FREEQ_WR_PTR) & 0xffff;
1534         iadev->rfL.pcq_st = readw(iadev->reass_reg+PCQ_ST_ADR) & 0xffff;
1535 	iadev->rfL.pcq_ed = readw(iadev->reass_reg+PCQ_ED_ADR) & 0xffff;
1536 	iadev->rfL.pcq_rd = readw(iadev->reass_reg+PCQ_RD_PTR) & 0xffff;
1537 	iadev->rfL.pcq_wr = readw(iadev->reass_reg+PCQ_WR_PTR) & 0xffff;
1538 
1539         IF_INIT(printk("INIT:pcq_st:0x%x pcq_ed:0x%x pcq_rd:0x%x pcq_wr:0x%x",
1540               iadev->rfL.pcq_st, iadev->rfL.pcq_ed, iadev->rfL.pcq_rd,
1541               iadev->rfL.pcq_wr);)
1542 	/* just for check - no VP TBL */
1543 	/* VP Table */
1544 	/* writew(0x0b80, iadev->reass_reg+VP_LKUP_BASE); */
1545 	/* initialize VP Table for invalid VPIs
1546 		- I guess we can write all 1s or 0x000f in the entire memory
1547 		  space or something similar.
1548 	*/
1549 
1550 	/* This seems to work and looks right to me too !!! */
1551         i =  REASS_TABLE * iadev->memSize;
1552 	writew((i >> 3), iadev->reass_reg+REASS_TABLE_BASE);
1553  	/* initialize Reassembly table to I don't know what ???? */
1554 	reass_table = (u16 *)(iadev->reass_ram+i);
1555         j = REASS_TABLE_SZ * iadev->memSize;
1556 	for(i=0; i < j; i++)
1557 		*reass_table++ = NO_AAL5_PKT;
1558        i = 8*1024;
1559        vcsize_sel =  0;
1560        while (i != iadev->num_vc) {
1561           i /= 2;
1562           vcsize_sel++;
1563        }
1564        i = RX_VC_TABLE * iadev->memSize;
1565        writew(((i>>3) & 0xfff8) | vcsize_sel, iadev->reass_reg+VC_LKUP_BASE);
1566        vc_table = (u16 *)(iadev->reass_ram+RX_VC_TABLE*iadev->memSize);
1567         j = RX_VC_TABLE_SZ * iadev->memSize;
1568 	for(i = 0; i < j; i++)
1569 	{
1570 		/* shift the reassembly pointer by 3 + lower 3 bits of
1571 		vc_lkup_base register (=3 for 1K VCs) and the last byte
1572 		is those low 3 bits.
1573 		Shall program this later.
1574 		*/
1575 		*vc_table = (i << 6) | 15;	/* for invalid VCI */
1576 		vc_table++;
1577 	}
1578         /* ABR VC table */
1579         i =  ABR_VC_TABLE * iadev->memSize;
1580         writew(i >> 3, iadev->reass_reg+ABR_LKUP_BASE);
1581 
1582         i = ABR_VC_TABLE * iadev->memSize;
1583 	abr_vc_table = (struct abr_vc_table *)(iadev->reass_ram+i);
1584         j = REASS_TABLE_SZ * iadev->memSize;
1585         memset ((char*)abr_vc_table, 0, j * sizeof(*abr_vc_table));
1586     	for(i = 0; i < j; i++) {
1587 		abr_vc_table->rdf = 0x0003;
1588              	abr_vc_table->air = 0x5eb1;
1589 	       	abr_vc_table++;
1590         }
1591 
1592 	/* Initialize other registers */
1593 
1594 	/* VP Filter Register set for VC Reassembly only */
1595 	writew(0xff00, iadev->reass_reg+VP_FILTER);
1596         writew(0, iadev->reass_reg+XTRA_RM_OFFSET);
1597 	writew(0x1,  iadev->reass_reg+PROTOCOL_ID);
1598 
1599 	/* Packet Timeout Count  related Registers :
1600 	   Set packet timeout to occur in about 3 seconds
1601 	   Set Packet Aging Interval count register to overflow in about 4 us
1602  	*/
1603         writew(0xF6F8, iadev->reass_reg+PKT_TM_CNT );
1604 
1605         i = (j >> 6) & 0xFF;
1606         j += 2 * (j - 1);
1607         i |= ((j << 2) & 0xFF00);
1608         writew(i, iadev->reass_reg+TMOUT_RANGE);
1609 
1610         /* initiate the desc_tble */
1611         for(i=0; i<iadev->num_tx_desc;i++)
1612             iadev->desc_tbl[i].timestamp = 0;
1613 
1614 	/* to clear the interrupt status register - read it */
1615 	readw(iadev->reass_reg+REASS_INTR_STATUS_REG);
1616 
1617 	/* Mask Register - clear it */
1618 	writew(~(RX_FREEQ_EMPT|RX_PKT_RCVD), iadev->reass_reg+REASS_MASK_REG);
1619 
1620 	skb_queue_head_init(&iadev->rx_dma_q);
1621 	iadev->rx_free_desc_qhead = NULL;
1622 
1623 	iadev->rx_open = kcalloc(iadev->num_vc, sizeof(void *), GFP_KERNEL);
1624 	if (!iadev->rx_open) {
1625 		printk(KERN_ERR DEV_LABEL "itf %d couldn't get free page\n",
1626 		dev->number);
1627 		goto err_free_dle;
1628 	}
1629 
1630         iadev->rxing = 1;
1631         iadev->rx_pkt_cnt = 0;
1632 	/* Mode Register */
1633 	writew(R_ONLINE, iadev->reass_reg+MODE_REG);
1634 	return 0;
1635 
1636 err_free_dle:
1637 	dma_free_coherent(&iadev->pci->dev, DLE_TOTAL_SIZE, iadev->rx_dle_q.start,
1638 			  iadev->rx_dle_dma);
1639 err_out:
1640 	return -ENOMEM;
1641 }
1642 
1643 
1644 /*
1645 	The memory map suggested in appendix A and the coding for it.
1646 	Keeping it around just in case we change our mind later.
1647 
1648 		Buffer descr	0x0000 (128 - 4K)
1649 		UBR sched	0x1000 (1K - 4K)
1650 		UBR Wait q	0x2000 (1K - 4K)
1651 		Commn queues	0x3000 Packet Ready, Trasmit comp(0x3100)
1652 					(128 - 256) each
1653 		extended VC	0x4000 (1K - 8K)
1654 		ABR sched	0x6000	and ABR wait queue (1K - 2K) each
1655 		CBR sched	0x7000 (as needed)
1656 		VC table	0x8000 (1K - 32K)
1657 */
1658 
1659 static void tx_intr(struct atm_dev *dev)
1660 {
1661 	IADEV *iadev;
1662 	unsigned short status;
1663         unsigned long flags;
1664 
1665 	iadev = INPH_IA_DEV(dev);
1666 
1667 	status = readl(iadev->seg_reg+SEG_INTR_STATUS_REG);
1668         if (status & TRANSMIT_DONE){
1669 
1670            IF_EVENT(printk("Transmit Done Intr logic run\n");)
1671            spin_lock_irqsave(&iadev->tx_lock, flags);
1672            ia_tx_poll(iadev);
1673            spin_unlock_irqrestore(&iadev->tx_lock, flags);
1674            writew(TRANSMIT_DONE, iadev->seg_reg+SEG_INTR_STATUS_REG);
1675            if (iadev->close_pending)
1676                wake_up(&iadev->close_wait);
1677         }
1678 	if (status & TCQ_NOT_EMPTY)
1679 	{
1680 	    IF_EVENT(printk("TCQ_NOT_EMPTY int received\n");)
1681 	}
1682 }
1683 
1684 static void tx_dle_intr(struct atm_dev *dev)
1685 {
1686         IADEV *iadev;
1687         struct dle *dle, *cur_dle;
1688         struct sk_buff *skb;
1689         struct atm_vcc *vcc;
1690         struct ia_vcc  *iavcc;
1691         u_int dle_lp;
1692         unsigned long flags;
1693 
1694         iadev = INPH_IA_DEV(dev);
1695         spin_lock_irqsave(&iadev->tx_lock, flags);
1696         dle = iadev->tx_dle_q.read;
1697         dle_lp = readl(iadev->dma+IPHASE5575_TX_LIST_ADDR) &
1698                                         (sizeof(struct dle)*DLE_ENTRIES - 1);
1699         cur_dle = (struct dle*)(iadev->tx_dle_q.start + (dle_lp >> 4));
1700         while (dle != cur_dle)
1701         {
1702             /* free the DMAed skb */
1703             skb = skb_dequeue(&iadev->tx_dma_q);
1704             if (!skb) break;
1705 
1706 	    /* Revenge of the 2 dle (skb + trailer) used in ia_pkt_tx() */
1707 	    if (!((dle - iadev->tx_dle_q.start)%(2*sizeof(struct dle)))) {
1708 		dma_unmap_single(&iadev->pci->dev, dle->sys_pkt_addr, skb->len,
1709 				 DMA_TO_DEVICE);
1710 	    }
1711             vcc = ATM_SKB(skb)->vcc;
1712             if (!vcc) {
1713                   printk("tx_dle_intr: vcc is null\n");
1714 		  spin_unlock_irqrestore(&iadev->tx_lock, flags);
1715                   dev_kfree_skb_any(skb);
1716 
1717                   return;
1718             }
1719             iavcc = INPH_IA_VCC(vcc);
1720             if (!iavcc) {
1721                   printk("tx_dle_intr: iavcc is null\n");
1722 		  spin_unlock_irqrestore(&iadev->tx_lock, flags);
1723                   dev_kfree_skb_any(skb);
1724                   return;
1725             }
1726             if (vcc->qos.txtp.pcr >= iadev->rate_limit) {
1727                if ((vcc->pop) && (skb->len != 0))
1728                {
1729                  vcc->pop(vcc, skb);
1730                }
1731                else {
1732                  dev_kfree_skb_any(skb);
1733                }
1734             }
1735             else { /* Hold the rate-limited skb for flow control */
1736                IA_SKB_STATE(skb) |= IA_DLED;
1737                skb_queue_tail(&iavcc->txing_skb, skb);
1738             }
1739             IF_EVENT(printk("tx_dle_intr: enque skb = 0x%p \n", skb);)
1740             if (++dle == iadev->tx_dle_q.end)
1741                  dle = iadev->tx_dle_q.start;
1742         }
1743         iadev->tx_dle_q.read = dle;
1744         spin_unlock_irqrestore(&iadev->tx_lock, flags);
1745 }
1746 
1747 static int open_tx(struct atm_vcc *vcc)
1748 {
1749 	struct ia_vcc *ia_vcc;
1750 	IADEV *iadev;
1751 	struct main_vc *vc;
1752 	struct ext_vc *evc;
1753         int ret;
1754 	IF_EVENT(printk("iadev: open_tx entered vcc->vci = %d\n", vcc->vci);)
1755 	if (vcc->qos.txtp.traffic_class == ATM_NONE) return 0;
1756 	iadev = INPH_IA_DEV(vcc->dev);
1757 
1758         if (iadev->phy_type & FE_25MBIT_PHY) {
1759            if (vcc->qos.txtp.traffic_class == ATM_ABR) {
1760                printk("IA:  ABR not support\n");
1761                return -EINVAL;
1762            }
1763 	  if (vcc->qos.txtp.traffic_class == ATM_CBR) {
1764                printk("IA:  CBR not support\n");
1765                return -EINVAL;
1766           }
1767         }
1768         ia_vcc =  INPH_IA_VCC(vcc);
1769         memset((caddr_t)ia_vcc, 0, sizeof(*ia_vcc));
1770         if (vcc->qos.txtp.max_sdu >
1771                          (iadev->tx_buf_sz - sizeof(struct cpcs_trailer))){
1772            printk("IA:  SDU size over (%d) the configured SDU size %d\n",
1773 		  vcc->qos.txtp.max_sdu,iadev->tx_buf_sz);
1774 	   vcc->dev_data = NULL;
1775            kfree(ia_vcc);
1776            return -EINVAL;
1777         }
1778 	ia_vcc->vc_desc_cnt = 0;
1779         ia_vcc->txing = 1;
1780 
1781         /* find pcr */
1782         if (vcc->qos.txtp.max_pcr == ATM_MAX_PCR)
1783            vcc->qos.txtp.pcr = iadev->LineRate;
1784         else if ((vcc->qos.txtp.max_pcr == 0)&&( vcc->qos.txtp.pcr <= 0))
1785            vcc->qos.txtp.pcr = iadev->LineRate;
1786         else if ((vcc->qos.txtp.max_pcr > vcc->qos.txtp.pcr) && (vcc->qos.txtp.max_pcr> 0))
1787            vcc->qos.txtp.pcr = vcc->qos.txtp.max_pcr;
1788         if (vcc->qos.txtp.pcr > iadev->LineRate)
1789              vcc->qos.txtp.pcr = iadev->LineRate;
1790         ia_vcc->pcr = vcc->qos.txtp.pcr;
1791 
1792         if (ia_vcc->pcr > (iadev->LineRate / 6) ) ia_vcc->ltimeout = HZ / 10;
1793         else if (ia_vcc->pcr > (iadev->LineRate / 130)) ia_vcc->ltimeout = HZ;
1794         else if (ia_vcc->pcr <= 170) ia_vcc->ltimeout = 16 * HZ;
1795         else ia_vcc->ltimeout = 2700 * HZ  / ia_vcc->pcr;
1796         if (ia_vcc->pcr < iadev->rate_limit)
1797            skb_queue_head_init (&ia_vcc->txing_skb);
1798         if (ia_vcc->pcr < iadev->rate_limit) {
1799 	   struct sock *sk = sk_atm(vcc);
1800 
1801 	   if (vcc->qos.txtp.max_sdu != 0) {
1802                if (ia_vcc->pcr > 60000)
1803                   sk->sk_sndbuf = vcc->qos.txtp.max_sdu * 5;
1804                else if (ia_vcc->pcr > 2000)
1805                   sk->sk_sndbuf = vcc->qos.txtp.max_sdu * 4;
1806                else
1807                  sk->sk_sndbuf = vcc->qos.txtp.max_sdu * 3;
1808            }
1809            else
1810              sk->sk_sndbuf = 24576;
1811         }
1812 
1813 	vc = (struct main_vc *)iadev->MAIN_VC_TABLE_ADDR;
1814 	evc = (struct ext_vc *)iadev->EXT_VC_TABLE_ADDR;
1815 	vc += vcc->vci;
1816 	evc += vcc->vci;
1817 	memset((caddr_t)vc, 0, sizeof(*vc));
1818 	memset((caddr_t)evc, 0, sizeof(*evc));
1819 
1820 	/* store the most significant 4 bits of vci as the last 4 bits
1821 		of first part of atm header.
1822 	   store the last 12 bits of vci as first 12 bits of the second
1823 		part of the atm header.
1824 	*/
1825 	evc->atm_hdr1 = (vcc->vci >> 12) & 0x000f;
1826 	evc->atm_hdr2 = (vcc->vci & 0x0fff) << 4;
1827 
1828 	/* check the following for different traffic classes */
1829 	if (vcc->qos.txtp.traffic_class == ATM_UBR)
1830 	{
1831 		vc->type = UBR;
1832                 vc->status = CRC_APPEND;
1833 		vc->acr = cellrate_to_float(iadev->LineRate);
1834                 if (vcc->qos.txtp.pcr > 0)
1835                    vc->acr = cellrate_to_float(vcc->qos.txtp.pcr);
1836                 IF_UBR(printk("UBR: txtp.pcr = 0x%x f_rate = 0x%x\n",
1837                                              vcc->qos.txtp.max_pcr,vc->acr);)
1838 	}
1839 	else if (vcc->qos.txtp.traffic_class == ATM_ABR)
1840 	{       srv_cls_param_t srv_p;
1841 		IF_ABR(printk("Tx ABR VCC\n");)
1842                 init_abr_vc(iadev, &srv_p);
1843                 if (vcc->qos.txtp.pcr > 0)
1844                    srv_p.pcr = vcc->qos.txtp.pcr;
1845                 if (vcc->qos.txtp.min_pcr > 0) {
1846                    int tmpsum = iadev->sum_mcr+iadev->sum_cbr+vcc->qos.txtp.min_pcr;
1847                    if (tmpsum > iadev->LineRate)
1848                        return -EBUSY;
1849                    srv_p.mcr = vcc->qos.txtp.min_pcr;
1850                    iadev->sum_mcr += vcc->qos.txtp.min_pcr;
1851                 }
1852                 else srv_p.mcr = 0;
1853                 if (vcc->qos.txtp.icr)
1854                    srv_p.icr = vcc->qos.txtp.icr;
1855                 if (vcc->qos.txtp.tbe)
1856                    srv_p.tbe = vcc->qos.txtp.tbe;
1857                 if (vcc->qos.txtp.frtt)
1858                    srv_p.frtt = vcc->qos.txtp.frtt;
1859                 if (vcc->qos.txtp.rif)
1860                    srv_p.rif = vcc->qos.txtp.rif;
1861                 if (vcc->qos.txtp.rdf)
1862                    srv_p.rdf = vcc->qos.txtp.rdf;
1863                 if (vcc->qos.txtp.nrm_pres)
1864                    srv_p.nrm = vcc->qos.txtp.nrm;
1865                 if (vcc->qos.txtp.trm_pres)
1866                    srv_p.trm = vcc->qos.txtp.trm;
1867                 if (vcc->qos.txtp.adtf_pres)
1868                    srv_p.adtf = vcc->qos.txtp.adtf;
1869                 if (vcc->qos.txtp.cdf_pres)
1870                    srv_p.cdf = vcc->qos.txtp.cdf;
1871                 if (srv_p.icr > srv_p.pcr)
1872                    srv_p.icr = srv_p.pcr;
1873                 IF_ABR(printk("ABR:vcc->qos.txtp.max_pcr = %d  mcr = %d\n",
1874                                                       srv_p.pcr, srv_p.mcr);)
1875 		ia_open_abr_vc(iadev, &srv_p, vcc, 1);
1876 	} else if (vcc->qos.txtp.traffic_class == ATM_CBR) {
1877                 if (iadev->phy_type & FE_25MBIT_PHY) {
1878                     printk("IA:  CBR not support\n");
1879                     return -EINVAL;
1880                 }
1881                 if (vcc->qos.txtp.max_pcr > iadev->LineRate) {
1882                    IF_CBR(printk("PCR is not available\n");)
1883                    return -1;
1884                 }
1885                 vc->type = CBR;
1886                 vc->status = CRC_APPEND;
1887                 if ((ret = ia_cbr_setup (iadev, vcc)) < 0) {
1888                     return ret;
1889                 }
1890 	} else {
1891 		printk("iadev:  Non UBR, ABR and CBR traffic not supported\n");
1892 	}
1893 
1894         iadev->testTable[vcc->vci]->vc_status |= VC_ACTIVE;
1895 	IF_EVENT(printk("ia open_tx returning \n");)
1896 	return 0;
1897 }
1898 
1899 
1900 static int tx_init(struct atm_dev *dev)
1901 {
1902 	IADEV *iadev;
1903 	struct tx_buf_desc *buf_desc_ptr;
1904 	unsigned int tx_pkt_start;
1905 	void *dle_addr;
1906 	int i;
1907 	u_short tcq_st_adr;
1908 	u_short *tcq_start;
1909 	u_short prq_st_adr;
1910 	u_short *prq_start;
1911 	struct main_vc *vc;
1912 	struct ext_vc *evc;
1913         u_short tmp16;
1914         u32 vcsize_sel;
1915 
1916 	iadev = INPH_IA_DEV(dev);
1917         spin_lock_init(&iadev->tx_lock);
1918 
1919 	IF_INIT(printk("Tx MASK REG: 0x%0x\n",
1920                                 readw(iadev->seg_reg+SEG_MASK_REG));)
1921 
1922 	/* Allocate 4k (boundary aligned) bytes */
1923 	dle_addr = dma_alloc_coherent(&iadev->pci->dev, DLE_TOTAL_SIZE,
1924 				      &iadev->tx_dle_dma, GFP_KERNEL);
1925 	if (!dle_addr)  {
1926 		printk(KERN_ERR DEV_LABEL "can't allocate DLEs\n");
1927 		goto err_out;
1928 	}
1929 	iadev->tx_dle_q.start = (struct dle*)dle_addr;
1930 	iadev->tx_dle_q.read = iadev->tx_dle_q.start;
1931 	iadev->tx_dle_q.write = iadev->tx_dle_q.start;
1932 	iadev->tx_dle_q.end = (struct dle*)((unsigned long)dle_addr+sizeof(struct dle)*DLE_ENTRIES);
1933 
1934 	/* write the upper 20 bits of the start address to tx list address register */
1935 	writel(iadev->tx_dle_dma & 0xfffff000,
1936 	       iadev->dma + IPHASE5575_TX_LIST_ADDR);
1937 	writew(0xffff, iadev->seg_reg+SEG_MASK_REG);
1938 	writew(0, iadev->seg_reg+MODE_REG_0);
1939 	writew(RESET_SEG, iadev->seg_reg+SEG_COMMAND_REG);
1940         iadev->MAIN_VC_TABLE_ADDR = iadev->seg_ram+MAIN_VC_TABLE*iadev->memSize;
1941         iadev->EXT_VC_TABLE_ADDR = iadev->seg_ram+EXT_VC_TABLE*iadev->memSize;
1942         iadev->ABR_SCHED_TABLE_ADDR=iadev->seg_ram+ABR_SCHED_TABLE*iadev->memSize;
1943 
1944 	/*
1945 	   Transmit side control memory map
1946 	   --------------------------------
1947 	 Buffer descr 	0x0000 (128 - 4K)
1948 	 Commn queues	0x1000	Transmit comp, Packet ready(0x1400)
1949 					(512 - 1K) each
1950 					TCQ - 4K, PRQ - 5K
1951 	 CBR Table 	0x1800 (as needed) - 6K
1952 	 UBR Table	0x3000 (1K - 4K) - 12K
1953 	 UBR Wait queue	0x4000 (1K - 4K) - 16K
1954 	 ABR sched	0x5000	and ABR wait queue (1K - 2K) each
1955 				ABR Tbl - 20K, ABR Wq - 22K
1956 	 extended VC	0x6000 (1K - 8K) - 24K
1957 	 VC Table	0x8000 (1K - 32K) - 32K
1958 
1959 	Between 0x2000 (8K) and 0x3000 (12K) there is 4K space left for VBR Tbl
1960 	and Wait q, which can be allotted later.
1961 	*/
1962 
1963 	/* Buffer Descriptor Table Base address */
1964 	writew(TX_DESC_BASE, iadev->seg_reg+SEG_DESC_BASE);
1965 
1966 	/* initialize each entry in the buffer descriptor table */
1967 	buf_desc_ptr =(struct tx_buf_desc *)(iadev->seg_ram+TX_DESC_BASE);
1968 	memset((caddr_t)buf_desc_ptr, 0, sizeof(*buf_desc_ptr));
1969 	buf_desc_ptr++;
1970 	tx_pkt_start = TX_PACKET_RAM;
1971 	for(i=1; i<=iadev->num_tx_desc; i++)
1972 	{
1973 		memset((caddr_t)buf_desc_ptr, 0, sizeof(*buf_desc_ptr));
1974 		buf_desc_ptr->desc_mode = AAL5;
1975 		buf_desc_ptr->buf_start_hi = tx_pkt_start >> 16;
1976 		buf_desc_ptr->buf_start_lo = tx_pkt_start & 0x0000ffff;
1977 		buf_desc_ptr++;
1978 		tx_pkt_start += iadev->tx_buf_sz;
1979 	}
1980 	iadev->tx_buf = kmalloc_array(iadev->num_tx_desc,
1981 				      sizeof(*iadev->tx_buf),
1982 				      GFP_KERNEL);
1983         if (!iadev->tx_buf) {
1984             printk(KERN_ERR DEV_LABEL " couldn't get mem\n");
1985 	    goto err_free_dle;
1986         }
1987        	for (i= 0; i< iadev->num_tx_desc; i++)
1988        	{
1989 	    struct cpcs_trailer *cpcs;
1990 
1991        	    cpcs = kmalloc(sizeof(*cpcs), GFP_KERNEL|GFP_DMA);
1992             if(!cpcs) {
1993 		printk(KERN_ERR DEV_LABEL " couldn't get freepage\n");
1994 		goto err_free_tx_bufs;
1995             }
1996 	    iadev->tx_buf[i].cpcs = cpcs;
1997 	    iadev->tx_buf[i].dma_addr = dma_map_single(&iadev->pci->dev,
1998 						       cpcs,
1999 						       sizeof(*cpcs),
2000 						       DMA_TO_DEVICE);
2001         }
2002 	iadev->desc_tbl = kmalloc_array(iadev->num_tx_desc,
2003 					sizeof(*iadev->desc_tbl),
2004 					GFP_KERNEL);
2005 	if (!iadev->desc_tbl) {
2006 		printk(KERN_ERR DEV_LABEL " couldn't get mem\n");
2007 		goto err_free_all_tx_bufs;
2008 	}
2009 
2010 	/* Communication Queues base address */
2011         i = TX_COMP_Q * iadev->memSize;
2012 	writew(i >> 16, iadev->seg_reg+SEG_QUEUE_BASE);
2013 
2014 	/* Transmit Complete Queue */
2015 	writew(i, iadev->seg_reg+TCQ_ST_ADR);
2016 	writew(i, iadev->seg_reg+TCQ_RD_PTR);
2017 	writew(i+iadev->num_tx_desc*sizeof(u_short),iadev->seg_reg+TCQ_WR_PTR);
2018 	iadev->host_tcq_wr = i + iadev->num_tx_desc*sizeof(u_short);
2019         writew(i+2 * iadev->num_tx_desc * sizeof(u_short),
2020                                               iadev->seg_reg+TCQ_ED_ADR);
2021 	/* Fill the TCQ with all the free descriptors. */
2022 	tcq_st_adr = readw(iadev->seg_reg+TCQ_ST_ADR);
2023 	tcq_start = (u_short *)(iadev->seg_ram+tcq_st_adr);
2024 	for(i=1; i<=iadev->num_tx_desc; i++)
2025 	{
2026 		*tcq_start = (u_short)i;
2027 		tcq_start++;
2028 	}
2029 
2030 	/* Packet Ready Queue */
2031         i = PKT_RDY_Q * iadev->memSize;
2032 	writew(i, iadev->seg_reg+PRQ_ST_ADR);
2033 	writew(i+2 * iadev->num_tx_desc * sizeof(u_short),
2034                                               iadev->seg_reg+PRQ_ED_ADR);
2035 	writew(i, iadev->seg_reg+PRQ_RD_PTR);
2036 	writew(i, iadev->seg_reg+PRQ_WR_PTR);
2037 
2038         /* Load local copy of PRQ and TCQ ptrs */
2039         iadev->ffL.prq_st = readw(iadev->seg_reg+PRQ_ST_ADR) & 0xffff;
2040 	iadev->ffL.prq_ed = readw(iadev->seg_reg+PRQ_ED_ADR) & 0xffff;
2041  	iadev->ffL.prq_wr = readw(iadev->seg_reg+PRQ_WR_PTR) & 0xffff;
2042 
2043 	iadev->ffL.tcq_st = readw(iadev->seg_reg+TCQ_ST_ADR) & 0xffff;
2044 	iadev->ffL.tcq_ed = readw(iadev->seg_reg+TCQ_ED_ADR) & 0xffff;
2045 	iadev->ffL.tcq_rd = readw(iadev->seg_reg+TCQ_RD_PTR) & 0xffff;
2046 
2047 	/* Just for safety initializing the queue to have desc 1 always */
2048 	/* Fill the PRQ with all the free descriptors. */
2049 	prq_st_adr = readw(iadev->seg_reg+PRQ_ST_ADR);
2050 	prq_start = (u_short *)(iadev->seg_ram+prq_st_adr);
2051 	for(i=1; i<=iadev->num_tx_desc; i++)
2052 	{
2053 		*prq_start = (u_short)0;	/* desc 1 in all entries */
2054 		prq_start++;
2055 	}
2056 	/* CBR Table */
2057         IF_INIT(printk("Start CBR Init\n");)
2058 #if 1  /* for 1K VC board, CBR_PTR_BASE is 0 */
2059         writew(0,iadev->seg_reg+CBR_PTR_BASE);
2060 #else /* Charlie's logic is wrong ? */
2061         tmp16 = (iadev->seg_ram+CBR_SCHED_TABLE*iadev->memSize)>>17;
2062         IF_INIT(printk("cbr_ptr_base = 0x%x ", tmp16);)
2063         writew(tmp16,iadev->seg_reg+CBR_PTR_BASE);
2064 #endif
2065 
2066         IF_INIT(printk("value in register = 0x%x\n",
2067                                    readw(iadev->seg_reg+CBR_PTR_BASE));)
2068         tmp16 = (CBR_SCHED_TABLE*iadev->memSize) >> 1;
2069         writew(tmp16, iadev->seg_reg+CBR_TAB_BEG);
2070         IF_INIT(printk("cbr_tab_beg = 0x%x in reg = 0x%x \n", tmp16,
2071                                         readw(iadev->seg_reg+CBR_TAB_BEG));)
2072         writew(tmp16, iadev->seg_reg+CBR_TAB_END+1); // CBR_PTR;
2073         tmp16 = (CBR_SCHED_TABLE*iadev->memSize + iadev->num_vc*6 - 2) >> 1;
2074         writew(tmp16, iadev->seg_reg+CBR_TAB_END);
2075         IF_INIT(printk("iadev->seg_reg = 0x%p CBR_PTR_BASE = 0x%x\n",
2076                iadev->seg_reg, readw(iadev->seg_reg+CBR_PTR_BASE));)
2077         IF_INIT(printk("CBR_TAB_BEG = 0x%x, CBR_TAB_END = 0x%x, CBR_PTR = 0x%x\n",
2078           readw(iadev->seg_reg+CBR_TAB_BEG), readw(iadev->seg_reg+CBR_TAB_END),
2079           readw(iadev->seg_reg+CBR_TAB_END+1));)
2080 
2081         /* Initialize the CBR Schedualing Table */
2082         memset_io(iadev->seg_ram+CBR_SCHED_TABLE*iadev->memSize,
2083                                                           0, iadev->num_vc*6);
2084         iadev->CbrRemEntries = iadev->CbrTotEntries = iadev->num_vc*3;
2085         iadev->CbrEntryPt = 0;
2086         iadev->Granularity = MAX_ATM_155 / iadev->CbrTotEntries;
2087         iadev->NumEnabledCBR = 0;
2088 
2089 	/* UBR scheduling Table and wait queue */
2090 	/* initialize all bytes of UBR scheduler table and wait queue to 0
2091 		- SCHEDSZ is 1K (# of entries).
2092 		- UBR Table size is 4K
2093 		- UBR wait queue is 4K
2094 	   since the table and wait queues are contiguous, all the bytes
2095 	   can be initialized by one memeset.
2096 	*/
2097 
2098         vcsize_sel = 0;
2099         i = 8*1024;
2100         while (i != iadev->num_vc) {
2101           i /= 2;
2102           vcsize_sel++;
2103         }
2104 
2105         i = MAIN_VC_TABLE * iadev->memSize;
2106         writew(vcsize_sel | ((i >> 8) & 0xfff8),iadev->seg_reg+VCT_BASE);
2107         i =  EXT_VC_TABLE * iadev->memSize;
2108         writew((i >> 8) & 0xfffe, iadev->seg_reg+VCTE_BASE);
2109         i = UBR_SCHED_TABLE * iadev->memSize;
2110         writew((i & 0xffff) >> 11,  iadev->seg_reg+UBR_SBPTR_BASE);
2111         i = UBR_WAIT_Q * iadev->memSize;
2112         writew((i >> 7) & 0xffff,  iadev->seg_reg+UBRWQ_BASE);
2113  	memset((caddr_t)(iadev->seg_ram+UBR_SCHED_TABLE*iadev->memSize),
2114                                                        0, iadev->num_vc*8);
2115 	/* ABR scheduling Table(0x5000-0x57ff) and wait queue(0x5800-0x5fff)*/
2116 	/* initialize all bytes of ABR scheduler table and wait queue to 0
2117 		- SCHEDSZ is 1K (# of entries).
2118 		- ABR Table size is 2K
2119 		- ABR wait queue is 2K
2120 	   since the table and wait queues are contiguous, all the bytes
2121 	   can be initialized by one memeset.
2122 	*/
2123         i = ABR_SCHED_TABLE * iadev->memSize;
2124         writew((i >> 11) & 0xffff, iadev->seg_reg+ABR_SBPTR_BASE);
2125         i = ABR_WAIT_Q * iadev->memSize;
2126         writew((i >> 7) & 0xffff, iadev->seg_reg+ABRWQ_BASE);
2127 
2128         i = ABR_SCHED_TABLE*iadev->memSize;
2129 	memset((caddr_t)(iadev->seg_ram+i),  0, iadev->num_vc*4);
2130 	vc = (struct main_vc *)iadev->MAIN_VC_TABLE_ADDR;
2131 	evc = (struct ext_vc *)iadev->EXT_VC_TABLE_ADDR;
2132 	iadev->testTable = kmalloc_array(iadev->num_vc,
2133 					 sizeof(*iadev->testTable),
2134 					 GFP_KERNEL);
2135         if (!iadev->testTable) {
2136            printk("Get freepage  failed\n");
2137 	   goto err_free_desc_tbl;
2138         }
2139 	for(i=0; i<iadev->num_vc; i++)
2140 	{
2141 		memset((caddr_t)vc, 0, sizeof(*vc));
2142 		memset((caddr_t)evc, 0, sizeof(*evc));
2143                 iadev->testTable[i] = kmalloc(sizeof(struct testTable_t),
2144 						GFP_KERNEL);
2145 		if (!iadev->testTable[i])
2146 			goto err_free_test_tables;
2147               	iadev->testTable[i]->lastTime = 0;
2148  		iadev->testTable[i]->fract = 0;
2149                 iadev->testTable[i]->vc_status = VC_UBR;
2150 		vc++;
2151 		evc++;
2152 	}
2153 
2154 	/* Other Initialization */
2155 
2156 	/* Max Rate Register */
2157         if (iadev->phy_type & FE_25MBIT_PHY) {
2158 	   writew(RATE25, iadev->seg_reg+MAXRATE);
2159 	   writew((UBR_EN | (0x23 << 2)), iadev->seg_reg+STPARMS);
2160         }
2161         else {
2162 	   writew(cellrate_to_float(iadev->LineRate),iadev->seg_reg+MAXRATE);
2163 	   writew((UBR_EN | ABR_EN | (0x23 << 2)), iadev->seg_reg+STPARMS);
2164         }
2165 	/* Set Idle Header Reigisters to be sure */
2166 	writew(0, iadev->seg_reg+IDLEHEADHI);
2167 	writew(0, iadev->seg_reg+IDLEHEADLO);
2168 
2169 	/* Program ABR UBR Priority Register  as  PRI_ABR_UBR_EQUAL */
2170         writew(0xaa00, iadev->seg_reg+ABRUBR_ARB);
2171 
2172         iadev->close_pending = 0;
2173         init_waitqueue_head(&iadev->close_wait);
2174         init_waitqueue_head(&iadev->timeout_wait);
2175 	skb_queue_head_init(&iadev->tx_dma_q);
2176 	ia_init_rtn_q(&iadev->tx_return_q);
2177 
2178 	/* RM Cell Protocol ID and Message Type */
2179 	writew(RM_TYPE_4_0, iadev->seg_reg+RM_TYPE);
2180         skb_queue_head_init (&iadev->tx_backlog);
2181 
2182 	/* Mode Register 1 */
2183 	writew(MODE_REG_1_VAL, iadev->seg_reg+MODE_REG_1);
2184 
2185 	/* Mode Register 0 */
2186 	writew(T_ONLINE, iadev->seg_reg+MODE_REG_0);
2187 
2188 	/* Interrupt Status Register - read to clear */
2189 	readw(iadev->seg_reg+SEG_INTR_STATUS_REG);
2190 
2191 	/* Interrupt Mask Reg- don't mask TCQ_NOT_EMPTY interrupt generation */
2192         writew(~(TRANSMIT_DONE | TCQ_NOT_EMPTY), iadev->seg_reg+SEG_MASK_REG);
2193         writew(TRANSMIT_DONE, iadev->seg_reg+SEG_INTR_STATUS_REG);
2194         iadev->tx_pkt_cnt = 0;
2195         iadev->rate_limit = iadev->LineRate / 3;
2196 
2197 	return 0;
2198 
2199 err_free_test_tables:
2200 	while (--i >= 0)
2201 		kfree(iadev->testTable[i]);
2202 	kfree(iadev->testTable);
2203 err_free_desc_tbl:
2204 	kfree(iadev->desc_tbl);
2205 err_free_all_tx_bufs:
2206 	i = iadev->num_tx_desc;
2207 err_free_tx_bufs:
2208 	while (--i >= 0) {
2209 		struct cpcs_trailer_desc *desc = iadev->tx_buf + i;
2210 
2211 		dma_unmap_single(&iadev->pci->dev, desc->dma_addr,
2212 				 sizeof(*desc->cpcs), DMA_TO_DEVICE);
2213 		kfree(desc->cpcs);
2214 	}
2215 	kfree(iadev->tx_buf);
2216 err_free_dle:
2217 	dma_free_coherent(&iadev->pci->dev, DLE_TOTAL_SIZE, iadev->tx_dle_q.start,
2218 			  iadev->tx_dle_dma);
2219 err_out:
2220 	return -ENOMEM;
2221 }
2222 
2223 static irqreturn_t ia_int(int irq, void *dev_id)
2224 {
2225    struct atm_dev *dev;
2226    IADEV *iadev;
2227    unsigned int status;
2228    int handled = 0;
2229 
2230    dev = dev_id;
2231    iadev = INPH_IA_DEV(dev);
2232    while( (status = readl(iadev->reg+IPHASE5575_BUS_STATUS_REG) & 0x7f))
2233    {
2234 	handled = 1;
2235         IF_EVENT(printk("ia_int: status = 0x%x\n", status);)
2236 	if (status & STAT_REASSINT)
2237 	{
2238 	   /* do something */
2239 	   IF_EVENT(printk("REASSINT Bus status reg: %08x\n", status);)
2240 	   rx_intr(dev);
2241 	}
2242 	if (status & STAT_DLERINT)
2243 	{
2244 	   /* Clear this bit by writing a 1 to it. */
2245 	   writel(STAT_DLERINT, iadev->reg + IPHASE5575_BUS_STATUS_REG);
2246 	   rx_dle_intr(dev);
2247 	}
2248 	if (status & STAT_SEGINT)
2249 	{
2250 	   /* do something */
2251            IF_EVENT(printk("IA: tx_intr \n");)
2252 	   tx_intr(dev);
2253 	}
2254 	if (status & STAT_DLETINT)
2255 	{
2256 	   writel(STAT_DLETINT, iadev->reg + IPHASE5575_BUS_STATUS_REG);
2257 	   tx_dle_intr(dev);
2258 	}
2259 	if (status & (STAT_FEINT | STAT_ERRINT | STAT_MARKINT))
2260 	{
2261            if (status & STAT_FEINT)
2262                ia_frontend_intr(iadev);
2263 	}
2264    }
2265    return IRQ_RETVAL(handled);
2266 }
2267 
2268 
2269 
2270 /*----------------------------- entries --------------------------------*/
2271 static int get_esi(struct atm_dev *dev)
2272 {
2273 	IADEV *iadev;
2274 	int i;
2275 	u32 mac1;
2276 	u16 mac2;
2277 
2278 	iadev = INPH_IA_DEV(dev);
2279 	mac1 = cpu_to_be32(le32_to_cpu(readl(
2280 				iadev->reg+IPHASE5575_MAC1)));
2281 	mac2 = cpu_to_be16(le16_to_cpu(readl(iadev->reg+IPHASE5575_MAC2)));
2282 	IF_INIT(printk("ESI: 0x%08x%04x\n", mac1, mac2);)
2283 	for (i=0; i<MAC1_LEN; i++)
2284 		dev->esi[i] = mac1 >>(8*(MAC1_LEN-1-i));
2285 
2286 	for (i=0; i<MAC2_LEN; i++)
2287 		dev->esi[i+MAC1_LEN] = mac2 >>(8*(MAC2_LEN - 1 -i));
2288 	return 0;
2289 }
2290 
2291 static int reset_sar(struct atm_dev *dev)
2292 {
2293 	IADEV *iadev;
2294 	int i, error = 1;
2295 	unsigned int pci[64];
2296 
2297 	iadev = INPH_IA_DEV(dev);
2298 	for(i=0; i<64; i++)
2299 	  if ((error = pci_read_config_dword(iadev->pci,
2300 				i*4, &pci[i])) != PCIBIOS_SUCCESSFUL)
2301   	      return error;
2302 	writel(0, iadev->reg+IPHASE5575_EXT_RESET);
2303 	for(i=0; i<64; i++)
2304 	  if ((error = pci_write_config_dword(iadev->pci,
2305 					i*4, pci[i])) != PCIBIOS_SUCCESSFUL)
2306 	    return error;
2307 	udelay(5);
2308 	return 0;
2309 }
2310 
2311 
2312 static int ia_init(struct atm_dev *dev)
2313 {
2314 	IADEV *iadev;
2315 	unsigned long real_base;
2316 	void __iomem *base;
2317 	unsigned short command;
2318 	int error, i;
2319 
2320 	/* The device has been identified and registered. Now we read
2321 	   necessary configuration info like memory base address,
2322 	   interrupt number etc */
2323 
2324 	IF_INIT(printk(">ia_init\n");)
2325 	dev->ci_range.vpi_bits = 0;
2326 	dev->ci_range.vci_bits = NR_VCI_LD;
2327 
2328 	iadev = INPH_IA_DEV(dev);
2329 	real_base = pci_resource_start (iadev->pci, 0);
2330 	iadev->irq = iadev->pci->irq;
2331 
2332 	error = pci_read_config_word(iadev->pci, PCI_COMMAND, &command);
2333 	if (error) {
2334 		printk(KERN_ERR DEV_LABEL "(itf %d): init error 0x%x\n",
2335 				dev->number,error);
2336 		return -EINVAL;
2337 	}
2338 	IF_INIT(printk(DEV_LABEL "(itf %d): rev.%d,realbase=0x%lx,irq=%d\n",
2339 			dev->number, iadev->pci->revision, real_base, iadev->irq);)
2340 
2341 	/* find mapping size of board */
2342 
2343 	iadev->pci_map_size = pci_resource_len(iadev->pci, 0);
2344 
2345         if (iadev->pci_map_size == 0x100000){
2346           iadev->num_vc = 4096;
2347 	  dev->ci_range.vci_bits = NR_VCI_4K_LD;
2348           iadev->memSize = 4;
2349         }
2350         else if (iadev->pci_map_size == 0x40000) {
2351           iadev->num_vc = 1024;
2352           iadev->memSize = 1;
2353         }
2354         else {
2355            printk("Unknown pci_map_size = 0x%x\n", iadev->pci_map_size);
2356            return -EINVAL;
2357         }
2358 	IF_INIT(printk (DEV_LABEL "map size: %i\n", iadev->pci_map_size);)
2359 
2360 	/* enable bus mastering */
2361 	pci_set_master(iadev->pci);
2362 
2363 	/*
2364 	 * Delay at least 1us before doing any mem accesses (how 'bout 10?)
2365 	 */
2366 	udelay(10);
2367 
2368 	/* mapping the physical address to a virtual address in address space */
2369 	base = ioremap(real_base,iadev->pci_map_size);  /* ioremap is not resolved ??? */
2370 
2371 	if (!base)
2372 	{
2373 		printk(DEV_LABEL " (itf %d): can't set up page mapping\n",
2374 			    dev->number);
2375 		return -ENOMEM;
2376 	}
2377 	IF_INIT(printk(DEV_LABEL " (itf %d): rev.%d,base=%p,irq=%d\n",
2378 			dev->number, iadev->pci->revision, base, iadev->irq);)
2379 
2380 	/* filling the iphase dev structure */
2381 	iadev->mem = iadev->pci_map_size /2;
2382 	iadev->real_base = real_base;
2383 	iadev->base = base;
2384 
2385 	/* Bus Interface Control Registers */
2386 	iadev->reg = base + REG_BASE;
2387 	/* Segmentation Control Registers */
2388 	iadev->seg_reg = base + SEG_BASE;
2389 	/* Reassembly Control Registers */
2390 	iadev->reass_reg = base + REASS_BASE;
2391 	/* Front end/ DMA control registers */
2392 	iadev->phy = base + PHY_BASE;
2393 	iadev->dma = base + PHY_BASE;
2394 	/* RAM - Segmentation RAm and Reassembly RAM */
2395 	iadev->ram = base + ACTUAL_RAM_BASE;
2396 	iadev->seg_ram = base + ACTUAL_SEG_RAM_BASE;
2397 	iadev->reass_ram = base + ACTUAL_REASS_RAM_BASE;
2398 
2399 	/* lets print out the above */
2400 	IF_INIT(printk("Base addrs: %p %p %p \n %p %p %p %p\n",
2401           iadev->reg,iadev->seg_reg,iadev->reass_reg,
2402           iadev->phy, iadev->ram, iadev->seg_ram,
2403           iadev->reass_ram);)
2404 
2405 	/* lets try reading the MAC address */
2406 	error = get_esi(dev);
2407 	if (error) {
2408 	  iounmap(iadev->base);
2409 	  return error;
2410 	}
2411         printk("IA: ");
2412 	for (i=0; i < ESI_LEN; i++)
2413                 printk("%s%02X",i ? "-" : "",dev->esi[i]);
2414         printk("\n");
2415 
2416         /* reset SAR */
2417         if (reset_sar(dev)) {
2418 	   iounmap(iadev->base);
2419            printk("IA: reset SAR fail, please try again\n");
2420            return 1;
2421         }
2422 	return 0;
2423 }
2424 
2425 static void ia_update_stats(IADEV *iadev) {
2426     if (!iadev->carrier_detect)
2427         return;
2428     iadev->rx_cell_cnt += readw(iadev->reass_reg+CELL_CTR0)&0xffff;
2429     iadev->rx_cell_cnt += (readw(iadev->reass_reg+CELL_CTR1) & 0xffff) << 16;
2430     iadev->drop_rxpkt +=  readw(iadev->reass_reg + DRP_PKT_CNTR ) & 0xffff;
2431     iadev->drop_rxcell += readw(iadev->reass_reg + ERR_CNTR) & 0xffff;
2432     iadev->tx_cell_cnt += readw(iadev->seg_reg + CELL_CTR_LO_AUTO)&0xffff;
2433     iadev->tx_cell_cnt += (readw(iadev->seg_reg+CELL_CTR_HIGH_AUTO)&0xffff)<<16;
2434     return;
2435 }
2436 
2437 static void ia_led_timer(struct timer_list *unused) {
2438  	unsigned long flags;
2439   	static u_char blinking[8] = {0, 0, 0, 0, 0, 0, 0, 0};
2440         u_char i;
2441         static u32 ctrl_reg;
2442         for (i = 0; i < iadev_count; i++) {
2443            if (ia_dev[i]) {
2444 	      ctrl_reg = readl(ia_dev[i]->reg+IPHASE5575_BUS_CONTROL_REG);
2445 	      if (blinking[i] == 0) {
2446 		 blinking[i]++;
2447                  ctrl_reg &= (~CTRL_LED);
2448                  writel(ctrl_reg, ia_dev[i]->reg+IPHASE5575_BUS_CONTROL_REG);
2449                  ia_update_stats(ia_dev[i]);
2450               }
2451               else {
2452 		 blinking[i] = 0;
2453 		 ctrl_reg |= CTRL_LED;
2454                  writel(ctrl_reg, ia_dev[i]->reg+IPHASE5575_BUS_CONTROL_REG);
2455                  spin_lock_irqsave(&ia_dev[i]->tx_lock, flags);
2456                  if (ia_dev[i]->close_pending)
2457                     wake_up(&ia_dev[i]->close_wait);
2458                  ia_tx_poll(ia_dev[i]);
2459                  spin_unlock_irqrestore(&ia_dev[i]->tx_lock, flags);
2460               }
2461            }
2462         }
2463 	mod_timer(&ia_timer, jiffies + HZ / 4);
2464  	return;
2465 }
2466 
2467 static void ia_phy_put(struct atm_dev *dev, unsigned char value,
2468 	unsigned long addr)
2469 {
2470 	writel(value, INPH_IA_DEV(dev)->phy+addr);
2471 }
2472 
2473 static unsigned char ia_phy_get(struct atm_dev *dev, unsigned long addr)
2474 {
2475 	return readl(INPH_IA_DEV(dev)->phy+addr);
2476 }
2477 
2478 static void ia_free_tx(IADEV *iadev)
2479 {
2480 	int i;
2481 
2482 	kfree(iadev->desc_tbl);
2483 	for (i = 0; i < iadev->num_vc; i++)
2484 		kfree(iadev->testTable[i]);
2485 	kfree(iadev->testTable);
2486 	for (i = 0; i < iadev->num_tx_desc; i++) {
2487 		struct cpcs_trailer_desc *desc = iadev->tx_buf + i;
2488 
2489 		dma_unmap_single(&iadev->pci->dev, desc->dma_addr,
2490 				 sizeof(*desc->cpcs), DMA_TO_DEVICE);
2491 		kfree(desc->cpcs);
2492 	}
2493 	kfree(iadev->tx_buf);
2494 	dma_free_coherent(&iadev->pci->dev, DLE_TOTAL_SIZE, iadev->tx_dle_q.start,
2495 			  iadev->tx_dle_dma);
2496 }
2497 
2498 static void ia_free_rx(IADEV *iadev)
2499 {
2500 	kfree(iadev->rx_open);
2501 	dma_free_coherent(&iadev->pci->dev, DLE_TOTAL_SIZE, iadev->rx_dle_q.start,
2502 			  iadev->rx_dle_dma);
2503 }
2504 
2505 static int ia_start(struct atm_dev *dev)
2506 {
2507 	IADEV *iadev;
2508 	int error;
2509 	unsigned char phy;
2510 	u32 ctrl_reg;
2511 	IF_EVENT(printk(">ia_start\n");)
2512 	iadev = INPH_IA_DEV(dev);
2513         if (request_irq(iadev->irq, &ia_int, IRQF_SHARED, DEV_LABEL, dev)) {
2514                 printk(KERN_ERR DEV_LABEL "(itf %d): IRQ%d is already in use\n",
2515                     dev->number, iadev->irq);
2516 		error = -EAGAIN;
2517 		goto err_out;
2518         }
2519         /* @@@ should release IRQ on error */
2520 	/* enabling memory + master */
2521         if ((error = pci_write_config_word(iadev->pci,
2522 				PCI_COMMAND,
2523 				PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER )))
2524 	{
2525                 printk(KERN_ERR DEV_LABEL "(itf %d): can't enable memory+"
2526                     "master (0x%x)\n",dev->number, error);
2527 		error = -EIO;
2528 		goto err_free_irq;
2529         }
2530 	udelay(10);
2531 
2532 	/* Maybe we should reset the front end, initialize Bus Interface Control
2533 		Registers and see. */
2534 
2535 	IF_INIT(printk("Bus ctrl reg: %08x\n",
2536                             readl(iadev->reg+IPHASE5575_BUS_CONTROL_REG));)
2537 	ctrl_reg = readl(iadev->reg+IPHASE5575_BUS_CONTROL_REG);
2538 	ctrl_reg = (ctrl_reg & (CTRL_LED | CTRL_FE_RST))
2539 			| CTRL_B8
2540 			| CTRL_B16
2541 			| CTRL_B32
2542 			| CTRL_B48
2543 			| CTRL_B64
2544 			| CTRL_B128
2545 			| CTRL_ERRMASK
2546 			| CTRL_DLETMASK		/* shud be removed l8r */
2547 			| CTRL_DLERMASK
2548 			| CTRL_SEGMASK
2549 			| CTRL_REASSMASK
2550 			| CTRL_FEMASK
2551 			| CTRL_CSPREEMPT;
2552 
2553        writel(ctrl_reg, iadev->reg+IPHASE5575_BUS_CONTROL_REG);
2554 
2555 	IF_INIT(printk("Bus ctrl reg after initializing: %08x\n",
2556                            readl(iadev->reg+IPHASE5575_BUS_CONTROL_REG));
2557 	   printk("Bus status reg after init: %08x\n",
2558                             readl(iadev->reg+IPHASE5575_BUS_STATUS_REG));)
2559 
2560         ia_hw_type(iadev);
2561 	error = tx_init(dev);
2562 	if (error)
2563 		goto err_free_irq;
2564 	error = rx_init(dev);
2565 	if (error)
2566 		goto err_free_tx;
2567 
2568 	ctrl_reg = readl(iadev->reg+IPHASE5575_BUS_CONTROL_REG);
2569        	writel(ctrl_reg | CTRL_FE_RST, iadev->reg+IPHASE5575_BUS_CONTROL_REG);
2570 	IF_INIT(printk("Bus ctrl reg after initializing: %08x\n",
2571                                readl(iadev->reg+IPHASE5575_BUS_CONTROL_REG));)
2572         phy = 0; /* resolve compiler complaint */
2573         IF_INIT (
2574 	if ((phy=ia_phy_get(dev,0)) == 0x30)
2575 		printk("IA: pm5346,rev.%d\n",phy&0x0f);
2576 	else
2577 		printk("IA: utopia,rev.%0x\n",phy);)
2578 
2579 	if (iadev->phy_type &  FE_25MBIT_PHY)
2580            ia_mb25_init(iadev);
2581 	else if (iadev->phy_type & (FE_DS3_PHY | FE_E3_PHY))
2582            ia_suni_pm7345_init(iadev);
2583 	else {
2584 		error = suni_init(dev);
2585 		if (error)
2586 			goto err_free_rx;
2587 		if (dev->phy->start) {
2588 			error = dev->phy->start(dev);
2589 			if (error)
2590 				goto err_free_rx;
2591 		}
2592 		/* Get iadev->carrier_detect status */
2593 		ia_frontend_intr(iadev);
2594 	}
2595 	return 0;
2596 
2597 err_free_rx:
2598 	ia_free_rx(iadev);
2599 err_free_tx:
2600 	ia_free_tx(iadev);
2601 err_free_irq:
2602 	free_irq(iadev->irq, dev);
2603 err_out:
2604 	return error;
2605 }
2606 
2607 static void ia_close(struct atm_vcc *vcc)
2608 {
2609 	DEFINE_WAIT(wait);
2610         u16 *vc_table;
2611         IADEV *iadev;
2612         struct ia_vcc *ia_vcc;
2613         struct sk_buff *skb = NULL;
2614         struct sk_buff_head tmp_tx_backlog, tmp_vcc_backlog;
2615         unsigned long closetime, flags;
2616 
2617         iadev = INPH_IA_DEV(vcc->dev);
2618         ia_vcc = INPH_IA_VCC(vcc);
2619 	if (!ia_vcc) return;
2620 
2621         IF_EVENT(printk("ia_close: ia_vcc->vc_desc_cnt = %d  vci = %d\n",
2622                                               ia_vcc->vc_desc_cnt,vcc->vci);)
2623 	clear_bit(ATM_VF_READY,&vcc->flags);
2624         skb_queue_head_init (&tmp_tx_backlog);
2625         skb_queue_head_init (&tmp_vcc_backlog);
2626         if (vcc->qos.txtp.traffic_class != ATM_NONE) {
2627            iadev->close_pending++;
2628 	   prepare_to_wait(&iadev->timeout_wait, &wait, TASK_UNINTERRUPTIBLE);
2629 	   schedule_timeout(msecs_to_jiffies(500));
2630 	   finish_wait(&iadev->timeout_wait, &wait);
2631            spin_lock_irqsave(&iadev->tx_lock, flags);
2632            while((skb = skb_dequeue(&iadev->tx_backlog))) {
2633               if (ATM_SKB(skb)->vcc == vcc){
2634                  if (vcc->pop) vcc->pop(vcc, skb);
2635                  else dev_kfree_skb_any(skb);
2636               }
2637               else
2638                  skb_queue_tail(&tmp_tx_backlog, skb);
2639            }
2640            while((skb = skb_dequeue(&tmp_tx_backlog)))
2641              skb_queue_tail(&iadev->tx_backlog, skb);
2642            IF_EVENT(printk("IA TX Done decs_cnt = %d\n", ia_vcc->vc_desc_cnt);)
2643            closetime = 300000 / ia_vcc->pcr;
2644            if (closetime == 0)
2645               closetime = 1;
2646            spin_unlock_irqrestore(&iadev->tx_lock, flags);
2647            wait_event_timeout(iadev->close_wait, (ia_vcc->vc_desc_cnt <= 0), closetime);
2648            spin_lock_irqsave(&iadev->tx_lock, flags);
2649            iadev->close_pending--;
2650            iadev->testTable[vcc->vci]->lastTime = 0;
2651            iadev->testTable[vcc->vci]->fract = 0;
2652            iadev->testTable[vcc->vci]->vc_status = VC_UBR;
2653            if (vcc->qos.txtp.traffic_class == ATM_ABR) {
2654               if (vcc->qos.txtp.min_pcr > 0)
2655                  iadev->sum_mcr -= vcc->qos.txtp.min_pcr;
2656            }
2657            if (vcc->qos.txtp.traffic_class == ATM_CBR) {
2658               ia_vcc = INPH_IA_VCC(vcc);
2659               iadev->sum_mcr -= ia_vcc->NumCbrEntry*iadev->Granularity;
2660               ia_cbrVc_close (vcc);
2661            }
2662            spin_unlock_irqrestore(&iadev->tx_lock, flags);
2663         }
2664 
2665         if (vcc->qos.rxtp.traffic_class != ATM_NONE) {
2666            // reset reass table
2667            vc_table = (u16 *)(iadev->reass_ram+REASS_TABLE*iadev->memSize);
2668            vc_table += vcc->vci;
2669            *vc_table = NO_AAL5_PKT;
2670            // reset vc table
2671            vc_table = (u16 *)(iadev->reass_ram+RX_VC_TABLE*iadev->memSize);
2672            vc_table += vcc->vci;
2673            *vc_table = (vcc->vci << 6) | 15;
2674            if (vcc->qos.rxtp.traffic_class == ATM_ABR) {
2675               struct abr_vc_table __iomem *abr_vc_table =
2676                                 (iadev->reass_ram+ABR_VC_TABLE*iadev->memSize);
2677               abr_vc_table +=  vcc->vci;
2678               abr_vc_table->rdf = 0x0003;
2679               abr_vc_table->air = 0x5eb1;
2680            }
2681            // Drain the packets
2682            rx_dle_intr(vcc->dev);
2683            iadev->rx_open[vcc->vci] = NULL;
2684         }
2685 	kfree(INPH_IA_VCC(vcc));
2686         ia_vcc = NULL;
2687         vcc->dev_data = NULL;
2688         clear_bit(ATM_VF_ADDR,&vcc->flags);
2689         return;
2690 }
2691 
2692 static int ia_open(struct atm_vcc *vcc)
2693 {
2694 	struct ia_vcc *ia_vcc;
2695 	int error;
2696 	if (!test_bit(ATM_VF_PARTIAL,&vcc->flags))
2697 	{
2698 		IF_EVENT(printk("ia: not partially allocated resources\n");)
2699 		vcc->dev_data = NULL;
2700 	}
2701 	if (vcc->vci != ATM_VPI_UNSPEC && vcc->vpi != ATM_VCI_UNSPEC)
2702 	{
2703 		IF_EVENT(printk("iphase open: unspec part\n");)
2704 		set_bit(ATM_VF_ADDR,&vcc->flags);
2705 	}
2706 	if (vcc->qos.aal != ATM_AAL5)
2707 		return -EINVAL;
2708 	IF_EVENT(printk(DEV_LABEL "(itf %d): open %d.%d\n",
2709                                  vcc->dev->number, vcc->vpi, vcc->vci);)
2710 
2711 	/* Device dependent initialization */
2712 	ia_vcc = kmalloc(sizeof(*ia_vcc), GFP_KERNEL);
2713 	if (!ia_vcc) return -ENOMEM;
2714 	vcc->dev_data = ia_vcc;
2715 
2716 	if ((error = open_rx(vcc)))
2717 	{
2718 		IF_EVENT(printk("iadev: error in open_rx, closing\n");)
2719 		ia_close(vcc);
2720 		return error;
2721 	}
2722 
2723 	if ((error = open_tx(vcc)))
2724 	{
2725 		IF_EVENT(printk("iadev: error in open_tx, closing\n");)
2726 		ia_close(vcc);
2727 		return error;
2728 	}
2729 
2730 	set_bit(ATM_VF_READY,&vcc->flags);
2731 
2732 #if 0
2733         {
2734            static u8 first = 1;
2735            if (first) {
2736               ia_timer.expires = jiffies + 3*HZ;
2737               add_timer(&ia_timer);
2738               first = 0;
2739            }
2740         }
2741 #endif
2742 	IF_EVENT(printk("ia open returning\n");)
2743 	return 0;
2744 }
2745 
2746 static int ia_change_qos(struct atm_vcc *vcc, struct atm_qos *qos, int flags)
2747 {
2748 	IF_EVENT(printk(">ia_change_qos\n");)
2749 	return 0;
2750 }
2751 
2752 static int ia_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg)
2753 {
2754    IA_CMDBUF ia_cmds;
2755    IADEV *iadev;
2756    int i, board;
2757    u16 __user *tmps;
2758    IF_EVENT(printk(">ia_ioctl\n");)
2759    if (cmd != IA_CMD) {
2760       if (!dev->phy->ioctl) return -EINVAL;
2761       return dev->phy->ioctl(dev,cmd,arg);
2762    }
2763    if (copy_from_user(&ia_cmds, arg, sizeof ia_cmds)) return -EFAULT;
2764    board = ia_cmds.status;
2765 
2766 	if ((board < 0) || (board > iadev_count))
2767 		board = 0;
2768 	board = array_index_nospec(board, iadev_count + 1);
2769 
2770    iadev = ia_dev[board];
2771    switch (ia_cmds.cmd) {
2772    case MEMDUMP:
2773    {
2774 	switch (ia_cmds.sub_cmd) {
2775           case MEMDUMP_SEGREG:
2776 	     if (!capable(CAP_NET_ADMIN)) return -EPERM;
2777              tmps = (u16 __user *)ia_cmds.buf;
2778              for(i=0; i<0x80; i+=2, tmps++)
2779                 if(put_user((u16)(readl(iadev->seg_reg+i) & 0xffff), tmps)) return -EFAULT;
2780              ia_cmds.status = 0;
2781              ia_cmds.len = 0x80;
2782              break;
2783           case MEMDUMP_REASSREG:
2784 	     if (!capable(CAP_NET_ADMIN)) return -EPERM;
2785              tmps = (u16 __user *)ia_cmds.buf;
2786              for(i=0; i<0x80; i+=2, tmps++)
2787                 if(put_user((u16)(readl(iadev->reass_reg+i) & 0xffff), tmps)) return -EFAULT;
2788              ia_cmds.status = 0;
2789              ia_cmds.len = 0x80;
2790              break;
2791           case MEMDUMP_FFL:
2792           {
2793              ia_regs_t       *regs_local;
2794              ffredn_t        *ffL;
2795              rfredn_t        *rfL;
2796 
2797 	     if (!capable(CAP_NET_ADMIN)) return -EPERM;
2798 	     regs_local = kmalloc(sizeof(*regs_local), GFP_KERNEL);
2799 	     if (!regs_local) return -ENOMEM;
2800 	     ffL = &regs_local->ffredn;
2801 	     rfL = &regs_local->rfredn;
2802              /* Copy real rfred registers into the local copy */
2803  	     for (i=0; i<(sizeof (rfredn_t))/4; i++)
2804                 ((u_int *)rfL)[i] = readl(iadev->reass_reg + i) & 0xffff;
2805              	/* Copy real ffred registers into the local copy */
2806 	     for (i=0; i<(sizeof (ffredn_t))/4; i++)
2807                 ((u_int *)ffL)[i] = readl(iadev->seg_reg + i) & 0xffff;
2808 
2809              if (copy_to_user(ia_cmds.buf, regs_local,sizeof(ia_regs_t))) {
2810                 kfree(regs_local);
2811                 return -EFAULT;
2812              }
2813              kfree(regs_local);
2814              printk("Board %d registers dumped\n", board);
2815              ia_cmds.status = 0;
2816 	 }
2817     	     break;
2818          case READ_REG:
2819          {
2820 	     if (!capable(CAP_NET_ADMIN)) return -EPERM;
2821              desc_dbg(iadev);
2822              ia_cmds.status = 0;
2823          }
2824              break;
2825          case 0x6:
2826          {
2827              ia_cmds.status = 0;
2828              printk("skb = 0x%p\n", skb_peek(&iadev->tx_backlog));
2829              printk("rtn_q: 0x%p\n",ia_deque_rtn_q(&iadev->tx_return_q));
2830          }
2831              break;
2832          case 0x8:
2833          {
2834              struct k_sonet_stats *stats;
2835              stats = &PRIV(_ia_dev[board])->sonet_stats;
2836              printk("section_bip: %d\n", atomic_read(&stats->section_bip));
2837              printk("line_bip   : %d\n", atomic_read(&stats->line_bip));
2838              printk("path_bip   : %d\n", atomic_read(&stats->path_bip));
2839              printk("line_febe  : %d\n", atomic_read(&stats->line_febe));
2840              printk("path_febe  : %d\n", atomic_read(&stats->path_febe));
2841              printk("corr_hcs   : %d\n", atomic_read(&stats->corr_hcs));
2842              printk("uncorr_hcs : %d\n", atomic_read(&stats->uncorr_hcs));
2843              printk("tx_cells   : %d\n", atomic_read(&stats->tx_cells));
2844              printk("rx_cells   : %d\n", atomic_read(&stats->rx_cells));
2845          }
2846             ia_cmds.status = 0;
2847             break;
2848          case 0x9:
2849 	    if (!capable(CAP_NET_ADMIN)) return -EPERM;
2850             for (i = 1; i <= iadev->num_rx_desc; i++)
2851                free_desc(_ia_dev[board], i);
2852             writew( ~(RX_FREEQ_EMPT | RX_EXCP_RCVD),
2853                                             iadev->reass_reg+REASS_MASK_REG);
2854             iadev->rxing = 1;
2855 
2856             ia_cmds.status = 0;
2857             break;
2858 
2859          case 0xb:
2860 	    if (!capable(CAP_NET_ADMIN)) return -EPERM;
2861             ia_frontend_intr(iadev);
2862             break;
2863          case 0xa:
2864 	    if (!capable(CAP_NET_ADMIN)) return -EPERM;
2865          {
2866              ia_cmds.status = 0;
2867              IADebugFlag = ia_cmds.maddr;
2868              printk("New debug option loaded\n");
2869          }
2870              break;
2871          default:
2872              ia_cmds.status = 0;
2873              break;
2874       }
2875    }
2876       break;
2877    default:
2878       break;
2879 
2880    }
2881    return 0;
2882 }
2883 
2884 static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) {
2885         IADEV *iadev;
2886         struct dle *wr_ptr;
2887         struct tx_buf_desc __iomem *buf_desc_ptr;
2888         int desc;
2889         int comp_code;
2890         int total_len;
2891         struct cpcs_trailer *trailer;
2892         struct ia_vcc *iavcc;
2893 
2894         iadev = INPH_IA_DEV(vcc->dev);
2895         iavcc = INPH_IA_VCC(vcc);
2896         if (!iavcc->txing) {
2897            printk("discard packet on closed VC\n");
2898            if (vcc->pop)
2899 		vcc->pop(vcc, skb);
2900            else
2901 		dev_kfree_skb_any(skb);
2902 	   return 0;
2903         }
2904 
2905         if (skb->len > iadev->tx_buf_sz - 8) {
2906            printk("Transmit size over tx buffer size\n");
2907            if (vcc->pop)
2908                  vcc->pop(vcc, skb);
2909            else
2910                  dev_kfree_skb_any(skb);
2911           return 0;
2912         }
2913         if ((unsigned long)skb->data & 3) {
2914            printk("Misaligned SKB\n");
2915            if (vcc->pop)
2916                  vcc->pop(vcc, skb);
2917            else
2918                  dev_kfree_skb_any(skb);
2919            return 0;
2920         }
2921 	/* Get a descriptor number from our free descriptor queue
2922 	   We get the descr number from the TCQ now, since I am using
2923 	   the TCQ as a free buffer queue. Initially TCQ will be
2924 	   initialized with all the descriptors and is hence, full.
2925 	*/
2926 	desc = get_desc (iadev, iavcc);
2927 	if (desc == 0xffff)
2928 	    return 1;
2929 	comp_code = desc >> 13;
2930 	desc &= 0x1fff;
2931 
2932 	if ((desc == 0) || (desc > iadev->num_tx_desc))
2933 	{
2934 		IF_ERR(printk(DEV_LABEL "invalid desc for send: %d\n", desc);)
2935                 atomic_inc(&vcc->stats->tx);
2936 		if (vcc->pop)
2937 		    vcc->pop(vcc, skb);
2938 		else
2939 		    dev_kfree_skb_any(skb);
2940 		return 0;   /* return SUCCESS */
2941 	}
2942 
2943 	if (comp_code)
2944 	{
2945 	    IF_ERR(printk(DEV_LABEL "send desc:%d completion code %d error\n",
2946                                                             desc, comp_code);)
2947 	}
2948 
2949         /* remember the desc and vcc mapping */
2950         iavcc->vc_desc_cnt++;
2951         iadev->desc_tbl[desc-1].iavcc = iavcc;
2952         iadev->desc_tbl[desc-1].txskb = skb;
2953         IA_SKB_STATE(skb) = 0;
2954 
2955         iadev->ffL.tcq_rd += 2;
2956         if (iadev->ffL.tcq_rd > iadev->ffL.tcq_ed)
2957 	  	iadev->ffL.tcq_rd  = iadev->ffL.tcq_st;
2958 	writew(iadev->ffL.tcq_rd, iadev->seg_reg+TCQ_RD_PTR);
2959 
2960 	/* Put the descriptor number in the packet ready queue
2961 		and put the updated write pointer in the DLE field
2962 	*/
2963 	*(u16*)(iadev->seg_ram+iadev->ffL.prq_wr) = desc;
2964 
2965  	iadev->ffL.prq_wr += 2;
2966         if (iadev->ffL.prq_wr > iadev->ffL.prq_ed)
2967                 iadev->ffL.prq_wr = iadev->ffL.prq_st;
2968 
2969 	/* Figure out the exact length of the packet and padding required to
2970            make it  aligned on a 48 byte boundary.  */
2971 	total_len = skb->len + sizeof(struct cpcs_trailer);
2972 	total_len = ((total_len + 47) / 48) * 48;
2973 	IF_TX(printk("ia packet len:%d padding:%d\n", total_len, total_len - skb->len);)
2974 
2975 	/* Put the packet in a tx buffer */
2976 	trailer = iadev->tx_buf[desc-1].cpcs;
2977         IF_TX(printk("Sent: skb = 0x%p skb->data: 0x%p len: %d, desc: %d\n",
2978                   skb, skb->data, skb->len, desc);)
2979 	trailer->control = 0;
2980         /*big endian*/
2981 	trailer->length = ((skb->len & 0xff) << 8) | ((skb->len & 0xff00) >> 8);
2982 	trailer->crc32 = 0;	/* not needed - dummy bytes */
2983 
2984 	/* Display the packet */
2985 	IF_TXPKT(printk("Sent data: len = %d MsgNum = %d\n",
2986                                                         skb->len, tcnter++);
2987         xdump(skb->data, skb->len, "TX: ");
2988         printk("\n");)
2989 
2990 	/* Build the buffer descriptor */
2991 	buf_desc_ptr = iadev->seg_ram+TX_DESC_BASE;
2992 	buf_desc_ptr += desc;	/* points to the corresponding entry */
2993 	buf_desc_ptr->desc_mode = AAL5 | EOM_EN | APP_CRC32 | CMPL_INT;
2994 	/* Huh ? p.115 of users guide describes this as a read-only register */
2995         writew(TRANSMIT_DONE, iadev->seg_reg+SEG_INTR_STATUS_REG);
2996 	buf_desc_ptr->vc_index = vcc->vci;
2997 	buf_desc_ptr->bytes = total_len;
2998 
2999         if (vcc->qos.txtp.traffic_class == ATM_ABR)
3000 	   clear_lockup (vcc, iadev);
3001 
3002 	/* Build the DLE structure */
3003 	wr_ptr = iadev->tx_dle_q.write;
3004 	memset((caddr_t)wr_ptr, 0, sizeof(*wr_ptr));
3005 	wr_ptr->sys_pkt_addr = dma_map_single(&iadev->pci->dev, skb->data,
3006 					      skb->len, DMA_TO_DEVICE);
3007 	wr_ptr->local_pkt_addr = (buf_desc_ptr->buf_start_hi << 16) |
3008                                                   buf_desc_ptr->buf_start_lo;
3009 	/* wr_ptr->bytes = swap_byte_order(total_len); didn't seem to affect?? */
3010 	wr_ptr->bytes = skb->len;
3011 
3012         /* hw bug - DLEs of 0x2d, 0x2e, 0x2f cause DMA lockup */
3013         if ((wr_ptr->bytes >> 2) == 0xb)
3014            wr_ptr->bytes = 0x30;
3015 
3016 	wr_ptr->mode = TX_DLE_PSI;
3017 	wr_ptr->prq_wr_ptr_data = 0;
3018 
3019 	/* end is not to be used for the DLE q */
3020 	if (++wr_ptr == iadev->tx_dle_q.end)
3021 		wr_ptr = iadev->tx_dle_q.start;
3022 
3023         /* Build trailer dle */
3024         wr_ptr->sys_pkt_addr = iadev->tx_buf[desc-1].dma_addr;
3025         wr_ptr->local_pkt_addr = ((buf_desc_ptr->buf_start_hi << 16) |
3026           buf_desc_ptr->buf_start_lo) + total_len - sizeof(struct cpcs_trailer);
3027 
3028         wr_ptr->bytes = sizeof(struct cpcs_trailer);
3029         wr_ptr->mode = DMA_INT_ENABLE;
3030         wr_ptr->prq_wr_ptr_data = iadev->ffL.prq_wr;
3031 
3032         /* end is not to be used for the DLE q */
3033         if (++wr_ptr == iadev->tx_dle_q.end)
3034                 wr_ptr = iadev->tx_dle_q.start;
3035 
3036 	iadev->tx_dle_q.write = wr_ptr;
3037         ATM_DESC(skb) = vcc->vci;
3038         skb_queue_tail(&iadev->tx_dma_q, skb);
3039 
3040         atomic_inc(&vcc->stats->tx);
3041         iadev->tx_pkt_cnt++;
3042 	/* Increment transaction counter */
3043 	writel(2, iadev->dma+IPHASE5575_TX_COUNTER);
3044 
3045 #if 0
3046         /* add flow control logic */
3047         if (atomic_read(&vcc->stats->tx) % 20 == 0) {
3048           if (iavcc->vc_desc_cnt > 10) {
3049              vcc->tx_quota =  vcc->tx_quota * 3 / 4;
3050             printk("Tx1:  vcc->tx_quota = %d \n", (u32)vcc->tx_quota );
3051               iavcc->flow_inc = -1;
3052               iavcc->saved_tx_quota = vcc->tx_quota;
3053            } else if ((iavcc->flow_inc < 0) && (iavcc->vc_desc_cnt < 3)) {
3054              // vcc->tx_quota = 3 * iavcc->saved_tx_quota / 4;
3055              printk("Tx2:  vcc->tx_quota = %d \n", (u32)vcc->tx_quota );
3056               iavcc->flow_inc = 0;
3057            }
3058         }
3059 #endif
3060 	IF_TX(printk("ia send done\n");)
3061 	return 0;
3062 }
3063 
3064 static int ia_send(struct atm_vcc *vcc, struct sk_buff *skb)
3065 {
3066         IADEV *iadev;
3067         unsigned long flags;
3068 
3069         iadev = INPH_IA_DEV(vcc->dev);
3070         if ((!skb)||(skb->len>(iadev->tx_buf_sz-sizeof(struct cpcs_trailer))))
3071         {
3072             if (!skb)
3073                 printk(KERN_CRIT "null skb in ia_send\n");
3074             else dev_kfree_skb_any(skb);
3075             return -EINVAL;
3076         }
3077         spin_lock_irqsave(&iadev->tx_lock, flags);
3078         if (!test_bit(ATM_VF_READY,&vcc->flags)){
3079             dev_kfree_skb_any(skb);
3080             spin_unlock_irqrestore(&iadev->tx_lock, flags);
3081             return -EINVAL;
3082         }
3083         ATM_SKB(skb)->vcc = vcc;
3084 
3085         if (skb_peek(&iadev->tx_backlog)) {
3086            skb_queue_tail(&iadev->tx_backlog, skb);
3087         }
3088         else {
3089            if (ia_pkt_tx (vcc, skb)) {
3090               skb_queue_tail(&iadev->tx_backlog, skb);
3091            }
3092         }
3093         spin_unlock_irqrestore(&iadev->tx_lock, flags);
3094         return 0;
3095 
3096 }
3097 
3098 static int ia_proc_read(struct atm_dev *dev,loff_t *pos,char *page)
3099 {
3100   int   left = *pos, n;
3101   char  *tmpPtr;
3102   IADEV *iadev = INPH_IA_DEV(dev);
3103   if(!left--) {
3104      if (iadev->phy_type == FE_25MBIT_PHY) {
3105        n = sprintf(page, "  Board Type         :  Iphase5525-1KVC-128K\n");
3106        return n;
3107      }
3108      if (iadev->phy_type == FE_DS3_PHY)
3109         n = sprintf(page, "  Board Type         :  Iphase-ATM-DS3");
3110      else if (iadev->phy_type == FE_E3_PHY)
3111         n = sprintf(page, "  Board Type         :  Iphase-ATM-E3");
3112      else if (iadev->phy_type == FE_UTP_OPTION)
3113          n = sprintf(page, "  Board Type         :  Iphase-ATM-UTP155");
3114      else
3115         n = sprintf(page, "  Board Type         :  Iphase-ATM-OC3");
3116      tmpPtr = page + n;
3117      if (iadev->pci_map_size == 0x40000)
3118         n += sprintf(tmpPtr, "-1KVC-");
3119      else
3120         n += sprintf(tmpPtr, "-4KVC-");
3121      tmpPtr = page + n;
3122      if ((iadev->memType & MEM_SIZE_MASK) == MEM_SIZE_1M)
3123         n += sprintf(tmpPtr, "1M  \n");
3124      else if ((iadev->memType & MEM_SIZE_MASK) == MEM_SIZE_512K)
3125         n += sprintf(tmpPtr, "512K\n");
3126      else
3127        n += sprintf(tmpPtr, "128K\n");
3128      return n;
3129   }
3130   if (!left) {
3131      return  sprintf(page, "  Number of Tx Buffer:  %u\n"
3132                            "  Size of Tx Buffer  :  %u\n"
3133                            "  Number of Rx Buffer:  %u\n"
3134                            "  Size of Rx Buffer  :  %u\n"
3135                            "  Packets Received   :  %u\n"
3136                            "  Packets Transmitted:  %u\n"
3137                            "  Cells Received     :  %u\n"
3138                            "  Cells Transmitted  :  %u\n"
3139                            "  Board Dropped Cells:  %u\n"
3140                            "  Board Dropped Pkts :  %u\n",
3141                            iadev->num_tx_desc,  iadev->tx_buf_sz,
3142                            iadev->num_rx_desc,  iadev->rx_buf_sz,
3143                            iadev->rx_pkt_cnt,   iadev->tx_pkt_cnt,
3144                            iadev->rx_cell_cnt, iadev->tx_cell_cnt,
3145                            iadev->drop_rxcell, iadev->drop_rxpkt);
3146   }
3147   return 0;
3148 }
3149 
3150 static const struct atmdev_ops ops = {
3151 	.open		= ia_open,
3152 	.close		= ia_close,
3153 	.ioctl		= ia_ioctl,
3154 	.send		= ia_send,
3155 	.phy_put	= ia_phy_put,
3156 	.phy_get	= ia_phy_get,
3157 	.change_qos	= ia_change_qos,
3158 	.proc_read	= ia_proc_read,
3159 	.owner		= THIS_MODULE,
3160 };
3161 
3162 static int ia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
3163 {
3164 	struct atm_dev *dev;
3165 	IADEV *iadev;
3166 	int ret;
3167 
3168 	iadev = kzalloc(sizeof(*iadev), GFP_KERNEL);
3169 	if (!iadev) {
3170 		ret = -ENOMEM;
3171 		goto err_out;
3172 	}
3173 
3174 	iadev->pci = pdev;
3175 
3176 	IF_INIT(printk("ia detected at bus:%d dev: %d function:%d\n",
3177 		pdev->bus->number, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));)
3178 	if (pci_enable_device(pdev)) {
3179 		ret = -ENODEV;
3180 		goto err_out_free_iadev;
3181 	}
3182 	dev = atm_dev_register(DEV_LABEL, &pdev->dev, &ops, -1, NULL);
3183 	if (!dev) {
3184 		ret = -ENOMEM;
3185 		goto err_out_disable_dev;
3186 	}
3187 	dev->dev_data = iadev;
3188 	IF_INIT(printk(DEV_LABEL "registered at (itf :%d)\n", dev->number);)
3189 	IF_INIT(printk("dev_id = 0x%p iadev->LineRate = %d \n", dev,
3190 		iadev->LineRate);)
3191 
3192 	pci_set_drvdata(pdev, dev);
3193 
3194 	ia_dev[iadev_count] = iadev;
3195 	_ia_dev[iadev_count] = dev;
3196 	iadev_count++;
3197 	if (ia_init(dev) || ia_start(dev)) {
3198 		IF_INIT(printk("IA register failed!\n");)
3199 		iadev_count--;
3200 		ia_dev[iadev_count] = NULL;
3201 		_ia_dev[iadev_count] = NULL;
3202 		ret = -EINVAL;
3203 		goto err_out_deregister_dev;
3204 	}
3205 	IF_EVENT(printk("iadev_count = %d\n", iadev_count);)
3206 
3207 	iadev->next_board = ia_boards;
3208 	ia_boards = dev;
3209 
3210 	return 0;
3211 
3212 err_out_deregister_dev:
3213 	atm_dev_deregister(dev);
3214 err_out_disable_dev:
3215 	pci_disable_device(pdev);
3216 err_out_free_iadev:
3217 	kfree(iadev);
3218 err_out:
3219 	return ret;
3220 }
3221 
3222 static void ia_remove_one(struct pci_dev *pdev)
3223 {
3224 	struct atm_dev *dev = pci_get_drvdata(pdev);
3225 	IADEV *iadev = INPH_IA_DEV(dev);
3226 
3227 	/* Disable phy interrupts */
3228 	ia_phy_put(dev, ia_phy_get(dev, SUNI_RSOP_CIE) & ~(SUNI_RSOP_CIE_LOSE),
3229 				   SUNI_RSOP_CIE);
3230 	udelay(1);
3231 
3232 	if (dev->phy && dev->phy->stop)
3233 		dev->phy->stop(dev);
3234 
3235 	/* De-register device */
3236       	free_irq(iadev->irq, dev);
3237 	iadev_count--;
3238 	ia_dev[iadev_count] = NULL;
3239 	_ia_dev[iadev_count] = NULL;
3240 	IF_EVENT(printk("deregistering iav at (itf:%d)\n", dev->number);)
3241 	atm_dev_deregister(dev);
3242 
3243       	iounmap(iadev->base);
3244 	pci_disable_device(pdev);
3245 
3246 	ia_free_rx(iadev);
3247 	ia_free_tx(iadev);
3248 
3249       	kfree(iadev);
3250 }
3251 
3252 static const struct pci_device_id ia_pci_tbl[] = {
3253 	{ PCI_VENDOR_ID_IPHASE, 0x0008, PCI_ANY_ID, PCI_ANY_ID, },
3254 	{ PCI_VENDOR_ID_IPHASE, 0x0009, PCI_ANY_ID, PCI_ANY_ID, },
3255 	{ 0,}
3256 };
3257 MODULE_DEVICE_TABLE(pci, ia_pci_tbl);
3258 
3259 static struct pci_driver ia_driver = {
3260 	.name =         DEV_LABEL,
3261 	.id_table =     ia_pci_tbl,
3262 	.probe =        ia_init_one,
3263 	.remove =       ia_remove_one,
3264 };
3265 
3266 static int __init ia_module_init(void)
3267 {
3268 	int ret;
3269 
3270 	ret = pci_register_driver(&ia_driver);
3271 	if (ret >= 0) {
3272 		ia_timer.expires = jiffies + 3*HZ;
3273 		add_timer(&ia_timer);
3274 	} else
3275 		printk(KERN_ERR DEV_LABEL ": no adapter found\n");
3276 	return ret;
3277 }
3278 
3279 static void __exit ia_module_exit(void)
3280 {
3281 	pci_unregister_driver(&ia_driver);
3282 
3283 	del_timer_sync(&ia_timer);
3284 }
3285 
3286 module_init(ia_module_init);
3287 module_exit(ia_module_exit);
3288