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 #define OASIS_UCODE_VERS_STRING "1.2"
46 #define OASIS_UCODE_VERS_DATE "2006/03/27 15:10:37"
47 #define OASIS_UCODE_HOSTIF_ID 3
49 static s32 ONumSections = 0x2;
50 static u32 OSectionSize[] = {
51 0x00004000, 0x00010000,
54 static u32 OSectionStart[] = {
55 0x00000000, 0x00008000,
58 #define MOJAVE_UCODE_VERS_STRING "1.2"
59 #define MOJAVE_UCODE_VERS_DATE "2006/03/27 15:12:22"
60 #define MOJAVE_UCODE_HOSTIF_ID 3
62 static s32 MNumSections = 0x2;
63 static u32 MSectionSize[] =
65 0x00008000, 0x00010000,
68 static u32 MSectionStart[] =
70 0x00000000, 0x00008000,
73 #define GB_RCVUCODE_VERS_STRING "1.2"
74 #define GB_RCVUCODE_VERS_DATE "2006/03/27 15:12:15"
75 static u32 OasisRcvUCodeLen = 512;
76 static u32 GBRcvUCodeLen = 512;
77 #define SECTION_SIZE 65536
79 struct slic_spinlock {
84 #define SLIC_RSPQ_PAGES_GB 10
85 #define SLIC_RSPQ_BUFSINPAGE (PAGE_SIZE / SLIC_RSPBUF_SIZE)
87 struct slic_rspqueue {
91 struct slic_rspbuf *rspbuf;
92 u32 *vaddr[SLIC_RSPQ_PAGES_GB];
93 dma_addr_t paddr[SLIC_RSPQ_PAGES_GB];
96 #define SLIC_RCVQ_EXPANSION 1
97 #define SLIC_RCVQ_ENTRIES (256 * SLIC_RCVQ_EXPANSION)
98 #define SLIC_RCVQ_MINENTRIES (SLIC_RCVQ_ENTRIES / 2)
99 #define SLIC_RCVQ_MAX_PROCESS_ISR ((SLIC_RCVQ_ENTRIES * 4))
100 #define SLIC_RCVQ_RCVBUFSIZE 2048
101 #define SLIC_RCVQ_FILLENTRIES (16 * SLIC_RCVQ_EXPANSION)
102 #define SLIC_RCVQ_FILLTHRESH (SLIC_RCVQ_ENTRIES - SLIC_RCVQ_FILLENTRIES)
104 struct slic_rcvqueue {
105 struct sk_buff *head;
106 struct sk_buff *tail;
112 struct slic_rcvbuf_info {
121 SLIC Handle structure. Used to restrict handle values to
122 32 bits by using an index rather than an address.
123 Simplifies ucode in 64-bit systems
125 struct slic_handle_word {
129 ushort bottombits; /* to denote num bufs to card */
136 struct slic_handle_word token; /* token passed between host and card*/
138 void *address; /* actual address of the object*/
140 struct slic_handle *other_handle;
141 struct slic_handle *next;
144 #define SLIC_HANDLE_FREE 0x0000
145 #define SLIC_HANDLE_DATA 0x0001
146 #define SLIC_HANDLE_CMD 0x0002
147 #define SLIC_HANDLE_CONTEXT 0x0003
148 #define SLIC_HANDLE_TEAM 0x0004
150 #define handle_index handle.parts.index
151 #define handle_bottom handle.parts.bottombits
152 #define handle_token handle.whole
154 #define SLIC_HOSTCMD_SIZE 512
156 struct slic_hostcmd {
157 struct slic_host64_cmd cmd64;
165 struct slic_handle *pslic_handle;/* handle associated with command */
166 struct slic_hostcmd *next;
167 struct slic_hostcmd *next_all;
170 #define SLIC_CMDQ_CMDSINPAGE (PAGE_SIZE / SLIC_HOSTCMD_SIZE)
171 #define SLIC_CMD_DUMB 3
172 #define SLIC_CMDQ_INITCMDS 256
173 #define SLIC_CMDQ_MAXCMDS 256
174 #define SLIC_CMDQ_MAXOUTSTAND SLIC_CMDQ_MAXCMDS
175 #define SLIC_CMDQ_MAXPAGES (SLIC_CMDQ_MAXCMDS / SLIC_CMDQ_CMDSINPAGE)
176 #define SLIC_CMDQ_INITPAGES (SLIC_CMDQ_INITCMDS / SLIC_CMDQ_CMDSINPAGE)
178 struct slic_cmdqmem {
180 u32 *pages[SLIC_CMDQ_MAXPAGES];
181 dma_addr_t dma_pages[SLIC_CMDQ_MAXPAGES];
184 struct slic_cmdqueue {
185 struct slic_hostcmd *head;
186 struct slic_hostcmd *tail;
188 struct slic_spinlock lock;
191 #ifdef STATUS_SUCCESS
192 #undef STATUS_SUCCESS
195 #define STATUS_SUCCESS 0
196 #define STATUS_PENDING 0
197 #define STATUS_FAILURE -1
198 #define STATUS_ERROR -2
199 #define STATUS_NOT_SUPPORTED -3
200 #define STATUS_BUFFER_TOO_SHORT -4
202 #define SLIC_MAX_CARDS 32
203 #define SLIC_MAX_PORTS 4 /* Max # of ports per card */
204 #if SLIC_DUMP_ENABLED
208 This cannot be bigger than the max DMA size the card supports,
209 given the current code structure in the host and ucode.
210 Mojave supports 16K, Oasis supports 16K-1, so
211 just set this at 15K, shouldnt make that much of a diff.
213 #define DUMP_BUF_SIZE 0x3C00
217 struct mcast_address {
218 unsigned char address[6];
219 struct mcast_address *next;
222 #define CARD_DOWN 0x00000000
223 #define CARD_UP 0x00000001
224 #define CARD_FAIL 0x00000002
225 #define CARD_DIAG 0x00000003
226 #define CARD_SLEEP 0x00000004
228 #define ADAPT_DOWN 0x00
229 #define ADAPT_UP 0x01
230 #define ADAPT_FAIL 0x02
231 #define ADAPT_RESET 0x03
232 #define ADAPT_SLEEP 0x04
234 #define ADAPT_FLAGS_BOOTTIME 0x0001
235 #define ADAPT_FLAGS_IS64BIT 0x0002
236 #define ADAPT_FLAGS_PENDINGLINKDOWN 0x0004
237 #define ADAPT_FLAGS_FIBERMEDIA 0x0008
238 #define ADAPT_FLAGS_LOCKS_ALLOCED 0x0010
239 #define ADAPT_FLAGS_INT_REGISTERED 0x0020
240 #define ADAPT_FLAGS_LOAD_TIMER_SET 0x0040
241 #define ADAPT_FLAGS_STATS_TIMER_SET 0x0080
242 #define ADAPT_FLAGS_RESET_TIMER_SET 0x0100
244 #define LINK_DOWN 0x00
245 #define LINK_CONFIG 0x01
248 #define LINK_10MB 0x00
249 #define LINK_100MB 0x01
250 #define LINK_AUTOSPEED 0x02
251 #define LINK_1000MB 0x03
252 #define LINK_10000MB 0x04
254 #define LINK_HALFD 0x00
255 #define LINK_FULLD 0x01
256 #define LINK_AUTOD 0x02
258 #define MAC_DIRECTED 0x00000001
259 #define MAC_BCAST 0x00000002
260 #define MAC_MCAST 0x00000004
261 #define MAC_PROMISC 0x00000008
262 #define MAC_LOOPBACK 0x00000010
263 #define MAC_ALLMCAST 0x00000020
265 #define SLIC_DUPLEX(x) ((x == LINK_FULLD) ? "FDX" : "HDX")
266 #define SLIC_SPEED(x) ((x == LINK_100MB) ? "100Mb" : ((x == LINK_1000MB) ?\
268 #define SLIC_LINKSTATE(x) ((x == LINK_DOWN) ? "Down" : "Up ")
269 #define SLIC_ADAPTER_STATE(x) ((x == ADAPT_UP) ? "UP" : "Down")
270 #define SLIC_CARD_STATE(x) ((x == CARD_UP) ? "UP" : "Down")
272 struct slic_iface_stats {
283 u64 xmit_excess_xmit_collisions;
292 struct sliccp_stats {
299 struct slicnet_stats {
300 struct sliccp_stats tcp;
301 struct slic_iface_stats iface;
304 #define SLIC_LOADTIMER_PERIOD 1
305 #define SLIC_INTAGG_DEFAULT 200
306 #define SLIC_LOAD_0 0
307 #define SLIC_INTAGG_0 0
308 #define SLIC_LOAD_1 8000
309 #define SLIC_LOAD_2 10000
310 #define SLIC_LOAD_3 12000
311 #define SLIC_LOAD_4 14000
312 #define SLIC_LOAD_5 16000
313 #define SLIC_INTAGG_1 50
314 #define SLIC_INTAGG_2 100
315 #define SLIC_INTAGG_3 150
316 #define SLIC_INTAGG_4 200
317 #define SLIC_INTAGG_5 250
318 #define SLIC_LOAD_1GB 3000
319 #define SLIC_LOAD_2GB 6000
320 #define SLIC_LOAD_3GB 12000
321 #define SLIC_LOAD_4GB 24000
322 #define SLIC_LOAD_5GB 48000
323 #define SLIC_INTAGG_1GB 50
324 #define SLIC_INTAGG_2GB 75
325 #define SLIC_INTAGG_3GB 100
326 #define SLIC_INTAGG_4GB 100
327 #define SLIC_INTAGG_5GB 100
329 struct ether_header {
330 unsigned char ether_dhost[6];
331 unsigned char ether_shost[6];
341 uint adapters_activated;
342 uint adapters_allocated;
343 uint adapters_sleeping;
346 u32 loadlevel_current;
348 uint reset_in_progress;
351 struct timer_list loadtimer;
354 struct slic_config config;
355 struct dentry *debugfs_dir;
356 struct dentry *debugfs_cardinfo;
357 struct adapter *master;
358 struct adapter *adapter[SLIC_MAX_PORTS];
359 struct sliccard *next;
360 u32 error_interrupts;
361 u32 error_rmiss_interrupts;
365 u32 false_interrupts;
368 u32 rcv_interrupt_yields;
370 #if SLIC_DUMP_ENABLED
371 u32 dumpstatus; /* Result of dump UPR */
374 ulong cmdbuffer_phys;
379 struct task_struct *dump_task_id;
381 uint dumpthread_running; /* has a dump thread been init'd */
382 uint dump_requested; /* 0 no, 1 = reqstd 2=curr 3=done */
384 u32 dumptime_complete;
387 ulong dumpbuffer_phys;
388 u32 dumpbuffer_physl;
389 u32 dumpbuffer_physh;
390 wait_queue_head_t dump_wq;
391 struct file *dumphandle;
392 mm_segment_t dumpfile_fs;
396 ushort reg_offset[32];
401 #define NUM_CFG_SPACES 2
402 #define NUM_CFG_REGS 64
403 #define NUM_CFG_REG_ULONGS (NUM_CFG_REGS / sizeof(u32))
406 struct adapter *adapter[SLIC_MAX_PORTS];
407 struct physcard *next;
408 uint adapters_allocd;
410 /* the following is not currently needed
412 u32 bridge_cfg[NUM_CFG_SPACES][NUM_CFG_REG_ULONGS];
417 struct slic_spinlock driver_lock;
420 u32 num_slic_ports_active;
422 struct sliccard *slic_card;
423 struct physcard *phys_card;
424 uint cardnuminuse[SLIC_MAX_CARDS];
429 volatile u32 linkstatus;
430 volatile struct slic_stats inicstats;
433 struct slic_reg_params {
436 u32 fail_on_bad_eeprom;
446 struct slic_upr *next;
449 struct slic_ifevents {
470 struct sliccard *card;
472 struct physcard *physcard;
477 struct net_device *netdev;
478 struct net_device *next_netdevice;
479 struct slic_spinlock adapter_lock;
480 struct slic_spinlock reset_lock;
481 struct pci_dev *pcidev;
489 void __iomem *memorybase;
493 uint queues_initialized;
497 uint isp_initialized;
500 struct slic_shmem *pshmem;
501 dma_addr_t phys_shmem;
503 __iomem struct slic_regs *slic_regs;
505 unsigned char linkstate;
506 unsigned char linkspeed;
507 unsigned char linkduplex;
509 unsigned char macaddr[6];
510 unsigned char currmacaddr[6];
512 ushort devflags_prev;
514 struct mcast_address *mcastaddrs;
515 struct slic_upr *upr_list;
517 struct timer_list pingtimer;
519 struct timer_list statstimer;
521 struct timer_list loadtimer;
523 struct dentry *debugfs_entry;
524 struct slic_spinlock upr_lock;
525 struct slic_spinlock bit64reglock;
526 struct slic_rspqueue rspqueue;
527 struct slic_rcvqueue rcvqueue;
528 struct slic_cmdqueue cmdq_free;
529 struct slic_cmdqueue cmdq_done;
530 struct slic_cmdqueue cmdq_all;
531 struct slic_cmdqmem cmdqmem;
535 struct slic_handle slic_handles[SLIC_CMDQ_MAXCMDS+1]; /* Object handles*/
536 struct slic_handle *pfree_slic_handles; /* Free object handles*/
537 struct slic_spinlock handle_lock; /* Object handle list lock*/
538 ushort slic_handle_ix;
544 u32 error_interrupts;
545 u32 error_rmiss_interrupts;
550 u32 linkevent_interrupts;
553 u32 false_interrupts;
562 u32 rcv_interrupt_yields;
564 struct inicpm_state *inicpm_info;
566 struct slic_reg_params reg_params;
567 struct slic_ifevents if_events;
568 struct slic_stats inicstats_prev;
569 struct slicnet_stats slic_stats;
570 struct net_device_stats stats;
573 #if SLIC_DUMP_ENABLED
574 #define SLIC_DUMP_REQUESTED 1
575 #define SLIC_DUMP_IN_PROGRESS 2
576 #define SLIC_DUMP_DONE 3
578 /****************************************************************************
580 * Microcode crash information structure. This
581 * structure is written out to the card's SRAM when the microcode panic's.
583 ****************************************************************************/
584 struct slic_crash_info {
589 #define CRASH_INFO_OFFSET 0x155C
593 #define UPDATE_STATS(largestat, newstat, oldstat) \
595 if ((newstat) < (oldstat)) \
596 (largestat) += ((newstat) + (0xFFFFFFFF - oldstat + 1)); \
598 (largestat) += ((newstat) - (oldstat)); \
601 #define UPDATE_STATS_GB(largestat, newstat, oldstat) \
603 (largestat) += ((newstat) - (oldstat)); \
606 #define ETHER_EQ_ADDR(_AddrA, _AddrB, _Result) \
609 if (*(u32 *)(_AddrA) != *(u32 *)(_AddrB)) \
611 if (*(u16 *)(&((_AddrA)[4])) != *(u16 *)(&((_AddrB)[4]))) \
615 #if defined(CONFIG_X86_64) || defined(CONFIG_IA64)
616 #define SLIC_GET_ADDR_LOW(_addr) (u32)((u64)(_addr) & \
618 #define SLIC_GET_ADDR_HIGH(_addr) (u32)(((u64)(_addr) >> 32) & \
621 #define SLIC_GET_ADDR_LOW(_addr) (u32)_addr
622 #define SLIC_GET_ADDR_HIGH(_addr) (u32)0
626 #define DONT_FLUSH FALSE
628 #define SIOCSLICDUMPCARD (SIOCDEVPRIVATE+9)
629 #define SIOCSLICSETINTAGG (SIOCDEVPRIVATE+10)
630 #define SIOCSLICTRACEDUMP (SIOCDEVPRIVATE+11)
632 #endif /* __SLIC_DRIVER_H__ */