Loading drivers/s390/net/qeth_core.h +21 −0 Original line number Diff line number Diff line Loading @@ -864,6 +864,27 @@ static inline int qeth_get_ip_version(struct sk_buff *skb) } } static inline void qeth_rx_csum(struct qeth_card *card, struct sk_buff *skb, u8 flags) { if ((card->dev->features & NETIF_F_RXCSUM) && (flags & QETH_HDR_EXT_CSUM_HDR_REQ) && (flags & QETH_HDR_EXT_CSUM_TRANSP_REQ)) skb->ip_summed = CHECKSUM_UNNECESSARY; else skb->ip_summed = CHECKSUM_NONE; } static inline void qeth_tx_csum(struct sk_buff *skb, u8 *flags) { *flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ; if (ip_hdr(skb)->protocol == IPPROTO_UDP) *flags |= QETH_HDR_EXT_UDP; /* some HW requires combined L3+L4 csum offload: */ *flags |= QETH_HDR_EXT_CSUM_HDR_REQ; ip_hdr(skb)->check = 0; } static inline void qeth_put_buffer_pool_entry(struct qeth_card *card, struct qeth_buffer_pool_entry *entry) { Loading drivers/s390/net/qeth_l2_main.c +6 −29 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ #include <linux/kernel.h> #include <linux/slab.h> #include <linux/etherdevice.h> #include <linux/ip.h> #include <linux/list.h> #include <linux/hash.h> #include <linux/hashtable.h> Loading Loading @@ -195,23 +194,6 @@ static int qeth_l2_get_cast_type(struct qeth_card *card, struct sk_buff *skb) return RTN_UNSPEC; } static void qeth_l2_hdr_csum(struct qeth_card *card, struct qeth_hdr *hdr, struct sk_buff *skb) { struct iphdr *iph = ip_hdr(skb); /* tcph->check contains already the pseudo hdr checksum * so just set the header flags */ if (iph->protocol == IPPROTO_UDP) hdr->hdr.l2.flags[1] |= QETH_HDR_EXT_UDP; hdr->hdr.l2.flags[1] |= QETH_HDR_EXT_CSUM_TRANSP_REQ | QETH_HDR_EXT_CSUM_HDR_REQ; iph->check = 0; if (card->options.performance_stats) card->perf_stats.tx_csum++; } static void qeth_l2_fill_header(struct qeth_hdr *hdr, struct sk_buff *skb, int cast_type, unsigned int data_len) { Loading Loading @@ -424,15 +406,7 @@ static int qeth_l2_process_inbound_buffer(struct qeth_card *card, switch (hdr->hdr.l2.id) { case QETH_HEADER_TYPE_LAYER2: skb->protocol = eth_type_trans(skb, skb->dev); if ((card->dev->features & NETIF_F_RXCSUM) && ((hdr->hdr.l2.flags[1] & (QETH_HDR_EXT_CSUM_HDR_REQ | QETH_HDR_EXT_CSUM_TRANSP_REQ)) == (QETH_HDR_EXT_CSUM_HDR_REQ | QETH_HDR_EXT_CSUM_TRANSP_REQ))) skb->ip_summed = CHECKSUM_UNNECESSARY; else skb->ip_summed = CHECKSUM_NONE; qeth_rx_csum(card, skb, hdr->hdr.l2.flags[1]); if (skb->protocol == htons(ETH_P_802_2)) *((__u32 *)skb->cb) = ++card->seqno.pkt_seqno; len = skb->len; Loading Loading @@ -724,8 +698,11 @@ static int qeth_l2_xmit_osa(struct qeth_card *card, struct sk_buff *skb, hdr_elements = 1; } qeth_l2_fill_header(hdr, skb, cast_type, skb->len - push_len); if (skb->ip_summed == CHECKSUM_PARTIAL) qeth_l2_hdr_csum(card, hdr, skb); if (skb->ip_summed == CHECKSUM_PARTIAL) { qeth_tx_csum(skb, &hdr->hdr.l2.flags[1]); if (card->options.performance_stats) card->perf_stats.tx_csum++; } elements = qeth_get_elements_no(card, skb, hdr_elements, 0); if (!elements) { Loading drivers/s390/net/qeth_l3_main.c +6 −30 Original line number Diff line number Diff line Loading @@ -1367,17 +1367,7 @@ static void qeth_l3_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), tag); } if (card->dev->features & NETIF_F_RXCSUM) { if ((hdr->hdr.l3.ext_flags & (QETH_HDR_EXT_CSUM_HDR_REQ | QETH_HDR_EXT_CSUM_TRANSP_REQ)) == (QETH_HDR_EXT_CSUM_HDR_REQ | QETH_HDR_EXT_CSUM_TRANSP_REQ)) skb->ip_summed = CHECKSUM_UNNECESSARY; else skb->ip_summed = CHECKSUM_NONE; } else skb->ip_summed = CHECKSUM_NONE; qeth_rx_csum(card, skb, hdr->hdr.l3.ext_flags); } static int qeth_l3_process_inbound_buffer(struct qeth_card *card, Loading Loading @@ -2123,23 +2113,6 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, rcu_read_unlock(); } static void qeth_l3_hdr_csum(struct qeth_card *card, struct qeth_hdr *hdr, struct sk_buff *skb) { struct iphdr *iph = ip_hdr(skb); /* tcph->check contains already the pseudo hdr checksum * so just set the header flags */ if (iph->protocol == IPPROTO_UDP) hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_UDP; hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ | QETH_HDR_EXT_CSUM_HDR_REQ; iph->check = 0; if (card->options.performance_stats) card->perf_stats.tx_csum++; } static void qeth_tso_fill_header(struct qeth_card *card, struct qeth_hdr *qhdr, struct sk_buff *skb) { Loading Loading @@ -2331,8 +2304,11 @@ static netdev_tx_t qeth_l3_hard_start_xmit(struct sk_buff *skb, } } if (skb->ip_summed == CHECKSUM_PARTIAL) qeth_l3_hdr_csum(card, hdr, new_skb); if (new_skb->ip_summed == CHECKSUM_PARTIAL) { qeth_tx_csum(new_skb, &hdr->hdr.l3.ext_flags); if (card->options.performance_stats) card->perf_stats.tx_csum++; } } elements = use_tso ? Loading Loading
drivers/s390/net/qeth_core.h +21 −0 Original line number Diff line number Diff line Loading @@ -864,6 +864,27 @@ static inline int qeth_get_ip_version(struct sk_buff *skb) } } static inline void qeth_rx_csum(struct qeth_card *card, struct sk_buff *skb, u8 flags) { if ((card->dev->features & NETIF_F_RXCSUM) && (flags & QETH_HDR_EXT_CSUM_HDR_REQ) && (flags & QETH_HDR_EXT_CSUM_TRANSP_REQ)) skb->ip_summed = CHECKSUM_UNNECESSARY; else skb->ip_summed = CHECKSUM_NONE; } static inline void qeth_tx_csum(struct sk_buff *skb, u8 *flags) { *flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ; if (ip_hdr(skb)->protocol == IPPROTO_UDP) *flags |= QETH_HDR_EXT_UDP; /* some HW requires combined L3+L4 csum offload: */ *flags |= QETH_HDR_EXT_CSUM_HDR_REQ; ip_hdr(skb)->check = 0; } static inline void qeth_put_buffer_pool_entry(struct qeth_card *card, struct qeth_buffer_pool_entry *entry) { Loading
drivers/s390/net/qeth_l2_main.c +6 −29 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ #include <linux/kernel.h> #include <linux/slab.h> #include <linux/etherdevice.h> #include <linux/ip.h> #include <linux/list.h> #include <linux/hash.h> #include <linux/hashtable.h> Loading Loading @@ -195,23 +194,6 @@ static int qeth_l2_get_cast_type(struct qeth_card *card, struct sk_buff *skb) return RTN_UNSPEC; } static void qeth_l2_hdr_csum(struct qeth_card *card, struct qeth_hdr *hdr, struct sk_buff *skb) { struct iphdr *iph = ip_hdr(skb); /* tcph->check contains already the pseudo hdr checksum * so just set the header flags */ if (iph->protocol == IPPROTO_UDP) hdr->hdr.l2.flags[1] |= QETH_HDR_EXT_UDP; hdr->hdr.l2.flags[1] |= QETH_HDR_EXT_CSUM_TRANSP_REQ | QETH_HDR_EXT_CSUM_HDR_REQ; iph->check = 0; if (card->options.performance_stats) card->perf_stats.tx_csum++; } static void qeth_l2_fill_header(struct qeth_hdr *hdr, struct sk_buff *skb, int cast_type, unsigned int data_len) { Loading Loading @@ -424,15 +406,7 @@ static int qeth_l2_process_inbound_buffer(struct qeth_card *card, switch (hdr->hdr.l2.id) { case QETH_HEADER_TYPE_LAYER2: skb->protocol = eth_type_trans(skb, skb->dev); if ((card->dev->features & NETIF_F_RXCSUM) && ((hdr->hdr.l2.flags[1] & (QETH_HDR_EXT_CSUM_HDR_REQ | QETH_HDR_EXT_CSUM_TRANSP_REQ)) == (QETH_HDR_EXT_CSUM_HDR_REQ | QETH_HDR_EXT_CSUM_TRANSP_REQ))) skb->ip_summed = CHECKSUM_UNNECESSARY; else skb->ip_summed = CHECKSUM_NONE; qeth_rx_csum(card, skb, hdr->hdr.l2.flags[1]); if (skb->protocol == htons(ETH_P_802_2)) *((__u32 *)skb->cb) = ++card->seqno.pkt_seqno; len = skb->len; Loading Loading @@ -724,8 +698,11 @@ static int qeth_l2_xmit_osa(struct qeth_card *card, struct sk_buff *skb, hdr_elements = 1; } qeth_l2_fill_header(hdr, skb, cast_type, skb->len - push_len); if (skb->ip_summed == CHECKSUM_PARTIAL) qeth_l2_hdr_csum(card, hdr, skb); if (skb->ip_summed == CHECKSUM_PARTIAL) { qeth_tx_csum(skb, &hdr->hdr.l2.flags[1]); if (card->options.performance_stats) card->perf_stats.tx_csum++; } elements = qeth_get_elements_no(card, skb, hdr_elements, 0); if (!elements) { Loading
drivers/s390/net/qeth_l3_main.c +6 −30 Original line number Diff line number Diff line Loading @@ -1367,17 +1367,7 @@ static void qeth_l3_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), tag); } if (card->dev->features & NETIF_F_RXCSUM) { if ((hdr->hdr.l3.ext_flags & (QETH_HDR_EXT_CSUM_HDR_REQ | QETH_HDR_EXT_CSUM_TRANSP_REQ)) == (QETH_HDR_EXT_CSUM_HDR_REQ | QETH_HDR_EXT_CSUM_TRANSP_REQ)) skb->ip_summed = CHECKSUM_UNNECESSARY; else skb->ip_summed = CHECKSUM_NONE; } else skb->ip_summed = CHECKSUM_NONE; qeth_rx_csum(card, skb, hdr->hdr.l3.ext_flags); } static int qeth_l3_process_inbound_buffer(struct qeth_card *card, Loading Loading @@ -2123,23 +2113,6 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, rcu_read_unlock(); } static void qeth_l3_hdr_csum(struct qeth_card *card, struct qeth_hdr *hdr, struct sk_buff *skb) { struct iphdr *iph = ip_hdr(skb); /* tcph->check contains already the pseudo hdr checksum * so just set the header flags */ if (iph->protocol == IPPROTO_UDP) hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_UDP; hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ | QETH_HDR_EXT_CSUM_HDR_REQ; iph->check = 0; if (card->options.performance_stats) card->perf_stats.tx_csum++; } static void qeth_tso_fill_header(struct qeth_card *card, struct qeth_hdr *qhdr, struct sk_buff *skb) { Loading Loading @@ -2331,8 +2304,11 @@ static netdev_tx_t qeth_l3_hard_start_xmit(struct sk_buff *skb, } } if (skb->ip_summed == CHECKSUM_PARTIAL) qeth_l3_hdr_csum(card, hdr, new_skb); if (new_skb->ip_summed == CHECKSUM_PARTIAL) { qeth_tx_csum(new_skb, &hdr->hdr.l3.ext_flags); if (card->options.performance_stats) card->perf_stats.tx_csum++; } } elements = use_tso ? Loading