aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorSebastian Ott <sebott@linux.vnet.ibm.com>2012-05-15 12:02:21 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2012-05-16 08:42:48 -0400
commitc041f2d487654eb2f981f517b216cf1efdf3cdf2 (patch)
treeae9906a72614003b2d6b5725de37718d9ca296d8 /drivers/s390
parentb7169c515bbdc139fadee5a98a866c5dc5bb98af (diff)
s390/qeth: stop using struct ccwgroup driver for discipline callbacks
The interface between qeth and its disciplines should not depend on struct ccwgroup_driver, as a qeth discipline is not a ccwgroup driver on its own. Instead provide the particular callbacks in struct qeth_discipline. Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/net/qeth_core.h17
-rw-r--r--drivers/s390/net/qeth_core_main.c70
-rw-r--r--drivers/s390/net/qeth_core_sys.c6
-rw-r--r--drivers/s390/net/qeth_l2_main.c16
-rw-r--r--drivers/s390/net/qeth_l3_main.c16
5 files changed, 61 insertions, 64 deletions
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h
index 81d19db805ba..5686955e62dd 100644
--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -711,7 +711,16 @@ struct qeth_discipline {
711 qdio_handler_t *input_handler; 711 qdio_handler_t *input_handler;
712 qdio_handler_t *output_handler; 712 qdio_handler_t *output_handler;
713 int (*recover)(void *ptr); 713 int (*recover)(void *ptr);
714 struct ccwgroup_driver *ccwgdriver; 714 int (*setup) (struct ccwgroup_device *);
715 void (*remove) (struct ccwgroup_device *);
716 int (*set_online) (struct ccwgroup_device *);
717 int (*set_offline) (struct ccwgroup_device *);
718 void (*shutdown)(struct ccwgroup_device *);
719 int (*prepare) (struct ccwgroup_device *);
720 void (*complete) (struct ccwgroup_device *);
721 int (*freeze)(struct ccwgroup_device *);
722 int (*thaw) (struct ccwgroup_device *);
723 int (*restore)(struct ccwgroup_device *);
715}; 724};
716 725
717struct qeth_vlan_vid { 726struct qeth_vlan_vid {
@@ -775,7 +784,7 @@ struct qeth_card {
775 struct qeth_perf_stats perf_stats; 784 struct qeth_perf_stats perf_stats;
776 int read_or_write_problem; 785 int read_or_write_problem;
777 struct qeth_osn_info osn_info; 786 struct qeth_osn_info osn_info;
778 struct qeth_discipline discipline; 787 struct qeth_discipline *discipline;
779 atomic_t force_alloc_skb; 788 atomic_t force_alloc_skb;
780 struct service_level qeth_service_level; 789 struct service_level qeth_service_level;
781 struct qdio_ssqd_desc ssqd; 790 struct qdio_ssqd_desc ssqd;
@@ -841,8 +850,8 @@ static inline int qeth_is_diagass_supported(struct qeth_card *card,
841 return card->info.diagass_support & (__u32)cmd; 850 return card->info.diagass_support & (__u32)cmd;
842} 851}
843 852
844extern struct ccwgroup_driver qeth_l2_ccwgroup_driver; 853extern struct qeth_discipline qeth_l2_discipline;
845extern struct ccwgroup_driver qeth_l3_ccwgroup_driver; 854extern struct qeth_discipline qeth_l3_discipline;
846extern const struct attribute_group *qeth_generic_attr_groups[]; 855extern const struct attribute_group *qeth_generic_attr_groups[];
847extern const struct attribute_group *qeth_osn_attr_groups[]; 856extern const struct attribute_group *qeth_osn_attr_groups[];
848 857
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 1a6a3132cb4b..9423f3d7e20f 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -1365,7 +1365,7 @@ static void qeth_start_kernel_thread(struct work_struct *work)
1365 card->write.state != CH_STATE_UP) 1365 card->write.state != CH_STATE_UP)
1366 return; 1366 return;
1367 if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) { 1367 if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) {
1368 ts = kthread_run(card->discipline.recover, (void *)card, 1368 ts = kthread_run(card->discipline->recover, (void *)card,
1369 "qeth_recover"); 1369 "qeth_recover");
1370 if (IS_ERR(ts)) { 1370 if (IS_ERR(ts)) {
1371 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); 1371 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
@@ -4629,7 +4629,7 @@ static int qeth_qdio_establish(struct qeth_card *card)
4629 goto out_free_in_sbals; 4629 goto out_free_in_sbals;
4630 } 4630 }
4631 for (i = 0; i < card->qdio.no_in_queues; ++i) 4631 for (i = 0; i < card->qdio.no_in_queues; ++i)
4632 queue_start_poll[i] = card->discipline.start_poll; 4632 queue_start_poll[i] = card->discipline->start_poll;
4633 4633
4634 qeth_qdio_establish_cq(card, in_sbal_ptrs, queue_start_poll); 4634 qeth_qdio_establish_cq(card, in_sbal_ptrs, queue_start_poll);
4635 4635
@@ -4653,8 +4653,8 @@ static int qeth_qdio_establish(struct qeth_card *card)
4653 init_data.qib_param_field = qib_param_field; 4653 init_data.qib_param_field = qib_param_field;
4654 init_data.no_input_qs = card->qdio.no_in_queues; 4654 init_data.no_input_qs = card->qdio.no_in_queues;
4655 init_data.no_output_qs = card->qdio.no_out_queues; 4655 init_data.no_output_qs = card->qdio.no_out_queues;
4656 init_data.input_handler = card->discipline.input_handler; 4656 init_data.input_handler = card->discipline->input_handler;
4657 init_data.output_handler = card->discipline.output_handler; 4657 init_data.output_handler = card->discipline->output_handler;
4658 init_data.queue_start_poll_array = queue_start_poll; 4658 init_data.queue_start_poll_array = queue_start_poll;
4659 init_data.int_parm = (unsigned long) card; 4659 init_data.int_parm = (unsigned long) card;
4660 init_data.input_sbal_addr_array = (void **) in_sbal_ptrs; 4660 init_data.input_sbal_addr_array = (void **) in_sbal_ptrs;
@@ -5039,17 +5039,15 @@ int qeth_core_load_discipline(struct qeth_card *card,
5039 mutex_lock(&qeth_mod_mutex); 5039 mutex_lock(&qeth_mod_mutex);
5040 switch (discipline) { 5040 switch (discipline) {
5041 case QETH_DISCIPLINE_LAYER3: 5041 case QETH_DISCIPLINE_LAYER3:
5042 card->discipline.ccwgdriver = try_then_request_module( 5042 card->discipline = try_then_request_module(
5043 symbol_get(qeth_l3_ccwgroup_driver), 5043 symbol_get(qeth_l3_discipline), "qeth_l3");
5044 "qeth_l3");
5045 break; 5044 break;
5046 case QETH_DISCIPLINE_LAYER2: 5045 case QETH_DISCIPLINE_LAYER2:
5047 card->discipline.ccwgdriver = try_then_request_module( 5046 card->discipline = try_then_request_module(
5048 symbol_get(qeth_l2_ccwgroup_driver), 5047 symbol_get(qeth_l2_discipline), "qeth_l2");
5049 "qeth_l2");
5050 break; 5048 break;
5051 } 5049 }
5052 if (!card->discipline.ccwgdriver) { 5050 if (!card->discipline) {
5053 dev_err(&card->gdev->dev, "There is no kernel module to " 5051 dev_err(&card->gdev->dev, "There is no kernel module to "
5054 "support discipline %d\n", discipline); 5052 "support discipline %d\n", discipline);
5055 rc = -EINVAL; 5053 rc = -EINVAL;
@@ -5061,10 +5059,10 @@ int qeth_core_load_discipline(struct qeth_card *card,
5061void qeth_core_free_discipline(struct qeth_card *card) 5059void qeth_core_free_discipline(struct qeth_card *card)
5062{ 5060{
5063 if (card->options.layer2) 5061 if (card->options.layer2)
5064 symbol_put(qeth_l2_ccwgroup_driver); 5062 symbol_put(qeth_l2_discipline);
5065 else 5063 else
5066 symbol_put(qeth_l3_ccwgroup_driver); 5064 symbol_put(qeth_l3_discipline);
5067 card->discipline.ccwgdriver = NULL; 5065 card->discipline = NULL;
5068} 5066}
5069 5067
5070static const struct device_type qeth_generic_devtype = { 5068static const struct device_type qeth_generic_devtype = {
@@ -5140,7 +5138,7 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
5140 rc = qeth_core_load_discipline(card, QETH_DISCIPLINE_LAYER2); 5138 rc = qeth_core_load_discipline(card, QETH_DISCIPLINE_LAYER2);
5141 if (rc) 5139 if (rc)
5142 goto err_dbf; 5140 goto err_dbf;
5143 rc = card->discipline.ccwgdriver->probe(card->gdev); 5141 rc = card->discipline->setup(card->gdev);
5144 if (rc) 5142 if (rc)
5145 goto err_disc; 5143 goto err_disc;
5146 case QETH_CARD_TYPE_OSD: 5144 case QETH_CARD_TYPE_OSD:
@@ -5174,8 +5172,8 @@ static void qeth_core_remove_device(struct ccwgroup_device *gdev)
5174 5172
5175 QETH_DBF_TEXT(SETUP, 2, "removedv"); 5173 QETH_DBF_TEXT(SETUP, 2, "removedv");
5176 5174
5177 if (card->discipline.ccwgdriver) { 5175 if (card->discipline) {
5178 card->discipline.ccwgdriver->remove(gdev); 5176 card->discipline->remove(gdev);
5179 qeth_core_free_discipline(card); 5177 qeth_core_free_discipline(card);
5180 } 5178 }
5181 5179
@@ -5195,7 +5193,7 @@ static int qeth_core_set_online(struct ccwgroup_device *gdev)
5195 int rc = 0; 5193 int rc = 0;
5196 int def_discipline; 5194 int def_discipline;
5197 5195
5198 if (!card->discipline.ccwgdriver) { 5196 if (!card->discipline) {
5199 if (card->info.type == QETH_CARD_TYPE_IQD) 5197 if (card->info.type == QETH_CARD_TYPE_IQD)
5200 def_discipline = QETH_DISCIPLINE_LAYER3; 5198 def_discipline = QETH_DISCIPLINE_LAYER3;
5201 else 5199 else
@@ -5203,11 +5201,11 @@ static int qeth_core_set_online(struct ccwgroup_device *gdev)
5203 rc = qeth_core_load_discipline(card, def_discipline); 5201 rc = qeth_core_load_discipline(card, def_discipline);
5204 if (rc) 5202 if (rc)
5205 goto err; 5203 goto err;
5206 rc = card->discipline.ccwgdriver->probe(card->gdev); 5204 rc = card->discipline->setup(card->gdev);
5207 if (rc) 5205 if (rc)
5208 goto err; 5206 goto err;
5209 } 5207 }
5210 rc = card->discipline.ccwgdriver->set_online(gdev); 5208 rc = card->discipline->set_online(gdev);
5211err: 5209err:
5212 return rc; 5210 return rc;
5213} 5211}
@@ -5215,58 +5213,52 @@ err:
5215static int qeth_core_set_offline(struct ccwgroup_device *gdev) 5213static int qeth_core_set_offline(struct ccwgroup_device *gdev)
5216{ 5214{
5217 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5215 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5218 return card->discipline.ccwgdriver->set_offline(gdev); 5216 return card->discipline->set_offline(gdev);
5219} 5217}
5220 5218
5221static void qeth_core_shutdown(struct ccwgroup_device *gdev) 5219static void qeth_core_shutdown(struct ccwgroup_device *gdev)
5222{ 5220{
5223 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5221 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5224 if (card->discipline.ccwgdriver && 5222 if (card->discipline && card->discipline->shutdown)
5225 card->discipline.ccwgdriver->shutdown) 5223 card->discipline->shutdown(gdev);
5226 card->discipline.ccwgdriver->shutdown(gdev);
5227} 5224}
5228 5225
5229static int qeth_core_prepare(struct ccwgroup_device *gdev) 5226static int qeth_core_prepare(struct ccwgroup_device *gdev)
5230{ 5227{
5231 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5228 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5232 if (card->discipline.ccwgdriver && 5229 if (card->discipline && card->discipline->prepare)
5233 card->discipline.ccwgdriver->prepare) 5230 return card->discipline->prepare(gdev);
5234 return card->discipline.ccwgdriver->prepare(gdev);
5235 return 0; 5231 return 0;
5236} 5232}
5237 5233
5238static void qeth_core_complete(struct ccwgroup_device *gdev) 5234static void qeth_core_complete(struct ccwgroup_device *gdev)
5239{ 5235{
5240 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5236 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5241 if (card->discipline.ccwgdriver && 5237 if (card->discipline && card->discipline->complete)
5242 card->discipline.ccwgdriver->complete) 5238 card->discipline->complete(gdev);
5243 card->discipline.ccwgdriver->complete(gdev);
5244} 5239}
5245 5240
5246static int qeth_core_freeze(struct ccwgroup_device *gdev) 5241static int qeth_core_freeze(struct ccwgroup_device *gdev)
5247{ 5242{
5248 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5243 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5249 if (card->discipline.ccwgdriver && 5244 if (card->discipline && card->discipline->freeze)
5250 card->discipline.ccwgdriver->freeze) 5245 return card->discipline->freeze(gdev);
5251 return card->discipline.ccwgdriver->freeze(gdev);
5252 return 0; 5246 return 0;
5253} 5247}
5254 5248
5255static int qeth_core_thaw(struct ccwgroup_device *gdev) 5249static int qeth_core_thaw(struct ccwgroup_device *gdev)
5256{ 5250{
5257 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5251 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5258 if (card->discipline.ccwgdriver && 5252 if (card->discipline && card->discipline->thaw)
5259 card->discipline.ccwgdriver->thaw) 5253 return card->discipline->thaw(gdev);
5260 return card->discipline.ccwgdriver->thaw(gdev);
5261 return 0; 5254 return 0;
5262} 5255}
5263 5256
5264static int qeth_core_restore(struct ccwgroup_device *gdev) 5257static int qeth_core_restore(struct ccwgroup_device *gdev)
5265{ 5258{
5266 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5259 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5267 if (card->discipline.ccwgdriver && 5260 if (card->discipline && card->discipline->restore)
5268 card->discipline.ccwgdriver->restore) 5261 return card->discipline->restore(gdev);
5269 return card->discipline.ccwgdriver->restore(gdev);
5270 return 0; 5262 return 0;
5271} 5263}
5272 5264
diff --git a/drivers/s390/net/qeth_core_sys.c b/drivers/s390/net/qeth_core_sys.c
index a6b49db9f2d2..f163af575c48 100644
--- a/drivers/s390/net/qeth_core_sys.c
+++ b/drivers/s390/net/qeth_core_sys.c
@@ -434,8 +434,8 @@ static ssize_t qeth_dev_layer2_store(struct device *dev,
434 goto out; 434 goto out;
435 else { 435 else {
436 card->info.mac_bits = 0; 436 card->info.mac_bits = 0;
437 if (card->discipline.ccwgdriver) { 437 if (card->discipline) {
438 card->discipline.ccwgdriver->remove(card->gdev); 438 card->discipline->remove(card->gdev);
439 qeth_core_free_discipline(card); 439 qeth_core_free_discipline(card);
440 } 440 }
441 } 441 }
@@ -444,7 +444,7 @@ static ssize_t qeth_dev_layer2_store(struct device *dev,
444 if (rc) 444 if (rc)
445 goto out; 445 goto out;
446 446
447 rc = card->discipline.ccwgdriver->probe(card->gdev); 447 rc = card->discipline->setup(card->gdev);
448out: 448out:
449 mutex_unlock(&card->discipline_mutex); 449 mutex_unlock(&card->discipline_mutex);
450 return rc ? rc : count; 450 return rc ? rc : count;
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
index 0e7c29d1d7ef..426986518e96 100644
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -882,12 +882,6 @@ static int qeth_l2_probe_device(struct ccwgroup_device *gdev)
882 INIT_LIST_HEAD(&card->mc_list); 882 INIT_LIST_HEAD(&card->mc_list);
883 card->options.layer2 = 1; 883 card->options.layer2 = 1;
884 card->info.hwtrap = 0; 884 card->info.hwtrap = 0;
885 card->discipline.start_poll = qeth_qdio_start_poll;
886 card->discipline.input_handler = (qdio_handler_t *)
887 qeth_qdio_input_handler;
888 card->discipline.output_handler = (qdio_handler_t *)
889 qeth_qdio_output_handler;
890 card->discipline.recover = qeth_l2_recover;
891 return 0; 885 return 0;
892} 886}
893 887
@@ -1227,8 +1221,12 @@ out:
1227 return rc; 1221 return rc;
1228} 1222}
1229 1223
1230struct ccwgroup_driver qeth_l2_ccwgroup_driver = { 1224struct qeth_discipline qeth_l2_discipline = {
1231 .probe = qeth_l2_probe_device, 1225 .start_poll = qeth_qdio_start_poll,
1226 .input_handler = (qdio_handler_t *) qeth_qdio_input_handler,
1227 .output_handler = (qdio_handler_t *) qeth_qdio_output_handler,
1228 .recover = qeth_l2_recover,
1229 .setup = qeth_l2_probe_device,
1232 .remove = qeth_l2_remove_device, 1230 .remove = qeth_l2_remove_device,
1233 .set_online = qeth_l2_set_online, 1231 .set_online = qeth_l2_set_online,
1234 .set_offline = qeth_l2_set_offline, 1232 .set_offline = qeth_l2_set_offline,
@@ -1237,7 +1235,7 @@ struct ccwgroup_driver qeth_l2_ccwgroup_driver = {
1237 .thaw = qeth_l2_pm_resume, 1235 .thaw = qeth_l2_pm_resume,
1238 .restore = qeth_l2_pm_resume, 1236 .restore = qeth_l2_pm_resume,
1239}; 1237};
1240EXPORT_SYMBOL_GPL(qeth_l2_ccwgroup_driver); 1238EXPORT_SYMBOL_GPL(qeth_l2_discipline);
1241 1239
1242static int qeth_osn_send_control_data(struct qeth_card *card, int len, 1240static int qeth_osn_send_control_data(struct qeth_card *card, int len,
1243 struct qeth_cmd_buffer *iob) 1241 struct qeth_cmd_buffer *iob)
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index f85921607686..03535acb7afb 100644
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -3376,12 +3376,6 @@ static int qeth_l3_probe_device(struct ccwgroup_device *gdev)
3376 qeth_l3_create_device_attributes(&gdev->dev); 3376 qeth_l3_create_device_attributes(&gdev->dev);
3377 card->options.layer2 = 0; 3377 card->options.layer2 = 0;
3378 card->info.hwtrap = 0; 3378 card->info.hwtrap = 0;
3379 card->discipline.start_poll = qeth_qdio_start_poll;
3380 card->discipline.input_handler = (qdio_handler_t *)
3381 qeth_qdio_input_handler;
3382 card->discipline.output_handler = (qdio_handler_t *)
3383 qeth_qdio_output_handler;
3384 card->discipline.recover = qeth_l3_recover;
3385 return 0; 3379 return 0;
3386} 3380}
3387 3381
@@ -3656,8 +3650,12 @@ out:
3656 return rc; 3650 return rc;
3657} 3651}
3658 3652
3659struct ccwgroup_driver qeth_l3_ccwgroup_driver = { 3653struct qeth_discipline qeth_l3_discipline = {
3660 .probe = qeth_l3_probe_device, 3654 .start_poll = qeth_qdio_start_poll,
3655 .input_handler = (qdio_handler_t *) qeth_qdio_input_handler,
3656 .output_handler = (qdio_handler_t *) qeth_qdio_output_handler,
3657 .recover = qeth_l3_recover,
3658 .setup = qeth_l3_probe_device,
3661 .remove = qeth_l3_remove_device, 3659 .remove = qeth_l3_remove_device,
3662 .set_online = qeth_l3_set_online, 3660 .set_online = qeth_l3_set_online,
3663 .set_offline = qeth_l3_set_offline, 3661 .set_offline = qeth_l3_set_offline,
@@ -3666,7 +3664,7 @@ struct ccwgroup_driver qeth_l3_ccwgroup_driver = {
3666 .thaw = qeth_l3_pm_resume, 3664 .thaw = qeth_l3_pm_resume,
3667 .restore = qeth_l3_pm_resume, 3665 .restore = qeth_l3_pm_resume,
3668}; 3666};
3669EXPORT_SYMBOL_GPL(qeth_l3_ccwgroup_driver); 3667EXPORT_SYMBOL_GPL(qeth_l3_discipline);
3670 3668
3671static int qeth_l3_ip_event(struct notifier_block *this, 3669static int qeth_l3_ip_event(struct notifier_block *this,
3672 unsigned long event, void *ptr) 3670 unsigned long event, void *ptr)