1 /**************************************************************************
3 * Copyright (c) 2000-2002 Alacritech, Inc. All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following
14 * disclaimer in the documentation and/or other materials provided
15 * with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY ALACRITECH, INC. ``AS IS'' AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALACRITECH, INC. OR
21 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
27 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * The views and conclusions contained in the software and documentation
31 * are those of the authors and should not be interpreted as representing
32 * official policies, either expressed or implied, of Alacritech, Inc.
34 **************************************************************************/
39 * This is the base set of header definitions for the SLICOSS driver.
41 #ifndef __SLIC_DRIVER_H__
42 #define __SLIC_DRIVER_H__
45 struct slic_spinlock {
50 #define SLIC_RSPQ_PAGES_GB 10
51 #define SLIC_RSPQ_BUFSINPAGE (PAGE_SIZE / SLIC_RSPBUF_SIZE)
53 struct slic_rspqueue {
57 struct slic_rspbuf *rspbuf;
58 u32 *vaddr[SLIC_RSPQ_PAGES_GB];
59 dma_addr_t paddr[SLIC_RSPQ_PAGES_GB];
62 #define SLIC_RCVQ_EXPANSION 1
63 #define SLIC_RCVQ_ENTRIES (256 * SLIC_RCVQ_EXPANSION)
64 #define SLIC_RCVQ_MINENTRIES (SLIC_RCVQ_ENTRIES / 2)
65 #define SLIC_RCVQ_MAX_PROCESS_ISR ((SLIC_RCVQ_ENTRIES * 4))
66 #define SLIC_RCVQ_RCVBUFSIZE 2048
67 #define SLIC_RCVQ_FILLENTRIES (16 * SLIC_RCVQ_EXPANSION)
68 #define SLIC_RCVQ_FILLTHRESH (SLIC_RCVQ_ENTRIES - SLIC_RCVQ_FILLENTRIES)
70 struct slic_rcvqueue {
78 struct slic_rcvbuf_info {
87 SLIC Handle structure. Used to restrict handle values to
88 32 bits by using an index rather than an address.
89 Simplifies ucode in 64-bit systems
91 struct slic_handle_word {
95 ushort bottombits; /* to denote num bufs to card */
102 struct slic_handle_word token; /* token passed between host and card*/
104 void *address; /* actual address of the object*/
106 struct slic_handle *other_handle;
107 struct slic_handle *next;
110 #define SLIC_HANDLE_FREE 0x0000
111 #define SLIC_HANDLE_DATA 0x0001
112 #define SLIC_HANDLE_CMD 0x0002
113 #define SLIC_HANDLE_CONTEXT 0x0003
114 #define SLIC_HANDLE_TEAM 0x0004
116 #define handle_index handle.parts.index
117 #define handle_bottom handle.parts.bottombits
118 #define handle_token handle.whole
120 #define SLIC_HOSTCMD_SIZE 512
122 struct slic_hostcmd {
123 struct slic_host64_cmd cmd64;
131 struct slic_handle *pslic_handle;/* handle associated with command */
132 struct slic_hostcmd *next;
133 struct slic_hostcmd *next_all;
136 #define SLIC_CMDQ_CMDSINPAGE (PAGE_SIZE / SLIC_HOSTCMD_SIZE)
137 #define SLIC_CMD_DUMB 3
138 #define SLIC_CMDQ_INITCMDS 256
139 #define SLIC_CMDQ_MAXCMDS 256
140 #define SLIC_CMDQ_MAXOUTSTAND SLIC_CMDQ_MAXCMDS
141 #define SLIC_CMDQ_MAXPAGES (SLIC_CMDQ_MAXCMDS / SLIC_CMDQ_CMDSINPAGE)
142 #define SLIC_CMDQ_INITPAGES (SLIC_CMDQ_INITCMDS / SLIC_CMDQ_CMDSINPAGE)
144 struct slic_cmdqmem {
146 u32 *pages[SLIC_CMDQ_MAXPAGES];
147 dma_addr_t dma_pages[SLIC_CMDQ_MAXPAGES];
150 struct slic_cmdqueue {
151 struct slic_hostcmd *head;
152 struct slic_hostcmd *tail;
154 struct slic_spinlock lock;
157 #ifdef STATUS_SUCCESS
158 #undef STATUS_SUCCESS
161 #define STATUS_SUCCESS 0
162 #define STATUS_PENDING 0
163 #define STATUS_FAILURE -1
164 #define STATUS_ERROR -2
165 #define STATUS_NOT_SUPPORTED -3
166 #define STATUS_BUFFER_TOO_SHORT -4
168 #define SLIC_MAX_CARDS 32
169 #define SLIC_MAX_PORTS 4 /* Max # of ports per card */
170 #if SLIC_DUMP_ENABLED
174 This cannot be bigger than the max DMA size the card supports,
175 given the current code structure in the host and ucode.
176 Mojave supports 16K, Oasis supports 16K-1, so
177 just set this at 15K, shouldnt make that much of a diff.
179 #define DUMP_BUF_SIZE 0x3C00
183 struct mcast_address {
184 unsigned char address[6];
185 struct mcast_address *next;
188 #define CARD_DOWN 0x00000000
189 #define CARD_UP 0x00000001
190 #define CARD_FAIL 0x00000002
191 #define CARD_DIAG 0x00000003
192 #define CARD_SLEEP 0x00000004
194 #define ADAPT_DOWN 0x00
195 #define ADAPT_UP 0x01
196 #define ADAPT_FAIL 0x02
197 #define ADAPT_RESET 0x03
198 #define ADAPT_SLEEP 0x04
200 #define ADAPT_FLAGS_BOOTTIME 0x0001
201 #define ADAPT_FLAGS_IS64BIT 0x0002
202 #define ADAPT_FLAGS_PENDINGLINKDOWN 0x0004
203 #define ADAPT_FLAGS_FIBERMEDIA 0x0008
204 #define ADAPT_FLAGS_LOCKS_ALLOCED 0x0010
205 #define ADAPT_FLAGS_INT_REGISTERED 0x0020
206 #define ADAPT_FLAGS_LOAD_TIMER_SET 0x0040
207 #define ADAPT_FLAGS_STATS_TIMER_SET 0x0080
208 #define ADAPT_FLAGS_RESET_TIMER_SET 0x0100
210 #define LINK_DOWN 0x00
211 #define LINK_CONFIG 0x01
214 #define LINK_10MB 0x00
215 #define LINK_100MB 0x01
216 #define LINK_AUTOSPEED 0x02
217 #define LINK_1000MB 0x03
218 #define LINK_10000MB 0x04
220 #define LINK_HALFD 0x00
221 #define LINK_FULLD 0x01
222 #define LINK_AUTOD 0x02
224 #define MAC_DIRECTED 0x00000001
225 #define MAC_BCAST 0x00000002
226 #define MAC_MCAST 0x00000004
227 #define MAC_PROMISC 0x00000008
228 #define MAC_LOOPBACK 0x00000010
229 #define MAC_ALLMCAST 0x00000020
231 #define SLIC_DUPLEX(x) ((x == LINK_FULLD) ? "FDX" : "HDX")
232 #define SLIC_SPEED(x) ((x == LINK_100MB) ? "100Mb" : ((x == LINK_1000MB) ?\
234 #define SLIC_LINKSTATE(x) ((x == LINK_DOWN) ? "Down" : "Up ")
235 #define SLIC_ADAPTER_STATE(x) ((x == ADAPT_UP) ? "UP" : "Down")
236 #define SLIC_CARD_STATE(x) ((x == CARD_UP) ? "UP" : "Down")
238 struct slic_iface_stats {
249 u64 xmit_excess_xmit_collisions;
258 struct sliccp_stats {
265 struct slicnet_stats {
266 struct sliccp_stats tcp;
267 struct slic_iface_stats iface;
270 #define SLIC_LOADTIMER_PERIOD 1
271 #define SLIC_INTAGG_DEFAULT 200
272 #define SLIC_LOAD_0 0
273 #define SLIC_INTAGG_0 0
274 #define SLIC_LOAD_1 8000
275 #define SLIC_LOAD_2 10000
276 #define SLIC_LOAD_3 12000
277 #define SLIC_LOAD_4 14000
278 #define SLIC_LOAD_5 16000
279 #define SLIC_INTAGG_1 50
280 #define SLIC_INTAGG_2 100
281 #define SLIC_INTAGG_3 150
282 #define SLIC_INTAGG_4 200
283 #define SLIC_INTAGG_5 250
284 #define SLIC_LOAD_1GB 3000
285 #define SLIC_LOAD_2GB 6000
286 #define SLIC_LOAD_3GB 12000
287 #define SLIC_LOAD_4GB 24000
288 #define SLIC_LOAD_5GB 48000
289 #define SLIC_INTAGG_1GB 50
290 #define SLIC_INTAGG_2GB 75
291 #define SLIC_INTAGG_3GB 100
292 #define SLIC_INTAGG_4GB 100
293 #define SLIC_INTAGG_5GB 100
295 struct ether_header {
296 unsigned char ether_dhost[6];
297 unsigned char ether_shost[6];
307 uint adapters_activated;
308 uint adapters_allocated;
309 uint adapters_sleeping;
312 u32 loadlevel_current;
314 uint reset_in_progress;
317 struct timer_list loadtimer;
320 struct slic_config config;
321 struct dentry *debugfs_dir;
322 struct dentry *debugfs_cardinfo;
323 struct adapter *master;
324 struct adapter *adapter[SLIC_MAX_PORTS];
325 struct sliccard *next;
326 u32 error_interrupts;
327 u32 error_rmiss_interrupts;
331 u32 false_interrupts;
334 u32 rcv_interrupt_yields;
336 #if SLIC_DUMP_ENABLED
337 u32 dumpstatus; /* Result of dump UPR */
340 ulong cmdbuffer_phys;
345 struct task_struct *dump_task_id;
347 uint dumpthread_running; /* has a dump thread been init'd */
348 uint dump_requested; /* 0 no, 1 = reqstd 2=curr 3=done */
350 u32 dumptime_complete;
353 ulong dumpbuffer_phys;
354 u32 dumpbuffer_physl;
355 u32 dumpbuffer_physh;
356 wait_queue_head_t dump_wq;
357 struct file *dumphandle;
358 mm_segment_t dumpfile_fs;
362 ushort reg_offset[32];
367 #define NUM_CFG_SPACES 2
368 #define NUM_CFG_REGS 64
369 #define NUM_CFG_REG_ULONGS (NUM_CFG_REGS / sizeof(u32))
372 struct adapter *adapter[SLIC_MAX_PORTS];
373 struct physcard *next;
374 uint adapters_allocd;
376 /* the following is not currently needed
378 u32 bridge_cfg[NUM_CFG_SPACES][NUM_CFG_REG_ULONGS];
383 struct slic_spinlock driver_lock;
386 u32 num_slic_ports_active;
388 struct sliccard *slic_card;
389 struct physcard *phys_card;
390 uint cardnuminuse[SLIC_MAX_CARDS];
395 volatile u32 linkstatus;
396 volatile struct slic_stats inicstats;
399 struct slic_reg_params {
402 u32 fail_on_bad_eeprom;
412 struct slic_upr *next;
415 struct slic_ifevents {
436 struct sliccard *card;
438 struct physcard *physcard;
443 struct net_device *netdev;
444 struct net_device *next_netdevice;
445 struct slic_spinlock adapter_lock;
446 struct slic_spinlock reset_lock;
447 struct pci_dev *pcidev;
455 void __iomem *memorybase;
459 uint queues_initialized;
463 uint isp_initialized;
466 struct slic_shmem *pshmem;
467 dma_addr_t phys_shmem;
469 __iomem struct slic_regs *slic_regs;
471 unsigned char linkstate;
472 unsigned char linkspeed;
473 unsigned char linkduplex;
475 unsigned char macaddr[6];
476 unsigned char currmacaddr[6];
478 ushort devflags_prev;
480 struct mcast_address *mcastaddrs;
481 struct slic_upr *upr_list;
483 struct timer_list pingtimer;
485 struct timer_list statstimer;
487 struct timer_list loadtimer;
489 struct dentry *debugfs_entry;
490 struct slic_spinlock upr_lock;
491 struct slic_spinlock bit64reglock;
492 struct slic_rspqueue rspqueue;
493 struct slic_rcvqueue rcvqueue;
494 struct slic_cmdqueue cmdq_free;
495 struct slic_cmdqueue cmdq_done;
496 struct slic_cmdqueue cmdq_all;
497 struct slic_cmdqmem cmdqmem;
501 struct slic_handle slic_handles[SLIC_CMDQ_MAXCMDS+1]; /* Object handles*/
502 struct slic_handle *pfree_slic_handles; /* Free object handles*/
503 struct slic_spinlock handle_lock; /* Object handle list lock*/
504 ushort slic_handle_ix;
510 u32 error_interrupts;
511 u32 error_rmiss_interrupts;
516 u32 linkevent_interrupts;
519 u32 false_interrupts;
528 u32 rcv_interrupt_yields;
530 struct inicpm_state *inicpm_info;
532 struct slic_reg_params reg_params;
533 struct slic_ifevents if_events;
534 struct slic_stats inicstats_prev;
535 struct slicnet_stats slic_stats;
536 struct net_device_stats stats;
539 #if SLIC_DUMP_ENABLED
540 #define SLIC_DUMP_REQUESTED 1
541 #define SLIC_DUMP_IN_PROGRESS 2
542 #define SLIC_DUMP_DONE 3
544 /****************************************************************************
546 * Microcode crash information structure. This
547 * structure is written out to the card's SRAM when the microcode panic's.
549 ****************************************************************************/
550 struct slic_crash_info {
555 #define CRASH_INFO_OFFSET 0x155C
559 #define UPDATE_STATS(largestat, newstat, oldstat) \
561 if ((newstat) < (oldstat)) \
562 (largestat) += ((newstat) + (0xFFFFFFFF - oldstat + 1)); \
564 (largestat) += ((newstat) - (oldstat)); \
567 #define UPDATE_STATS_GB(largestat, newstat, oldstat) \
569 (largestat) += ((newstat) - (oldstat)); \
572 #define ETHER_EQ_ADDR(_AddrA, _AddrB, _Result) \
575 if (*(u32 *)(_AddrA) != *(u32 *)(_AddrB)) \
577 if (*(u16 *)(&((_AddrA)[4])) != *(u16 *)(&((_AddrB)[4]))) \
581 #if defined(CONFIG_X86_64) || defined(CONFIG_IA64)
582 #define SLIC_GET_ADDR_LOW(_addr) (u32)((u64)(_addr) & \
584 #define SLIC_GET_ADDR_HIGH(_addr) (u32)(((u64)(_addr) >> 32) & \
587 #define SLIC_GET_ADDR_LOW(_addr) (u32)_addr
588 #define SLIC_GET_ADDR_HIGH(_addr) (u32)0
592 #define DONT_FLUSH FALSE
594 #define SIOCSLICDUMPCARD (SIOCDEVPRIVATE+9)
595 #define SIOCSLICSETINTAGG (SIOCDEVPRIVATE+10)
596 #define SIOCSLICTRACEDUMP (SIOCDEVPRIVATE+11)
598 #endif /* __SLIC_DRIVER_H__ */