Merge master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6
[linux-2.6] / drivers / net / dgrs_ether.h
1 /*
2  *      A filtering function.  There are two filters/port.  Filter "0"
3  *      is the input filter, and filter "1" is the output filter.
4  */
5 typedef int (FILTER_FUNC)(uchar *pktp, int pktlen, ulong *scratch, int port);
6 #define NFILTERS        2
7
8 /*
9  *      The per port structure
10  */
11 typedef struct
12 {
13         int             chan;           /* Channel number (0-3) */
14         ulong           portaddr;       /* address of 596 port register */
15         volatile ulong  *ca;            /* address of 596 chan attention */
16         ulong           intmask;        /* Interrupt mask for this port */
17         ulong           intack;         /* Ack bit for this port */
18
19         uchar           ethaddr[6];     /* Ethernet address of this port */
20         int             is_promisc;     /* Port is promiscuous */
21
22         int             debug;          /* Debugging turned on */
23
24         I596_ISCP       *iscpp;         /* Uncached ISCP pointer */
25         I596_SCP        *scpp;          /* Uncached SCP pointer */
26         I596_SCB        *scbp;          /* Uncached SCB pointer */
27
28         I596_ISCP       iscp;
29         I596_SCB        scb;
30
31         /* Command Queue */
32         I596_CB         *cb0;
33         I596_CB         *cbN;
34         I596_CB         *cb_head;
35         I596_CB         *cb_tail;
36
37         /* Receive Queue */
38         I596_RFD        *rfd0;
39         I596_RFD        *rfdN;
40         I596_RFD        *rfd_head;
41         I596_RFD        *rfd_tail;
42
43         /* Receive Buffers */
44         I596_RBD        *rbd0;
45         I596_RBD        *rbdN;
46         I596_RBD        *rbd_head;
47         I596_RBD        *rbd_tail;
48         int             buf_size;       /* Size of an RBD buffer */
49         int             buf_cnt;        /* Total RBD's allocated */
50
51         /* Rx Statistics */
52         ulong           cnt_rx_cnt;     /* Total packets rcvd, good and bad */
53         ulong           cnt_rx_good;    /* Total good packets rcvd */
54         ulong           cnt_rx_bad;     /* Total of all bad packets rcvd */
55                                         /* Subtotals can be gotten from SCB */
56         ulong           cnt_rx_nores;   /* No resources */
57         ulong           cnt_rx_bytes;   /* Total bytes rcvd */
58
59         /* Tx Statistics */
60         ulong           cnt_tx_queued;
61         ulong           cnt_tx_done;
62         ulong           cnt_tx_freed;
63         ulong           cnt_tx_nores;   /* No resources */
64
65         ulong           cnt_tx_bad;
66         ulong           cnt_tx_err_late;
67         ulong           cnt_tx_err_nocrs;
68         ulong           cnt_tx_err_nocts;
69         ulong           cnt_tx_err_under;
70         ulong           cnt_tx_err_maxcol;
71         ulong           cnt_tx_collisions;
72
73         /* Special stuff for host */
74 #       define          rfd_freed       cnt_rx_cnt
75         ulong           rbd_freed;
76         int             host_timer;
77
78         /* Added after first beta */
79         ulong           cnt_tx_races;   /* Counts race conditions */
80         int             spanstate;
81         ulong           cnt_st_tx;      /* send span tree pkts */
82         ulong           cnt_st_fail_tx; /* Failures to send span tree pkts */
83         ulong           cnt_st_fail_rbd;/* Failures to send span tree pkts */
84         ulong           cnt_st_rx;      /* rcv span tree pkts */
85         ulong           cnt_st_rx_bad;  /* bogus st packets rcvd */
86         ulong           cnt_rx_fwd;     /* Rcvd packets that were forwarded */
87
88         ulong           cnt_rx_mcast;   /* Multicast pkts received */
89         ulong           cnt_tx_mcast;   /* Multicast pkts transmitted */
90         ulong           cnt_tx_bytes;   /* Bytes transmitted */
91
92         /*
93          *      Packet filtering
94          *      Filter 0: input filter
95          *      Filter 1: output filter
96          */
97
98         ulong           *filter_space[NFILTERS];
99         FILTER_FUNC     *filter_func[NFILTERS];
100         ulong           filter_cnt[NFILTERS];
101         ulong           filter_len[NFILTERS];
102
103         ulong           pad[ (512-300) / 4];
104 } PORT;
105
106 /*
107  *      Port[0]                 is host interface
108  *      Port[1..SE_NPORTS]      are external 10 Base T ports.  Fewer may be in
109  *                              use, depending on whether this is an SE-4 or
110  *                              an SE-6.
111  *      Port[SE_NPORTS]         Pseudo-port for Spanning tree and SNMP
112  */
113 extern PORT     Port[1+SE_NPORTS+1];
114
115 extern int      Nports;         /* Number of genuine ethernet controllers */
116 extern int      Nchan;          /* ... plus one for host interface */
117
118 extern int      FirstChan;      /* 0 or 1, depedning on whether host is used */
119 extern int      NumChan;        /* 4 or 5 */
120
121 /*
122  *      A few globals
123  */
124 extern int      IsPromisc;
125 extern int      MultiNicMode;
126
127 /*
128  *      Functions
129  */
130 extern void     eth_xmit_spew_on(PORT *p, int cnt);
131 extern void     eth_xmit_spew_off(PORT *p);
132
133 extern I596_RBD *alloc_rbds(PORT *p, int num);
134
135 extern I596_CB * eth_cb_alloc(PORT *p);