s390/qeth: set static link info during initialization
authorJulian Wiedmann <jwi@linux.ibm.com>
Tue, 17 Nov 2020 16:15:17 +0000 (17:15 +0100)
committerJakub Kicinski <kuba@kernel.org>
Thu, 19 Nov 2020 01:34:19 +0000 (17:34 -0800)
Hard-code the minimal link info at initialization time, after we
obtained the link_type. qeth_get_link_ksettings() can still override
this with more accurate data from QUERY CARD INFO later on.

Don't set arbitrary defaults for unknown OSA link types, they
certainly won't match any future type.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/s390/net/qeth_core.h
drivers/s390/net/qeth_core_main.c
drivers/s390/net/qeth_ethtool.c

index a4db7684d084c267c860163d7fb402c7dad3e62b..843385f9eae03f6a4fbf4ce4a48527725da03e9a 100644 (file)
@@ -738,6 +738,7 @@ struct qeth_card_info {
        struct qeth_card_blkt blkt;
        __u32 diagass_support;
        __u32 hwtrap;
+       struct qeth_link_info link_info;
 };
 
 enum qeth_discipline_id {
index 39530f8e477f8dcc21269d723fd771fa334ab8c0..10997118d0b6ebe8cd6dda05458cc313bff1ae16 100644 (file)
@@ -4951,6 +4951,42 @@ int qeth_query_card_info(struct qeth_card *card,
        return qeth_send_ipa_cmd(card, iob, qeth_query_card_info_cb, link_info);
 }
 
+static void qeth_init_link_info(struct qeth_card *card)
+{
+       card->info.link_info.duplex = DUPLEX_FULL;
+
+       if (IS_IQD(card) || IS_VM_NIC(card)) {
+               card->info.link_info.speed = SPEED_10000;
+               card->info.link_info.port = PORT_FIBRE;
+       } else {
+               switch (card->info.link_type) {
+               case QETH_LINK_TYPE_FAST_ETH:
+               case QETH_LINK_TYPE_LANE_ETH100:
+                       card->info.link_info.speed = SPEED_100;
+                       card->info.link_info.port = PORT_TP;
+                       break;
+               case QETH_LINK_TYPE_GBIT_ETH:
+               case QETH_LINK_TYPE_LANE_ETH1000:
+                       card->info.link_info.speed = SPEED_1000;
+                       card->info.link_info.port = PORT_FIBRE;
+                       break;
+               case QETH_LINK_TYPE_10GBIT_ETH:
+                       card->info.link_info.speed = SPEED_10000;
+                       card->info.link_info.port = PORT_FIBRE;
+                       break;
+               case QETH_LINK_TYPE_25GBIT_ETH:
+                       card->info.link_info.speed = SPEED_25000;
+                       card->info.link_info.port = PORT_FIBRE;
+                       break;
+               default:
+                       dev_info(&card->gdev->dev, "Unknown link type %x\n",
+                                card->info.link_type);
+                       card->info.link_info.speed = SPEED_UNKNOWN;
+                       card->info.link_info.port = PORT_OTHER;
+               }
+       }
+}
+
 /**
  * qeth_vm_request_mac() - Request a hypervisor-managed MAC address
  * @card: pointer to a qeth_card
@@ -5335,6 +5371,8 @@ retriable:
                        goto out;
        }
 
+       qeth_init_link_info(card);
+
        rc = qeth_init_qdio_queues(card);
        if (rc) {
                QETH_CARD_TEXT_(card, 2, "9err%d", rc);
index a6455819f403d1e629e2b76cb14e1848071d310c..b8e74018b44fb756c0957405cb51013e35676fa5 100644 (file)
@@ -410,44 +410,16 @@ static int qeth_get_link_ksettings(struct net_device *netdev,
 {
        struct qeth_card *card = netdev->ml_priv;
        struct qeth_link_info link_info;
-       enum qeth_link_types link_type;
 
-       if (IS_IQD(card) || IS_VM_NIC(card))
-               link_type = QETH_LINK_TYPE_10GBIT_ETH;
-       else
-               link_type = card->info.link_type;
-
-       cmd->base.duplex = DUPLEX_FULL;
+       cmd->base.speed = card->info.link_info.speed;
+       cmd->base.duplex = card->info.link_info.duplex;
+       cmd->base.port = card->info.link_info.port;
        cmd->base.autoneg = AUTONEG_ENABLE;
        cmd->base.phy_address = 0;
        cmd->base.mdio_support = 0;
        cmd->base.eth_tp_mdix = ETH_TP_MDI_INVALID;
        cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID;
 
-       switch (link_type) {
-       case QETH_LINK_TYPE_FAST_ETH:
-       case QETH_LINK_TYPE_LANE_ETH100:
-               cmd->base.speed = SPEED_100;
-               cmd->base.port = PORT_TP;
-               break;
-       case QETH_LINK_TYPE_GBIT_ETH:
-       case QETH_LINK_TYPE_LANE_ETH1000:
-               cmd->base.speed = SPEED_1000;
-               cmd->base.port = PORT_FIBRE;
-               break;
-       case QETH_LINK_TYPE_10GBIT_ETH:
-               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;
-       }
-
        /* Check if we can obtain more accurate information.     */
        if (!qeth_query_card_info(card, &link_info)) {
                if (link_info.speed != SPEED_UNKNOWN)