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