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