diff options
Diffstat (limited to 'drivers/s390/net/qeth.h')
-rw-r--r-- | drivers/s390/net/qeth.h | 1253 |
1 files changed, 0 insertions, 1253 deletions
diff --git a/drivers/s390/net/qeth.h b/drivers/s390/net/qeth.h deleted file mode 100644 index 8c6b72d05b1d..000000000000 --- a/drivers/s390/net/qeth.h +++ /dev/null | |||
@@ -1,1253 +0,0 @@ | |||
1 | #ifndef __QETH_H__ | ||
2 | #define __QETH_H__ | ||
3 | |||
4 | #include <linux/if.h> | ||
5 | #include <linux/if_arp.h> | ||
6 | |||
7 | #include <linux/if_tr.h> | ||
8 | #include <linux/trdevice.h> | ||
9 | #include <linux/etherdevice.h> | ||
10 | #include <linux/if_vlan.h> | ||
11 | #include <linux/ctype.h> | ||
12 | |||
13 | #include <net/ipv6.h> | ||
14 | #include <linux/in6.h> | ||
15 | #include <net/if_inet6.h> | ||
16 | #include <net/addrconf.h> | ||
17 | |||
18 | |||
19 | #include <linux/bitops.h> | ||
20 | |||
21 | #include <asm/debug.h> | ||
22 | #include <asm/qdio.h> | ||
23 | #include <asm/ccwdev.h> | ||
24 | #include <asm/ccwgroup.h> | ||
25 | |||
26 | #include "qeth_mpc.h" | ||
27 | |||
28 | #ifdef CONFIG_QETH_IPV6 | ||
29 | #define QETH_VERSION_IPV6 ":IPv6" | ||
30 | #else | ||
31 | #define QETH_VERSION_IPV6 "" | ||
32 | #endif | ||
33 | #ifdef CONFIG_QETH_VLAN | ||
34 | #define QETH_VERSION_VLAN ":VLAN" | ||
35 | #else | ||
36 | #define QETH_VERSION_VLAN "" | ||
37 | #endif | ||
38 | |||
39 | /** | ||
40 | * Debug Facility stuff | ||
41 | */ | ||
42 | #define QETH_DBF_SETUP_NAME "qeth_setup" | ||
43 | #define QETH_DBF_SETUP_LEN 8 | ||
44 | #define QETH_DBF_SETUP_PAGES 8 | ||
45 | #define QETH_DBF_SETUP_NR_AREAS 1 | ||
46 | #define QETH_DBF_SETUP_LEVEL 5 | ||
47 | |||
48 | #define QETH_DBF_MISC_NAME "qeth_misc" | ||
49 | #define QETH_DBF_MISC_LEN 128 | ||
50 | #define QETH_DBF_MISC_PAGES 2 | ||
51 | #define QETH_DBF_MISC_NR_AREAS 1 | ||
52 | #define QETH_DBF_MISC_LEVEL 2 | ||
53 | |||
54 | #define QETH_DBF_DATA_NAME "qeth_data" | ||
55 | #define QETH_DBF_DATA_LEN 96 | ||
56 | #define QETH_DBF_DATA_PAGES 8 | ||
57 | #define QETH_DBF_DATA_NR_AREAS 1 | ||
58 | #define QETH_DBF_DATA_LEVEL 2 | ||
59 | |||
60 | #define QETH_DBF_CONTROL_NAME "qeth_control" | ||
61 | #define QETH_DBF_CONTROL_LEN 256 | ||
62 | #define QETH_DBF_CONTROL_PAGES 8 | ||
63 | #define QETH_DBF_CONTROL_NR_AREAS 2 | ||
64 | #define QETH_DBF_CONTROL_LEVEL 5 | ||
65 | |||
66 | #define QETH_DBF_TRACE_NAME "qeth_trace" | ||
67 | #define QETH_DBF_TRACE_LEN 8 | ||
68 | #define QETH_DBF_TRACE_PAGES 4 | ||
69 | #define QETH_DBF_TRACE_NR_AREAS 2 | ||
70 | #define QETH_DBF_TRACE_LEVEL 3 | ||
71 | extern debug_info_t *qeth_dbf_trace; | ||
72 | |||
73 | #define QETH_DBF_SENSE_NAME "qeth_sense" | ||
74 | #define QETH_DBF_SENSE_LEN 64 | ||
75 | #define QETH_DBF_SENSE_PAGES 2 | ||
76 | #define QETH_DBF_SENSE_NR_AREAS 1 | ||
77 | #define QETH_DBF_SENSE_LEVEL 2 | ||
78 | |||
79 | #define QETH_DBF_QERR_NAME "qeth_qerr" | ||
80 | #define QETH_DBF_QERR_LEN 8 | ||
81 | #define QETH_DBF_QERR_PAGES 2 | ||
82 | #define QETH_DBF_QERR_NR_AREAS 2 | ||
83 | #define QETH_DBF_QERR_LEVEL 2 | ||
84 | |||
85 | #define QETH_DBF_TEXT(name,level,text) \ | ||
86 | do { \ | ||
87 | debug_text_event(qeth_dbf_##name,level,text); \ | ||
88 | } while (0) | ||
89 | |||
90 | #define QETH_DBF_HEX(name,level,addr,len) \ | ||
91 | do { \ | ||
92 | debug_event(qeth_dbf_##name,level,(void*)(addr),len); \ | ||
93 | } while (0) | ||
94 | |||
95 | DECLARE_PER_CPU(char[256], qeth_dbf_txt_buf); | ||
96 | |||
97 | #define QETH_DBF_TEXT_(name,level,text...) \ | ||
98 | do { \ | ||
99 | char* dbf_txt_buf = get_cpu_var(qeth_dbf_txt_buf); \ | ||
100 | sprintf(dbf_txt_buf, text); \ | ||
101 | debug_text_event(qeth_dbf_##name,level,dbf_txt_buf); \ | ||
102 | put_cpu_var(qeth_dbf_txt_buf); \ | ||
103 | } while (0) | ||
104 | |||
105 | #define QETH_DBF_SPRINTF(name,level,text...) \ | ||
106 | do { \ | ||
107 | debug_sprintf_event(qeth_dbf_trace, level, ##text ); \ | ||
108 | debug_sprintf_event(qeth_dbf_trace, level, text ); \ | ||
109 | } while (0) | ||
110 | |||
111 | /** | ||
112 | * some more debug stuff | ||
113 | */ | ||
114 | #define PRINTK_HEADER "qeth: " | ||
115 | |||
116 | #define HEXDUMP16(importance,header,ptr) \ | ||
117 | PRINT_##importance(header "%02x %02x %02x %02x %02x %02x %02x %02x " \ | ||
118 | "%02x %02x %02x %02x %02x %02x %02x %02x\n", \ | ||
119 | *(((char*)ptr)),*(((char*)ptr)+1),*(((char*)ptr)+2), \ | ||
120 | *(((char*)ptr)+3),*(((char*)ptr)+4),*(((char*)ptr)+5), \ | ||
121 | *(((char*)ptr)+6),*(((char*)ptr)+7),*(((char*)ptr)+8), \ | ||
122 | *(((char*)ptr)+9),*(((char*)ptr)+10),*(((char*)ptr)+11), \ | ||
123 | *(((char*)ptr)+12),*(((char*)ptr)+13), \ | ||
124 | *(((char*)ptr)+14),*(((char*)ptr)+15)); \ | ||
125 | PRINT_##importance(header "%02x %02x %02x %02x %02x %02x %02x %02x " \ | ||
126 | "%02x %02x %02x %02x %02x %02x %02x %02x\n", \ | ||
127 | *(((char*)ptr)+16),*(((char*)ptr)+17), \ | ||
128 | *(((char*)ptr)+18),*(((char*)ptr)+19), \ | ||
129 | *(((char*)ptr)+20),*(((char*)ptr)+21), \ | ||
130 | *(((char*)ptr)+22),*(((char*)ptr)+23), \ | ||
131 | *(((char*)ptr)+24),*(((char*)ptr)+25), \ | ||
132 | *(((char*)ptr)+26),*(((char*)ptr)+27), \ | ||
133 | *(((char*)ptr)+28),*(((char*)ptr)+29), \ | ||
134 | *(((char*)ptr)+30),*(((char*)ptr)+31)); | ||
135 | |||
136 | static inline void | ||
137 | qeth_hex_dump(unsigned char *buf, size_t len) | ||
138 | { | ||
139 | size_t i; | ||
140 | |||
141 | for (i = 0; i < len; i++) { | ||
142 | if (i && !(i % 16)) | ||
143 | printk("\n"); | ||
144 | printk("%02x ", *(buf + i)); | ||
145 | } | ||
146 | printk("\n"); | ||
147 | } | ||
148 | |||
149 | #define SENSE_COMMAND_REJECT_BYTE 0 | ||
150 | #define SENSE_COMMAND_REJECT_FLAG 0x80 | ||
151 | #define SENSE_RESETTING_EVENT_BYTE 1 | ||
152 | #define SENSE_RESETTING_EVENT_FLAG 0x80 | ||
153 | |||
154 | /* | ||
155 | * Common IO related definitions | ||
156 | */ | ||
157 | extern struct device *qeth_root_dev; | ||
158 | extern struct ccw_driver qeth_ccw_driver; | ||
159 | extern struct ccwgroup_driver qeth_ccwgroup_driver; | ||
160 | |||
161 | #define CARD_RDEV(card) card->read.ccwdev | ||
162 | #define CARD_WDEV(card) card->write.ccwdev | ||
163 | #define CARD_DDEV(card) card->data.ccwdev | ||
164 | #define CARD_BUS_ID(card) card->gdev->dev.bus_id | ||
165 | #define CARD_RDEV_ID(card) card->read.ccwdev->dev.bus_id | ||
166 | #define CARD_WDEV_ID(card) card->write.ccwdev->dev.bus_id | ||
167 | #define CARD_DDEV_ID(card) card->data.ccwdev->dev.bus_id | ||
168 | #define CHANNEL_ID(channel) channel->ccwdev->dev.bus_id | ||
169 | |||
170 | #define CARD_FROM_CDEV(cdev) (struct qeth_card *) \ | ||
171 | ((struct ccwgroup_device *)cdev->dev.driver_data)\ | ||
172 | ->dev.driver_data; | ||
173 | |||
174 | /** | ||
175 | * card stuff | ||
176 | */ | ||
177 | struct qeth_perf_stats { | ||
178 | unsigned int bufs_rec; | ||
179 | unsigned int bufs_sent; | ||
180 | |||
181 | unsigned int skbs_sent_pack; | ||
182 | unsigned int bufs_sent_pack; | ||
183 | |||
184 | unsigned int sc_dp_p; | ||
185 | unsigned int sc_p_dp; | ||
186 | /* qdio_input_handler: number of times called, time spent in */ | ||
187 | __u64 inbound_start_time; | ||
188 | unsigned int inbound_cnt; | ||
189 | unsigned int inbound_time; | ||
190 | /* qeth_send_packet: number of times called, time spent in */ | ||
191 | __u64 outbound_start_time; | ||
192 | unsigned int outbound_cnt; | ||
193 | unsigned int outbound_time; | ||
194 | /* qdio_output_handler: number of times called, time spent in */ | ||
195 | __u64 outbound_handler_start_time; | ||
196 | unsigned int outbound_handler_cnt; | ||
197 | unsigned int outbound_handler_time; | ||
198 | /* number of calls to and time spent in do_QDIO for inbound queue */ | ||
199 | __u64 inbound_do_qdio_start_time; | ||
200 | unsigned int inbound_do_qdio_cnt; | ||
201 | unsigned int inbound_do_qdio_time; | ||
202 | /* number of calls to and time spent in do_QDIO for outbound queues */ | ||
203 | __u64 outbound_do_qdio_start_time; | ||
204 | unsigned int outbound_do_qdio_cnt; | ||
205 | unsigned int outbound_do_qdio_time; | ||
206 | /* eddp data */ | ||
207 | unsigned int large_send_bytes; | ||
208 | unsigned int large_send_cnt; | ||
209 | unsigned int sg_skbs_sent; | ||
210 | unsigned int sg_frags_sent; | ||
211 | /* initial values when measuring starts */ | ||
212 | unsigned long initial_rx_packets; | ||
213 | unsigned long initial_tx_packets; | ||
214 | /* inbound scatter gather data */ | ||
215 | unsigned int sg_skbs_rx; | ||
216 | unsigned int sg_frags_rx; | ||
217 | unsigned int sg_alloc_page_rx; | ||
218 | }; | ||
219 | |||
220 | /* Routing stuff */ | ||
221 | struct qeth_routing_info { | ||
222 | enum qeth_routing_types type; | ||
223 | }; | ||
224 | |||
225 | /* IPA stuff */ | ||
226 | struct qeth_ipa_info { | ||
227 | __u32 supported_funcs; | ||
228 | __u32 enabled_funcs; | ||
229 | }; | ||
230 | |||
231 | static inline int | ||
232 | qeth_is_ipa_supported(struct qeth_ipa_info *ipa, enum qeth_ipa_funcs func) | ||
233 | { | ||
234 | return (ipa->supported_funcs & func); | ||
235 | } | ||
236 | |||
237 | static inline int | ||
238 | qeth_is_ipa_enabled(struct qeth_ipa_info *ipa, enum qeth_ipa_funcs func) | ||
239 | { | ||
240 | return (ipa->supported_funcs & ipa->enabled_funcs & func); | ||
241 | } | ||
242 | |||
243 | #define qeth_adp_supported(c,f) \ | ||
244 | qeth_is_ipa_supported(&c->options.adp, f) | ||
245 | #define qeth_adp_enabled(c,f) \ | ||
246 | qeth_is_ipa_enabled(&c->options.adp, f) | ||
247 | #define qeth_is_supported(c,f) \ | ||
248 | qeth_is_ipa_supported(&c->options.ipa4, f) | ||
249 | #define qeth_is_enabled(c,f) \ | ||
250 | qeth_is_ipa_enabled(&c->options.ipa4, f) | ||
251 | #ifdef CONFIG_QETH_IPV6 | ||
252 | #define qeth_is_supported6(c,f) \ | ||
253 | qeth_is_ipa_supported(&c->options.ipa6, f) | ||
254 | #define qeth_is_enabled6(c,f) \ | ||
255 | qeth_is_ipa_enabled(&c->options.ipa6, f) | ||
256 | #else /* CONFIG_QETH_IPV6 */ | ||
257 | #define qeth_is_supported6(c,f) 0 | ||
258 | #define qeth_is_enabled6(c,f) 0 | ||
259 | #endif /* CONFIG_QETH_IPV6 */ | ||
260 | #define qeth_is_ipafunc_supported(c,prot,f) \ | ||
261 | (prot==QETH_PROT_IPV6)? qeth_is_supported6(c,f):qeth_is_supported(c,f) | ||
262 | #define qeth_is_ipafunc_enabled(c,prot,f) \ | ||
263 | (prot==QETH_PROT_IPV6)? qeth_is_enabled6(c,f):qeth_is_enabled(c,f) | ||
264 | |||
265 | |||
266 | #define QETH_IDX_FUNC_LEVEL_OSAE_ENA_IPAT 0x0101 | ||
267 | #define QETH_IDX_FUNC_LEVEL_OSAE_DIS_IPAT 0x0101 | ||
268 | #define QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT 0x4108 | ||
269 | #define QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT 0x5108 | ||
270 | |||
271 | #define QETH_MODELLIST_ARRAY \ | ||
272 | {{0x1731,0x01,0x1732,0x01,QETH_CARD_TYPE_OSAE,1, \ | ||
273 | QETH_IDX_FUNC_LEVEL_OSAE_ENA_IPAT, \ | ||
274 | QETH_IDX_FUNC_LEVEL_OSAE_DIS_IPAT, \ | ||
275 | QETH_MAX_QUEUES,0}, \ | ||
276 | {0x1731,0x05,0x1732,0x05,QETH_CARD_TYPE_IQD,0, \ | ||
277 | QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT, \ | ||
278 | QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT, \ | ||
279 | QETH_MAX_QUEUES,0x103}, \ | ||
280 | {0x1731,0x06,0x1732,0x06,QETH_CARD_TYPE_OSN,0, \ | ||
281 | QETH_IDX_FUNC_LEVEL_OSAE_ENA_IPAT, \ | ||
282 | QETH_IDX_FUNC_LEVEL_OSAE_DIS_IPAT, \ | ||
283 | QETH_MAX_QUEUES,0}, \ | ||
284 | {0,0,0,0,0,0,0,0,0}} | ||
285 | |||
286 | #define QETH_REAL_CARD 1 | ||
287 | #define QETH_VLAN_CARD 2 | ||
288 | #define QETH_BUFSIZE 4096 | ||
289 | |||
290 | /** | ||
291 | * some more defs | ||
292 | */ | ||
293 | #define IF_NAME_LEN 16 | ||
294 | #define QETH_TX_TIMEOUT 100 * HZ | ||
295 | #define QETH_RCD_TIMEOUT 60 * HZ | ||
296 | #define QETH_HEADER_SIZE 32 | ||
297 | #define MAX_PORTNO 15 | ||
298 | #define QETH_FAKE_LL_LEN_ETH ETH_HLEN | ||
299 | #define QETH_FAKE_LL_LEN_TR (sizeof(struct trh_hdr)-TR_MAXRIFLEN+sizeof(struct trllc)) | ||
300 | #define QETH_FAKE_LL_V6_ADDR_POS 24 | ||
301 | |||
302 | /*IPv6 address autoconfiguration stuff*/ | ||
303 | #define UNIQUE_ID_IF_CREATE_ADDR_FAILED 0xfffe | ||
304 | #define UNIQUE_ID_NOT_BY_CARD 0x10000 | ||
305 | |||
306 | /*****************************************************************************/ | ||
307 | /* QDIO queue and buffer handling */ | ||
308 | /*****************************************************************************/ | ||
309 | #define QETH_MAX_QUEUES 4 | ||
310 | #define QETH_IN_BUF_SIZE_DEFAULT 65536 | ||
311 | #define QETH_IN_BUF_COUNT_DEFAULT 16 | ||
312 | #define QETH_IN_BUF_COUNT_MIN 8 | ||
313 | #define QETH_IN_BUF_COUNT_MAX 128 | ||
314 | #define QETH_MAX_BUFFER_ELEMENTS(card) ((card)->qdio.in_buf_size >> 12) | ||
315 | #define QETH_IN_BUF_REQUEUE_THRESHOLD(card) \ | ||
316 | ((card)->qdio.in_buf_pool.buf_count / 2) | ||
317 | |||
318 | /* buffers we have to be behind before we get a PCI */ | ||
319 | #define QETH_PCI_THRESHOLD_A(card) ((card)->qdio.in_buf_pool.buf_count+1) | ||
320 | /*enqueued free buffers left before we get a PCI*/ | ||
321 | #define QETH_PCI_THRESHOLD_B(card) 0 | ||
322 | /*not used unless the microcode gets patched*/ | ||
323 | #define QETH_PCI_TIMER_VALUE(card) 3 | ||
324 | |||
325 | #define QETH_MIN_INPUT_THRESHOLD 1 | ||
326 | #define QETH_MAX_INPUT_THRESHOLD 500 | ||
327 | #define QETH_MIN_OUTPUT_THRESHOLD 1 | ||
328 | #define QETH_MAX_OUTPUT_THRESHOLD 300 | ||
329 | |||
330 | /* priority queing */ | ||
331 | #define QETH_PRIOQ_DEFAULT QETH_NO_PRIO_QUEUEING | ||
332 | #define QETH_DEFAULT_QUEUE 2 | ||
333 | #define QETH_NO_PRIO_QUEUEING 0 | ||
334 | #define QETH_PRIO_Q_ING_PREC 1 | ||
335 | #define QETH_PRIO_Q_ING_TOS 2 | ||
336 | #define IP_TOS_LOWDELAY 0x10 | ||
337 | #define IP_TOS_HIGHTHROUGHPUT 0x08 | ||
338 | #define IP_TOS_HIGHRELIABILITY 0x04 | ||
339 | #define IP_TOS_NOTIMPORTANT 0x02 | ||
340 | |||
341 | /* Packing */ | ||
342 | #define QETH_LOW_WATERMARK_PACK 2 | ||
343 | #define QETH_HIGH_WATERMARK_PACK 5 | ||
344 | #define QETH_WATERMARK_PACK_FUZZ 1 | ||
345 | |||
346 | #define QETH_IP_HEADER_SIZE 40 | ||
347 | |||
348 | /* large receive scatter gather copy break */ | ||
349 | #define QETH_RX_SG_CB (PAGE_SIZE >> 1) | ||
350 | |||
351 | struct qeth_hdr_layer3 { | ||
352 | __u8 id; | ||
353 | __u8 flags; | ||
354 | __u16 inbound_checksum; /*TSO:__u16 seqno */ | ||
355 | __u32 token; /*TSO: __u32 reserved */ | ||
356 | __u16 length; | ||
357 | __u8 vlan_prio; | ||
358 | __u8 ext_flags; | ||
359 | __u16 vlan_id; | ||
360 | __u16 frame_offset; | ||
361 | __u8 dest_addr[16]; | ||
362 | } __attribute__ ((packed)); | ||
363 | |||
364 | struct qeth_hdr_layer2 { | ||
365 | __u8 id; | ||
366 | __u8 flags[3]; | ||
367 | __u8 port_no; | ||
368 | __u8 hdr_length; | ||
369 | __u16 pkt_length; | ||
370 | __u16 seq_no; | ||
371 | __u16 vlan_id; | ||
372 | __u32 reserved; | ||
373 | __u8 reserved2[16]; | ||
374 | } __attribute__ ((packed)); | ||
375 | |||
376 | struct qeth_hdr_osn { | ||
377 | __u8 id; | ||
378 | __u8 reserved; | ||
379 | __u16 seq_no; | ||
380 | __u16 reserved2; | ||
381 | __u16 control_flags; | ||
382 | __u16 pdu_length; | ||
383 | __u8 reserved3[18]; | ||
384 | __u32 ccid; | ||
385 | } __attribute__ ((packed)); | ||
386 | |||
387 | struct qeth_hdr { | ||
388 | union { | ||
389 | struct qeth_hdr_layer2 l2; | ||
390 | struct qeth_hdr_layer3 l3; | ||
391 | struct qeth_hdr_osn osn; | ||
392 | } hdr; | ||
393 | } __attribute__ ((packed)); | ||
394 | |||
395 | /*TCP Segmentation Offload header*/ | ||
396 | struct qeth_hdr_ext_tso { | ||
397 | __u16 hdr_tot_len; | ||
398 | __u8 imb_hdr_no; | ||
399 | __u8 reserved; | ||
400 | __u8 hdr_type; | ||
401 | __u8 hdr_version; | ||
402 | __u16 hdr_len; | ||
403 | __u32 payload_len; | ||
404 | __u16 mss; | ||
405 | __u16 dg_hdr_len; | ||
406 | __u8 padding[16]; | ||
407 | } __attribute__ ((packed)); | ||
408 | |||
409 | struct qeth_hdr_tso { | ||
410 | struct qeth_hdr hdr; /*hdr->hdr.l3.xxx*/ | ||
411 | struct qeth_hdr_ext_tso ext; | ||
412 | } __attribute__ ((packed)); | ||
413 | |||
414 | |||
415 | /* flags for qeth_hdr.flags */ | ||
416 | #define QETH_HDR_PASSTHRU 0x10 | ||
417 | #define QETH_HDR_IPV6 0x80 | ||
418 | #define QETH_HDR_CAST_MASK 0x07 | ||
419 | enum qeth_cast_flags { | ||
420 | QETH_CAST_UNICAST = 0x06, | ||
421 | QETH_CAST_MULTICAST = 0x04, | ||
422 | QETH_CAST_BROADCAST = 0x05, | ||
423 | QETH_CAST_ANYCAST = 0x07, | ||
424 | QETH_CAST_NOCAST = 0x00, | ||
425 | }; | ||
426 | |||
427 | enum qeth_layer2_frame_flags { | ||
428 | QETH_LAYER2_FLAG_MULTICAST = 0x01, | ||
429 | QETH_LAYER2_FLAG_BROADCAST = 0x02, | ||
430 | QETH_LAYER2_FLAG_UNICAST = 0x04, | ||
431 | QETH_LAYER2_FLAG_VLAN = 0x10, | ||
432 | }; | ||
433 | |||
434 | enum qeth_header_ids { | ||
435 | QETH_HEADER_TYPE_LAYER3 = 0x01, | ||
436 | QETH_HEADER_TYPE_LAYER2 = 0x02, | ||
437 | QETH_HEADER_TYPE_TSO = 0x03, | ||
438 | QETH_HEADER_TYPE_OSN = 0x04, | ||
439 | }; | ||
440 | /* flags for qeth_hdr.ext_flags */ | ||
441 | #define QETH_HDR_EXT_VLAN_FRAME 0x01 | ||
442 | #define QETH_HDR_EXT_TOKEN_ID 0x02 | ||
443 | #define QETH_HDR_EXT_INCLUDE_VLAN_TAG 0x04 | ||
444 | #define QETH_HDR_EXT_SRC_MAC_ADDR 0x08 | ||
445 | #define QETH_HDR_EXT_CSUM_HDR_REQ 0x10 | ||
446 | #define QETH_HDR_EXT_CSUM_TRANSP_REQ 0x20 | ||
447 | #define QETH_HDR_EXT_UDP_TSO 0x40 /*bit off for TCP*/ | ||
448 | |||
449 | static inline int | ||
450 | qeth_is_last_sbale(struct qdio_buffer_element *sbale) | ||
451 | { | ||
452 | return (sbale->flags & SBAL_FLAGS_LAST_ENTRY); | ||
453 | } | ||
454 | |||
455 | enum qeth_qdio_buffer_states { | ||
456 | /* | ||
457 | * inbound: read out by driver; owned by hardware in order to be filled | ||
458 | * outbound: owned by driver in order to be filled | ||
459 | */ | ||
460 | QETH_QDIO_BUF_EMPTY, | ||
461 | /* | ||
462 | * inbound: filled by hardware; owned by driver in order to be read out | ||
463 | * outbound: filled by driver; owned by hardware in order to be sent | ||
464 | */ | ||
465 | QETH_QDIO_BUF_PRIMED, | ||
466 | }; | ||
467 | |||
468 | enum qeth_qdio_info_states { | ||
469 | QETH_QDIO_UNINITIALIZED, | ||
470 | QETH_QDIO_ALLOCATED, | ||
471 | QETH_QDIO_ESTABLISHED, | ||
472 | QETH_QDIO_CLEANING | ||
473 | }; | ||
474 | |||
475 | struct qeth_buffer_pool_entry { | ||
476 | struct list_head list; | ||
477 | struct list_head init_list; | ||
478 | void *elements[QDIO_MAX_ELEMENTS_PER_BUFFER]; | ||
479 | }; | ||
480 | |||
481 | struct qeth_qdio_buffer_pool { | ||
482 | struct list_head entry_list; | ||
483 | int buf_count; | ||
484 | }; | ||
485 | |||
486 | struct qeth_qdio_buffer { | ||
487 | struct qdio_buffer *buffer; | ||
488 | volatile enum qeth_qdio_buffer_states state; | ||
489 | /* the buffer pool entry currently associated to this buffer */ | ||
490 | struct qeth_buffer_pool_entry *pool_entry; | ||
491 | }; | ||
492 | |||
493 | struct qeth_qdio_q { | ||
494 | struct qdio_buffer qdio_bufs[QDIO_MAX_BUFFERS_PER_Q]; | ||
495 | struct qeth_qdio_buffer bufs[QDIO_MAX_BUFFERS_PER_Q]; | ||
496 | /* | ||
497 | * buf_to_init means "buffer must be initialized by driver and must | ||
498 | * be made available for hardware" -> state is set to EMPTY | ||
499 | */ | ||
500 | volatile int next_buf_to_init; | ||
501 | } __attribute__ ((aligned(256))); | ||
502 | |||
503 | /* possible types of qeth large_send support */ | ||
504 | enum qeth_large_send_types { | ||
505 | QETH_LARGE_SEND_NO, | ||
506 | QETH_LARGE_SEND_EDDP, | ||
507 | QETH_LARGE_SEND_TSO, | ||
508 | }; | ||
509 | |||
510 | struct qeth_qdio_out_buffer { | ||
511 | struct qdio_buffer *buffer; | ||
512 | atomic_t state; | ||
513 | volatile int next_element_to_fill; | ||
514 | struct sk_buff_head skb_list; | ||
515 | struct list_head ctx_list; | ||
516 | }; | ||
517 | |||
518 | struct qeth_card; | ||
519 | |||
520 | enum qeth_out_q_states { | ||
521 | QETH_OUT_Q_UNLOCKED, | ||
522 | QETH_OUT_Q_LOCKED, | ||
523 | QETH_OUT_Q_LOCKED_FLUSH, | ||
524 | }; | ||
525 | |||
526 | struct qeth_qdio_out_q { | ||
527 | struct qdio_buffer qdio_bufs[QDIO_MAX_BUFFERS_PER_Q]; | ||
528 | struct qeth_qdio_out_buffer bufs[QDIO_MAX_BUFFERS_PER_Q]; | ||
529 | int queue_no; | ||
530 | struct qeth_card *card; | ||
531 | atomic_t state; | ||
532 | volatile int do_pack; | ||
533 | /* | ||
534 | * index of buffer to be filled by driver; state EMPTY or PACKING | ||
535 | */ | ||
536 | volatile int next_buf_to_fill; | ||
537 | /* | ||
538 | * number of buffers that are currently filled (PRIMED) | ||
539 | * -> these buffers are hardware-owned | ||
540 | */ | ||
541 | atomic_t used_buffers; | ||
542 | /* indicates whether PCI flag must be set (or if one is outstanding) */ | ||
543 | atomic_t set_pci_flags_count; | ||
544 | } __attribute__ ((aligned(256))); | ||
545 | |||
546 | struct qeth_qdio_info { | ||
547 | atomic_t state; | ||
548 | /* input */ | ||
549 | struct qeth_qdio_q *in_q; | ||
550 | struct qeth_qdio_buffer_pool in_buf_pool; | ||
551 | struct qeth_qdio_buffer_pool init_pool; | ||
552 | int in_buf_size; | ||
553 | |||
554 | /* output */ | ||
555 | int no_out_queues; | ||
556 | struct qeth_qdio_out_q **out_qs; | ||
557 | |||
558 | /* priority queueing */ | ||
559 | int do_prio_queueing; | ||
560 | int default_out_queue; | ||
561 | }; | ||
562 | |||
563 | enum qeth_send_errors { | ||
564 | QETH_SEND_ERROR_NONE, | ||
565 | QETH_SEND_ERROR_LINK_FAILURE, | ||
566 | QETH_SEND_ERROR_RETRY, | ||
567 | QETH_SEND_ERROR_KICK_IT, | ||
568 | }; | ||
569 | |||
570 | #define QETH_ETH_MAC_V4 0x0100 /* like v4 */ | ||
571 | #define QETH_ETH_MAC_V6 0x3333 /* like v6 */ | ||
572 | /* tr mc mac is longer, but that will be enough to detect mc frames */ | ||
573 | #define QETH_TR_MAC_NC 0xc000 /* non-canonical */ | ||
574 | #define QETH_TR_MAC_C 0x0300 /* canonical */ | ||
575 | |||
576 | #define DEFAULT_ADD_HHLEN 0 | ||
577 | #define MAX_ADD_HHLEN 1024 | ||
578 | |||
579 | /** | ||
580 | * buffer stuff for read channel | ||
581 | */ | ||
582 | #define QETH_CMD_BUFFER_NO 8 | ||
583 | |||
584 | /** | ||
585 | * channel state machine | ||
586 | */ | ||
587 | enum qeth_channel_states { | ||
588 | CH_STATE_UP, | ||
589 | CH_STATE_DOWN, | ||
590 | CH_STATE_ACTIVATING, | ||
591 | CH_STATE_HALTED, | ||
592 | CH_STATE_STOPPED, | ||
593 | CH_STATE_RCD, | ||
594 | CH_STATE_RCD_DONE, | ||
595 | }; | ||
596 | /** | ||
597 | * card state machine | ||
598 | */ | ||
599 | enum qeth_card_states { | ||
600 | CARD_STATE_DOWN, | ||
601 | CARD_STATE_HARDSETUP, | ||
602 | CARD_STATE_SOFTSETUP, | ||
603 | CARD_STATE_UP, | ||
604 | CARD_STATE_RECOVER, | ||
605 | }; | ||
606 | |||
607 | /** | ||
608 | * Protocol versions | ||
609 | */ | ||
610 | enum qeth_prot_versions { | ||
611 | QETH_PROT_IPV4 = 0x0004, | ||
612 | QETH_PROT_IPV6 = 0x0006, | ||
613 | }; | ||
614 | |||
615 | enum qeth_ip_types { | ||
616 | QETH_IP_TYPE_NORMAL, | ||
617 | QETH_IP_TYPE_VIPA, | ||
618 | QETH_IP_TYPE_RXIP, | ||
619 | QETH_IP_TYPE_DEL_ALL_MC, | ||
620 | }; | ||
621 | |||
622 | enum qeth_cmd_buffer_state { | ||
623 | BUF_STATE_FREE, | ||
624 | BUF_STATE_LOCKED, | ||
625 | BUF_STATE_PROCESSED, | ||
626 | }; | ||
627 | /** | ||
628 | * IP address and multicast list | ||
629 | */ | ||
630 | struct qeth_ipaddr { | ||
631 | struct list_head entry; | ||
632 | enum qeth_ip_types type; | ||
633 | enum qeth_ipa_setdelip_flags set_flags; | ||
634 | enum qeth_ipa_setdelip_flags del_flags; | ||
635 | int is_multicast; | ||
636 | volatile int users; | ||
637 | enum qeth_prot_versions proto; | ||
638 | unsigned char mac[OSA_ADDR_LEN]; | ||
639 | union { | ||
640 | struct { | ||
641 | unsigned int addr; | ||
642 | unsigned int mask; | ||
643 | } a4; | ||
644 | struct { | ||
645 | struct in6_addr addr; | ||
646 | unsigned int pfxlen; | ||
647 | } a6; | ||
648 | } u; | ||
649 | }; | ||
650 | |||
651 | struct qeth_ipato_entry { | ||
652 | struct list_head entry; | ||
653 | enum qeth_prot_versions proto; | ||
654 | char addr[16]; | ||
655 | int mask_bits; | ||
656 | }; | ||
657 | |||
658 | struct qeth_ipato { | ||
659 | int enabled; | ||
660 | int invert4; | ||
661 | int invert6; | ||
662 | struct list_head entries; | ||
663 | }; | ||
664 | |||
665 | struct qeth_channel; | ||
666 | |||
667 | struct qeth_cmd_buffer { | ||
668 | enum qeth_cmd_buffer_state state; | ||
669 | struct qeth_channel *channel; | ||
670 | unsigned char *data; | ||
671 | int rc; | ||
672 | void (*callback) (struct qeth_channel *, struct qeth_cmd_buffer *); | ||
673 | }; | ||
674 | |||
675 | |||
676 | /** | ||
677 | * definition of a qeth channel, used for read and write | ||
678 | */ | ||
679 | struct qeth_channel { | ||
680 | enum qeth_channel_states state; | ||
681 | struct ccw1 ccw; | ||
682 | spinlock_t iob_lock; | ||
683 | wait_queue_head_t wait_q; | ||
684 | struct tasklet_struct irq_tasklet; | ||
685 | struct ccw_device *ccwdev; | ||
686 | /*command buffer for control data*/ | ||
687 | struct qeth_cmd_buffer iob[QETH_CMD_BUFFER_NO]; | ||
688 | atomic_t irq_pending; | ||
689 | volatile int io_buf_no; | ||
690 | volatile int buf_no; | ||
691 | }; | ||
692 | |||
693 | /** | ||
694 | * OSA card related definitions | ||
695 | */ | ||
696 | struct qeth_token { | ||
697 | __u32 issuer_rm_w; | ||
698 | __u32 issuer_rm_r; | ||
699 | __u32 cm_filter_w; | ||
700 | __u32 cm_filter_r; | ||
701 | __u32 cm_connection_w; | ||
702 | __u32 cm_connection_r; | ||
703 | __u32 ulp_filter_w; | ||
704 | __u32 ulp_filter_r; | ||
705 | __u32 ulp_connection_w; | ||
706 | __u32 ulp_connection_r; | ||
707 | }; | ||
708 | |||
709 | struct qeth_seqno { | ||
710 | __u32 trans_hdr; | ||
711 | __u32 pdu_hdr; | ||
712 | __u32 pdu_hdr_ack; | ||
713 | __u16 ipa; | ||
714 | __u32 pkt_seqno; | ||
715 | }; | ||
716 | |||
717 | struct qeth_reply { | ||
718 | struct list_head list; | ||
719 | wait_queue_head_t wait_q; | ||
720 | int (*callback)(struct qeth_card *,struct qeth_reply *,unsigned long); | ||
721 | u32 seqno; | ||
722 | unsigned long offset; | ||
723 | atomic_t received; | ||
724 | int rc; | ||
725 | void *param; | ||
726 | struct qeth_card *card; | ||
727 | atomic_t refcnt; | ||
728 | }; | ||
729 | |||
730 | |||
731 | struct qeth_card_blkt { | ||
732 | int time_total; | ||
733 | int inter_packet; | ||
734 | int inter_packet_jumbo; | ||
735 | }; | ||
736 | |||
737 | #define QETH_BROADCAST_WITH_ECHO 0x01 | ||
738 | #define QETH_BROADCAST_WITHOUT_ECHO 0x02 | ||
739 | #define QETH_LAYER2_MAC_READ 0x01 | ||
740 | #define QETH_LAYER2_MAC_REGISTERED 0x02 | ||
741 | struct qeth_card_info { | ||
742 | unsigned short unit_addr2; | ||
743 | unsigned short cula; | ||
744 | unsigned short chpid; | ||
745 | __u16 func_level; | ||
746 | char mcl_level[QETH_MCL_LENGTH + 1]; | ||
747 | int guestlan; | ||
748 | int mac_bits; | ||
749 | int portname_required; | ||
750 | int portno; | ||
751 | char portname[9]; | ||
752 | enum qeth_card_types type; | ||
753 | enum qeth_link_types link_type; | ||
754 | int is_multicast_different; | ||
755 | int initial_mtu; | ||
756 | int max_mtu; | ||
757 | int broadcast_capable; | ||
758 | int unique_id; | ||
759 | struct qeth_card_blkt blkt; | ||
760 | __u32 csum_mask; | ||
761 | enum qeth_ipa_promisc_modes promisc_mode; | ||
762 | }; | ||
763 | |||
764 | struct qeth_card_options { | ||
765 | struct qeth_routing_info route4; | ||
766 | struct qeth_ipa_info ipa4; | ||
767 | struct qeth_ipa_info adp; /*Adapter parameters*/ | ||
768 | #ifdef CONFIG_QETH_IPV6 | ||
769 | struct qeth_routing_info route6; | ||
770 | struct qeth_ipa_info ipa6; | ||
771 | #endif /* QETH_IPV6 */ | ||
772 | enum qeth_checksum_types checksum_type; | ||
773 | int broadcast_mode; | ||
774 | int macaddr_mode; | ||
775 | int fake_broadcast; | ||
776 | int add_hhlen; | ||
777 | int fake_ll; | ||
778 | int layer2; | ||
779 | enum qeth_large_send_types large_send; | ||
780 | int performance_stats; | ||
781 | int rx_sg_cb; | ||
782 | }; | ||
783 | |||
784 | /* | ||
785 | * thread bits for qeth_card thread masks | ||
786 | */ | ||
787 | enum qeth_threads { | ||
788 | QETH_SET_IP_THREAD = 1, | ||
789 | QETH_RECOVER_THREAD = 2, | ||
790 | QETH_SET_PROMISC_MODE_THREAD = 4, | ||
791 | }; | ||
792 | |||
793 | struct qeth_osn_info { | ||
794 | int (*assist_cb)(struct net_device *dev, void *data); | ||
795 | int (*data_cb)(struct sk_buff *skb); | ||
796 | }; | ||
797 | |||
798 | struct qeth_card { | ||
799 | struct list_head list; | ||
800 | enum qeth_card_states state; | ||
801 | int lan_online; | ||
802 | spinlock_t lock; | ||
803 | /*hardware and sysfs stuff*/ | ||
804 | struct ccwgroup_device *gdev; | ||
805 | struct qeth_channel read; | ||
806 | struct qeth_channel write; | ||
807 | struct qeth_channel data; | ||
808 | |||
809 | struct net_device *dev; | ||
810 | struct net_device_stats stats; | ||
811 | |||
812 | struct qeth_card_info info; | ||
813 | struct qeth_token token; | ||
814 | struct qeth_seqno seqno; | ||
815 | struct qeth_card_options options; | ||
816 | |||
817 | wait_queue_head_t wait_q; | ||
818 | #ifdef CONFIG_QETH_VLAN | ||
819 | spinlock_t vlanlock; | ||
820 | struct vlan_group *vlangrp; | ||
821 | #endif | ||
822 | struct work_struct kernel_thread_starter; | ||
823 | spinlock_t thread_mask_lock; | ||
824 | volatile unsigned long thread_start_mask; | ||
825 | volatile unsigned long thread_allowed_mask; | ||
826 | volatile unsigned long thread_running_mask; | ||
827 | spinlock_t ip_lock; | ||
828 | struct list_head ip_list; | ||
829 | struct list_head *ip_tbd_list; | ||
830 | struct qeth_ipato ipato; | ||
831 | struct list_head cmd_waiter_list; | ||
832 | /* QDIO buffer handling */ | ||
833 | struct qeth_qdio_info qdio; | ||
834 | struct qeth_perf_stats perf_stats; | ||
835 | int use_hard_stop; | ||
836 | const struct header_ops *orig_header_ops; | ||
837 | struct qeth_osn_info osn_info; | ||
838 | atomic_t force_alloc_skb; | ||
839 | }; | ||
840 | |||
841 | struct qeth_card_list_struct { | ||
842 | struct list_head list; | ||
843 | rwlock_t rwlock; | ||
844 | }; | ||
845 | |||
846 | extern struct qeth_card_list_struct qeth_card_list; | ||
847 | |||
848 | /*notifier list */ | ||
849 | struct qeth_notify_list_struct { | ||
850 | struct list_head list; | ||
851 | struct task_struct *task; | ||
852 | int signum; | ||
853 | }; | ||
854 | extern spinlock_t qeth_notify_lock; | ||
855 | extern struct list_head qeth_notify_list; | ||
856 | |||
857 | /*some helper functions*/ | ||
858 | |||
859 | #define QETH_CARD_IFNAME(card) (((card)->dev)? (card)->dev->name : "") | ||
860 | |||
861 | static inline __u8 | ||
862 | qeth_get_ipa_adp_type(enum qeth_link_types link_type) | ||
863 | { | ||
864 | switch (link_type) { | ||
865 | case QETH_LINK_TYPE_HSTR: | ||
866 | return 2; | ||
867 | default: | ||
868 | return 1; | ||
869 | } | ||
870 | } | ||
871 | |||
872 | static inline struct sk_buff * | ||
873 | qeth_realloc_headroom(struct qeth_card *card, struct sk_buff *skb, int size) | ||
874 | { | ||
875 | struct sk_buff *new_skb = skb; | ||
876 | |||
877 | if (skb_headroom(skb) >= size) | ||
878 | return skb; | ||
879 | new_skb = skb_realloc_headroom(skb, size); | ||
880 | if (!new_skb) | ||
881 | PRINT_ERR("Could not realloc headroom for qeth_hdr " | ||
882 | "on interface %s", QETH_CARD_IFNAME(card)); | ||
883 | return new_skb; | ||
884 | } | ||
885 | |||
886 | static inline struct sk_buff * | ||
887 | qeth_pskb_unshare(struct sk_buff *skb, gfp_t pri) | ||
888 | { | ||
889 | struct sk_buff *nskb; | ||
890 | if (!skb_cloned(skb)) | ||
891 | return skb; | ||
892 | nskb = skb_copy(skb, pri); | ||
893 | return nskb; | ||
894 | } | ||
895 | |||
896 | static inline void * | ||
897 | qeth_push_skb(struct qeth_card *card, struct sk_buff *skb, int size) | ||
898 | { | ||
899 | void *hdr; | ||
900 | |||
901 | hdr = (void *) skb_push(skb, size); | ||
902 | /* | ||
903 | * sanity check, the Linux memory allocation scheme should | ||
904 | * never present us cases like this one (the qdio header size plus | ||
905 | * the first 40 bytes of the paket cross a 4k boundary) | ||
906 | */ | ||
907 | if ((((unsigned long) hdr) & (~(PAGE_SIZE - 1))) != | ||
908 | (((unsigned long) hdr + size + | ||
909 | QETH_IP_HEADER_SIZE) & (~(PAGE_SIZE - 1)))) { | ||
910 | PRINT_ERR("Misaligned packet on interface %s. Discarded.", | ||
911 | QETH_CARD_IFNAME(card)); | ||
912 | return NULL; | ||
913 | } | ||
914 | return hdr; | ||
915 | } | ||
916 | |||
917 | |||
918 | static inline int | ||
919 | qeth_get_hlen(__u8 link_type) | ||
920 | { | ||
921 | #ifdef CONFIG_QETH_IPV6 | ||
922 | switch (link_type) { | ||
923 | case QETH_LINK_TYPE_HSTR: | ||
924 | case QETH_LINK_TYPE_LANE_TR: | ||
925 | return sizeof(struct qeth_hdr_tso) + TR_HLEN; | ||
926 | default: | ||
927 | #ifdef CONFIG_QETH_VLAN | ||
928 | return sizeof(struct qeth_hdr_tso) + VLAN_ETH_HLEN; | ||
929 | #else | ||
930 | return sizeof(struct qeth_hdr_tso) + ETH_HLEN; | ||
931 | #endif | ||
932 | } | ||
933 | #else /* CONFIG_QETH_IPV6 */ | ||
934 | #ifdef CONFIG_QETH_VLAN | ||
935 | return sizeof(struct qeth_hdr_tso) + VLAN_HLEN; | ||
936 | #else | ||
937 | return sizeof(struct qeth_hdr_tso); | ||
938 | #endif | ||
939 | #endif /* CONFIG_QETH_IPV6 */ | ||
940 | } | ||
941 | |||
942 | static inline unsigned short | ||
943 | qeth_get_netdev_flags(struct qeth_card *card) | ||
944 | { | ||
945 | if (card->options.layer2 && | ||
946 | (card->info.type == QETH_CARD_TYPE_OSAE)) | ||
947 | return 0; | ||
948 | switch (card->info.type) { | ||
949 | case QETH_CARD_TYPE_IQD: | ||
950 | case QETH_CARD_TYPE_OSN: | ||
951 | return IFF_NOARP; | ||
952 | #ifdef CONFIG_QETH_IPV6 | ||
953 | default: | ||
954 | return 0; | ||
955 | #else | ||
956 | default: | ||
957 | return IFF_NOARP; | ||
958 | #endif | ||
959 | } | ||
960 | } | ||
961 | |||
962 | static inline int | ||
963 | qeth_get_initial_mtu_for_card(struct qeth_card * card) | ||
964 | { | ||
965 | switch (card->info.type) { | ||
966 | case QETH_CARD_TYPE_UNKNOWN: | ||
967 | return 1500; | ||
968 | case QETH_CARD_TYPE_IQD: | ||
969 | return card->info.max_mtu; | ||
970 | case QETH_CARD_TYPE_OSAE: | ||
971 | switch (card->info.link_type) { | ||
972 | case QETH_LINK_TYPE_HSTR: | ||
973 | case QETH_LINK_TYPE_LANE_TR: | ||
974 | return 2000; | ||
975 | default: | ||
976 | return 1492; | ||
977 | } | ||
978 | default: | ||
979 | return 1500; | ||
980 | } | ||
981 | } | ||
982 | |||
983 | static inline int | ||
984 | qeth_get_max_mtu_for_card(int cardtype) | ||
985 | { | ||
986 | switch (cardtype) { | ||
987 | |||
988 | case QETH_CARD_TYPE_UNKNOWN: | ||
989 | case QETH_CARD_TYPE_OSAE: | ||
990 | case QETH_CARD_TYPE_OSN: | ||
991 | return 61440; | ||
992 | case QETH_CARD_TYPE_IQD: | ||
993 | return 57344; | ||
994 | default: | ||
995 | return 1500; | ||
996 | } | ||
997 | } | ||
998 | |||
999 | static inline int | ||
1000 | qeth_get_mtu_out_of_mpc(int cardtype) | ||
1001 | { | ||
1002 | switch (cardtype) { | ||
1003 | case QETH_CARD_TYPE_IQD: | ||
1004 | return 1; | ||
1005 | default: | ||
1006 | return 0; | ||
1007 | } | ||
1008 | } | ||
1009 | |||
1010 | static inline int | ||
1011 | qeth_get_mtu_outof_framesize(int framesize) | ||
1012 | { | ||
1013 | switch (framesize) { | ||
1014 | case 0x4000: | ||
1015 | return 8192; | ||
1016 | case 0x6000: | ||
1017 | return 16384; | ||
1018 | case 0xa000: | ||
1019 | return 32768; | ||
1020 | case 0xffff: | ||
1021 | return 57344; | ||
1022 | default: | ||
1023 | return 0; | ||
1024 | } | ||
1025 | } | ||
1026 | |||
1027 | static inline int | ||
1028 | qeth_mtu_is_valid(struct qeth_card * card, int mtu) | ||
1029 | { | ||
1030 | switch (card->info.type) { | ||
1031 | case QETH_CARD_TYPE_OSAE: | ||
1032 | return ((mtu >= 576) && (mtu <= 61440)); | ||
1033 | case QETH_CARD_TYPE_IQD: | ||
1034 | return ((mtu >= 576) && | ||
1035 | (mtu <= card->info.max_mtu + 4096 - 32)); | ||
1036 | case QETH_CARD_TYPE_OSN: | ||
1037 | case QETH_CARD_TYPE_UNKNOWN: | ||
1038 | default: | ||
1039 | return 1; | ||
1040 | } | ||
1041 | } | ||
1042 | |||
1043 | static inline int | ||
1044 | qeth_get_arphdr_type(int cardtype, int linktype) | ||
1045 | { | ||
1046 | switch (cardtype) { | ||
1047 | case QETH_CARD_TYPE_OSAE: | ||
1048 | case QETH_CARD_TYPE_OSN: | ||
1049 | switch (linktype) { | ||
1050 | case QETH_LINK_TYPE_LANE_TR: | ||
1051 | case QETH_LINK_TYPE_HSTR: | ||
1052 | return ARPHRD_IEEE802_TR; | ||
1053 | default: | ||
1054 | return ARPHRD_ETHER; | ||
1055 | } | ||
1056 | case QETH_CARD_TYPE_IQD: | ||
1057 | default: | ||
1058 | return ARPHRD_ETHER; | ||
1059 | } | ||
1060 | } | ||
1061 | |||
1062 | static inline int | ||
1063 | qeth_get_micros(void) | ||
1064 | { | ||
1065 | return (int) (get_clock() >> 12); | ||
1066 | } | ||
1067 | |||
1068 | static inline int | ||
1069 | qeth_get_qdio_q_format(struct qeth_card *card) | ||
1070 | { | ||
1071 | switch (card->info.type) { | ||
1072 | case QETH_CARD_TYPE_IQD: | ||
1073 | return 2; | ||
1074 | default: | ||
1075 | return 0; | ||
1076 | } | ||
1077 | } | ||
1078 | |||
1079 | static inline int | ||
1080 | qeth_isxdigit(char * buf) | ||
1081 | { | ||
1082 | while (*buf) { | ||
1083 | if (!isxdigit(*buf++)) | ||
1084 | return 0; | ||
1085 | } | ||
1086 | return 1; | ||
1087 | } | ||
1088 | |||
1089 | static inline void | ||
1090 | qeth_ipaddr4_to_string(const __u8 *addr, char *buf) | ||
1091 | { | ||
1092 | sprintf(buf, "%i.%i.%i.%i", addr[0], addr[1], addr[2], addr[3]); | ||
1093 | } | ||
1094 | |||
1095 | static inline int | ||
1096 | qeth_string_to_ipaddr4(const char *buf, __u8 *addr) | ||
1097 | { | ||
1098 | int count = 0, rc = 0; | ||
1099 | int in[4]; | ||
1100 | char c; | ||
1101 | |||
1102 | rc = sscanf(buf, "%u.%u.%u.%u%c", | ||
1103 | &in[0], &in[1], &in[2], &in[3], &c); | ||
1104 | if (rc != 4 && (rc != 5 || c != '\n')) | ||
1105 | return -EINVAL; | ||
1106 | for (count = 0; count < 4; count++) { | ||
1107 | if (in[count] > 255) | ||
1108 | return -EINVAL; | ||
1109 | addr[count] = in[count]; | ||
1110 | } | ||
1111 | return 0; | ||
1112 | } | ||
1113 | |||
1114 | static inline void | ||
1115 | qeth_ipaddr6_to_string(const __u8 *addr, char *buf) | ||
1116 | { | ||
1117 | sprintf(buf, "%02x%02x:%02x%02x:%02x%02x:%02x%02x" | ||
1118 | ":%02x%02x:%02x%02x:%02x%02x:%02x%02x", | ||
1119 | addr[0], addr[1], addr[2], addr[3], | ||
1120 | addr[4], addr[5], addr[6], addr[7], | ||
1121 | addr[8], addr[9], addr[10], addr[11], | ||
1122 | addr[12], addr[13], addr[14], addr[15]); | ||
1123 | } | ||
1124 | |||
1125 | static inline int | ||
1126 | qeth_string_to_ipaddr6(const char *buf, __u8 *addr) | ||
1127 | { | ||
1128 | const char *end, *end_tmp, *start; | ||
1129 | __u16 *in; | ||
1130 | char num[5]; | ||
1131 | int num2, cnt, out, found, save_cnt; | ||
1132 | unsigned short in_tmp[8] = {0, }; | ||
1133 | |||
1134 | cnt = out = found = save_cnt = num2 = 0; | ||
1135 | end = start = buf; | ||
1136 | in = (__u16 *) addr; | ||
1137 | memset(in, 0, 16); | ||
1138 | while (*end) { | ||
1139 | end = strchr(start,':'); | ||
1140 | if (end == NULL) { | ||
1141 | end = buf + strlen(buf); | ||
1142 | if ((end_tmp = strchr(start, '\n')) != NULL) | ||
1143 | end = end_tmp; | ||
1144 | out = 1; | ||
1145 | } | ||
1146 | if ((end - start)) { | ||
1147 | memset(num, 0, 5); | ||
1148 | if ((end - start) > 4) | ||
1149 | return -EINVAL; | ||
1150 | memcpy(num, start, end - start); | ||
1151 | if (!qeth_isxdigit(num)) | ||
1152 | return -EINVAL; | ||
1153 | sscanf(start, "%x", &num2); | ||
1154 | if (found) | ||
1155 | in_tmp[save_cnt++] = num2; | ||
1156 | else | ||
1157 | in[cnt++] = num2; | ||
1158 | if (out) | ||
1159 | break; | ||
1160 | } else { | ||
1161 | if (found) | ||
1162 | return -EINVAL; | ||
1163 | found = 1; | ||
1164 | } | ||
1165 | start = ++end; | ||
1166 | } | ||
1167 | if (cnt + save_cnt > 8) | ||
1168 | return -EINVAL; | ||
1169 | cnt = 7; | ||
1170 | while (save_cnt) | ||
1171 | in[cnt--] = in_tmp[--save_cnt]; | ||
1172 | return 0; | ||
1173 | } | ||
1174 | |||
1175 | static inline void | ||
1176 | qeth_ipaddr_to_string(enum qeth_prot_versions proto, const __u8 *addr, | ||
1177 | char *buf) | ||
1178 | { | ||
1179 | if (proto == QETH_PROT_IPV4) | ||
1180 | qeth_ipaddr4_to_string(addr, buf); | ||
1181 | else if (proto == QETH_PROT_IPV6) | ||
1182 | qeth_ipaddr6_to_string(addr, buf); | ||
1183 | } | ||
1184 | |||
1185 | static inline int | ||
1186 | qeth_string_to_ipaddr(const char *buf, enum qeth_prot_versions proto, | ||
1187 | __u8 *addr) | ||
1188 | { | ||
1189 | if (proto == QETH_PROT_IPV4) | ||
1190 | return qeth_string_to_ipaddr4(buf, addr); | ||
1191 | else if (proto == QETH_PROT_IPV6) | ||
1192 | return qeth_string_to_ipaddr6(buf, addr); | ||
1193 | else | ||
1194 | return -EINVAL; | ||
1195 | } | ||
1196 | |||
1197 | extern int | ||
1198 | qeth_setrouting_v4(struct qeth_card *); | ||
1199 | extern int | ||
1200 | qeth_setrouting_v6(struct qeth_card *); | ||
1201 | |||
1202 | extern int | ||
1203 | qeth_add_ipato_entry(struct qeth_card *, struct qeth_ipato_entry *); | ||
1204 | |||
1205 | extern void | ||
1206 | qeth_del_ipato_entry(struct qeth_card *, enum qeth_prot_versions, u8 *, int); | ||
1207 | |||
1208 | extern int | ||
1209 | qeth_add_vipa(struct qeth_card *, enum qeth_prot_versions, const u8 *); | ||
1210 | |||
1211 | extern void | ||
1212 | qeth_del_vipa(struct qeth_card *, enum qeth_prot_versions, const u8 *); | ||
1213 | |||
1214 | extern int | ||
1215 | qeth_add_rxip(struct qeth_card *, enum qeth_prot_versions, const u8 *); | ||
1216 | |||
1217 | extern void | ||
1218 | qeth_del_rxip(struct qeth_card *, enum qeth_prot_versions, const u8 *); | ||
1219 | |||
1220 | extern int | ||
1221 | qeth_notifier_register(struct task_struct *, int ); | ||
1222 | |||
1223 | extern int | ||
1224 | qeth_notifier_unregister(struct task_struct * ); | ||
1225 | |||
1226 | extern void | ||
1227 | qeth_schedule_recovery(struct qeth_card *); | ||
1228 | |||
1229 | extern int | ||
1230 | qeth_realloc_buffer_pool(struct qeth_card *, int); | ||
1231 | |||
1232 | extern int | ||
1233 | qeth_set_large_send(struct qeth_card *, enum qeth_large_send_types); | ||
1234 | |||
1235 | extern void | ||
1236 | qeth_fill_header(struct qeth_card *, struct qeth_hdr *, | ||
1237 | struct sk_buff *, int, int); | ||
1238 | extern void | ||
1239 | qeth_flush_buffers(struct qeth_qdio_out_q *, int, int, int); | ||
1240 | |||
1241 | extern int | ||
1242 | qeth_osn_assist(struct net_device *, void *, int); | ||
1243 | |||
1244 | extern int | ||
1245 | qeth_osn_register(unsigned char *read_dev_no, | ||
1246 | struct net_device **, | ||
1247 | int (*assist_cb)(struct net_device *, void *), | ||
1248 | int (*data_cb)(struct sk_buff *)); | ||
1249 | |||
1250 | extern void | ||
1251 | qeth_osn_deregister(struct net_device *); | ||
1252 | |||
1253 | #endif /* __QETH_H__ */ | ||