1 /******************************************************************************
4 * Project: Gigabit Ethernet Adapters, ADDR-Modul
5 * Version: $Revision: 1.29 $
6 * Date: $Date: 2003/05/13 16:57:24 $
7 * Purpose: Header file for Address Management (MC, UC, Prom).
9 ******************************************************************************/
11 /******************************************************************************
13 * (C)Copyright 1998-2002 SysKonnect GmbH.
14 * (C)Copyright 2002-2003 Marvell.
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 2 of the License, or
19 * (at your option) any later version.
21 * The information in this file is provided "AS IS" without warranty.
23 ******************************************************************************/
25 /******************************************************************************
29 * This module is intended to manage multicast addresses and promiscuous mode
30 * on GEnesis adapters.
32 * Include File Hierarchy:
42 ******************************************************************************/
44 #ifndef __INC_SKADDR_H
45 #define __INC_SKADDR_H
49 #endif /* cplusplus */
51 /* defines ********************************************************************/
53 #define SK_MAC_ADDR_LEN 6 /* Length of MAC address. */
54 #define SK_MAX_ADDRS 14 /* #Addrs for exact match. */
56 /* ----- Common return values ----- */
58 #define SK_ADDR_SUCCESS 0 /* Function returned successfully. */
59 #define SK_ADDR_ILLEGAL_PORT 100 /* Port number too high. */
60 #define SK_ADDR_TOO_EARLY 101 /* Function called too early. */
62 /* ----- Clear/Add flag bits ----- */
64 #define SK_ADDR_PERMANENT 1 /* RLMT Address */
66 /* ----- Additional Clear flag bits ----- */
68 #define SK_MC_SW_ONLY 2 /* Do not update HW when clearing. */
70 /* ----- Override flag bits ----- */
72 #define SK_ADDR_LOGICAL_ADDRESS 0
73 #define SK_ADDR_VIRTUAL_ADDRESS (SK_ADDR_LOGICAL_ADDRESS) /* old */
74 #define SK_ADDR_PHYSICAL_ADDRESS 1
75 #define SK_ADDR_CLEAR_LOGICAL 2
76 #define SK_ADDR_SET_LOGICAL 4
78 /* ----- Override return values ----- */
80 #define SK_ADDR_OVERRIDE_SUCCESS (SK_ADDR_SUCCESS)
81 #define SK_ADDR_DUPLICATE_ADDRESS 1
82 #define SK_ADDR_MULTICAST_ADDRESS 2
84 /* ----- Partitioning of excact match table ----- */
86 #define SK_ADDR_EXACT_MATCHES 16 /* #Exact match entries. */
88 #define SK_ADDR_FIRST_MATCH_RLMT 1
89 #define SK_ADDR_LAST_MATCH_RLMT 2
90 #define SK_ADDR_FIRST_MATCH_DRV 3
91 #define SK_ADDR_LAST_MATCH_DRV (SK_ADDR_EXACT_MATCHES - 1)
93 /* ----- SkAddrMcAdd/SkAddrMcUpdate return values ----- */
95 #define SK_MC_FILTERING_EXACT 0 /* Exact filtering. */
96 #define SK_MC_FILTERING_INEXACT 1 /* Inexact filtering. */
98 /* ----- Additional SkAddrMcAdd return values ----- */
100 #define SK_MC_ILLEGAL_ADDRESS 2 /* Illegal address. */
101 #define SK_MC_ILLEGAL_PORT 3 /* Illegal port (not the active one). */
102 #define SK_MC_RLMT_OVERFLOW 4 /* Too many RLMT mc addresses. */
104 /* Promiscuous mode bits ----- */
106 #define SK_PROM_MODE_NONE 0 /* Normal receive. */
107 #define SK_PROM_MODE_LLC 1 /* Receive all LLC frames. */
108 #define SK_PROM_MODE_ALL_MC 2 /* Receive all multicast frames. */
109 /* #define SK_PROM_MODE_NON_LLC 4 */ /* Receive all non-LLC frames. */
114 #ifndef SK_ADDR_EQUAL
116 * "&" instead of "&&" allows better optimization on IA-64.
117 * The replacement is safe here, as all bytes exist.
119 #ifndef SK_ADDR_DWORD_COMPARE
120 #define SK_ADDR_EQUAL(A1,A2) ( \
121 (((SK_U8 *)(A1))[5] == ((SK_U8 *)(A2))[5]) & \
122 (((SK_U8 *)(A1))[4] == ((SK_U8 *)(A2))[4]) & \
123 (((SK_U8 *)(A1))[3] == ((SK_U8 *)(A2))[3]) & \
124 (((SK_U8 *)(A1))[2] == ((SK_U8 *)(A2))[2]) & \
125 (((SK_U8 *)(A1))[1] == ((SK_U8 *)(A2))[1]) & \
126 (((SK_U8 *)(A1))[0] == ((SK_U8 *)(A2))[0]))
127 #else /* SK_ADDR_DWORD_COMPARE */
128 #define SK_ADDR_EQUAL(A1,A2) ( \
129 (*(SK_U32 *)&(((SK_U8 *)(A1))[2]) == *(SK_U32 *)&(((SK_U8 *)(A2))[2])) & \
130 (*(SK_U32 *)&(((SK_U8 *)(A1))[0]) == *(SK_U32 *)&(((SK_U8 *)(A2))[0])))
131 #endif /* SK_ADDR_DWORD_COMPARE */
132 #endif /* SK_ADDR_EQUAL */
135 #ifndef SK_ADDR_EQUAL
136 #ifndef SK_ADDR_DWORD_COMPARE
137 #define SK_ADDR_EQUAL(A1,A2) ( \
138 (((SK_U8 SK_FAR *)(A1))[5] == ((SK_U8 SK_FAR *)(A2))[5]) & \
139 (((SK_U8 SK_FAR *)(A1))[4] == ((SK_U8 SK_FAR *)(A2))[4]) & \
140 (((SK_U8 SK_FAR *)(A1))[3] == ((SK_U8 SK_FAR *)(A2))[3]) & \
141 (((SK_U8 SK_FAR *)(A1))[2] == ((SK_U8 SK_FAR *)(A2))[2]) & \
142 (((SK_U8 SK_FAR *)(A1))[1] == ((SK_U8 SK_FAR *)(A2))[1]) & \
143 (((SK_U8 SK_FAR *)(A1))[0] == ((SK_U8 SK_FAR *)(A2))[0]))
144 #else /* SK_ADDR_DWORD_COMPARE */
145 #define SK_ADDR_EQUAL(A1,A2) ( \
146 (*(SK_U16 SK_FAR *)&(((SK_U8 SK_FAR *)(A1))[4]) == \
147 *(SK_U16 SK_FAR *)&(((SK_U8 SK_FAR *)(A2))[4])) && \
148 (*(SK_U32 SK_FAR *)&(((SK_U8 SK_FAR *)(A1))[0]) == \
149 *(SK_U32 SK_FAR *)&(((SK_U8 SK_FAR *)(A2))[0])))
150 #endif /* SK_ADDR_DWORD_COMPARE */
151 #endif /* SK_ADDR_EQUAL */
153 /* typedefs *******************************************************************/
155 typedef struct s_MacAddr {
156 SK_U8 a[SK_MAC_ADDR_LEN];
160 /* SK_FILTER is used to ensure alignment of the filter. */
161 typedef union s_InexactFilter {
163 SK_U64 Val; /* Dummy entry for alignment only. */
167 typedef struct s_AddrNet SK_ADDR_NET;
170 typedef struct s_AddrPort {
172 /* ----- Public part (read-only) ----- */
174 SK_MAC_ADDR CurrentMacAddress; /* Current physical MAC Address. */
175 SK_MAC_ADDR PermanentMacAddress; /* Permanent physical MAC Address. */
176 int PromMode; /* Promiscuous Mode. */
178 /* ----- Private part ----- */
180 SK_MAC_ADDR PreviousMacAddress; /* Prev. phys. MAC Address. */
181 SK_BOOL CurrentMacAddressSet; /* CurrentMacAddress is set. */
184 SK_U32 FirstExactMatchRlmt;
185 SK_U32 NextExactMatchRlmt;
186 SK_U32 FirstExactMatchDrv;
187 SK_U32 NextExactMatchDrv;
188 SK_MAC_ADDR Exact[SK_ADDR_EXACT_MATCHES];
189 SK_FILTER64 InexactFilter; /* For 64-bit hash register. */
190 SK_FILTER64 InexactRlmtFilter; /* For 64-bit hash register. */
191 SK_FILTER64 InexactDrvFilter; /* For 64-bit hash register. */
196 /* ----- Public part (read-only) ----- */
198 SK_MAC_ADDR CurrentMacAddress; /* Logical MAC Address. */
199 SK_MAC_ADDR PermanentMacAddress; /* Logical MAC Address. */
201 /* ----- Private part ----- */
203 SK_U32 ActivePort; /* View of module ADDR. */
204 SK_BOOL CurrentMacAddressSet; /* CurrentMacAddress is set. */
210 typedef struct s_Addr {
212 /* ----- Public part (read-only) ----- */
214 SK_ADDR_NET Net[SK_MAX_NETS];
215 SK_ADDR_PORT Port[SK_MAX_MACS];
217 /* ----- Private part ----- */
220 /* function prototypes ********************************************************/
224 /* Functions provided by SkAddr */
226 /* ANSI/C++ compliant function prototypes */
228 extern int SkAddrInit(
233 extern int SkAddrMcClear(
239 extern int SkAddrXmacMcClear(
245 extern int SkAddrGmacMcClear(
251 extern int SkAddrMcAdd(
258 extern int SkAddrXmacMcAdd(
265 extern int SkAddrGmacMcAdd(
272 extern int SkAddrMcUpdate(
277 extern int SkAddrXmacMcUpdate(
282 extern int SkAddrGmacMcUpdate(
287 extern int SkAddrOverride(
291 SK_MAC_ADDR SK_FAR *pNewAddr,
294 extern int SkAddrPromiscuousChange(
300 extern int SkAddrXmacPromiscuousChange(
306 extern int SkAddrGmacPromiscuousChange(
313 extern int SkAddrSwap(
316 SK_U32 FromPortNumber,
317 SK_U32 ToPortNumber);
320 #else /* defined(SK_KR_PROTO)) */
322 /* Non-ANSI/C++ compliant function prototypes */
324 #error KR-style prototypes are not yet provided.
326 #endif /* defined(SK_KR_PROTO)) */
331 #endif /* __cplusplus */
333 #endif /* __INC_SKADDR_H */