diff options
-rw-r--r-- | drivers/s390/net/qeth_core_main.c | 90 |
1 files changed, 78 insertions, 12 deletions
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 1cccbad69cd4..3535b134bd31 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -5122,13 +5122,81 @@ static const struct device_type qeth_osn_devtype = { | |||
5122 | .groups = qeth_osn_attr_groups, | 5122 | .groups = qeth_osn_attr_groups, |
5123 | }; | 5123 | }; |
5124 | 5124 | ||
5125 | #define DBF_NAME_LEN 20 | ||
5126 | |||
5127 | struct qeth_dbf_entry { | ||
5128 | char dbf_name[DBF_NAME_LEN]; | ||
5129 | debug_info_t *dbf_info; | ||
5130 | struct list_head dbf_list; | ||
5131 | }; | ||
5132 | |||
5133 | static LIST_HEAD(qeth_dbf_list); | ||
5134 | static DEFINE_MUTEX(qeth_dbf_list_mutex); | ||
5135 | |||
5136 | static debug_info_t *qeth_get_dbf_entry(char *name) | ||
5137 | { | ||
5138 | struct qeth_dbf_entry *entry; | ||
5139 | debug_info_t *rc = NULL; | ||
5140 | |||
5141 | mutex_lock(&qeth_dbf_list_mutex); | ||
5142 | list_for_each_entry(entry, &qeth_dbf_list, dbf_list) { | ||
5143 | if (strcmp(entry->dbf_name, name) == 0) { | ||
5144 | rc = entry->dbf_info; | ||
5145 | break; | ||
5146 | } | ||
5147 | } | ||
5148 | mutex_unlock(&qeth_dbf_list_mutex); | ||
5149 | return rc; | ||
5150 | } | ||
5151 | |||
5152 | static int qeth_add_dbf_entry(struct qeth_card *card, char *name) | ||
5153 | { | ||
5154 | struct qeth_dbf_entry *new_entry; | ||
5155 | |||
5156 | card->debug = debug_register(name, 2, 1, 8); | ||
5157 | if (!card->debug) { | ||
5158 | QETH_DBF_TEXT_(SETUP, 2, "%s", "qcdbf"); | ||
5159 | goto err; | ||
5160 | } | ||
5161 | if (debug_register_view(card->debug, &debug_hex_ascii_view)) | ||
5162 | goto err_dbg; | ||
5163 | new_entry = kzalloc(sizeof(struct qeth_dbf_entry), GFP_KERNEL); | ||
5164 | if (!new_entry) | ||
5165 | goto err_dbg; | ||
5166 | strncpy(new_entry->dbf_name, name, DBF_NAME_LEN); | ||
5167 | new_entry->dbf_info = card->debug; | ||
5168 | mutex_lock(&qeth_dbf_list_mutex); | ||
5169 | list_add(&new_entry->dbf_list, &qeth_dbf_list); | ||
5170 | mutex_unlock(&qeth_dbf_list_mutex); | ||
5171 | |||
5172 | return 0; | ||
5173 | |||
5174 | err_dbg: | ||
5175 | debug_unregister(card->debug); | ||
5176 | err: | ||
5177 | return -ENOMEM; | ||
5178 | } | ||
5179 | |||
5180 | static void qeth_clear_dbf_list(void) | ||
5181 | { | ||
5182 | struct qeth_dbf_entry *entry, *tmp; | ||
5183 | |||
5184 | mutex_lock(&qeth_dbf_list_mutex); | ||
5185 | list_for_each_entry_safe(entry, tmp, &qeth_dbf_list, dbf_list) { | ||
5186 | list_del(&entry->dbf_list); | ||
5187 | debug_unregister(entry->dbf_info); | ||
5188 | kfree(entry); | ||
5189 | } | ||
5190 | mutex_unlock(&qeth_dbf_list_mutex); | ||
5191 | } | ||
5192 | |||
5125 | static int qeth_core_probe_device(struct ccwgroup_device *gdev) | 5193 | static int qeth_core_probe_device(struct ccwgroup_device *gdev) |
5126 | { | 5194 | { |
5127 | struct qeth_card *card; | 5195 | struct qeth_card *card; |
5128 | struct device *dev; | 5196 | struct device *dev; |
5129 | int rc; | 5197 | int rc; |
5130 | unsigned long flags; | 5198 | unsigned long flags; |
5131 | char dbf_name[20]; | 5199 | char dbf_name[DBF_NAME_LEN]; |
5132 | 5200 | ||
5133 | QETH_DBF_TEXT(SETUP, 2, "probedev"); | 5201 | QETH_DBF_TEXT(SETUP, 2, "probedev"); |
5134 | 5202 | ||
@@ -5147,13 +5215,12 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev) | |||
5147 | 5215 | ||
5148 | snprintf(dbf_name, sizeof(dbf_name), "qeth_card_%s", | 5216 | snprintf(dbf_name, sizeof(dbf_name), "qeth_card_%s", |
5149 | dev_name(&gdev->dev)); | 5217 | dev_name(&gdev->dev)); |
5150 | card->debug = debug_register(dbf_name, 2, 1, 8); | 5218 | card->debug = qeth_get_dbf_entry(dbf_name); |
5151 | if (!card->debug) { | 5219 | if (!card->debug) { |
5152 | QETH_DBF_TEXT_(SETUP, 2, "%s", "qcdbf"); | 5220 | rc = qeth_add_dbf_entry(card, dbf_name); |
5153 | rc = -ENOMEM; | 5221 | if (rc) |
5154 | goto err_card; | 5222 | goto err_card; |
5155 | } | 5223 | } |
5156 | debug_register_view(card->debug, &debug_hex_ascii_view); | ||
5157 | 5224 | ||
5158 | card->read.ccwdev = gdev->cdev[0]; | 5225 | card->read.ccwdev = gdev->cdev[0]; |
5159 | card->write.ccwdev = gdev->cdev[1]; | 5226 | card->write.ccwdev = gdev->cdev[1]; |
@@ -5167,12 +5234,12 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev) | |||
5167 | rc = qeth_determine_card_type(card); | 5234 | rc = qeth_determine_card_type(card); |
5168 | if (rc) { | 5235 | if (rc) { |
5169 | QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc); | 5236 | QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc); |
5170 | goto err_dbf; | 5237 | goto err_card; |
5171 | } | 5238 | } |
5172 | rc = qeth_setup_card(card); | 5239 | rc = qeth_setup_card(card); |
5173 | if (rc) { | 5240 | if (rc) { |
5174 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); | 5241 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); |
5175 | goto err_dbf; | 5242 | goto err_card; |
5176 | } | 5243 | } |
5177 | 5244 | ||
5178 | if (card->info.type == QETH_CARD_TYPE_OSN) | 5245 | if (card->info.type == QETH_CARD_TYPE_OSN) |
@@ -5185,7 +5252,7 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev) | |||
5185 | case QETH_CARD_TYPE_OSM: | 5252 | case QETH_CARD_TYPE_OSM: |
5186 | rc = qeth_core_load_discipline(card, QETH_DISCIPLINE_LAYER2); | 5253 | rc = qeth_core_load_discipline(card, QETH_DISCIPLINE_LAYER2); |
5187 | if (rc) | 5254 | if (rc) |
5188 | goto err_dbf; | 5255 | goto err_card; |
5189 | rc = card->discipline->setup(card->gdev); | 5256 | rc = card->discipline->setup(card->gdev); |
5190 | if (rc) | 5257 | if (rc) |
5191 | goto err_disc; | 5258 | goto err_disc; |
@@ -5204,8 +5271,6 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev) | |||
5204 | 5271 | ||
5205 | err_disc: | 5272 | err_disc: |
5206 | qeth_core_free_discipline(card); | 5273 | qeth_core_free_discipline(card); |
5207 | err_dbf: | ||
5208 | debug_unregister(card->debug); | ||
5209 | err_card: | 5274 | err_card: |
5210 | qeth_core_free_card(card); | 5275 | qeth_core_free_card(card); |
5211 | err_dev: | 5276 | err_dev: |
@@ -5225,7 +5290,6 @@ static void qeth_core_remove_device(struct ccwgroup_device *gdev) | |||
5225 | qeth_core_free_discipline(card); | 5290 | qeth_core_free_discipline(card); |
5226 | } | 5291 | } |
5227 | 5292 | ||
5228 | debug_unregister(card->debug); | ||
5229 | write_lock_irqsave(&qeth_core_card_list.rwlock, flags); | 5293 | write_lock_irqsave(&qeth_core_card_list.rwlock, flags); |
5230 | list_del(&card->list); | 5294 | list_del(&card->list); |
5231 | write_unlock_irqrestore(&qeth_core_card_list.rwlock, flags); | 5295 | write_unlock_irqrestore(&qeth_core_card_list.rwlock, flags); |
@@ -5579,6 +5643,7 @@ static int __init qeth_core_init(void) | |||
5579 | 5643 | ||
5580 | pr_info("loading core functions\n"); | 5644 | pr_info("loading core functions\n"); |
5581 | INIT_LIST_HEAD(&qeth_core_card_list.list); | 5645 | INIT_LIST_HEAD(&qeth_core_card_list.list); |
5646 | INIT_LIST_HEAD(&qeth_dbf_list); | ||
5582 | rwlock_init(&qeth_core_card_list.rwlock); | 5647 | rwlock_init(&qeth_core_card_list.rwlock); |
5583 | mutex_init(&qeth_mod_mutex); | 5648 | mutex_init(&qeth_mod_mutex); |
5584 | 5649 | ||
@@ -5630,6 +5695,7 @@ out_err: | |||
5630 | 5695 | ||
5631 | static void __exit qeth_core_exit(void) | 5696 | static void __exit qeth_core_exit(void) |
5632 | { | 5697 | { |
5698 | qeth_clear_dbf_list(); | ||
5633 | destroy_workqueue(qeth_wq); | 5699 | destroy_workqueue(qeth_wq); |
5634 | ccwgroup_driver_unregister(&qeth_core_ccwgroup_driver); | 5700 | ccwgroup_driver_unregister(&qeth_core_ccwgroup_driver); |
5635 | ccw_driver_unregister(&qeth_ccw_driver); | 5701 | ccw_driver_unregister(&qeth_ccw_driver); |