Commit 3711c988 authored by Julian Wiedmann's avatar Julian Wiedmann Committed by Greg Kroah-Hartman

s390/qeth: handle error from qeth_update_from_chp_desc()

[ Upstream commit a4cdc9ba ]

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: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 5d5652b5
...@@ -1370,7 +1370,7 @@ static void qeth_set_multiple_write_queues(struct qeth_card *card) ...@@ -1370,7 +1370,7 @@ static void qeth_set_multiple_write_queues(struct qeth_card *card)
card->qdio.no_out_queues = 4; 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 ccw_device *ccwdev;
struct channel_path_desc_fmt0 *chp_dsc; struct channel_path_desc_fmt0 *chp_dsc;
...@@ -1380,7 +1380,7 @@ static void qeth_update_from_chp_desc(struct qeth_card *card) ...@@ -1380,7 +1380,7 @@ static void qeth_update_from_chp_desc(struct qeth_card *card)
ccwdev = card->data.ccwdev; ccwdev = card->data.ccwdev;
chp_dsc = ccw_device_get_chp_desc(ccwdev, 0); chp_dsc = ccw_device_get_chp_desc(ccwdev, 0);
if (!chp_dsc) if (!chp_dsc)
goto out; return -ENOMEM;
card->info.func_level = 0x4100 + chp_dsc->desc; card->info.func_level = 0x4100 + chp_dsc->desc;
if (card->info.type == QETH_CARD_TYPE_IQD) if (card->info.type == QETH_CARD_TYPE_IQD)
...@@ -1395,6 +1395,7 @@ static void qeth_update_from_chp_desc(struct qeth_card *card) ...@@ -1395,6 +1395,7 @@ static void qeth_update_from_chp_desc(struct qeth_card *card)
kfree(chp_dsc); kfree(chp_dsc);
QETH_DBF_TEXT_(SETUP, 2, "nr:%x", card->qdio.no_out_queues); QETH_DBF_TEXT_(SETUP, 2, "nr:%x", card->qdio.no_out_queues);
QETH_DBF_TEXT_(SETUP, 2, "lvl:%02x", card->info.func_level); QETH_DBF_TEXT_(SETUP, 2, "lvl:%02x", card->info.func_level);
return 0;
} }
static void qeth_init_qdio_info(struct qeth_card *card) static void qeth_init_qdio_info(struct qeth_card *card)
...@@ -5090,7 +5091,9 @@ int qeth_core_hardsetup_card(struct qeth_card *card) ...@@ -5090,7 +5091,9 @@ int qeth_core_hardsetup_card(struct qeth_card *card)
QETH_DBF_TEXT(SETUP, 2, "hrdsetup"); QETH_DBF_TEXT(SETUP, 2, "hrdsetup");
atomic_set(&card->force_alloc_skb, 0); 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: retry:
if (retries < 3) if (retries < 3)
QETH_DBF_MESSAGE(2, "%s Retrying to do IDX activates.\n", 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) ...@@ -5768,7 +5771,9 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
gdev->cdev[2]->handler = qeth_irq; gdev->cdev[2]->handler = qeth_irq;
qeth_setup_card(card); 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); card->dev = qeth_alloc_netdev(card);
if (!card->dev) { if (!card->dev) {
...@@ -5806,6 +5811,7 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev) ...@@ -5806,6 +5811,7 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
qeth_core_free_discipline(card); qeth_core_free_discipline(card);
err_load: err_load:
free_netdev(card->dev); free_netdev(card->dev);
err_chp_desc:
err_card: err_card:
qeth_core_free_card(card); qeth_core_free_card(card);
err_dev: err_dev:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment