s390/qeth: updates 2018-03-09
Subsystems (4)
cover s390/qeth: updates 2018-03-09
Hi Dave,
here is the current pile of qeth patches for net-next. Just the usual small updates and clean ups. Please apply.
Thanks,
Julian
Julian Wiedmann (12):
s390/qeth: use __ipa_cmd() for casting an IPA cmd buffer s390/qeth: remove outdated portname debug msg s390/qeth: support SG for more device types s390/qeth: advertise IFF_UNICAST_FLT
s390/qeth: pass correct length to header_ops->create() s390/qeth: allocate skb from NAPI cache s390/qeth: reduce RX skb setup
s390/qeth: reset NAPI context during queue init s390/qeth: restructure IP notification handlers s390/qeth: simplify card look-up on IP notification s390/qeth: extract helpers for managing special IPs s390/qeth: shrink qeth_ipaddr struct
drivers/s390/net/qeth_core.h | 8 - drivers/s390/net/qeth_core_main.c | 40 ++-- drivers/s390/net/qeth_l2_main.c | 34 ++-- drivers/s390/net/qeth_l3.h | 34 ++-- drivers/s390/net/qeth_l3_main.c | 419 ++++++++++++-------------------------- drivers/s390/net/qeth_l3_sys.c | 51 ++--- 6 files changed, 198 insertions(+), 388 deletions(-)
Signature · 1 line
2.13.5
PATCH 1/12 s390/qeth: use __ipa_cmd() for casting an IPA cmd buffer
"s390/qeth: fix SETIP command handling" introduced a new helper, apply it driver-wide.
--- drivers/s390/net/qeth_core_main.c | 24 +++++++++++------------- drivers/s390/net/qeth_l2_main.c | 14 ++++++-------- drivers/s390/net/qeth_l3_main.c | 14 +++++++------- 3 files changed, 24 insertions(+), 28 deletions(-)
drivers/s390/net/qeth_core_main.c +11 -13
@@ -2951,12 +2951,10 @@ struct qeth_cmd_buffer *qeth_get_ipacmd_buffer(struct qeth_card *card, enum qeth_ipa_cmds ipacmd, enum qeth_prot_versions prot) {struct qeth_cmd_buffer *iob; -struct qeth_ipa_cmd *cmd; iob =qeth_get_buffer (&card->write);if (iob) { - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); -qeth_fill_ipacmd_header (card, cmd, ipacmd, prot); +qeth_fill_ipacmd_header (card,__ipa_cmd (iob), ipacmd, prot); }else {dev_warn (&card->gdev->dev,"The qeth driver ran out of channel command buffers\n" );
@@ -3067,7 +3065,7 @@ static struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card, iob =qeth_get_ipacmd_buffer (card,IPA_CMD_SETADAPTERPARMS ,QETH_PROT_IPV4 );if (iob) { - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); cmd->data.setadapterparms.hdr.cmdlength = cmdlen; cmd->data.setadapterparms.hdr.command_code = command; cmd->data.setadapterparms.hdr.used_total =1 ;
@@ -3209,7 +3207,7 @@ static int qeth_query_setdiagass(struct qeth_card *card) iob =qeth_get_ipacmd_buffer (card,IPA_CMD_SET_DIAG_ASS ,0 );if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); cmd->data.diagass.subcmd_len =16 ; cmd->data.diagass.subcmd =QETH_DIAGS_CMD_QUERY ;return qeth_send_ipa_cmd (card, iob, qeth_query_setdiagass_cb,NULL );
@@ -3262,7 +3260,7 @@ int qeth_hw_trap(struct qeth_card *card, enum qeth_diags_trap_action action) iob =qeth_get_ipacmd_buffer (card,IPA_CMD_SET_DIAG_ASS ,0 );if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); cmd->data.diagass.subcmd_len =80 ; cmd->data.diagass.subcmd =QETH_DIAGS_CMD_TRAP ; cmd->data.diagass.type =1 ;
@@ -4240,7 +4238,7 @@ void qeth_setadp_promisc_mode(struct qeth_card *card) sizeof(struct qeth_ipacmd_setadpparms_hdr) + 8);if (!iob)return ; - cmd = (struct qeth_ipa_cmd *)(iob->data +IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); cmd->data.setadapterparms.data.mode = mode;qeth_send_ipa_cmd (card, iob, qeth_setadp_promisc_mode_cb,NULL ); }
@@ -4307,7 +4305,7 @@ int qeth_setadpparms_change_macaddr(struct qeth_card *card) sizeof(struct qeth_change_addr));if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); cmd->data.setadapterparms.data.change_addr.cmd =CHANGE_ADDR_READ_MAC ; cmd->data.setadapterparms.data.change_addr.addr_size =ETH_ALEN ; ether_addr_copy(cmd->data.setadapterparms.data.change_addr.addr,
@@ -4422,7 +4420,7 @@ static int qeth_setadpparms_set_access_ctrl(struct qeth_card *card, sizeof(struct qeth_set_access_ctrl));if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl; access_ctrl_req->subcmd_code = isolation;
@@ -4668,7 +4666,7 @@ static int qeth_snmp_command(struct qeth_card *card, char __user *udata) rc = -ENOMEM ; goto out; } - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob);memcpy (&cmd->data.setadapterparms.data.snmp, &ureq->cmd, req_len); rc =qeth_send_ipa_snmp_cmd (card, iob,QETH_SETADP_BASE_LEN + req_len, qeth_snmp_command_cb, (void *)&qinfo);
@@ -4753,7 +4751,7 @@ static int qeth_query_oat_command(struct qeth_card *card, char __user *udata) rc = -ENOMEM ; goto out_free; } - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); oat_req = &cmd->data.setadapterparms.data.query_oat; oat_req->subcmd_code = oat_data.command;
@@ -5494,7 +5492,7 @@ struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *card, iob =qeth_get_ipacmd_buffer (card,IPA_CMD_SETASSPARMS , prot);if (iob) { - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); cmd->data.setassparms.hdr.assist_no = ipa_func; cmd->data.setassparms.hdr.length =8 + len; cmd->data.setassparms.hdr.command_code = cmd_code;
@@ -5517,7 +5515,7 @@ int qeth_send_setassparms(struct qeth_card *card,QETH_CARD_TEXT (card,4 ,"sendassp" ); - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob);if (len <=sizeof (__u32)) cmd->data.setassparms.data.flags_32bit = (__u32 ) data;else /* (len > sizeof(__u32)) */
drivers/s390/net/qeth_l2_main.c +6 -8
@@ -108,7 +108,7 @@ static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac, iob =qeth_get_ipacmd_buffer (card, ipacmd,QETH_PROT_IPV4 );if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); cmd->data.setdelmac.mac_length =ETH_ALEN ;ether_addr_copy (cmd->data.setdelmac.mac, mac); return qeth_setdelmac_makerc(card, qeth_send_ipa_cmd(card, iob,
@@ -305,7 +305,7 @@ static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i, iob =qeth_get_ipacmd_buffer (card, ipacmd,QETH_PROT_IPV4 );if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); cmd->data.setdelvlan.vlan_id = i;return qeth_setdelvlan_makerc (card,qeth_send_ipa_cmd (card, iob, qeth_l2_send_setdelvlan_cb,NULL ));
@@ -1374,7 +1374,6 @@ int qeth_osn_assist(struct net_device *dev, void *data, int data_len) {struct qeth_cmd_buffer *iob;struct qeth_card *card; -int rc;if (!dev)return -ENODEV ;
@@ -1385,9 +1384,8 @@ int qeth_osn_assist(struct net_device *dev, void *data, int data_len)if (!qeth_card_hw_is_reachable (card))return -ENODEV ; iob =qeth_wait_for_buffer (&card->write); -memcpy (iob->data+IPA_PDU_HEADER_SIZE , data, data_len); - rc =qeth_osn_send_ipa_cmd (card, iob, data_len); -return rc; +memcpy (__ipa_cmd (iob), data, data_len); +return qeth_osn_send_ipa_cmd (card, iob, data_len); }EXPORT_SYMBOL (qeth_osn_assist);
@@ -1764,7 +1762,7 @@ static struct qeth_cmd_buffer *qeth_sbp_build_cmd(struct qeth_card *card, iob =qeth_get_ipacmd_buffer (card, ipa_cmd,0 );if (!iob)return iob; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); cmd->data.sbp.hdr.cmdlength =sizeof (struct qeth_ipacmd_sbp_hdr ) + cmd_length; cmd->data.sbp.hdr.command_code = sbp_cmd;
@@ -2129,7 +2127,7 @@ static int qeth_l2_vnicc_request(struct qeth_card *card,return -ENOMEM ;/* create header for request */ - cmd = (struct qeth_ipa_cmd *)(iob->data +IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); req = &cmd->data.vnicc;/* create sub command header for request */
drivers/s390/net/qeth_l3_main.c +7 -7
@@ -352,7 +352,7 @@ static int qeth_l3_send_setdelmc(struct qeth_card *card, iob =qeth_get_ipacmd_buffer (card, ipacmd, addr->proto);if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob);ether_addr_copy (cmd->data.setdelipm.mac, addr->mac);if (addr->proto ==QETH_PROT_IPV6 ) memcpy(cmd->data.setdelipm.ip6, &addr->u.a6.addr,
@@ -393,7 +393,7 @@ static int qeth_l3_send_setdelip(struct qeth_card *card, iob =qeth_get_ipacmd_buffer (card, ipacmd, addr->proto);if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob);if (addr->proto ==QETH_PROT_IPV6 ) {memcpy (cmd->data.setdelip6.ip_addr, &addr->u.a6.addr,sizeof (struct in6_addr ));
@@ -423,7 +423,7 @@ static int qeth_l3_send_setrouting(struct qeth_card *card, iob =qeth_get_ipacmd_buffer (card,IPA_CMD_SETRTG , prot);if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); cmd->data.setrtg.type = (type); rc =qeth_send_ipa_cmd (card, iob,NULL ,NULL );
@@ -1072,7 +1072,7 @@ static int qeth_l3_iqd_read_initial_mac(struct qeth_card *card) QETH_PROT_IPV6);if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6 ]) = card->info.unique_id;
@@ -1117,7 +1117,7 @@ static int qeth_l3_get_unique_id(struct qeth_card *card) QETH_PROT_IPV6);if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6 ]) = card->info.unique_id;
@@ -1193,7 +1193,7 @@ qeth_diags_trace(struct qeth_card *card, enum qeth_diags_trace_cmds diags_cmd) iob =qeth_get_ipacmd_buffer (card,IPA_CMD_SET_DIAG_ASS ,0 );if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); cmd->data.diagass.subcmd_len =16 ; cmd->data.diagass.subcmd =QETH_DIAGS_CMD_TRACE ; cmd->data.diagass.type =QETH_DIAGS_TYPE_HIPERSOCKET ;
@@ -2004,7 +2004,7 @@ static int qeth_l3_query_arp_cache_info(struct qeth_card *card, prot);if (!iob)return -ENOMEM ; - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE ); + cmd =__ipa_cmd (iob); cmd->data.setassparms.data.query_arp.request_bits =0x000F ; cmd->data.setassparms.data.query_arp.reply_bits =0 ; cmd->data.setassparms.data.query_arp.no_entries =0 ;
Signature · 1 line
2.13.5
PATCH 2/12 s390/qeth: remove outdated portname debug msg
In reply to Julian WiedmannThe 'portname' attribute is deprecated and setting it has no effect.
--- drivers/s390/net/qeth_core_main.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
drivers/s390/net/qeth_core_main.c +2 -5
@@ -708,11 +708,8 @@ static int qeth_check_idx_response(struct qeth_card *card,QETH_DBF_HEX (CTRL ,2 , buffer,QETH_DBF_CTRL_LEN );if ((buffer[2 ] &0xc0 ) ==0xc0 ) { -QETH_DBF_MESSAGE (2 ,"received an IDX TERMINATE " -"with cause code 0x%02x%s\n" , - buffer[4 ], - ((buffer[4 ] ==0x22 ) ? -" -- try another portname" :"" )); +QETH_DBF_MESSAGE (2 ,"received an IDX TERMINATE with cause code %#02x\n" , + buffer[4 ]);QETH_CARD_TEXT (card,2 ,"ckidxres" );QETH_CARD_TEXT (card,2 ," idxterm" );QETH_CARD_TEXT_ (card,2 ," rc%d" , -EIO );
Signature · 1 line
2.13.5
PATCH 3/12 s390/qeth: support SG for more device types
In reply to Julian WiedmannNETIF_F_SG support is currently limited to OSA (and for L2 even OSD) devices. Advertise it for some more device types (OSM, L2 OSX, z/VM OSA) that share the same code paths. For now, keep it switched off by default on these devices.
--- drivers/s390/net/qeth_l2_main.c | 16 +++++++++------- drivers/s390/net/qeth_l3_main.c | 14 ++++++++------ 2 files changed, 17 insertions(+), 13 deletions(-)
drivers/s390/net/qeth_l2_main.c +9 -7
@@ -991,9 +991,16 @@ static int qeth_l2_setup_netdev(struct qeth_card *card) card->dev->features |=NETIF_F_VLAN_CHALLENGED ; else card->dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; + +if (card->info.type !=QETH_CARD_TYPE_OSN && + card->info.type !=QETH_CARD_TYPE_IQD ) { + card->dev->priv_flags &= ~IFF_TX_SKB_SHARING ; + card->dev->needed_headroom =sizeof (struct qeth_hdr ); + card->dev->hw_features |=NETIF_F_SG ; + card->dev->vlan_features |=NETIF_F_SG ; + } +if (card->info.type ==QETH_CARD_TYPE_OSD && !card->info.guestlan) { - card->dev->hw_features =NETIF_F_SG ; - card->dev->vlan_features =NETIF_F_SG ; card->dev->features |=NETIF_F_SG ;/* OSA 3S and earlier has no RX/TX support */ if (qeth_is_supported (card,IPA_OUTBOUND_CHECKSUM )) {
@@ -1005,11 +1012,6 @@ static int qeth_l2_setup_netdev(struct qeth_card *card) card->dev->vlan_features |=NETIF_F_RXCSUM ; } } -if (card->info.type !=QETH_CARD_TYPE_OSN && - card->info.type !=QETH_CARD_TYPE_IQD ) { - card->dev->priv_flags &= ~IFF_TX_SKB_SHARING ; - card->dev->needed_headroom =sizeof (struct qeth_hdr ); - } card->info.broadcast_capable =1 ;qeth_l2_request_initial_mac (card);
drivers/s390/net/qeth_l3_main.c +8 -6
@@ -2785,14 +2785,16 @@ static int qeth_l3_setup_netdev(struct qeth_card *card)if (!(card->info.unique_id &UNIQUE_ID_NOT_BY_CARD )) card->dev->dev_id = card->info.unique_id &0xffff ; + + card->dev->hw_features |=NETIF_F_SG ; + card->dev->vlan_features |=NETIF_F_SG ; +if (!card->info.guestlan) { - card->dev->hw_features =NETIF_F_SG | -NETIF_F_RXCSUM |NETIF_F_IP_CSUM | -NETIF_F_TSO ; - card->dev->vlan_features =NETIF_F_SG | -NETIF_F_RXCSUM |NETIF_F_IP_CSUM | -NETIF_F_TSO ; card->dev->features |=NETIF_F_SG ; + card->dev->hw_features |=NETIF_F_TSO | +NETIF_F_RXCSUM |NETIF_F_IP_CSUM ; + card->dev->vlan_features |=NETIF_F_TSO | +NETIF_F_RXCSUM |NETIF_F_IP_CSUM ; } } }else if (card->info.type ==QETH_CARD_TYPE_IQD ) {
Signature · 1 line
2.13.5
PATCH 4/12 s390/qeth: advertise IFF_UNICAST_FLT
In reply to Julian Wiedmannqeth implements HW-based Unicast Filtering (via SETVMAC) on L2 devices. Tell the stack, so it knows that receiving traffic for secondary addresses doesn't require full-blown promiscuous mode.
--- drivers/s390/net/qeth_l2_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/s390/net/qeth_l2_main.c +1 -0
@@ -975,6 +975,7 @@ static int qeth_l2_setup_netdev(struct qeth_card *card)return -ENODEV ; card->dev->ml_priv = card; + card->dev->priv_flags |=IFF_UNICAST_FLT ; card->dev->watchdog_timeo =QETH_TX_TIMEOUT ; card->dev->mtu = card->info.initial_mtu; card->dev->min_mtu =64 ;
Signature · 1 line
2.13.5
PATCH 5/12 s390/qeth: pass correct length to header_ops->create()
In reply to Julian WiedmannWe need to pass the *payload* length, not the L2 address length. For qeth (using eth_header()) this is merely a cosmetic change:
the parameter only matters when building headers for ETH_P_802_2 or ETH_P_802_3, whereas our fake headers are built with ETH_P_IP / ETH_P_IPV6 / 0.
--- drivers/s390/net/qeth_l3_main.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/s390/net/qeth_l3_main.c +3 -4
@@ -1522,10 +1522,10 @@ static void qeth_l3_rebuild_skb(struct qeth_card *card, struct sk_buff *skb,if (hdr->hdr.l3.ext_flags &QETH_HDR_EXT_SRC_MAC_ADDR ) card->dev->header_ops->create (skb, card->dev, prot, tg_addr, &hdr->hdr.l3.next_hop.rx.src_mac, - card->dev->addr_len); + skb->len);else card->dev->header_ops->create (skb, card->dev, prot, - tg_addr,"FAKELL" , card->dev->addr_len); + tg_addr,"FAKELL" , skb->len); } skb->protocol =eth_type_trans (skb, card->dev);
@@ -1584,8 +1584,7 @@ static int qeth_l3_process_inbound_buffer(struct qeth_card *card, skb->dev = card->dev; len = skb->len; card->dev->header_ops->create (skb, card->dev,0 , - card->dev->dev_addr,"FAKELL" , - card->dev->addr_len); + card->dev->dev_addr,"FAKELL" , len);netif_receive_skb (skb); }else {qeth_l3_rebuild_skb (card, skb, hdr);
Signature · 1 line
2.13.5
PATCH 6/12 s390/qeth: allocate skb from NAPI cache
In reply to Julian Wiedmannnapi_alloc_skb() doesn't need to disable IRQs during the allocation, and thus may save us a few cycles.
Doing so requires a small fix-up in the HiperTransport path, which currently assumes a fixed NET_SKB_PAD headroom padding. napi_alloc_skb() adds an additional NET_IP_ALIGN padding, so use the proper helper for setting up the mac_header offset.
Use this opportunity to convert the non-NAPI path to netdev_alloc_skb(), which means that skb->dev is now always set-up during allocation and doesn't need to be assigned manually.
--- drivers/s390/net/qeth_core_main.c | 5 +++-- drivers/s390/net/qeth_l2_main.c | 1 - drivers/s390/net/qeth_l3_main.c | 4 +--- 3 files changed, 4 insertions(+), 6 deletions(-)
drivers/s390/net/qeth_core_main.c +3 -2
@@ -2835,7 +2835,8 @@ static int qeth_init_input_buffer(struct qeth_card *card,int i;if ((card->options.cq ==QETH_CQ_ENABLED ) && (!buf->rx_skb)) { - buf->rx_skb =dev_alloc_skb (QETH_RX_PULL_LEN +ETH_HLEN ); + buf->rx_skb =netdev_alloc_skb (card->dev, +QETH_RX_PULL_LEN +ETH_HLEN );if (!buf->rx_skb)return 1 ; }
@@ -5325,7 +5326,7 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card, }else {unsigned int linear = (use_rx_sg) ?QETH_RX_PULL_LEN : skb_len; - skb =dev_alloc_skb (linear + headroom); + skb =napi_alloc_skb (&card->napi, linear + headroom); }if (!skb) goto no_mem;
drivers/s390/net/qeth_l2_main.c +0 -1
@@ -437,7 +437,6 @@ static int qeth_l2_process_inbound_buffer(struct qeth_card *card, *done =1 ;break ; } - skb->dev = card->dev;switch (hdr->hdr.l2.id) {case QETH_HEADER_TYPE_LAYER2 : skb->pkt_type =PACKET_HOST ;
drivers/s390/net/qeth_l3_main.c +1 -3
@@ -1572,7 +1572,6 @@ static int qeth_l3_process_inbound_buffer(struct qeth_card *card, *done =1 ;break ; } - skb->dev = card->dev;switch (hdr->hdr.l3.id) {case QETH_HEADER_TYPE_LAYER3 : magic = *(__u16 *)skb->data;
@@ -1580,11 +1579,10 @@ static int qeth_l3_process_inbound_buffer(struct qeth_card *card, (magic == ETH_P_AF_IUCV)) { skb->protocol =cpu_to_be16 (ETH_P_AF_IUCV ); skb->pkt_type =PACKET_HOST ; - skb->mac_header =NET_SKB_PAD ; - skb->dev = card->dev; len = skb->len; card->dev->header_ops->create (skb, card->dev,0 , card->dev->dev_addr,"FAKELL" , len); +skb_reset_mac_header (skb);netif_receive_skb (skb); } else {qeth_l3_rebuild_skb (card, skb, hdr);
Signature · 1 line
2.13.5
PATCH 7/12 s390/qeth: reduce RX skb setup
In reply to Julian WiedmannNewly-allocated skbs default to PACKET_HOST, and eth_type_trans() is smart enough to determine any other packet type from the frame's destination address.
So except for the IQD sniffer case, there is no need to set up skb->pkt_type manually.
--- drivers/s390/net/qeth_l2_main.c | 1 - drivers/s390/net/qeth_l3_main.c | 10 +--------- 2 files changed, 1 insertion(+), 10 deletions(-)
drivers/s390/net/qeth_l2_main.c +0 -1
@@ -439,7 +439,6 @@ static int qeth_l2_process_inbound_buffer(struct qeth_card *card, }switch (hdr->hdr.l2.id) {case QETH_HEADER_TYPE_LAYER2 : - skb->pkt_type =PACKET_HOST ; skb->protocol =eth_type_trans (skb, skb->dev); if ((card->dev->features & NETIF_F_RXCSUM) && ((hdr->hdr.l2.flags[1] &
drivers/s390/net/qeth_l3_main.c +1 -9
@@ -1502,23 +1502,17 @@ static void qeth_l3_rebuild_skb(struct qeth_card *card, struct sk_buff *skb,ipv6_eth_mc_map (&ipv6_hdr (skb)->daddr, tg_addr); card->stats.multicast++; - skb->pkt_type =PACKET_MULTICAST ;break ;case QETH_CAST_BROADCAST :ether_addr_copy (tg_addr, card->dev->broadcast); card->stats.multicast++; - skb->pkt_type =PACKET_BROADCAST ;break ; -case QETH_CAST_UNICAST : -case QETH_CAST_ANYCAST : -case QETH_CAST_NOCAST :default :if (card->options.sniffer) skb->pkt_type =PACKET_OTHERHOST ; -else - skb->pkt_type =PACKET_HOST ;ether_addr_copy (tg_addr, card->dev->dev_addr); } +if (hdr->hdr.l3.ext_flags &QETH_HDR_EXT_SRC_MAC_ADDR ) card->dev->header_ops->create(skb, card->dev, prot, tg_addr, &hdr->hdr.l3.next_hop.rx.src_mac,
@@ -1578,7 +1572,6 @@ static int qeth_l3_process_inbound_buffer(struct qeth_card *card,if ((card->info.type ==QETH_CARD_TYPE_IQD ) && (magic ==ETH_P_AF_IUCV )) { skb->protocol =cpu_to_be16 (ETH_P_AF_IUCV ); - skb->pkt_type =PACKET_HOST ; len = skb->len; card->dev->header_ops->create (skb, card->dev,0 , card->dev->dev_addr,"FAKELL" , len);
@@ -1591,7 +1584,6 @@ static int qeth_l3_process_inbound_buffer(struct qeth_card *card, }break ;case QETH_HEADER_TYPE_LAYER2 :/* for HiperSockets sniffer */ - skb->pkt_type =PACKET_HOST ; skb->protocol =eth_type_trans (skb, skb->dev); len = skb->len;netif_receive_skb (skb);
Signature · 1 line
2.13.5
PATCH 8/12 s390/qeth: reset NAPI context during queue init
In reply to Julian Wiedmanninit_qdio_queues() resets the Input Queue's overall QDIO state, and positions the buffer cursor back to 0. So this is the obvious place to also reset the queue's NAPI context (in contrast to doing it rather randomly in the middle of the big set_online() path).
No functional change.
--- drivers/s390/net/qeth_core_main.c | 4 ++-- drivers/s390/net/qeth_l2_main.c | 1 - drivers/s390/net/qeth_l3_main.c | 1 - 3 files changed, 2 insertions(+), 4 deletions(-)
drivers/s390/net/qeth_core_main.c +2 -2
@@ -2873,8 +2873,8 @@ int qeth_init_qdio_queues(struct qeth_card *card)QETH_DBF_TEXT (SETUP ,2 ,"initqdqs" );/* inbound queue */ -qdio_reset_buffers (card->qdio.in_q->qdio_bufs, -QDIO_MAX_BUFFERS_PER_Q ); +qdio_reset_buffers (card->qdio.in_q->qdio_bufs,QDIO_MAX_BUFFERS_PER_Q ); +memset (&card->rx,0 ,sizeof (struct qeth_rx ));qeth_initialize_working_pool_list (card);/*give only as many buffers to hardware as we have buffer pool entries*/ for (i =0 ; i < card->qdio.in_buf_pool.buf_count -1 ; ++i)
drivers/s390/net/qeth_l2_main.c +0 -1
@@ -1087,7 +1087,6 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)qeth_l2_setup_bridgeport_attrs (card); card->state =CARD_STATE_HARDSETUP ; -memset (&card->rx,0 ,sizeof (struct qeth_rx ));qeth_print_status_message (card);/* softsetup */
drivers/s390/net/qeth_l3_main.c +0 -1
@@ -2898,7 +2898,6 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode) card->info.hwtrap =0 ; card->state =CARD_STATE_HARDSETUP ; -memset (&card->rx,0 ,sizeof (struct qeth_rx ));qeth_print_status_message (card);/* softsetup */
Signature · 1 line
2.13.5
PATCH 9/12 s390/qeth: restructure IP notification handlers
In reply to Julian WiedmannExtract a helper that does the actual work & returns the right NOTIFY_* responses, and start putting the temporary ipaddr container objects on the stack rather than kmalloc'ing them. They are small, and this reduces the confusion of which objects actually get added to qeth's IP tables.
--- drivers/s390/net/qeth_l3.h | 10 ++++ drivers/s390/net/qeth_l3_main.c | 102 +++++++++++++++------------------------- 2 files changed, 49 insertions(+), 63 deletions(-)
drivers/s390/net/qeth_l3.h +10 -0
@@ -42,6 +42,16 @@ struct qeth_ipaddr { } u; }; +static inline void qeth_l3_init_ipaddr (struct qeth_ipaddr *addr, +enum qeth_ip_types type, +enum qeth_prot_versions proto) +{ +memset (addr,0 ,sizeof (*addr)); + addr->type = type; + addr->proto = proto; + addr->disp_flag =QETH_DISP_ADDR_DO_NOTHING ; +} +static inline bool qeth_l3_addr_match_ip (struct qeth_ipaddr *a1,struct qeth_ipaddr *a2) {
drivers/s390/net/qeth_l3_main.c +39 -63
146 lines not on this page · raw message
Signature · 1 line
2.13.5
PATCH 10/12 s390/qeth: simplify card look-up on IP notification
In reply to Julian WiedmannOn an IP event, current code tries to determine if the netdev belongs to a L3 card by walking all qeth cards in the system, and then all of their VLAN devices too. Short-cut the whole thing by identifying a L3 device through its netdev_ops.
--- drivers/s390/net/qeth_core.h | 2 -- drivers/s390/net/qeth_l3_main.c | 77 +++++++---------------------------------- 2 files changed, 12 insertions(+), 67 deletions(-)
drivers/s390/net/qeth_core.h +0 -2
@@ -233,8 +233,6 @@ static inline int qeth_is_ipa_enabled(struct qeth_ipa_info *ipa,#define QETH_IDX_FUNC_LEVEL_OSD 0x0101#define QETH_IDX_FUNC_LEVEL_IQD 0x4108 -#define QETH_REAL_CARD 1 -#define QETH_VLAN_CARD 2#define QETH_BUFSIZE 4096/**
drivers/s390/net/qeth_l3_main.c +12 -65
100 lines not on this page · raw message
Signature · 1 line
2.13.5
PATCH 11/12 s390/qeth: extract helpers for managing special IPs
In reply to Julian WiedmannReduce code duplication.
--- drivers/s390/net/qeth_l3.h | 13 +--- drivers/s390/net/qeth_l3_main.c | 158 +++++++++++----------------------------- drivers/s390/net/qeth_l3_sys.c | 51 +++---------- 3 files changed, 57 insertions(+), 165 deletions(-)
drivers/s390/net/qeth_l3.h +4 -9
@@ -119,15 +119,10 @@ int qeth_l3_add_ipato_entry(struct qeth_card *, struct qeth_ipato_entry *);int qeth_l3_del_ipato_entry (struct qeth_card *card,enum qeth_prot_versions proto,u8 *addr,int mask_bits); -int qeth_l3_add_vipa (struct qeth_card *,enum qeth_prot_versions ,const u8 *); -int qeth_l3_del_vipa (struct qeth_card *card,enum qeth_prot_versions proto, -const u8 *addr); -int qeth_l3_add_rxip (struct qeth_card *,enum qeth_prot_versions ,const u8 *); -int qeth_l3_del_rxip (struct qeth_card *card,enum qeth_prot_versions proto, -const u8 *addr);void qeth_l3_update_ipato (struct qeth_card *card); -struct qeth_ipaddr *qeth_l3_get_addr_buffer (enum qeth_prot_versions ); -int qeth_l3_add_ip (struct qeth_card *,struct qeth_ipaddr *); -int qeth_l3_delete_ip (struct qeth_card *,struct qeth_ipaddr *); +int qeth_l3_modify_hsuid (struct qeth_card *card,bool add); +int qeth_l3_modify_rxip_vipa (struct qeth_card *card,bool add,const u8 *ip, +enum qeth_ip_types type, +enum qeth_prot_versions proto);#endif /* __QETH_L3_H__ */
drivers/s390/net/qeth_l3_main.c +41 -117
205 lines not on this page · raw message
drivers/s390/net/qeth_l3_sys.c +12 -39
95 lines not on this page · raw message
Signature · 1 line
2.13.5
PATCH 12/12 s390/qeth: shrink qeth_ipaddr struct
In reply to Julian WiedmannUsing up 8 bytes in every ipaddr object to store SETIP/DELIP flags is rather wasteful. Except for takeover eligibility, the flag values all just depend on the address type, so determine them on demand.
While at it reorder the struct to fill an alignment hole.
--- drivers/s390/net/qeth_core.h | 6 ------ drivers/s390/net/qeth_l3.h | 11 +++++++--- drivers/s390/net/qeth_l3_main.c | 46 ++++++++++++++++++++++------------------- 3 files changed, 33 insertions(+), 30 deletions(-)
drivers/s390/net/qeth_core.h +0 -6
@@ -554,12 +554,6 @@ enum qeth_prot_versions { QETH_PROT_IPV6 = 0x0006, }; -enum qeth_ip_types { -QETH_IP_TYPE_NORMAL , -QETH_IP_TYPE_VIPA , -QETH_IP_TYPE_RXIP , -}; -enum qeth_cmd_buffer_state {BUF_STATE_FREE ,BUF_STATE_LOCKED ,
drivers/s390/net/qeth_l3.h +8 -3
@@ -15,21 +15,26 @@#define QETH_SNIFF_AVAIL 0x0008 +enum qeth_ip_types { +QETH_IP_TYPE_NORMAL , +QETH_IP_TYPE_VIPA , +QETH_IP_TYPE_RXIP , +}; + struct qeth_ipaddr { struct hlist_node hnode; enum qeth_ip_types type; - enum qeth_ipa_setdelip_flags set_flags; - enum qeth_ipa_setdelip_flags del_flags; + unsigned char mac[ETH_ALEN]; u8 is_multicast:1; u8 in_progress:1; u8 disp_flag:2; + u8 ipato:1; /* ucast only */ /* is changed only for normal ip addresses * for non-normal addresses it always is 1 */ int ref_counter; enum qeth_prot_versions proto; - unsigned char mac[ETH_ALEN]; union { struct { unsigned int addr;
drivers/s390/net/qeth_l3_main.c +25 -21
100 lines not on this page · raw message
Signature · 1 line
2.13.5
David Miller
maintainerFrom: Julian Wiedmann <[email protected]>
Date: Fri, 9 Mar 2018 18:12:51 +0100
Quoted 2 lines
here is the current pile of qeth patches for net-next. Just the usual small updates and clean ups. Please apply.
These look good, series applied, thanks.