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