kernel tree reorganization stage 1: Major cvs repository work (not logged as
[dragonfly.git] / sys / dev / atm / hea / eni_init.c
CommitLineData
984263bc
MD
1/*
2 *
3 * ===================================
4 * HARP | Host ATM Research Platform
5 * ===================================
6 *
7 *
8 * This Host ATM Research Platform ("HARP") file (the "Software") is
9 * made available by Network Computing Services, Inc. ("NetworkCS")
10 * "AS IS". NetworkCS does not provide maintenance, improvements or
11 * support of any kind.
12 *
13 * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
14 * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
15 * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
16 * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
17 * In no event shall NetworkCS be responsible for any damages, including
18 * but not limited to consequential damages, arising from or relating to
19 * any use of the Software or related support.
20 *
21 * Copyright 1994-1998 Network Computing Services, Inc.
22 *
23 * Copies of this Software may be made, however, the above copyright
24 * notice must be reproduced on all copies.
25 *
26 * @(#) $FreeBSD: src/sys/dev/hea/eni_init.c,v 1.3 1999/08/28 00:41:44 peter Exp $
d2438d69 27 * @(#) $DragonFly: src/sys/dev/atm/hea/eni_init.c,v 1.4 2003/08/07 21:54:28 dillon Exp $
984263bc
MD
28 */
29
30/*
31 * Efficient ENI Adapter Support
32 * -----------------------------
33 *
34 * Driver initialization support
35 *
36 */
37
d2438d69 38#include <netproto/atm/kern_include.h>
984263bc 39
1f2de5d4
MD
40#include "eni_stats.h"
41#include "eni.h"
42#include "eni_var.h"
984263bc 43
984263bc
MD
44/*
45 * Initialize adapter for PDU processing
46 *
47 * Enable interrupts, set master control, initialize TX buffer,
48 * set initial pointers, etc.
49 *
50 * Arguments:
51 * eup pointer to device unit structure
52 *
53 * Returns:
54 * 0 successful
55 * error error condition
56 */
57int
58eni_init ( eup )
59 Eni_unit *eup;
60{
61 u_long words, order;
62
63 /*
64 * Allocate one large TX buffer. Currently we use only one
65 * channel with full cell rate which all VCs will use.
66 * This will (probably) have to change (alot) when we
67 * implement QoS.
68 */
69 /*
70 * Server cards, which have more then 512KB of RAM, will
71 * allocate a 128KB TX buffer, while client cards, with
72 * 512KB or less will allocate a 32KB TX buffer.
73 */
74 words = ( eup->eu_ramsize > MAX_CLIENT_RAM * ENI_BUF_PGSZ ?
75 TX_LARGE_BSIZE : TX_SMALL_BSIZE ) * ENI_BUF_PGSZ;
76 if ( ( eup->eu_txbuf = eni_allocate_buffer ( eup, &words ) ) ==
77 (caddr_t)NULL ) {
78 return ENOMEM;
79 }
80 eup->eu_txsize = words >> 2; /* Bytes to words */
81 words >>= ENI_LOC_PREDIV; /* Predivide by 256 words */
82 for ( order = -1; words; order++ )
83 words >>= 1;
84 eup->eu_midway[MIDWAY_TXPLACE] =
85 (order << TXSIZE_SHIFT) | ((int)eup->eu_txbuf >> ENI_LOC_PREDIV);
86 eup->eu_txpos = eup->eu_midway[MIDWAY_DESCR] & 0x7FFF;
87 /*
88 * Set first word of unack'ed data to start
89 */
90 eup->eu_txfirst = eup->eu_txpos;
91
92 /*
93 * Set initial values of local DMA pointer used to prevent wraps
94 */
95 eup->eu_txdmawr = 0;
96 eup->eu_rxdmawr = 0;
97
98 /*
99 * Initialize queue's for receive/transmit pdus
100 */
101 eup->eu_txqueue.ifq_maxlen = ENI_IFQ_MAXLEN;
102 eup->eu_rxqueue.ifq_maxlen = ENI_IFQ_MAXLEN;
103
104 /*
105 * Acknowledge any interrupts
106 */
107 (void) eup->eu_midway[MIDWAY_ISA];
108
109 /*
110 * "Zero" Sonet error counters
111 */
112 eni_zero_stats ( eup );
113
114 /*
115 * Set master control register
116 *
117 * IntSel1 | LOCK_MODE | DMA_ENABLE | TX_ENABLE | RX_ENABLE
118 *
119 */
120 eup->eu_midway[MIDWAY_MASTER] = 1 << ENI_ISEL_SHIFT |
121 ENI_M_DMAENABLE | ENI_M_TXENABLE | ENI_M_RXENABLE;
122
123 /*
124 * Enable interrupts
125 */
126 eup->eu_midway[MIDWAY_IE] = ENI_INT_SERVICE | ENI_INT_RX_DMA |
127 ENI_INT_TX_DMA | ENI_INT_DMA_ERR | ENI_INT_DMA_LERR |
128 ENI_INT_IDEN | ENI_INT_DMA_OVFL;
129
130 /*
131 * Last thing to do is to indicate that we've finished initializing
132 * this unit.
133 */
134 eup->eu_flags |= CUF_INITED;
135
136 return 0;
137}
138