Commit | Line | Data |
---|---|---|
50ee11fe BB |
1 | #ifndef _INC_PMCC4_PRIVATE_H_ |
2 | #define _INC_PMCC4_PRIVATE_H_ | |
3 | ||
4 | /*----------------------------------------------------------------------------- | |
5 | * pmcc4_private.h - | |
6 | * | |
7 | * Copyright (C) 2005 SBE, Inc. | |
8 | * | |
9 | * This program is free software; you can redistribute it and/or modify | |
10 | * it under the terms of the GNU General Public License as published by | |
11 | * the Free Software Foundation; either version 2 of the License, or | |
12 | * (at your option) any later version. | |
13 | * | |
14 | * This program is distributed in the hope that it will be useful, | |
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | * GNU General Public License for more details. | |
18 | */ | |
19 | ||
20 | ||
21 | #include <linux/kernel.h> | |
22 | #include <linux/sched.h> | |
7c1e68ba | 23 | #include <linux/semaphore.h> |
50ee11fe BB |
24 | #include <linux/spinlock.h> |
25 | #include <linux/interrupt.h> /* support for tasklets */ | |
26 | #include <linux/timer.h> /* support for timer */ | |
27 | #include <linux/workqueue.h> | |
28 | #include <linux/hdlc.h> | |
29 | ||
30 | #include "libsbew.h" | |
31 | #include "pmcc4_defs.h" | |
32 | #include "pmcc4_cpld.h" | |
33 | #include "musycc.h" | |
34 | #include "sbe_promformat.h" | |
35 | #include "comet.h" | |
36 | ||
37 | ||
38 | /* driver state */ | |
39 | #define SBE_DRVR_INIT 0x0 | |
40 | #define SBE_DRVR_AVAILABLE 0x69734F4E | |
41 | #define SBE_DRVR_DOWN 0x1 | |
42 | ||
43 | /****************************************************************************** | |
44 | * MUSYCC Message Descriptor - coupled to hardware implementation, the first | |
45 | * three u_int32 must not be reordered. | |
46 | */ | |
47 | ||
48 | struct mdesc | |
49 | { | |
50 | volatile u_int32_t status; /* Buffer Descriptor */ | |
51 | u_int32_t data; /* Data Pointer */ | |
52 | u_int32_t next; /* MUSYCC view of Next Pointer */ | |
53 | void *mem_token; /* Data */ | |
54 | struct mdesc *snext; | |
55 | }; | |
56 | ||
57 | ||
58 | /************************************************************************* | |
59 | * Private driver data structures, internal use only. | |
60 | */ | |
61 | ||
62 | struct c4_chan_info | |
63 | { | |
64 | int gchan; /* channel number within group/port 0-31 */ | |
65 | int channum; /* absolute channel number 0-128 */ | |
66 | u_int8_t status; | |
67 | #define TX_RECOVERY_MASK 0x0f | |
68 | #define TX_ONR_RECOVERY 0x01 | |
69 | #define TX_BUFF_RECOVERY 0x02 | |
70 | #define RX_RECOVERY_MASK 0xf0 | |
71 | #define RX_ONR_RECOVERY 0x10 | |
72 | ||
73 | unsigned char ch_start_rx; | |
74 | #define CH_START_RX_NOW 1 | |
75 | #define CH_START_RX_ONR 2 | |
76 | #define CH_START_RX_BUF 3 | |
77 | ||
78 | unsigned char ch_start_tx; | |
79 | #define CH_START_TX_1ST 1 | |
80 | #define CH_START_TX_ONR 2 | |
81 | #define CH_START_TX_BUF 3 | |
82 | ||
83 | char tx_full; /* boolean */ | |
84 | short txd_free; /* count of TX Desc available */ | |
85 | short txd_required; /* count of TX Desc needed by mesg */ | |
86 | unsigned short rxd_num; /* must support range up to 2000 */ | |
87 | unsigned short txd_num; /* must support range up to 1000 */ | |
88 | int rxix_irq_srv; | |
89 | ||
90 | enum | |
91 | { | |
92 | UNASSIGNED, /* AVAILABLE, NOTINUSE */ | |
93 | DOWN, /* ASSIGNED, NOTINUSE */ | |
94 | UP /* ASSIGNED and INUSE */ | |
95 | } state; | |
96 | ||
97 | struct c4_port_info *up; | |
98 | void *user; | |
99 | ||
100 | struct work_struct ch_work; | |
101 | struct mdesc *mdt; | |
102 | struct mdesc *mdr; | |
103 | struct mdesc *txd_irq_srv; | |
104 | struct mdesc *txd_usr_add; | |
105 | ||
106 | #if 0 | |
107 | /* | |
108 | * FUTURE CODE MIGHT SEPARATE TIMESLOT MAP SETUPS INTO SINGLE IOCTL and | |
109 | * REMOVE MAPS FROM CHANNEL PARAMETER STRUCTURE | |
110 | */ | |
111 | /* | |
112 | * each byte in bitmask below represents one timeslot (bitmask[0] is for | |
113 | * timeslot 0 and so on), each bit in the byte selects timeslot bits for | |
114 | * this channel (0xff - whole timeslot, 0x7f - 56kbps mode) | |
115 | */ | |
116 | ||
117 | u_int8_t ts_bitmask[32]; | |
118 | #endif | |
119 | spinlock_t ch_rxlock; | |
120 | spinlock_t ch_txlock; | |
121 | atomic_t tx_pending; | |
122 | ||
123 | struct sbecom_chan_stats s; | |
124 | struct sbecom_chan_param p; | |
125 | }; | |
126 | typedef struct c4_chan_info mch_t; | |
127 | ||
128 | struct c4_port_info | |
129 | { | |
130 | ||
131 | struct musycc_globalr *reg; | |
132 | struct musycc_groupr *regram; | |
133 | void *regram_saved; /* Original malloc value may have non-2KB | |
134 | * boundary. Need to save for use when | |
135 | * freeing. */ | |
136 | comet_t *cometbase; | |
137 | struct sbe_card_info *up; | |
138 | ||
139 | /* | |
140 | * The workqueue is used for TX restart of ONR'd channels when in | |
141 | * Transparent mode. | |
142 | */ | |
143 | ||
144 | struct workqueue_struct *wq_port; /* chan restart work queue */ | |
145 | struct semaphore sr_sem_busy; /* service request exclusion | |
146 | * semaphore */ | |
147 | struct semaphore sr_sem_wait; /* service request handshake | |
148 | * semaphore */ | |
149 | u_int32_t sr_last; | |
150 | short openchans; | |
151 | char portnum; | |
152 | char group_is_set; /* GROUP_INIT command issued to MUSYCC, | |
153 | * otherwise SET_CHAN Ioctl fails */ | |
154 | ||
155 | mch_t *chan[MUSYCC_NCHANS]; | |
156 | struct sbecom_port_param p; | |
157 | ||
158 | /* | |
159 | * The MUSYCC timeslot mappings are maintained within the driver and are | |
160 | * modified and reloaded as each of a group's channels are configured. | |
161 | */ | |
162 | u_int8_t tsm[32]; /* tsm (time slot map) */ | |
163 | int fifomap[32]; | |
164 | }; | |
165 | typedef struct c4_port_info mpi_t; | |
166 | ||
167 | ||
168 | #define COMET_OFFSET(x) (0x80000+(x)*0x10000) | |
169 | #define EEPROM_OFFSET 0xC0000 | |
170 | #define ISPLD_OFFSET 0xD0000 | |
171 | ||
172 | /* iSPLD control chip registers */ | |
173 | #define ISPLD_MCSR 0x0 | |
174 | #define ISPLD_MCLK 0x1 | |
175 | #define ISPLD_LEDS 0x2 | |
176 | #define ISPLD_INTR 0x3 | |
177 | #define ISPLD_MAX 0x3 | |
178 | ||
179 | struct sbe_card_info | |
180 | { | |
181 | struct musycc_globalr *reg; | |
182 | struct musycc_groupr *regram; | |
183 | u_int32_t *iqd_p; /* pointer to dword aligned interrupt queue | |
184 | * descriptors */ | |
185 | void *iqd_p_saved; /* Original malloc value may have non-dword | |
186 | * aligned boundary. Need to save for use | |
187 | * when freeing. */ | |
188 | unsigned int iqp_headx, iqp_tailx; | |
189 | ||
190 | struct semaphore sem_wdbusy;/* watchdog exclusion semaphore */ | |
191 | struct watchdog wd; /* statically allocated watchdog structure */ | |
192 | atomic_t bh_pending; /* bh queued, but not yet running */ | |
193 | u_int32_t brd_id; /* unique PCI ID */ | |
194 | u_int16_t hdw_bid; /* on/board hardware ID */ | |
195 | unsigned short wdcount; | |
196 | unsigned char max_port; | |
197 | unsigned char brdno; /* our board number */ | |
198 | unsigned char wd_notify; | |
199 | #define WD_NOTIFY_1TX 1 | |
200 | #define WD_NOTIFY_BUF 2 | |
201 | #define WD_NOTIFY_ONR 4 | |
202 | enum /* state as regards interrupt processing */ | |
203 | { | |
204 | C_INIT, /* of-board-address not configured or are in | |
205 | * process of being removed, don't access | |
206 | * hardware */ | |
207 | C_IDLE, /* off-board-addresses are configured, but | |
208 | * don't service interrupts, just clear them | |
209 | * from hardware */ | |
210 | C_RUNNING /* life is good, service away */ | |
211 | } state; | |
212 | ||
213 | struct sbe_card_info *next; | |
214 | u_int32_t *eeprombase; /* mapped address of board's EEPROM */ | |
215 | c4cpld_t *cpldbase; /* mapped address of board's CPLD hardware */ | |
216 | char *release; /* SBE ID string w/in sbeRelease.c */ | |
217 | void *hdw_info; | |
218 | #ifdef CONFIG_PROC_FS | |
219 | struct proc_dir_entry *dir_dev; | |
220 | #endif | |
221 | ||
222 | /* saved off interface assignments which bound a board */ | |
223 | hdlc_device *first_if; | |
224 | hdlc_device *last_if; | |
225 | short first_channum, last_channum; | |
226 | ||
227 | struct intlog | |
228 | { | |
229 | u_int32_t this_status_new; | |
230 | u_int32_t last_status_new; | |
231 | u_int32_t drvr_intr_thcount; | |
232 | u_int32_t drvr_intr_bhcount; | |
233 | u_int32_t drvr_int_failure; | |
234 | } intlog; | |
235 | ||
236 | mpi_t port[MUSYCC_NPORTS]; | |
237 | char devname[SBE_IFACETMPL_SIZE + 1]; | |
238 | atomic_t tx_pending; | |
239 | u_int32_t alarmed[4]; /* dpm211 */ | |
240 | ||
241 | #if defined(SBE_ISR_TASKLET) | |
242 | struct tasklet_struct ci_musycc_isr_tasklet; | |
243 | #elif defined(SBE_ISR_IMMEDIATE) | |
244 | struct tq_struct ci_musycc_isr_tq; | |
245 | #endif | |
246 | }; | |
247 | typedef struct sbe_card_info ci_t; | |
248 | ||
249 | struct s_hdw_info | |
250 | { | |
251 | u_int8_t pci_busno; | |
252 | u_int8_t pci_slot; | |
253 | u_int8_t pci_pin[2]; | |
254 | u_int8_t revid[2]; | |
255 | u_int8_t mfg_info_sts; | |
256 | #define EEPROM_OK 0x00 | |
257 | #define EEPROM_CRCERR 0x01 | |
258 | char promfmt; /* prom type, from sbe_promformat.h */ | |
259 | ||
260 | char devname[SBE_IFACETMPL_SIZE]; | |
261 | struct pci_bus *bus; | |
262 | struct net_device *ndev; | |
263 | struct pci_dev *pdev[2]; | |
264 | ||
265 | unsigned long addr[2]; | |
266 | unsigned long addr_mapped[2]; | |
267 | unsigned long len[2]; | |
268 | ||
269 | union | |
270 | { | |
271 | char data[128]; | |
272 | FLD_TYPE1 pft1; /* prom field, type #1 */ | |
273 | FLD_TYPE2 pft2; /* prom field, type #2 */ | |
274 | } mfg_info; | |
275 | }; | |
276 | typedef struct s_hdw_info hdw_info_t; | |
277 | ||
278 | /*****************************************************************/ | |
279 | ||
280 | struct c4_priv | |
281 | { | |
282 | int channum; | |
283 | struct sbe_card_info *ci; | |
284 | }; | |
285 | ||
286 | ||
287 | /*****************************************************************/ | |
288 | ||
289 | extern ci_t *c4_list; | |
290 | ||
291 | mch_t *c4_find_chan (int); | |
292 | int c4_set_chan (int channum, struct sbecom_chan_param *); | |
293 | int c4_get_chan (int channum, struct sbecom_chan_param *); | |
294 | int c4_get_chan_stats (int channum, struct sbecom_chan_stats *); | |
295 | ||
296 | #endif /* _INC_PMCC4_PRIVATE_H_ */ |