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