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>
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.
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).
39 Support and updates available at: ftp://ftp.iphase.com/pub/atm
41 *******************************************************************************/
43 #include <linux/module.h>
44 #include <linux/kernel.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 <linux/slab.h>
58 #include <asm/system.h>
60 #include <asm/atomic.h>
61 #include <asm/uaccess.h>
62 #include <asm/string.h>
63 #include <asm/byteorder.h>
64 #include <linux/vmalloc.h>
65 #include <linux/jiffies.h>
68 #define swap_byte_order(x) (((x & 0xff) << 8) | ((x & 0xff00) >> 8))
70 #define PRIV(dev) ((struct suni_priv *) dev->phy_data)
72 static unsigned char ia_phy_get(struct atm_dev
*dev
, unsigned long addr
);
73 static void desc_dbg(IADEV
*iadev
);
75 static IADEV
*ia_dev
[8];
76 static struct atm_dev
*_ia_dev
[8];
77 static int iadev_count
;
78 static void ia_led_timer(unsigned long arg
);
79 static DEFINE_TIMER(ia_timer
, ia_led_timer
, 0, 0);
80 static int IA_TX_BUF
= DFL_TX_BUFFERS
, IA_TX_BUF_SZ
= DFL_TX_BUF_SZ
;
81 static int IA_RX_BUF
= DFL_RX_BUFFERS
, IA_RX_BUF_SZ
= DFL_RX_BUF_SZ
;
82 static uint IADebugFlag
= /* IF_IADBG_ERR | IF_IADBG_CBR| IF_IADBG_INIT_ADAPTER
83 |IF_IADBG_ABR | IF_IADBG_EVENT*/ 0;
85 module_param(IA_TX_BUF
, int, 0);
86 module_param(IA_TX_BUF_SZ
, int, 0);
87 module_param(IA_RX_BUF
, int, 0);
88 module_param(IA_RX_BUF_SZ
, int, 0);
89 module_param(IADebugFlag
, uint
, 0644);
91 MODULE_LICENSE("GPL");
93 /**************************** IA_LIB **********************************/
95 static void ia_init_rtn_q (IARTN_Q
*que
)
101 static void ia_enque_head_rtn_q (IARTN_Q
*que
, IARTN_Q
* data
)
104 if (que
->next
== NULL
)
105 que
->next
= que
->tail
= data
;
107 data
->next
= que
->next
;
113 static int ia_enque_rtn_q (IARTN_Q
*que
, struct desc_tbl_t data
) {
114 IARTN_Q
*entry
= kmalloc(sizeof(*entry
), GFP_ATOMIC
);
115 if (!entry
) return -1;
118 if (que
->next
== NULL
)
119 que
->next
= que
->tail
= entry
;
121 que
->tail
->next
= entry
;
122 que
->tail
= que
->tail
->next
;
127 static IARTN_Q
* ia_deque_rtn_q (IARTN_Q
*que
) {
129 if (que
->next
== NULL
)
132 if ( que
->next
== que
->tail
)
133 que
->next
= que
->tail
= NULL
;
135 que
->next
= que
->next
->next
;
139 static void ia_hack_tcq(IADEV
*dev
) {
143 struct ia_vcc
*iavcc_r
= NULL
;
145 tcq_wr
= readl(dev
->seg_reg
+TCQ_WR_PTR
) & 0xffff;
146 while (dev
->host_tcq_wr
!= tcq_wr
) {
147 desc1
= *(u_short
*)(dev
->seg_ram
+ dev
->host_tcq_wr
);
149 else if (!dev
->desc_tbl
[desc1
-1].timestamp
) {
150 IF_ABR(printk(" Desc %d is reset at %ld\n", desc1
-1, jiffies
);)
151 *(u_short
*) (dev
->seg_ram
+ dev
->host_tcq_wr
) = 0;
153 else if (dev
->desc_tbl
[desc1
-1].timestamp
) {
154 if (!(iavcc_r
= dev
->desc_tbl
[desc1
-1].iavcc
)) {
155 printk("IA: Fatal err in get_desc\n");
158 iavcc_r
->vc_desc_cnt
--;
159 dev
->desc_tbl
[desc1
-1].timestamp
= 0;
160 IF_EVENT(printk("ia_hack: return_q skb = 0x%p desc = %d\n",
161 dev
->desc_tbl
[desc1
-1].txskb
, desc1
);)
162 if (iavcc_r
->pcr
< dev
->rate_limit
) {
163 IA_SKB_STATE (dev
->desc_tbl
[desc1
-1].txskb
) |= IA_TX_DONE
;
164 if (ia_enque_rtn_q(&dev
->tx_return_q
, dev
->desc_tbl
[desc1
-1]) < 0)
165 printk("ia_hack_tcq: No memory available\n");
167 dev
->desc_tbl
[desc1
-1].iavcc
= NULL
;
168 dev
->desc_tbl
[desc1
-1].txskb
= NULL
;
170 dev
->host_tcq_wr
+= 2;
171 if (dev
->host_tcq_wr
> dev
->ffL
.tcq_ed
)
172 dev
->host_tcq_wr
= dev
->ffL
.tcq_st
;
176 static u16
get_desc (IADEV
*dev
, struct ia_vcc
*iavcc
) {
179 struct ia_vcc
*iavcc_r
= NULL
;
181 static unsigned long timer
= 0;
185 if((time_after(jiffies
,timer
+50)) || ((dev
->ffL
.tcq_rd
==dev
->host_tcq_wr
))) {
188 while (i
< dev
->num_tx_desc
) {
189 if (!dev
->desc_tbl
[i
].timestamp
) {
193 ltimeout
= dev
->desc_tbl
[i
].iavcc
->ltimeout
;
194 delta
= jiffies
- dev
->desc_tbl
[i
].timestamp
;
195 if (delta
>= ltimeout
) {
196 IF_ABR(printk("RECOVER run!! desc_tbl %d = %d delta = %ld, time = %ld\n", i
,dev
->desc_tbl
[i
].timestamp
, delta
, jiffies
);)
197 if (dev
->ffL
.tcq_rd
== dev
->ffL
.tcq_st
)
198 dev
->ffL
.tcq_rd
= dev
->ffL
.tcq_ed
;
200 dev
->ffL
.tcq_rd
-= 2;
201 *(u_short
*)(dev
->seg_ram
+ dev
->ffL
.tcq_rd
) = i
+1;
202 if (!(skb
= dev
->desc_tbl
[i
].txskb
) ||
203 !(iavcc_r
= dev
->desc_tbl
[i
].iavcc
))
204 printk("Fatal err, desc table vcc or skb is NULL\n");
206 iavcc_r
->vc_desc_cnt
--;
207 dev
->desc_tbl
[i
].timestamp
= 0;
208 dev
->desc_tbl
[i
].iavcc
= NULL
;
209 dev
->desc_tbl
[i
].txskb
= NULL
;
214 if (dev
->ffL
.tcq_rd
== dev
->host_tcq_wr
)
217 /* Get the next available descriptor number from TCQ */
218 desc_num
= *(u_short
*)(dev
->seg_ram
+ dev
->ffL
.tcq_rd
);
220 while (!desc_num
|| (dev
->desc_tbl
[desc_num
-1]).timestamp
) {
221 dev
->ffL
.tcq_rd
+= 2;
222 if (dev
->ffL
.tcq_rd
> dev
->ffL
.tcq_ed
)
223 dev
->ffL
.tcq_rd
= dev
->ffL
.tcq_st
;
224 if (dev
->ffL
.tcq_rd
== dev
->host_tcq_wr
)
226 desc_num
= *(u_short
*)(dev
->seg_ram
+ dev
->ffL
.tcq_rd
);
229 /* get system time */
230 dev
->desc_tbl
[desc_num
-1].timestamp
= jiffies
;
234 static void clear_lockup (struct atm_vcc
*vcc
, IADEV
*dev
) {
236 vcstatus_t
*vcstatus
;
238 u_short tempCellSlot
, tempFract
;
239 struct main_vc
*abr_vc
= (struct main_vc
*)dev
->MAIN_VC_TABLE_ADDR
;
240 struct ext_vc
*eabr_vc
= (struct ext_vc
*)dev
->EXT_VC_TABLE_ADDR
;
243 if (vcc
->qos
.txtp
.traffic_class
== ATM_ABR
) {
244 vcstatus
= (vcstatus_t
*) &(dev
->testTable
[vcc
->vci
]->vc_status
);
247 if( vcstatus
->cnt
== 0x05 ) {
250 if( eabr_vc
->last_desc
) {
251 if( (abr_vc
->status
& 0x07) == ABR_STATE
/* 0x2 */ ) {
252 /* Wait for 10 Micro sec */
254 if ((eabr_vc
->last_desc
)&&((abr_vc
->status
& 0x07)==ABR_STATE
))
258 tempCellSlot
= abr_vc
->last_cell_slot
;
259 tempFract
= abr_vc
->fraction
;
260 if((tempCellSlot
== dev
->testTable
[vcc
->vci
]->lastTime
)
261 && (tempFract
== dev
->testTable
[vcc
->vci
]->fract
))
263 dev
->testTable
[vcc
->vci
]->lastTime
= tempCellSlot
;
264 dev
->testTable
[vcc
->vci
]->fract
= tempFract
;
266 } /* last descriptor */
268 } /* vcstatus->cnt */
271 IF_ABR(printk("LOCK UP found\n");)
272 writew(0xFFFD, dev
->seg_reg
+MODE_REG_0
);
273 /* Wait for 10 Micro sec */
275 abr_vc
->status
&= 0xFFF8;
276 abr_vc
->status
|= 0x0001; /* state is idle */
277 shd_tbl
= (u_short
*)dev
->ABR_SCHED_TABLE_ADDR
;
278 for( i
= 0; ((i
< dev
->num_vc
) && (shd_tbl
[i
])); i
++ );
280 shd_tbl
[i
] = vcc
->vci
;
282 IF_ERR(printk("ABR Seg. may not continue on VC %x\n",vcc
->vci
);)
283 writew(T_ONLINE
, dev
->seg_reg
+MODE_REG_0
);
284 writew(~(TRANSMIT_DONE
|TCQ_NOT_EMPTY
), dev
->seg_reg
+SEG_MASK_REG
);
285 writew(TRANSMIT_DONE
, dev
->seg_reg
+SEG_INTR_STATUS_REG
);
295 ** Conversion of 24-bit cellrate (cells/sec) to 16-bit floating point format.
297 ** +----+----+------------------+-------------------------------+
298 ** | R | NZ | 5-bit exponent | 9-bit mantissa |
299 ** +----+----+------------------+-------------------------------+
301 ** R = reserved (written as 0)
302 ** NZ = 0 if 0 cells/sec; 1 otherwise
304 ** if NZ = 1, rate = 1.mmmmmmmmm x 2^(eeeee) cells/sec
307 cellrate_to_float(u32 cr
)
311 #define M_BITS 9 /* Number of bits in mantissa */
312 #define E_BITS 5 /* Number of bits in exponent */
316 u32 tmp
= cr
& 0x00ffffff;
325 flot
= NZ
| (i
<< M_BITS
) | (cr
& M_MASK
);
327 flot
= NZ
| (i
<< M_BITS
) | ((cr
<< (M_BITS
- i
)) & M_MASK
);
329 flot
= NZ
| (i
<< M_BITS
) | ((cr
>> (i
- M_BITS
)) & M_MASK
);
335 ** Conversion of 16-bit floating point format to 24-bit cellrate (cells/sec).
338 float_to_cellrate(u16 rate
)
340 u32 exp
, mantissa
, cps
;
341 if ((rate
& NZ
) == 0)
343 exp
= (rate
>> M_BITS
) & E_MASK
;
344 mantissa
= rate
& M_MASK
;
347 cps
= (1 << M_BITS
) | mantissa
;
350 else if (exp
> M_BITS
)
351 cps
<<= (exp
- M_BITS
);
353 cps
>>= (M_BITS
- exp
);
358 static void init_abr_vc (IADEV
*dev
, srv_cls_param_t
*srv_p
) {
359 srv_p
->class_type
= ATM_ABR
;
360 srv_p
->pcr
= dev
->LineRate
;
362 srv_p
->icr
= 0x055cb7;
363 srv_p
->tbe
= 0xffffff;
374 ia_open_abr_vc(IADEV
*dev
, srv_cls_param_t
*srv_p
,
375 struct atm_vcc
*vcc
, u8 flag
)
377 f_vc_abr_entry
*f_abr_vc
;
378 r_vc_abr_entry
*r_abr_vc
;
381 u16 adtf
, air
, *ptr16
;
382 f_abr_vc
=(f_vc_abr_entry
*)dev
->MAIN_VC_TABLE_ADDR
;
383 f_abr_vc
+= vcc
->vci
;
385 case 1: /* FFRED initialization */
386 #if 0 /* sanity check */
389 if (srv_p
->pcr
> dev
->LineRate
)
390 srv_p
->pcr
= dev
->LineRate
;
391 if ((srv_p
->mcr
+ dev
->sum_mcr
) > dev
->LineRate
)
392 return MCR_UNAVAILABLE
;
393 if (srv_p
->mcr
> srv_p
->pcr
)
396 srv_p
->icr
= srv_p
->pcr
;
397 if ((srv_p
->icr
< srv_p
->mcr
) || (srv_p
->icr
> srv_p
->pcr
))
399 if ((srv_p
->tbe
< MIN_TBE
) || (srv_p
->tbe
> MAX_TBE
))
401 if ((srv_p
->frtt
< MIN_FRTT
) || (srv_p
->frtt
> MAX_FRTT
))
403 if (srv_p
->nrm
> MAX_NRM
)
405 if (srv_p
->trm
> MAX_TRM
)
407 if (srv_p
->adtf
> MAX_ADTF
)
409 else if (srv_p
->adtf
== 0)
411 if (srv_p
->cdf
> MAX_CDF
)
413 if (srv_p
->rif
> MAX_RIF
)
415 if (srv_p
->rdf
> MAX_RDF
)
418 memset ((caddr_t
)f_abr_vc
, 0, sizeof(*f_abr_vc
));
419 f_abr_vc
->f_vc_type
= ABR
;
420 nrm
= 2 << srv_p
->nrm
; /* (2 ** (srv_p->nrm +1)) */
421 /* i.e 2**n = 2 << (n-1) */
422 f_abr_vc
->f_nrm
= nrm
<< 8 | nrm
;
423 trm
= 100000/(2 << (16 - srv_p
->trm
));
424 if ( trm
== 0) trm
= 1;
425 f_abr_vc
->f_nrmexp
=(((srv_p
->nrm
+1) & 0x0f) << 12)|(MRM
<< 8) | trm
;
426 crm
= srv_p
->tbe
/ nrm
;
427 if (crm
== 0) crm
= 1;
428 f_abr_vc
->f_crm
= crm
& 0xff;
429 f_abr_vc
->f_pcr
= cellrate_to_float(srv_p
->pcr
);
430 icr
= min( srv_p
->icr
, (srv_p
->tbe
> srv_p
->frtt
) ?
431 ((srv_p
->tbe
/srv_p
->frtt
)*1000000) :
432 (1000000/(srv_p
->frtt
/srv_p
->tbe
)));
433 f_abr_vc
->f_icr
= cellrate_to_float(icr
);
434 adtf
= (10000 * srv_p
->adtf
)/8192;
435 if (adtf
== 0) adtf
= 1;
436 f_abr_vc
->f_cdf
= ((7 - srv_p
->cdf
) << 12 | adtf
) & 0xfff;
437 f_abr_vc
->f_mcr
= cellrate_to_float(srv_p
->mcr
);
438 f_abr_vc
->f_acr
= f_abr_vc
->f_icr
;
439 f_abr_vc
->f_status
= 0x0042;
441 case 0: /* RFRED initialization */
442 ptr16
= (u_short
*)(dev
->reass_ram
+ REASS_TABLE
*dev
->memSize
);
443 *(ptr16
+ vcc
->vci
) = NO_AAL5_PKT
| REASS_ABR
;
444 r_abr_vc
= (r_vc_abr_entry
*)(dev
->reass_ram
+ABR_VC_TABLE
*dev
->memSize
);
445 r_abr_vc
+= vcc
->vci
;
446 r_abr_vc
->r_status_rdf
= (15 - srv_p
->rdf
) & 0x000f;
447 air
= srv_p
->pcr
<< (15 - srv_p
->rif
);
448 if (air
== 0) air
= 1;
449 r_abr_vc
->r_air
= cellrate_to_float(air
);
450 dev
->testTable
[vcc
->vci
]->vc_status
= VC_ACTIVE
| VC_ABR
;
451 dev
->sum_mcr
+= srv_p
->mcr
;
459 static int ia_cbr_setup (IADEV
*dev
, struct atm_vcc
*vcc
) {
460 u32 rateLow
=0, rateHigh
, rate
;
462 struct ia_vcc
*ia_vcc
;
464 int idealSlot
=0, testSlot
, toBeAssigned
, inc
;
466 u16
*SchedTbl
, *TstSchedTbl
;
472 /* IpAdjustTrafficParams */
473 if (vcc
->qos
.txtp
.max_pcr
<= 0) {
474 IF_ERR(printk("PCR for CBR not defined\n");)
477 rate
= vcc
->qos
.txtp
.max_pcr
;
478 entries
= rate
/ dev
->Granularity
;
479 IF_CBR(printk("CBR: CBR entries=0x%x for rate=0x%x & Gran=0x%x\n",
480 entries
, rate
, dev
->Granularity
);)
482 IF_CBR(printk("CBR: Bandwidth smaller than granularity of CBR table\n");)
483 rateLow
= entries
* dev
->Granularity
;
484 rateHigh
= (entries
+ 1) * dev
->Granularity
;
485 if (3*(rate
- rateLow
) > (rateHigh
- rate
))
487 if (entries
> dev
->CbrRemEntries
) {
488 IF_CBR(printk("CBR: Not enough bandwidth to support this PCR.\n");)
489 IF_CBR(printk("Entries = 0x%x, CbrRemEntries = 0x%x.\n",
490 entries
, dev
->CbrRemEntries
);)
494 ia_vcc
= INPH_IA_VCC(vcc
);
495 ia_vcc
->NumCbrEntry
= entries
;
496 dev
->sum_mcr
+= entries
* dev
->Granularity
;
497 /* IaFFrednInsertCbrSched */
498 // Starting at an arbitrary location, place the entries into the table
499 // as smoothly as possible
501 spacing
= dev
->CbrTotEntries
/ entries
;
502 sp_mod
= dev
->CbrTotEntries
% entries
; // get modulo
503 toBeAssigned
= entries
;
506 IF_CBR(printk("Vci=0x%x,Spacing=0x%x,Sp_mod=0x%x\n",vcIndex
,spacing
,sp_mod
);)
509 // If this is the first time, start the table loading for this connection
510 // as close to entryPoint as possible.
511 if (toBeAssigned
== entries
)
513 idealSlot
= dev
->CbrEntryPt
;
514 dev
->CbrEntryPt
+= 2; // Adding 2 helps to prevent clumping
515 if (dev
->CbrEntryPt
>= dev
->CbrTotEntries
)
516 dev
->CbrEntryPt
-= dev
->CbrTotEntries
;// Wrap if necessary
518 idealSlot
+= (u32
)(spacing
+ fracSlot
); // Point to the next location
519 // in the table that would be smoothest
520 fracSlot
= ((sp_mod
+ sp_mod2
) / entries
); // get new integer part
521 sp_mod2
= ((sp_mod
+ sp_mod2
) % entries
); // calc new fractional part
523 if (idealSlot
>= (int)dev
->CbrTotEntries
)
524 idealSlot
-= dev
->CbrTotEntries
;
525 // Continuously check around this ideal value until a null
526 // location is encountered.
527 SchedTbl
= (u16
*)(dev
->seg_ram
+CBR_SCHED_TABLE
*dev
->memSize
);
529 testSlot
= idealSlot
;
530 TstSchedTbl
= (u16
*)(SchedTbl
+testSlot
); //set index and read in value
531 IF_CBR(printk("CBR Testslot 0x%x AT Location 0x%p, NumToAssign=%d\n",
532 testSlot
, TstSchedTbl
,toBeAssigned
);)
533 memcpy((caddr_t
)&cbrVC
,(caddr_t
)TstSchedTbl
,sizeof(cbrVC
));
534 while (cbrVC
) // If another VC at this location, we have to keep looking
537 testSlot
= idealSlot
- inc
;
538 if (testSlot
< 0) { // Wrap if necessary
539 testSlot
+= dev
->CbrTotEntries
;
540 IF_CBR(printk("Testslot Wrap. STable Start=0x%p,Testslot=%d\n",
543 TstSchedTbl
= (u16
*)(SchedTbl
+ testSlot
); // set table index
544 memcpy((caddr_t
)&cbrVC
,(caddr_t
)TstSchedTbl
,sizeof(cbrVC
));
547 testSlot
= idealSlot
+ inc
;
548 if (testSlot
>= (int)dev
->CbrTotEntries
) { // Wrap if necessary
549 testSlot
-= dev
->CbrTotEntries
;
550 IF_CBR(printk("TotCbrEntries=%d",dev
->CbrTotEntries
);)
551 IF_CBR(printk(" Testslot=0x%x ToBeAssgned=%d\n",
552 testSlot
, toBeAssigned
);)
554 // set table index and read in value
555 TstSchedTbl
= (u16
*)(SchedTbl
+ testSlot
);
556 IF_CBR(printk("Reading CBR Tbl from 0x%p, CbrVal=0x%x Iteration %d\n",
557 TstSchedTbl
,cbrVC
,inc
);)
558 memcpy((caddr_t
)&cbrVC
,(caddr_t
)TstSchedTbl
,sizeof(cbrVC
));
560 // Move this VCI number into this location of the CBR Sched table.
561 memcpy((caddr_t
)TstSchedTbl
, (caddr_t
)&vcIndex
, sizeof(*TstSchedTbl
));
562 dev
->CbrRemEntries
--;
566 /* IaFFrednCbrEnable */
567 dev
->NumEnabledCBR
++;
568 if (dev
->NumEnabledCBR
== 1) {
569 writew((CBR_EN
| UBR_EN
| ABR_EN
| (0x23 << 2)), dev
->seg_reg
+STPARMS
);
570 IF_CBR(printk("CBR is enabled\n");)
574 static void ia_cbrVc_close (struct atm_vcc
*vcc
) {
576 u16
*SchedTbl
, NullVci
= 0;
579 iadev
= INPH_IA_DEV(vcc
->dev
);
580 iadev
->NumEnabledCBR
--;
581 SchedTbl
= (u16
*)(iadev
->seg_ram
+CBR_SCHED_TABLE
*iadev
->memSize
);
582 if (iadev
->NumEnabledCBR
== 0) {
583 writew((UBR_EN
| ABR_EN
| (0x23 << 2)), iadev
->seg_reg
+STPARMS
);
584 IF_CBR (printk("CBR support disabled\n");)
587 for (i
=0; i
< iadev
->CbrTotEntries
; i
++)
589 if (*SchedTbl
== vcc
->vci
) {
590 iadev
->CbrRemEntries
++;
596 IF_CBR(printk("Exit ia_cbrVc_close, NumRemoved=%d\n",NumFound
);)
599 static int ia_avail_descs(IADEV
*iadev
) {
602 if (iadev
->host_tcq_wr
>= iadev
->ffL
.tcq_rd
)
603 tmp
= (iadev
->host_tcq_wr
- iadev
->ffL
.tcq_rd
) / 2;
605 tmp
= (iadev
->ffL
.tcq_ed
- iadev
->ffL
.tcq_rd
+ 2 + iadev
->host_tcq_wr
-
606 iadev
->ffL
.tcq_st
) / 2;
610 static int ia_pkt_tx (struct atm_vcc
*vcc
, struct sk_buff
*skb
);
612 static int ia_que_tx (IADEV
*iadev
) {
616 num_desc
= ia_avail_descs(iadev
);
618 while (num_desc
&& (skb
= skb_dequeue(&iadev
->tx_backlog
))) {
619 if (!(vcc
= ATM_SKB(skb
)->vcc
)) {
620 dev_kfree_skb_any(skb
);
621 printk("ia_que_tx: Null vcc\n");
624 if (!test_bit(ATM_VF_READY
,&vcc
->flags
)) {
625 dev_kfree_skb_any(skb
);
626 printk("Free the SKB on closed vci %d \n", vcc
->vci
);
629 if (ia_pkt_tx (vcc
, skb
)) {
630 skb_queue_head(&iadev
->tx_backlog
, skb
);
637 static void ia_tx_poll (IADEV
*iadev
) {
638 struct atm_vcc
*vcc
= NULL
;
639 struct sk_buff
*skb
= NULL
, *skb1
= NULL
;
640 struct ia_vcc
*iavcc
;
644 while ( (rtne
= ia_deque_rtn_q(&iadev
->tx_return_q
))) {
645 skb
= rtne
->data
.txskb
;
647 printk("ia_tx_poll: skb is null\n");
650 vcc
= ATM_SKB(skb
)->vcc
;
652 printk("ia_tx_poll: vcc is null\n");
653 dev_kfree_skb_any(skb
);
657 iavcc
= INPH_IA_VCC(vcc
);
659 printk("ia_tx_poll: iavcc is null\n");
660 dev_kfree_skb_any(skb
);
664 skb1
= skb_dequeue(&iavcc
->txing_skb
);
665 while (skb1
&& (skb1
!= skb
)) {
666 if (!(IA_SKB_STATE(skb1
) & IA_TX_DONE
)) {
667 printk("IA_tx_intr: Vci %d lost pkt!!!\n", vcc
->vci
);
669 IF_ERR(printk("Release the SKB not match\n");)
670 if ((vcc
->pop
) && (skb1
->len
!= 0))
673 IF_EVENT(printk("Tansmit Done - skb 0x%lx return\n",
677 dev_kfree_skb_any(skb1
);
678 skb1
= skb_dequeue(&iavcc
->txing_skb
);
681 IF_EVENT(printk("IA: Vci %d - skb not found requed\n",vcc
->vci
);)
682 ia_enque_head_rtn_q (&iadev
->tx_return_q
, rtne
);
685 if ((vcc
->pop
) && (skb
->len
!= 0))
688 IF_EVENT(printk("Tx Done - skb 0x%lx return\n",(long)skb
);)
691 dev_kfree_skb_any(skb
);
699 static void ia_eeprom_put (IADEV
*iadev
, u32 addr
, u_short val
)
704 * Issue a command to enable writes to the NOVRAM
706 NVRAM_CMD (EXTEND
+ EWEN
);
709 * issue the write command
711 NVRAM_CMD(IAWRITE
+ addr
);
713 * Send the data, starting with D15, then D14, and so on for 16 bits
715 for (i
=15; i
>=0; i
--) {
716 NVRAM_CLKOUT (val
& 0x8000);
721 t
= readl(iadev
->reg
+IPHASE5575_EEPROM_ACCESS
);
723 t
= readl(iadev
->reg
+IPHASE5575_EEPROM_ACCESS
);
727 * disable writes again
729 NVRAM_CMD(EXTEND
+ EWDS
)
735 static u16
ia_eeprom_get (IADEV
*iadev
, u32 addr
)
741 * Read the first bit that was clocked with the falling edge of the
742 * the last command data clock
744 NVRAM_CMD(IAREAD
+ addr
);
746 * Now read the rest of the bits, the next bit read is D14, then D13,
750 for (i
=15; i
>=0; i
--) {
759 static void ia_hw_type(IADEV
*iadev
) {
760 u_short memType
= ia_eeprom_get(iadev
, 25);
761 iadev
->memType
= memType
;
762 if ((memType
& MEM_SIZE_MASK
) == MEM_SIZE_1M
) {
763 iadev
->num_tx_desc
= IA_TX_BUF
;
764 iadev
->tx_buf_sz
= IA_TX_BUF_SZ
;
765 iadev
->num_rx_desc
= IA_RX_BUF
;
766 iadev
->rx_buf_sz
= IA_RX_BUF_SZ
;
767 } else if ((memType
& MEM_SIZE_MASK
) == MEM_SIZE_512K
) {
768 if (IA_TX_BUF
== DFL_TX_BUFFERS
)
769 iadev
->num_tx_desc
= IA_TX_BUF
/ 2;
771 iadev
->num_tx_desc
= IA_TX_BUF
;
772 iadev
->tx_buf_sz
= IA_TX_BUF_SZ
;
773 if (IA_RX_BUF
== DFL_RX_BUFFERS
)
774 iadev
->num_rx_desc
= IA_RX_BUF
/ 2;
776 iadev
->num_rx_desc
= IA_RX_BUF
;
777 iadev
->rx_buf_sz
= IA_RX_BUF_SZ
;
780 if (IA_TX_BUF
== DFL_TX_BUFFERS
)
781 iadev
->num_tx_desc
= IA_TX_BUF
/ 8;
783 iadev
->num_tx_desc
= IA_TX_BUF
;
784 iadev
->tx_buf_sz
= IA_TX_BUF_SZ
;
785 if (IA_RX_BUF
== DFL_RX_BUFFERS
)
786 iadev
->num_rx_desc
= IA_RX_BUF
/ 8;
788 iadev
->num_rx_desc
= IA_RX_BUF
;
789 iadev
->rx_buf_sz
= IA_RX_BUF_SZ
;
791 iadev
->rx_pkt_ram
= TX_PACKET_RAM
+ (iadev
->num_tx_desc
* iadev
->tx_buf_sz
);
792 IF_INIT(printk("BUF: tx=%d,sz=%d rx=%d sz= %d rx_pkt_ram=%d\n",
793 iadev
->num_tx_desc
, iadev
->tx_buf_sz
, iadev
->num_rx_desc
,
794 iadev
->rx_buf_sz
, iadev
->rx_pkt_ram
);)
797 if ((memType
& FE_MASK
) == FE_SINGLE_MODE
) {
798 iadev
->phy_type
= PHY_OC3C_S
;
799 else if ((memType
& FE_MASK
) == FE_UTP_OPTION
)
800 iadev
->phy_type
= PHY_UTP155
;
802 iadev
->phy_type
= PHY_OC3C_M
;
805 iadev
->phy_type
= memType
& FE_MASK
;
806 IF_INIT(printk("memType = 0x%x iadev->phy_type = 0x%x\n",
807 memType
,iadev
->phy_type
);)
808 if (iadev
->phy_type
== FE_25MBIT_PHY
)
809 iadev
->LineRate
= (u32
)(((25600000/8)*26)/(27*53));
810 else if (iadev
->phy_type
== FE_DS3_PHY
)
811 iadev
->LineRate
= (u32
)(((44736000/8)*26)/(27*53));
812 else if (iadev
->phy_type
== FE_E3_PHY
)
813 iadev
->LineRate
= (u32
)(((34368000/8)*26)/(27*53));
815 iadev
->LineRate
= (u32
)(ATM_OC3_PCR
);
816 IF_INIT(printk("iadev->LineRate = %d \n", iadev
->LineRate
);)
820 static void IaFrontEndIntr(IADEV
*iadev
) {
821 volatile IA_SUNI
*suni
;
822 volatile ia_mb25_t
*mb25
;
823 volatile suni_pm7345_t
*suni_pm7345
;
825 if(iadev
->phy_type
& FE_25MBIT_PHY
) {
826 mb25
= (ia_mb25_t
*)iadev
->phy
;
827 iadev
->carrier_detect
= Boolean(mb25
->mb25_intr_status
& MB25_IS_GSB
);
828 } else if (iadev
->phy_type
& FE_DS3_PHY
) {
829 suni_pm7345
= (suni_pm7345_t
*)iadev
->phy
;
830 /* clear FRMR interrupts */
831 (void) suni_pm7345
->suni_ds3_frm_intr_stat
;
832 iadev
->carrier_detect
=
833 Boolean(!(suni_pm7345
->suni_ds3_frm_stat
& SUNI_DS3_LOSV
));
834 } else if (iadev
->phy_type
& FE_E3_PHY
) {
835 suni_pm7345
= (suni_pm7345_t
*)iadev
->phy
;
836 (void) suni_pm7345
->suni_e3_frm_maint_intr_ind
;
837 iadev
->carrier_detect
=
838 Boolean(!(suni_pm7345
->suni_e3_frm_fram_intr_ind_stat
&SUNI_E3_LOS
));
841 suni
= (IA_SUNI
*)iadev
->phy
;
842 (void) suni
->suni_rsop_status
;
843 iadev
->carrier_detect
= Boolean(!(suni
->suni_rsop_status
& SUNI_LOSV
));
845 if (iadev
->carrier_detect
)
846 printk("IA: SUNI carrier detected\n");
848 printk("IA: SUNI carrier lost signal\n");
852 static void ia_mb25_init (IADEV
*iadev
)
854 volatile ia_mb25_t
*mb25
= (ia_mb25_t
*)iadev
->phy
;
856 mb25
->mb25_master_ctrl
= MB25_MC_DRIC
| MB25_MC_DREC
| MB25_MC_ENABLED
;
858 mb25
->mb25_master_ctrl
= MB25_MC_DRIC
| MB25_MC_DREC
;
859 mb25
->mb25_diag_control
= 0;
861 * Initialize carrier detect state
863 iadev
->carrier_detect
= Boolean(mb25
->mb25_intr_status
& MB25_IS_GSB
);
867 static void ia_suni_pm7345_init (IADEV
*iadev
)
869 volatile suni_pm7345_t
*suni_pm7345
= (suni_pm7345_t
*)iadev
->phy
;
870 if (iadev
->phy_type
& FE_DS3_PHY
)
872 iadev
->carrier_detect
=
873 Boolean(!(suni_pm7345
->suni_ds3_frm_stat
& SUNI_DS3_LOSV
));
874 suni_pm7345
->suni_ds3_frm_intr_enbl
= 0x17;
875 suni_pm7345
->suni_ds3_frm_cfg
= 1;
876 suni_pm7345
->suni_ds3_tran_cfg
= 1;
877 suni_pm7345
->suni_config
= 0;
878 suni_pm7345
->suni_splr_cfg
= 0;
879 suni_pm7345
->suni_splt_cfg
= 0;
883 iadev
->carrier_detect
=
884 Boolean(!(suni_pm7345
->suni_e3_frm_fram_intr_ind_stat
& SUNI_E3_LOS
));
885 suni_pm7345
->suni_e3_frm_fram_options
= 0x4;
886 suni_pm7345
->suni_e3_frm_maint_options
= 0x20;
887 suni_pm7345
->suni_e3_frm_fram_intr_enbl
= 0x1d;
888 suni_pm7345
->suni_e3_frm_maint_intr_enbl
= 0x30;
889 suni_pm7345
->suni_e3_tran_stat_diag_options
= 0x0;
890 suni_pm7345
->suni_e3_tran_fram_options
= 0x1;
891 suni_pm7345
->suni_config
= SUNI_PM7345_E3ENBL
;
892 suni_pm7345
->suni_splr_cfg
= 0x41;
893 suni_pm7345
->suni_splt_cfg
= 0x41;
896 * Enable RSOP loss of signal interrupt.
898 suni_pm7345
->suni_intr_enbl
= 0x28;
901 * Clear error counters
903 suni_pm7345
->suni_id_reset
= 0;
906 * Clear "PMCTST" in master test register.
908 suni_pm7345
->suni_master_test
= 0;
910 suni_pm7345
->suni_rxcp_ctrl
= 0x2c;
911 suni_pm7345
->suni_rxcp_fctrl
= 0x81;
913 suni_pm7345
->suni_rxcp_idle_pat_h1
=
914 suni_pm7345
->suni_rxcp_idle_pat_h2
=
915 suni_pm7345
->suni_rxcp_idle_pat_h3
= 0;
916 suni_pm7345
->suni_rxcp_idle_pat_h4
= 1;
918 suni_pm7345
->suni_rxcp_idle_mask_h1
= 0xff;
919 suni_pm7345
->suni_rxcp_idle_mask_h2
= 0xff;
920 suni_pm7345
->suni_rxcp_idle_mask_h3
= 0xff;
921 suni_pm7345
->suni_rxcp_idle_mask_h4
= 0xfe;
923 suni_pm7345
->suni_rxcp_cell_pat_h1
=
924 suni_pm7345
->suni_rxcp_cell_pat_h2
=
925 suni_pm7345
->suni_rxcp_cell_pat_h3
= 0;
926 suni_pm7345
->suni_rxcp_cell_pat_h4
= 1;
928 suni_pm7345
->suni_rxcp_cell_mask_h1
=
929 suni_pm7345
->suni_rxcp_cell_mask_h2
=
930 suni_pm7345
->suni_rxcp_cell_mask_h3
=
931 suni_pm7345
->suni_rxcp_cell_mask_h4
= 0xff;
933 suni_pm7345
->suni_txcp_ctrl
= 0xa4;
934 suni_pm7345
->suni_txcp_intr_en_sts
= 0x10;
935 suni_pm7345
->suni_txcp_idle_pat_h5
= 0x55;
937 suni_pm7345
->suni_config
&= ~(SUNI_PM7345_LLB
|
942 suni_pm7345
->suni_rxcp_intr_en_sts
|= SUNI_OOCDE
;
943 #endif /* __SNMP__ */
948 /***************************** IA_LIB END *****************************/
950 #ifdef CONFIG_ATM_IA_DEBUG
951 static int tcnter
= 0;
952 static void xdump( u_char
* cp
, int length
, char* prefix
)
956 u_char
* pBuf
= prntBuf
;
958 while(count
< length
){
959 pBuf
+= sprintf( pBuf
, "%s", prefix
);
960 for(col
= 0;count
+ col
< length
&& col
< 16; col
++){
961 if (col
!= 0 && (col
% 4) == 0)
962 pBuf
+= sprintf( pBuf
, " " );
963 pBuf
+= sprintf( pBuf
, "%02X ", cp
[count
+ col
] );
965 while(col
++ < 16){ /* pad end of buffer with blanks */
967 sprintf( pBuf
, " " );
968 pBuf
+= sprintf( pBuf
, " " );
970 pBuf
+= sprintf( pBuf
, " " );
971 for(col
= 0;count
+ col
< length
&& col
< 16; col
++){
972 if (isprint((int)cp
[count
+ col
]))
973 pBuf
+= sprintf( pBuf
, "%c", cp
[count
+ col
] );
975 pBuf
+= sprintf( pBuf
, "." );
977 printk("%s\n", prntBuf
);
982 } /* close xdump(... */
983 #endif /* CONFIG_ATM_IA_DEBUG */
986 static struct atm_dev
*ia_boards
= NULL
;
988 #define ACTUAL_RAM_BASE \
989 RAM_BASE*((iadev->mem)/(128 * 1024))
990 #define ACTUAL_SEG_RAM_BASE \
991 IPHASE5575_FRAG_CONTROL_RAM_BASE*((iadev->mem)/(128 * 1024))
992 #define ACTUAL_REASS_RAM_BASE \
993 IPHASE5575_REASS_CONTROL_RAM_BASE*((iadev->mem)/(128 * 1024))
996 /*-- some utilities and memory allocation stuff will come here -------------*/
998 static void desc_dbg(IADEV
*iadev
) {
1000 u_short tcq_wr_ptr
, tcq_st_ptr
, tcq_ed_ptr
;
1003 // regval = readl((u32)ia_cmds->maddr);
1004 tcq_wr_ptr
= readw(iadev
->seg_reg
+TCQ_WR_PTR
);
1005 printk("B_tcq_wr = 0x%x desc = %d last desc = %d\n",
1006 tcq_wr_ptr
, readw(iadev
->seg_ram
+tcq_wr_ptr
),
1007 readw(iadev
->seg_ram
+tcq_wr_ptr
-2));
1008 printk(" host_tcq_wr = 0x%x host_tcq_rd = 0x%x \n", iadev
->host_tcq_wr
,
1010 tcq_st_ptr
= readw(iadev
->seg_reg
+TCQ_ST_ADR
);
1011 tcq_ed_ptr
= readw(iadev
->seg_reg
+TCQ_ED_ADR
);
1012 printk("tcq_st_ptr = 0x%x tcq_ed_ptr = 0x%x \n", tcq_st_ptr
, tcq_ed_ptr
);
1014 while (tcq_st_ptr
!= tcq_ed_ptr
) {
1015 tmp
= iadev
->seg_ram
+tcq_st_ptr
;
1016 printk("TCQ slot %d desc = %d Addr = %p\n", i
++, readw(tmp
), tmp
);
1019 for(i
=0; i
<iadev
->num_tx_desc
; i
++)
1020 printk("Desc_tbl[%d] = %d \n", i
, iadev
->desc_tbl
[i
].timestamp
);
1024 /*----------------------------- Receiving side stuff --------------------------*/
1026 static void rx_excp_rcvd(struct atm_dev
*dev
)
1028 #if 0 /* closing the receiving size will cause too many excp int */
1031 u_short excpq_rd_ptr
;
1034 iadev
= INPH_IA_DEV(dev
);
1035 state
= readl(iadev
->reass_reg
+ STATE_REG
) & 0xffff;
1036 while((state
& EXCPQ_EMPTY
) != EXCPQ_EMPTY
)
1037 { printk("state = %x \n", state
);
1038 excpq_rd_ptr
= readw(iadev
->reass_reg
+ EXCP_Q_RD_PTR
) & 0xffff;
1039 printk("state = %x excpq_rd_ptr = %x \n", state
, excpq_rd_ptr
);
1040 if (excpq_rd_ptr
== *(u16
*)(iadev
->reass_reg
+ EXCP_Q_WR_PTR
))
1041 IF_ERR(printk("excpq_rd_ptr is wrong!!!\n");)
1042 // TODO: update exception stat
1043 vci
= readw(iadev
->reass_ram
+excpq_rd_ptr
);
1044 error
= readw(iadev
->reass_ram
+excpq_rd_ptr
+2) & 0x0007;
1047 if (excpq_rd_ptr
> (readw(iadev
->reass_reg
+ EXCP_Q_ED_ADR
)& 0xffff))
1048 excpq_rd_ptr
= readw(iadev
->reass_reg
+ EXCP_Q_ST_ADR
)& 0xffff;
1049 writew( excpq_rd_ptr
, iadev
->reass_reg
+ EXCP_Q_RD_PTR
);
1050 state
= readl(iadev
->reass_reg
+ STATE_REG
) & 0xffff;
1055 static void free_desc(struct atm_dev
*dev
, int desc
)
1058 iadev
= INPH_IA_DEV(dev
);
1059 writew(desc
, iadev
->reass_ram
+iadev
->rfL
.fdq_wr
);
1060 iadev
->rfL
.fdq_wr
+=2;
1061 if (iadev
->rfL
.fdq_wr
> iadev
->rfL
.fdq_ed
)
1062 iadev
->rfL
.fdq_wr
= iadev
->rfL
.fdq_st
;
1063 writew(iadev
->rfL
.fdq_wr
, iadev
->reass_reg
+FREEQ_WR_PTR
);
1067 static int rx_pkt(struct atm_dev
*dev
)
1070 struct atm_vcc
*vcc
;
1071 unsigned short status
;
1072 struct rx_buf_desc __iomem
*buf_desc_ptr
;
1076 struct sk_buff
*skb
;
1077 u_int buf_addr
, dma_addr
;
1079 iadev
= INPH_IA_DEV(dev
);
1080 if (iadev
->rfL
.pcq_rd
== (readw(iadev
->reass_reg
+PCQ_WR_PTR
)&0xffff))
1082 printk(KERN_ERR DEV_LABEL
"(itf %d) Receive queue empty\n", dev
->number
);
1085 /* mask 1st 3 bits to get the actual descno. */
1086 desc
= readw(iadev
->reass_ram
+iadev
->rfL
.pcq_rd
) & 0x1fff;
1087 IF_RX(printk("reass_ram = %p iadev->rfL.pcq_rd = 0x%x desc = %d\n",
1088 iadev
->reass_ram
, iadev
->rfL
.pcq_rd
, desc
);
1089 printk(" pcq_wr_ptr = 0x%x\n",
1090 readw(iadev
->reass_reg
+PCQ_WR_PTR
)&0xffff);)
1091 /* update the read pointer - maybe we shud do this in the end*/
1092 if ( iadev
->rfL
.pcq_rd
== iadev
->rfL
.pcq_ed
)
1093 iadev
->rfL
.pcq_rd
= iadev
->rfL
.pcq_st
;
1095 iadev
->rfL
.pcq_rd
+= 2;
1096 writew(iadev
->rfL
.pcq_rd
, iadev
->reass_reg
+PCQ_RD_PTR
);
1098 /* get the buffer desc entry.
1099 update stuff. - doesn't seem to be any update necessary
1101 buf_desc_ptr
= iadev
->RX_DESC_BASE_ADDR
;
1102 /* make the ptr point to the corresponding buffer desc entry */
1103 buf_desc_ptr
+= desc
;
1104 if (!desc
|| (desc
> iadev
->num_rx_desc
) ||
1105 ((buf_desc_ptr
->vc_index
& 0xffff) > iadev
->num_vc
)) {
1106 free_desc(dev
, desc
);
1107 IF_ERR(printk("IA: bad descriptor desc = %d \n", desc
);)
1110 vcc
= iadev
->rx_open
[buf_desc_ptr
->vc_index
& 0xffff];
1113 free_desc(dev
, desc
);
1114 printk("IA: null vcc, drop PDU\n");
1119 /* might want to check the status bits for errors */
1120 status
= (u_short
) (buf_desc_ptr
->desc_mode
);
1121 if (status
& (RX_CER
| RX_PTE
| RX_OFL
))
1123 atomic_inc(&vcc
->stats
->rx_err
);
1124 IF_ERR(printk("IA: bad packet, dropping it");)
1125 if (status
& RX_CER
) {
1126 IF_ERR(printk(" cause: packet CRC error\n");)
1128 else if (status
& RX_PTE
) {
1129 IF_ERR(printk(" cause: packet time out\n");)
1132 IF_ERR(printk(" cause: buffer overflow\n");)
1141 buf_addr
= (buf_desc_ptr
->buf_start_hi
<< 16) | buf_desc_ptr
->buf_start_lo
;
1142 dma_addr
= (buf_desc_ptr
->dma_start_hi
<< 16) | buf_desc_ptr
->dma_start_lo
;
1143 len
= dma_addr
- buf_addr
;
1144 if (len
> iadev
->rx_buf_sz
) {
1145 printk("Over %d bytes sdu received, dropped!!!\n", iadev
->rx_buf_sz
);
1146 atomic_inc(&vcc
->stats
->rx_err
);
1150 if (!(skb
= atm_alloc_charge(vcc
, len
, GFP_ATOMIC
))) {
1152 printk("Drop control packets\n");
1157 ATM_SKB(skb
)->vcc
= vcc
;
1158 ATM_DESC(skb
) = desc
;
1159 skb_queue_tail(&iadev
->rx_dma_q
, skb
);
1161 /* Build the DLE structure */
1162 wr_ptr
= iadev
->rx_dle_q
.write
;
1163 wr_ptr
->sys_pkt_addr
= pci_map_single(iadev
->pci
, skb
->data
,
1164 len
, PCI_DMA_FROMDEVICE
);
1165 wr_ptr
->local_pkt_addr
= buf_addr
;
1166 wr_ptr
->bytes
= len
; /* We don't know this do we ?? */
1167 wr_ptr
->mode
= DMA_INT_ENABLE
;
1169 /* shud take care of wrap around here too. */
1170 if(++wr_ptr
== iadev
->rx_dle_q
.end
)
1171 wr_ptr
= iadev
->rx_dle_q
.start
;
1172 iadev
->rx_dle_q
.write
= wr_ptr
;
1174 /* Increment transaction counter */
1175 writel(1, iadev
->dma
+IPHASE5575_RX_COUNTER
);
1178 free_desc(dev
, desc
);
1182 static void rx_intr(struct atm_dev
*dev
)
1188 iadev
= INPH_IA_DEV(dev
);
1189 status
= readl(iadev
->reass_reg
+REASS_INTR_STATUS_REG
) & 0xffff;
1190 IF_EVENT(printk("rx_intr: status = 0x%x\n", status
);)
1191 if (status
& RX_PKT_RCVD
)
1194 /* Basically recvd an interrupt for receiving a packet.
1195 A descriptor would have been written to the packet complete
1196 queue. Get all the descriptors and set up dma to move the
1197 packets till the packet complete queue is empty..
1199 state
= readl(iadev
->reass_reg
+ STATE_REG
) & 0xffff;
1200 IF_EVENT(printk("Rx intr status: RX_PKT_RCVD %08x\n", status
);)
1201 while(!(state
& PCQ_EMPTY
))
1204 state
= readl(iadev
->reass_reg
+ STATE_REG
) & 0xffff;
1208 if (status
& RX_FREEQ_EMPT
)
1211 iadev
->rx_tmp_cnt
= iadev
->rx_pkt_cnt
;
1212 iadev
->rx_tmp_jif
= jiffies
;
1215 else if ((time_after(jiffies
, iadev
->rx_tmp_jif
+ 50)) &&
1216 ((iadev
->rx_pkt_cnt
- iadev
->rx_tmp_cnt
) == 0)) {
1217 for (i
= 1; i
<= iadev
->num_rx_desc
; i
++)
1219 printk("Test logic RUN!!!!\n");
1220 writew( ~(RX_FREEQ_EMPT
|RX_EXCP_RCVD
),iadev
->reass_reg
+REASS_MASK_REG
);
1223 IF_EVENT(printk("Rx intr status: RX_FREEQ_EMPT %08x\n", status
);)
1226 if (status
& RX_EXCP_RCVD
)
1228 /* probably need to handle the exception queue also. */
1229 IF_EVENT(printk("Rx intr status: RX_EXCP_RCVD %08x\n", status
);)
1234 if (status
& RX_RAW_RCVD
)
1236 /* need to handle the raw incoming cells. This deepnds on
1237 whether we have programmed to receive the raw cells or not.
1239 IF_EVENT(printk("Rx intr status: RX_RAW_RCVD %08x\n", status
);)
1244 static void rx_dle_intr(struct atm_dev
*dev
)
1247 struct atm_vcc
*vcc
;
1248 struct sk_buff
*skb
;
1251 struct dle
*dle
, *cur_dle
;
1254 iadev
= INPH_IA_DEV(dev
);
1256 /* free all the dles done, that is just update our own dle read pointer
1257 - do we really need to do this. Think not. */
1258 /* DMA is done, just get all the recevie buffers from the rx dma queue
1259 and push them up to the higher layer protocol. Also free the desc
1260 associated with the buffer. */
1261 dle
= iadev
->rx_dle_q
.read
;
1262 dle_lp
= readl(iadev
->dma
+IPHASE5575_RX_LIST_ADDR
) & (sizeof(struct dle
)*DLE_ENTRIES
- 1);
1263 cur_dle
= (struct dle
*)(iadev
->rx_dle_q
.start
+ (dle_lp
>> 4));
1264 while(dle
!= cur_dle
)
1266 /* free the DMAed skb */
1267 skb
= skb_dequeue(&iadev
->rx_dma_q
);
1270 desc
= ATM_DESC(skb
);
1271 free_desc(dev
, desc
);
1273 if (!(len
= skb
->len
))
1275 printk("rx_dle_intr: skb len 0\n");
1276 dev_kfree_skb_any(skb
);
1280 struct cpcs_trailer
*trailer
;
1282 struct ia_vcc
*ia_vcc
;
1284 pci_unmap_single(iadev
->pci
, iadev
->rx_dle_q
.write
->sys_pkt_addr
,
1285 len
, PCI_DMA_FROMDEVICE
);
1286 /* no VCC related housekeeping done as yet. lets see */
1287 vcc
= ATM_SKB(skb
)->vcc
;
1289 printk("IA: null vcc\n");
1290 dev_kfree_skb_any(skb
);
1293 ia_vcc
= INPH_IA_VCC(vcc
);
1296 atomic_inc(&vcc
->stats
->rx_err
);
1297 dev_kfree_skb_any(skb
);
1298 atm_return(vcc
, atm_guess_pdu2truesize(len
));
1301 // get real pkt length pwang_test
1302 trailer
= (struct cpcs_trailer
*)((u_char
*)skb
->data
+
1303 skb
->len
- sizeof(*trailer
));
1304 length
= swap_byte_order(trailer
->length
);
1305 if ((length
> iadev
->rx_buf_sz
) || (length
>
1306 (skb
->len
- sizeof(struct cpcs_trailer
))))
1308 atomic_inc(&vcc
->stats
->rx_err
);
1309 IF_ERR(printk("rx_dle_intr: Bad AAL5 trailer %d (skb len %d)",
1311 dev_kfree_skb_any(skb
);
1312 atm_return(vcc
, atm_guess_pdu2truesize(len
));
1315 skb_trim(skb
, length
);
1317 /* Display the packet */
1318 IF_RXPKT(printk("\nDmad Recvd data: len = %d \n", skb
->len
);
1319 xdump(skb
->data
, skb
->len
, "RX: ");
1322 IF_RX(printk("rx_dle_intr: skb push");)
1324 atomic_inc(&vcc
->stats
->rx
);
1325 iadev
->rx_pkt_cnt
++;
1328 if (++dle
== iadev
->rx_dle_q
.end
)
1329 dle
= iadev
->rx_dle_q
.start
;
1331 iadev
->rx_dle_q
.read
= dle
;
1333 /* if the interrupts are masked because there were no free desc available,
1335 if (!iadev
->rxing
) {
1336 state
= readl(iadev
->reass_reg
+ STATE_REG
) & 0xffff;
1337 if (!(state
& FREEQ_EMPTY
)) {
1338 state
= readl(iadev
->reass_reg
+ REASS_MASK_REG
) & 0xffff;
1339 writel(state
& ~(RX_FREEQ_EMPT
|/* RX_EXCP_RCVD |*/ RX_PKT_RCVD
),
1340 iadev
->reass_reg
+REASS_MASK_REG
);
1347 static int open_rx(struct atm_vcc
*vcc
)
1350 u_short __iomem
*vc_table
;
1351 u_short __iomem
*reass_ptr
;
1352 IF_EVENT(printk("iadev: open_rx %d.%d\n", vcc
->vpi
, vcc
->vci
);)
1354 if (vcc
->qos
.rxtp
.traffic_class
== ATM_NONE
) return 0;
1355 iadev
= INPH_IA_DEV(vcc
->dev
);
1356 if (vcc
->qos
.rxtp
.traffic_class
== ATM_ABR
) {
1357 if (iadev
->phy_type
& FE_25MBIT_PHY
) {
1358 printk("IA: ABR not support\n");
1362 /* Make only this VCI in the vc table valid and let all
1363 others be invalid entries */
1364 vc_table
= iadev
->reass_ram
+RX_VC_TABLE
*iadev
->memSize
;
1365 vc_table
+= vcc
->vci
;
1366 /* mask the last 6 bits and OR it with 3 for 1K VCs */
1368 *vc_table
= vcc
->vci
<< 6;
1369 /* Also keep a list of open rx vcs so that we can attach them with
1370 incoming PDUs later. */
1371 if ((vcc
->qos
.rxtp
.traffic_class
== ATM_ABR
) ||
1372 (vcc
->qos
.txtp
.traffic_class
== ATM_ABR
))
1374 srv_cls_param_t srv_p
;
1375 init_abr_vc(iadev
, &srv_p
);
1376 ia_open_abr_vc(iadev
, &srv_p
, vcc
, 0);
1378 else { /* for UBR later may need to add CBR logic */
1379 reass_ptr
= iadev
->reass_ram
+REASS_TABLE
*iadev
->memSize
;
1380 reass_ptr
+= vcc
->vci
;
1381 *reass_ptr
= NO_AAL5_PKT
;
1384 if (iadev
->rx_open
[vcc
->vci
])
1385 printk(KERN_CRIT DEV_LABEL
"(itf %d): VCI %d already open\n",
1386 vcc
->dev
->number
, vcc
->vci
);
1387 iadev
->rx_open
[vcc
->vci
] = vcc
;
1391 static int rx_init(struct atm_dev
*dev
)
1394 struct rx_buf_desc __iomem
*buf_desc_ptr
;
1395 unsigned long rx_pkt_start
= 0;
1397 struct abr_vc_table
*abr_vc_table
;
1400 int i
,j
, vcsize_sel
;
1401 u_short freeq_st_adr
;
1402 u_short
*freeq_start
;
1404 iadev
= INPH_IA_DEV(dev
);
1405 // spin_lock_init(&iadev->rx_lock);
1407 /* Allocate 4k bytes - more aligned than needed (4k boundary) */
1408 dle_addr
= pci_alloc_consistent(iadev
->pci
, DLE_TOTAL_SIZE
,
1409 &iadev
->rx_dle_dma
);
1411 printk(KERN_ERR DEV_LABEL
"can't allocate DLEs\n");
1414 iadev
->rx_dle_q
.start
= (struct dle
*)dle_addr
;
1415 iadev
->rx_dle_q
.read
= iadev
->rx_dle_q
.start
;
1416 iadev
->rx_dle_q
.write
= iadev
->rx_dle_q
.start
;
1417 iadev
->rx_dle_q
.end
= (struct dle
*)((unsigned long)dle_addr
+sizeof(struct dle
)*DLE_ENTRIES
);
1418 /* the end of the dle q points to the entry after the last
1419 DLE that can be used. */
1421 /* write the upper 20 bits of the start address to rx list address register */
1422 /* We know this is 32bit bus addressed so the following is safe */
1423 writel(iadev
->rx_dle_dma
& 0xfffff000,
1424 iadev
->dma
+ IPHASE5575_RX_LIST_ADDR
);
1425 IF_INIT(printk("Tx Dle list addr: 0x%p value: 0x%0x\n",
1426 iadev
->dma
+IPHASE5575_TX_LIST_ADDR
,
1427 *(u32
*)(iadev
->dma
+IPHASE5575_TX_LIST_ADDR
));
1428 printk("Rx Dle list addr: 0x%p value: 0x%0x\n",
1429 iadev
->dma
+IPHASE5575_RX_LIST_ADDR
,
1430 *(u32
*)(iadev
->dma
+IPHASE5575_RX_LIST_ADDR
));)
1432 writew(0xffff, iadev
->reass_reg
+REASS_MASK_REG
);
1433 writew(0, iadev
->reass_reg
+MODE_REG
);
1434 writew(RESET_REASS
, iadev
->reass_reg
+REASS_COMMAND_REG
);
1436 /* Receive side control memory map
1437 -------------------------------
1439 Buffer descr 0x0000 (736 - 23K)
1440 VP Table 0x5c00 (256 - 512)
1441 Except q 0x5e00 (128 - 512)
1442 Free buffer q 0x6000 (1K - 2K)
1443 Packet comp q 0x6800 (1K - 2K)
1444 Reass Table 0x7000 (1K - 2K)
1445 VC Table 0x7800 (1K - 2K)
1446 ABR VC Table 0x8000 (1K - 32K)
1449 /* Base address for Buffer Descriptor Table */
1450 writew(RX_DESC_BASE
>> 16, iadev
->reass_reg
+REASS_DESC_BASE
);
1451 /* Set the buffer size register */
1452 writew(iadev
->rx_buf_sz
, iadev
->reass_reg
+BUF_SIZE
);
1454 /* Initialize each entry in the Buffer Descriptor Table */
1455 iadev
->RX_DESC_BASE_ADDR
= iadev
->reass_ram
+RX_DESC_BASE
*iadev
->memSize
;
1456 buf_desc_ptr
= iadev
->RX_DESC_BASE_ADDR
;
1457 memset_io(buf_desc_ptr
, 0, sizeof(*buf_desc_ptr
));
1459 rx_pkt_start
= iadev
->rx_pkt_ram
;
1460 for(i
=1; i
<=iadev
->num_rx_desc
; i
++)
1462 memset_io(buf_desc_ptr
, 0, sizeof(*buf_desc_ptr
));
1463 buf_desc_ptr
->buf_start_hi
= rx_pkt_start
>> 16;
1464 buf_desc_ptr
->buf_start_lo
= rx_pkt_start
& 0x0000ffff;
1466 rx_pkt_start
+= iadev
->rx_buf_sz
;
1468 IF_INIT(printk("Rx Buffer desc ptr: 0x%p\n", buf_desc_ptr
);)
1469 i
= FREE_BUF_DESC_Q
*iadev
->memSize
;
1470 writew(i
>> 16, iadev
->reass_reg
+REASS_QUEUE_BASE
);
1471 writew(i
, iadev
->reass_reg
+FREEQ_ST_ADR
);
1472 writew(i
+iadev
->num_rx_desc
*sizeof(u_short
),
1473 iadev
->reass_reg
+FREEQ_ED_ADR
);
1474 writew(i
, iadev
->reass_reg
+FREEQ_RD_PTR
);
1475 writew(i
+iadev
->num_rx_desc
*sizeof(u_short
),
1476 iadev
->reass_reg
+FREEQ_WR_PTR
);
1477 /* Fill the FREEQ with all the free descriptors. */
1478 freeq_st_adr
= readw(iadev
->reass_reg
+FREEQ_ST_ADR
);
1479 freeq_start
= (u_short
*)(iadev
->reass_ram
+freeq_st_adr
);
1480 for(i
=1; i
<=iadev
->num_rx_desc
; i
++)
1482 *freeq_start
= (u_short
)i
;
1485 IF_INIT(printk("freeq_start: 0x%p\n", freeq_start
);)
1486 /* Packet Complete Queue */
1487 i
= (PKT_COMP_Q
* iadev
->memSize
) & 0xffff;
1488 writew(i
, iadev
->reass_reg
+PCQ_ST_ADR
);
1489 writew(i
+iadev
->num_vc
*sizeof(u_short
), iadev
->reass_reg
+PCQ_ED_ADR
);
1490 writew(i
, iadev
->reass_reg
+PCQ_RD_PTR
);
1491 writew(i
, iadev
->reass_reg
+PCQ_WR_PTR
);
1493 /* Exception Queue */
1494 i
= (EXCEPTION_Q
* iadev
->memSize
) & 0xffff;
1495 writew(i
, iadev
->reass_reg
+EXCP_Q_ST_ADR
);
1496 writew(i
+ NUM_RX_EXCP
* sizeof(RX_ERROR_Q
),
1497 iadev
->reass_reg
+EXCP_Q_ED_ADR
);
1498 writew(i
, iadev
->reass_reg
+EXCP_Q_RD_PTR
);
1499 writew(i
, iadev
->reass_reg
+EXCP_Q_WR_PTR
);
1501 /* Load local copy of FREEQ and PCQ ptrs */
1502 iadev
->rfL
.fdq_st
= readw(iadev
->reass_reg
+FREEQ_ST_ADR
) & 0xffff;
1503 iadev
->rfL
.fdq_ed
= readw(iadev
->reass_reg
+FREEQ_ED_ADR
) & 0xffff ;
1504 iadev
->rfL
.fdq_rd
= readw(iadev
->reass_reg
+FREEQ_RD_PTR
) & 0xffff;
1505 iadev
->rfL
.fdq_wr
= readw(iadev
->reass_reg
+FREEQ_WR_PTR
) & 0xffff;
1506 iadev
->rfL
.pcq_st
= readw(iadev
->reass_reg
+PCQ_ST_ADR
) & 0xffff;
1507 iadev
->rfL
.pcq_ed
= readw(iadev
->reass_reg
+PCQ_ED_ADR
) & 0xffff;
1508 iadev
->rfL
.pcq_rd
= readw(iadev
->reass_reg
+PCQ_RD_PTR
) & 0xffff;
1509 iadev
->rfL
.pcq_wr
= readw(iadev
->reass_reg
+PCQ_WR_PTR
) & 0xffff;
1511 IF_INIT(printk("INIT:pcq_st:0x%x pcq_ed:0x%x pcq_rd:0x%x pcq_wr:0x%x",
1512 iadev
->rfL
.pcq_st
, iadev
->rfL
.pcq_ed
, iadev
->rfL
.pcq_rd
,
1513 iadev
->rfL
.pcq_wr
);)
1514 /* just for check - no VP TBL */
1516 /* writew(0x0b80, iadev->reass_reg+VP_LKUP_BASE); */
1517 /* initialize VP Table for invalid VPIs
1518 - I guess we can write all 1s or 0x000f in the entire memory
1519 space or something similar.
1522 /* This seems to work and looks right to me too !!! */
1523 i
= REASS_TABLE
* iadev
->memSize
;
1524 writew((i
>> 3), iadev
->reass_reg
+REASS_TABLE_BASE
);
1525 /* initialize Reassembly table to I don't know what ???? */
1526 reass_table
= (u16
*)(iadev
->reass_ram
+i
);
1527 j
= REASS_TABLE_SZ
* iadev
->memSize
;
1528 for(i
=0; i
< j
; i
++)
1529 *reass_table
++ = NO_AAL5_PKT
;
1532 while (i
!= iadev
->num_vc
) {
1536 i
= RX_VC_TABLE
* iadev
->memSize
;
1537 writew(((i
>>3) & 0xfff8) | vcsize_sel
, iadev
->reass_reg
+VC_LKUP_BASE
);
1538 vc_table
= (u16
*)(iadev
->reass_ram
+RX_VC_TABLE
*iadev
->memSize
);
1539 j
= RX_VC_TABLE_SZ
* iadev
->memSize
;
1540 for(i
= 0; i
< j
; i
++)
1542 /* shift the reassembly pointer by 3 + lower 3 bits of
1543 vc_lkup_base register (=3 for 1K VCs) and the last byte
1544 is those low 3 bits.
1545 Shall program this later.
1547 *vc_table
= (i
<< 6) | 15; /* for invalid VCI */
1551 i
= ABR_VC_TABLE
* iadev
->memSize
;
1552 writew(i
>> 3, iadev
->reass_reg
+ABR_LKUP_BASE
);
1554 i
= ABR_VC_TABLE
* iadev
->memSize
;
1555 abr_vc_table
= (struct abr_vc_table
*)(iadev
->reass_ram
+i
);
1556 j
= REASS_TABLE_SZ
* iadev
->memSize
;
1557 memset ((char*)abr_vc_table
, 0, j
* sizeof(*abr_vc_table
));
1558 for(i
= 0; i
< j
; i
++) {
1559 abr_vc_table
->rdf
= 0x0003;
1560 abr_vc_table
->air
= 0x5eb1;
1564 /* Initialize other registers */
1566 /* VP Filter Register set for VC Reassembly only */
1567 writew(0xff00, iadev
->reass_reg
+VP_FILTER
);
1568 writew(0, iadev
->reass_reg
+XTRA_RM_OFFSET
);
1569 writew(0x1, iadev
->reass_reg
+PROTOCOL_ID
);
1571 /* Packet Timeout Count related Registers :
1572 Set packet timeout to occur in about 3 seconds
1573 Set Packet Aging Interval count register to overflow in about 4 us
1575 writew(0xF6F8, iadev
->reass_reg
+PKT_TM_CNT
);
1577 i
= (j
>> 6) & 0xFF;
1579 i
|= ((j
<< 2) & 0xFF00);
1580 writew(i
, iadev
->reass_reg
+TMOUT_RANGE
);
1582 /* initiate the desc_tble */
1583 for(i
=0; i
<iadev
->num_tx_desc
;i
++)
1584 iadev
->desc_tbl
[i
].timestamp
= 0;
1586 /* to clear the interrupt status register - read it */
1587 readw(iadev
->reass_reg
+REASS_INTR_STATUS_REG
);
1589 /* Mask Register - clear it */
1590 writew(~(RX_FREEQ_EMPT
|RX_PKT_RCVD
), iadev
->reass_reg
+REASS_MASK_REG
);
1592 skb_queue_head_init(&iadev
->rx_dma_q
);
1593 iadev
->rx_free_desc_qhead
= NULL
;
1595 iadev
->rx_open
= kzalloc(4 * iadev
->num_vc
, GFP_KERNEL
);
1596 if (!iadev
->rx_open
) {
1597 printk(KERN_ERR DEV_LABEL
"itf %d couldn't get free page\n",
1603 iadev
->rx_pkt_cnt
= 0;
1605 writew(R_ONLINE
, iadev
->reass_reg
+MODE_REG
);
1609 pci_free_consistent(iadev
->pci
, DLE_TOTAL_SIZE
, iadev
->rx_dle_q
.start
,
1617 The memory map suggested in appendix A and the coding for it.
1618 Keeping it around just in case we change our mind later.
1620 Buffer descr 0x0000 (128 - 4K)
1621 UBR sched 0x1000 (1K - 4K)
1622 UBR Wait q 0x2000 (1K - 4K)
1623 Commn queues 0x3000 Packet Ready, Trasmit comp(0x3100)
1625 extended VC 0x4000 (1K - 8K)
1626 ABR sched 0x6000 and ABR wait queue (1K - 2K) each
1627 CBR sched 0x7000 (as needed)
1628 VC table 0x8000 (1K - 32K)
1631 static void tx_intr(struct atm_dev
*dev
)
1634 unsigned short status
;
1635 unsigned long flags
;
1637 iadev
= INPH_IA_DEV(dev
);
1639 status
= readl(iadev
->seg_reg
+SEG_INTR_STATUS_REG
);
1640 if (status
& TRANSMIT_DONE
){
1642 IF_EVENT(printk("Tansmit Done Intr logic run\n");)
1643 spin_lock_irqsave(&iadev
->tx_lock
, flags
);
1645 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
1646 writew(TRANSMIT_DONE
, iadev
->seg_reg
+SEG_INTR_STATUS_REG
);
1647 if (iadev
->close_pending
)
1648 wake_up(&iadev
->close_wait
);
1650 if (status
& TCQ_NOT_EMPTY
)
1652 IF_EVENT(printk("TCQ_NOT_EMPTY int received\n");)
1656 static void tx_dle_intr(struct atm_dev
*dev
)
1659 struct dle
*dle
, *cur_dle
;
1660 struct sk_buff
*skb
;
1661 struct atm_vcc
*vcc
;
1662 struct ia_vcc
*iavcc
;
1664 unsigned long flags
;
1666 iadev
= INPH_IA_DEV(dev
);
1667 spin_lock_irqsave(&iadev
->tx_lock
, flags
);
1668 dle
= iadev
->tx_dle_q
.read
;
1669 dle_lp
= readl(iadev
->dma
+IPHASE5575_TX_LIST_ADDR
) &
1670 (sizeof(struct dle
)*DLE_ENTRIES
- 1);
1671 cur_dle
= (struct dle
*)(iadev
->tx_dle_q
.start
+ (dle_lp
>> 4));
1672 while (dle
!= cur_dle
)
1674 /* free the DMAed skb */
1675 skb
= skb_dequeue(&iadev
->tx_dma_q
);
1678 /* Revenge of the 2 dle (skb + trailer) used in ia_pkt_tx() */
1679 if (!((dle
- iadev
->tx_dle_q
.start
)%(2*sizeof(struct dle
)))) {
1680 pci_unmap_single(iadev
->pci
, dle
->sys_pkt_addr
, skb
->len
,
1683 vcc
= ATM_SKB(skb
)->vcc
;
1685 printk("tx_dle_intr: vcc is null\n");
1686 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
1687 dev_kfree_skb_any(skb
);
1691 iavcc
= INPH_IA_VCC(vcc
);
1693 printk("tx_dle_intr: iavcc is null\n");
1694 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
1695 dev_kfree_skb_any(skb
);
1698 if (vcc
->qos
.txtp
.pcr
>= iadev
->rate_limit
) {
1699 if ((vcc
->pop
) && (skb
->len
!= 0))
1704 dev_kfree_skb_any(skb
);
1707 else { /* Hold the rate-limited skb for flow control */
1708 IA_SKB_STATE(skb
) |= IA_DLED
;
1709 skb_queue_tail(&iavcc
->txing_skb
, skb
);
1711 IF_EVENT(printk("tx_dle_intr: enque skb = 0x%p \n", skb
);)
1712 if (++dle
== iadev
->tx_dle_q
.end
)
1713 dle
= iadev
->tx_dle_q
.start
;
1715 iadev
->tx_dle_q
.read
= dle
;
1716 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
1719 static int open_tx(struct atm_vcc
*vcc
)
1721 struct ia_vcc
*ia_vcc
;
1726 IF_EVENT(printk("iadev: open_tx entered vcc->vci = %d\n", vcc
->vci
);)
1727 if (vcc
->qos
.txtp
.traffic_class
== ATM_NONE
) return 0;
1728 iadev
= INPH_IA_DEV(vcc
->dev
);
1730 if (iadev
->phy_type
& FE_25MBIT_PHY
) {
1731 if (vcc
->qos
.txtp
.traffic_class
== ATM_ABR
) {
1732 printk("IA: ABR not support\n");
1735 if (vcc
->qos
.txtp
.traffic_class
== ATM_CBR
) {
1736 printk("IA: CBR not support\n");
1740 ia_vcc
= INPH_IA_VCC(vcc
);
1741 memset((caddr_t
)ia_vcc
, 0, sizeof(*ia_vcc
));
1742 if (vcc
->qos
.txtp
.max_sdu
>
1743 (iadev
->tx_buf_sz
- sizeof(struct cpcs_trailer
))){
1744 printk("IA: SDU size over (%d) the configured SDU size %d\n",
1745 vcc
->qos
.txtp
.max_sdu
,iadev
->tx_buf_sz
);
1746 vcc
->dev_data
= NULL
;
1750 ia_vcc
->vc_desc_cnt
= 0;
1754 if (vcc
->qos
.txtp
.max_pcr
== ATM_MAX_PCR
)
1755 vcc
->qos
.txtp
.pcr
= iadev
->LineRate
;
1756 else if ((vcc
->qos
.txtp
.max_pcr
== 0)&&( vcc
->qos
.txtp
.pcr
<= 0))
1757 vcc
->qos
.txtp
.pcr
= iadev
->LineRate
;
1758 else if ((vcc
->qos
.txtp
.max_pcr
> vcc
->qos
.txtp
.pcr
) && (vcc
->qos
.txtp
.max_pcr
> 0))
1759 vcc
->qos
.txtp
.pcr
= vcc
->qos
.txtp
.max_pcr
;
1760 if (vcc
->qos
.txtp
.pcr
> iadev
->LineRate
)
1761 vcc
->qos
.txtp
.pcr
= iadev
->LineRate
;
1762 ia_vcc
->pcr
= vcc
->qos
.txtp
.pcr
;
1764 if (ia_vcc
->pcr
> (iadev
->LineRate
/ 6) ) ia_vcc
->ltimeout
= HZ
/ 10;
1765 else if (ia_vcc
->pcr
> (iadev
->LineRate
/ 130)) ia_vcc
->ltimeout
= HZ
;
1766 else if (ia_vcc
->pcr
<= 170) ia_vcc
->ltimeout
= 16 * HZ
;
1767 else ia_vcc
->ltimeout
= 2700 * HZ
/ ia_vcc
->pcr
;
1768 if (ia_vcc
->pcr
< iadev
->rate_limit
)
1769 skb_queue_head_init (&ia_vcc
->txing_skb
);
1770 if (ia_vcc
->pcr
< iadev
->rate_limit
) {
1771 struct sock
*sk
= sk_atm(vcc
);
1773 if (vcc
->qos
.txtp
.max_sdu
!= 0) {
1774 if (ia_vcc
->pcr
> 60000)
1775 sk
->sk_sndbuf
= vcc
->qos
.txtp
.max_sdu
* 5;
1776 else if (ia_vcc
->pcr
> 2000)
1777 sk
->sk_sndbuf
= vcc
->qos
.txtp
.max_sdu
* 4;
1779 sk
->sk_sndbuf
= vcc
->qos
.txtp
.max_sdu
* 3;
1782 sk
->sk_sndbuf
= 24576;
1785 vc
= (struct main_vc
*)iadev
->MAIN_VC_TABLE_ADDR
;
1786 evc
= (struct ext_vc
*)iadev
->EXT_VC_TABLE_ADDR
;
1789 memset((caddr_t
)vc
, 0, sizeof(*vc
));
1790 memset((caddr_t
)evc
, 0, sizeof(*evc
));
1792 /* store the most significant 4 bits of vci as the last 4 bits
1793 of first part of atm header.
1794 store the last 12 bits of vci as first 12 bits of the second
1795 part of the atm header.
1797 evc
->atm_hdr1
= (vcc
->vci
>> 12) & 0x000f;
1798 evc
->atm_hdr2
= (vcc
->vci
& 0x0fff) << 4;
1800 /* check the following for different traffic classes */
1801 if (vcc
->qos
.txtp
.traffic_class
== ATM_UBR
)
1804 vc
->status
= CRC_APPEND
;
1805 vc
->acr
= cellrate_to_float(iadev
->LineRate
);
1806 if (vcc
->qos
.txtp
.pcr
> 0)
1807 vc
->acr
= cellrate_to_float(vcc
->qos
.txtp
.pcr
);
1808 IF_UBR(printk("UBR: txtp.pcr = 0x%x f_rate = 0x%x\n",
1809 vcc
->qos
.txtp
.max_pcr
,vc
->acr
);)
1811 else if (vcc
->qos
.txtp
.traffic_class
== ATM_ABR
)
1812 { srv_cls_param_t srv_p
;
1813 IF_ABR(printk("Tx ABR VCC\n");)
1814 init_abr_vc(iadev
, &srv_p
);
1815 if (vcc
->qos
.txtp
.pcr
> 0)
1816 srv_p
.pcr
= vcc
->qos
.txtp
.pcr
;
1817 if (vcc
->qos
.txtp
.min_pcr
> 0) {
1818 int tmpsum
= iadev
->sum_mcr
+iadev
->sum_cbr
+vcc
->qos
.txtp
.min_pcr
;
1819 if (tmpsum
> iadev
->LineRate
)
1821 srv_p
.mcr
= vcc
->qos
.txtp
.min_pcr
;
1822 iadev
->sum_mcr
+= vcc
->qos
.txtp
.min_pcr
;
1825 if (vcc
->qos
.txtp
.icr
)
1826 srv_p
.icr
= vcc
->qos
.txtp
.icr
;
1827 if (vcc
->qos
.txtp
.tbe
)
1828 srv_p
.tbe
= vcc
->qos
.txtp
.tbe
;
1829 if (vcc
->qos
.txtp
.frtt
)
1830 srv_p
.frtt
= vcc
->qos
.txtp
.frtt
;
1831 if (vcc
->qos
.txtp
.rif
)
1832 srv_p
.rif
= vcc
->qos
.txtp
.rif
;
1833 if (vcc
->qos
.txtp
.rdf
)
1834 srv_p
.rdf
= vcc
->qos
.txtp
.rdf
;
1835 if (vcc
->qos
.txtp
.nrm_pres
)
1836 srv_p
.nrm
= vcc
->qos
.txtp
.nrm
;
1837 if (vcc
->qos
.txtp
.trm_pres
)
1838 srv_p
.trm
= vcc
->qos
.txtp
.trm
;
1839 if (vcc
->qos
.txtp
.adtf_pres
)
1840 srv_p
.adtf
= vcc
->qos
.txtp
.adtf
;
1841 if (vcc
->qos
.txtp
.cdf_pres
)
1842 srv_p
.cdf
= vcc
->qos
.txtp
.cdf
;
1843 if (srv_p
.icr
> srv_p
.pcr
)
1844 srv_p
.icr
= srv_p
.pcr
;
1845 IF_ABR(printk("ABR:vcc->qos.txtp.max_pcr = %d mcr = %d\n",
1846 srv_p
.pcr
, srv_p
.mcr
);)
1847 ia_open_abr_vc(iadev
, &srv_p
, vcc
, 1);
1848 } else if (vcc
->qos
.txtp
.traffic_class
== ATM_CBR
) {
1849 if (iadev
->phy_type
& FE_25MBIT_PHY
) {
1850 printk("IA: CBR not support\n");
1853 if (vcc
->qos
.txtp
.max_pcr
> iadev
->LineRate
) {
1854 IF_CBR(printk("PCR is not available\n");)
1858 vc
->status
= CRC_APPEND
;
1859 if ((ret
= ia_cbr_setup (iadev
, vcc
)) < 0) {
1864 printk("iadev: Non UBR, ABR and CBR traffic not supportedn");
1866 iadev
->testTable
[vcc
->vci
]->vc_status
|= VC_ACTIVE
;
1867 IF_EVENT(printk("ia open_tx returning \n");)
1872 static int tx_init(struct atm_dev
*dev
)
1875 struct tx_buf_desc
*buf_desc_ptr
;
1876 unsigned int tx_pkt_start
;
1888 iadev
= INPH_IA_DEV(dev
);
1889 spin_lock_init(&iadev
->tx_lock
);
1891 IF_INIT(printk("Tx MASK REG: 0x%0x\n",
1892 readw(iadev
->seg_reg
+SEG_MASK_REG
));)
1894 /* Allocate 4k (boundary aligned) bytes */
1895 dle_addr
= pci_alloc_consistent(iadev
->pci
, DLE_TOTAL_SIZE
,
1896 &iadev
->tx_dle_dma
);
1898 printk(KERN_ERR DEV_LABEL
"can't allocate DLEs\n");
1901 iadev
->tx_dle_q
.start
= (struct dle
*)dle_addr
;
1902 iadev
->tx_dle_q
.read
= iadev
->tx_dle_q
.start
;
1903 iadev
->tx_dle_q
.write
= iadev
->tx_dle_q
.start
;
1904 iadev
->tx_dle_q
.end
= (struct dle
*)((unsigned long)dle_addr
+sizeof(struct dle
)*DLE_ENTRIES
);
1906 /* write the upper 20 bits of the start address to tx list address register */
1907 writel(iadev
->tx_dle_dma
& 0xfffff000,
1908 iadev
->dma
+ IPHASE5575_TX_LIST_ADDR
);
1909 writew(0xffff, iadev
->seg_reg
+SEG_MASK_REG
);
1910 writew(0, iadev
->seg_reg
+MODE_REG_0
);
1911 writew(RESET_SEG
, iadev
->seg_reg
+SEG_COMMAND_REG
);
1912 iadev
->MAIN_VC_TABLE_ADDR
= iadev
->seg_ram
+MAIN_VC_TABLE
*iadev
->memSize
;
1913 iadev
->EXT_VC_TABLE_ADDR
= iadev
->seg_ram
+EXT_VC_TABLE
*iadev
->memSize
;
1914 iadev
->ABR_SCHED_TABLE_ADDR
=iadev
->seg_ram
+ABR_SCHED_TABLE
*iadev
->memSize
;
1917 Transmit side control memory map
1918 --------------------------------
1919 Buffer descr 0x0000 (128 - 4K)
1920 Commn queues 0x1000 Transmit comp, Packet ready(0x1400)
1923 CBR Table 0x1800 (as needed) - 6K
1924 UBR Table 0x3000 (1K - 4K) - 12K
1925 UBR Wait queue 0x4000 (1K - 4K) - 16K
1926 ABR sched 0x5000 and ABR wait queue (1K - 2K) each
1927 ABR Tbl - 20K, ABR Wq - 22K
1928 extended VC 0x6000 (1K - 8K) - 24K
1929 VC Table 0x8000 (1K - 32K) - 32K
1931 Between 0x2000 (8K) and 0x3000 (12K) there is 4K space left for VBR Tbl
1932 and Wait q, which can be allotted later.
1935 /* Buffer Descriptor Table Base address */
1936 writew(TX_DESC_BASE
, iadev
->seg_reg
+SEG_DESC_BASE
);
1938 /* initialize each entry in the buffer descriptor table */
1939 buf_desc_ptr
=(struct tx_buf_desc
*)(iadev
->seg_ram
+TX_DESC_BASE
);
1940 memset((caddr_t
)buf_desc_ptr
, 0, sizeof(*buf_desc_ptr
));
1942 tx_pkt_start
= TX_PACKET_RAM
;
1943 for(i
=1; i
<=iadev
->num_tx_desc
; i
++)
1945 memset((caddr_t
)buf_desc_ptr
, 0, sizeof(*buf_desc_ptr
));
1946 buf_desc_ptr
->desc_mode
= AAL5
;
1947 buf_desc_ptr
->buf_start_hi
= tx_pkt_start
>> 16;
1948 buf_desc_ptr
->buf_start_lo
= tx_pkt_start
& 0x0000ffff;
1950 tx_pkt_start
+= iadev
->tx_buf_sz
;
1952 iadev
->tx_buf
= kmalloc(iadev
->num_tx_desc
*sizeof(struct cpcs_trailer_desc
), GFP_KERNEL
);
1953 if (!iadev
->tx_buf
) {
1954 printk(KERN_ERR DEV_LABEL
" couldn't get mem\n");
1957 for (i
= 0; i
< iadev
->num_tx_desc
; i
++)
1959 struct cpcs_trailer
*cpcs
;
1961 cpcs
= kmalloc(sizeof(*cpcs
), GFP_KERNEL
|GFP_DMA
);
1963 printk(KERN_ERR DEV_LABEL
" couldn't get freepage\n");
1964 goto err_free_tx_bufs
;
1966 iadev
->tx_buf
[i
].cpcs
= cpcs
;
1967 iadev
->tx_buf
[i
].dma_addr
= pci_map_single(iadev
->pci
,
1968 cpcs
, sizeof(*cpcs
), PCI_DMA_TODEVICE
);
1970 iadev
->desc_tbl
= kmalloc(iadev
->num_tx_desc
*
1971 sizeof(struct desc_tbl_t
), GFP_KERNEL
);
1972 if (!iadev
->desc_tbl
) {
1973 printk(KERN_ERR DEV_LABEL
" couldn't get mem\n");
1974 goto err_free_all_tx_bufs
;
1977 /* Communication Queues base address */
1978 i
= TX_COMP_Q
* iadev
->memSize
;
1979 writew(i
>> 16, iadev
->seg_reg
+SEG_QUEUE_BASE
);
1981 /* Transmit Complete Queue */
1982 writew(i
, iadev
->seg_reg
+TCQ_ST_ADR
);
1983 writew(i
, iadev
->seg_reg
+TCQ_RD_PTR
);
1984 writew(i
+iadev
->num_tx_desc
*sizeof(u_short
),iadev
->seg_reg
+TCQ_WR_PTR
);
1985 iadev
->host_tcq_wr
= i
+ iadev
->num_tx_desc
*sizeof(u_short
);
1986 writew(i
+2 * iadev
->num_tx_desc
* sizeof(u_short
),
1987 iadev
->seg_reg
+TCQ_ED_ADR
);
1988 /* Fill the TCQ with all the free descriptors. */
1989 tcq_st_adr
= readw(iadev
->seg_reg
+TCQ_ST_ADR
);
1990 tcq_start
= (u_short
*)(iadev
->seg_ram
+tcq_st_adr
);
1991 for(i
=1; i
<=iadev
->num_tx_desc
; i
++)
1993 *tcq_start
= (u_short
)i
;
1997 /* Packet Ready Queue */
1998 i
= PKT_RDY_Q
* iadev
->memSize
;
1999 writew(i
, iadev
->seg_reg
+PRQ_ST_ADR
);
2000 writew(i
+2 * iadev
->num_tx_desc
* sizeof(u_short
),
2001 iadev
->seg_reg
+PRQ_ED_ADR
);
2002 writew(i
, iadev
->seg_reg
+PRQ_RD_PTR
);
2003 writew(i
, iadev
->seg_reg
+PRQ_WR_PTR
);
2005 /* Load local copy of PRQ and TCQ ptrs */
2006 iadev
->ffL
.prq_st
= readw(iadev
->seg_reg
+PRQ_ST_ADR
) & 0xffff;
2007 iadev
->ffL
.prq_ed
= readw(iadev
->seg_reg
+PRQ_ED_ADR
) & 0xffff;
2008 iadev
->ffL
.prq_wr
= readw(iadev
->seg_reg
+PRQ_WR_PTR
) & 0xffff;
2010 iadev
->ffL
.tcq_st
= readw(iadev
->seg_reg
+TCQ_ST_ADR
) & 0xffff;
2011 iadev
->ffL
.tcq_ed
= readw(iadev
->seg_reg
+TCQ_ED_ADR
) & 0xffff;
2012 iadev
->ffL
.tcq_rd
= readw(iadev
->seg_reg
+TCQ_RD_PTR
) & 0xffff;
2014 /* Just for safety initializing the queue to have desc 1 always */
2015 /* Fill the PRQ with all the free descriptors. */
2016 prq_st_adr
= readw(iadev
->seg_reg
+PRQ_ST_ADR
);
2017 prq_start
= (u_short
*)(iadev
->seg_ram
+prq_st_adr
);
2018 for(i
=1; i
<=iadev
->num_tx_desc
; i
++)
2020 *prq_start
= (u_short
)0; /* desc 1 in all entries */
2024 IF_INIT(printk("Start CBR Init\n");)
2025 #if 1 /* for 1K VC board, CBR_PTR_BASE is 0 */
2026 writew(0,iadev
->seg_reg
+CBR_PTR_BASE
);
2027 #else /* Charlie's logic is wrong ? */
2028 tmp16
= (iadev
->seg_ram
+CBR_SCHED_TABLE
*iadev
->memSize
)>>17;
2029 IF_INIT(printk("cbr_ptr_base = 0x%x ", tmp16
);)
2030 writew(tmp16
,iadev
->seg_reg
+CBR_PTR_BASE
);
2033 IF_INIT(printk("value in register = 0x%x\n",
2034 readw(iadev
->seg_reg
+CBR_PTR_BASE
));)
2035 tmp16
= (CBR_SCHED_TABLE
*iadev
->memSize
) >> 1;
2036 writew(tmp16
, iadev
->seg_reg
+CBR_TAB_BEG
);
2037 IF_INIT(printk("cbr_tab_beg = 0x%x in reg = 0x%x \n", tmp16
,
2038 readw(iadev
->seg_reg
+CBR_TAB_BEG
));)
2039 writew(tmp16
, iadev
->seg_reg
+CBR_TAB_END
+1); // CBR_PTR;
2040 tmp16
= (CBR_SCHED_TABLE
*iadev
->memSize
+ iadev
->num_vc
*6 - 2) >> 1;
2041 writew(tmp16
, iadev
->seg_reg
+CBR_TAB_END
);
2042 IF_INIT(printk("iadev->seg_reg = 0x%p CBR_PTR_BASE = 0x%x\n",
2043 iadev
->seg_reg
, readw(iadev
->seg_reg
+CBR_PTR_BASE
));)
2044 IF_INIT(printk("CBR_TAB_BEG = 0x%x, CBR_TAB_END = 0x%x, CBR_PTR = 0x%x\n",
2045 readw(iadev
->seg_reg
+CBR_TAB_BEG
), readw(iadev
->seg_reg
+CBR_TAB_END
),
2046 readw(iadev
->seg_reg
+CBR_TAB_END
+1));)
2048 /* Initialize the CBR Schedualing Table */
2049 memset_io(iadev
->seg_ram
+CBR_SCHED_TABLE
*iadev
->memSize
,
2050 0, iadev
->num_vc
*6);
2051 iadev
->CbrRemEntries
= iadev
->CbrTotEntries
= iadev
->num_vc
*3;
2052 iadev
->CbrEntryPt
= 0;
2053 iadev
->Granularity
= MAX_ATM_155
/ iadev
->CbrTotEntries
;
2054 iadev
->NumEnabledCBR
= 0;
2056 /* UBR scheduling Table and wait queue */
2057 /* initialize all bytes of UBR scheduler table and wait queue to 0
2058 - SCHEDSZ is 1K (# of entries).
2059 - UBR Table size is 4K
2060 - UBR wait queue is 4K
2061 since the table and wait queues are contiguous, all the bytes
2062 can be initialized by one memeset.
2067 while (i
!= iadev
->num_vc
) {
2072 i
= MAIN_VC_TABLE
* iadev
->memSize
;
2073 writew(vcsize_sel
| ((i
>> 8) & 0xfff8),iadev
->seg_reg
+VCT_BASE
);
2074 i
= EXT_VC_TABLE
* iadev
->memSize
;
2075 writew((i
>> 8) & 0xfffe, iadev
->seg_reg
+VCTE_BASE
);
2076 i
= UBR_SCHED_TABLE
* iadev
->memSize
;
2077 writew((i
& 0xffff) >> 11, iadev
->seg_reg
+UBR_SBPTR_BASE
);
2078 i
= UBR_WAIT_Q
* iadev
->memSize
;
2079 writew((i
>> 7) & 0xffff, iadev
->seg_reg
+UBRWQ_BASE
);
2080 memset((caddr_t
)(iadev
->seg_ram
+UBR_SCHED_TABLE
*iadev
->memSize
),
2081 0, iadev
->num_vc
*8);
2082 /* ABR scheduling Table(0x5000-0x57ff) and wait queue(0x5800-0x5fff)*/
2083 /* initialize all bytes of ABR scheduler table and wait queue to 0
2084 - SCHEDSZ is 1K (# of entries).
2085 - ABR Table size is 2K
2086 - ABR wait queue is 2K
2087 since the table and wait queues are contiguous, all the bytes
2088 can be initialized by one memeset.
2090 i
= ABR_SCHED_TABLE
* iadev
->memSize
;
2091 writew((i
>> 11) & 0xffff, iadev
->seg_reg
+ABR_SBPTR_BASE
);
2092 i
= ABR_WAIT_Q
* iadev
->memSize
;
2093 writew((i
>> 7) & 0xffff, iadev
->seg_reg
+ABRWQ_BASE
);
2095 i
= ABR_SCHED_TABLE
*iadev
->memSize
;
2096 memset((caddr_t
)(iadev
->seg_ram
+i
), 0, iadev
->num_vc
*4);
2097 vc
= (struct main_vc
*)iadev
->MAIN_VC_TABLE_ADDR
;
2098 evc
= (struct ext_vc
*)iadev
->EXT_VC_TABLE_ADDR
;
2099 iadev
->testTable
= kmalloc(sizeof(long)*iadev
->num_vc
, GFP_KERNEL
);
2100 if (!iadev
->testTable
) {
2101 printk("Get freepage failed\n");
2102 goto err_free_desc_tbl
;
2104 for(i
=0; i
<iadev
->num_vc
; i
++)
2106 memset((caddr_t
)vc
, 0, sizeof(*vc
));
2107 memset((caddr_t
)evc
, 0, sizeof(*evc
));
2108 iadev
->testTable
[i
] = kmalloc(sizeof(struct testTable_t
),
2110 if (!iadev
->testTable
[i
])
2111 goto err_free_test_tables
;
2112 iadev
->testTable
[i
]->lastTime
= 0;
2113 iadev
->testTable
[i
]->fract
= 0;
2114 iadev
->testTable
[i
]->vc_status
= VC_UBR
;
2119 /* Other Initialization */
2121 /* Max Rate Register */
2122 if (iadev
->phy_type
& FE_25MBIT_PHY
) {
2123 writew(RATE25
, iadev
->seg_reg
+MAXRATE
);
2124 writew((UBR_EN
| (0x23 << 2)), iadev
->seg_reg
+STPARMS
);
2127 writew(cellrate_to_float(iadev
->LineRate
),iadev
->seg_reg
+MAXRATE
);
2128 writew((UBR_EN
| ABR_EN
| (0x23 << 2)), iadev
->seg_reg
+STPARMS
);
2130 /* Set Idle Header Reigisters to be sure */
2131 writew(0, iadev
->seg_reg
+IDLEHEADHI
);
2132 writew(0, iadev
->seg_reg
+IDLEHEADLO
);
2134 /* Program ABR UBR Priority Register as PRI_ABR_UBR_EQUAL */
2135 writew(0xaa00, iadev
->seg_reg
+ABRUBR_ARB
);
2137 iadev
->close_pending
= 0;
2138 init_waitqueue_head(&iadev
->close_wait
);
2139 init_waitqueue_head(&iadev
->timeout_wait
);
2140 skb_queue_head_init(&iadev
->tx_dma_q
);
2141 ia_init_rtn_q(&iadev
->tx_return_q
);
2143 /* RM Cell Protocol ID and Message Type */
2144 writew(RM_TYPE_4_0
, iadev
->seg_reg
+RM_TYPE
);
2145 skb_queue_head_init (&iadev
->tx_backlog
);
2147 /* Mode Register 1 */
2148 writew(MODE_REG_1_VAL
, iadev
->seg_reg
+MODE_REG_1
);
2150 /* Mode Register 0 */
2151 writew(T_ONLINE
, iadev
->seg_reg
+MODE_REG_0
);
2153 /* Interrupt Status Register - read to clear */
2154 readw(iadev
->seg_reg
+SEG_INTR_STATUS_REG
);
2156 /* Interrupt Mask Reg- don't mask TCQ_NOT_EMPTY interrupt generation */
2157 writew(~(TRANSMIT_DONE
| TCQ_NOT_EMPTY
), iadev
->seg_reg
+SEG_MASK_REG
);
2158 writew(TRANSMIT_DONE
, iadev
->seg_reg
+SEG_INTR_STATUS_REG
);
2159 iadev
->tx_pkt_cnt
= 0;
2160 iadev
->rate_limit
= iadev
->LineRate
/ 3;
2164 err_free_test_tables
:
2166 kfree(iadev
->testTable
[i
]);
2167 kfree(iadev
->testTable
);
2169 kfree(iadev
->desc_tbl
);
2170 err_free_all_tx_bufs
:
2171 i
= iadev
->num_tx_desc
;
2174 struct cpcs_trailer_desc
*desc
= iadev
->tx_buf
+ i
;
2176 pci_unmap_single(iadev
->pci
, desc
->dma_addr
,
2177 sizeof(*desc
->cpcs
), PCI_DMA_TODEVICE
);
2180 kfree(iadev
->tx_buf
);
2182 pci_free_consistent(iadev
->pci
, DLE_TOTAL_SIZE
, iadev
->tx_dle_q
.start
,
2188 static irqreturn_t
ia_int(int irq
, void *dev_id
)
2190 struct atm_dev
*dev
;
2192 unsigned int status
;
2196 iadev
= INPH_IA_DEV(dev
);
2197 while( (status
= readl(iadev
->reg
+IPHASE5575_BUS_STATUS_REG
) & 0x7f))
2200 IF_EVENT(printk("ia_int: status = 0x%x\n", status
);)
2201 if (status
& STAT_REASSINT
)
2204 IF_EVENT(printk("REASSINT Bus status reg: %08x\n", status
);)
2207 if (status
& STAT_DLERINT
)
2209 /* Clear this bit by writing a 1 to it. */
2210 *(u_int
*)(iadev
->reg
+IPHASE5575_BUS_STATUS_REG
) = STAT_DLERINT
;
2213 if (status
& STAT_SEGINT
)
2216 IF_EVENT(printk("IA: tx_intr \n");)
2219 if (status
& STAT_DLETINT
)
2221 *(u_int
*)(iadev
->reg
+IPHASE5575_BUS_STATUS_REG
) = STAT_DLETINT
;
2224 if (status
& (STAT_FEINT
| STAT_ERRINT
| STAT_MARKINT
))
2226 if (status
& STAT_FEINT
)
2227 IaFrontEndIntr(iadev
);
2230 return IRQ_RETVAL(handled
);
2235 /*----------------------------- entries --------------------------------*/
2236 static int get_esi(struct atm_dev
*dev
)
2243 iadev
= INPH_IA_DEV(dev
);
2244 mac1
= cpu_to_be32(le32_to_cpu(readl(
2245 iadev
->reg
+IPHASE5575_MAC1
)));
2246 mac2
= cpu_to_be16(le16_to_cpu(readl(iadev
->reg
+IPHASE5575_MAC2
)));
2247 IF_INIT(printk("ESI: 0x%08x%04x\n", mac1
, mac2
);)
2248 for (i
=0; i
<MAC1_LEN
; i
++)
2249 dev
->esi
[i
] = mac1
>>(8*(MAC1_LEN
-1-i
));
2251 for (i
=0; i
<MAC2_LEN
; i
++)
2252 dev
->esi
[i
+MAC1_LEN
] = mac2
>>(8*(MAC2_LEN
- 1 -i
));
2256 static int reset_sar(struct atm_dev
*dev
)
2260 unsigned int pci
[64];
2262 iadev
= INPH_IA_DEV(dev
);
2264 if ((error
= pci_read_config_dword(iadev
->pci
,
2265 i
*4, &pci
[i
])) != PCIBIOS_SUCCESSFUL
)
2267 writel(0, iadev
->reg
+IPHASE5575_EXT_RESET
);
2269 if ((error
= pci_write_config_dword(iadev
->pci
,
2270 i
*4, pci
[i
])) != PCIBIOS_SUCCESSFUL
)
2277 static int __devinit
ia_init(struct atm_dev
*dev
)
2280 unsigned long real_base
;
2282 unsigned short command
;
2285 /* The device has been identified and registered. Now we read
2286 necessary configuration info like memory base address,
2287 interrupt number etc */
2289 IF_INIT(printk(">ia_init\n");)
2290 dev
->ci_range
.vpi_bits
= 0;
2291 dev
->ci_range
.vci_bits
= NR_VCI_LD
;
2293 iadev
= INPH_IA_DEV(dev
);
2294 real_base
= pci_resource_start (iadev
->pci
, 0);
2295 iadev
->irq
= iadev
->pci
->irq
;
2297 error
= pci_read_config_word(iadev
->pci
, PCI_COMMAND
, &command
);
2299 printk(KERN_ERR DEV_LABEL
"(itf %d): init error 0x%x\n",
2303 IF_INIT(printk(DEV_LABEL
"(itf %d): rev.%d,realbase=0x%lx,irq=%d\n",
2304 dev
->number
, iadev
->pci
->revision
, real_base
, iadev
->irq
);)
2306 /* find mapping size of board */
2308 iadev
->pci_map_size
= pci_resource_len(iadev
->pci
, 0);
2310 if (iadev
->pci_map_size
== 0x100000){
2311 iadev
->num_vc
= 4096;
2312 dev
->ci_range
.vci_bits
= NR_VCI_4K_LD
;
2315 else if (iadev
->pci_map_size
== 0x40000) {
2316 iadev
->num_vc
= 1024;
2320 printk("Unknown pci_map_size = 0x%x\n", iadev
->pci_map_size
);
2323 IF_INIT(printk (DEV_LABEL
"map size: %i\n", iadev
->pci_map_size
);)
2325 /* enable bus mastering */
2326 pci_set_master(iadev
->pci
);
2329 * Delay at least 1us before doing any mem accesses (how 'bout 10?)
2333 /* mapping the physical address to a virtual address in address space */
2334 base
= ioremap(real_base
,iadev
->pci_map_size
); /* ioremap is not resolved ??? */
2338 printk(DEV_LABEL
" (itf %d): can't set up page mapping\n",
2342 IF_INIT(printk(DEV_LABEL
" (itf %d): rev.%d,base=%p,irq=%d\n",
2343 dev
->number
, iadev
->pci
->revision
, base
, iadev
->irq
);)
2345 /* filling the iphase dev structure */
2346 iadev
->mem
= iadev
->pci_map_size
/2;
2347 iadev
->real_base
= real_base
;
2350 /* Bus Interface Control Registers */
2351 iadev
->reg
= base
+ REG_BASE
;
2352 /* Segmentation Control Registers */
2353 iadev
->seg_reg
= base
+ SEG_BASE
;
2354 /* Reassembly Control Registers */
2355 iadev
->reass_reg
= base
+ REASS_BASE
;
2356 /* Front end/ DMA control registers */
2357 iadev
->phy
= base
+ PHY_BASE
;
2358 iadev
->dma
= base
+ PHY_BASE
;
2359 /* RAM - Segmentation RAm and Reassembly RAM */
2360 iadev
->ram
= base
+ ACTUAL_RAM_BASE
;
2361 iadev
->seg_ram
= base
+ ACTUAL_SEG_RAM_BASE
;
2362 iadev
->reass_ram
= base
+ ACTUAL_REASS_RAM_BASE
;
2364 /* lets print out the above */
2365 IF_INIT(printk("Base addrs: %p %p %p \n %p %p %p %p\n",
2366 iadev
->reg
,iadev
->seg_reg
,iadev
->reass_reg
,
2367 iadev
->phy
, iadev
->ram
, iadev
->seg_ram
,
2370 /* lets try reading the MAC address */
2371 error
= get_esi(dev
);
2373 iounmap(iadev
->base
);
2377 for (i
=0; i
< ESI_LEN
; i
++)
2378 printk("%s%02X",i
? "-" : "",dev
->esi
[i
]);
2382 if (reset_sar(dev
)) {
2383 iounmap(iadev
->base
);
2384 printk("IA: reset SAR fail, please try again\n");
2390 static void ia_update_stats(IADEV
*iadev
) {
2391 if (!iadev
->carrier_detect
)
2393 iadev
->rx_cell_cnt
+= readw(iadev
->reass_reg
+CELL_CTR0
)&0xffff;
2394 iadev
->rx_cell_cnt
+= (readw(iadev
->reass_reg
+CELL_CTR1
) & 0xffff) << 16;
2395 iadev
->drop_rxpkt
+= readw(iadev
->reass_reg
+ DRP_PKT_CNTR
) & 0xffff;
2396 iadev
->drop_rxcell
+= readw(iadev
->reass_reg
+ ERR_CNTR
) & 0xffff;
2397 iadev
->tx_cell_cnt
+= readw(iadev
->seg_reg
+ CELL_CTR_LO_AUTO
)&0xffff;
2398 iadev
->tx_cell_cnt
+= (readw(iadev
->seg_reg
+CELL_CTR_HIGH_AUTO
)&0xffff)<<16;
2402 static void ia_led_timer(unsigned long arg
) {
2403 unsigned long flags
;
2404 static u_char blinking
[8] = {0, 0, 0, 0, 0, 0, 0, 0};
2406 static u32 ctrl_reg
;
2407 for (i
= 0; i
< iadev_count
; i
++) {
2409 ctrl_reg
= readl(ia_dev
[i
]->reg
+IPHASE5575_BUS_CONTROL_REG
);
2410 if (blinking
[i
] == 0) {
2412 ctrl_reg
&= (~CTRL_LED
);
2413 writel(ctrl_reg
, ia_dev
[i
]->reg
+IPHASE5575_BUS_CONTROL_REG
);
2414 ia_update_stats(ia_dev
[i
]);
2418 ctrl_reg
|= CTRL_LED
;
2419 writel(ctrl_reg
, ia_dev
[i
]->reg
+IPHASE5575_BUS_CONTROL_REG
);
2420 spin_lock_irqsave(&ia_dev
[i
]->tx_lock
, flags
);
2421 if (ia_dev
[i
]->close_pending
)
2422 wake_up(&ia_dev
[i
]->close_wait
);
2423 ia_tx_poll(ia_dev
[i
]);
2424 spin_unlock_irqrestore(&ia_dev
[i
]->tx_lock
, flags
);
2428 mod_timer(&ia_timer
, jiffies
+ HZ
/ 4);
2432 static void ia_phy_put(struct atm_dev
*dev
, unsigned char value
,
2435 writel(value
, INPH_IA_DEV(dev
)->phy
+addr
);
2438 static unsigned char ia_phy_get(struct atm_dev
*dev
, unsigned long addr
)
2440 return readl(INPH_IA_DEV(dev
)->phy
+addr
);
2443 static void ia_free_tx(IADEV
*iadev
)
2447 kfree(iadev
->desc_tbl
);
2448 for (i
= 0; i
< iadev
->num_vc
; i
++)
2449 kfree(iadev
->testTable
[i
]);
2450 kfree(iadev
->testTable
);
2451 for (i
= 0; i
< iadev
->num_tx_desc
; i
++) {
2452 struct cpcs_trailer_desc
*desc
= iadev
->tx_buf
+ i
;
2454 pci_unmap_single(iadev
->pci
, desc
->dma_addr
,
2455 sizeof(*desc
->cpcs
), PCI_DMA_TODEVICE
);
2458 kfree(iadev
->tx_buf
);
2459 pci_free_consistent(iadev
->pci
, DLE_TOTAL_SIZE
, iadev
->tx_dle_q
.start
,
2463 static void ia_free_rx(IADEV
*iadev
)
2465 kfree(iadev
->rx_open
);
2466 pci_free_consistent(iadev
->pci
, DLE_TOTAL_SIZE
, iadev
->rx_dle_q
.start
,
2470 static int __devinit
ia_start(struct atm_dev
*dev
)
2476 IF_EVENT(printk(">ia_start\n");)
2477 iadev
= INPH_IA_DEV(dev
);
2478 if (request_irq(iadev
->irq
, &ia_int
, IRQF_SHARED
, DEV_LABEL
, dev
)) {
2479 printk(KERN_ERR DEV_LABEL
"(itf %d): IRQ%d is already in use\n",
2480 dev
->number
, iadev
->irq
);
2484 /* @@@ should release IRQ on error */
2485 /* enabling memory + master */
2486 if ((error
= pci_write_config_word(iadev
->pci
,
2488 PCI_COMMAND_MEMORY
| PCI_COMMAND_MASTER
)))
2490 printk(KERN_ERR DEV_LABEL
"(itf %d): can't enable memory+"
2491 "master (0x%x)\n",dev
->number
, error
);
2497 /* Maybe we should reset the front end, initialize Bus Interface Control
2498 Registers and see. */
2500 IF_INIT(printk("Bus ctrl reg: %08x\n",
2501 readl(iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
));)
2502 ctrl_reg
= readl(iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
);
2503 ctrl_reg
= (ctrl_reg
& (CTRL_LED
| CTRL_FE_RST
))
2511 | CTRL_DLETMASK
/* shud be removed l8r */
2518 writel(ctrl_reg
, iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
);
2520 IF_INIT(printk("Bus ctrl reg after initializing: %08x\n",
2521 readl(iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
));
2522 printk("Bus status reg after init: %08x\n",
2523 readl(iadev
->reg
+IPHASE5575_BUS_STATUS_REG
));)
2526 error
= tx_init(dev
);
2529 error
= rx_init(dev
);
2533 ctrl_reg
= readl(iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
);
2534 writel(ctrl_reg
| CTRL_FE_RST
, iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
);
2535 IF_INIT(printk("Bus ctrl reg after initializing: %08x\n",
2536 readl(iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
));)
2537 phy
= 0; /* resolve compiler complaint */
2539 if ((phy
=ia_phy_get(dev
,0)) == 0x30)
2540 printk("IA: pm5346,rev.%d\n",phy
&0x0f);
2542 printk("IA: utopia,rev.%0x\n",phy
);)
2544 if (iadev
->phy_type
& FE_25MBIT_PHY
)
2545 ia_mb25_init(iadev
);
2546 else if (iadev
->phy_type
& (FE_DS3_PHY
| FE_E3_PHY
))
2547 ia_suni_pm7345_init(iadev
);
2549 error
= suni_init(dev
);
2552 if (dev
->phy
->start
) {
2553 error
= dev
->phy
->start(dev
);
2557 /* Get iadev->carrier_detect status */
2558 IaFrontEndIntr(iadev
);
2567 free_irq(iadev
->irq
, dev
);
2572 static void ia_close(struct atm_vcc
*vcc
)
2577 struct ia_vcc
*ia_vcc
;
2578 struct sk_buff
*skb
= NULL
;
2579 struct sk_buff_head tmp_tx_backlog
, tmp_vcc_backlog
;
2580 unsigned long closetime
, flags
;
2582 iadev
= INPH_IA_DEV(vcc
->dev
);
2583 ia_vcc
= INPH_IA_VCC(vcc
);
2584 if (!ia_vcc
) return;
2586 IF_EVENT(printk("ia_close: ia_vcc->vc_desc_cnt = %d vci = %d\n",
2587 ia_vcc
->vc_desc_cnt
,vcc
->vci
);)
2588 clear_bit(ATM_VF_READY
,&vcc
->flags
);
2589 skb_queue_head_init (&tmp_tx_backlog
);
2590 skb_queue_head_init (&tmp_vcc_backlog
);
2591 if (vcc
->qos
.txtp
.traffic_class
!= ATM_NONE
) {
2592 iadev
->close_pending
++;
2593 prepare_to_wait(&iadev
->timeout_wait
, &wait
, TASK_UNINTERRUPTIBLE
);
2594 schedule_timeout(50);
2595 finish_wait(&iadev
->timeout_wait
, &wait
);
2596 spin_lock_irqsave(&iadev
->tx_lock
, flags
);
2597 while((skb
= skb_dequeue(&iadev
->tx_backlog
))) {
2598 if (ATM_SKB(skb
)->vcc
== vcc
){
2599 if (vcc
->pop
) vcc
->pop(vcc
, skb
);
2600 else dev_kfree_skb_any(skb
);
2603 skb_queue_tail(&tmp_tx_backlog
, skb
);
2605 while((skb
= skb_dequeue(&tmp_tx_backlog
)))
2606 skb_queue_tail(&iadev
->tx_backlog
, skb
);
2607 IF_EVENT(printk("IA TX Done decs_cnt = %d\n", ia_vcc
->vc_desc_cnt
);)
2608 closetime
= 300000 / ia_vcc
->pcr
;
2611 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
2612 wait_event_timeout(iadev
->close_wait
, (ia_vcc
->vc_desc_cnt
<= 0), closetime
);
2613 spin_lock_irqsave(&iadev
->tx_lock
, flags
);
2614 iadev
->close_pending
--;
2615 iadev
->testTable
[vcc
->vci
]->lastTime
= 0;
2616 iadev
->testTable
[vcc
->vci
]->fract
= 0;
2617 iadev
->testTable
[vcc
->vci
]->vc_status
= VC_UBR
;
2618 if (vcc
->qos
.txtp
.traffic_class
== ATM_ABR
) {
2619 if (vcc
->qos
.txtp
.min_pcr
> 0)
2620 iadev
->sum_mcr
-= vcc
->qos
.txtp
.min_pcr
;
2622 if (vcc
->qos
.txtp
.traffic_class
== ATM_CBR
) {
2623 ia_vcc
= INPH_IA_VCC(vcc
);
2624 iadev
->sum_mcr
-= ia_vcc
->NumCbrEntry
*iadev
->Granularity
;
2625 ia_cbrVc_close (vcc
);
2627 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
2630 if (vcc
->qos
.rxtp
.traffic_class
!= ATM_NONE
) {
2631 // reset reass table
2632 vc_table
= (u16
*)(iadev
->reass_ram
+REASS_TABLE
*iadev
->memSize
);
2633 vc_table
+= vcc
->vci
;
2634 *vc_table
= NO_AAL5_PKT
;
2636 vc_table
= (u16
*)(iadev
->reass_ram
+RX_VC_TABLE
*iadev
->memSize
);
2637 vc_table
+= vcc
->vci
;
2638 *vc_table
= (vcc
->vci
<< 6) | 15;
2639 if (vcc
->qos
.rxtp
.traffic_class
== ATM_ABR
) {
2640 struct abr_vc_table __iomem
*abr_vc_table
=
2641 (iadev
->reass_ram
+ABR_VC_TABLE
*iadev
->memSize
);
2642 abr_vc_table
+= vcc
->vci
;
2643 abr_vc_table
->rdf
= 0x0003;
2644 abr_vc_table
->air
= 0x5eb1;
2646 // Drain the packets
2647 rx_dle_intr(vcc
->dev
);
2648 iadev
->rx_open
[vcc
->vci
] = NULL
;
2650 kfree(INPH_IA_VCC(vcc
));
2652 vcc
->dev_data
= NULL
;
2653 clear_bit(ATM_VF_ADDR
,&vcc
->flags
);
2657 static int ia_open(struct atm_vcc
*vcc
)
2659 struct ia_vcc
*ia_vcc
;
2661 if (!test_bit(ATM_VF_PARTIAL
,&vcc
->flags
))
2663 IF_EVENT(printk("ia: not partially allocated resources\n");)
2664 vcc
->dev_data
= NULL
;
2666 if (vcc
->vci
!= ATM_VPI_UNSPEC
&& vcc
->vpi
!= ATM_VCI_UNSPEC
)
2668 IF_EVENT(printk("iphase open: unspec part\n");)
2669 set_bit(ATM_VF_ADDR
,&vcc
->flags
);
2671 if (vcc
->qos
.aal
!= ATM_AAL5
)
2673 IF_EVENT(printk(DEV_LABEL
"(itf %d): open %d.%d\n",
2674 vcc
->dev
->number
, vcc
->vpi
, vcc
->vci
);)
2676 /* Device dependent initialization */
2677 ia_vcc
= kmalloc(sizeof(*ia_vcc
), GFP_KERNEL
);
2678 if (!ia_vcc
) return -ENOMEM
;
2679 vcc
->dev_data
= ia_vcc
;
2681 if ((error
= open_rx(vcc
)))
2683 IF_EVENT(printk("iadev: error in open_rx, closing\n");)
2688 if ((error
= open_tx(vcc
)))
2690 IF_EVENT(printk("iadev: error in open_tx, closing\n");)
2695 set_bit(ATM_VF_READY
,&vcc
->flags
);
2699 static u8 first
= 1;
2701 ia_timer
.expires
= jiffies
+ 3*HZ
;
2702 add_timer(&ia_timer
);
2707 IF_EVENT(printk("ia open returning\n");)
2711 static int ia_change_qos(struct atm_vcc
*vcc
, struct atm_qos
*qos
, int flags
)
2713 IF_EVENT(printk(">ia_change_qos\n");)
2717 static int ia_ioctl(struct atm_dev
*dev
, unsigned int cmd
, void __user
*arg
)
2723 IF_EVENT(printk(">ia_ioctl\n");)
2724 if (cmd
!= IA_CMD
) {
2725 if (!dev
->phy
->ioctl
) return -EINVAL
;
2726 return dev
->phy
->ioctl(dev
,cmd
,arg
);
2728 if (copy_from_user(&ia_cmds
, arg
, sizeof ia_cmds
)) return -EFAULT
;
2729 board
= ia_cmds
.status
;
2730 if ((board
< 0) || (board
> iadev_count
))
2732 iadev
= ia_dev
[board
];
2733 switch (ia_cmds
.cmd
) {
2736 switch (ia_cmds
.sub_cmd
) {
2738 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2739 if (copy_to_user(ia_cmds
.buf
, iadev
, sizeof(IADEV
)))
2743 case MEMDUMP_SEGREG
:
2744 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2745 tmps
= (u16 __user
*)ia_cmds
.buf
;
2746 for(i
=0; i
<0x80; i
+=2, tmps
++)
2747 if(put_user((u16
)(readl(iadev
->seg_reg
+i
) & 0xffff), tmps
)) return -EFAULT
;
2751 case MEMDUMP_REASSREG
:
2752 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2753 tmps
= (u16 __user
*)ia_cmds
.buf
;
2754 for(i
=0; i
<0x80; i
+=2, tmps
++)
2755 if(put_user((u16
)(readl(iadev
->reass_reg
+i
) & 0xffff), tmps
)) return -EFAULT
;
2761 ia_regs_t
*regs_local
;
2765 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2766 regs_local
= kmalloc(sizeof(*regs_local
), GFP_KERNEL
);
2767 if (!regs_local
) return -ENOMEM
;
2768 ffL
= ®s_local
->ffredn
;
2769 rfL
= ®s_local
->rfredn
;
2770 /* Copy real rfred registers into the local copy */
2771 for (i
=0; i
<(sizeof (rfredn_t
))/4; i
++)
2772 ((u_int
*)rfL
)[i
] = readl(iadev
->reass_reg
+ i
) & 0xffff;
2773 /* Copy real ffred registers into the local copy */
2774 for (i
=0; i
<(sizeof (ffredn_t
))/4; i
++)
2775 ((u_int
*)ffL
)[i
] = readl(iadev
->seg_reg
+ i
) & 0xffff;
2777 if (copy_to_user(ia_cmds
.buf
, regs_local
,sizeof(ia_regs_t
))) {
2782 printk("Board %d registers dumped\n", board
);
2788 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2796 printk("skb = 0x%lx\n", (long)skb_peek(&iadev
->tx_backlog
));
2797 printk("rtn_q: 0x%lx\n",(long)ia_deque_rtn_q(&iadev
->tx_return_q
));
2802 struct k_sonet_stats
*stats
;
2803 stats
= &PRIV(_ia_dev
[board
])->sonet_stats
;
2804 printk("section_bip: %d\n", atomic_read(&stats
->section_bip
));
2805 printk("line_bip : %d\n", atomic_read(&stats
->line_bip
));
2806 printk("path_bip : %d\n", atomic_read(&stats
->path_bip
));
2807 printk("line_febe : %d\n", atomic_read(&stats
->line_febe
));
2808 printk("path_febe : %d\n", atomic_read(&stats
->path_febe
));
2809 printk("corr_hcs : %d\n", atomic_read(&stats
->corr_hcs
));
2810 printk("uncorr_hcs : %d\n", atomic_read(&stats
->uncorr_hcs
));
2811 printk("tx_cells : %d\n", atomic_read(&stats
->tx_cells
));
2812 printk("rx_cells : %d\n", atomic_read(&stats
->rx_cells
));
2817 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2818 for (i
= 1; i
<= iadev
->num_rx_desc
; i
++)
2819 free_desc(_ia_dev
[board
], i
);
2820 writew( ~(RX_FREEQ_EMPT
| RX_EXCP_RCVD
),
2821 iadev
->reass_reg
+REASS_MASK_REG
);
2828 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2829 IaFrontEndIntr(iadev
);
2832 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2835 IADebugFlag
= ia_cmds
.maddr
;
2836 printk("New debug option loaded\n");
2852 static int ia_getsockopt(struct atm_vcc
*vcc
, int level
, int optname
,
2853 void __user
*optval
, int optlen
)
2855 IF_EVENT(printk(">ia_getsockopt\n");)
2859 static int ia_setsockopt(struct atm_vcc
*vcc
, int level
, int optname
,
2860 void __user
*optval
, unsigned int optlen
)
2862 IF_EVENT(printk(">ia_setsockopt\n");)
2866 static int ia_pkt_tx (struct atm_vcc
*vcc
, struct sk_buff
*skb
) {
2869 struct tx_buf_desc __iomem
*buf_desc_ptr
;
2873 struct cpcs_trailer
*trailer
;
2874 struct ia_vcc
*iavcc
;
2876 iadev
= INPH_IA_DEV(vcc
->dev
);
2877 iavcc
= INPH_IA_VCC(vcc
);
2878 if (!iavcc
->txing
) {
2879 printk("discard packet on closed VC\n");
2883 dev_kfree_skb_any(skb
);
2887 if (skb
->len
> iadev
->tx_buf_sz
- 8) {
2888 printk("Transmit size over tx buffer size\n");
2892 dev_kfree_skb_any(skb
);
2895 if ((unsigned long)skb
->data
& 3) {
2896 printk("Misaligned SKB\n");
2900 dev_kfree_skb_any(skb
);
2903 /* Get a descriptor number from our free descriptor queue
2904 We get the descr number from the TCQ now, since I am using
2905 the TCQ as a free buffer queue. Initially TCQ will be
2906 initialized with all the descriptors and is hence, full.
2908 desc
= get_desc (iadev
, iavcc
);
2911 comp_code
= desc
>> 13;
2914 if ((desc
== 0) || (desc
> iadev
->num_tx_desc
))
2916 IF_ERR(printk(DEV_LABEL
"invalid desc for send: %d\n", desc
);)
2917 atomic_inc(&vcc
->stats
->tx
);
2921 dev_kfree_skb_any(skb
);
2922 return 0; /* return SUCCESS */
2927 IF_ERR(printk(DEV_LABEL
"send desc:%d completion code %d error\n",
2931 /* remember the desc and vcc mapping */
2932 iavcc
->vc_desc_cnt
++;
2933 iadev
->desc_tbl
[desc
-1].iavcc
= iavcc
;
2934 iadev
->desc_tbl
[desc
-1].txskb
= skb
;
2935 IA_SKB_STATE(skb
) = 0;
2937 iadev
->ffL
.tcq_rd
+= 2;
2938 if (iadev
->ffL
.tcq_rd
> iadev
->ffL
.tcq_ed
)
2939 iadev
->ffL
.tcq_rd
= iadev
->ffL
.tcq_st
;
2940 writew(iadev
->ffL
.tcq_rd
, iadev
->seg_reg
+TCQ_RD_PTR
);
2942 /* Put the descriptor number in the packet ready queue
2943 and put the updated write pointer in the DLE field
2945 *(u16
*)(iadev
->seg_ram
+iadev
->ffL
.prq_wr
) = desc
;
2947 iadev
->ffL
.prq_wr
+= 2;
2948 if (iadev
->ffL
.prq_wr
> iadev
->ffL
.prq_ed
)
2949 iadev
->ffL
.prq_wr
= iadev
->ffL
.prq_st
;
2951 /* Figure out the exact length of the packet and padding required to
2952 make it aligned on a 48 byte boundary. */
2953 total_len
= skb
->len
+ sizeof(struct cpcs_trailer
);
2954 total_len
= ((total_len
+ 47) / 48) * 48;
2955 IF_TX(printk("ia packet len:%d padding:%d\n", total_len
, total_len
- skb
->len
);)
2957 /* Put the packet in a tx buffer */
2958 trailer
= iadev
->tx_buf
[desc
-1].cpcs
;
2959 IF_TX(printk("Sent: skb = 0x%p skb->data: 0x%p len: %d, desc: %d\n",
2960 skb
, skb
->data
, skb
->len
, desc
);)
2961 trailer
->control
= 0;
2963 trailer
->length
= ((skb
->len
& 0xff) << 8) | ((skb
->len
& 0xff00) >> 8);
2964 trailer
->crc32
= 0; /* not needed - dummy bytes */
2966 /* Display the packet */
2967 IF_TXPKT(printk("Sent data: len = %d MsgNum = %d\n",
2968 skb
->len
, tcnter
++);
2969 xdump(skb
->data
, skb
->len
, "TX: ");
2972 /* Build the buffer descriptor */
2973 buf_desc_ptr
= iadev
->seg_ram
+TX_DESC_BASE
;
2974 buf_desc_ptr
+= desc
; /* points to the corresponding entry */
2975 buf_desc_ptr
->desc_mode
= AAL5
| EOM_EN
| APP_CRC32
| CMPL_INT
;
2976 /* Huh ? p.115 of users guide describes this as a read-only register */
2977 writew(TRANSMIT_DONE
, iadev
->seg_reg
+SEG_INTR_STATUS_REG
);
2978 buf_desc_ptr
->vc_index
= vcc
->vci
;
2979 buf_desc_ptr
->bytes
= total_len
;
2981 if (vcc
->qos
.txtp
.traffic_class
== ATM_ABR
)
2982 clear_lockup (vcc
, iadev
);
2984 /* Build the DLE structure */
2985 wr_ptr
= iadev
->tx_dle_q
.write
;
2986 memset((caddr_t
)wr_ptr
, 0, sizeof(*wr_ptr
));
2987 wr_ptr
->sys_pkt_addr
= pci_map_single(iadev
->pci
, skb
->data
,
2988 skb
->len
, PCI_DMA_TODEVICE
);
2989 wr_ptr
->local_pkt_addr
= (buf_desc_ptr
->buf_start_hi
<< 16) |
2990 buf_desc_ptr
->buf_start_lo
;
2991 /* wr_ptr->bytes = swap_byte_order(total_len); didn't seem to affect?? */
2992 wr_ptr
->bytes
= skb
->len
;
2994 /* hw bug - DLEs of 0x2d, 0x2e, 0x2f cause DMA lockup */
2995 if ((wr_ptr
->bytes
>> 2) == 0xb)
2996 wr_ptr
->bytes
= 0x30;
2998 wr_ptr
->mode
= TX_DLE_PSI
;
2999 wr_ptr
->prq_wr_ptr_data
= 0;
3001 /* end is not to be used for the DLE q */
3002 if (++wr_ptr
== iadev
->tx_dle_q
.end
)
3003 wr_ptr
= iadev
->tx_dle_q
.start
;
3005 /* Build trailer dle */
3006 wr_ptr
->sys_pkt_addr
= iadev
->tx_buf
[desc
-1].dma_addr
;
3007 wr_ptr
->local_pkt_addr
= ((buf_desc_ptr
->buf_start_hi
<< 16) |
3008 buf_desc_ptr
->buf_start_lo
) + total_len
- sizeof(struct cpcs_trailer
);
3010 wr_ptr
->bytes
= sizeof(struct cpcs_trailer
);
3011 wr_ptr
->mode
= DMA_INT_ENABLE
;
3012 wr_ptr
->prq_wr_ptr_data
= iadev
->ffL
.prq_wr
;
3014 /* end is not to be used for the DLE q */
3015 if (++wr_ptr
== iadev
->tx_dle_q
.end
)
3016 wr_ptr
= iadev
->tx_dle_q
.start
;
3018 iadev
->tx_dle_q
.write
= wr_ptr
;
3019 ATM_DESC(skb
) = vcc
->vci
;
3020 skb_queue_tail(&iadev
->tx_dma_q
, skb
);
3022 atomic_inc(&vcc
->stats
->tx
);
3023 iadev
->tx_pkt_cnt
++;
3024 /* Increment transaction counter */
3025 writel(2, iadev
->dma
+IPHASE5575_TX_COUNTER
);
3028 /* add flow control logic */
3029 if (atomic_read(&vcc
->stats
->tx
) % 20 == 0) {
3030 if (iavcc
->vc_desc_cnt
> 10) {
3031 vcc
->tx_quota
= vcc
->tx_quota
* 3 / 4;
3032 printk("Tx1: vcc->tx_quota = %d \n", (u32
)vcc
->tx_quota
);
3033 iavcc
->flow_inc
= -1;
3034 iavcc
->saved_tx_quota
= vcc
->tx_quota
;
3035 } else if ((iavcc
->flow_inc
< 0) && (iavcc
->vc_desc_cnt
< 3)) {
3036 // vcc->tx_quota = 3 * iavcc->saved_tx_quota / 4;
3037 printk("Tx2: vcc->tx_quota = %d \n", (u32
)vcc
->tx_quota
);
3038 iavcc
->flow_inc
= 0;
3042 IF_TX(printk("ia send done\n");)
3046 static int ia_send(struct atm_vcc
*vcc
, struct sk_buff
*skb
)
3049 unsigned long flags
;
3051 iadev
= INPH_IA_DEV(vcc
->dev
);
3052 if ((!skb
)||(skb
->len
>(iadev
->tx_buf_sz
-sizeof(struct cpcs_trailer
))))
3055 printk(KERN_CRIT
"null skb in ia_send\n");
3056 else dev_kfree_skb_any(skb
);
3059 spin_lock_irqsave(&iadev
->tx_lock
, flags
);
3060 if (!test_bit(ATM_VF_READY
,&vcc
->flags
)){
3061 dev_kfree_skb_any(skb
);
3062 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
3065 ATM_SKB(skb
)->vcc
= vcc
;
3067 if (skb_peek(&iadev
->tx_backlog
)) {
3068 skb_queue_tail(&iadev
->tx_backlog
, skb
);
3071 if (ia_pkt_tx (vcc
, skb
)) {
3072 skb_queue_tail(&iadev
->tx_backlog
, skb
);
3075 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
3080 static int ia_proc_read(struct atm_dev
*dev
,loff_t
*pos
,char *page
)
3084 IADEV
*iadev
= INPH_IA_DEV(dev
);
3086 if (iadev
->phy_type
== FE_25MBIT_PHY
) {
3087 n
= sprintf(page
, " Board Type : Iphase5525-1KVC-128K\n");
3090 if (iadev
->phy_type
== FE_DS3_PHY
)
3091 n
= sprintf(page
, " Board Type : Iphase-ATM-DS3");
3092 else if (iadev
->phy_type
== FE_E3_PHY
)
3093 n
= sprintf(page
, " Board Type : Iphase-ATM-E3");
3094 else if (iadev
->phy_type
== FE_UTP_OPTION
)
3095 n
= sprintf(page
, " Board Type : Iphase-ATM-UTP155");
3097 n
= sprintf(page
, " Board Type : Iphase-ATM-OC3");
3099 if (iadev
->pci_map_size
== 0x40000)
3100 n
+= sprintf(tmpPtr
, "-1KVC-");
3102 n
+= sprintf(tmpPtr
, "-4KVC-");
3104 if ((iadev
->memType
& MEM_SIZE_MASK
) == MEM_SIZE_1M
)
3105 n
+= sprintf(tmpPtr
, "1M \n");
3106 else if ((iadev
->memType
& MEM_SIZE_MASK
) == MEM_SIZE_512K
)
3107 n
+= sprintf(tmpPtr
, "512K\n");
3109 n
+= sprintf(tmpPtr
, "128K\n");
3113 return sprintf(page
, " Number of Tx Buffer: %u\n"
3114 " Size of Tx Buffer : %u\n"
3115 " Number of Rx Buffer: %u\n"
3116 " Size of Rx Buffer : %u\n"
3117 " Packets Receiverd : %u\n"
3118 " Packets Transmitted: %u\n"
3119 " Cells Received : %u\n"
3120 " Cells Transmitted : %u\n"
3121 " Board Dropped Cells: %u\n"
3122 " Board Dropped Pkts : %u\n",
3123 iadev
->num_tx_desc
, iadev
->tx_buf_sz
,
3124 iadev
->num_rx_desc
, iadev
->rx_buf_sz
,
3125 iadev
->rx_pkt_cnt
, iadev
->tx_pkt_cnt
,
3126 iadev
->rx_cell_cnt
, iadev
->tx_cell_cnt
,
3127 iadev
->drop_rxcell
, iadev
->drop_rxpkt
);
3132 static const struct atmdev_ops ops
= {
3136 .getsockopt
= ia_getsockopt
,
3137 .setsockopt
= ia_setsockopt
,
3139 .phy_put
= ia_phy_put
,
3140 .phy_get
= ia_phy_get
,
3141 .change_qos
= ia_change_qos
,
3142 .proc_read
= ia_proc_read
,
3143 .owner
= THIS_MODULE
,
3146 static int __devinit
ia_init_one(struct pci_dev
*pdev
,
3147 const struct pci_device_id
*ent
)
3149 struct atm_dev
*dev
;
3153 iadev
= kzalloc(sizeof(*iadev
), GFP_KERNEL
);
3161 IF_INIT(printk("ia detected at bus:%d dev: %d function:%d\n",
3162 pdev
->bus
->number
, PCI_SLOT(pdev
->devfn
), PCI_FUNC(pdev
->devfn
));)
3163 if (pci_enable_device(pdev
)) {
3165 goto err_out_free_iadev
;
3167 dev
= atm_dev_register(DEV_LABEL
, &pdev
->dev
, &ops
, -1, NULL
);
3170 goto err_out_disable_dev
;
3172 dev
->dev_data
= iadev
;
3173 IF_INIT(printk(DEV_LABEL
"registered at (itf :%d)\n", dev
->number
);)
3174 IF_INIT(printk("dev_id = 0x%p iadev->LineRate = %d \n", dev
,
3177 pci_set_drvdata(pdev
, dev
);
3179 ia_dev
[iadev_count
] = iadev
;
3180 _ia_dev
[iadev_count
] = dev
;
3182 if (ia_init(dev
) || ia_start(dev
)) {
3183 IF_INIT(printk("IA register failed!\n");)
3185 ia_dev
[iadev_count
] = NULL
;
3186 _ia_dev
[iadev_count
] = NULL
;
3188 goto err_out_deregister_dev
;
3190 IF_EVENT(printk("iadev_count = %d\n", iadev_count
);)
3192 iadev
->next_board
= ia_boards
;
3197 err_out_deregister_dev
:
3198 atm_dev_deregister(dev
);
3199 err_out_disable_dev
:
3200 pci_disable_device(pdev
);
3207 static void __devexit
ia_remove_one(struct pci_dev
*pdev
)
3209 struct atm_dev
*dev
= pci_get_drvdata(pdev
);
3210 IADEV
*iadev
= INPH_IA_DEV(dev
);
3212 /* Disable phy interrupts */
3213 ia_phy_put(dev
, ia_phy_get(dev
, SUNI_RSOP_CIE
) & ~(SUNI_RSOP_CIE_LOSE
),
3217 if (dev
->phy
&& dev
->phy
->stop
)
3218 dev
->phy
->stop(dev
);
3220 /* De-register device */
3221 free_irq(iadev
->irq
, dev
);
3223 ia_dev
[iadev_count
] = NULL
;
3224 _ia_dev
[iadev_count
] = NULL
;
3225 IF_EVENT(printk("deregistering iav at (itf:%d)\n", dev
->number
);)
3226 atm_dev_deregister(dev
);
3228 iounmap(iadev
->base
);
3229 pci_disable_device(pdev
);
3237 static struct pci_device_id ia_pci_tbl
[] = {
3238 { PCI_VENDOR_ID_IPHASE
, 0x0008, PCI_ANY_ID
, PCI_ANY_ID
, },
3239 { PCI_VENDOR_ID_IPHASE
, 0x0009, PCI_ANY_ID
, PCI_ANY_ID
, },
3242 MODULE_DEVICE_TABLE(pci
, ia_pci_tbl
);
3244 static struct pci_driver ia_driver
= {
3246 .id_table
= ia_pci_tbl
,
3247 .probe
= ia_init_one
,
3248 .remove
= __devexit_p(ia_remove_one
),
3251 static int __init
ia_module_init(void)
3255 ret
= pci_register_driver(&ia_driver
);
3257 ia_timer
.expires
= jiffies
+ 3*HZ
;
3258 add_timer(&ia_timer
);
3260 printk(KERN_ERR DEV_LABEL
": no adapter found\n");
3264 static void __exit
ia_module_exit(void)
3266 pci_unregister_driver(&ia_driver
);
3268 del_timer(&ia_timer
);
3271 module_init(ia_module_init
);
3272 module_exit(ia_module_exit
);