qeth: new qeth device driver
[firefly-linux-kernel-4.4.55.git] / drivers / s390 / net / qeth_eddp.c
index dd7034fbfff89ec8b51fe12788dd35703291bfab..e3c268cfbffee855eae1c17a8274b9929c37390e 100644 (file)
@@ -159,13 +159,15 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
                buffer = buf->buffer;
                /* fill one skb into buffer */
                for (i = 0; i < ctx->elements_per_skb; ++i){
-                       buffer->element[buf->next_element_to_fill].addr =
-                               ctx->elements[element].addr;
-                       buffer->element[buf->next_element_to_fill].length =
-                               ctx->elements[element].length;
-                       buffer->element[buf->next_element_to_fill].flags =
-                               ctx->elements[element].flags;
-                       buf->next_element_to_fill++;
+                       if (ctx->elements[element].length != 0) {
+                               buffer->element[buf->next_element_to_fill].
+                               addr = ctx->elements[element].addr;
+                               buffer->element[buf->next_element_to_fill].
+                               length = ctx->elements[element].length;
+                               buffer->element[buf->next_element_to_fill].
+                               flags = ctx->elements[element].flags;
+                               buf->next_element_to_fill++;
+                       }
                        element++;
                        elements--;
                }
@@ -424,8 +426,7 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
                /* prepare qdio hdr */
                if (eddp->qh.hdr.l2.id == QETH_HEADER_TYPE_LAYER2){
                        eddp->qh.hdr.l2.pkt_length = data_len + ETH_HLEN +
-                                                    eddp->nhl + eddp->thl -
-                                                    sizeof(struct qeth_hdr);
+                                                    eddp->nhl + eddp->thl;
 #ifdef CONFIG_QETH_VLAN
                        if (eddp->mac.h_proto == __constant_htons(ETH_P_8021Q))
                                eddp->qh.hdr.l2.pkt_length += VLAN_HLEN;
@@ -620,10 +621,10 @@ qeth_eddp_create_context_tcp(struct qeth_card *card, struct sk_buff *skb,
 
 struct qeth_eddp_context *
 qeth_eddp_create_context(struct qeth_card *card, struct sk_buff *skb,
-                        struct qeth_hdr *qhdr)
+                        struct qeth_hdr *qhdr, unsigned char sk_protocol)
 {
        QETH_DBF_TEXT(trace, 5, "creddpc");
-       switch (skb->sk->sk_protocol){
+       switch (sk_protocol) {
        case IPPROTO_TCP:
                return qeth_eddp_create_context_tcp(card, skb, qhdr);
        default: