]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
s390/qeth: handle error from qeth_update_from_chp_desc()
authorJulian Wiedmann <jwi@linux.ibm.com>
Wed, 17 Apr 2019 16:17:29 +0000 (18:17 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 31 May 2019 13:43:30 +0000 (06:43 -0700)
[ Upstream commit a4cdc9baee0740748f16e50cd70c2607510df492 ]

Subsequent code relies on the values that qeth_update_from_chp_desc()
reads from the CHP descriptor. Rather than dealing with weird errors
later on, just handle it properly here.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/s390/net/qeth_core_main.c

index 44bd6f04c145da55b1aef66ad147983d74cedf9a..8c73a99daff3ecfff0d85197e92c4e9e56742423 100644 (file)
@@ -1308,7 +1308,7 @@ static void qeth_set_multiple_write_queues(struct qeth_card *card)
        card->qdio.no_out_queues = 4;
 }
 
-static void qeth_update_from_chp_desc(struct qeth_card *card)
+static int qeth_update_from_chp_desc(struct qeth_card *card)
 {
        struct ccw_device *ccwdev;
        struct channel_path_desc_fmt0 *chp_dsc;
@@ -1318,7 +1318,7 @@ static void qeth_update_from_chp_desc(struct qeth_card *card)
        ccwdev = card->data.ccwdev;
        chp_dsc = ccw_device_get_chp_desc(ccwdev, 0);
        if (!chp_dsc)
-               goto out;
+               return -ENOMEM;
 
        card->info.func_level = 0x4100 + chp_dsc->desc;
        if (card->info.type == QETH_CARD_TYPE_IQD)
@@ -1333,6 +1333,7 @@ out:
        kfree(chp_dsc);
        QETH_DBF_TEXT_(SETUP, 2, "nr:%x", card->qdio.no_out_queues);
        QETH_DBF_TEXT_(SETUP, 2, "lvl:%02x", card->info.func_level);
+       return 0;
 }
 
 static void qeth_init_qdio_info(struct qeth_card *card)
@@ -4986,7 +4987,9 @@ int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok)
 
        QETH_DBF_TEXT(SETUP, 2, "hrdsetup");
        atomic_set(&card->force_alloc_skb, 0);
-       qeth_update_from_chp_desc(card);
+       rc = qeth_update_from_chp_desc(card);
+       if (rc)
+               return rc;
 retry:
        if (retries < 3)
                QETH_DBF_MESSAGE(2, "Retrying to do IDX activates on device %x.\n",
@@ -5641,7 +5644,9 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
        }
 
        qeth_setup_card(card);
-       qeth_update_from_chp_desc(card);
+       rc = qeth_update_from_chp_desc(card);
+       if (rc)
+               goto err_chp_desc;
 
        card->dev = qeth_alloc_netdev(card);
        if (!card->dev) {
@@ -5676,6 +5681,7 @@ err_disc:
        qeth_core_free_discipline(card);
 err_load:
        free_netdev(card->dev);
+err_chp_desc:
 err_card:
        qeth_core_free_card(card);
 err_dev: