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/interrupt.h>
57 #include <linux/wait.h>
58 #include <linux/slab.h>
60 #include <linux/atomic.h>
61 #include <asm/uaccess.h>
62 #include <asm/string.h>
63 #include <asm/byteorder.h>
64 #include <linux/vmalloc.h>
65 #include <linux/jiffies.h>
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 u32
ia_phy_read32(struct iadev_priv
*ia
, unsigned int reg
)
822 return readl(ia
->phy
+ (reg
>> 2));
825 static void ia_phy_write32(struct iadev_priv
*ia
, unsigned int reg
, u32 val
)
827 writel(val
, ia
->phy
+ (reg
>> 2));
830 static void ia_frontend_intr(struct iadev_priv
*iadev
)
834 if (iadev
->phy_type
& FE_25MBIT_PHY
) {
835 status
= ia_phy_read32(iadev
, MB25_INTR_STATUS
);
836 iadev
->carrier_detect
= (status
& MB25_IS_GSB
) ? 1 : 0;
837 } else if (iadev
->phy_type
& FE_DS3_PHY
) {
838 ia_phy_read32(iadev
, SUNI_DS3_FRM_INTR_STAT
);
839 status
= ia_phy_read32(iadev
, SUNI_DS3_FRM_STAT
);
840 iadev
->carrier_detect
= (status
& SUNI_DS3_LOSV
) ? 0 : 1;
841 } else if (iadev
->phy_type
& FE_E3_PHY
) {
842 ia_phy_read32(iadev
, SUNI_E3_FRM_MAINT_INTR_IND
);
843 status
= ia_phy_read32(iadev
, SUNI_E3_FRM_FRAM_INTR_IND_STAT
);
844 iadev
->carrier_detect
= (status
& SUNI_E3_LOS
) ? 0 : 1;
846 status
= ia_phy_read32(iadev
, SUNI_RSOP_STATUS
);
847 iadev
->carrier_detect
= (status
& SUNI_LOSV
) ? 0 : 1;
850 printk(KERN_INFO
"IA: SUNI carrier %s\n",
851 iadev
->carrier_detect
? "detected" : "lost signal");
854 static void ia_mb25_init(struct iadev_priv
*iadev
)
857 mb25
->mb25_master_ctrl
= MB25_MC_DRIC
| MB25_MC_DREC
| MB25_MC_ENABLED
;
859 ia_phy_write32(iadev
, MB25_MASTER_CTRL
, MB25_MC_DRIC
| MB25_MC_DREC
);
860 ia_phy_write32(iadev
, MB25_DIAG_CONTROL
, 0);
862 iadev
->carrier_detect
=
863 (ia_phy_read32(iadev
, MB25_INTR_STATUS
) & MB25_IS_GSB
) ? 1 : 0;
871 static void ia_phy_write(struct iadev_priv
*iadev
,
872 const struct ia_reg
*regs
, int len
)
875 ia_phy_write32(iadev
, regs
->reg
, regs
->val
);
880 static void ia_suni_pm7345_init_ds3(struct iadev_priv
*iadev
)
882 static const struct ia_reg suni_ds3_init
[] = {
883 { SUNI_DS3_FRM_INTR_ENBL
, 0x17 },
884 { SUNI_DS3_FRM_CFG
, 0x01 },
885 { SUNI_DS3_TRAN_CFG
, 0x01 },
887 { SUNI_SPLR_CFG
, 0 },
892 status
= ia_phy_read32(iadev
, SUNI_DS3_FRM_STAT
);
893 iadev
->carrier_detect
= (status
& SUNI_DS3_LOSV
) ? 0 : 1;
895 ia_phy_write(iadev
, suni_ds3_init
, ARRAY_SIZE(suni_ds3_init
));
898 static void ia_suni_pm7345_init_e3(struct iadev_priv
*iadev
)
900 static const struct ia_reg suni_e3_init
[] = {
901 { SUNI_E3_FRM_FRAM_OPTIONS
, 0x04 },
902 { SUNI_E3_FRM_MAINT_OPTIONS
, 0x20 },
903 { SUNI_E3_FRM_FRAM_INTR_ENBL
, 0x1d },
904 { SUNI_E3_FRM_MAINT_INTR_ENBL
, 0x30 },
905 { SUNI_E3_TRAN_STAT_DIAG_OPTIONS
, 0 },
906 { SUNI_E3_TRAN_FRAM_OPTIONS
, 0x01 },
907 { SUNI_CONFIG
, SUNI_PM7345_E3ENBL
},
908 { SUNI_SPLR_CFG
, 0x41 },
909 { SUNI_SPLT_CFG
, 0x41 }
913 status
= ia_phy_read32(iadev
, SUNI_E3_FRM_FRAM_INTR_IND_STAT
);
914 iadev
->carrier_detect
= (status
& SUNI_E3_LOS
) ? 0 : 1;
915 ia_phy_write(iadev
, suni_e3_init
, ARRAY_SIZE(suni_e3_init
));
918 static void ia_suni_pm7345_init(struct iadev_priv
*iadev
)
920 static const struct ia_reg suni_init
[] = {
921 /* Enable RSOP loss of signal interrupt. */
922 { SUNI_INTR_ENBL
, 0x28 },
923 /* Clear error counters. */
924 { SUNI_ID_RESET
, 0 },
925 /* Clear "PMCTST" in master test register. */
926 { SUNI_MASTER_TEST
, 0 },
928 { SUNI_RXCP_CTRL
, 0x2c },
929 { SUNI_RXCP_FCTRL
, 0x81 },
931 { SUNI_RXCP_IDLE_PAT_H1
, 0 },
932 { SUNI_RXCP_IDLE_PAT_H2
, 0 },
933 { SUNI_RXCP_IDLE_PAT_H3
, 0 },
934 { SUNI_RXCP_IDLE_PAT_H4
, 0x01 },
936 { SUNI_RXCP_IDLE_MASK_H1
, 0xff },
937 { SUNI_RXCP_IDLE_MASK_H2
, 0xff },
938 { SUNI_RXCP_IDLE_MASK_H3
, 0xff },
939 { SUNI_RXCP_IDLE_MASK_H4
, 0xfe },
941 { SUNI_RXCP_CELL_PAT_H1
, 0 },
942 { SUNI_RXCP_CELL_PAT_H2
, 0 },
943 { SUNI_RXCP_CELL_PAT_H3
, 0 },
944 { SUNI_RXCP_CELL_PAT_H4
, 0x01 },
946 { SUNI_RXCP_CELL_MASK_H1
, 0xff },
947 { SUNI_RXCP_CELL_MASK_H2
, 0xff },
948 { SUNI_RXCP_CELL_MASK_H3
, 0xff },
949 { SUNI_RXCP_CELL_MASK_H4
, 0xff },
951 { SUNI_TXCP_CTRL
, 0xa4 },
952 { SUNI_TXCP_INTR_EN_STS
, 0x10 },
953 { SUNI_TXCP_IDLE_PAT_H5
, 0x55 }
956 if (iadev
->phy_type
& FE_DS3_PHY
)
957 ia_suni_pm7345_init_ds3(iadev
);
959 ia_suni_pm7345_init_e3(iadev
);
961 ia_phy_write(iadev
, suni_init
, ARRAY_SIZE(suni_init
));
963 ia_phy_write32(iadev
, SUNI_CONFIG
, ia_phy_read32(iadev
, SUNI_CONFIG
) &
964 ~(SUNI_PM7345_LLB
| SUNI_PM7345_CLB
|
965 SUNI_PM7345_DLB
| SUNI_PM7345_PLB
));
967 suni_pm7345
->suni_rxcp_intr_en_sts
|= SUNI_OOCDE
;
968 #endif /* __SNMP__ */
973 /***************************** IA_LIB END *****************************/
975 #ifdef CONFIG_ATM_IA_DEBUG
976 static int tcnter
= 0;
977 static void xdump( u_char
* cp
, int length
, char* prefix
)
981 u_char
* pBuf
= prntBuf
;
983 while(count
< length
){
984 pBuf
+= sprintf( pBuf
, "%s", prefix
);
985 for(col
= 0;count
+ col
< length
&& col
< 16; col
++){
986 if (col
!= 0 && (col
% 4) == 0)
987 pBuf
+= sprintf( pBuf
, " " );
988 pBuf
+= sprintf( pBuf
, "%02X ", cp
[count
+ col
] );
990 while(col
++ < 16){ /* pad end of buffer with blanks */
992 sprintf( pBuf
, " " );
993 pBuf
+= sprintf( pBuf
, " " );
995 pBuf
+= sprintf( pBuf
, " " );
996 for(col
= 0;count
+ col
< length
&& col
< 16; col
++){
997 if (isprint((int)cp
[count
+ col
]))
998 pBuf
+= sprintf( pBuf
, "%c", cp
[count
+ col
] );
1000 pBuf
+= sprintf( pBuf
, "." );
1002 printk("%s\n", prntBuf
);
1007 } /* close xdump(... */
1008 #endif /* CONFIG_ATM_IA_DEBUG */
1011 static struct atm_dev
*ia_boards
= NULL
;
1013 #define ACTUAL_RAM_BASE \
1014 RAM_BASE*((iadev->mem)/(128 * 1024))
1015 #define ACTUAL_SEG_RAM_BASE \
1016 IPHASE5575_FRAG_CONTROL_RAM_BASE*((iadev->mem)/(128 * 1024))
1017 #define ACTUAL_REASS_RAM_BASE \
1018 IPHASE5575_REASS_CONTROL_RAM_BASE*((iadev->mem)/(128 * 1024))
1021 /*-- some utilities and memory allocation stuff will come here -------------*/
1023 static void desc_dbg(IADEV
*iadev
) {
1025 u_short tcq_wr_ptr
, tcq_st_ptr
, tcq_ed_ptr
;
1028 // regval = readl((u32)ia_cmds->maddr);
1029 tcq_wr_ptr
= readw(iadev
->seg_reg
+TCQ_WR_PTR
);
1030 printk("B_tcq_wr = 0x%x desc = %d last desc = %d\n",
1031 tcq_wr_ptr
, readw(iadev
->seg_ram
+tcq_wr_ptr
),
1032 readw(iadev
->seg_ram
+tcq_wr_ptr
-2));
1033 printk(" host_tcq_wr = 0x%x host_tcq_rd = 0x%x \n", iadev
->host_tcq_wr
,
1035 tcq_st_ptr
= readw(iadev
->seg_reg
+TCQ_ST_ADR
);
1036 tcq_ed_ptr
= readw(iadev
->seg_reg
+TCQ_ED_ADR
);
1037 printk("tcq_st_ptr = 0x%x tcq_ed_ptr = 0x%x \n", tcq_st_ptr
, tcq_ed_ptr
);
1039 while (tcq_st_ptr
!= tcq_ed_ptr
) {
1040 tmp
= iadev
->seg_ram
+tcq_st_ptr
;
1041 printk("TCQ slot %d desc = %d Addr = %p\n", i
++, readw(tmp
), tmp
);
1044 for(i
=0; i
<iadev
->num_tx_desc
; i
++)
1045 printk("Desc_tbl[%d] = %d \n", i
, iadev
->desc_tbl
[i
].timestamp
);
1049 /*----------------------------- Receiving side stuff --------------------------*/
1051 static void rx_excp_rcvd(struct atm_dev
*dev
)
1053 #if 0 /* closing the receiving size will cause too many excp int */
1056 u_short excpq_rd_ptr
;
1059 iadev
= INPH_IA_DEV(dev
);
1060 state
= readl(iadev
->reass_reg
+ STATE_REG
) & 0xffff;
1061 while((state
& EXCPQ_EMPTY
) != EXCPQ_EMPTY
)
1062 { printk("state = %x \n", state
);
1063 excpq_rd_ptr
= readw(iadev
->reass_reg
+ EXCP_Q_RD_PTR
) & 0xffff;
1064 printk("state = %x excpq_rd_ptr = %x \n", state
, excpq_rd_ptr
);
1065 if (excpq_rd_ptr
== *(u16
*)(iadev
->reass_reg
+ EXCP_Q_WR_PTR
))
1066 IF_ERR(printk("excpq_rd_ptr is wrong!!!\n");)
1067 // TODO: update exception stat
1068 vci
= readw(iadev
->reass_ram
+excpq_rd_ptr
);
1069 error
= readw(iadev
->reass_ram
+excpq_rd_ptr
+2) & 0x0007;
1072 if (excpq_rd_ptr
> (readw(iadev
->reass_reg
+ EXCP_Q_ED_ADR
)& 0xffff))
1073 excpq_rd_ptr
= readw(iadev
->reass_reg
+ EXCP_Q_ST_ADR
)& 0xffff;
1074 writew( excpq_rd_ptr
, iadev
->reass_reg
+ EXCP_Q_RD_PTR
);
1075 state
= readl(iadev
->reass_reg
+ STATE_REG
) & 0xffff;
1080 static void free_desc(struct atm_dev
*dev
, int desc
)
1083 iadev
= INPH_IA_DEV(dev
);
1084 writew(desc
, iadev
->reass_ram
+iadev
->rfL
.fdq_wr
);
1085 iadev
->rfL
.fdq_wr
+=2;
1086 if (iadev
->rfL
.fdq_wr
> iadev
->rfL
.fdq_ed
)
1087 iadev
->rfL
.fdq_wr
= iadev
->rfL
.fdq_st
;
1088 writew(iadev
->rfL
.fdq_wr
, iadev
->reass_reg
+FREEQ_WR_PTR
);
1092 static int rx_pkt(struct atm_dev
*dev
)
1095 struct atm_vcc
*vcc
;
1096 unsigned short status
;
1097 struct rx_buf_desc __iomem
*buf_desc_ptr
;
1101 struct sk_buff
*skb
;
1102 u_int buf_addr
, dma_addr
;
1104 iadev
= INPH_IA_DEV(dev
);
1105 if (iadev
->rfL
.pcq_rd
== (readw(iadev
->reass_reg
+PCQ_WR_PTR
)&0xffff))
1107 printk(KERN_ERR DEV_LABEL
"(itf %d) Receive queue empty\n", dev
->number
);
1110 /* mask 1st 3 bits to get the actual descno. */
1111 desc
= readw(iadev
->reass_ram
+iadev
->rfL
.pcq_rd
) & 0x1fff;
1112 IF_RX(printk("reass_ram = %p iadev->rfL.pcq_rd = 0x%x desc = %d\n",
1113 iadev
->reass_ram
, iadev
->rfL
.pcq_rd
, desc
);
1114 printk(" pcq_wr_ptr = 0x%x\n",
1115 readw(iadev
->reass_reg
+PCQ_WR_PTR
)&0xffff);)
1116 /* update the read pointer - maybe we shud do this in the end*/
1117 if ( iadev
->rfL
.pcq_rd
== iadev
->rfL
.pcq_ed
)
1118 iadev
->rfL
.pcq_rd
= iadev
->rfL
.pcq_st
;
1120 iadev
->rfL
.pcq_rd
+= 2;
1121 writew(iadev
->rfL
.pcq_rd
, iadev
->reass_reg
+PCQ_RD_PTR
);
1123 /* get the buffer desc entry.
1124 update stuff. - doesn't seem to be any update necessary
1126 buf_desc_ptr
= iadev
->RX_DESC_BASE_ADDR
;
1127 /* make the ptr point to the corresponding buffer desc entry */
1128 buf_desc_ptr
+= desc
;
1129 if (!desc
|| (desc
> iadev
->num_rx_desc
) ||
1130 ((buf_desc_ptr
->vc_index
& 0xffff) > iadev
->num_vc
)) {
1131 free_desc(dev
, desc
);
1132 IF_ERR(printk("IA: bad descriptor desc = %d \n", desc
);)
1135 vcc
= iadev
->rx_open
[buf_desc_ptr
->vc_index
& 0xffff];
1138 free_desc(dev
, desc
);
1139 printk("IA: null vcc, drop PDU\n");
1144 /* might want to check the status bits for errors */
1145 status
= (u_short
) (buf_desc_ptr
->desc_mode
);
1146 if (status
& (RX_CER
| RX_PTE
| RX_OFL
))
1148 atomic_inc(&vcc
->stats
->rx_err
);
1149 IF_ERR(printk("IA: bad packet, dropping it");)
1150 if (status
& RX_CER
) {
1151 IF_ERR(printk(" cause: packet CRC error\n");)
1153 else if (status
& RX_PTE
) {
1154 IF_ERR(printk(" cause: packet time out\n");)
1157 IF_ERR(printk(" cause: buffer overflow\n");)
1166 buf_addr
= (buf_desc_ptr
->buf_start_hi
<< 16) | buf_desc_ptr
->buf_start_lo
;
1167 dma_addr
= (buf_desc_ptr
->dma_start_hi
<< 16) | buf_desc_ptr
->dma_start_lo
;
1168 len
= dma_addr
- buf_addr
;
1169 if (len
> iadev
->rx_buf_sz
) {
1170 printk("Over %d bytes sdu received, dropped!!!\n", iadev
->rx_buf_sz
);
1171 atomic_inc(&vcc
->stats
->rx_err
);
1175 if (!(skb
= atm_alloc_charge(vcc
, len
, GFP_ATOMIC
))) {
1177 printk("Drop control packets\n");
1182 ATM_SKB(skb
)->vcc
= vcc
;
1183 ATM_DESC(skb
) = desc
;
1184 skb_queue_tail(&iadev
->rx_dma_q
, skb
);
1186 /* Build the DLE structure */
1187 wr_ptr
= iadev
->rx_dle_q
.write
;
1188 wr_ptr
->sys_pkt_addr
= dma_map_single(&iadev
->pci
->dev
, skb
->data
,
1189 len
, DMA_FROM_DEVICE
);
1190 wr_ptr
->local_pkt_addr
= buf_addr
;
1191 wr_ptr
->bytes
= len
; /* We don't know this do we ?? */
1192 wr_ptr
->mode
= DMA_INT_ENABLE
;
1194 /* shud take care of wrap around here too. */
1195 if(++wr_ptr
== iadev
->rx_dle_q
.end
)
1196 wr_ptr
= iadev
->rx_dle_q
.start
;
1197 iadev
->rx_dle_q
.write
= wr_ptr
;
1199 /* Increment transaction counter */
1200 writel(1, iadev
->dma
+IPHASE5575_RX_COUNTER
);
1203 free_desc(dev
, desc
);
1207 static void rx_intr(struct atm_dev
*dev
)
1213 iadev
= INPH_IA_DEV(dev
);
1214 status
= readl(iadev
->reass_reg
+REASS_INTR_STATUS_REG
) & 0xffff;
1215 IF_EVENT(printk("rx_intr: status = 0x%x\n", status
);)
1216 if (status
& RX_PKT_RCVD
)
1219 /* Basically recvd an interrupt for receiving a packet.
1220 A descriptor would have been written to the packet complete
1221 queue. Get all the descriptors and set up dma to move the
1222 packets till the packet complete queue is empty..
1224 state
= readl(iadev
->reass_reg
+ STATE_REG
) & 0xffff;
1225 IF_EVENT(printk("Rx intr status: RX_PKT_RCVD %08x\n", status
);)
1226 while(!(state
& PCQ_EMPTY
))
1229 state
= readl(iadev
->reass_reg
+ STATE_REG
) & 0xffff;
1233 if (status
& RX_FREEQ_EMPT
)
1236 iadev
->rx_tmp_cnt
= iadev
->rx_pkt_cnt
;
1237 iadev
->rx_tmp_jif
= jiffies
;
1240 else if ((time_after(jiffies
, iadev
->rx_tmp_jif
+ 50)) &&
1241 ((iadev
->rx_pkt_cnt
- iadev
->rx_tmp_cnt
) == 0)) {
1242 for (i
= 1; i
<= iadev
->num_rx_desc
; i
++)
1244 printk("Test logic RUN!!!!\n");
1245 writew( ~(RX_FREEQ_EMPT
|RX_EXCP_RCVD
),iadev
->reass_reg
+REASS_MASK_REG
);
1248 IF_EVENT(printk("Rx intr status: RX_FREEQ_EMPT %08x\n", status
);)
1251 if (status
& RX_EXCP_RCVD
)
1253 /* probably need to handle the exception queue also. */
1254 IF_EVENT(printk("Rx intr status: RX_EXCP_RCVD %08x\n", status
);)
1259 if (status
& RX_RAW_RCVD
)
1261 /* need to handle the raw incoming cells. This deepnds on
1262 whether we have programmed to receive the raw cells or not.
1264 IF_EVENT(printk("Rx intr status: RX_RAW_RCVD %08x\n", status
);)
1269 static void rx_dle_intr(struct atm_dev
*dev
)
1272 struct atm_vcc
*vcc
;
1273 struct sk_buff
*skb
;
1276 struct dle
*dle
, *cur_dle
;
1279 iadev
= INPH_IA_DEV(dev
);
1281 /* free all the dles done, that is just update our own dle read pointer
1282 - do we really need to do this. Think not. */
1283 /* DMA is done, just get all the recevie buffers from the rx dma queue
1284 and push them up to the higher layer protocol. Also free the desc
1285 associated with the buffer. */
1286 dle
= iadev
->rx_dle_q
.read
;
1287 dle_lp
= readl(iadev
->dma
+IPHASE5575_RX_LIST_ADDR
) & (sizeof(struct dle
)*DLE_ENTRIES
- 1);
1288 cur_dle
= (struct dle
*)(iadev
->rx_dle_q
.start
+ (dle_lp
>> 4));
1289 while(dle
!= cur_dle
)
1291 /* free the DMAed skb */
1292 skb
= skb_dequeue(&iadev
->rx_dma_q
);
1295 desc
= ATM_DESC(skb
);
1296 free_desc(dev
, desc
);
1298 if (!(len
= skb
->len
))
1300 printk("rx_dle_intr: skb len 0\n");
1301 dev_kfree_skb_any(skb
);
1305 struct cpcs_trailer
*trailer
;
1307 struct ia_vcc
*ia_vcc
;
1309 dma_unmap_single(&iadev
->pci
->dev
, iadev
->rx_dle_q
.write
->sys_pkt_addr
,
1310 len
, DMA_FROM_DEVICE
);
1311 /* no VCC related housekeeping done as yet. lets see */
1312 vcc
= ATM_SKB(skb
)->vcc
;
1314 printk("IA: null vcc\n");
1315 dev_kfree_skb_any(skb
);
1318 ia_vcc
= INPH_IA_VCC(vcc
);
1321 atomic_inc(&vcc
->stats
->rx_err
);
1322 atm_return(vcc
, skb
->truesize
);
1323 dev_kfree_skb_any(skb
);
1326 // get real pkt length pwang_test
1327 trailer
= (struct cpcs_trailer
*)((u_char
*)skb
->data
+
1328 skb
->len
- sizeof(*trailer
));
1329 length
= swap_byte_order(trailer
->length
);
1330 if ((length
> iadev
->rx_buf_sz
) || (length
>
1331 (skb
->len
- sizeof(struct cpcs_trailer
))))
1333 atomic_inc(&vcc
->stats
->rx_err
);
1334 IF_ERR(printk("rx_dle_intr: Bad AAL5 trailer %d (skb len %d)",
1336 atm_return(vcc
, skb
->truesize
);
1337 dev_kfree_skb_any(skb
);
1340 skb_trim(skb
, length
);
1342 /* Display the packet */
1343 IF_RXPKT(printk("\nDmad Recvd data: len = %d \n", skb
->len
);
1344 xdump(skb
->data
, skb
->len
, "RX: ");
1347 IF_RX(printk("rx_dle_intr: skb push");)
1349 atomic_inc(&vcc
->stats
->rx
);
1350 iadev
->rx_pkt_cnt
++;
1353 if (++dle
== iadev
->rx_dle_q
.end
)
1354 dle
= iadev
->rx_dle_q
.start
;
1356 iadev
->rx_dle_q
.read
= dle
;
1358 /* if the interrupts are masked because there were no free desc available,
1360 if (!iadev
->rxing
) {
1361 state
= readl(iadev
->reass_reg
+ STATE_REG
) & 0xffff;
1362 if (!(state
& FREEQ_EMPTY
)) {
1363 state
= readl(iadev
->reass_reg
+ REASS_MASK_REG
) & 0xffff;
1364 writel(state
& ~(RX_FREEQ_EMPT
|/* RX_EXCP_RCVD |*/ RX_PKT_RCVD
),
1365 iadev
->reass_reg
+REASS_MASK_REG
);
1372 static int open_rx(struct atm_vcc
*vcc
)
1375 u_short __iomem
*vc_table
;
1376 u_short __iomem
*reass_ptr
;
1377 IF_EVENT(printk("iadev: open_rx %d.%d\n", vcc
->vpi
, vcc
->vci
);)
1379 if (vcc
->qos
.rxtp
.traffic_class
== ATM_NONE
) return 0;
1380 iadev
= INPH_IA_DEV(vcc
->dev
);
1381 if (vcc
->qos
.rxtp
.traffic_class
== ATM_ABR
) {
1382 if (iadev
->phy_type
& FE_25MBIT_PHY
) {
1383 printk("IA: ABR not support\n");
1387 /* Make only this VCI in the vc table valid and let all
1388 others be invalid entries */
1389 vc_table
= iadev
->reass_ram
+RX_VC_TABLE
*iadev
->memSize
;
1390 vc_table
+= vcc
->vci
;
1391 /* mask the last 6 bits and OR it with 3 for 1K VCs */
1393 *vc_table
= vcc
->vci
<< 6;
1394 /* Also keep a list of open rx vcs so that we can attach them with
1395 incoming PDUs later. */
1396 if ((vcc
->qos
.rxtp
.traffic_class
== ATM_ABR
) ||
1397 (vcc
->qos
.txtp
.traffic_class
== ATM_ABR
))
1399 srv_cls_param_t srv_p
;
1400 init_abr_vc(iadev
, &srv_p
);
1401 ia_open_abr_vc(iadev
, &srv_p
, vcc
, 0);
1403 else { /* for UBR later may need to add CBR logic */
1404 reass_ptr
= iadev
->reass_ram
+REASS_TABLE
*iadev
->memSize
;
1405 reass_ptr
+= vcc
->vci
;
1406 *reass_ptr
= NO_AAL5_PKT
;
1409 if (iadev
->rx_open
[vcc
->vci
])
1410 printk(KERN_CRIT DEV_LABEL
"(itf %d): VCI %d already open\n",
1411 vcc
->dev
->number
, vcc
->vci
);
1412 iadev
->rx_open
[vcc
->vci
] = vcc
;
1416 static int rx_init(struct atm_dev
*dev
)
1419 struct rx_buf_desc __iomem
*buf_desc_ptr
;
1420 unsigned long rx_pkt_start
= 0;
1422 struct abr_vc_table
*abr_vc_table
;
1425 int i
,j
, vcsize_sel
;
1426 u_short freeq_st_adr
;
1427 u_short
*freeq_start
;
1429 iadev
= INPH_IA_DEV(dev
);
1430 // spin_lock_init(&iadev->rx_lock);
1432 /* Allocate 4k bytes - more aligned than needed (4k boundary) */
1433 dle_addr
= dma_alloc_coherent(&iadev
->pci
->dev
, DLE_TOTAL_SIZE
,
1434 &iadev
->rx_dle_dma
, GFP_KERNEL
);
1436 printk(KERN_ERR DEV_LABEL
"can't allocate DLEs\n");
1439 iadev
->rx_dle_q
.start
= (struct dle
*)dle_addr
;
1440 iadev
->rx_dle_q
.read
= iadev
->rx_dle_q
.start
;
1441 iadev
->rx_dle_q
.write
= iadev
->rx_dle_q
.start
;
1442 iadev
->rx_dle_q
.end
= (struct dle
*)((unsigned long)dle_addr
+sizeof(struct dle
)*DLE_ENTRIES
);
1443 /* the end of the dle q points to the entry after the last
1444 DLE that can be used. */
1446 /* write the upper 20 bits of the start address to rx list address register */
1447 /* We know this is 32bit bus addressed so the following is safe */
1448 writel(iadev
->rx_dle_dma
& 0xfffff000,
1449 iadev
->dma
+ IPHASE5575_RX_LIST_ADDR
);
1450 IF_INIT(printk("Tx Dle list addr: 0x%p value: 0x%0x\n",
1451 iadev
->dma
+IPHASE5575_TX_LIST_ADDR
,
1452 readl(iadev
->dma
+ IPHASE5575_TX_LIST_ADDR
));
1453 printk("Rx Dle list addr: 0x%p value: 0x%0x\n",
1454 iadev
->dma
+IPHASE5575_RX_LIST_ADDR
,
1455 readl(iadev
->dma
+ IPHASE5575_RX_LIST_ADDR
));)
1457 writew(0xffff, iadev
->reass_reg
+REASS_MASK_REG
);
1458 writew(0, iadev
->reass_reg
+MODE_REG
);
1459 writew(RESET_REASS
, iadev
->reass_reg
+REASS_COMMAND_REG
);
1461 /* Receive side control memory map
1462 -------------------------------
1464 Buffer descr 0x0000 (736 - 23K)
1465 VP Table 0x5c00 (256 - 512)
1466 Except q 0x5e00 (128 - 512)
1467 Free buffer q 0x6000 (1K - 2K)
1468 Packet comp q 0x6800 (1K - 2K)
1469 Reass Table 0x7000 (1K - 2K)
1470 VC Table 0x7800 (1K - 2K)
1471 ABR VC Table 0x8000 (1K - 32K)
1474 /* Base address for Buffer Descriptor Table */
1475 writew(RX_DESC_BASE
>> 16, iadev
->reass_reg
+REASS_DESC_BASE
);
1476 /* Set the buffer size register */
1477 writew(iadev
->rx_buf_sz
, iadev
->reass_reg
+BUF_SIZE
);
1479 /* Initialize each entry in the Buffer Descriptor Table */
1480 iadev
->RX_DESC_BASE_ADDR
= iadev
->reass_ram
+RX_DESC_BASE
*iadev
->memSize
;
1481 buf_desc_ptr
= iadev
->RX_DESC_BASE_ADDR
;
1482 memset_io(buf_desc_ptr
, 0, sizeof(*buf_desc_ptr
));
1484 rx_pkt_start
= iadev
->rx_pkt_ram
;
1485 for(i
=1; i
<=iadev
->num_rx_desc
; i
++)
1487 memset_io(buf_desc_ptr
, 0, sizeof(*buf_desc_ptr
));
1488 buf_desc_ptr
->buf_start_hi
= rx_pkt_start
>> 16;
1489 buf_desc_ptr
->buf_start_lo
= rx_pkt_start
& 0x0000ffff;
1491 rx_pkt_start
+= iadev
->rx_buf_sz
;
1493 IF_INIT(printk("Rx Buffer desc ptr: 0x%p\n", buf_desc_ptr
);)
1494 i
= FREE_BUF_DESC_Q
*iadev
->memSize
;
1495 writew(i
>> 16, iadev
->reass_reg
+REASS_QUEUE_BASE
);
1496 writew(i
, iadev
->reass_reg
+FREEQ_ST_ADR
);
1497 writew(i
+iadev
->num_rx_desc
*sizeof(u_short
),
1498 iadev
->reass_reg
+FREEQ_ED_ADR
);
1499 writew(i
, iadev
->reass_reg
+FREEQ_RD_PTR
);
1500 writew(i
+iadev
->num_rx_desc
*sizeof(u_short
),
1501 iadev
->reass_reg
+FREEQ_WR_PTR
);
1502 /* Fill the FREEQ with all the free descriptors. */
1503 freeq_st_adr
= readw(iadev
->reass_reg
+FREEQ_ST_ADR
);
1504 freeq_start
= (u_short
*)(iadev
->reass_ram
+freeq_st_adr
);
1505 for(i
=1; i
<=iadev
->num_rx_desc
; i
++)
1507 *freeq_start
= (u_short
)i
;
1510 IF_INIT(printk("freeq_start: 0x%p\n", freeq_start
);)
1511 /* Packet Complete Queue */
1512 i
= (PKT_COMP_Q
* iadev
->memSize
) & 0xffff;
1513 writew(i
, iadev
->reass_reg
+PCQ_ST_ADR
);
1514 writew(i
+iadev
->num_vc
*sizeof(u_short
), iadev
->reass_reg
+PCQ_ED_ADR
);
1515 writew(i
, iadev
->reass_reg
+PCQ_RD_PTR
);
1516 writew(i
, iadev
->reass_reg
+PCQ_WR_PTR
);
1518 /* Exception Queue */
1519 i
= (EXCEPTION_Q
* iadev
->memSize
) & 0xffff;
1520 writew(i
, iadev
->reass_reg
+EXCP_Q_ST_ADR
);
1521 writew(i
+ NUM_RX_EXCP
* sizeof(RX_ERROR_Q
),
1522 iadev
->reass_reg
+EXCP_Q_ED_ADR
);
1523 writew(i
, iadev
->reass_reg
+EXCP_Q_RD_PTR
);
1524 writew(i
, iadev
->reass_reg
+EXCP_Q_WR_PTR
);
1526 /* Load local copy of FREEQ and PCQ ptrs */
1527 iadev
->rfL
.fdq_st
= readw(iadev
->reass_reg
+FREEQ_ST_ADR
) & 0xffff;
1528 iadev
->rfL
.fdq_ed
= readw(iadev
->reass_reg
+FREEQ_ED_ADR
) & 0xffff ;
1529 iadev
->rfL
.fdq_rd
= readw(iadev
->reass_reg
+FREEQ_RD_PTR
) & 0xffff;
1530 iadev
->rfL
.fdq_wr
= readw(iadev
->reass_reg
+FREEQ_WR_PTR
) & 0xffff;
1531 iadev
->rfL
.pcq_st
= readw(iadev
->reass_reg
+PCQ_ST_ADR
) & 0xffff;
1532 iadev
->rfL
.pcq_ed
= readw(iadev
->reass_reg
+PCQ_ED_ADR
) & 0xffff;
1533 iadev
->rfL
.pcq_rd
= readw(iadev
->reass_reg
+PCQ_RD_PTR
) & 0xffff;
1534 iadev
->rfL
.pcq_wr
= readw(iadev
->reass_reg
+PCQ_WR_PTR
) & 0xffff;
1536 IF_INIT(printk("INIT:pcq_st:0x%x pcq_ed:0x%x pcq_rd:0x%x pcq_wr:0x%x",
1537 iadev
->rfL
.pcq_st
, iadev
->rfL
.pcq_ed
, iadev
->rfL
.pcq_rd
,
1538 iadev
->rfL
.pcq_wr
);)
1539 /* just for check - no VP TBL */
1541 /* writew(0x0b80, iadev->reass_reg+VP_LKUP_BASE); */
1542 /* initialize VP Table for invalid VPIs
1543 - I guess we can write all 1s or 0x000f in the entire memory
1544 space or something similar.
1547 /* This seems to work and looks right to me too !!! */
1548 i
= REASS_TABLE
* iadev
->memSize
;
1549 writew((i
>> 3), iadev
->reass_reg
+REASS_TABLE_BASE
);
1550 /* initialize Reassembly table to I don't know what ???? */
1551 reass_table
= (u16
*)(iadev
->reass_ram
+i
);
1552 j
= REASS_TABLE_SZ
* iadev
->memSize
;
1553 for(i
=0; i
< j
; i
++)
1554 *reass_table
++ = NO_AAL5_PKT
;
1557 while (i
!= iadev
->num_vc
) {
1561 i
= RX_VC_TABLE
* iadev
->memSize
;
1562 writew(((i
>>3) & 0xfff8) | vcsize_sel
, iadev
->reass_reg
+VC_LKUP_BASE
);
1563 vc_table
= (u16
*)(iadev
->reass_ram
+RX_VC_TABLE
*iadev
->memSize
);
1564 j
= RX_VC_TABLE_SZ
* iadev
->memSize
;
1565 for(i
= 0; i
< j
; i
++)
1567 /* shift the reassembly pointer by 3 + lower 3 bits of
1568 vc_lkup_base register (=3 for 1K VCs) and the last byte
1569 is those low 3 bits.
1570 Shall program this later.
1572 *vc_table
= (i
<< 6) | 15; /* for invalid VCI */
1576 i
= ABR_VC_TABLE
* iadev
->memSize
;
1577 writew(i
>> 3, iadev
->reass_reg
+ABR_LKUP_BASE
);
1579 i
= ABR_VC_TABLE
* iadev
->memSize
;
1580 abr_vc_table
= (struct abr_vc_table
*)(iadev
->reass_ram
+i
);
1581 j
= REASS_TABLE_SZ
* iadev
->memSize
;
1582 memset ((char*)abr_vc_table
, 0, j
* sizeof(*abr_vc_table
));
1583 for(i
= 0; i
< j
; i
++) {
1584 abr_vc_table
->rdf
= 0x0003;
1585 abr_vc_table
->air
= 0x5eb1;
1589 /* Initialize other registers */
1591 /* VP Filter Register set for VC Reassembly only */
1592 writew(0xff00, iadev
->reass_reg
+VP_FILTER
);
1593 writew(0, iadev
->reass_reg
+XTRA_RM_OFFSET
);
1594 writew(0x1, iadev
->reass_reg
+PROTOCOL_ID
);
1596 /* Packet Timeout Count related Registers :
1597 Set packet timeout to occur in about 3 seconds
1598 Set Packet Aging Interval count register to overflow in about 4 us
1600 writew(0xF6F8, iadev
->reass_reg
+PKT_TM_CNT
);
1602 i
= (j
>> 6) & 0xFF;
1604 i
|= ((j
<< 2) & 0xFF00);
1605 writew(i
, iadev
->reass_reg
+TMOUT_RANGE
);
1607 /* initiate the desc_tble */
1608 for(i
=0; i
<iadev
->num_tx_desc
;i
++)
1609 iadev
->desc_tbl
[i
].timestamp
= 0;
1611 /* to clear the interrupt status register - read it */
1612 readw(iadev
->reass_reg
+REASS_INTR_STATUS_REG
);
1614 /* Mask Register - clear it */
1615 writew(~(RX_FREEQ_EMPT
|RX_PKT_RCVD
), iadev
->reass_reg
+REASS_MASK_REG
);
1617 skb_queue_head_init(&iadev
->rx_dma_q
);
1618 iadev
->rx_free_desc_qhead
= NULL
;
1620 iadev
->rx_open
= kzalloc(4 * iadev
->num_vc
, GFP_KERNEL
);
1621 if (!iadev
->rx_open
) {
1622 printk(KERN_ERR DEV_LABEL
"itf %d couldn't get free page\n",
1628 iadev
->rx_pkt_cnt
= 0;
1630 writew(R_ONLINE
, iadev
->reass_reg
+MODE_REG
);
1634 dma_free_coherent(&iadev
->pci
->dev
, DLE_TOTAL_SIZE
, iadev
->rx_dle_q
.start
,
1642 The memory map suggested in appendix A and the coding for it.
1643 Keeping it around just in case we change our mind later.
1645 Buffer descr 0x0000 (128 - 4K)
1646 UBR sched 0x1000 (1K - 4K)
1647 UBR Wait q 0x2000 (1K - 4K)
1648 Commn queues 0x3000 Packet Ready, Trasmit comp(0x3100)
1650 extended VC 0x4000 (1K - 8K)
1651 ABR sched 0x6000 and ABR wait queue (1K - 2K) each
1652 CBR sched 0x7000 (as needed)
1653 VC table 0x8000 (1K - 32K)
1656 static void tx_intr(struct atm_dev
*dev
)
1659 unsigned short status
;
1660 unsigned long flags
;
1662 iadev
= INPH_IA_DEV(dev
);
1664 status
= readl(iadev
->seg_reg
+SEG_INTR_STATUS_REG
);
1665 if (status
& TRANSMIT_DONE
){
1667 IF_EVENT(printk("Tansmit Done Intr logic run\n");)
1668 spin_lock_irqsave(&iadev
->tx_lock
, flags
);
1670 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
1671 writew(TRANSMIT_DONE
, iadev
->seg_reg
+SEG_INTR_STATUS_REG
);
1672 if (iadev
->close_pending
)
1673 wake_up(&iadev
->close_wait
);
1675 if (status
& TCQ_NOT_EMPTY
)
1677 IF_EVENT(printk("TCQ_NOT_EMPTY int received\n");)
1681 static void tx_dle_intr(struct atm_dev
*dev
)
1684 struct dle
*dle
, *cur_dle
;
1685 struct sk_buff
*skb
;
1686 struct atm_vcc
*vcc
;
1687 struct ia_vcc
*iavcc
;
1689 unsigned long flags
;
1691 iadev
= INPH_IA_DEV(dev
);
1692 spin_lock_irqsave(&iadev
->tx_lock
, flags
);
1693 dle
= iadev
->tx_dle_q
.read
;
1694 dle_lp
= readl(iadev
->dma
+IPHASE5575_TX_LIST_ADDR
) &
1695 (sizeof(struct dle
)*DLE_ENTRIES
- 1);
1696 cur_dle
= (struct dle
*)(iadev
->tx_dle_q
.start
+ (dle_lp
>> 4));
1697 while (dle
!= cur_dle
)
1699 /* free the DMAed skb */
1700 skb
= skb_dequeue(&iadev
->tx_dma_q
);
1703 /* Revenge of the 2 dle (skb + trailer) used in ia_pkt_tx() */
1704 if (!((dle
- iadev
->tx_dle_q
.start
)%(2*sizeof(struct dle
)))) {
1705 dma_unmap_single(&iadev
->pci
->dev
, dle
->sys_pkt_addr
, skb
->len
,
1708 vcc
= ATM_SKB(skb
)->vcc
;
1710 printk("tx_dle_intr: vcc is null\n");
1711 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
1712 dev_kfree_skb_any(skb
);
1716 iavcc
= INPH_IA_VCC(vcc
);
1718 printk("tx_dle_intr: iavcc is null\n");
1719 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
1720 dev_kfree_skb_any(skb
);
1723 if (vcc
->qos
.txtp
.pcr
>= iadev
->rate_limit
) {
1724 if ((vcc
->pop
) && (skb
->len
!= 0))
1729 dev_kfree_skb_any(skb
);
1732 else { /* Hold the rate-limited skb for flow control */
1733 IA_SKB_STATE(skb
) |= IA_DLED
;
1734 skb_queue_tail(&iavcc
->txing_skb
, skb
);
1736 IF_EVENT(printk("tx_dle_intr: enque skb = 0x%p \n", skb
);)
1737 if (++dle
== iadev
->tx_dle_q
.end
)
1738 dle
= iadev
->tx_dle_q
.start
;
1740 iadev
->tx_dle_q
.read
= dle
;
1741 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
1744 static int open_tx(struct atm_vcc
*vcc
)
1746 struct ia_vcc
*ia_vcc
;
1751 IF_EVENT(printk("iadev: open_tx entered vcc->vci = %d\n", vcc
->vci
);)
1752 if (vcc
->qos
.txtp
.traffic_class
== ATM_NONE
) return 0;
1753 iadev
= INPH_IA_DEV(vcc
->dev
);
1755 if (iadev
->phy_type
& FE_25MBIT_PHY
) {
1756 if (vcc
->qos
.txtp
.traffic_class
== ATM_ABR
) {
1757 printk("IA: ABR not support\n");
1760 if (vcc
->qos
.txtp
.traffic_class
== ATM_CBR
) {
1761 printk("IA: CBR not support\n");
1765 ia_vcc
= INPH_IA_VCC(vcc
);
1766 memset((caddr_t
)ia_vcc
, 0, sizeof(*ia_vcc
));
1767 if (vcc
->qos
.txtp
.max_sdu
>
1768 (iadev
->tx_buf_sz
- sizeof(struct cpcs_trailer
))){
1769 printk("IA: SDU size over (%d) the configured SDU size %d\n",
1770 vcc
->qos
.txtp
.max_sdu
,iadev
->tx_buf_sz
);
1771 vcc
->dev_data
= NULL
;
1775 ia_vcc
->vc_desc_cnt
= 0;
1779 if (vcc
->qos
.txtp
.max_pcr
== ATM_MAX_PCR
)
1780 vcc
->qos
.txtp
.pcr
= iadev
->LineRate
;
1781 else if ((vcc
->qos
.txtp
.max_pcr
== 0)&&( vcc
->qos
.txtp
.pcr
<= 0))
1782 vcc
->qos
.txtp
.pcr
= iadev
->LineRate
;
1783 else if ((vcc
->qos
.txtp
.max_pcr
> vcc
->qos
.txtp
.pcr
) && (vcc
->qos
.txtp
.max_pcr
> 0))
1784 vcc
->qos
.txtp
.pcr
= vcc
->qos
.txtp
.max_pcr
;
1785 if (vcc
->qos
.txtp
.pcr
> iadev
->LineRate
)
1786 vcc
->qos
.txtp
.pcr
= iadev
->LineRate
;
1787 ia_vcc
->pcr
= vcc
->qos
.txtp
.pcr
;
1789 if (ia_vcc
->pcr
> (iadev
->LineRate
/ 6) ) ia_vcc
->ltimeout
= HZ
/ 10;
1790 else if (ia_vcc
->pcr
> (iadev
->LineRate
/ 130)) ia_vcc
->ltimeout
= HZ
;
1791 else if (ia_vcc
->pcr
<= 170) ia_vcc
->ltimeout
= 16 * HZ
;
1792 else ia_vcc
->ltimeout
= 2700 * HZ
/ ia_vcc
->pcr
;
1793 if (ia_vcc
->pcr
< iadev
->rate_limit
)
1794 skb_queue_head_init (&ia_vcc
->txing_skb
);
1795 if (ia_vcc
->pcr
< iadev
->rate_limit
) {
1796 struct sock
*sk
= sk_atm(vcc
);
1798 if (vcc
->qos
.txtp
.max_sdu
!= 0) {
1799 if (ia_vcc
->pcr
> 60000)
1800 sk
->sk_sndbuf
= vcc
->qos
.txtp
.max_sdu
* 5;
1801 else if (ia_vcc
->pcr
> 2000)
1802 sk
->sk_sndbuf
= vcc
->qos
.txtp
.max_sdu
* 4;
1804 sk
->sk_sndbuf
= vcc
->qos
.txtp
.max_sdu
* 3;
1807 sk
->sk_sndbuf
= 24576;
1810 vc
= (struct main_vc
*)iadev
->MAIN_VC_TABLE_ADDR
;
1811 evc
= (struct ext_vc
*)iadev
->EXT_VC_TABLE_ADDR
;
1814 memset((caddr_t
)vc
, 0, sizeof(*vc
));
1815 memset((caddr_t
)evc
, 0, sizeof(*evc
));
1817 /* store the most significant 4 bits of vci as the last 4 bits
1818 of first part of atm header.
1819 store the last 12 bits of vci as first 12 bits of the second
1820 part of the atm header.
1822 evc
->atm_hdr1
= (vcc
->vci
>> 12) & 0x000f;
1823 evc
->atm_hdr2
= (vcc
->vci
& 0x0fff) << 4;
1825 /* check the following for different traffic classes */
1826 if (vcc
->qos
.txtp
.traffic_class
== ATM_UBR
)
1829 vc
->status
= CRC_APPEND
;
1830 vc
->acr
= cellrate_to_float(iadev
->LineRate
);
1831 if (vcc
->qos
.txtp
.pcr
> 0)
1832 vc
->acr
= cellrate_to_float(vcc
->qos
.txtp
.pcr
);
1833 IF_UBR(printk("UBR: txtp.pcr = 0x%x f_rate = 0x%x\n",
1834 vcc
->qos
.txtp
.max_pcr
,vc
->acr
);)
1836 else if (vcc
->qos
.txtp
.traffic_class
== ATM_ABR
)
1837 { srv_cls_param_t srv_p
;
1838 IF_ABR(printk("Tx ABR VCC\n");)
1839 init_abr_vc(iadev
, &srv_p
);
1840 if (vcc
->qos
.txtp
.pcr
> 0)
1841 srv_p
.pcr
= vcc
->qos
.txtp
.pcr
;
1842 if (vcc
->qos
.txtp
.min_pcr
> 0) {
1843 int tmpsum
= iadev
->sum_mcr
+iadev
->sum_cbr
+vcc
->qos
.txtp
.min_pcr
;
1844 if (tmpsum
> iadev
->LineRate
)
1846 srv_p
.mcr
= vcc
->qos
.txtp
.min_pcr
;
1847 iadev
->sum_mcr
+= vcc
->qos
.txtp
.min_pcr
;
1850 if (vcc
->qos
.txtp
.icr
)
1851 srv_p
.icr
= vcc
->qos
.txtp
.icr
;
1852 if (vcc
->qos
.txtp
.tbe
)
1853 srv_p
.tbe
= vcc
->qos
.txtp
.tbe
;
1854 if (vcc
->qos
.txtp
.frtt
)
1855 srv_p
.frtt
= vcc
->qos
.txtp
.frtt
;
1856 if (vcc
->qos
.txtp
.rif
)
1857 srv_p
.rif
= vcc
->qos
.txtp
.rif
;
1858 if (vcc
->qos
.txtp
.rdf
)
1859 srv_p
.rdf
= vcc
->qos
.txtp
.rdf
;
1860 if (vcc
->qos
.txtp
.nrm_pres
)
1861 srv_p
.nrm
= vcc
->qos
.txtp
.nrm
;
1862 if (vcc
->qos
.txtp
.trm_pres
)
1863 srv_p
.trm
= vcc
->qos
.txtp
.trm
;
1864 if (vcc
->qos
.txtp
.adtf_pres
)
1865 srv_p
.adtf
= vcc
->qos
.txtp
.adtf
;
1866 if (vcc
->qos
.txtp
.cdf_pres
)
1867 srv_p
.cdf
= vcc
->qos
.txtp
.cdf
;
1868 if (srv_p
.icr
> srv_p
.pcr
)
1869 srv_p
.icr
= srv_p
.pcr
;
1870 IF_ABR(printk("ABR:vcc->qos.txtp.max_pcr = %d mcr = %d\n",
1871 srv_p
.pcr
, srv_p
.mcr
);)
1872 ia_open_abr_vc(iadev
, &srv_p
, vcc
, 1);
1873 } else if (vcc
->qos
.txtp
.traffic_class
== ATM_CBR
) {
1874 if (iadev
->phy_type
& FE_25MBIT_PHY
) {
1875 printk("IA: CBR not support\n");
1878 if (vcc
->qos
.txtp
.max_pcr
> iadev
->LineRate
) {
1879 IF_CBR(printk("PCR is not available\n");)
1883 vc
->status
= CRC_APPEND
;
1884 if ((ret
= ia_cbr_setup (iadev
, vcc
)) < 0) {
1889 printk("iadev: Non UBR, ABR and CBR traffic not supportedn");
1891 iadev
->testTable
[vcc
->vci
]->vc_status
|= VC_ACTIVE
;
1892 IF_EVENT(printk("ia open_tx returning \n");)
1897 static int tx_init(struct atm_dev
*dev
)
1900 struct tx_buf_desc
*buf_desc_ptr
;
1901 unsigned int tx_pkt_start
;
1913 iadev
= INPH_IA_DEV(dev
);
1914 spin_lock_init(&iadev
->tx_lock
);
1916 IF_INIT(printk("Tx MASK REG: 0x%0x\n",
1917 readw(iadev
->seg_reg
+SEG_MASK_REG
));)
1919 /* Allocate 4k (boundary aligned) bytes */
1920 dle_addr
= dma_alloc_coherent(&iadev
->pci
->dev
, DLE_TOTAL_SIZE
,
1921 &iadev
->tx_dle_dma
, GFP_KERNEL
);
1923 printk(KERN_ERR DEV_LABEL
"can't allocate DLEs\n");
1926 iadev
->tx_dle_q
.start
= (struct dle
*)dle_addr
;
1927 iadev
->tx_dle_q
.read
= iadev
->tx_dle_q
.start
;
1928 iadev
->tx_dle_q
.write
= iadev
->tx_dle_q
.start
;
1929 iadev
->tx_dle_q
.end
= (struct dle
*)((unsigned long)dle_addr
+sizeof(struct dle
)*DLE_ENTRIES
);
1931 /* write the upper 20 bits of the start address to tx list address register */
1932 writel(iadev
->tx_dle_dma
& 0xfffff000,
1933 iadev
->dma
+ IPHASE5575_TX_LIST_ADDR
);
1934 writew(0xffff, iadev
->seg_reg
+SEG_MASK_REG
);
1935 writew(0, iadev
->seg_reg
+MODE_REG_0
);
1936 writew(RESET_SEG
, iadev
->seg_reg
+SEG_COMMAND_REG
);
1937 iadev
->MAIN_VC_TABLE_ADDR
= iadev
->seg_ram
+MAIN_VC_TABLE
*iadev
->memSize
;
1938 iadev
->EXT_VC_TABLE_ADDR
= iadev
->seg_ram
+EXT_VC_TABLE
*iadev
->memSize
;
1939 iadev
->ABR_SCHED_TABLE_ADDR
=iadev
->seg_ram
+ABR_SCHED_TABLE
*iadev
->memSize
;
1942 Transmit side control memory map
1943 --------------------------------
1944 Buffer descr 0x0000 (128 - 4K)
1945 Commn queues 0x1000 Transmit comp, Packet ready(0x1400)
1948 CBR Table 0x1800 (as needed) - 6K
1949 UBR Table 0x3000 (1K - 4K) - 12K
1950 UBR Wait queue 0x4000 (1K - 4K) - 16K
1951 ABR sched 0x5000 and ABR wait queue (1K - 2K) each
1952 ABR Tbl - 20K, ABR Wq - 22K
1953 extended VC 0x6000 (1K - 8K) - 24K
1954 VC Table 0x8000 (1K - 32K) - 32K
1956 Between 0x2000 (8K) and 0x3000 (12K) there is 4K space left for VBR Tbl
1957 and Wait q, which can be allotted later.
1960 /* Buffer Descriptor Table Base address */
1961 writew(TX_DESC_BASE
, iadev
->seg_reg
+SEG_DESC_BASE
);
1963 /* initialize each entry in the buffer descriptor table */
1964 buf_desc_ptr
=(struct tx_buf_desc
*)(iadev
->seg_ram
+TX_DESC_BASE
);
1965 memset((caddr_t
)buf_desc_ptr
, 0, sizeof(*buf_desc_ptr
));
1967 tx_pkt_start
= TX_PACKET_RAM
;
1968 for(i
=1; i
<=iadev
->num_tx_desc
; i
++)
1970 memset((caddr_t
)buf_desc_ptr
, 0, sizeof(*buf_desc_ptr
));
1971 buf_desc_ptr
->desc_mode
= AAL5
;
1972 buf_desc_ptr
->buf_start_hi
= tx_pkt_start
>> 16;
1973 buf_desc_ptr
->buf_start_lo
= tx_pkt_start
& 0x0000ffff;
1975 tx_pkt_start
+= iadev
->tx_buf_sz
;
1977 iadev
->tx_buf
= kmalloc(iadev
->num_tx_desc
*sizeof(struct cpcs_trailer_desc
), GFP_KERNEL
);
1978 if (!iadev
->tx_buf
) {
1979 printk(KERN_ERR DEV_LABEL
" couldn't get mem\n");
1982 for (i
= 0; i
< iadev
->num_tx_desc
; i
++)
1984 struct cpcs_trailer
*cpcs
;
1986 cpcs
= kmalloc(sizeof(*cpcs
), GFP_KERNEL
|GFP_DMA
);
1988 printk(KERN_ERR DEV_LABEL
" couldn't get freepage\n");
1989 goto err_free_tx_bufs
;
1991 iadev
->tx_buf
[i
].cpcs
= cpcs
;
1992 iadev
->tx_buf
[i
].dma_addr
= dma_map_single(&iadev
->pci
->dev
,
1997 iadev
->desc_tbl
= kmalloc(iadev
->num_tx_desc
*
1998 sizeof(struct desc_tbl_t
), GFP_KERNEL
);
1999 if (!iadev
->desc_tbl
) {
2000 printk(KERN_ERR DEV_LABEL
" couldn't get mem\n");
2001 goto err_free_all_tx_bufs
;
2004 /* Communication Queues base address */
2005 i
= TX_COMP_Q
* iadev
->memSize
;
2006 writew(i
>> 16, iadev
->seg_reg
+SEG_QUEUE_BASE
);
2008 /* Transmit Complete Queue */
2009 writew(i
, iadev
->seg_reg
+TCQ_ST_ADR
);
2010 writew(i
, iadev
->seg_reg
+TCQ_RD_PTR
);
2011 writew(i
+iadev
->num_tx_desc
*sizeof(u_short
),iadev
->seg_reg
+TCQ_WR_PTR
);
2012 iadev
->host_tcq_wr
= i
+ iadev
->num_tx_desc
*sizeof(u_short
);
2013 writew(i
+2 * iadev
->num_tx_desc
* sizeof(u_short
),
2014 iadev
->seg_reg
+TCQ_ED_ADR
);
2015 /* Fill the TCQ with all the free descriptors. */
2016 tcq_st_adr
= readw(iadev
->seg_reg
+TCQ_ST_ADR
);
2017 tcq_start
= (u_short
*)(iadev
->seg_ram
+tcq_st_adr
);
2018 for(i
=1; i
<=iadev
->num_tx_desc
; i
++)
2020 *tcq_start
= (u_short
)i
;
2024 /* Packet Ready Queue */
2025 i
= PKT_RDY_Q
* iadev
->memSize
;
2026 writew(i
, iadev
->seg_reg
+PRQ_ST_ADR
);
2027 writew(i
+2 * iadev
->num_tx_desc
* sizeof(u_short
),
2028 iadev
->seg_reg
+PRQ_ED_ADR
);
2029 writew(i
, iadev
->seg_reg
+PRQ_RD_PTR
);
2030 writew(i
, iadev
->seg_reg
+PRQ_WR_PTR
);
2032 /* Load local copy of PRQ and TCQ ptrs */
2033 iadev
->ffL
.prq_st
= readw(iadev
->seg_reg
+PRQ_ST_ADR
) & 0xffff;
2034 iadev
->ffL
.prq_ed
= readw(iadev
->seg_reg
+PRQ_ED_ADR
) & 0xffff;
2035 iadev
->ffL
.prq_wr
= readw(iadev
->seg_reg
+PRQ_WR_PTR
) & 0xffff;
2037 iadev
->ffL
.tcq_st
= readw(iadev
->seg_reg
+TCQ_ST_ADR
) & 0xffff;
2038 iadev
->ffL
.tcq_ed
= readw(iadev
->seg_reg
+TCQ_ED_ADR
) & 0xffff;
2039 iadev
->ffL
.tcq_rd
= readw(iadev
->seg_reg
+TCQ_RD_PTR
) & 0xffff;
2041 /* Just for safety initializing the queue to have desc 1 always */
2042 /* Fill the PRQ with all the free descriptors. */
2043 prq_st_adr
= readw(iadev
->seg_reg
+PRQ_ST_ADR
);
2044 prq_start
= (u_short
*)(iadev
->seg_ram
+prq_st_adr
);
2045 for(i
=1; i
<=iadev
->num_tx_desc
; i
++)
2047 *prq_start
= (u_short
)0; /* desc 1 in all entries */
2051 IF_INIT(printk("Start CBR Init\n");)
2052 #if 1 /* for 1K VC board, CBR_PTR_BASE is 0 */
2053 writew(0,iadev
->seg_reg
+CBR_PTR_BASE
);
2054 #else /* Charlie's logic is wrong ? */
2055 tmp16
= (iadev
->seg_ram
+CBR_SCHED_TABLE
*iadev
->memSize
)>>17;
2056 IF_INIT(printk("cbr_ptr_base = 0x%x ", tmp16
);)
2057 writew(tmp16
,iadev
->seg_reg
+CBR_PTR_BASE
);
2060 IF_INIT(printk("value in register = 0x%x\n",
2061 readw(iadev
->seg_reg
+CBR_PTR_BASE
));)
2062 tmp16
= (CBR_SCHED_TABLE
*iadev
->memSize
) >> 1;
2063 writew(tmp16
, iadev
->seg_reg
+CBR_TAB_BEG
);
2064 IF_INIT(printk("cbr_tab_beg = 0x%x in reg = 0x%x \n", tmp16
,
2065 readw(iadev
->seg_reg
+CBR_TAB_BEG
));)
2066 writew(tmp16
, iadev
->seg_reg
+CBR_TAB_END
+1); // CBR_PTR;
2067 tmp16
= (CBR_SCHED_TABLE
*iadev
->memSize
+ iadev
->num_vc
*6 - 2) >> 1;
2068 writew(tmp16
, iadev
->seg_reg
+CBR_TAB_END
);
2069 IF_INIT(printk("iadev->seg_reg = 0x%p CBR_PTR_BASE = 0x%x\n",
2070 iadev
->seg_reg
, readw(iadev
->seg_reg
+CBR_PTR_BASE
));)
2071 IF_INIT(printk("CBR_TAB_BEG = 0x%x, CBR_TAB_END = 0x%x, CBR_PTR = 0x%x\n",
2072 readw(iadev
->seg_reg
+CBR_TAB_BEG
), readw(iadev
->seg_reg
+CBR_TAB_END
),
2073 readw(iadev
->seg_reg
+CBR_TAB_END
+1));)
2075 /* Initialize the CBR Schedualing Table */
2076 memset_io(iadev
->seg_ram
+CBR_SCHED_TABLE
*iadev
->memSize
,
2077 0, iadev
->num_vc
*6);
2078 iadev
->CbrRemEntries
= iadev
->CbrTotEntries
= iadev
->num_vc
*3;
2079 iadev
->CbrEntryPt
= 0;
2080 iadev
->Granularity
= MAX_ATM_155
/ iadev
->CbrTotEntries
;
2081 iadev
->NumEnabledCBR
= 0;
2083 /* UBR scheduling Table and wait queue */
2084 /* initialize all bytes of UBR scheduler table and wait queue to 0
2085 - SCHEDSZ is 1K (# of entries).
2086 - UBR Table size is 4K
2087 - UBR wait queue is 4K
2088 since the table and wait queues are contiguous, all the bytes
2089 can be initialized by one memeset.
2094 while (i
!= iadev
->num_vc
) {
2099 i
= MAIN_VC_TABLE
* iadev
->memSize
;
2100 writew(vcsize_sel
| ((i
>> 8) & 0xfff8),iadev
->seg_reg
+VCT_BASE
);
2101 i
= EXT_VC_TABLE
* iadev
->memSize
;
2102 writew((i
>> 8) & 0xfffe, iadev
->seg_reg
+VCTE_BASE
);
2103 i
= UBR_SCHED_TABLE
* iadev
->memSize
;
2104 writew((i
& 0xffff) >> 11, iadev
->seg_reg
+UBR_SBPTR_BASE
);
2105 i
= UBR_WAIT_Q
* iadev
->memSize
;
2106 writew((i
>> 7) & 0xffff, iadev
->seg_reg
+UBRWQ_BASE
);
2107 memset((caddr_t
)(iadev
->seg_ram
+UBR_SCHED_TABLE
*iadev
->memSize
),
2108 0, iadev
->num_vc
*8);
2109 /* ABR scheduling Table(0x5000-0x57ff) and wait queue(0x5800-0x5fff)*/
2110 /* initialize all bytes of ABR scheduler table and wait queue to 0
2111 - SCHEDSZ is 1K (# of entries).
2112 - ABR Table size is 2K
2113 - ABR wait queue is 2K
2114 since the table and wait queues are contiguous, all the bytes
2115 can be initialized by one memeset.
2117 i
= ABR_SCHED_TABLE
* iadev
->memSize
;
2118 writew((i
>> 11) & 0xffff, iadev
->seg_reg
+ABR_SBPTR_BASE
);
2119 i
= ABR_WAIT_Q
* iadev
->memSize
;
2120 writew((i
>> 7) & 0xffff, iadev
->seg_reg
+ABRWQ_BASE
);
2122 i
= ABR_SCHED_TABLE
*iadev
->memSize
;
2123 memset((caddr_t
)(iadev
->seg_ram
+i
), 0, iadev
->num_vc
*4);
2124 vc
= (struct main_vc
*)iadev
->MAIN_VC_TABLE_ADDR
;
2125 evc
= (struct ext_vc
*)iadev
->EXT_VC_TABLE_ADDR
;
2126 iadev
->testTable
= kmalloc(sizeof(long)*iadev
->num_vc
, GFP_KERNEL
);
2127 if (!iadev
->testTable
) {
2128 printk("Get freepage failed\n");
2129 goto err_free_desc_tbl
;
2131 for(i
=0; i
<iadev
->num_vc
; i
++)
2133 memset((caddr_t
)vc
, 0, sizeof(*vc
));
2134 memset((caddr_t
)evc
, 0, sizeof(*evc
));
2135 iadev
->testTable
[i
] = kmalloc(sizeof(struct testTable_t
),
2137 if (!iadev
->testTable
[i
])
2138 goto err_free_test_tables
;
2139 iadev
->testTable
[i
]->lastTime
= 0;
2140 iadev
->testTable
[i
]->fract
= 0;
2141 iadev
->testTable
[i
]->vc_status
= VC_UBR
;
2146 /* Other Initialization */
2148 /* Max Rate Register */
2149 if (iadev
->phy_type
& FE_25MBIT_PHY
) {
2150 writew(RATE25
, iadev
->seg_reg
+MAXRATE
);
2151 writew((UBR_EN
| (0x23 << 2)), iadev
->seg_reg
+STPARMS
);
2154 writew(cellrate_to_float(iadev
->LineRate
),iadev
->seg_reg
+MAXRATE
);
2155 writew((UBR_EN
| ABR_EN
| (0x23 << 2)), iadev
->seg_reg
+STPARMS
);
2157 /* Set Idle Header Reigisters to be sure */
2158 writew(0, iadev
->seg_reg
+IDLEHEADHI
);
2159 writew(0, iadev
->seg_reg
+IDLEHEADLO
);
2161 /* Program ABR UBR Priority Register as PRI_ABR_UBR_EQUAL */
2162 writew(0xaa00, iadev
->seg_reg
+ABRUBR_ARB
);
2164 iadev
->close_pending
= 0;
2165 init_waitqueue_head(&iadev
->close_wait
);
2166 init_waitqueue_head(&iadev
->timeout_wait
);
2167 skb_queue_head_init(&iadev
->tx_dma_q
);
2168 ia_init_rtn_q(&iadev
->tx_return_q
);
2170 /* RM Cell Protocol ID and Message Type */
2171 writew(RM_TYPE_4_0
, iadev
->seg_reg
+RM_TYPE
);
2172 skb_queue_head_init (&iadev
->tx_backlog
);
2174 /* Mode Register 1 */
2175 writew(MODE_REG_1_VAL
, iadev
->seg_reg
+MODE_REG_1
);
2177 /* Mode Register 0 */
2178 writew(T_ONLINE
, iadev
->seg_reg
+MODE_REG_0
);
2180 /* Interrupt Status Register - read to clear */
2181 readw(iadev
->seg_reg
+SEG_INTR_STATUS_REG
);
2183 /* Interrupt Mask Reg- don't mask TCQ_NOT_EMPTY interrupt generation */
2184 writew(~(TRANSMIT_DONE
| TCQ_NOT_EMPTY
), iadev
->seg_reg
+SEG_MASK_REG
);
2185 writew(TRANSMIT_DONE
, iadev
->seg_reg
+SEG_INTR_STATUS_REG
);
2186 iadev
->tx_pkt_cnt
= 0;
2187 iadev
->rate_limit
= iadev
->LineRate
/ 3;
2191 err_free_test_tables
:
2193 kfree(iadev
->testTable
[i
]);
2194 kfree(iadev
->testTable
);
2196 kfree(iadev
->desc_tbl
);
2197 err_free_all_tx_bufs
:
2198 i
= iadev
->num_tx_desc
;
2201 struct cpcs_trailer_desc
*desc
= iadev
->tx_buf
+ i
;
2203 dma_unmap_single(&iadev
->pci
->dev
, desc
->dma_addr
,
2204 sizeof(*desc
->cpcs
), DMA_TO_DEVICE
);
2207 kfree(iadev
->tx_buf
);
2209 dma_free_coherent(&iadev
->pci
->dev
, DLE_TOTAL_SIZE
, iadev
->tx_dle_q
.start
,
2215 static irqreturn_t
ia_int(int irq
, void *dev_id
)
2217 struct atm_dev
*dev
;
2219 unsigned int status
;
2223 iadev
= INPH_IA_DEV(dev
);
2224 while( (status
= readl(iadev
->reg
+IPHASE5575_BUS_STATUS_REG
) & 0x7f))
2227 IF_EVENT(printk("ia_int: status = 0x%x\n", status
);)
2228 if (status
& STAT_REASSINT
)
2231 IF_EVENT(printk("REASSINT Bus status reg: %08x\n", status
);)
2234 if (status
& STAT_DLERINT
)
2236 /* Clear this bit by writing a 1 to it. */
2237 writel(STAT_DLERINT
, iadev
->reg
+ IPHASE5575_BUS_STATUS_REG
);
2240 if (status
& STAT_SEGINT
)
2243 IF_EVENT(printk("IA: tx_intr \n");)
2246 if (status
& STAT_DLETINT
)
2248 writel(STAT_DLETINT
, iadev
->reg
+ IPHASE5575_BUS_STATUS_REG
);
2251 if (status
& (STAT_FEINT
| STAT_ERRINT
| STAT_MARKINT
))
2253 if (status
& STAT_FEINT
)
2254 ia_frontend_intr(iadev
);
2257 return IRQ_RETVAL(handled
);
2262 /*----------------------------- entries --------------------------------*/
2263 static int get_esi(struct atm_dev
*dev
)
2270 iadev
= INPH_IA_DEV(dev
);
2271 mac1
= cpu_to_be32(le32_to_cpu(readl(
2272 iadev
->reg
+IPHASE5575_MAC1
)));
2273 mac2
= cpu_to_be16(le16_to_cpu(readl(iadev
->reg
+IPHASE5575_MAC2
)));
2274 IF_INIT(printk("ESI: 0x%08x%04x\n", mac1
, mac2
);)
2275 for (i
=0; i
<MAC1_LEN
; i
++)
2276 dev
->esi
[i
] = mac1
>>(8*(MAC1_LEN
-1-i
));
2278 for (i
=0; i
<MAC2_LEN
; i
++)
2279 dev
->esi
[i
+MAC1_LEN
] = mac2
>>(8*(MAC2_LEN
- 1 -i
));
2283 static int reset_sar(struct atm_dev
*dev
)
2287 unsigned int pci
[64];
2289 iadev
= INPH_IA_DEV(dev
);
2291 if ((error
= pci_read_config_dword(iadev
->pci
,
2292 i
*4, &pci
[i
])) != PCIBIOS_SUCCESSFUL
)
2294 writel(0, iadev
->reg
+IPHASE5575_EXT_RESET
);
2296 if ((error
= pci_write_config_dword(iadev
->pci
,
2297 i
*4, pci
[i
])) != PCIBIOS_SUCCESSFUL
)
2304 static int ia_init(struct atm_dev
*dev
)
2307 unsigned long real_base
;
2309 unsigned short command
;
2312 /* The device has been identified and registered. Now we read
2313 necessary configuration info like memory base address,
2314 interrupt number etc */
2316 IF_INIT(printk(">ia_init\n");)
2317 dev
->ci_range
.vpi_bits
= 0;
2318 dev
->ci_range
.vci_bits
= NR_VCI_LD
;
2320 iadev
= INPH_IA_DEV(dev
);
2321 real_base
= pci_resource_start (iadev
->pci
, 0);
2322 iadev
->irq
= iadev
->pci
->irq
;
2324 error
= pci_read_config_word(iadev
->pci
, PCI_COMMAND
, &command
);
2326 printk(KERN_ERR DEV_LABEL
"(itf %d): init error 0x%x\n",
2330 IF_INIT(printk(DEV_LABEL
"(itf %d): rev.%d,realbase=0x%lx,irq=%d\n",
2331 dev
->number
, iadev
->pci
->revision
, real_base
, iadev
->irq
);)
2333 /* find mapping size of board */
2335 iadev
->pci_map_size
= pci_resource_len(iadev
->pci
, 0);
2337 if (iadev
->pci_map_size
== 0x100000){
2338 iadev
->num_vc
= 4096;
2339 dev
->ci_range
.vci_bits
= NR_VCI_4K_LD
;
2342 else if (iadev
->pci_map_size
== 0x40000) {
2343 iadev
->num_vc
= 1024;
2347 printk("Unknown pci_map_size = 0x%x\n", iadev
->pci_map_size
);
2350 IF_INIT(printk (DEV_LABEL
"map size: %i\n", iadev
->pci_map_size
);)
2352 /* enable bus mastering */
2353 pci_set_master(iadev
->pci
);
2356 * Delay at least 1us before doing any mem accesses (how 'bout 10?)
2360 /* mapping the physical address to a virtual address in address space */
2361 base
= ioremap(real_base
,iadev
->pci_map_size
); /* ioremap is not resolved ??? */
2365 printk(DEV_LABEL
" (itf %d): can't set up page mapping\n",
2369 IF_INIT(printk(DEV_LABEL
" (itf %d): rev.%d,base=%p,irq=%d\n",
2370 dev
->number
, iadev
->pci
->revision
, base
, iadev
->irq
);)
2372 /* filling the iphase dev structure */
2373 iadev
->mem
= iadev
->pci_map_size
/2;
2374 iadev
->real_base
= real_base
;
2377 /* Bus Interface Control Registers */
2378 iadev
->reg
= base
+ REG_BASE
;
2379 /* Segmentation Control Registers */
2380 iadev
->seg_reg
= base
+ SEG_BASE
;
2381 /* Reassembly Control Registers */
2382 iadev
->reass_reg
= base
+ REASS_BASE
;
2383 /* Front end/ DMA control registers */
2384 iadev
->phy
= base
+ PHY_BASE
;
2385 iadev
->dma
= base
+ PHY_BASE
;
2386 /* RAM - Segmentation RAm and Reassembly RAM */
2387 iadev
->ram
= base
+ ACTUAL_RAM_BASE
;
2388 iadev
->seg_ram
= base
+ ACTUAL_SEG_RAM_BASE
;
2389 iadev
->reass_ram
= base
+ ACTUAL_REASS_RAM_BASE
;
2391 /* lets print out the above */
2392 IF_INIT(printk("Base addrs: %p %p %p \n %p %p %p %p\n",
2393 iadev
->reg
,iadev
->seg_reg
,iadev
->reass_reg
,
2394 iadev
->phy
, iadev
->ram
, iadev
->seg_ram
,
2397 /* lets try reading the MAC address */
2398 error
= get_esi(dev
);
2400 iounmap(iadev
->base
);
2404 for (i
=0; i
< ESI_LEN
; i
++)
2405 printk("%s%02X",i
? "-" : "",dev
->esi
[i
]);
2409 if (reset_sar(dev
)) {
2410 iounmap(iadev
->base
);
2411 printk("IA: reset SAR fail, please try again\n");
2417 static void ia_update_stats(IADEV
*iadev
) {
2418 if (!iadev
->carrier_detect
)
2420 iadev
->rx_cell_cnt
+= readw(iadev
->reass_reg
+CELL_CTR0
)&0xffff;
2421 iadev
->rx_cell_cnt
+= (readw(iadev
->reass_reg
+CELL_CTR1
) & 0xffff) << 16;
2422 iadev
->drop_rxpkt
+= readw(iadev
->reass_reg
+ DRP_PKT_CNTR
) & 0xffff;
2423 iadev
->drop_rxcell
+= readw(iadev
->reass_reg
+ ERR_CNTR
) & 0xffff;
2424 iadev
->tx_cell_cnt
+= readw(iadev
->seg_reg
+ CELL_CTR_LO_AUTO
)&0xffff;
2425 iadev
->tx_cell_cnt
+= (readw(iadev
->seg_reg
+CELL_CTR_HIGH_AUTO
)&0xffff)<<16;
2429 static void ia_led_timer(unsigned long arg
) {
2430 unsigned long flags
;
2431 static u_char blinking
[8] = {0, 0, 0, 0, 0, 0, 0, 0};
2433 static u32 ctrl_reg
;
2434 for (i
= 0; i
< iadev_count
; i
++) {
2436 ctrl_reg
= readl(ia_dev
[i
]->reg
+IPHASE5575_BUS_CONTROL_REG
);
2437 if (blinking
[i
] == 0) {
2439 ctrl_reg
&= (~CTRL_LED
);
2440 writel(ctrl_reg
, ia_dev
[i
]->reg
+IPHASE5575_BUS_CONTROL_REG
);
2441 ia_update_stats(ia_dev
[i
]);
2445 ctrl_reg
|= CTRL_LED
;
2446 writel(ctrl_reg
, ia_dev
[i
]->reg
+IPHASE5575_BUS_CONTROL_REG
);
2447 spin_lock_irqsave(&ia_dev
[i
]->tx_lock
, flags
);
2448 if (ia_dev
[i
]->close_pending
)
2449 wake_up(&ia_dev
[i
]->close_wait
);
2450 ia_tx_poll(ia_dev
[i
]);
2451 spin_unlock_irqrestore(&ia_dev
[i
]->tx_lock
, flags
);
2455 mod_timer(&ia_timer
, jiffies
+ HZ
/ 4);
2459 static void ia_phy_put(struct atm_dev
*dev
, unsigned char value
,
2462 writel(value
, INPH_IA_DEV(dev
)->phy
+addr
);
2465 static unsigned char ia_phy_get(struct atm_dev
*dev
, unsigned long addr
)
2467 return readl(INPH_IA_DEV(dev
)->phy
+addr
);
2470 static void ia_free_tx(IADEV
*iadev
)
2474 kfree(iadev
->desc_tbl
);
2475 for (i
= 0; i
< iadev
->num_vc
; i
++)
2476 kfree(iadev
->testTable
[i
]);
2477 kfree(iadev
->testTable
);
2478 for (i
= 0; i
< iadev
->num_tx_desc
; i
++) {
2479 struct cpcs_trailer_desc
*desc
= iadev
->tx_buf
+ i
;
2481 dma_unmap_single(&iadev
->pci
->dev
, desc
->dma_addr
,
2482 sizeof(*desc
->cpcs
), DMA_TO_DEVICE
);
2485 kfree(iadev
->tx_buf
);
2486 dma_free_coherent(&iadev
->pci
->dev
, DLE_TOTAL_SIZE
, iadev
->tx_dle_q
.start
,
2490 static void ia_free_rx(IADEV
*iadev
)
2492 kfree(iadev
->rx_open
);
2493 dma_free_coherent(&iadev
->pci
->dev
, DLE_TOTAL_SIZE
, iadev
->rx_dle_q
.start
,
2497 static int ia_start(struct atm_dev
*dev
)
2503 IF_EVENT(printk(">ia_start\n");)
2504 iadev
= INPH_IA_DEV(dev
);
2505 if (request_irq(iadev
->irq
, &ia_int
, IRQF_SHARED
, DEV_LABEL
, dev
)) {
2506 printk(KERN_ERR DEV_LABEL
"(itf %d): IRQ%d is already in use\n",
2507 dev
->number
, iadev
->irq
);
2511 /* @@@ should release IRQ on error */
2512 /* enabling memory + master */
2513 if ((error
= pci_write_config_word(iadev
->pci
,
2515 PCI_COMMAND_MEMORY
| PCI_COMMAND_MASTER
)))
2517 printk(KERN_ERR DEV_LABEL
"(itf %d): can't enable memory+"
2518 "master (0x%x)\n",dev
->number
, error
);
2524 /* Maybe we should reset the front end, initialize Bus Interface Control
2525 Registers and see. */
2527 IF_INIT(printk("Bus ctrl reg: %08x\n",
2528 readl(iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
));)
2529 ctrl_reg
= readl(iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
);
2530 ctrl_reg
= (ctrl_reg
& (CTRL_LED
| CTRL_FE_RST
))
2538 | CTRL_DLETMASK
/* shud be removed l8r */
2545 writel(ctrl_reg
, iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
);
2547 IF_INIT(printk("Bus ctrl reg after initializing: %08x\n",
2548 readl(iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
));
2549 printk("Bus status reg after init: %08x\n",
2550 readl(iadev
->reg
+IPHASE5575_BUS_STATUS_REG
));)
2553 error
= tx_init(dev
);
2556 error
= rx_init(dev
);
2560 ctrl_reg
= readl(iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
);
2561 writel(ctrl_reg
| CTRL_FE_RST
, iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
);
2562 IF_INIT(printk("Bus ctrl reg after initializing: %08x\n",
2563 readl(iadev
->reg
+IPHASE5575_BUS_CONTROL_REG
));)
2564 phy
= 0; /* resolve compiler complaint */
2566 if ((phy
=ia_phy_get(dev
,0)) == 0x30)
2567 printk("IA: pm5346,rev.%d\n",phy
&0x0f);
2569 printk("IA: utopia,rev.%0x\n",phy
);)
2571 if (iadev
->phy_type
& FE_25MBIT_PHY
)
2572 ia_mb25_init(iadev
);
2573 else if (iadev
->phy_type
& (FE_DS3_PHY
| FE_E3_PHY
))
2574 ia_suni_pm7345_init(iadev
);
2576 error
= suni_init(dev
);
2579 if (dev
->phy
->start
) {
2580 error
= dev
->phy
->start(dev
);
2584 /* Get iadev->carrier_detect status */
2585 ia_frontend_intr(iadev
);
2594 free_irq(iadev
->irq
, dev
);
2599 static void ia_close(struct atm_vcc
*vcc
)
2604 struct ia_vcc
*ia_vcc
;
2605 struct sk_buff
*skb
= NULL
;
2606 struct sk_buff_head tmp_tx_backlog
, tmp_vcc_backlog
;
2607 unsigned long closetime
, flags
;
2609 iadev
= INPH_IA_DEV(vcc
->dev
);
2610 ia_vcc
= INPH_IA_VCC(vcc
);
2611 if (!ia_vcc
) return;
2613 IF_EVENT(printk("ia_close: ia_vcc->vc_desc_cnt = %d vci = %d\n",
2614 ia_vcc
->vc_desc_cnt
,vcc
->vci
);)
2615 clear_bit(ATM_VF_READY
,&vcc
->flags
);
2616 skb_queue_head_init (&tmp_tx_backlog
);
2617 skb_queue_head_init (&tmp_vcc_backlog
);
2618 if (vcc
->qos
.txtp
.traffic_class
!= ATM_NONE
) {
2619 iadev
->close_pending
++;
2620 prepare_to_wait(&iadev
->timeout_wait
, &wait
, TASK_UNINTERRUPTIBLE
);
2621 schedule_timeout(50);
2622 finish_wait(&iadev
->timeout_wait
, &wait
);
2623 spin_lock_irqsave(&iadev
->tx_lock
, flags
);
2624 while((skb
= skb_dequeue(&iadev
->tx_backlog
))) {
2625 if (ATM_SKB(skb
)->vcc
== vcc
){
2626 if (vcc
->pop
) vcc
->pop(vcc
, skb
);
2627 else dev_kfree_skb_any(skb
);
2630 skb_queue_tail(&tmp_tx_backlog
, skb
);
2632 while((skb
= skb_dequeue(&tmp_tx_backlog
)))
2633 skb_queue_tail(&iadev
->tx_backlog
, skb
);
2634 IF_EVENT(printk("IA TX Done decs_cnt = %d\n", ia_vcc
->vc_desc_cnt
);)
2635 closetime
= 300000 / ia_vcc
->pcr
;
2638 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
2639 wait_event_timeout(iadev
->close_wait
, (ia_vcc
->vc_desc_cnt
<= 0), closetime
);
2640 spin_lock_irqsave(&iadev
->tx_lock
, flags
);
2641 iadev
->close_pending
--;
2642 iadev
->testTable
[vcc
->vci
]->lastTime
= 0;
2643 iadev
->testTable
[vcc
->vci
]->fract
= 0;
2644 iadev
->testTable
[vcc
->vci
]->vc_status
= VC_UBR
;
2645 if (vcc
->qos
.txtp
.traffic_class
== ATM_ABR
) {
2646 if (vcc
->qos
.txtp
.min_pcr
> 0)
2647 iadev
->sum_mcr
-= vcc
->qos
.txtp
.min_pcr
;
2649 if (vcc
->qos
.txtp
.traffic_class
== ATM_CBR
) {
2650 ia_vcc
= INPH_IA_VCC(vcc
);
2651 iadev
->sum_mcr
-= ia_vcc
->NumCbrEntry
*iadev
->Granularity
;
2652 ia_cbrVc_close (vcc
);
2654 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
2657 if (vcc
->qos
.rxtp
.traffic_class
!= ATM_NONE
) {
2658 // reset reass table
2659 vc_table
= (u16
*)(iadev
->reass_ram
+REASS_TABLE
*iadev
->memSize
);
2660 vc_table
+= vcc
->vci
;
2661 *vc_table
= NO_AAL5_PKT
;
2663 vc_table
= (u16
*)(iadev
->reass_ram
+RX_VC_TABLE
*iadev
->memSize
);
2664 vc_table
+= vcc
->vci
;
2665 *vc_table
= (vcc
->vci
<< 6) | 15;
2666 if (vcc
->qos
.rxtp
.traffic_class
== ATM_ABR
) {
2667 struct abr_vc_table __iomem
*abr_vc_table
=
2668 (iadev
->reass_ram
+ABR_VC_TABLE
*iadev
->memSize
);
2669 abr_vc_table
+= vcc
->vci
;
2670 abr_vc_table
->rdf
= 0x0003;
2671 abr_vc_table
->air
= 0x5eb1;
2673 // Drain the packets
2674 rx_dle_intr(vcc
->dev
);
2675 iadev
->rx_open
[vcc
->vci
] = NULL
;
2677 kfree(INPH_IA_VCC(vcc
));
2679 vcc
->dev_data
= NULL
;
2680 clear_bit(ATM_VF_ADDR
,&vcc
->flags
);
2684 static int ia_open(struct atm_vcc
*vcc
)
2686 struct ia_vcc
*ia_vcc
;
2688 if (!test_bit(ATM_VF_PARTIAL
,&vcc
->flags
))
2690 IF_EVENT(printk("ia: not partially allocated resources\n");)
2691 vcc
->dev_data
= NULL
;
2693 if (vcc
->vci
!= ATM_VPI_UNSPEC
&& vcc
->vpi
!= ATM_VCI_UNSPEC
)
2695 IF_EVENT(printk("iphase open: unspec part\n");)
2696 set_bit(ATM_VF_ADDR
,&vcc
->flags
);
2698 if (vcc
->qos
.aal
!= ATM_AAL5
)
2700 IF_EVENT(printk(DEV_LABEL
"(itf %d): open %d.%d\n",
2701 vcc
->dev
->number
, vcc
->vpi
, vcc
->vci
);)
2703 /* Device dependent initialization */
2704 ia_vcc
= kmalloc(sizeof(*ia_vcc
), GFP_KERNEL
);
2705 if (!ia_vcc
) return -ENOMEM
;
2706 vcc
->dev_data
= ia_vcc
;
2708 if ((error
= open_rx(vcc
)))
2710 IF_EVENT(printk("iadev: error in open_rx, closing\n");)
2715 if ((error
= open_tx(vcc
)))
2717 IF_EVENT(printk("iadev: error in open_tx, closing\n");)
2722 set_bit(ATM_VF_READY
,&vcc
->flags
);
2726 static u8 first
= 1;
2728 ia_timer
.expires
= jiffies
+ 3*HZ
;
2729 add_timer(&ia_timer
);
2734 IF_EVENT(printk("ia open returning\n");)
2738 static int ia_change_qos(struct atm_vcc
*vcc
, struct atm_qos
*qos
, int flags
)
2740 IF_EVENT(printk(">ia_change_qos\n");)
2744 static int ia_ioctl(struct atm_dev
*dev
, unsigned int cmd
, void __user
*arg
)
2750 IF_EVENT(printk(">ia_ioctl\n");)
2751 if (cmd
!= IA_CMD
) {
2752 if (!dev
->phy
->ioctl
) return -EINVAL
;
2753 return dev
->phy
->ioctl(dev
,cmd
,arg
);
2755 if (copy_from_user(&ia_cmds
, arg
, sizeof ia_cmds
)) return -EFAULT
;
2756 board
= ia_cmds
.status
;
2757 if ((board
< 0) || (board
> iadev_count
))
2759 iadev
= ia_dev
[board
];
2760 switch (ia_cmds
.cmd
) {
2763 switch (ia_cmds
.sub_cmd
) {
2765 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2766 if (copy_to_user(ia_cmds
.buf
, iadev
, sizeof(IADEV
)))
2770 case MEMDUMP_SEGREG
:
2771 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2772 tmps
= (u16 __user
*)ia_cmds
.buf
;
2773 for(i
=0; i
<0x80; i
+=2, tmps
++)
2774 if(put_user((u16
)(readl(iadev
->seg_reg
+i
) & 0xffff), tmps
)) return -EFAULT
;
2778 case MEMDUMP_REASSREG
:
2779 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2780 tmps
= (u16 __user
*)ia_cmds
.buf
;
2781 for(i
=0; i
<0x80; i
+=2, tmps
++)
2782 if(put_user((u16
)(readl(iadev
->reass_reg
+i
) & 0xffff), tmps
)) return -EFAULT
;
2788 ia_regs_t
*regs_local
;
2792 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2793 regs_local
= kmalloc(sizeof(*regs_local
), GFP_KERNEL
);
2794 if (!regs_local
) return -ENOMEM
;
2795 ffL
= ®s_local
->ffredn
;
2796 rfL
= ®s_local
->rfredn
;
2797 /* Copy real rfred registers into the local copy */
2798 for (i
=0; i
<(sizeof (rfredn_t
))/4; i
++)
2799 ((u_int
*)rfL
)[i
] = readl(iadev
->reass_reg
+ i
) & 0xffff;
2800 /* Copy real ffred registers into the local copy */
2801 for (i
=0; i
<(sizeof (ffredn_t
))/4; i
++)
2802 ((u_int
*)ffL
)[i
] = readl(iadev
->seg_reg
+ i
) & 0xffff;
2804 if (copy_to_user(ia_cmds
.buf
, regs_local
,sizeof(ia_regs_t
))) {
2809 printk("Board %d registers dumped\n", board
);
2815 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2823 printk("skb = 0x%lx\n", (long)skb_peek(&iadev
->tx_backlog
));
2824 printk("rtn_q: 0x%lx\n",(long)ia_deque_rtn_q(&iadev
->tx_return_q
));
2829 struct k_sonet_stats
*stats
;
2830 stats
= &PRIV(_ia_dev
[board
])->sonet_stats
;
2831 printk("section_bip: %d\n", atomic_read(&stats
->section_bip
));
2832 printk("line_bip : %d\n", atomic_read(&stats
->line_bip
));
2833 printk("path_bip : %d\n", atomic_read(&stats
->path_bip
));
2834 printk("line_febe : %d\n", atomic_read(&stats
->line_febe
));
2835 printk("path_febe : %d\n", atomic_read(&stats
->path_febe
));
2836 printk("corr_hcs : %d\n", atomic_read(&stats
->corr_hcs
));
2837 printk("uncorr_hcs : %d\n", atomic_read(&stats
->uncorr_hcs
));
2838 printk("tx_cells : %d\n", atomic_read(&stats
->tx_cells
));
2839 printk("rx_cells : %d\n", atomic_read(&stats
->rx_cells
));
2844 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2845 for (i
= 1; i
<= iadev
->num_rx_desc
; i
++)
2846 free_desc(_ia_dev
[board
], i
);
2847 writew( ~(RX_FREEQ_EMPT
| RX_EXCP_RCVD
),
2848 iadev
->reass_reg
+REASS_MASK_REG
);
2855 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2856 ia_frontend_intr(iadev
);
2859 if (!capable(CAP_NET_ADMIN
)) return -EPERM
;
2862 IADebugFlag
= ia_cmds
.maddr
;
2863 printk("New debug option loaded\n");
2879 static int ia_getsockopt(struct atm_vcc
*vcc
, int level
, int optname
,
2880 void __user
*optval
, int optlen
)
2882 IF_EVENT(printk(">ia_getsockopt\n");)
2886 static int ia_setsockopt(struct atm_vcc
*vcc
, int level
, int optname
,
2887 void __user
*optval
, unsigned int optlen
)
2889 IF_EVENT(printk(">ia_setsockopt\n");)
2893 static int ia_pkt_tx (struct atm_vcc
*vcc
, struct sk_buff
*skb
) {
2896 struct tx_buf_desc __iomem
*buf_desc_ptr
;
2900 struct cpcs_trailer
*trailer
;
2901 struct ia_vcc
*iavcc
;
2903 iadev
= INPH_IA_DEV(vcc
->dev
);
2904 iavcc
= INPH_IA_VCC(vcc
);
2905 if (!iavcc
->txing
) {
2906 printk("discard packet on closed VC\n");
2910 dev_kfree_skb_any(skb
);
2914 if (skb
->len
> iadev
->tx_buf_sz
- 8) {
2915 printk("Transmit size over tx buffer size\n");
2919 dev_kfree_skb_any(skb
);
2922 if ((unsigned long)skb
->data
& 3) {
2923 printk("Misaligned SKB\n");
2927 dev_kfree_skb_any(skb
);
2930 /* Get a descriptor number from our free descriptor queue
2931 We get the descr number from the TCQ now, since I am using
2932 the TCQ as a free buffer queue. Initially TCQ will be
2933 initialized with all the descriptors and is hence, full.
2935 desc
= get_desc (iadev
, iavcc
);
2938 comp_code
= desc
>> 13;
2941 if ((desc
== 0) || (desc
> iadev
->num_tx_desc
))
2943 IF_ERR(printk(DEV_LABEL
"invalid desc for send: %d\n", desc
);)
2944 atomic_inc(&vcc
->stats
->tx
);
2948 dev_kfree_skb_any(skb
);
2949 return 0; /* return SUCCESS */
2954 IF_ERR(printk(DEV_LABEL
"send desc:%d completion code %d error\n",
2958 /* remember the desc and vcc mapping */
2959 iavcc
->vc_desc_cnt
++;
2960 iadev
->desc_tbl
[desc
-1].iavcc
= iavcc
;
2961 iadev
->desc_tbl
[desc
-1].txskb
= skb
;
2962 IA_SKB_STATE(skb
) = 0;
2964 iadev
->ffL
.tcq_rd
+= 2;
2965 if (iadev
->ffL
.tcq_rd
> iadev
->ffL
.tcq_ed
)
2966 iadev
->ffL
.tcq_rd
= iadev
->ffL
.tcq_st
;
2967 writew(iadev
->ffL
.tcq_rd
, iadev
->seg_reg
+TCQ_RD_PTR
);
2969 /* Put the descriptor number in the packet ready queue
2970 and put the updated write pointer in the DLE field
2972 *(u16
*)(iadev
->seg_ram
+iadev
->ffL
.prq_wr
) = desc
;
2974 iadev
->ffL
.prq_wr
+= 2;
2975 if (iadev
->ffL
.prq_wr
> iadev
->ffL
.prq_ed
)
2976 iadev
->ffL
.prq_wr
= iadev
->ffL
.prq_st
;
2978 /* Figure out the exact length of the packet and padding required to
2979 make it aligned on a 48 byte boundary. */
2980 total_len
= skb
->len
+ sizeof(struct cpcs_trailer
);
2981 total_len
= ((total_len
+ 47) / 48) * 48;
2982 IF_TX(printk("ia packet len:%d padding:%d\n", total_len
, total_len
- skb
->len
);)
2984 /* Put the packet in a tx buffer */
2985 trailer
= iadev
->tx_buf
[desc
-1].cpcs
;
2986 IF_TX(printk("Sent: skb = 0x%p skb->data: 0x%p len: %d, desc: %d\n",
2987 skb
, skb
->data
, skb
->len
, desc
);)
2988 trailer
->control
= 0;
2990 trailer
->length
= ((skb
->len
& 0xff) << 8) | ((skb
->len
& 0xff00) >> 8);
2991 trailer
->crc32
= 0; /* not needed - dummy bytes */
2993 /* Display the packet */
2994 IF_TXPKT(printk("Sent data: len = %d MsgNum = %d\n",
2995 skb
->len
, tcnter
++);
2996 xdump(skb
->data
, skb
->len
, "TX: ");
2999 /* Build the buffer descriptor */
3000 buf_desc_ptr
= iadev
->seg_ram
+TX_DESC_BASE
;
3001 buf_desc_ptr
+= desc
; /* points to the corresponding entry */
3002 buf_desc_ptr
->desc_mode
= AAL5
| EOM_EN
| APP_CRC32
| CMPL_INT
;
3003 /* Huh ? p.115 of users guide describes this as a read-only register */
3004 writew(TRANSMIT_DONE
, iadev
->seg_reg
+SEG_INTR_STATUS_REG
);
3005 buf_desc_ptr
->vc_index
= vcc
->vci
;
3006 buf_desc_ptr
->bytes
= total_len
;
3008 if (vcc
->qos
.txtp
.traffic_class
== ATM_ABR
)
3009 clear_lockup (vcc
, iadev
);
3011 /* Build the DLE structure */
3012 wr_ptr
= iadev
->tx_dle_q
.write
;
3013 memset((caddr_t
)wr_ptr
, 0, sizeof(*wr_ptr
));
3014 wr_ptr
->sys_pkt_addr
= dma_map_single(&iadev
->pci
->dev
, skb
->data
,
3015 skb
->len
, DMA_TO_DEVICE
);
3016 wr_ptr
->local_pkt_addr
= (buf_desc_ptr
->buf_start_hi
<< 16) |
3017 buf_desc_ptr
->buf_start_lo
;
3018 /* wr_ptr->bytes = swap_byte_order(total_len); didn't seem to affect?? */
3019 wr_ptr
->bytes
= skb
->len
;
3021 /* hw bug - DLEs of 0x2d, 0x2e, 0x2f cause DMA lockup */
3022 if ((wr_ptr
->bytes
>> 2) == 0xb)
3023 wr_ptr
->bytes
= 0x30;
3025 wr_ptr
->mode
= TX_DLE_PSI
;
3026 wr_ptr
->prq_wr_ptr_data
= 0;
3028 /* end is not to be used for the DLE q */
3029 if (++wr_ptr
== iadev
->tx_dle_q
.end
)
3030 wr_ptr
= iadev
->tx_dle_q
.start
;
3032 /* Build trailer dle */
3033 wr_ptr
->sys_pkt_addr
= iadev
->tx_buf
[desc
-1].dma_addr
;
3034 wr_ptr
->local_pkt_addr
= ((buf_desc_ptr
->buf_start_hi
<< 16) |
3035 buf_desc_ptr
->buf_start_lo
) + total_len
- sizeof(struct cpcs_trailer
);
3037 wr_ptr
->bytes
= sizeof(struct cpcs_trailer
);
3038 wr_ptr
->mode
= DMA_INT_ENABLE
;
3039 wr_ptr
->prq_wr_ptr_data
= iadev
->ffL
.prq_wr
;
3041 /* end is not to be used for the DLE q */
3042 if (++wr_ptr
== iadev
->tx_dle_q
.end
)
3043 wr_ptr
= iadev
->tx_dle_q
.start
;
3045 iadev
->tx_dle_q
.write
= wr_ptr
;
3046 ATM_DESC(skb
) = vcc
->vci
;
3047 skb_queue_tail(&iadev
->tx_dma_q
, skb
);
3049 atomic_inc(&vcc
->stats
->tx
);
3050 iadev
->tx_pkt_cnt
++;
3051 /* Increment transaction counter */
3052 writel(2, iadev
->dma
+IPHASE5575_TX_COUNTER
);
3055 /* add flow control logic */
3056 if (atomic_read(&vcc
->stats
->tx
) % 20 == 0) {
3057 if (iavcc
->vc_desc_cnt
> 10) {
3058 vcc
->tx_quota
= vcc
->tx_quota
* 3 / 4;
3059 printk("Tx1: vcc->tx_quota = %d \n", (u32
)vcc
->tx_quota
);
3060 iavcc
->flow_inc
= -1;
3061 iavcc
->saved_tx_quota
= vcc
->tx_quota
;
3062 } else if ((iavcc
->flow_inc
< 0) && (iavcc
->vc_desc_cnt
< 3)) {
3063 // vcc->tx_quota = 3 * iavcc->saved_tx_quota / 4;
3064 printk("Tx2: vcc->tx_quota = %d \n", (u32
)vcc
->tx_quota
);
3065 iavcc
->flow_inc
= 0;
3069 IF_TX(printk("ia send done\n");)
3073 static int ia_send(struct atm_vcc
*vcc
, struct sk_buff
*skb
)
3076 unsigned long flags
;
3078 iadev
= INPH_IA_DEV(vcc
->dev
);
3079 if ((!skb
)||(skb
->len
>(iadev
->tx_buf_sz
-sizeof(struct cpcs_trailer
))))
3082 printk(KERN_CRIT
"null skb in ia_send\n");
3083 else dev_kfree_skb_any(skb
);
3086 spin_lock_irqsave(&iadev
->tx_lock
, flags
);
3087 if (!test_bit(ATM_VF_READY
,&vcc
->flags
)){
3088 dev_kfree_skb_any(skb
);
3089 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
3092 ATM_SKB(skb
)->vcc
= vcc
;
3094 if (skb_peek(&iadev
->tx_backlog
)) {
3095 skb_queue_tail(&iadev
->tx_backlog
, skb
);
3098 if (ia_pkt_tx (vcc
, skb
)) {
3099 skb_queue_tail(&iadev
->tx_backlog
, skb
);
3102 spin_unlock_irqrestore(&iadev
->tx_lock
, flags
);
3107 static int ia_proc_read(struct atm_dev
*dev
,loff_t
*pos
,char *page
)
3111 IADEV
*iadev
= INPH_IA_DEV(dev
);
3113 if (iadev
->phy_type
== FE_25MBIT_PHY
) {
3114 n
= sprintf(page
, " Board Type : Iphase5525-1KVC-128K\n");
3117 if (iadev
->phy_type
== FE_DS3_PHY
)
3118 n
= sprintf(page
, " Board Type : Iphase-ATM-DS3");
3119 else if (iadev
->phy_type
== FE_E3_PHY
)
3120 n
= sprintf(page
, " Board Type : Iphase-ATM-E3");
3121 else if (iadev
->phy_type
== FE_UTP_OPTION
)
3122 n
= sprintf(page
, " Board Type : Iphase-ATM-UTP155");
3124 n
= sprintf(page
, " Board Type : Iphase-ATM-OC3");
3126 if (iadev
->pci_map_size
== 0x40000)
3127 n
+= sprintf(tmpPtr
, "-1KVC-");
3129 n
+= sprintf(tmpPtr
, "-4KVC-");
3131 if ((iadev
->memType
& MEM_SIZE_MASK
) == MEM_SIZE_1M
)
3132 n
+= sprintf(tmpPtr
, "1M \n");
3133 else if ((iadev
->memType
& MEM_SIZE_MASK
) == MEM_SIZE_512K
)
3134 n
+= sprintf(tmpPtr
, "512K\n");
3136 n
+= sprintf(tmpPtr
, "128K\n");
3140 return sprintf(page
, " Number of Tx Buffer: %u\n"
3141 " Size of Tx Buffer : %u\n"
3142 " Number of Rx Buffer: %u\n"
3143 " Size of Rx Buffer : %u\n"
3144 " Packets Receiverd : %u\n"
3145 " Packets Transmitted: %u\n"
3146 " Cells Received : %u\n"
3147 " Cells Transmitted : %u\n"
3148 " Board Dropped Cells: %u\n"
3149 " Board Dropped Pkts : %u\n",
3150 iadev
->num_tx_desc
, iadev
->tx_buf_sz
,
3151 iadev
->num_rx_desc
, iadev
->rx_buf_sz
,
3152 iadev
->rx_pkt_cnt
, iadev
->tx_pkt_cnt
,
3153 iadev
->rx_cell_cnt
, iadev
->tx_cell_cnt
,
3154 iadev
->drop_rxcell
, iadev
->drop_rxpkt
);
3159 static const struct atmdev_ops ops
= {
3163 .getsockopt
= ia_getsockopt
,
3164 .setsockopt
= ia_setsockopt
,
3166 .phy_put
= ia_phy_put
,
3167 .phy_get
= ia_phy_get
,
3168 .change_qos
= ia_change_qos
,
3169 .proc_read
= ia_proc_read
,
3170 .owner
= THIS_MODULE
,
3173 static int ia_init_one(struct pci_dev
*pdev
, const struct pci_device_id
*ent
)
3175 struct atm_dev
*dev
;
3179 iadev
= kzalloc(sizeof(*iadev
), GFP_KERNEL
);
3187 IF_INIT(printk("ia detected at bus:%d dev: %d function:%d\n",
3188 pdev
->bus
->number
, PCI_SLOT(pdev
->devfn
), PCI_FUNC(pdev
->devfn
));)
3189 if (pci_enable_device(pdev
)) {
3191 goto err_out_free_iadev
;
3193 dev
= atm_dev_register(DEV_LABEL
, &pdev
->dev
, &ops
, -1, NULL
);
3196 goto err_out_disable_dev
;
3198 dev
->dev_data
= iadev
;
3199 IF_INIT(printk(DEV_LABEL
"registered at (itf :%d)\n", dev
->number
);)
3200 IF_INIT(printk("dev_id = 0x%p iadev->LineRate = %d \n", dev
,
3203 pci_set_drvdata(pdev
, dev
);
3205 ia_dev
[iadev_count
] = iadev
;
3206 _ia_dev
[iadev_count
] = dev
;
3208 if (ia_init(dev
) || ia_start(dev
)) {
3209 IF_INIT(printk("IA register failed!\n");)
3211 ia_dev
[iadev_count
] = NULL
;
3212 _ia_dev
[iadev_count
] = NULL
;
3214 goto err_out_deregister_dev
;
3216 IF_EVENT(printk("iadev_count = %d\n", iadev_count
);)
3218 iadev
->next_board
= ia_boards
;
3223 err_out_deregister_dev
:
3224 atm_dev_deregister(dev
);
3225 err_out_disable_dev
:
3226 pci_disable_device(pdev
);
3233 static void ia_remove_one(struct pci_dev
*pdev
)
3235 struct atm_dev
*dev
= pci_get_drvdata(pdev
);
3236 IADEV
*iadev
= INPH_IA_DEV(dev
);
3238 /* Disable phy interrupts */
3239 ia_phy_put(dev
, ia_phy_get(dev
, SUNI_RSOP_CIE
) & ~(SUNI_RSOP_CIE_LOSE
),
3243 if (dev
->phy
&& dev
->phy
->stop
)
3244 dev
->phy
->stop(dev
);
3246 /* De-register device */
3247 free_irq(iadev
->irq
, dev
);
3249 ia_dev
[iadev_count
] = NULL
;
3250 _ia_dev
[iadev_count
] = NULL
;
3251 IF_EVENT(printk("deregistering iav at (itf:%d)\n", dev
->number
);)
3252 atm_dev_deregister(dev
);
3254 iounmap(iadev
->base
);
3255 pci_disable_device(pdev
);
3263 static struct pci_device_id ia_pci_tbl
[] = {
3264 { PCI_VENDOR_ID_IPHASE
, 0x0008, PCI_ANY_ID
, PCI_ANY_ID
, },
3265 { PCI_VENDOR_ID_IPHASE
, 0x0009, PCI_ANY_ID
, PCI_ANY_ID
, },
3268 MODULE_DEVICE_TABLE(pci
, ia_pci_tbl
);
3270 static struct pci_driver ia_driver
= {
3272 .id_table
= ia_pci_tbl
,
3273 .probe
= ia_init_one
,
3274 .remove
= ia_remove_one
,
3277 static int __init
ia_module_init(void)
3281 ret
= pci_register_driver(&ia_driver
);
3283 ia_timer
.expires
= jiffies
+ 3*HZ
;
3284 add_timer(&ia_timer
);
3286 printk(KERN_ERR DEV_LABEL
": no adapter found\n");
3290 static void __exit
ia_module_exit(void)
3292 pci_unregister_driver(&ia_driver
);
3294 del_timer(&ia_timer
);
3297 module_init(ia_module_init
);
3298 module_exit(ia_module_exit
);