Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Sebastian Ott and committed by
Martin Schwidefsky
c041f2d4 b7169c51

+61 -64
+13 -4
drivers/s390/net/qeth_core.h
··· 711 711 qdio_handler_t *input_handler; 712 712 qdio_handler_t *output_handler; 713 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 717 726 struct qeth_vlan_vid { ··· 784 775 struct qeth_perf_stats perf_stats; 785 776 int read_or_write_problem; 786 777 struct qeth_osn_info osn_info; 787 - struct qeth_discipline discipline; 778 + struct qeth_discipline *discipline; 788 779 atomic_t force_alloc_skb; 789 780 struct service_level qeth_service_level; 790 781 struct qdio_ssqd_desc ssqd; ··· 850 841 return card->info.diagass_support & (__u32)cmd; 851 842 } 852 843 853 - extern struct ccwgroup_driver qeth_l2_ccwgroup_driver; 854 - extern struct ccwgroup_driver qeth_l3_ccwgroup_driver; 844 + extern struct qeth_discipline qeth_l2_discipline; 845 + extern struct qeth_discipline qeth_l3_discipline; 855 846 extern const struct attribute_group *qeth_generic_attr_groups[]; 856 847 extern const struct attribute_group *qeth_osn_attr_groups[]; 857 848
+31 -39
drivers/s390/net/qeth_core_main.c
··· 1365 1365 card->write.state != CH_STATE_UP) 1366 1366 return; 1367 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 1369 "qeth_recover"); 1370 1370 if (IS_ERR(ts)) { 1371 1371 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); ··· 4629 4629 goto out_free_in_sbals; 4630 4630 } 4631 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 4634 qeth_qdio_establish_cq(card, in_sbal_ptrs, queue_start_poll); 4635 4635 ··· 4653 4653 init_data.qib_param_field = qib_param_field; 4654 4654 init_data.no_input_qs = card->qdio.no_in_queues; 4655 4655 init_data.no_output_qs = card->qdio.no_out_queues; 4656 - init_data.input_handler = card->discipline.input_handler; 4657 - init_data.output_handler = card->discipline.output_handler; 4656 + init_data.input_handler = card->discipline->input_handler; 4657 + init_data.output_handler = card->discipline->output_handler; 4658 4658 init_data.queue_start_poll_array = queue_start_poll; 4659 4659 init_data.int_parm = (unsigned long) card; 4660 4660 init_data.input_sbal_addr_array = (void **) in_sbal_ptrs; ··· 5039 5039 mutex_lock(&qeth_mod_mutex); 5040 5040 switch (discipline) { 5041 5041 case QETH_DISCIPLINE_LAYER3: 5042 - card->discipline.ccwgdriver = try_then_request_module( 5043 - symbol_get(qeth_l3_ccwgroup_driver), 5044 - "qeth_l3"); 5042 + card->discipline = try_then_request_module( 5043 + symbol_get(qeth_l3_discipline), "qeth_l3"); 5045 5044 break; 5046 5045 case QETH_DISCIPLINE_LAYER2: 5047 - card->discipline.ccwgdriver = try_then_request_module( 5048 - symbol_get(qeth_l2_ccwgroup_driver), 5049 - "qeth_l2"); 5046 + card->discipline = try_then_request_module( 5047 + symbol_get(qeth_l2_discipline), "qeth_l2"); 5050 5048 break; 5051 5049 } 5052 - if (!card->discipline.ccwgdriver) { 5050 + if (!card->discipline) { 5053 5051 dev_err(&card->gdev->dev, "There is no kernel module to " 5054 5052 "support discipline %d\n", discipline); 5055 5053 rc = -EINVAL; ··· 5059 5061 void qeth_core_free_discipline(struct qeth_card *card) 5060 5062 { 5061 5063 if (card->options.layer2) 5062 - symbol_put(qeth_l2_ccwgroup_driver); 5064 + symbol_put(qeth_l2_discipline); 5063 5065 else 5064 - symbol_put(qeth_l3_ccwgroup_driver); 5065 - card->discipline.ccwgdriver = NULL; 5066 + symbol_put(qeth_l3_discipline); 5067 + card->discipline = NULL; 5066 5068 } 5067 5069 5068 5070 static const struct device_type qeth_generic_devtype = { ··· 5138 5140 rc = qeth_core_load_discipline(card, QETH_DISCIPLINE_LAYER2); 5139 5141 if (rc) 5140 5142 goto err_dbf; 5141 - rc = card->discipline.ccwgdriver->probe(card->gdev); 5143 + rc = card->discipline->setup(card->gdev); 5142 5144 if (rc) 5143 5145 goto err_disc; 5144 5146 case QETH_CARD_TYPE_OSD: ··· 5172 5174 5173 5175 QETH_DBF_TEXT(SETUP, 2, "removedv"); 5174 5176 5175 - if (card->discipline.ccwgdriver) { 5176 - card->discipline.ccwgdriver->remove(gdev); 5177 + if (card->discipline) { 5178 + card->discipline->remove(gdev); 5177 5179 qeth_core_free_discipline(card); 5178 5180 } 5179 5181 ··· 5193 5195 int rc = 0; 5194 5196 int def_discipline; 5195 5197 5196 - if (!card->discipline.ccwgdriver) { 5198 + if (!card->discipline) { 5197 5199 if (card->info.type == QETH_CARD_TYPE_IQD) 5198 5200 def_discipline = QETH_DISCIPLINE_LAYER3; 5199 5201 else ··· 5201 5203 rc = qeth_core_load_discipline(card, def_discipline); 5202 5204 if (rc) 5203 5205 goto err; 5204 - rc = card->discipline.ccwgdriver->probe(card->gdev); 5206 + rc = card->discipline->setup(card->gdev); 5205 5207 if (rc) 5206 5208 goto err; 5207 5209 } 5208 - rc = card->discipline.ccwgdriver->set_online(gdev); 5210 + rc = card->discipline->set_online(gdev); 5209 5211 err: 5210 5212 return rc; 5211 5213 } ··· 5213 5215 static int qeth_core_set_offline(struct ccwgroup_device *gdev) 5214 5216 { 5215 5217 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5216 - return card->discipline.ccwgdriver->set_offline(gdev); 5218 + return card->discipline->set_offline(gdev); 5217 5219 } 5218 5220 5219 5221 static void qeth_core_shutdown(struct ccwgroup_device *gdev) 5220 5222 { 5221 5223 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5222 - if (card->discipline.ccwgdriver && 5223 - card->discipline.ccwgdriver->shutdown) 5224 - card->discipline.ccwgdriver->shutdown(gdev); 5224 + if (card->discipline && card->discipline->shutdown) 5225 + card->discipline->shutdown(gdev); 5225 5226 } 5226 5227 5227 5228 static int qeth_core_prepare(struct ccwgroup_device *gdev) 5228 5229 { 5229 5230 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5230 - if (card->discipline.ccwgdriver && 5231 - card->discipline.ccwgdriver->prepare) 5232 - return card->discipline.ccwgdriver->prepare(gdev); 5231 + if (card->discipline && card->discipline->prepare) 5232 + return card->discipline->prepare(gdev); 5233 5233 return 0; 5234 5234 } 5235 5235 5236 5236 static void qeth_core_complete(struct ccwgroup_device *gdev) 5237 5237 { 5238 5238 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5239 - if (card->discipline.ccwgdriver && 5240 - card->discipline.ccwgdriver->complete) 5241 - card->discipline.ccwgdriver->complete(gdev); 5239 + if (card->discipline && card->discipline->complete) 5240 + card->discipline->complete(gdev); 5242 5241 } 5243 5242 5244 5243 static int qeth_core_freeze(struct ccwgroup_device *gdev) 5245 5244 { 5246 5245 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5247 - if (card->discipline.ccwgdriver && 5248 - card->discipline.ccwgdriver->freeze) 5249 - return card->discipline.ccwgdriver->freeze(gdev); 5246 + if (card->discipline && card->discipline->freeze) 5247 + return card->discipline->freeze(gdev); 5250 5248 return 0; 5251 5249 } 5252 5250 5253 5251 static int qeth_core_thaw(struct ccwgroup_device *gdev) 5254 5252 { 5255 5253 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5256 - if (card->discipline.ccwgdriver && 5257 - card->discipline.ccwgdriver->thaw) 5258 - return card->discipline.ccwgdriver->thaw(gdev); 5254 + if (card->discipline && card->discipline->thaw) 5255 + return card->discipline->thaw(gdev); 5259 5256 return 0; 5260 5257 } 5261 5258 5262 5259 static int qeth_core_restore(struct ccwgroup_device *gdev) 5263 5260 { 5264 5261 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 5265 - if (card->discipline.ccwgdriver && 5266 - card->discipline.ccwgdriver->restore) 5267 - return card->discipline.ccwgdriver->restore(gdev); 5262 + if (card->discipline && card->discipline->restore) 5263 + return card->discipline->restore(gdev); 5268 5264 return 0; 5269 5265 } 5270 5266
+3 -3
drivers/s390/net/qeth_core_sys.c
··· 434 434 goto out; 435 435 else { 436 436 card->info.mac_bits = 0; 437 - if (card->discipline.ccwgdriver) { 438 - card->discipline.ccwgdriver->remove(card->gdev); 437 + if (card->discipline) { 438 + card->discipline->remove(card->gdev); 439 439 qeth_core_free_discipline(card); 440 440 } 441 441 } ··· 444 444 if (rc) 445 445 goto out; 446 446 447 - rc = card->discipline.ccwgdriver->probe(card->gdev); 447 + rc = card->discipline->setup(card->gdev); 448 448 out: 449 449 mutex_unlock(&card->discipline_mutex); 450 450 return rc ? rc : count;
+7 -9
drivers/s390/net/qeth_l2_main.c
··· 882 882 INIT_LIST_HEAD(&card->mc_list); 883 883 card->options.layer2 = 1; 884 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 885 return 0; 892 886 } 893 887 ··· 1221 1227 return rc; 1222 1228 } 1223 1229 1224 - struct ccwgroup_driver qeth_l2_ccwgroup_driver = { 1225 - .probe = qeth_l2_probe_device, 1230 + struct qeth_discipline qeth_l2_discipline = { 1231 + .start_poll = qeth_qdio_start_poll, 1232 + .input_handler = (qdio_handler_t *) qeth_qdio_input_handler, 1233 + .output_handler = (qdio_handler_t *) qeth_qdio_output_handler, 1234 + .recover = qeth_l2_recover, 1235 + .setup = qeth_l2_probe_device, 1226 1236 .remove = qeth_l2_remove_device, 1227 1237 .set_online = qeth_l2_set_online, 1228 1238 .set_offline = qeth_l2_set_offline, ··· 1235 1237 .thaw = qeth_l2_pm_resume, 1236 1238 .restore = qeth_l2_pm_resume, 1237 1239 }; 1238 - EXPORT_SYMBOL_GPL(qeth_l2_ccwgroup_driver); 1240 + EXPORT_SYMBOL_GPL(qeth_l2_discipline); 1239 1241 1240 1242 static int qeth_osn_send_control_data(struct qeth_card *card, int len, 1241 1243 struct qeth_cmd_buffer *iob)
+7 -9
drivers/s390/net/qeth_l3_main.c
··· 3376 3376 qeth_l3_create_device_attributes(&gdev->dev); 3377 3377 card->options.layer2 = 0; 3378 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 3379 return 0; 3386 3380 } 3387 3381 ··· 3650 3656 return rc; 3651 3657 } 3652 3658 3653 - struct ccwgroup_driver qeth_l3_ccwgroup_driver = { 3654 - .probe = qeth_l3_probe_device, 3659 + struct qeth_discipline qeth_l3_discipline = { 3660 + .start_poll = qeth_qdio_start_poll, 3661 + .input_handler = (qdio_handler_t *) qeth_qdio_input_handler, 3662 + .output_handler = (qdio_handler_t *) qeth_qdio_output_handler, 3663 + .recover = qeth_l3_recover, 3664 + .setup = qeth_l3_probe_device, 3655 3665 .remove = qeth_l3_remove_device, 3656 3666 .set_online = qeth_l3_set_online, 3657 3667 .set_offline = qeth_l3_set_offline, ··· 3664 3666 .thaw = qeth_l3_pm_resume, 3665 3667 .restore = qeth_l3_pm_resume, 3666 3668 }; 3667 - EXPORT_SYMBOL_GPL(qeth_l3_ccwgroup_driver); 3669 + EXPORT_SYMBOL_GPL(qeth_l3_discipline); 3668 3670 3669 3671 static int qeth_l3_ip_event(struct notifier_block *this, 3670 3672 unsigned long event, void *ptr)