summaryrefslogtreecommitdiff
path: root/drivers/staging/slicoss/slic.h
blob: 9707e5a7023a59670bef732717eb8ec5552c6e89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
/**************************************************************************
 *
 * Copyright (c) 2000-2002 Alacritech, Inc.  All rights reserved.
 *
 * $Id: slic.h,v 1.3 2006/07/14 16:43:02 mook Exp $
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY ALACRITECH, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ALACRITECH, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation
 * are those of the authors and should not be interpreted as representing
 * official policies, either expressed or implied, of Alacritech, Inc.
 *
 **************************************************************************/

/*
 * FILENAME: slic.h
 *
 * This is the base set of header definitions for the SLICOSS driver.
 */
#ifndef __SLIC_DRIVER_H__
#define __SLIC_DRIVER_H__


struct slic_spinlock {
	spinlock_t	lock;
	unsigned long	flags;
};

#define SLIC_RSPQ_PAGES_GB        10
#define SLIC_RSPQ_BUFSINPAGE      (PAGE_SIZE / SLIC_RSPBUF_SIZE)

typedef struct _slic_rspqueue_t {
    ulong32             offset;
    ulong32             pageindex;
    ulong32             num_pages;
    p_slic_rspbuf_t     rspbuf;
    pulong32            vaddr[SLIC_RSPQ_PAGES_GB];
    dma_addr_t          paddr[SLIC_RSPQ_PAGES_GB];
}    slic_rspqueue_t, *p_slic_rspqueue_t;

#define SLIC_RCVQ_EXPANSION         1
#define SLIC_RCVQ_ENTRIES           (256 * SLIC_RCVQ_EXPANSION)
#define SLIC_RCVQ_MINENTRIES        (SLIC_RCVQ_ENTRIES / 2)
#define SLIC_RCVQ_MAX_PROCESS_ISR   ((SLIC_RCVQ_ENTRIES * 4))
#define SLIC_RCVQ_RCVBUFSIZE        2048
#define SLIC_RCVQ_FILLENTRIES       (16 * SLIC_RCVQ_EXPANSION)
#define SLIC_RCVQ_FILLTHRESH        (SLIC_RCVQ_ENTRIES - SLIC_RCVQ_FILLENTRIES)

typedef struct _slic_rcvqueue_t {
    struct sk_buff    *head;
    struct sk_buff    *tail;
    ulong32            count;
    ulong32            size;
    ulong32            errors;
} slic_rcvqueue_t, *p_slic_rcvqueue_t;

typedef struct _slic_rcvbuf_info_t {
    ulong32     id;
    ulong32     starttime;
    ulong32     stoptime;
    ulong32     slicworld;
    ulong32     lasttime;
    ulong32     lastid;
}  slic_rcvbuf_info_t, *pslic_rcvbuf_info_t;
/*
 SLIC Handle structure.  Used to restrict handle values to
 32 bits by using an index rather than an address.
 Simplifies ucode in 64-bit systems
*/
typedef struct _slic_handle_word_t {
	union {
		struct {
			ushort      index;
			ushort      bottombits; /* to denote num bufs to card */
		}  parts;
		ulong32         whole;
	}  handle;
}  slic_handle_word_t, *pslic_handle_word_t;

typedef struct _slic_handle_t {
    slic_handle_word_t          token;   /* token passed between host and card*/
    ushort                      type;
    pvoid                       address;    /* actual address of the object*/
    ushort                      offset;
    struct _slic_handle_t       *other_handle;
    struct _slic_handle_t       *next;
} slic_handle_t, *pslic_handle_t;

#define SLIC_HANDLE_FREE        0x0000
#define SLIC_HANDLE_DATA        0x0001
#define SLIC_HANDLE_CMD         0x0002
#define SLIC_HANDLE_CONTEXT     0x0003
#define SLIC_HANDLE_TEAM        0x0004

#define handle_index        handle.parts.index
#define handle_bottom       handle.parts.bottombits
#define handle_token        handle.whole

#define SLIC_HOSTCMD_SIZE    512

typedef struct _slic_hostcmd_t {
    slic_host64_cmd_t          cmd64;
    ulong32                    type;
    struct sk_buff            *skb;
    ulong32                    paddrl;
    ulong32                    paddrh;
    ulong32                    busy;
    ulong32                    cmdsize;
    ushort                     numbufs;
    pslic_handle_t             pslic_handle;/* handle associated with command */
    struct _slic_hostcmd_t    *next;
    struct _slic_hostcmd_t    *next_all;
} slic_hostcmd_t, *p_slic_hostcmd_t;

#define SLIC_CMDQ_CMDSINPAGE    (PAGE_SIZE / SLIC_HOSTCMD_SIZE)
#define SLIC_CMD_DUMB            3
#define SLIC_CMDQ_INITCMDS       256
#define SLIC_CMDQ_MAXCMDS        256
#define SLIC_CMDQ_MAXOUTSTAND    SLIC_CMDQ_MAXCMDS
#define SLIC_CMDQ_MAXPAGES       (SLIC_CMDQ_MAXCMDS / SLIC_CMDQ_CMDSINPAGE)
#define SLIC_CMDQ_INITPAGES      (SLIC_CMDQ_INITCMDS / SLIC_CMDQ_CMDSINPAGE)

typedef struct _slic_cmdqmem_t {
    int               pagecnt;
    pulong32          pages[SLIC_CMDQ_MAXPAGES];
    dma_addr_t        dma_pages[SLIC_CMDQ_MAXPAGES];
}          slic_cmdqmem_t, *p_slic_cmdqmem_t;

typedef struct _slic_cmdqueue_t {
    p_slic_hostcmd_t   head;
    p_slic_hostcmd_t   tail;
    int                count;
    struct slic_spinlock	lock;
}    slic_cmdqueue_t, *p_slic_cmdqueue_t;

#ifdef STATUS_SUCCESS
#undef STATUS_SUCCESS
#endif

#define STATUS_SUCCESS              0
#define STATUS_PENDING              0
#define STATUS_FAILURE             -1
#define STATUS_ERROR               -2
#define STATUS_NOT_SUPPORTED       -3
#define STATUS_BUFFER_TOO_SHORT    -4

#define SLIC_MAX_CARDS              32
#define SLIC_MAX_PORTS              4        /* Max # of ports per card   */
#if SLIC_DUMP_ENABLED
/*
Dump buffer size

This cannot be bigger than the max DMA size the card supports,
given the current code structure in the host and ucode.
Mojave supports 16K, Oasis supports 16K-1, so
just set this at 15K, shouldnt make that much of a diff.
*/
#define DUMP_BUF_SIZE               0x3C00
#endif


typedef struct _mcast_address_t {
    uchar                     address[6];
    struct _mcast_address_t   *next;
}  mcast_address_t, *p_mcast_address_t;

#define CARD_DOWN        0x00000000
#define CARD_UP          0x00000001
#define CARD_FAIL        0x00000002
#define CARD_DIAG        0x00000003
#define CARD_SLEEP       0x00000004

#define ADAPT_DOWN             0x00
#define ADAPT_UP               0x01
#define ADAPT_FAIL             0x02
#define ADAPT_RESET            0x03
#define ADAPT_SLEEP            0x04

#define ADAPT_FLAGS_BOOTTIME            0x0001
#define ADAPT_FLAGS_IS64BIT             0x0002
#define ADAPT_FLAGS_PENDINGLINKDOWN     0x0004
#define ADAPT_FLAGS_FIBERMEDIA          0x0008
#define ADAPT_FLAGS_LOCKS_ALLOCED       0x0010
#define ADAPT_FLAGS_INT_REGISTERED      0x0020
#define ADAPT_FLAGS_LOAD_TIMER_SET      0x0040
#define ADAPT_FLAGS_STATS_TIMER_SET     0x0080
#define ADAPT_FLAGS_RESET_TIMER_SET     0x0100

#define LINK_DOWN              0x00
#define LINK_CONFIG            0x01
#define LINK_UP                0x02

#define LINK_10MB              0x00
#define LINK_100MB             0x01
#define LINK_AUTOSPEED         0x02
#define LINK_1000MB            0x03
#define LINK_10000MB           0x04

#define LINK_HALFD             0x00
#define LINK_FULLD             0x01
#define LINK_AUTOD             0x02

#define MAC_DIRECTED     0x00000001
#define MAC_BCAST        0x00000002
#define MAC_MCAST        0x00000004
#define MAC_PROMISC      0x00000008
#define MAC_LOOPBACK     0x00000010
#define MAC_ALLMCAST     0x00000020

#define SLIC_DUPLEX(x)    ((x == LINK_FULLD) ? "FDX" : "HDX")
#define SLIC_SPEED(x)     ((x == LINK_100MB) ? "100Mb" : ((x == LINK_1000MB) ?\
				"1000Mb" : " 10Mb"))
