Skip to content

Commit 91003f3

Browse files
julianwiedmanndavem330
authored andcommitted
s390/qeth: consolidate online/offline code
Large parts of the online/offline code are identical now, and cleaning up the remaining stuff is easier with a shared core. Signed-off-by: Julian Wiedmann <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent aa3ad39 commit 91003f3

File tree

4 files changed

+107
-184
lines changed

4 files changed

+107
-184
lines changed

drivers/s390/net/qeth_core.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -727,11 +727,10 @@ struct qeth_osn_info {
727727

728728
struct qeth_discipline {
729729
const struct device_type *devtype;
730-
int (*recover)(void *ptr);
731730
int (*setup) (struct ccwgroup_device *);
732731
void (*remove) (struct ccwgroup_device *);
733-
int (*set_online) (struct ccwgroup_device *);
734-
int (*set_offline) (struct ccwgroup_device *);
732+
int (*set_online)(struct qeth_card *card);
733+
void (*set_offline)(struct qeth_card *card);
735734
int (*do_ioctl)(struct net_device *dev, struct ifreq *rq, int cmd);
736735
int (*control_event_handler)(struct qeth_card *card,
737736
struct qeth_ipa_cmd *cmd);
@@ -987,11 +986,9 @@ struct net_device *qeth_clone_netdev(struct net_device *orig);
987986
struct qeth_card *qeth_get_card_by_busid(char *bus_id);
988987
void qeth_set_allowed_threads(struct qeth_card *, unsigned long , int);
989988
int qeth_threads_running(struct qeth_card *, unsigned long);
990-
int qeth_do_run_thread(struct qeth_card *, unsigned long);
991-
void qeth_clear_thread_start_bit(struct qeth_card *, unsigned long);
992-
void qeth_clear_thread_running_bit(struct qeth_card *, unsigned long);
993989
int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok);
994990
int qeth_stop_channel(struct qeth_channel *channel);
991+
int qeth_set_offline(struct qeth_card *card, bool resetting);
995992

996993
void qeth_print_status_message(struct qeth_card *);
997994
int qeth_send_ipa_cmd(struct qeth_card *, struct qeth_cmd_buffer *,

drivers/s390/net/qeth_core_main.c

Lines changed: 96 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -823,7 +823,8 @@ static int qeth_set_thread_start_bit(struct qeth_card *card,
823823
return 0;
824824
}
825825

826-
void qeth_clear_thread_start_bit(struct qeth_card *card, unsigned long thread)
826+
static void qeth_clear_thread_start_bit(struct qeth_card *card,
827+
unsigned long thread)
827828
{
828829
unsigned long flags;
829830

@@ -832,9 +833,9 @@ void qeth_clear_thread_start_bit(struct qeth_card *card, unsigned long thread)
832833
spin_unlock_irqrestore(&card->thread_mask_lock, flags);
833834
wake_up(&card->wait_q);
834835
}
835-
EXPORT_SYMBOL_GPL(qeth_clear_thread_start_bit);
836836

837-
void qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread)
837+
static void qeth_clear_thread_running_bit(struct qeth_card *card,
838+
unsigned long thread)
838839
{
839840
unsigned long flags;
840841

@@ -843,7 +844,6 @@ void qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread)
843844
spin_unlock_irqrestore(&card->thread_mask_lock, flags);
844845
wake_up_all(&card->wait_q);
845846
}
846-
EXPORT_SYMBOL_GPL(qeth_clear_thread_running_bit);
847847

848848
static int __qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
849849
{
@@ -864,23 +864,21 @@ static int __qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
864864
return rc;
865865
}
866866

867-
int qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
867+
static int qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
868868
{
869869
int rc = 0;
870870

871871
wait_event(card->wait_q,
872872
(rc = __qeth_do_run_thread(card, thread)) >= 0);
873873
return rc;
874874
}
875-
EXPORT_SYMBOL_GPL(qeth_do_run_thread);
876875

