diff options
author | Frank Pavlic <fpavlic@de.ibm.com> | 2006-09-15 10:27:02 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-09-17 01:03:08 -0400 |
commit | 8b98a37c4b00f3fbcf162281bd4595777e61241b (patch) | |
tree | 3d3dfe8a3d1872dbc6bd6cca37a4454952310203 | |
parent | f956b6902eabbff249000287c7b36cd65761d8b8 (diff) |
[PATCH] s390: qeth driver fixes [6/6]
[PATCH 9/9] s390: qeth driver fixes [6/6]
From: Frank Pavlic <fpavlic@de.ibm.com>
- Hipersockets has no IPV6 support, thus prevent issueing
SETRTG_IPV6 control commands on Hipersockets devices.
- fixed error handling in qeth_sysfs_(un)register
Signed-off-by: Frank Pavlic <fpavlic@de.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r-- | drivers/s390/net/qeth_main.c | 59 |
1 files changed, 39 insertions, 20 deletions
diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index a1b2e6fd38ca..5613b4564fa2 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c | |||
@@ -7344,6 +7344,8 @@ qeth_setrouting_v6(struct qeth_card *card) | |||
7344 | QETH_DBF_TEXT(trace,3,"setrtg6"); | 7344 | QETH_DBF_TEXT(trace,3,"setrtg6"); |
7345 | #ifdef CONFIG_QETH_IPV6 | 7345 | #ifdef CONFIG_QETH_IPV6 |
7346 | 7346 | ||
7347 | if (!qeth_is_supported(card, IPA_IPV6)) | ||
7348 | return 0; | ||
7347 | qeth_correct_routing_type(card, &card->options.route6.type, | 7349 | qeth_correct_routing_type(card, &card->options.route6.type, |
7348 | QETH_PROT_IPV6); | 7350 | QETH_PROT_IPV6); |
7349 | 7351 | ||
@@ -8544,34 +8546,44 @@ qeth_ipv6_uninit(void) | |||
8544 | static void | 8546 | static void |
8545 | qeth_sysfs_unregister(void) | 8547 | qeth_sysfs_unregister(void) |
8546 | { | 8548 | { |
8549 | s390_root_dev_unregister(qeth_root_dev); | ||
8547 | qeth_remove_driver_attributes(); | 8550 | qeth_remove_driver_attributes(); |
8548 | ccw_driver_unregister(&qeth_ccw_driver); | 8551 | ccw_driver_unregister(&qeth_ccw_driver); |
8549 | ccwgroup_driver_unregister(&qeth_ccwgroup_driver); | 8552 | ccwgroup_driver_unregister(&qeth_ccwgroup_driver); |
8550 | s390_root_dev_unregister(qeth_root_dev); | ||
8551 | } | 8553 | } |
8554 | |||
8552 | /** | 8555 | /** |
8553 | * register qeth at sysfs | 8556 | * register qeth at sysfs |
8554 | */ | 8557 | */ |
8555 | static int | 8558 | static int |
8556 | qeth_sysfs_register(void) | 8559 | qeth_sysfs_register(void) |
8557 | { | 8560 | { |
8558 | int rc=0; | 8561 | int rc; |
8559 | 8562 | ||
8560 | rc = ccwgroup_driver_register(&qeth_ccwgroup_driver); | 8563 | rc = ccwgroup_driver_register(&qeth_ccwgroup_driver); |
8561 | if (rc) | 8564 | if (rc) |
8562 | return rc; | 8565 | goto out; |
8566 | |||
8563 | rc = ccw_driver_register(&qeth_ccw_driver); | 8567 | rc = ccw_driver_register(&qeth_ccw_driver); |
8564 | if (rc) | 8568 | if (rc) |
8565 | return rc; | 8569 | goto out_ccw_driver; |
8570 | |||
8566 | rc = qeth_create_driver_attributes(); | 8571 | rc = qeth_create_driver_attributes(); |
8567 | if (rc) | 8572 | if (rc) |
8568 | return rc; | 8573 | goto out_qeth_attr; |
8574 | |||
8569 | qeth_root_dev = s390_root_dev_register("qeth"); | 8575 | qeth_root_dev = s390_root_dev_register("qeth"); |
8570 | if (IS_ERR(qeth_root_dev)) { | 8576 | rc = IS_ERR(qeth_root_dev) ? PTR_ERR(qeth_root_dev) : 0; |
8571 | rc = PTR_ERR(qeth_root_dev); | 8577 | if (!rc) |
8572 | return rc; | 8578 | goto out; |
8573 | } | 8579 | |
8574 | return 0; | 8580 | qeth_remove_driver_attributes(); |
8581 | out_qeth_attr: | ||
8582 | ccw_driver_unregister(&qeth_ccw_driver); | ||
8583 | out_ccw_driver: | ||
8584 | ccwgroup_driver_unregister(&qeth_ccwgroup_driver); | ||
8585 | out: | ||
8586 | return rc; | ||
8575 | } | 8587 | } |
8576 | 8588 | ||
8577 | /*** | 8589 | /*** |
@@ -8580,7 +8592,7 @@ qeth_sysfs_register(void) | |||
8580 | static int __init | 8592 | static int __init |
8581 | qeth_init(void) | 8593 | qeth_init(void) |
8582 | { | 8594 | { |
8583 | int rc=0; | 8595 | int rc; |
8584 | 8596 | ||
8585 | PRINT_INFO("loading %s\n", version); | 8597 | PRINT_INFO("loading %s\n", version); |
8586 | 8598 | ||
@@ -8589,20 +8601,26 @@ qeth_init(void) | |||
8589 | spin_lock_init(&qeth_notify_lock); | 8601 | spin_lock_init(&qeth_notify_lock); |
8590 | rwlock_init(&qeth_card_list.rwlock); | 8602 | rwlock_init(&qeth_card_list.rwlock); |
8591 | 8603 | ||
8592 | if (qeth_register_dbf_views()) | 8604 | rc = qeth_register_dbf_views(); |
8605 | if (rc) | ||
8593 | goto out_err; | 8606 | goto out_err; |
8594 | if (qeth_sysfs_register()) | 8607 | |
8595 | goto out_sysfs; | 8608 | rc = qeth_sysfs_register(); |
8609 | if (rc) | ||
8610 | goto out_dbf; | ||
8596 | 8611 | ||
8597 | #ifdef CONFIG_QETH_IPV6 | 8612 | #ifdef CONFIG_QETH_IPV6 |
8598 | if (qeth_ipv6_init()) { | 8613 | rc = qeth_ipv6_init(); |
8599 | PRINT_ERR("Out of memory during ipv6 init.\n"); | 8614 | if (rc) { |
8615 | PRINT_ERR("Out of memory during ipv6 init code = %d\n", rc); | ||
8600 | goto out_sysfs; | 8616 | goto out_sysfs; |
8601 | } | 8617 | } |
8602 | #endif /* QETH_IPV6 */ | 8618 | #endif /* QETH_IPV6 */ |
8603 | if (qeth_register_notifiers()) | 8619 | rc = qeth_register_notifiers(); |
8620 | if (rc) | ||
8604 | goto out_ipv6; | 8621 | goto out_ipv6; |
8605 | if (qeth_create_procfs_entries()) | 8622 | rc = qeth_create_procfs_entries(); |
8623 | if (rc) | ||
8606 | goto out_notifiers; | 8624 | goto out_notifiers; |
8607 | 8625 | ||
8608 | return rc; | 8626 | return rc; |
@@ -8612,12 +8630,13 @@ out_notifiers: | |||
8612 | out_ipv6: | 8630 | out_ipv6: |
8613 | #ifdef CONFIG_QETH_IPV6 | 8631 | #ifdef CONFIG_QETH_IPV6 |
8614 | qeth_ipv6_uninit(); | 8632 | qeth_ipv6_uninit(); |
8615 | #endif /* QETH_IPV6 */ | ||
8616 | out_sysfs: | 8633 | out_sysfs: |
8634 | #endif /* QETH_IPV6 */ | ||
8617 | qeth_sysfs_unregister(); | 8635 | qeth_sysfs_unregister(); |
8636 | out_dbf: | ||
8618 | qeth_unregister_dbf_views(); | 8637 | qeth_unregister_dbf_views(); |
8619 | out_err: | 8638 | out_err: |
8620 | PRINT_ERR("Initialization failed"); | 8639 | PRINT_ERR("Initialization failed with code %d\n", rc); |
8621 | return rc; | 8640 | return rc; |
8622 | } | 8641 | } |
8623 | 8642 | ||