s390/qeth: pass TSO data offset to fill_buffer()
For TSO we need to skip the skb's qeth/IP/TCP headers when mapping it into buffer elements. Instead of (mis)using skb_pull(), pass a corresponding offset to fill_buffer() like we already do for IQDs. No actual change in the resulting TSO buffers. Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
13ddacb526
commit
9c3bfda999
|
@ -952,7 +952,7 @@ int qeth_do_send_packet_fast(struct qeth_card *card,
|
|||
unsigned int hd_len);
|
||||
int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
|
||||
struct sk_buff *skb, struct qeth_hdr *hdr,
|
||||
unsigned int hd_len, int elements);
|
||||
unsigned int hd_len, unsigned int offset, int elements);
|
||||
int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
|
||||
int qeth_core_get_sset_count(struct net_device *, int);
|
||||
void qeth_core_get_ethtool_stats(struct net_device *,
|
||||
|
|
|
@ -3975,11 +3975,8 @@ static int qeth_fill_buffer(struct qeth_qdio_out_q *queue,
|
|||
buffer->element[element].length = hd_len;
|
||||
buffer->element[element].eflags = SBAL_EFLAGS_FIRST_FRAG;
|
||||
buf->next_element_to_fill++;
|
||||
skb_pull(skb, hd_len);
|
||||
}
|
||||
|
||||
/* IQD */
|
||||
if (offset > 0) {
|
||||
} else if (offset) {
|
||||
int element = buf->next_element_to_fill;
|
||||
is_first_elem = false;
|
||||
|
||||
|
@ -4049,7 +4046,8 @@ EXPORT_SYMBOL_GPL(qeth_do_send_packet_fast);
|
|||
|
||||
int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
|
||||
struct sk_buff *skb, struct qeth_hdr *hdr,
|
||||
unsigned int hd_len, int elements_needed)
|
||||
unsigned int offset, unsigned int hd_len,
|
||||
int elements_needed)
|
||||
{
|
||||
struct qeth_qdio_out_buffer *buffer;
|
||||
int start_index;
|
||||
|
@ -4098,7 +4096,7 @@ int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
|
|||
}
|
||||
}
|
||||
}
|
||||
tmp = qeth_fill_buffer(queue, buffer, skb, hdr, 0, hd_len);
|
||||
tmp = qeth_fill_buffer(queue, buffer, skb, hdr, offset, hd_len);
|
||||
queue->next_buf_to_fill = (queue->next_buf_to_fill + tmp) %
|
||||
QDIO_MAX_BUFFERS_PER_Q;
|
||||
flush_count += tmp;
|
||||
|
|
|
@ -746,7 +746,7 @@ static int qeth_l2_xmit_osa(struct qeth_card *card, struct sk_buff *skb,
|
|||
rc = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
rc = qeth_do_send_packet(card, queue, skb_copy, hdr, 0, elements);
|
||||
rc = qeth_do_send_packet(card, queue, skb_copy, hdr, 0, 0, elements);
|
||||
out:
|
||||
if (!rc) {
|
||||
/* tx success, free dangling original */
|
||||
|
@ -778,7 +778,7 @@ static int qeth_l2_xmit_osn(struct qeth_card *card, struct sk_buff *skb,
|
|||
return -E2BIG;
|
||||
if (qeth_hdr_chk_and_bounce(skb, &hdr, sizeof(*hdr)))
|
||||
return -EINVAL;
|
||||
return qeth_do_send_packet(card, queue, skb, hdr, 0, elements);
|
||||
return qeth_do_send_packet(card, queue, skb, hdr, 0, 0, elements);
|
||||
}
|
||||
|
||||
static netdev_tx_t qeth_l2_hard_start_xmit(struct sk_buff *skb,
|
||||
|
|
|
@ -2768,7 +2768,7 @@ static netdev_tx_t qeth_l3_hard_start_xmit(struct sk_buff *skb,
|
|||
if (qeth_hdr_chk_and_bounce(new_skb, &hdr, len))
|
||||
goto tx_drop;
|
||||
rc = qeth_do_send_packet(card, queue, new_skb, hdr, hd_len,
|
||||
elements);
|
||||
hd_len, elements);
|
||||
} else
|
||||
rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr,
|
||||
data_offset, 0);
|
||||
|
|
Loading…
Reference in New Issue