877876
void qeth_schedule_recovery(struct qeth_card *card)
878877
{
879878
QETH_CARD_TEXT(card, 2, "startrec");
880879
if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0)
881880
schedule_work(&card->kernel_thread_starter);
882881
}
883-
EXPORT_SYMBOL_GPL(qeth_schedule_recovery);
884882

885883
static int qeth_get_problem(struct qeth_card *card, struct ccw_device *cdev,
886884
struct irb *irb)
@@ -1287,6 +1285,7 @@ static int qeth_do_start_thread(struct qeth_card *card, unsigned long thread)
12871285
return rc;
12881286
}
12891287

1288+
static int qeth_do_reset(void *data);
12901289
static void qeth_start_kernel_thread(struct work_struct *work)
12911290
{
12921291
struct task_struct *ts;
@@ -1298,8 +1297,7 @@ static void qeth_start_kernel_thread(struct work_struct *work)
12981297
card->write.state != CH_STATE_UP)
12991298
return;
13001299
if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) {
1301-
ts = kthread_run(card->discipline->recover, (void *)card,
1302-
"qeth_recover");
1300+
ts = kthread_run(qeth_do_reset, card, "qeth_recover");
13031301
if (IS_ERR(ts)) {
13041302
qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
13051303
qeth_clear_thread_running_bit(card,
@@ -3095,7 +3093,6 @@ int qeth_hw_trap(struct qeth_card *card, enum qeth_diags_trap_action action)
30953093
}
30963094
return qeth_send_ipa_cmd(card, iob, qeth_hw_trap_cb, NULL);
30973095
}
3098-
EXPORT_SYMBOL_GPL(qeth_hw_trap);
30993096

31003097
static int qeth_check_qdio_errors(struct qeth_card *card,
31013098
struct qdio_buffer *buf,
@@ -5041,6 +5038,89 @@ int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok)
50415038
}
50425039
EXPORT_SYMBOL_GPL(qeth_core_hardsetup_card);
50435040

5041+
static int qeth_set_online(struct qeth_card *card)
5042+
{
5043+
int rc;
5044+
5045+
mutex_lock(&card->discipline_mutex);
5046+
mutex_lock(&card->conf_mutex);
5047+
QETH_CARD_TEXT(card, 2, "setonlin");
5048+
5049+
rc = card->discipline->set_online(card);
5050+
5051+
mutex_unlock(&card->conf_mutex);
5052+
mutex_unlock(&card->discipline_mutex);
5053+
5054+
return rc;
5055+
}
5056+
5057+
int qeth_set_offline(struct qeth_card *card, bool resetting)
5058+
{
5059+
int rc, rc2, rc3;
5060+
5061+
mutex_lock(&card->discipline_mutex);
5062+
mutex_lock(&card->conf_mutex);
5063+
QETH_CARD_TEXT(card, 3, "setoffl");
5064+
5065+
if ((!resetting && card->info.hwtrap) || card->info.hwtrap == 2) {
5066+
qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
5067+
card->info.hwtrap = 1;
5068+
}
5069+
5070+
rtnl_lock();
5071+
card->info.open_when_online = card->dev->flags & IFF_UP;
5072+
dev_close(card->dev);
5073+
netif_device_detach(card->dev);
5074+
netif_carrier_off(card->dev);
5075+
rtnl_unlock();
5076+
5077+
card->discipline->set_offline(card);
5078+
5079+
rc = qeth_stop_channel(&card->data);
5080+
rc2 = qeth_stop_channel(&card->write);
5081+
rc3 = qeth_stop_channel(&card->read);
5082+
if (!rc)
5083+
rc = (rc2) ? rc2 : rc3;
5084+
if (rc)
5085+
QETH_CARD_TEXT_(card, 2, "1err%d", rc);
5086+
qdio_free(CARD_DDEV(card));
5087+
5088+
/* let user_space know that device is offline */
5089+
kobject_uevent(&card->gdev->dev.kobj, KOBJ_CHANGE);
5090+
5091+
mutex_unlock(&card->conf_mutex);
5092+
mutex_unlock(&card->discipline_mutex);
5093+
return 0;
5094+
}
5095+
EXPORT_SYMBOL_GPL(qeth_set_offline);
5096+
5097+
static int qeth_do_reset(void *data)
5098+
{
5099+
struct qeth_card *card = data;
5100+
int rc;
5101+
5102+
QETH_CARD_TEXT(card, 2, "recover1");
5103+
if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))
5104+
return 0;
5105+
QETH_CARD_TEXT(card, 2, "recover2");
5106+
dev_warn(&card->gdev->dev,
5107+
"A recovery process has been started for the device\n");
5108+
5109+
qeth_set_offline(card, true);
5110+
rc = qeth_set_online(card);
5111+
if (!rc) {
5112+
dev_info(&card->gdev->dev,
5113+
"Device successfully recovered!\n");
5114+
} else {
5115+
ccwgroup_set_offline(card->gdev);
5116+
dev_warn(&card->gdev->dev,
5117+
"The qeth device driver failed to recover an error on the device\n");
5118+
}
5119+
qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
5120+
qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
5121+
return 0;
5122+
}
5123+
50445124
#if IS_ENABLED(CONFIG_QETH_L3)
50455125
static void qeth_l3_rebuild_skb(struct qeth_card *card, struct sk_buff *skb,
50465126
struct qeth_hdr *hdr)
@@ -5977,15 +6057,17 @@ static int qeth_core_set_online(struct ccwgroup_device *gdev)
59776057
goto err;
59786058
}
59796059
}
5980-
rc = card->discipline->set_online(gdev);
6060+
6061+
rc = qeth_set_online(card);
59816062
err:
59826063
return rc;
59836064
}
59846065

