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