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