59856066
static int qeth_core_set_offline(struct ccwgroup_device *gdev)
59866067
{
59876068
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5988-
return card->discipline->set_offline(gdev);
6069+
6070+
return qeth_set_offline(card, false);
59896071
}
59906072

59916073
static void qeth_core_shutdown(struct ccwgroup_device *gdev)
@@ -6008,7 +6090,7 @@ static int qeth_suspend(struct ccwgroup_device *gdev)
60086090
if (gdev->state == CCWGROUP_OFFLINE)
60096091
return 0;
60106092

6011-
card->discipline->set_offline(gdev);
6093+
qeth_set_offline(card, false);
60126094
return 0;
60136095
}
60146096

@@ -6017,7 +6099,7 @@ static int qeth_resume(struct ccwgroup_device *gdev)
60176099
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
60186100
int rc;
60196101

6020-
rc = card->discipline->set_online(gdev);
6102+
rc = qeth_set_online(card);
60216103

60226104
qeth_set_allowed_threads(card, 0xffffffff, 0);
60236105
if (rc)

drivers/s390/net/qeth_l2_main.c

Lines changed: 4 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
#include "qeth_core.h"
2525
#include "qeth_l2.h"
2626

27-
static int qeth_l2_set_offline(struct ccwgroup_device *);
2827
static void qeth_bridgeport_query_support(struct qeth_card *card);
2928
static void qeth_bridge_state_change(struct qeth_card *card,
3029
struct qeth_ipa_cmd *cmd);
@@ -610,7 +609,7 @@ static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)
610609
wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
611610

612611
if (cgdev->state == CCWGROUP_ONLINE)
613-
qeth_l2_set_offline(cgdev);
612+
qeth_set_offline(card, false);
614613

615614
cancel_work_sync(&card->close_dev_work);
616615
if (qeth_netdev_is_registered(card->dev))
@@ -746,17 +745,13 @@ static void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card)
746745
}
747746
}
748747

749-
static int qeth_l2_set_online(struct ccwgroup_device *gdev)
748+
static int qeth_l2_set_online(struct qeth_card *card)
750749
{
751-
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
750+
struct ccwgroup_device *gdev = card->gdev;
752751
struct net_device *dev = card->dev;
753752
int rc = 0;
754753
bool carrier_ok;
755754

756-
mutex_lock(&card->discipline_mutex);
757-
mutex_lock(&card->conf_mutex);
758-
QETH_CARD_TEXT(card, 2, "setonlin");
759-
760755
rc = qeth_core_hardsetup_card(card, &carrier_ok);
761756
if (rc) {
762757
QETH_CARD_TEXT_(card, 2, "2err%04x", rc);
@@ -813,8 +808,6 @@ static int qeth_l2_set_online(struct ccwgroup_device *gdev)
813808
}
814809
/* let user_space know that device is online */
815810
kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE);
816-
mutex_unlock(&card->conf_mutex);
817-
mutex_unlock(&card->discipline_mutex);
818811
return 0;
819812