#define SLIC_LINKSTATE(x) ((x == LINK_DOWN) ? "Down" : "Up  ")
#define SLIC_ADAPTER_STATE(x) ((x == ADAPT_UP) ? "UP" : "Down")
#define SLIC_CARD_STATE(x)    ((x == CARD_UP) ? "UP" : "Down")

typedef struct _slic_iface_stats {
    /*
     * Stats
     */
    ulong64        xmt_bytes;
    ulong64        xmt_ucast;
    ulong64        xmt_mcast;
    ulong64        xmt_bcast;
    ulong64        xmt_errors;
    ulong64        xmt_discards;
    ulong64        xmit_collisions;
    ulong64        xmit_excess_xmit_collisions;
    ulong64        rcv_bytes;
    ulong64        rcv_ucast;
    ulong64        rcv_mcast;
    ulong64        rcv_bcast;
    ulong64        rcv_errors;
    ulong64        rcv_discards;
} slic_iface_stats_t, *p_slic_iface_stats_t;

typedef struct _slic_tcp_stats {
    ulong64        xmit_tcp_segs;
    ulong64        xmit_tcp_bytes;
    ulong64        rcv_tcp_segs;
    ulong64        rcv_tcp_bytes;
} slic_tcp_stats_t, *p_slic_tcp_stats_t;

typedef struct _slicnet_stats {
    slic_tcp_stats_t        tcp;
    slic_iface_stats_t      iface;

} slicnet_stats_t, *p_slicnet_stats_t;

#define SLIC_LOADTIMER_PERIOD     1
#define SLIC_INTAGG_DEFAULT       200
#define SLIC_LOAD_0               0
#define SLIC_INTAGG_0             0
#define SLIC_LOAD_1               8000
#define SLIC_LOAD_2               10000
#define SLIC_LOAD_3               12000
#define SLIC_LOAD_4               14000
#define SLIC_LOAD_5               16000
#define SLIC_INTAGG_1             50
#define SLIC_INTAGG_2             100
#define SLIC_INTAGG_3             150
#define SLIC_INTAGG_4             200
#define SLIC_INTAGG_5             250
#define SLIC_LOAD_1GB             3000
#define SLIC_LOAD_2GB             6000
#define SLIC_LOAD_3GB             12000
#define SLIC_LOAD_4GB             24000
#define SLIC_LOAD_5GB             48000
#define SLIC_INTAGG_1GB           50
#define SLIC_INTAGG_2GB           75
#define SLIC_INTAGG_3GB           100
#define SLIC_INTAGG_4GB           100
#define SLIC_INTAGG_5GB           100

typedef struct _ether_header {
    uchar    ether_dhost[6];
    uchar    ether_shost[6];
    ushort   ether_type;
} ether_header, *p_ether_header;

typedef struct _sliccard_t {
    uint              busnumber;
    uint              slotnumber;
    uint              state;
    uint              cardnum;
    uint              card_size;
    uint              adapters_activated;
    uint              adapters_allocated;
    uint              adapters_sleeping;
    uint              gennumber;
    ulong32           events;
    ulong32           loadlevel_current;
    ulong32           load;
    uint              reset_in_progress;
    ulong32           pingstatus;
    ulong32           bad_pingstatus;
    struct timer_list loadtimer;
    ulong32           loadtimerset;
    uint              config_set;
    slic_config_t     config;
    struct dentry      *debugfs_dir;
    struct dentry      *debugfs_cardinfo;
    struct _adapter_t  *master;
    struct _adapter_t  *adapter[SLIC_MAX_PORTS];
    struct _sliccard_t *next;
    ulong32             error_interrupts;
    ulong32             error_rmiss_interrupts;
    ulong32             rcv_interrupts;
    ulong32             xmit_interrupts;
    ulong32             num_isrs;
    ulong32             false_interrupts;
    ulong32             max_isr_rcvs;
    ulong32             max_isr_xmits;
    ulong32             rcv_interrupt_yields;
    ulong32             tx_packets;
#if SLIC_DUMP_ENABLED
    ulong32             dumpstatus;           /* Result of dump UPR */
    pvoid               cmdbuffer;

    ulong               cmdbuffer_phys;
    ulong32             cmdbuffer_physl;
    ulong32             cmdbuffer_physh;

    ulong32             dump_count;
    struct task_struct *dump_task_id;
    ulong32             dump_wait_count;
    uint                dumpthread_running; /* has a dump thread been init'd  */
    uint                dump_requested;     /* 0 no, 1 = reqstd 2=curr 3=done */
    ulong32             dumptime_start;
    ulong32             dumptime_complete;
    ulong32             dumptime_delta;
    pvoid               dumpbuffer;
    ulong               dumpbuffer_phys;
    ulong32             dumpbuffer_physl;
    ulong32             dumpbuffer_physh;
    wait_queue_head_t   dump_wq;
    struct file        *dumphandle;
    mm_segment_t        dumpfile_fs;
#endif
    ulong32             debug_ix;
    ushort              reg_type[32];
    ushort              reg_offset[32];
    ulong32             reg_value[32];
    ulong32             reg_valueh[32];
} sliccard_t, *p_sliccard_t;

