Commit ea12f1b3 authored by Julian Wiedmann's avatar Julian Wiedmann Committed by Jakub Kicinski

s390/qeth: clean up load/remove code for disciplines

We have two usage patterns:
1. get & ->setup() a new discipline, or
2. ->remove() & put the currently loaded one.

Add corresponding helpers that hide the internals & error handling.
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Reviewed-by: default avatarAlexandra Winter <wintera@linux.ibm.com>
Acked-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 699e4bc8
...@@ -1067,8 +1067,8 @@ extern const struct device_type qeth_generic_devtype; ...@@ -1067,8 +1067,8 @@ extern const struct device_type qeth_generic_devtype;
const char *qeth_get_cardname_short(struct qeth_card *); const char *qeth_get_cardname_short(struct qeth_card *);
int qeth_resize_buffer_pool(struct qeth_card *card, unsigned int count); int qeth_resize_buffer_pool(struct qeth_card *card, unsigned int count);
int qeth_core_load_discipline(struct qeth_card *, enum qeth_discipline_id); int qeth_setup_discipline(struct qeth_card *card, enum qeth_discipline_id disc);
void qeth_core_free_discipline(struct qeth_card *); void qeth_remove_discipline(struct qeth_card *card);
/* exports for qeth discipline device drivers */ /* exports for qeth discipline device drivers */
extern struct kmem_cache *qeth_core_header_cache; extern struct kmem_cache *qeth_core_header_cache;
......
...@@ -6349,9 +6349,11 @@ static int qeth_register_dbf_views(void) ...@@ -6349,9 +6349,11 @@ static int qeth_register_dbf_views(void)
static DEFINE_MUTEX(qeth_mod_mutex); /* for synchronized module loading */ static DEFINE_MUTEX(qeth_mod_mutex); /* for synchronized module loading */
int qeth_core_load_discipline(struct qeth_card *card, int qeth_setup_discipline(struct qeth_card *card,
enum qeth_discipline_id discipline) enum qeth_discipline_id discipline)
{ {
int rc;
mutex_lock(&qeth_mod_mutex); mutex_lock(&qeth_mod_mutex);
switch (discipline) { switch (discipline) {
case QETH_DISCIPLINE_LAYER3: case QETH_DISCIPLINE_LAYER3:
...@@ -6373,12 +6375,25 @@ int qeth_core_load_discipline(struct qeth_card *card, ...@@ -6373,12 +6375,25 @@ int qeth_core_load_discipline(struct qeth_card *card,
return -EINVAL; return -EINVAL;
} }
rc = card->discipline->setup(card->gdev);
if (rc) {
if (discipline == QETH_DISCIPLINE_LAYER2)
symbol_put(qeth_l2_discipline);
else
symbol_put(qeth_l3_discipline);
card->discipline = NULL;
return rc;
}
card->options.layer = discipline; card->options.layer = discipline;
return 0; return 0;
} }
void qeth_core_free_discipline(struct qeth_card *card) void qeth_remove_discipline(struct qeth_card *card)
{ {
card->discipline->remove(card->gdev);
if (IS_LAYER2(card)) if (IS_LAYER2(card))
symbol_put(qeth_l2_discipline); symbol_put(qeth_l2_discipline);
else else
...@@ -6586,23 +6601,18 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev) ...@@ -6586,23 +6601,18 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
default: default:
card->info.layer_enforced = true; card->info.layer_enforced = true;
/* It's so early that we don't need the discipline_mutex yet. */ /* It's so early that we don't need the discipline_mutex yet. */
rc = qeth_core_load_discipline(card, enforced_disc); rc = qeth_setup_discipline(card, enforced_disc);
if (rc) if (rc)
goto err_load; goto err_setup_disc;
gdev->dev.type = IS_OSN(card) ? &qeth_osn_devtype : gdev->dev.type = IS_OSN(card) ? &qeth_osn_devtype :
card->discipline->devtype; card->discipline->devtype;
rc = card->discipline->setup(card->gdev);
if (rc)
goto err_disc;
break; break;
} }
return 0; return 0;
err_disc: err_setup_disc:
qeth_core_free_discipline(card);
err_load:
err_chp_desc: err_chp_desc:
free_netdev(card->dev); free_netdev(card->dev);
err_card: err_card:
...@@ -6619,10 +6629,8 @@ static void qeth_core_remove_device(struct ccwgroup_device *gdev) ...@@ -6619,10 +6629,8 @@ static void qeth_core_remove_device(struct ccwgroup_device *gdev)
QETH_CARD_TEXT(card, 2, "removedv"); QETH_CARD_TEXT(card, 2, "removedv");
mutex_lock(&card->discipline_mutex); mutex_lock(&card->discipline_mutex);
if (card->discipline) { if (card->discipline)
card->discipline->remove(gdev); qeth_remove_discipline(card);
qeth_core_free_discipline(card);
}
mutex_unlock(&card->discipline_mutex); mutex_unlock(&card->discipline_mutex);
qeth_free_qdio_queues(card); qeth_free_qdio_queues(card);
...@@ -6642,14 +6650,9 @@ static int qeth_core_set_online(struct ccwgroup_device *gdev) ...@@ -6642,14 +6650,9 @@ static int qeth_core_set_online(struct ccwgroup_device *gdev)
if (!card->discipline) { if (!card->discipline) {
def_discipline = IS_IQD(card) ? QETH_DISCIPLINE_LAYER3 : def_discipline = IS_IQD(card) ? QETH_DISCIPLINE_LAYER3 :
QETH_DISCIPLINE_LAYER2; QETH_DISCIPLINE_LAYER2;
rc = qeth_core_load_discipline(card, def_discipline); rc = qeth_setup_discipline(card, def_discipline);
if (rc) if (rc)
goto err; goto err;
rc = card->discipline->setup(card->gdev);
if (rc) {
qeth_core_free_discipline(card);
goto err;
}
} }
rc = qeth_set_online(card, card->discipline); rc = qeth_set_online(card, card->discipline);
......
...@@ -384,19 +384,13 @@ static ssize_t qeth_dev_layer2_store(struct device *dev, ...@@ -384,19 +384,13 @@ static ssize_t qeth_dev_layer2_store(struct device *dev,
goto out; goto out;
} }
card->discipline->remove(card->gdev); qeth_remove_discipline(card);
qeth_core_free_discipline(card);
free_netdev(card->dev); free_netdev(card->dev);
card->dev = ndev; card->dev = ndev;
} }
rc = qeth_core_load_discipline(card, newdis); rc = qeth_setup_discipline(card, newdis);
if (rc)
goto out;
rc = card->discipline->setup(card->gdev);
if (rc)
qeth_core_free_discipline(card);
out: out:
mutex_unlock(&card->discipline_mutex); mutex_unlock(&card->discipline_mutex);
return rc ? rc : count; return rc ? rc : count;
......
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