820813
out_remove:
@@ -823,81 +816,12 @@ static int qeth_l2_set_online(struct ccwgroup_device *gdev)
823816
qeth_stop_channel(&card->write);
824817
qeth_stop_channel(&card->read);
825818
qdio_free(CARD_DDEV(card));
826-
827-
mutex_unlock(&card->conf_mutex);
828-
mutex_unlock(&card->discipline_mutex);
829819
return rc;
830820
}
831821

832-
static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,
833-
int recovery_mode)
822+
static void qeth_l2_set_offline(struct qeth_card *card)
834823
{
835-
struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
836-
int rc = 0, rc2 = 0, rc3 = 0;
837-
838-
mutex_lock(&card->discipline_mutex);
839-
mutex_lock(&card->conf_mutex);
840-
QETH_CARD_TEXT(card, 3, "setoffl");
841-
842-
if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) {
843-
qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
844-
card->info.hwtrap = 1;
845-
}
846-
847-
rtnl_lock();
848-
card->info.open_when_online = card->dev->flags & IFF_UP;
849-
dev_close(card->dev);
850-
netif_device_detach(card->dev);
851-
netif_carrier_off(card->dev);
852-
rtnl_unlock();
853-
854824
qeth_l2_stop_card(card);
855-
rc = qeth_stop_channel(&card->data);
856-
rc2 = qeth_stop_channel(&card->write);
857-
rc3 = qeth_stop_channel(&card->read);
858-
if (!rc)
859-
rc = (rc2) ? rc2 : rc3;
860-
if (rc)
861-
QETH_CARD_TEXT_(card, 2, "1err%d", rc);
862-
qdio_free(CARD_DDEV(card));
863-
864-
/* let user_space know that device is offline */
865-
kobject_uevent(&cgdev->dev.kobj, KOBJ_CHANGE);
866-
mutex_unlock(&card->conf_mutex);
867-
mutex_unlock(&card->discipline_mutex);
868-
return 0;
869-
}
870-
871-
static int qeth_l2_set_offline(struct ccwgroup_device *cgdev)
872-
{
873-
return __qeth_l2_set_offline(cgdev, 0);
874-
}
875-
876-
static int qeth_l2_recover(void *ptr)
877-
{
878-
struct qeth_card *card;
879-
int rc = 0;
880-
881-
card = (struct qeth_card *) ptr;
882-
QETH_CARD_TEXT(card, 2, "recover1");
883-
if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))
884-
return 0;
885-
QETH_CARD_TEXT(card, 2, "recover2");
886-
dev_warn(&card->gdev->dev,
887-
"A recovery process has been started for the device\n");
888-
__qeth_l2_set_offline(card->gdev, 1);
889-
rc = qeth_l2_set_online(card->gdev);
890-
if (!rc)
891-
dev_info(&card->gdev->dev,
892-
"Device successfully recovered!\n");
893-
else {
894-
ccwgroup_set_offline(card->gdev);
895-
dev_warn(&card->gdev->dev, "The qeth device driver "
896-
"failed to recover an error on the device\n");
897-
}
898-
qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
899-
qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
900-
return 0;
901825
}
902826

903827
static int __init qeth_l2_init(void)
@@ -934,7 +858,6 @@ static int qeth_l2_control_event(struct qeth_card *card,
934858

935859
struct qeth_discipline qeth_l2_discipline = {
936860
.devtype = &qeth_l2_devtype,
937-
.recover = qeth_l2_recover,
938861
.setup = qeth_l2_probe_device,
939862
.remove = qeth_l2_remove_device,
940863
.set_online = qeth_l2_set_online,

0 commit comments

Comments
 (0)