#define NUM_CFG_SPACES      2
#define NUM_CFG_REGS        64
#define NUM_CFG_REG_ULONGS  (NUM_CFG_REGS / sizeof(ulong32))

typedef struct _physcard_t {
    struct _adapter_t  *adapter[SLIC_MAX_PORTS];
    struct _physcard_t *next;
    uint                adapters_allocd;

 /*  the following is not currently needed
    ulong32               bridge_busnum;
    ulong32               bridge_cfg[NUM_CFG_SPACES][NUM_CFG_REG_ULONGS];
 */
} physcard_t, *p_physcard_t;

typedef struct _base_driver {
    struct slic_spinlock driver_lock;
    ulong32              num_slic_cards;
    ulong32              num_slic_ports;
    ulong32              num_slic_ports_active;
    ulong32              dynamic_intagg;
    p_sliccard_t         slic_card;
    p_physcard_t         phys_card;
    uint                 cardnuminuse[SLIC_MAX_CARDS];
} base_driver_t, *p_base_driver_t;

extern base_driver_t   slic_global;

typedef struct _slic_shmem_t {
    volatile ulong32          isr;
    volatile ulong32          linkstatus;
    volatile slic_stats_t     inicstats;
} slic_shmem_t, *p_slic_shmem_t;

typedef struct _slic_reg_params_t {
    ulong32       linkspeed;
    ulong32       linkduplex;
    ulong32       fail_on_bad_eeprom;
} slic_reg_params_t, *p_reg_params_t;

typedef struct _slic_upr_t {
    uint                  adapter;
    ulong32               upr_request;
    ulong32               upr_data;
    ulong32               upr_data_h;
    ulong32               upr_buffer;
    ulong32               upr_buffer_h;
    struct _slic_upr_t *next;

} slic_upr_t, *p_slic_upr_t;

typedef struct _slic_ifevents_ti {
    uint        oflow802;
    uint        uflow802;
    uint        Tprtoflow;
    uint        rcvearly;
    uint        Bufov;
    uint        Carre;
    uint        Longe;
    uint        Invp;
    uint        Crc;
    uint        Drbl;
    uint        Code;
    uint        IpHlen;
    uint        IpLen;
    uint        IpCsum;
    uint        TpCsum;
    uint        TpHlen;
} slic_ifevents_t;

