Commit eaf3cc08 authored by Julian Wiedmann's avatar Julian Wiedmann Committed by David S. Miller

s390/qeth: unify code to build header elements

After plenty of refactoring, use hd_len as single indication that
the skb needs a dedicated header element.

This preserves existing behaviour for TSO, as 'hdr' always points
to skb->data.
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f1588177
...@@ -3953,37 +3953,38 @@ static void __qeth_fill_buffer(struct sk_buff *skb, ...@@ -3953,37 +3953,38 @@ static void __qeth_fill_buffer(struct sk_buff *skb,
buf->next_element_to_fill = element; buf->next_element_to_fill = element;
} }
/**
* qeth_fill_buffer() - map skb into an output buffer
* @queue: QDIO queue to submit the buffer on
* @buf: buffer to transport the skb
* @skb: skb to map into the buffer
* @hdr: qeth_hdr for this skb. Either at skb->data, or allocated
* from qeth_core_header_cache.
* @offset: when mapping the skb, start at skb->data + offset
* @hd_len: if > 0, build a dedicated header element of this size
*/
static int qeth_fill_buffer(struct qeth_qdio_out_q *queue, static int qeth_fill_buffer(struct qeth_qdio_out_q *queue,
struct qeth_qdio_out_buffer *buf, struct qeth_qdio_out_buffer *buf,
struct sk_buff *skb, struct qeth_hdr *hdr, struct sk_buff *skb, struct qeth_hdr *hdr,
unsigned int offset, unsigned int hd_len) unsigned int offset, unsigned int hd_len)
{ {
struct qdio_buffer *buffer; struct qdio_buffer *buffer = buf->buffer;
bool is_first_elem = true; bool is_first_elem = true;
int flush_cnt = 0; int flush_cnt = 0;
buffer = buf->buffer;
refcount_inc(&skb->users); refcount_inc(&skb->users);
skb_queue_tail(&buf->skb_list, skb); skb_queue_tail(&buf->skb_list, skb);
if (hdr->hdr.l3.id == QETH_HEADER_TYPE_TSO) { /* build dedicated header element */
int element = buf->next_element_to_fill; if (hd_len) {
is_first_elem = false;
/*fill first buffer entry only with header information */
buffer->element[element].addr = skb->data;
buffer->element[element].length = hd_len;
buffer->element[element].eflags = SBAL_EFLAGS_FIRST_FRAG;
buf->next_element_to_fill++;
/* IQD */
} else if (offset) {
int element = buf->next_element_to_fill; int element = buf->next_element_to_fill;
is_first_elem = false; is_first_elem = false;
buffer->element[element].addr = hdr; buffer->element[element].addr = hdr;
buffer->element[element].length = hd_len; buffer->element[element].length = hd_len;
buffer->element[element].eflags = SBAL_EFLAGS_FIRST_FRAG; buffer->element[element].eflags = SBAL_EFLAGS_FIRST_FRAG;
buf->is_header[element] = 1; /* remember to free cache-allocated qeth_hdr: */
buf->is_header[element] = ((void *)hdr != skb->data);
buf->next_element_to_fill++; buf->next_element_to_fill++;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment