Commit b7ea041b authored by Julian Wiedmann's avatar Julian Wiedmann Committed by David S. Miller

s390/qeth: consolidate online code

Move duplicated code from the disciplines into the core path.
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7fb7fe5c
...@@ -753,7 +753,7 @@ struct qeth_discipline { ...@@ -753,7 +753,7 @@ struct qeth_discipline {
const struct device_type *devtype; const struct device_type *devtype;
int (*setup) (struct ccwgroup_device *); int (*setup) (struct ccwgroup_device *);
void (*remove) (struct ccwgroup_device *); void (*remove) (struct ccwgroup_device *);
int (*set_online)(struct qeth_card *card); int (*set_online)(struct qeth_card *card, bool carrier_ok);
void (*set_offline)(struct qeth_card *card); void (*set_offline)(struct qeth_card *card);
int (*do_ioctl)(struct net_device *dev, struct ifreq *rq, int cmd); int (*do_ioctl)(struct net_device *dev, struct ifreq *rq, int cmd);
int (*control_event_handler)(struct qeth_card *card, int (*control_event_handler)(struct qeth_card *card,
...@@ -1037,11 +1037,8 @@ struct net_device *qeth_clone_netdev(struct net_device *orig); ...@@ -1037,11 +1037,8 @@ struct net_device *qeth_clone_netdev(struct net_device *orig);
struct qeth_card *qeth_get_card_by_busid(char *bus_id); struct qeth_card *qeth_get_card_by_busid(char *bus_id);
void qeth_set_allowed_threads(struct qeth_card *, unsigned long , int); void qeth_set_allowed_threads(struct qeth_card *, unsigned long , int);
int qeth_threads_running(struct qeth_card *, unsigned long); int qeth_threads_running(struct qeth_card *, unsigned long);
int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok);
int qeth_stop_channel(struct qeth_channel *channel);
int qeth_set_offline(struct qeth_card *card, bool resetting); int qeth_set_offline(struct qeth_card *card, bool resetting);
void qeth_print_status_message(struct qeth_card *);
int qeth_send_ipa_cmd(struct qeth_card *, struct qeth_cmd_buffer *, int qeth_send_ipa_cmd(struct qeth_card *, struct qeth_cmd_buffer *,
int (*reply_cb) int (*reply_cb)
(struct qeth_card *, struct qeth_reply *, unsigned long), (struct qeth_card *, struct qeth_reply *, unsigned long),
...@@ -1093,7 +1090,6 @@ int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); ...@@ -1093,7 +1090,6 @@ int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
void qeth_dbf_longtext(debug_info_t *id, int level, char *text, ...); void qeth_dbf_longtext(debug_info_t *id, int level, char *text, ...);
int qeth_configure_cq(struct qeth_card *, enum qeth_cq); int qeth_configure_cq(struct qeth_card *, enum qeth_cq);
int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action); int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action);
void qeth_trace_features(struct qeth_card *);
int qeth_setassparms_cb(struct qeth_card *, struct qeth_reply *, unsigned long); int qeth_setassparms_cb(struct qeth_card *, struct qeth_reply *, unsigned long);
int qeth_setup_netdev(struct qeth_card *card); int qeth_setup_netdev(struct qeth_card *card);
int qeth_set_features(struct net_device *, netdev_features_t); int qeth_set_features(struct net_device *, netdev_features_t);
......
...@@ -1753,7 +1753,7 @@ static int qeth_halt_channel(struct qeth_card *card, ...@@ -1753,7 +1753,7 @@ static int qeth_halt_channel(struct qeth_card *card,
return 0; return 0;
} }
int qeth_stop_channel(struct qeth_channel *channel) static int qeth_stop_channel(struct qeth_channel *channel)
{ {
struct ccw_device *cdev = channel->ccwdev; struct ccw_device *cdev = channel->ccwdev;
int rc; int rc;
...@@ -1771,7 +1771,6 @@ int qeth_stop_channel(struct qeth_channel *channel) ...@@ -1771,7 +1771,6 @@ int qeth_stop_channel(struct qeth_channel *channel)
return rc; return rc;
} }
EXPORT_SYMBOL_GPL(qeth_stop_channel);
static int qeth_start_channel(struct qeth_channel *channel) static int qeth_start_channel(struct qeth_channel *channel)
{ {
...@@ -2866,7 +2865,7 @@ static int qeth_mpc_initialize(struct qeth_card *card) ...@@ -2866,7 +2865,7 @@ static int qeth_mpc_initialize(struct qeth_card *card)
return 0; return 0;
} }
void qeth_print_status_message(struct qeth_card *card) static void qeth_print_status_message(struct qeth_card *card)
{ {
switch (card->info.type) { switch (card->info.type) {
case QETH_CARD_TYPE_OSD: case QETH_CARD_TYPE_OSD:
...@@ -2907,7 +2906,6 @@ void qeth_print_status_message(struct qeth_card *card) ...@@ -2907,7 +2906,6 @@ void qeth_print_status_message(struct qeth_card *card)
(card->info.mcl_level[0]) ? ")" : "", (card->info.mcl_level[0]) ? ")" : "",
qeth_get_cardname_short(card)); qeth_get_cardname_short(card));
} }
EXPORT_SYMBOL_GPL(qeth_print_status_message);
static void qeth_initialize_working_pool_list(struct qeth_card *card) static void qeth_initialize_working_pool_list(struct qeth_card *card)
{ {
...@@ -5123,7 +5121,7 @@ static void qeth_core_free_card(struct qeth_card *card) ...@@ -5123,7 +5121,7 @@ static void qeth_core_free_card(struct qeth_card *card)
kfree(card); kfree(card);
} }
void qeth_trace_features(struct qeth_card *card) static void qeth_trace_features(struct qeth_card *card)
{ {
QETH_CARD_TEXT(card, 2, "features"); QETH_CARD_TEXT(card, 2, "features");
QETH_CARD_HEX(card, 2, &card->options.ipa4, sizeof(card->options.ipa4)); QETH_CARD_HEX(card, 2, &card->options.ipa4, sizeof(card->options.ipa4));
...@@ -5132,7 +5130,6 @@ void qeth_trace_features(struct qeth_card *card) ...@@ -5132,7 +5130,6 @@ void qeth_trace_features(struct qeth_card *card)
QETH_CARD_HEX(card, 2, &card->info.diagass_support, QETH_CARD_HEX(card, 2, &card->info.diagass_support,
sizeof(card->info.diagass_support)); sizeof(card->info.diagass_support));
} }
EXPORT_SYMBOL_GPL(qeth_trace_features);
static struct ccw_device_id qeth_ids[] = { static struct ccw_device_id qeth_ids[] = {
{CCW_DEVICE_DEVTYPE(0x1731, 0x01, 0x1732, 0x01), {CCW_DEVICE_DEVTYPE(0x1731, 0x01, 0x1732, 0x01),
...@@ -5163,7 +5160,7 @@ static struct ccw_driver qeth_ccw_driver = { ...@@ -5163,7 +5160,7 @@ static struct ccw_driver qeth_ccw_driver = {
.remove = ccwgroup_remove_ccwdev, .remove = ccwgroup_remove_ccwdev,
}; };
int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok) static int qeth_hardsetup_card(struct qeth_card *card, bool *carrier_ok)
{ {
int retries = 3; int retries = 3;
int rc; int rc;
...@@ -5277,6 +5274,8 @@ int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok) ...@@ -5277,6 +5274,8 @@ int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok)
QETH_CARD_TEXT_(card, 2, "8err%d", rc); QETH_CARD_TEXT_(card, 2, "8err%d", rc);
} }
qeth_trace_features(card);
if (!qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP) || if (!qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP) ||
(card->info.hwtrap && qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM))) (card->info.hwtrap && qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM)))
card->info.hwtrap = 0; card->info.hwtrap = 0;
...@@ -5302,21 +5301,45 @@ int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok) ...@@ -5302,21 +5301,45 @@ int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok)
CARD_DEVID(card), rc); CARD_DEVID(card), rc);
return rc; return rc;
} }
EXPORT_SYMBOL_GPL(qeth_core_hardsetup_card);
static int qeth_set_online(struct qeth_card *card) static int qeth_set_online(struct qeth_card *card)
{ {
bool carrier_ok;
int rc; int rc;
mutex_lock(&card->discipline_mutex); mutex_lock(&card->discipline_mutex);
mutex_lock(&card->conf_mutex); mutex_lock(&card->conf_mutex);
QETH_CARD_TEXT(card, 2, "setonlin"); QETH_CARD_TEXT(card, 2, "setonlin");
rc = card->discipline->set_online(card); rc = qeth_hardsetup_card(card, &carrier_ok);
if (rc) {
QETH_CARD_TEXT_(card, 2, "2err%04x", rc);
rc = -ENODEV;
goto err_hardsetup;
}
qeth_print_status_message(card);
rc = card->discipline->set_online(card, carrier_ok);
if (rc)
goto err_online;
/* let user_space know that device is online */
kobject_uevent(&card->gdev->dev.kobj, KOBJ_CHANGE);
mutex_unlock(&card->conf_mutex); mutex_unlock(&card->conf_mutex);
mutex_unlock(&card->discipline_mutex); mutex_unlock(&card->discipline_mutex);
return 0;
err_online:
err_hardsetup:
qeth_stop_channel(&card->data);
qeth_stop_channel(&card->write);
qeth_stop_channel(&card->read);
qdio_free(CARD_DDEV(card));
mutex_unlock(&card->conf_mutex);
mutex_unlock(&card->discipline_mutex);
return rc; return rc;
} }
......
...@@ -1138,19 +1138,10 @@ static void qeth_l2_enable_brport_features(struct qeth_card *card) ...@@ -1138,19 +1138,10 @@ static void qeth_l2_enable_brport_features(struct qeth_card *card)
} }
} }
static int qeth_l2_set_online(struct qeth_card *card) static int qeth_l2_set_online(struct qeth_card *card, bool carrier_ok)
{ {
struct ccwgroup_device *gdev = card->gdev;
struct net_device *dev = card->dev; struct net_device *dev = card->dev;
int rc = 0; int rc = 0;
bool carrier_ok;
rc = qeth_core_hardsetup_card(card, &carrier_ok);
if (rc) {
QETH_CARD_TEXT_(card, 2, "2err%04x", rc);
rc = -ENODEV;
goto out_remove;
}
/* query before bridgeport_notification may be enabled */ /* query before bridgeport_notification may be enabled */
qeth_l2_detect_dev2br_support(card); qeth_l2_detect_dev2br_support(card);
...@@ -1169,11 +1160,8 @@ static int qeth_l2_set_online(struct qeth_card *card) ...@@ -1169,11 +1160,8 @@ static int qeth_l2_set_online(struct qeth_card *card)
/* for the rx_bcast characteristic, init VNICC after setmac */ /* for the rx_bcast characteristic, init VNICC after setmac */
qeth_l2_vnicc_init(card); qeth_l2_vnicc_init(card);
qeth_trace_features(card);
qeth_l2_trace_features(card); qeth_l2_trace_features(card);
qeth_print_status_message(card);
/* softsetup */ /* softsetup */
QETH_CARD_TEXT(card, 2, "softsetp"); QETH_CARD_TEXT(card, 2, "softsetp");
...@@ -1205,16 +1193,10 @@ static int qeth_l2_set_online(struct qeth_card *card) ...@@ -1205,16 +1193,10 @@ static int qeth_l2_set_online(struct qeth_card *card)
} }
rtnl_unlock(); rtnl_unlock();
} }
/* let user_space know that device is online */
kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE);
return 0; return 0;
out_remove: out_remove:
qeth_l2_stop_card(card); qeth_l2_stop_card(card);
qeth_stop_channel(&card->data);
qeth_stop_channel(&card->write);
qeth_stop_channel(&card->read);
qdio_free(CARD_DDEV(card));
return rc; return rc;
} }
......
...@@ -2012,21 +2012,10 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev) ...@@ -2012,21 +2012,10 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev)
qeth_l3_clear_ipato_list(card); qeth_l3_clear_ipato_list(card);
} }
static int qeth_l3_set_online(struct qeth_card *card) static int qeth_l3_set_online(struct qeth_card *card, bool carrier_ok)
{ {
struct ccwgroup_device *gdev = card->gdev;
struct net_device *dev = card->dev; struct net_device *dev = card->dev;
int rc = 0; int rc = 0;
bool carrier_ok;
rc = qeth_core_hardsetup_card(card, &carrier_ok);
if (rc) {
QETH_CARD_TEXT_(card, 2, "2err%04x", rc);
rc = -ENODEV;
goto out_remove;
}
qeth_print_status_message(card);
/* softsetup */ /* softsetup */
QETH_CARD_TEXT(card, 2, "softsetp"); QETH_CARD_TEXT(card, 2, "softsetp");
...@@ -2073,16 +2062,10 @@ static int qeth_l3_set_online(struct qeth_card *card) ...@@ -2073,16 +2062,10 @@ static int qeth_l3_set_online(struct qeth_card *card)
} }
rtnl_unlock(); rtnl_unlock();
} }
qeth_trace_features(card);
/* let user_space know that device is online */
kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE);
return 0; return 0;
out_remove: out_remove:
qeth_l3_stop_card(card); qeth_l3_stop_card(card);
qeth_stop_channel(&card->data);
qeth_stop_channel(&card->write);
qeth_stop_channel(&card->read);
qdio_free(CARD_DDEV(card));
return rc; return rc;
} }
......
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