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