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