diff options
-rw-r--r-- | MAINTAINERS | 2 | ||||
-rw-r--r-- | drivers/s390/net/qeth_core.h | 3 | ||||
-rw-r--r-- | drivers/s390/net/qeth_core_main.c | 5 | ||||
-rw-r--r-- | drivers/s390/net/qeth_l2_main.c | 5 | ||||
-rw-r--r-- | drivers/s390/net/qeth_l3_main.c | 20 |
5 files changed, 17 insertions, 18 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index c45c02bc6082..e48678d15401 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -10808,6 +10808,7 @@ F: drivers/s390/block/dasd* | |||
10808 | F: block/partitions/ibm.c | 10808 | F: block/partitions/ibm.c |
10809 | 10809 | ||
10810 | S390 NETWORK DRIVERS | 10810 | S390 NETWORK DRIVERS |
10811 | M: Julian Wiedmann <jwi@linux.vnet.ibm.com> | ||
10811 | M: Ursula Braun <ubraun@linux.vnet.ibm.com> | 10812 | M: Ursula Braun <ubraun@linux.vnet.ibm.com> |
10812 | L: linux-s390@vger.kernel.org | 10813 | L: linux-s390@vger.kernel.org |
10813 | W: http://www.ibm.com/developerworks/linux/linux390/ | 10814 | W: http://www.ibm.com/developerworks/linux/linux390/ |
@@ -10838,6 +10839,7 @@ S: Supported | |||
10838 | F: drivers/s390/scsi/zfcp_* | 10839 | F: drivers/s390/scsi/zfcp_* |
10839 | 10840 | ||
10840 | S390 IUCV NETWORK LAYER | 10841 | S390 IUCV NETWORK LAYER |
10842 | M: Julian Wiedmann <jwi@linux.vnet.ibm.com> | ||
10841 | M: Ursula Braun <ubraun@linux.vnet.ibm.com> | 10843 | M: Ursula Braun <ubraun@linux.vnet.ibm.com> |
10842 | L: linux-s390@vger.kernel.org | 10844 | L: linux-s390@vger.kernel.org |
10843 | W: http://www.ibm.com/developerworks/linux/linux390/ | 10845 | W: http://www.ibm.com/developerworks/linux/linux390/ |
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h index e7addea8741b..d9561e39c3b2 100644 --- a/drivers/s390/net/qeth_core.h +++ b/drivers/s390/net/qeth_core.h | |||
@@ -961,7 +961,8 @@ int qeth_bridgeport_query_ports(struct qeth_card *card, | |||
961 | int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role); | 961 | int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role); |
962 | int qeth_bridgeport_an_set(struct qeth_card *card, int enable); | 962 | int qeth_bridgeport_an_set(struct qeth_card *card, int enable); |
963 | int qeth_get_priority_queue(struct qeth_card *, struct sk_buff *, int, int); | 963 | int qeth_get_priority_queue(struct qeth_card *, struct sk_buff *, int, int); |
964 | int qeth_get_elements_no(struct qeth_card *, struct sk_buff *, int); | 964 | int qeth_get_elements_no(struct qeth_card *card, struct sk_buff *skb, |
965 | int extra_elems, int data_offset); | ||
965 | int qeth_get_elements_for_frags(struct sk_buff *); | 966 | int qeth_get_elements_for_frags(struct sk_buff *); |
966 | int qeth_do_send_packet_fast(struct qeth_card *, struct qeth_qdio_out_q *, | 967 | int qeth_do_send_packet_fast(struct qeth_card *, struct qeth_qdio_out_q *, |
967 | struct sk_buff *, struct qeth_hdr *, int, int, int); | 968 | struct sk_buff *, struct qeth_hdr *, int, int, int); |
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 315d8a2db7c0..9a5f99ccb122 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -3837,6 +3837,7 @@ EXPORT_SYMBOL_GPL(qeth_get_elements_for_frags); | |||
3837 | * @card: qeth card structure, to check max. elems. | 3837 | * @card: qeth card structure, to check max. elems. |
3838 | * @skb: SKB address | 3838 | * @skb: SKB address |
3839 | * @extra_elems: extra elems needed, to check against max. | 3839 | * @extra_elems: extra elems needed, to check against max. |
3840 | * @data_offset: range starts at skb->data + data_offset | ||
3840 | * | 3841 | * |
3841 | * Returns the number of pages, and thus QDIO buffer elements, needed to cover | 3842 | * Returns the number of pages, and thus QDIO buffer elements, needed to cover |
3842 | * skb data, including linear part and fragments. Checks if the result plus | 3843 | * skb data, including linear part and fragments. Checks if the result plus |
@@ -3844,10 +3845,10 @@ EXPORT_SYMBOL_GPL(qeth_get_elements_for_frags); | |||
3844 | * Note: extra_elems is not included in the returned result. | 3845 | * Note: extra_elems is not included in the returned result. |
3845 | */ | 3846 | */ |
3846 | int qeth_get_elements_no(struct qeth_card *card, | 3847 | int qeth_get_elements_no(struct qeth_card *card, |
3847 | struct sk_buff *skb, int extra_elems) | 3848 | struct sk_buff *skb, int extra_elems, int data_offset) |
3848 | { | 3849 | { |
3849 | int elements = qeth_get_elements_for_range( | 3850 | int elements = qeth_get_elements_for_range( |
3850 | (addr_t)skb->data, | 3851 | (addr_t)skb->data + data_offset, |
3851 | (addr_t)skb->data + skb_headlen(skb)) + | 3852 | (addr_t)skb->data + skb_headlen(skb)) + |
3852 | qeth_get_elements_for_frags(skb); | 3853 | qeth_get_elements_for_frags(skb); |
3853 | 3854 | ||
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index bea483307618..af4e6a639fec 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
@@ -849,7 +849,7 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
849 | * chaining we can not send long frag lists | 849 | * chaining we can not send long frag lists |
850 | */ | 850 | */ |
851 | if ((card->info.type != QETH_CARD_TYPE_IQD) && | 851 | if ((card->info.type != QETH_CARD_TYPE_IQD) && |
852 | !qeth_get_elements_no(card, new_skb, 0)) { | 852 | !qeth_get_elements_no(card, new_skb, 0, 0)) { |
853 | int lin_rc = skb_linearize(new_skb); | 853 | int lin_rc = skb_linearize(new_skb); |
854 | 854 | ||
855 | if (card->options.performance_stats) { | 855 | if (card->options.performance_stats) { |
@@ -894,7 +894,8 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
894 | } | 894 | } |
895 | } | 895 | } |
896 | 896 | ||
897 | elements = qeth_get_elements_no(card, new_skb, elements_needed); | 897 | elements = qeth_get_elements_no(card, new_skb, elements_needed, |
898 | (data_offset > 0) ? data_offset : 0); | ||
898 | if (!elements) { | 899 | if (!elements) { |
899 | if (data_offset >= 0) | 900 | if (data_offset >= 0) |
900 | kmem_cache_free(qeth_core_header_cache, hdr); | 901 | kmem_cache_free(qeth_core_header_cache, hdr); |
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index 06d0addcc058..653f0fb76573 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c | |||
@@ -2609,17 +2609,13 @@ static void qeth_l3_fill_af_iucv_hdr(struct qeth_card *card, | |||
2609 | char daddr[16]; | 2609 | char daddr[16]; |
2610 | struct af_iucv_trans_hdr *iucv_hdr; | 2610 | struct af_iucv_trans_hdr *iucv_hdr; |
2611 | 2611 | ||
2612 | skb_pull(skb, 14); | ||
2613 | card->dev->header_ops->create(skb, card->dev, 0, | ||
2614 | card->dev->dev_addr, card->dev->dev_addr, | ||
2615 | card->dev->addr_len); | ||
2616 | skb_pull(skb, 14); | ||
2617 | iucv_hdr = (struct af_iucv_trans_hdr *)skb->data; | ||
2618 | memset(hdr, 0, sizeof(struct qeth_hdr)); | 2612 | memset(hdr, 0, sizeof(struct qeth_hdr)); |
2619 | hdr->hdr.l3.id = QETH_HEADER_TYPE_LAYER3; | 2613 | hdr->hdr.l3.id = QETH_HEADER_TYPE_LAYER3; |
2620 | hdr->hdr.l3.ext_flags = 0; | 2614 | hdr->hdr.l3.ext_flags = 0; |
2621 | hdr->hdr.l3.length = skb->len; | 2615 | hdr->hdr.l3.length = skb->len - ETH_HLEN; |
2622 | hdr->hdr.l3.flags = QETH_HDR_IPV6 | QETH_CAST_UNICAST; | 2616 | hdr->hdr.l3.flags = QETH_HDR_IPV6 | QETH_CAST_UNICAST; |
2617 | |||
2618 | iucv_hdr = (struct af_iucv_trans_hdr *) (skb->data + ETH_HLEN); | ||
2623 | memset(daddr, 0, sizeof(daddr)); | 2619 | memset(daddr, 0, sizeof(daddr)); |
2624 | daddr[0] = 0xfe; | 2620 | daddr[0] = 0xfe; |
2625 | daddr[1] = 0x80; | 2621 | daddr[1] = 0x80; |
@@ -2823,10 +2819,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2823 | if ((card->info.type == QETH_CARD_TYPE_IQD) && | 2819 | if ((card->info.type == QETH_CARD_TYPE_IQD) && |
2824 | !skb_is_nonlinear(skb)) { | 2820 | !skb_is_nonlinear(skb)) { |
2825 | new_skb = skb; | 2821 | new_skb = skb; |
2826 | if (new_skb->protocol == ETH_P_AF_IUCV) | 2822 | data_offset = ETH_HLEN; |
2827 | data_offset = 0; | ||
2828 | else | ||
2829 | data_offset = ETH_HLEN; | ||
2830 | hdr = kmem_cache_alloc(qeth_core_header_cache, GFP_ATOMIC); | 2823 | hdr = kmem_cache_alloc(qeth_core_header_cache, GFP_ATOMIC); |
2831 | if (!hdr) | 2824 | if (!hdr) |
2832 | goto tx_drop; | 2825 | goto tx_drop; |
@@ -2867,7 +2860,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2867 | */ | 2860 | */ |
2868 | if ((card->info.type != QETH_CARD_TYPE_IQD) && | 2861 | if ((card->info.type != QETH_CARD_TYPE_IQD) && |
2869 | ((use_tso && !qeth_l3_get_elements_no_tso(card, new_skb, 1)) || | 2862 | ((use_tso && !qeth_l3_get_elements_no_tso(card, new_skb, 1)) || |
2870 | (!use_tso && !qeth_get_elements_no(card, new_skb, 0)))) { | 2863 | (!use_tso && !qeth_get_elements_no(card, new_skb, 0, 0)))) { |
2871 | int lin_rc = skb_linearize(new_skb); | 2864 | int lin_rc = skb_linearize(new_skb); |
2872 | 2865 | ||
2873 | if (card->options.performance_stats) { | 2866 | if (card->options.performance_stats) { |
@@ -2909,7 +2902,8 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2909 | 2902 | ||
2910 | elements = use_tso ? | 2903 | elements = use_tso ? |
2911 | qeth_l3_get_elements_no_tso(card, new_skb, hdr_elements) : | 2904 | qeth_l3_get_elements_no_tso(card, new_skb, hdr_elements) : |
2912 | qeth_get_elements_no(card, new_skb, hdr_elements); | 2905 | qeth_get_elements_no(card, new_skb, hdr_elements, |
2906 | (data_offset > 0) ? data_offset : 0); | ||
2913 | if (!elements) { | 2907 | if (!elements) { |
2914 | if (data_offset >= 0) | 2908 | if (data_offset >= 0) |
2915 | kmem_cache_free(qeth_core_header_cache, hdr); | 2909 | kmem_cache_free(qeth_core_header_cache, hdr); |