int qeth_get_elements_no(struct qeth_card *card, struct sk_buff *skb,
                         int extra_elems, int data_offset);
 int qeth_get_elements_for_frags(struct sk_buff *);
-int qeth_do_send_packet_fast(struct qeth_card *, struct qeth_qdio_out_q *,
-                       struct sk_buff *, struct qeth_hdr *, int, int);
+int qeth_do_send_packet_fast(struct qeth_card *card,
+                            struct qeth_qdio_out_q *queue, struct sk_buff *skb,
+                            struct qeth_hdr *hdr, unsigned int offset,
+                            int hd_len);
 int qeth_do_send_packet(struct qeth_card *, struct qeth_qdio_out_q *,
                    struct sk_buff *, struct qeth_hdr *, int);
 int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 
 
 static inline void __qeth_fill_buffer(struct sk_buff *skb,
                                      struct qeth_qdio_out_buffer *buf,
-                                     bool is_first_elem, int offset)
+                                     bool is_first_elem, unsigned int offset)
 {
        struct qdio_buffer *buffer = buf->buffer;
        int element = buf->next_element_to_fill;
-       int length = skb_headlen(skb);
+       int length = skb_headlen(skb) - offset;
+       char *data = skb->data + offset;
        int length_here, cnt;
-       char *data;
        struct skb_frag_struct *frag;
 
-       data = skb->data;
-
-       if (offset >= 0) {
-               data = skb->data + offset;
-               length -= offset;
-       }
-
+       /* map linear part into buffer element(s) */
        while (length > 0) {
                /* length_here is the remaining amount of data in this page */
                length_here = PAGE_SIZE - ((unsigned long) data % PAGE_SIZE);
                element++;
        }
 
+       /* map page frags into buffer element(s) */
        for (cnt = 0; cnt < skb_shinfo(skb)->nr_frags; cnt++) {
                frag = &skb_shinfo(skb)->frags[cnt];
                data = (char *)page_to_phys(skb_frag_page(frag)) +
 }
 
 static inline int qeth_fill_buffer(struct qeth_qdio_out_q *queue,
-               struct qeth_qdio_out_buffer *buf, struct sk_buff *skb,
-               struct qeth_hdr *hdr, int offset, int hd_len)
+                                  struct qeth_qdio_out_buffer *buf,
+                                  struct sk_buff *skb, struct qeth_hdr *hdr,
+                                  unsigned int offset, int hd_len)
 {
        struct qdio_buffer *buffer;
        int flush_cnt = 0, hdr_len;
        refcount_inc(&skb->users);
        skb_queue_tail(&buf->skb_list, skb);
 
-       /*check first on TSO ....*/
        if (hdr->hdr.l3.id == QETH_HEADER_TYPE_TSO) {
                int element = buf->next_element_to_fill;
                is_first_elem = false;
                skb->len  -= hdr_len;
        }
 
-       if (offset >= 0) {
+       /* IQD */
+       if (offset > 0) {
                int element = buf->next_element_to_fill;
                is_first_elem = false;
 
 }
 
 int qeth_do_send_packet_fast(struct qeth_card *card,
-               struct qeth_qdio_out_q *queue, struct sk_buff *skb,
-               struct qeth_hdr *hdr, int offset, int hd_len)
+                            struct qeth_qdio_out_q *queue, struct sk_buff *skb,
+                            struct qeth_hdr *hdr, unsigned int offset,
+                            int hd_len)
 {
        struct qeth_qdio_out_buffer *buffer;
        int index;
                        }
                }
        }
-       tmp = qeth_fill_buffer(queue, buffer, skb, hdr, -1, 0);
+       tmp = qeth_fill_buffer(queue, buffer, skb, hdr, 0, 0);
        queue->next_buf_to_fill = (queue->next_buf_to_fill + tmp) %
                                  QDIO_MAX_BUFFERS_PER_Q;
        flush_count += tmp;