s390/qeth: updates 2018-10-12
Subsystems (4)
cover s390/qeth: updates 2018-10-12
Hi Dave,
please apply one more patchset for net-next. This extends the TSO support in qeth.
Thanks,
Julian
Julian Wiedmann (4):
s390/qeth: make TSO controls protocol-agnostic
s390/qeth: enhance TSO control sequence
s390/qeth: add support for IPv6 TSO
s390/qeth: add TSO support for L2 devices
drivers/s390/net/qeth_core.h | 5 +- drivers/s390/net/qeth_core_main.c | 159 ++++++++++++++++++++++++++++++++------ drivers/s390/net/qeth_core_mpc.h | 26 +++++++ drivers/s390/net/qeth_l2_main.c | 30 +++++-- drivers/s390/net/qeth_l3_main.c | 47 +++++------ 5 files changed, 210 insertions(+), 57 deletions(-)
Signature · 1 line
2.16.4
PATCH 1/4 s390/qeth: make TSO controls protocol-agnostic
In preparation for IPv6 TSO, turn the protocol version into a parameter for the TSO control code.
--- drivers/s390/net/qeth_core_main.c | 41 ++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 20 deletions(-)
drivers/s390/net/qeth_core_main.c +21 -20
@@ -6396,27 +6396,27 @@ static int qeth_set_ipa_csum(struct qeth_card *card, bool on, int cstype,return rc ? -EIO :0 ; } -static int qeth_set_ipa_tso (struct qeth_card *card,int on) +static int qeth_set_tso_off (struct qeth_card *card, +enum qeth_prot_versions prot) { -int rc; +return qeth_send_simple_setassparms_prot (card,IPA_OUTBOUND_TSO , +IPA_CMD_ASS_STOP ,0 , prot); +} -QETH_CARD_TEXT (card,3 ,"sttso" ); +static int qeth_set_tso_on (struct qeth_card *card, +enum qeth_prot_versions prot) +{ +return qeth_send_simple_setassparms_prot (card,IPA_OUTBOUND_TSO , +IPA_CMD_ASS_START ,0 , prot); +} -if (on) { - rc =qeth_send_simple_setassparms (card,IPA_OUTBOUND_TSO , -IPA_CMD_ASS_START ,0 ); -if (rc) { -dev_warn (&card->gdev->dev, -"Starting outbound TCP segmentation offload for %s failed\n" , -QETH_CARD_IFNAME (card)); -return -EIO ; - } -dev_info (&card->gdev->dev,"Outbound TSO enabled\n" ); - }else { - rc =qeth_send_simple_setassparms (card,IPA_OUTBOUND_TSO , -IPA_CMD_ASS_STOP ,0 ); - } -return rc; +static int qeth_set_ipa_tso (struct qeth_card *card,bool on, +enum qeth_prot_versions prot) +{ +int rc = on ?qeth_set_tso_on (card, prot) : +qeth_set_tso_off (card, prot); + +return rc ? -EIO :0 ; }static int qeth_set_ipa_rx_csum (struct qeth_card *card,bool on)
@@ -6493,8 +6493,9 @@ int qeth_set_features(struct net_device *dev, netdev_features_t features)if (rc) changed ^=NETIF_F_RXCSUM ; } -if ((changed &NETIF_F_TSO )) { - rc =qeth_set_ipa_tso (card, features &NETIF_F_TSO ?1 :0 ); +if (changed &NETIF_F_TSO ) { + rc =qeth_set_ipa_tso (card, features &NETIF_F_TSO , +QETH_PROT_IPV4 );if (rc) changed ^=NETIF_F_TSO ; }
Signature · 1 line
2.16.4
PATCH 2/4 s390/qeth: enhance TSO control sequence
In reply to Julian WiedmannTSO6 requires the full programming sequence, and not just a simple START command. This implements the additional ENABLE command, and adds some sanity checks that were missing for the START command.
--- drivers/s390/net/qeth_core_main.c | 77 ++++++++++++++++++++++++++++++++++++++- drivers/s390/net/qeth_core_mpc.h | 26 +++++++++++++ 2 files changed, 101 insertions(+), 2 deletions(-)
drivers/s390/net/qeth_core_main.c +75 -2
@@ -5394,6 +5394,21 @@ static int qeth_setassparms_inspect_rc(struct qeth_ipa_cmd *cmd)return cmd->hdr.return_code; } +static int qeth_setassparms_get_caps_cb (struct qeth_card *card, +struct qeth_reply *reply, +unsigned long data) +{ +struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data; +struct qeth_ipa_caps *caps = reply->param; + +if (qeth_setassparms_inspect_rc (cmd)) +return 0 ; + + caps->supported = cmd->data.setassparms.data.caps.supported; + caps->enabled = cmd->data.setassparms.data.caps.enabled; +return 0 ; +} +int qeth_setassparms_cb (struct qeth_card *card,struct qeth_reply *reply,unsigned long data) {
@@ -6396,6 +6411,20 @@ static int qeth_set_ipa_csum(struct qeth_card *card, bool on, int cstype,return rc ? -EIO :0 ; } +static int qeth_start_tso_cb (struct qeth_card *card,struct qeth_reply *reply, +unsigned long data) +{ +struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data; +struct qeth_tso_start_data *tso_data = reply->param; + +if (qeth_setassparms_inspect_rc (cmd)) +return 0 ; + + tso_data->mss = cmd->data.setassparms.data.tso.mss; + tso_data->supported = cmd->data.setassparms.data.tso.supported; +return 0 ; +} +static int qeth_set_tso_off (struct qeth_card *card,enum qeth_prot_versions prot) {
@@ -6406,8 +6435,52 @@ static int qeth_set_tso_off(struct qeth_card *card,static int qeth_set_tso_on (struct qeth_card *card,enum qeth_prot_versions prot) { -return qeth_send_simple_setassparms_prot (card,IPA_OUTBOUND_TSO , -IPA_CMD_ASS_START ,0 , prot); +struct qeth_tso_start_data tso_data; +struct qeth_cmd_buffer *iob; +struct qeth_ipa_caps caps; +int rc; + + iob =qeth_get_setassparms_cmd (card,IPA_OUTBOUND_TSO , +IPA_CMD_ASS_START ,0 , prot); +if (!iob) +return -ENOMEM ; + + rc =qeth_send_setassparms (card, iob,0 ,0 /* unused */ , + qeth_start_tso_cb, &tso_data); +if (rc) +return rc; + +if (!tso_data.mss || !(tso_data.supported &QETH_IPA_LARGE_SEND_TCP )) { +qeth_set_tso_off (card, prot); +return -EOPNOTSUPP ; + } + + iob =qeth_get_setassparms_cmd (card,IPA_OUTBOUND_TSO , +IPA_CMD_ASS_ENABLE ,sizeof (caps), prot); +if (!iob) { +qeth_set_tso_off (card, prot); +return -ENOMEM ; + } + +/* enable TSO capability */ + caps.supported =0 ; + caps.enabled =QETH_IPA_LARGE_SEND_TCP ; + rc =qeth_send_setassparms (card, iob,sizeof (caps), (long ) &caps, + qeth_setassparms_get_caps_cb, &caps); +if (rc) { +qeth_set_tso_off (card, prot); +return rc; + } + +if (!qeth_ipa_caps_supported (&caps,QETH_IPA_LARGE_SEND_TCP ) || + !qeth_ipa_caps_enabled (&caps,QETH_IPA_LARGE_SEND_TCP )) { +qeth_set_tso_off (card, prot); +return -EOPNOTSUPP ; + } + +dev_info (&card->gdev->dev,"TSOv%u enabled (MSS: %u)\n" , prot, + tso_data.mss); +return 0 ; } static int qeth_set_ipa_tso(struct qeth_card *card, bool on,
drivers/s390/net/qeth_core_mpc.h +26 -0
@@ -56,6 +56,21 @@ static inline bool qeth_intparm_is_iob(unsigned long intparm)#define IPA_CMD_INITIATOR_OSA_REPLY 0x81#define IPA_CMD_PRIM_VERSION_NO 0x01 +struct qeth_ipa_caps { +u32 supported; +u32 enabled; +}; + +static inline bool qeth_ipa_caps_supported (struct qeth_ipa_caps *caps,u32 mask) +{ +return (caps->supported & mask) == mask; +} + +static inline bool qeth_ipa_caps_enabled (struct qeth_ipa_caps *caps,u32 mask) +{ +return (caps->enabled & mask) == mask; +} +enum qeth_card_types {QETH_CARD_TYPE_OSD =1 ,QETH_CARD_TYPE_IQD =5 ,
@@ -405,14 +420,25 @@ struct qeth_checksum_cmd {__u32 enabled; } __packed; +enum qeth_ipa_large_send_caps { +QETH_IPA_LARGE_SEND_TCP =0x00000001 , +}; + +struct qeth_tso_start_data { +u32 mss; +u32 supported; +}; +/* SETASSPARMS IPA Command: */ struct qeth_ipacmd_setassparms {struct qeth_ipacmd_setassparms_hdr hdr;union {__u32 flags_32bit; +struct qeth_ipa_caps caps;struct qeth_checksum_cmd chksum;struct qeth_arp_cache_entry add_arp_entry;struct qeth_arp_query_data query_arp; +struct qeth_tso_start_data tso;__u8 ip[16 ]; } data; } __attribute__ ((packed));
Signature · 1 line
2.16.4
PATCH 3/4 s390/qeth: add support for IPv6 TSO
In reply to Julian WiedmannThis adds TSO6 support for L3 qeth devices.
Just like for standard IPv6 traffic, TSO6 doesn't use IP offload and thus runs over the normal qeth_xmit() path.
--- drivers/s390/net/qeth_core.h | 2 ++ drivers/s390/net/qeth_core_main.c | 49 +++++++++++++++++++++++++++++++++++---- drivers/s390/net/qeth_l3_main.c | 45 +++++++++++++++-------------------- 3 files changed, 65 insertions(+), 31 deletions(-)
drivers/s390/net/qeth_core.h +2 -0
@@ -1047,6 +1047,8 @@ int qeth_vm_request_mac(struct qeth_card *card);int qeth_add_hw_header (struct qeth_card *card,struct sk_buff *skb,struct qeth_hdr **hdr,unsigned int hdr_len,unsigned int proto_len,unsigned int *elements); +void qeth_fill_tso_ext (struct qeth_hdr_tso *hdr,unsigned int payload_len, +struct sk_buff *skb,unsigned int proto_len); int qeth_xmit(struct qeth_card *card, struct sk_buff *skb, struct qeth_qdio_out_q *queue, int ipv, int cast_type, void (*fill_header)(struct qeth_card *card, struct qeth_hdr *hdr,
drivers/s390/net/qeth_core_main.c +44 -5
103 lines not on this page · raw message
drivers/s390/net/qeth_l3_main.c +19 -26
90 lines not on this page · raw message
Signature · 1 line
2.16.4
PATCH 4/4 s390/qeth: add TSO support for L2 devices
In reply to Julian WiedmannExcept for the new HW header id, this works just like TSO6 on L3 devices and reuses all the existing data path support in qeth_xmit().
--- drivers/s390/net/qeth_core.h | 3 ++- drivers/s390/net/qeth_l2_main.c | 30 ++++++++++++++++++++++++------ drivers/s390/net/qeth_l3_main.c | 2 +- 3 files changed, 27 insertions(+), 8 deletions(-)
drivers/s390/net/qeth_core.h +2 -1
@@ -390,8 +390,9 @@ enum qeth_layer2_frame_flags {enum qeth_header_ids {QETH_HEADER_TYPE_LAYER3 =0x01 ,QETH_HEADER_TYPE_LAYER2 =0x02 , -QETH_HEADER_TYPE_TSO =0x03 , +QETH_HEADER_TYPE_L3_TSO =0x03 ,QETH_HEADER_TYPE_OSN =0x04 , +QETH_HEADER_TYPE_L2_TSO =0x06 , };/* flags for qeth_hdr.ext_flags */ #define QETH_HDR_EXT_VLAN_FRAME 0x01
drivers/s390/net/qeth_l2_main.c +24 -6
@@ -197,15 +197,19 @@ static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, struct sk_buff *skb, int ipv, int cast_type, unsigned int data_len) { - struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb_mac_header(skb); + struct vlan_ethhdr *veth = vlan_eth_hdr(skb); - hdr->hdr.l2.id =QETH_HEADER_TYPE_LAYER2 ; hdr->hdr.l2.pkt_length = data_len; -if (skb->ip_summed ==CHECKSUM_PARTIAL ) { -qeth_tx_csum (skb, &hdr->hdr.l2.flags[1 ], ipv); -if (card->options.performance_stats) - card->perf_stats.tx_csum++; +if (skb_is_gso (skb)) { + hdr->hdr.l2.id =QETH_HEADER_TYPE_L2_TSO ; + }else { + hdr->hdr.l2.id =QETH_HEADER_TYPE_LAYER2 ; +if (skb->ip_summed ==CHECKSUM_PARTIAL ) { +qeth_tx_csum (skb, &hdr->hdr.l2.flags[1 ], ipv); +if (card->options.performance_stats) + card->perf_stats.tx_csum++; + } }/* set byte byte 3 to casting flags */
@@ -897,6 +901,20 @@ static int qeth_l2_setup_netdev(struct qeth_card *card) card->dev->hw_features |=NETIF_F_RXCSUM ; card->dev->vlan_features |=NETIF_F_RXCSUM ; } +if (qeth_is_supported (card,IPA_OUTBOUND_TSO )) { + card->dev->hw_features |=NETIF_F_TSO ; + card->dev->vlan_features |=NETIF_F_TSO ; + } +if (qeth_is_supported6 (card,IPA_OUTBOUND_TSO )) { + card->dev->hw_features |=NETIF_F_TSO6 ; + card->dev->vlan_features |=NETIF_F_TSO6 ; + } + +if (card->dev->hw_features & (NETIF_F_TSO |NETIF_F_TSO6 )) { + card->dev->needed_headroom =sizeof (struct qeth_hdr_tso ); +netif_set_gso_max_size (card->dev, +PAGE_SIZE * (QDIO_MAX_ELEMENTS_PER_BUFFER -1 )); + }qeth_l2_request_initial_mac (card);netif_napi_add (card->dev, &card->napi, qeth_poll,QETH_NAPI_WEIGHT );
drivers/s390/net/qeth_l3_main.c +1 -1
@@ -2037,7 +2037,7 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, hdr->hdr.l3.length = data_len;if (skb_is_gso (skb)) { - hdr->hdr.l3.id =QETH_HEADER_TYPE_TSO ; + hdr->hdr.l3.id =QETH_HEADER_TYPE_L3_TSO ; }else { hdr->hdr.l3.id =QETH_HEADER_TYPE_LAYER3 ;if (skb->ip_summed ==CHECKSUM_PARTIAL ) {
Signature · 1 line
2.16.4
David Miller
maintainerFrom: Julian Wiedmann <[email protected]>
Date: Fri, 12 Oct 2018 17:27:11 +0200
Quoted 2 lines
please apply one more patchset for net-next. This extends the TSO support in qeth.
Series applied.