typedef struct _adapter_t {
    pvoid               ifp;
    p_sliccard_t        card;
    uint                port;
    p_physcard_t        physcard;
    uint                physport;
    uint                cardindex;
    uint                card_size;
    uint                chipid;
    struct net_device        *netdev;
    struct net_device        *next_netdevice;
    struct slic_spinlock     adapter_lock;
    struct slic_spinlock     reset_lock;
    struct pci_dev     *pcidev;
    uint                busnumber;
    uint                slotnumber;
    uint                functionnumber;
    ushort              vendid;
    ushort              devid;
    ushort              subsysid;
    ulong32             irq;
    void __iomem *memorybase;
    ulong32             memorylength;
    ulong32             drambase;
    ulong32             dramlength;
    uint                queues_initialized;
    uint                allocated;
    uint                activated;
    ulong32             intrregistered;
    uint                isp_initialized;
    uint                gennumber;
    ulong32             curaddrupper;
    p_slic_shmem_t      pshmem;
    dma_addr_t          phys_shmem;
    ulong32             isrcopy;
    p_slic_regs_t       slic_regs;
    uchar               state;
    uchar               linkstate;
    uchar               linkspeed;
    uchar               linkduplex;
    uint                flags;
    uchar               macaddr[6];
    uchar               currmacaddr[6];
    ulong32             macopts;
    ushort              devflags_prev;
    ulong64             mcastmask;
    p_mcast_address_t   mcastaddrs;
    p_slic_upr_t        upr_list;
    uint                upr_busy;
    struct timer_list   pingtimer;
    ulong32             pingtimerset;
    struct timer_list   statstimer;
    ulong32             statstimerset;
    struct timer_list   loadtimer;
    ulong32             loadtimerset;
    struct dentry      *debugfs_entry;
    struct slic_spinlock     upr_lock;
    struct slic_spinlock     bit64reglock;
    slic_rspqueue_t     rspqueue;
    slic_rcvqueue_t     rcvqueue;
    slic_cmdqueue_t     cmdq_free;
    slic_cmdqueue_t     cmdq_done;
    slic_cmdqueue_t     cmdq_all;
    slic_cmdqmem_t      cmdqmem;
    /*
     *  SLIC Handles
    */
    slic_handle_t       slic_handles[SLIC_CMDQ_MAXCMDS+1]; /* Object handles*/
    pslic_handle_t      pfree_slic_handles;             /* Free object handles*/
    struct slic_spinlock     handle_lock;           /* Object handle list lock*/
    ushort              slic_handle_ix;

    ulong32             xmitq_full;
    ulong32             all_reg_writes;
    ulong32             icr_reg_writes;
    ulong32             isr_reg_writes;
    ulong32             error_interrupts;
    ulong32             error_rmiss_interrupts;
    ulong32             rx_errors;
    ulong32             rcv_drops;
    ulong32             rcv_interrupts;
    ulong32             xmit_interrupts;
    ulong32             linkevent_interrupts;
    ulong32             upr_interrupts;
    ulong32             num_isrs;
    ulong32             false_interrupts;
    ulong32             tx_packets;
    ulong32             xmit_completes;
    ulong32             tx_drops;
    ulong32             rcv_broadcasts;
    ulong32             rcv_multicasts;
    ulong32             rcv_unicasts;
    ulong32             max_isr_rcvs;
    ulong32             max_isr_xmits;
    ulong32             rcv_interrupt_yields;
    ulong32             intagg_period;
    p_inicpm_state_t    inicpm_info;
    pvoid               pinicpm_info;
    slic_reg_params_t   reg_params;
    slic_ifevents_t     if_events;
    slic_stats_t        inicstats_prev;
    slicnet_stats_t     slic_stats;
    struct net_device_stats stats;
} adapter_t, *p_adapter_t;

#if SLIC_DUMP_ENABLED
#define SLIC_DUMP_REQUESTED      1
#define SLIC_DUMP_IN_PROGRESS    2
#define SLIC_DUMP_DONE           3

/****************************************************************************
 *
 * Microcode crash information structure.  This
 * structure is written out to the card's SRAM when the microcode panic's.
 *
 ****************************************************************************/
typedef struct _slic_crash_info {
    ushort  cpu_id;
    ushort  crash_pc;
} slic_crash_info, *p_slic_crash_info;

#define CRASH_INFO_OFFSET   0x155C

#endif

#define UPDATE_STATS(largestat, newstat, oldstat)                        \
{                                                                        \
    if ((newstat) < (oldstat))                                           \
	(largestat) += ((newstat) + (0xFFFFFFFF - oldstat + 1));         \
    else                                                                 \
	(largestat) += ((newstat) - (oldstat));                          \
}

#define UPDATE_STATS_GB(largestat, newstat, oldstat)                     \
{                                                                        \
    (largestat) += ((newstat) - (oldstat));                              \
}

#define ETHER_EQ_ADDR(_AddrA, _AddrB, _Result)                           \
{                                                                        \
    _Result = TRUE;                                                      \
    if (*(pulong32)(_AddrA) != *(pulong32)(_AddrB))                          \
	_Result = FALSE;                                                 \
    if (*(pushort)(&((_AddrA)[4])) != *(pushort)(&((_AddrB)[4])))        \
	_Result = FALSE;                                                 \
}

#if defined(CONFIG_X86_64) || defined(CONFIG_IA64)
#define   SLIC_GET_ADDR_LOW(_addr)  (ulong32)((ulong64)(_addr) & \
	0x00000000FFFFFFFF)
#define   SLIC_GET_ADDR_HIGH(_addr)  (ulong32)(((ulong64)(_addr) >> 32) & \
	0x00000000FFFFFFFF)
#else
#define   SLIC_GET_ADDR_LOW(_addr)   (ulong32)_addr
#define   SLIC_GET_ADDR_HIGH(_addr)  (ulong32)0
#endif

#define FLUSH       TRUE
#define DONT_FLUSH  FALSE

#define SIOCSLICDUMPCARD         (SIOCDEVPRIVATE+9)
#define SIOCSLICSETINTAGG        (SIOCDEVPRIVATE+10)
#define SIOCSLICTRACEDUMP        (SIOCDEVPRIVATE+11)

#endif /*  __SLIC_DRIVER_H__ */