s390/qeth: fixes 2018-11-02
Subsystems (4)
cover s390/qeth: fixes 2018-11-02
Hi Dave,
please apply one round of qeth fixes for -net.
Patch 1 is rather large and removes a use-after-free hazard from many of our debug trace entries.
Patch 2 is yet another fix-up for the L3 subdriver's new IP address management code.
Patch 3 and 4 resolve some fallout from the recent changes wrt how/when qeth allocates its net_device.
Patch 5 makes sure we don't set reserved bits when building HW commands from user-provided data.
And finally, patch 6 allows ethtool to play nice with new HW.
Thanks,
Julian
Julian Wiedmann (6):
s390/qeth: sanitize strings in debug messages s390/qeth: fix HiperSockets sniffer s390/qeth: unregister netdevice only when registered s390/qeth: fix initial operstate
s390/qeth: sanitize ARP requests
s390/qeth: report 25Gbit link speed
drivers/s390/net/qeth_core.h | 27 +++-- drivers/s390/net/qeth_core_main.c | 172 ++++++++++++++++--------------- drivers/s390/net/qeth_core_mpc.h | 4 +- drivers/s390/net/qeth_l2_main.c | 39 +++---- drivers/s390/net/qeth_l3_main.c | 207 +++++++++++++------------------------- 5 files changed, 207 insertions(+), 242 deletions(-)
Signature · 1 line
2.16.4
PATCH 1/6 s390/qeth: sanitize strings in debug messages
As Documentation/s390/s390dbf.txt states quite clearly, using any pointer in sprinf-formatted s390dbf debug entries is dangerous. The pointers are dereferenced whenever the trace file is read from. So if the referenced data has a shorter life-time than the trace file, any read operation can result in a use-after-free.
So rip out all hazardous use of indirect data, and replace any usage of dev_name() and such by the Bus ID number.
--- drivers/s390/net/qeth_core.h | 15 ++++- drivers/s390/net/qeth_core_main.c | 127 +++++++++++++++++--------------------- drivers/s390/net/qeth_l2_main.c | 24 +++---- drivers/s390/net/qeth_l3_main.c | 104 +++++++++++-------------------- 4 files changed, 119 insertions(+), 151 deletions(-)
drivers/s390/net/qeth_core.h +14 -1
@@ -87,6 +87,18 @@ struct qeth_dbf_info {#define SENSE_RESETTING_EVENT_BYTE 1#define SENSE_RESETTING_EVENT_FLAG 0x80 +static inline u32 qeth_get_device_id (struct ccw_device *cdev) +{ +struct ccw_dev_id dev_id; +u32 id; + +ccw_device_get_id (cdev, &dev_id); + id = dev_id.devno; + id |= (u32) (dev_id.ssid <<16 ); + +return id; +} +/* * Common IO related definitions */
@@ -97,7 +109,8 @@ struct qeth_dbf_info {#define CARD_RDEV_ID (card) dev_name(&card->read.ccwdev->dev)#define CARD_WDEV_ID (card) dev_name(&card->write.ccwdev->dev)#define CARD_DDEV_ID (card) dev_name(&card->data.ccwdev->dev) -#define CHANNEL_ID (channel) dev_name(&channel->ccwdev->dev) +#define CCW_DEVID (cdev) (qeth_get_device_id(cdev)) +#define CARD_DEVID (card) (CCW_DEVID(CARD_RDEV(card)))/** * card stuff
drivers/s390/net/qeth_core_main.c +58 -69
275 lines not on this page · raw message
drivers/s390/net/qeth_l2_main.c +12 -12
@@ -146,11 +146,11 @@ static int qeth_l2_write_mac(struct qeth_card *card, u8 *mac)QETH_CARD_TEXT (card,2 ,"L2Wmac" ); rc =qeth_l2_send_setdelmac (card, mac, cmd);if (rc == -EEXIST ) -QETH_DBF_MESSAGE (2 ,"MAC %pM already registered on %s\n" , - mac,QETH_CARD_IFNAME (card)); +QETH_DBF_MESSAGE (2 ,"MAC already registered on device %x\n" , +CARD_DEVID (card));else if (rc) -QETH_DBF_MESSAGE (2 ,"Failed to register MAC %pM on %s: %d\n" , - mac,QETH_CARD_IFNAME (card), rc); +QETH_DBF_MESSAGE (2 ,"Failed to register MAC on device %x: %d\n" , +CARD_DEVID (card), rc);return rc; }
@@ -163,8 +163,8 @@ static int qeth_l2_remove_mac(struct qeth_card *card, u8 *mac)QETH_CARD_TEXT (card,2 ,"L2Rmac" ); rc =qeth_l2_send_setdelmac (card, mac, cmd);if (rc) -QETH_DBF_MESSAGE (2 ,"Failed to delete MAC %pM on %s: %d\n" , - mac,QETH_CARD_IFNAME (card), rc); +QETH_DBF_MESSAGE (2 ,"Failed to delete MAC on device %u: %d\n" , +CARD_DEVID (card), rc);return rc; }
@@ -260,9 +260,9 @@ static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card,QETH_CARD_TEXT (card,2 ,"L2sdvcb" );if (cmd->hdr.return_code) { -QETH_DBF_MESSAGE (2 ,"Error in processing VLAN %i on %s: 0x%x.\n" , +QETH_DBF_MESSAGE (2 ,"Error in processing VLAN %u on device %x: %#x.\n" , cmd->data.setdelvlan.vlan_id, -QETH_CARD_IFNAME (card), cmd->hdr.return_code); +CARD_DEVID (card), cmd->hdr.return_code);QETH_CARD_TEXT_ (card,2 ,"L2VL%4x" , cmd->hdr.command);QETH_CARD_TEXT_ (card,2 ,"err%d" , cmd->hdr.return_code); }
@@ -455,8 +455,8 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card) rc =qeth_vm_request_mac (card);if (!rc) goto out; -QETH_DBF_MESSAGE (2 ,"z/VM MAC Service failed on device %s: x%x\n" , -CARD_BUS_ID (card), rc); +QETH_DBF_MESSAGE (2 ,"z/VM MAC Service failed on device %x: %#x\n" , +CARD_DEVID (card), rc);QETH_DBF_TEXT_ (SETUP ,2 ,"err%04x" , rc);/* fall back to alternative mechanism: */ }
@@ -468,8 +468,8 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card) rc =qeth_setadpparms_change_macaddr (card);if (!rc) goto out; -QETH_DBF_MESSAGE (2 ,"READ_MAC Assist failed on device %s: x%x\n" , -CARD_BUS_ID (card), rc); +QETH_DBF_MESSAGE (2 ,"READ_MAC Assist failed on device %x: %#x\n" , +CARD_DEVID (card), rc);QETH_DBF_TEXT_ (SETUP ,2 ,"1err%04x" , rc);/* fall back once more: */ }
drivers/s390/net/qeth_l3_main.c +35 -69
191 lines not on this page · raw message
Signature · 1 line
2.16.4
PATCH 2/6 s390/qeth: fix HiperSockets sniffer
In reply to Julian WiedmannSniffing mode for L3 HiperSockets requires that no IP addresses are registered with the HW. The preferred way to achieve this is for userspace to delete all the IPs on the interface. But qeth is expected to also tolerate a configuration where that is not the case, by skipping the IP registration when in sniffer mode.
Since commit 5f78e29ceebf ("qeth: optimize IP handling in rx_mode callback") reworked the IP registration logic in the L3 subdriver, this no longer works. When the qeth device is set online, qeth_l3_recover_ip() now unconditionally registers all unicast addresses from our internal IP table.
While we could fix this particular problem by skipping qeth_l3_recover_ip() on a sniffer device, the more future-proof change is to skip the IP address registration at the lowest level. This way we
a) catch any future code path that attempts to register an IP address without considering the sniffer scenario, and
b) continue to build up our internal IP table, so that if sniffer mode is switched off later we can operate just like normal.
--- drivers/s390/net/qeth_l3_main.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/s390/net/qeth_l3_main.c +5 -3
@@ -278,9 +278,6 @@ static void qeth_l3_clear_ip_htable(struct qeth_card *card, int recover)QETH_CARD_TEXT (card,4 ,"clearip" ); -if (recover && card->options.sniffer) -return ; -spin_lock_bh (&card->ip_lock);hash_for_each_safe (card->ip_htable, i, tmp, addr, hnode) {
@@ -661,6 +658,8 @@ static int qeth_l3_register_addr_entry(struct qeth_card *card,int rc =0 ;int cnt =3 ; +if (card->options.sniffer) +return 0 ;if (addr->proto ==QETH_PROT_IPV4 ) {QETH_CARD_TEXT (card,2 ,"setaddr4" );
@@ -695,6 +694,9 @@ static int qeth_l3_deregister_addr_entry(struct qeth_card *card, {int rc =0 ; +if (card->options.sniffer) +return 0 ; +if (addr->proto ==QETH_PROT_IPV4 ) {QETH_CARD_TEXT (card,2 ,"deladdr4" );QETH_CARD_HEX (card,3 , &addr->u.a4.addr,sizeof (int ));
Signature · 1 line
2.16.4
PATCH 3/6 s390/qeth: unregister netdevice only when registered
In reply to Julian Wiedmannqeth only registers its netdevice when the qeth device is first set online. Thus a device that has never been set online will trigger a WARN ("network todo 'hsi%d' but state 0") in unregister_netdev() when removed.
Fix this by protecting the unregister step, just like we already protect against repeated registering of the netdevice.
--- drivers/s390/net/qeth_core.h | 5 +++++ drivers/s390/net/qeth_l2_main.c | 5 +++-- drivers/s390/net/qeth_l3_main.c | 5 +++-- 3 files changed, 11 insertions(+), 4 deletions(-)
drivers/s390/net/qeth_core.h +5 -0
@@ -843,6 +843,11 @@ struct qeth_trap_id {/*some helper functions*/ #define QETH_CARD_IFNAME (card) (((card)->dev)? (card)->dev->name : "") +static inline bool qeth_netdev_is_registered (struct net_device *dev) +{ +return dev->netdev_ops !=NULL ; +} +static inline void qeth_scrub_qdio_buffer (struct qdio_buffer *buf,unsigned int elements) {
drivers/s390/net/qeth_l2_main.c +3 -2
@@ -826,7 +826,8 @@ static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)if (cgdev->state ==CCWGROUP_ONLINE )qeth_l2_set_offline (cgdev); -unregister_netdev (card->dev); +if (qeth_netdev_is_registered (card->dev)) +unregister_netdev (card->dev); }static const struct ethtool_ops qeth_l2_ethtool_ops = {
@@ -866,7 +867,7 @@ static int qeth_l2_setup_netdev(struct qeth_card *card) {int rc; -if (card->dev->netdev_ops) +if (qeth_netdev_is_registered (card->dev))return 0 ; card->dev->priv_flags |=IFF_UNICAST_FLT ;
drivers/s390/net/qeth_l3_main.c +3 -2
@@ -2356,7 +2356,7 @@ static int qeth_l3_setup_netdev(struct qeth_card *card)unsigned int headroom;int rc; -if (card->dev->netdev_ops) +if (qeth_netdev_is_registered (card->dev))return 0 ; if (card->info.type == QETH_CARD_TYPE_OSD ||
@@ -2465,7 +2465,8 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev)if (cgdev->state ==CCWGROUP_ONLINE )qeth_l3_set_offline (cgdev); -unregister_netdev (card->dev); +if (qeth_netdev_is_registered (card->dev)) +unregister_netdev (card->dev);qeth_l3_clear_ip_htable (card,0 );qeth_l3_clear_ipato_list (card); }
Signature · 1 line
2.16.4
PATCH 4/6 s390/qeth: fix initial operstate
In reply to Julian WiedmannSetting the carrier 'on' for an unregistered netdevice doesn't update its operstate. Fix this by delaying the update until the netdevice has been registered.
--- drivers/s390/net/qeth_core.h | 2 +- drivers/s390/net/qeth_core_main.c | 13 ++++++++++--- drivers/s390/net/qeth_l2_main.c | 10 +++++++--- drivers/s390/net/qeth_l3_main.c | 10 +++++++--- 4 files changed, 25 insertions(+), 10 deletions(-)
drivers/s390/net/qeth_core.h +1 -1
@@ -991,7 +991,7 @@ int qeth_wait_for_threads(struct qeth_card *, unsigned long);int qeth_do_run_thread (struct qeth_card *,unsigned long );void qeth_clear_thread_start_bit (struct qeth_card *,unsigned long );void qeth_clear_thread_running_bit (struct qeth_card *,unsigned long ); -int qeth_core_hardsetup_card (struct qeth_card *); +int qeth_core_hardsetup_card (struct qeth_card *card,bool *carrier_ok);void qeth_print_status_message (struct qeth_card *);int qeth_init_qdio_queues (struct qeth_card *); int qeth_send_ipa_cmd(struct qeth_card *, struct qeth_cmd_buffer *,
drivers/s390/net/qeth_core_main.c +10 -3
@@ -5075,7 +5075,7 @@ static struct ccw_driver qeth_ccw_driver = { .remove = ccwgroup_remove_ccwdev, }; -int qeth_core_hardsetup_card (struct qeth_card *card) +int qeth_core_hardsetup_card (struct qeth_card *card,bool *carrier_ok) {int retries =3 ;int rc;
@@ -5150,13 +5150,20 @@ int qeth_core_hardsetup_card(struct qeth_card *card)if (rc ==IPA_RC_LAN_OFFLINE ) {dev_warn (&card->gdev->dev,"The LAN is offline\n" ); -netif_carrier_off (card->dev); + *carrier_ok = false; }else { rc = -ENODEV ; goto out; } }else { -netif_carrier_on (card->dev); + *carrier_ok = true; + } + +if (qeth_netdev_is_registered (card->dev)) { +if (*carrier_ok) +netif_carrier_on (card->dev); +else +netif_carrier_off (card->dev); } card->options.ipa4.supported_funcs =0 ;
drivers/s390/net/qeth_l2_main.c +7 -3
@@ -863,7 +863,7 @@ static const struct net_device_ops qeth_l2_netdev_ops = { .ndo_set_features = qeth_set_features }; -static int qeth_l2_setup_netdev (struct qeth_card *card) +static int qeth_l2_setup_netdev (struct qeth_card *card,bool carrier_ok) {int rc;
@@ -920,6 +920,9 @@ static int qeth_l2_setup_netdev(struct qeth_card *card)qeth_l2_request_initial_mac (card);netif_napi_add (card->dev, &card->napi, qeth_poll,QETH_NAPI_WEIGHT ); rc =register_netdev (card->dev); +if (!rc && carrier_ok) +netif_carrier_on (card->dev); +if (rc) card->dev->netdev_ops =NULL ;return rc;
@@ -950,6 +953,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)struct qeth_card *card =dev_get_drvdata (&gdev->dev);int rc =0 ;enum qeth_card_states recover_flag; +bool carrier_ok;mutex_lock (&card->discipline_mutex);mutex_lock (&card->conf_mutex);
@@ -957,7 +961,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)QETH_DBF_HEX (SETUP ,2 , &card,sizeof (void *)); recover_flag = card->state; - rc =qeth_core_hardsetup_card (card); + rc =qeth_core_hardsetup_card (card, &carrier_ok);if (rc) {QETH_DBF_TEXT_ (SETUP ,2 ,"2err%04x" , rc); rc = -ENODEV ;
@@ -968,7 +972,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)dev_info (&card->gdev->dev,"The device represents a Bridge Capable Port\n" ); - rc =qeth_l2_setup_netdev (card); + rc =qeth_l2_setup_netdev (card, carrier_ok);if (rc) goto out_remove;
drivers/s390/net/qeth_l3_main.c +7 -3
@@ -2351,7 +2351,7 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = { .ndo_neigh_setup = qeth_l3_neigh_setup, }; -static int qeth_l3_setup_netdev (struct qeth_card *card) +static int qeth_l3_setup_netdev (struct qeth_card *card,bool carrier_ok) {unsigned int headroom;int rc;
@@ -2425,6 +2425,9 @@ static int qeth_l3_setup_netdev(struct qeth_card *card)netif_napi_add (card->dev, &card->napi, qeth_poll,QETH_NAPI_WEIGHT ); rc =register_netdev (card->dev); +if (!rc && carrier_ok) +netif_carrier_on (card->dev); + out:if (rc) card->dev->netdev_ops =NULL ;
@@ -2476,6 +2479,7 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)struct qeth_card *card =dev_get_drvdata (&gdev->dev);int rc =0 ;enum qeth_card_states recover_flag; +bool carrier_ok;mutex_lock (&card->discipline_mutex);mutex_lock (&card->conf_mutex);
@@ -2483,14 +2487,14 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)QETH_DBF_HEX (SETUP ,2 , &card,sizeof (void *)); recover_flag = card->state; - rc =qeth_core_hardsetup_card (card); + rc =qeth_core_hardsetup_card (card, &carrier_ok);if (rc) {QETH_DBF_TEXT_ (SETUP ,2 ,"2err%04x" , rc); rc = -ENODEV ; goto out_remove; } - rc =qeth_l3_setup_netdev (card); + rc =qeth_l3_setup_netdev (card, carrier_ok);if (rc) goto out_remove;
Signature · 1 line
2.16.4
PATCH 5/6 s390/qeth: sanitize ARP requests
In reply to Julian WiedmannThe ARP_{ADD,REMOVE}_ENTRY cmd structs contain reserved fields. Introduce a common helper that doesn't raw-copy the user-provided data into the cmd, but only sets those fields that are strictly needed for the command.
This also sets the correct command length for ARP_REMOVE_ENTRY.
--- drivers/s390/net/qeth_core.h | 5 --- drivers/s390/net/qeth_core_main.c | 12 ++--- drivers/s390/net/qeth_core_mpc.h | 2 +- drivers/s390/net/qeth_l3_main.c | 94 +++++++++++---------------------------- 4 files changed, 34 insertions(+), 79 deletions(-)
drivers/s390/net/qeth_core.h +0 -5
@@ -1046,11 +1046,6 @@ int qeth_configure_cq(struct qeth_card *, enum qeth_cq);int qeth_hw_trap (struct qeth_card *,enum qeth_diags_trap_action );void qeth_trace_features (struct qeth_card *);void qeth_close_dev (struct qeth_card *); -int qeth_send_setassparms (struct qeth_card *,struct qeth_cmd_buffer *,__u16 , -long , -int (*reply_cb)(struct qeth_card *, -struct qeth_reply *,unsigned long ), -void *);int qeth_setassparms_cb (struct qeth_card *,struct qeth_reply *,unsigned long ); struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *, enum qeth_ipa_funcs,
drivers/s390/net/qeth_core_main.c +6 -6
@@ -5477,11 +5477,12 @@ struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *card, }EXPORT_SYMBOL_GPL (qeth_get_setassparms_cmd); -int qeth_send_setassparms (struct qeth_card *card, -struct qeth_cmd_buffer *iob,__u16 len,long data, -int (*reply_cb)(struct qeth_card *, -struct qeth_reply *,unsigned long ), -void *reply_param) +static int qeth_send_setassparms (struct qeth_card *card, +struct qeth_cmd_buffer *iob,u16 len, +long data,int (*reply_cb)(struct qeth_card *, +struct qeth_reply *, +unsigned long ), +void *reply_param) {int rc;struct qeth_ipa_cmd *cmd;
@@ -5497,7 +5498,6 @@ int qeth_send_setassparms(struct qeth_card *card, rc =qeth_send_ipa_cmd (card, iob, reply_cb, reply_param);return rc; } -EXPORT_SYMBOL_GPL (qeth_send_setassparms); int qeth_send_simple_setassparms_prot(struct qeth_card *card, enum qeth_ipa_funcs ipa_func,
drivers/s390/net/qeth_core_mpc.h +1 -1
@@ -436,7 +436,7 @@ struct qeth_ipacmd_setassparms {__u32 flags_32bit;struct qeth_ipa_caps caps;struct qeth_checksum_cmd chksum; -struct qeth_arp_cache_entry add_arp_entry; +struct qeth_arp_cache_entry arp_entry;struct qeth_arp_query_data query_arp;struct qeth_tso_start_data tso;__u8 ip[16 ];
drivers/s390/net/qeth_l3_main.c +27 -67
127 lines not on this page · raw message
Signature · 1 line
2.16.4
PATCH 6/6 s390/qeth: report 25Gbit link speed
In reply to Julian WiedmannThis adds the various identifiers for 25Gbit cards, and wires them up into sysfs and ethtool.
--- drivers/s390/net/qeth_core_main.c | 20 ++++++++++++++++++-- drivers/s390/net/qeth_core_mpc.h | 2 ++ 2 files changed, 20 insertions(+), 2 deletions(-)
drivers/s390/net/qeth_core_main.c +18 -2
@@ -167,6 +167,8 @@ const char *qeth_get_cardname_short(struct qeth_card *card)return "OSD_1000" ;case QETH_LINK_TYPE_10GBIT_ETH :return "OSD_10GIG" ; +case QETH_LINK_TYPE_25GBIT_ETH : +return "OSD_25GIG" ;case QETH_LINK_TYPE_LANE_ETH100 :return "OSD_FE_LANE" ;case QETH_LINK_TYPE_LANE_TR :
@@ -4432,7 +4434,8 @@ static int qeth_mdio_read(struct net_device *dev, int phy_id, int regnum) rc =BMCR_FULLDPLX ;if ((card->info.link_type !=QETH_LINK_TYPE_GBIT_ETH ) && (card->info.link_type !=QETH_LINK_TYPE_OSN ) && - (card->info.link_type !=QETH_LINK_TYPE_10GBIT_ETH )) + (card->info.link_type !=QETH_LINK_TYPE_10GBIT_ETH ) && + (card->info.link_type !=QETH_LINK_TYPE_25GBIT_ETH )) rc |=BMCR_SPEED100 ;break ;case MII_BMSR :/* Basic mode status register */
@@ -6166,8 +6169,14 @@ static void qeth_set_cmd_adv_sup(struct ethtool_link_ksettings *cmd,WARN_ON_ONCE (1 ); } -/* fallthrough from high to low, to select all legal speeds: */ +/* partially does fall through, to also select lower speeds */ switch (maxspeed) { +case SPEED_25000 : +ethtool_link_ksettings_add_link_mode (cmd, supported, + 25000baseSR_Full); +ethtool_link_ksettings_add_link_mode (cmd, advertising, + 25000baseSR_Full); +break ;case SPEED_10000 :ethtool_link_ksettings_add_link_mode (cmd, supported, 10000baseT_Full);
@@ -6250,6 +6259,10 @@ int qeth_core_ethtool_get_link_ksettings(struct net_device *netdev, cmd->base.speed =SPEED_10000 ; cmd->base.port =PORT_FIBRE ;break ; +case QETH_LINK_TYPE_25GBIT_ETH : + cmd->base.speed =SPEED_25000 ; + cmd->base.port =PORT_FIBRE ; +break ;default : cmd->base.speed =SPEED_10 ; cmd->base.port =PORT_TP ;
@@ -6316,6 +6329,9 @@ int qeth_core_ethtool_get_link_ksettings(struct net_device *netdev,case CARD_INFO_PORTS_10G : cmd->base.speed =SPEED_10000 ;break ; +case CARD_INFO_PORTS_25G : + cmd->base.speed =SPEED_25000 ; +break ; }return 0 ;
drivers/s390/net/qeth_core_mpc.h +2 -0
@@ -90,6 +90,7 @@ enum qeth_link_types {QETH_LINK_TYPE_GBIT_ETH =0x03 ,QETH_LINK_TYPE_OSN =0x04 ,QETH_LINK_TYPE_10GBIT_ETH =0x10 , +QETH_LINK_TYPE_25GBIT_ETH =0x12 ,QETH_LINK_TYPE_LANE_ETH100 =0x81 ,QETH_LINK_TYPE_LANE_TR =0x82 , QETH_LINK_TYPE_LANE_ETH1000 = 0x83,
@@ -347,6 +348,7 @@ enum qeth_card_info_port_speed {CARD_INFO_PORTS_100M =0x00000006 ,CARD_INFO_PORTS_1G =0x00000007 ,CARD_INFO_PORTS_10G =0x00000008 , + CARD_INFO_PORTS_25G = 0x0000000A, };/* (SET)DELIP(M) IPA stuff ***************************************************/
Signature · 1 line
2.16.4
David Miller
maintainerFrom: Julian Wiedmann <[email protected]>
Date: Fri, 2 Nov 2018 19:04:07 +0100
Quoted 11 lines
please apply one round of qeth fixes for -net.
Patch 1 is rather large and removes a use-after-free hazard from many of our debug trace entries.
Patch 2 is yet another fix-up for the L3 subdriver's new IP address management code.
Patch 3 and 4 resolve some fallout from the recent changes wrt how/when qeth allocates itsnet_device.
Patch 5 makes sure we don't set reserved bits when building HW commands from user-provided data.
And finally, patch 6 allows ethtool to play nice with new HW.
Series applied.