2 * linux/drivers/s390/net/qeth_tso.h ($Revision: 1.5 $)
4 * Header file for qeth TCP Segmentation Offload support.
6 * Copyright 2004 IBM Corporation
8 * Author(s): Frank Pavlic <pavlic@de.ibm.com>
10 * $Revision: 1.5 $ $Date: 2005/04/01 21:40:41 $
13 #ifndef __QETH_TSO_H__
14 #define __QETH_TSO_H__
18 qeth_tso_send_packet(struct qeth_card *, struct sk_buff *,
19 struct qeth_qdio_out_q *, int , int);
21 struct qeth_hdr_ext_tso {
32 } __attribute__ ((packed));
35 struct qeth_hdr hdr; /*hdr->hdr.l3.xxx*/
36 struct qeth_hdr_ext_tso ext;
37 } __attribute__ ((packed));
39 /*some helper functions*/
41 qeth_get_elements_no(struct qeth_card *card, void *hdr, struct sk_buff *skb)
43 int elements_needed = 0;
45 if (skb_shinfo(skb)->nr_frags > 0)
46 elements_needed = (skb_shinfo(skb)->nr_frags + 1);
47 if (elements_needed == 0 )
48 elements_needed = 1 + (((((unsigned long) hdr) % PAGE_SIZE)
49 + skb->len) >> PAGE_SHIFT);
50 if (elements_needed > QETH_MAX_BUFFER_ELEMENTS(card)){
51 PRINT_ERR("qeth_do_send_packet: invalid size of "
52 "IP packet. Discarded.");
55 return elements_needed;
59 __qeth_fill_buffer_frag(struct sk_buff *skb, struct qdio_buffer *buffer,
60 int is_tso, int *next_element_to_fill)
62 int length = skb->len;
63 struct skb_frag_struct *frag;
69 fragno = skb_shinfo(skb)->nr_frags; /* start with last frag */
70 element = *next_element_to_fill + fragno;
73 frag = &skb_shinfo(skb)->frags[fragno - 1];
74 addr = (page_to_pfn(frag->page) << PAGE_SHIFT) +
76 buffer->element[element].addr = (char *)addr;
77 buffer->element[element].length = frag->size;
80 buffer->element[element].flags =
83 buffer->element[element].flags =
84 SBAL_FLAGS_MIDDLE_FRAG;
86 buffer->element[element].addr = skb->data;
87 buffer->element[element].length = length;
90 buffer->element[element].flags =
91 SBAL_FLAGS_MIDDLE_FRAG;
93 buffer->element[element].flags =
94 SBAL_FLAGS_FIRST_FRAG;
100 *next_element_to_fill += skb_shinfo(skb)->nr_frags + 1;
103 #endif /* __QETH_TSO_H__ */