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:46:20 +0000 (06:46 -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 56aacf3..461afc2 100644 (file)
@@ -1370,7 +1370,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;
@@ -1380,7 +1380,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)
@@ -1395,6 +1395,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)
@@ -5090,7 +5091,9 @@ int qeth_core_hardsetup_card(struct qeth_card *card)
 
        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, "%s Retrying to do IDX activates.\n",
@@ -5768,7 +5771,9 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
        gdev->cdev[2]->handler = qeth_irq;
 
        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) {
@@ -5806,6 +5811,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: