Merge branch 'upstream-fixes'
[sfrench/cifs-2.6.git] / drivers / net / sk98lin / h / skcsum.h
1 /******************************************************************************
2  *
3  * Name:        skcsum.h
4  * Project:     GEnesis - SysKonnect SK-NET Gigabit Ethernet (SK-98xx)
5  * Version:     $Revision: 1.10 $
6  * Date:        $Date: 2003/08/20 13:59:57 $
7  * Purpose:     Store/verify Internet checksum in send/receive packets.
8  *
9  ******************************************************************************/
10
11 /******************************************************************************
12  *
13  *      (C)Copyright 1998-2001 SysKonnect GmbH.
14  *
15  *      This program is free software; you can redistribute it and/or modify
16  *      it under the terms of the GNU General Public License as published by
17  *      the Free Software Foundation; either version 2 of the License, or
18  *      (at your option) any later version.
19  *
20  *      The information in this file is provided "AS IS" without warranty.
21  *
22  ******************************************************************************/
23
24 /******************************************************************************
25  *
26  * Description:
27  *
28  * Public header file for the "GEnesis" common module "CSUM".
29  *
30  * "GEnesis" is an abbreviation of "Gigabit Ethernet Network System in Silicon"
31  * and is the code name of this SysKonnect project.
32  *
33  * Compilation Options:
34  *
35  *      SK_USE_CSUM - Define if CSUM is to be used. Otherwise, CSUM will be an
36  *      empty module.
37  *
38  *      SKCS_OVERWRITE_PROTO - Define to overwrite the default protocol id
39  *      definitions. In this case, all SKCS_PROTO_xxx definitions must be made
40  *      external.
41  *
42  *      SKCS_OVERWRITE_STATUS - Define to overwrite the default return status
43  *      definitions. In this case, all SKCS_STATUS_xxx definitions must be made
44  *      external.
45  *
46  * Include File Hierarchy:
47  *
48  *      "h/skcsum.h"
49  *       "h/sktypes.h"
50  *       "h/skqueue.h"
51  *
52  ******************************************************************************/
53
54 #ifndef __INC_SKCSUM_H
55 #define __INC_SKCSUM_H
56
57 #include "h/sktypes.h"
58 #include "h/skqueue.h"
59
60 /* defines ********************************************************************/
61
62 /*
63  * Define the default bit flags for 'SKCS_PACKET_INFO.ProtocolFlags'  if no user
64  * overwrite.
65  */
66 #ifndef SKCS_OVERWRITE_PROTO    /* User overwrite? */
67 #define SKCS_PROTO_IP   0x1     /* IP (Internet Protocol version 4) */
68 #define SKCS_PROTO_TCP  0x2     /* TCP (Transmission Control Protocol) */
69 #define SKCS_PROTO_UDP  0x4     /* UDP (User Datagram Protocol) */
70
71 /* Indices for protocol statistics. */
72 #define SKCS_PROTO_STATS_IP     0
73 #define SKCS_PROTO_STATS_UDP    1
74 #define SKCS_PROTO_STATS_TCP    2
75 #define SKCS_NUM_PROTOCOLS      3       /* Number of supported protocols. */
76 #endif  /* !SKCS_OVERWRITE_PROTO */
77
78 /*
79  * Define the default SKCS_STATUS type and values if no user overwrite.
80  *
81  *      SKCS_STATUS_UNKNOWN_IP_VERSION - Not an IP v4 frame.
82  *      SKCS_STATUS_IP_CSUM_ERROR - IP checksum error.
83  *      SKCS_STATUS_IP_CSUM_ERROR_TCP - IP checksum error in TCP frame.
84  *      SKCS_STATUS_IP_CSUM_ERROR_UDP - IP checksum error in UDP frame
85  *      SKCS_STATUS_IP_FRAGMENT - IP fragment (IP checksum ok).
86  *      SKCS_STATUS_IP_CSUM_OK - IP checksum ok (not a TCP or UDP frame).
87  *      SKCS_STATUS_TCP_CSUM_ERROR - TCP checksum error (IP checksum ok).
88  *      SKCS_STATUS_UDP_CSUM_ERROR - UDP checksum error (IP checksum ok).
89  *      SKCS_STATUS_TCP_CSUM_OK - IP and TCP checksum ok.
90  *      SKCS_STATUS_UDP_CSUM_OK - IP and UDP checksum ok.
91  *      SKCS_STATUS_IP_CSUM_OK_NO_UDP - IP checksum OK and no UDP checksum. 
92  */
93 #ifndef SKCS_OVERWRITE_STATUS   /* User overwrite? */
94 #define SKCS_STATUS     int     /* Define status type. */
95
96 #define SKCS_STATUS_UNKNOWN_IP_VERSION  1
97 #define SKCS_STATUS_IP_CSUM_ERROR               2
98 #define SKCS_STATUS_IP_FRAGMENT                 3
99 #define SKCS_STATUS_IP_CSUM_OK                  4
100 #define SKCS_STATUS_TCP_CSUM_ERROR              5
101 #define SKCS_STATUS_UDP_CSUM_ERROR              6
102 #define SKCS_STATUS_TCP_CSUM_OK                 7
103 #define SKCS_STATUS_UDP_CSUM_OK                 8
104 /* needed for Microsoft */
105 #define SKCS_STATUS_IP_CSUM_ERROR_UDP   9
106 #define SKCS_STATUS_IP_CSUM_ERROR_TCP   10
107 /* UDP checksum may be omitted */
108 #define SKCS_STATUS_IP_CSUM_OK_NO_UDP   11
109 #endif  /* !SKCS_OVERWRITE_STATUS */
110
111 /* Clear protocol statistics event. */
112 #define SK_CSUM_EVENT_CLEAR_PROTO_STATS 1
113
114 /*
115  * Add two values in one's complement.
116  *
117  * Note: One of the two input values may be "longer" than 16-bit, but then the
118  * resulting sum may be 17 bits long. In this case, add zero to the result using
119  * SKCS_OC_ADD() again.
120  *
121  *      Result = Value1 + Value2
122  */
123 #define SKCS_OC_ADD(Result, Value1, Value2) {                           \
124         unsigned long Sum;                                              \
125                                                                         \
126         Sum = (unsigned long) (Value1) + (unsigned long) (Value2);      \
127         /* Add-in any carry. */                                         \
128         (Result) = (Sum & 0xffff) + (Sum >> 16);                        \
129 }
130
131 /*
132  * Subtract two values in one's complement.
133  *
134  *      Result = Value1 - Value2
135  */
136 #define SKCS_OC_SUB(Result, Value1, Value2)     \
137         SKCS_OC_ADD((Result), (Value1), ~(Value2) & 0xffff)
138
139 /* typedefs *******************************************************************/
140
141 /*
142  * SKCS_PROTO_STATS - The CSUM protocol statistics structure.
143  *
144  * There is one instance of this structure for each protocol supported.
145  */
146 typedef struct s_CsProtocolStatistics {
147         SK_U64 RxOkCts;         /* Receive checksum ok. */
148         SK_U64 RxUnableCts;     /* Unable to verify receive checksum. */
149         SK_U64 RxErrCts;        /* Receive checksum error. */
150         SK_U64 TxOkCts;         /* Transmit checksum ok. */
151         SK_U64 TxUnableCts;     /* Unable to calculate checksum in hw. */
152 } SKCS_PROTO_STATS;
153
154 /*
155  * s_Csum - The CSUM module context structure.
156  */
157 typedef struct s_Csum {
158         /* Enabled receive SK_PROTO_XXX bit flags. */
159         unsigned ReceiveFlags[SK_MAX_NETS];
160 #ifdef TX_CSUM
161         unsigned TransmitFlags[SK_MAX_NETS];
162 #endif /* TX_CSUM */
163
164         /* The protocol statistics structure; one per supported protocol. */
165         SKCS_PROTO_STATS ProtoStats[SK_MAX_NETS][SKCS_NUM_PROTOCOLS];
166 } SK_CSUM;
167
168 /*
169  * SKCS_PACKET_INFO - The packet information structure.
170  */
171 typedef struct s_CsPacketInfo {
172         /* Bit field specifiying the desired/found protocols. */
173         unsigned ProtocolFlags;
174
175         /* Length of complete IP header, including any option fields. */
176         unsigned IpHeaderLength;
177
178         /* IP header checksum. */
179         unsigned IpHeaderChecksum;
180
181         /* TCP/UDP pseudo header checksum. */
182         unsigned PseudoHeaderChecksum;
183 } SKCS_PACKET_INFO;
184
185 /* function prototypes ********************************************************/
186
187 #ifndef SK_CS_CALCULATE_CHECKSUM
188 extern unsigned SkCsCalculateChecksum(
189         void            *pData,
190         unsigned        Length);
191 #endif /* SK_CS_CALCULATE_CHECKSUM */
192
193 extern int SkCsEvent(
194         SK_AC           *pAc,
195         SK_IOC          Ioc,
196         SK_U32          Event,
197         SK_EVPARA       Param);
198
199 extern SKCS_STATUS SkCsGetReceiveInfo(
200         SK_AC           *pAc,
201         void            *pIpHeader,
202         unsigned        Checksum1,
203         unsigned        Checksum2,
204         int                     NetNumber);
205
206 extern void SkCsSetReceiveFlags(
207         SK_AC           *pAc,
208         unsigned        ReceiveFlags,
209         unsigned        *pChecksum1Offset,
210         unsigned        *pChecksum2Offset,
211         int                     NetNumber);
212
213 #endif  /* __INC_SKCSUM_H */