0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 #define KMSG_COMPONENT "zfcp"
0032 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
0033
0034 #include <linux/seq_file.h>
0035 #include <linux/slab.h>
0036 #include <linux/module.h>
0037 #include "zfcp_ext.h"
0038 #include "zfcp_fc.h"
0039 #include "zfcp_reqlist.h"
0040 #include "zfcp_diag.h"
0041
0042 #define ZFCP_BUS_ID_SIZE 20
0043
0044 MODULE_AUTHOR("IBM Deutschland Entwicklung GmbH - linux390@de.ibm.com");
0045 MODULE_DESCRIPTION("FCP HBA driver");
0046 MODULE_LICENSE("GPL");
0047
0048 static char *init_device;
0049 module_param_named(device, init_device, charp, 0400);
0050 MODULE_PARM_DESC(device, "specify initial device");
0051
0052 static struct kmem_cache * __init zfcp_cache_hw_align(const char *name,
0053 unsigned long size)
0054 {
0055 return kmem_cache_create(name, size, roundup_pow_of_two(size), 0, NULL);
0056 }
0057
0058 static void __init zfcp_init_device_configure(char *busid, u64 wwpn, u64 lun)
0059 {
0060 struct ccw_device *cdev;
0061 struct zfcp_adapter *adapter;
0062 struct zfcp_port *port;
0063
0064 cdev = get_ccwdev_by_busid(&zfcp_ccw_driver, busid);
0065 if (!cdev)
0066 return;
0067
0068 if (ccw_device_set_online(cdev))
0069 goto out_ccw_device;
0070
0071 adapter = zfcp_ccw_adapter_by_cdev(cdev);
0072 if (!adapter)
0073 goto out_ccw_device;
0074
0075 port = zfcp_get_port_by_wwpn(adapter, wwpn);
0076 if (!port)
0077 goto out_port;
0078 flush_work(&port->rport_work);
0079
0080 zfcp_unit_add(port, lun);
0081 put_device(&port->dev);
0082
0083 out_port:
0084 zfcp_ccw_adapter_put(adapter);
0085 out_ccw_device:
0086 put_device(&cdev->dev);
0087 return;
0088 }
0089
0090 static void __init zfcp_init_device_setup(char *devstr)
0091 {
0092 char *token;
0093 char *str, *str_saved;
0094 char busid[ZFCP_BUS_ID_SIZE];
0095 u64 wwpn, lun;
0096
0097
0098 str_saved = kstrdup(devstr, GFP_KERNEL);
0099 str = str_saved;
0100 if (!str)
0101 return;
0102
0103 token = strsep(&str, ",");
0104 if (!token || strlen(token) >= ZFCP_BUS_ID_SIZE)
0105 goto err_out;
0106 strlcpy(busid, token, ZFCP_BUS_ID_SIZE);
0107
0108 token = strsep(&str, ",");
0109 if (!token || kstrtoull(token, 0, (unsigned long long *) &wwpn))
0110 goto err_out;
0111
0112 token = strsep(&str, ",");
0113 if (!token || kstrtoull(token, 0, (unsigned long long *) &lun))
0114 goto err_out;
0115
0116 kfree(str_saved);
0117 zfcp_init_device_configure(busid, wwpn, lun);
0118 return;
0119
0120 err_out:
0121 kfree(str_saved);
0122 pr_err("%s is not a valid SCSI device\n", devstr);
0123 }
0124
0125 static int __init zfcp_module_init(void)
0126 {
0127 int retval = -ENOMEM;
0128
0129 if (zfcp_experimental_dix)
0130 pr_warn("DIX is enabled. It is experimental and might cause problems\n");
0131
0132 zfcp_fsf_qtcb_cache = zfcp_cache_hw_align("zfcp_fsf_qtcb",
0133 sizeof(struct fsf_qtcb));
0134 if (!zfcp_fsf_qtcb_cache)
0135 goto out_qtcb_cache;
0136
0137 zfcp_fc_req_cache = zfcp_cache_hw_align("zfcp_fc_req",
0138 sizeof(struct zfcp_fc_req));
0139 if (!zfcp_fc_req_cache)
0140 goto out_fc_cache;
0141
0142 zfcp_scsi_transport_template =
0143 fc_attach_transport(&zfcp_transport_functions);
0144 if (!zfcp_scsi_transport_template)
0145 goto out_transport;
0146 scsi_transport_reserve_device(zfcp_scsi_transport_template,
0147 sizeof(struct zfcp_scsi_dev));
0148
0149 retval = ccw_driver_register(&zfcp_ccw_driver);
0150 if (retval) {
0151 pr_err("The zfcp device driver could not register with "
0152 "the common I/O layer\n");
0153 goto out_ccw_register;
0154 }
0155
0156 if (init_device)
0157 zfcp_init_device_setup(init_device);
0158 return 0;
0159
0160 out_ccw_register:
0161 fc_release_transport(zfcp_scsi_transport_template);
0162 out_transport:
0163 kmem_cache_destroy(zfcp_fc_req_cache);
0164 out_fc_cache:
0165 kmem_cache_destroy(zfcp_fsf_qtcb_cache);
0166 out_qtcb_cache:
0167 return retval;
0168 }
0169
0170 module_init(zfcp_module_init);
0171
0172 static void __exit zfcp_module_exit(void)
0173 {
0174 ccw_driver_unregister(&zfcp_ccw_driver);
0175 fc_release_transport(zfcp_scsi_transport_template);
0176 kmem_cache_destroy(zfcp_fc_req_cache);
0177 kmem_cache_destroy(zfcp_fsf_qtcb_cache);
0178 }
0179
0180 module_exit(zfcp_module_exit);
0181
0182
0183
0184
0185
0186
0187
0188
0189 struct zfcp_port *zfcp_get_port_by_wwpn(struct zfcp_adapter *adapter,
0190 u64 wwpn)
0191 {
0192 unsigned long flags;
0193 struct zfcp_port *port;
0194
0195 read_lock_irqsave(&adapter->port_list_lock, flags);
0196 list_for_each_entry(port, &adapter->port_list, list)
0197 if (port->wwpn == wwpn) {
0198 if (!get_device(&port->dev))
0199 port = NULL;
0200 read_unlock_irqrestore(&adapter->port_list_lock, flags);
0201 return port;
0202 }
0203 read_unlock_irqrestore(&adapter->port_list_lock, flags);
0204 return NULL;
0205 }
0206
0207 static int zfcp_allocate_low_mem_buffers(struct zfcp_adapter *adapter)
0208 {
0209 adapter->pool.erp_req =
0210 mempool_create_kmalloc_pool(1, sizeof(struct zfcp_fsf_req));
0211 if (!adapter->pool.erp_req)
0212 return -ENOMEM;
0213
0214 adapter->pool.gid_pn_req =
0215 mempool_create_kmalloc_pool(1, sizeof(struct zfcp_fsf_req));
0216 if (!adapter->pool.gid_pn_req)
0217 return -ENOMEM;
0218
0219 adapter->pool.scsi_req =
0220 mempool_create_kmalloc_pool(1, sizeof(struct zfcp_fsf_req));
0221 if (!adapter->pool.scsi_req)
0222 return -ENOMEM;
0223
0224 adapter->pool.scsi_abort =
0225 mempool_create_kmalloc_pool(1, sizeof(struct zfcp_fsf_req));
0226 if (!adapter->pool.scsi_abort)
0227 return -ENOMEM;
0228
0229 adapter->pool.status_read_req =
0230 mempool_create_kmalloc_pool(FSF_STATUS_READS_RECOM,
0231 sizeof(struct zfcp_fsf_req));
0232 if (!adapter->pool.status_read_req)
0233 return -ENOMEM;
0234
0235 adapter->pool.qtcb_pool =
0236 mempool_create_slab_pool(4, zfcp_fsf_qtcb_cache);
0237 if (!adapter->pool.qtcb_pool)
0238 return -ENOMEM;
0239
0240 BUILD_BUG_ON(sizeof(struct fsf_status_read_buffer) > PAGE_SIZE);
0241 adapter->pool.sr_data =
0242 mempool_create_page_pool(FSF_STATUS_READS_RECOM, 0);
0243 if (!adapter->pool.sr_data)
0244 return -ENOMEM;
0245
0246 adapter->pool.gid_pn =
0247 mempool_create_slab_pool(1, zfcp_fc_req_cache);
0248 if (!adapter->pool.gid_pn)
0249 return -ENOMEM;
0250
0251 return 0;
0252 }
0253
0254 static void zfcp_free_low_mem_buffers(struct zfcp_adapter *adapter)
0255 {
0256 mempool_destroy(adapter->pool.erp_req);
0257 mempool_destroy(adapter->pool.scsi_req);
0258 mempool_destroy(adapter->pool.scsi_abort);
0259 mempool_destroy(adapter->pool.qtcb_pool);
0260 mempool_destroy(adapter->pool.status_read_req);
0261 mempool_destroy(adapter->pool.sr_data);
0262 mempool_destroy(adapter->pool.gid_pn);
0263 }
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274 int zfcp_status_read_refill(struct zfcp_adapter *adapter)
0275 {
0276 while (atomic_add_unless(&adapter->stat_miss, -1, 0))
0277 if (zfcp_fsf_status_read(adapter->qdio)) {
0278 atomic_inc(&adapter->stat_miss);
0279 if (atomic_read(&adapter->stat_miss) >=
0280 adapter->stat_read_buf_num) {
0281 zfcp_erp_adapter_reopen(adapter, 0, "axsref1");
0282 return 1;
0283 }
0284 break;
0285 }
0286 return 0;
0287 }
0288
0289 static void _zfcp_status_read_scheduler(struct work_struct *work)
0290 {
0291 zfcp_status_read_refill(container_of(work, struct zfcp_adapter,
0292 stat_work));
0293 }
0294
0295 static void zfcp_version_change_lost_work(struct work_struct *work)
0296 {
0297 struct zfcp_adapter *adapter = container_of(work, struct zfcp_adapter,
0298 version_change_lost_work);
0299
0300 zfcp_fsf_exchange_config_data_sync(adapter->qdio, NULL);
0301 }
0302
0303 static void zfcp_print_sl(struct seq_file *m, struct service_level *sl)
0304 {
0305 struct zfcp_adapter *adapter =
0306 container_of(sl, struct zfcp_adapter, service_level);
0307
0308 seq_printf(m, "zfcp: %s microcode level %x\n",
0309 dev_name(&adapter->ccw_device->dev),
0310 adapter->fsf_lic_version);
0311 }
0312
0313 static int zfcp_setup_adapter_work_queue(struct zfcp_adapter *adapter)
0314 {
0315 char name[TASK_COMM_LEN];
0316
0317 snprintf(name, sizeof(name), "zfcp_q_%s",
0318 dev_name(&adapter->ccw_device->dev));
0319 adapter->work_queue = alloc_ordered_workqueue(name, WQ_MEM_RECLAIM);
0320
0321 if (adapter->work_queue)
0322 return 0;
0323 return -ENOMEM;
0324 }
0325
0326 static void zfcp_destroy_adapter_work_queue(struct zfcp_adapter *adapter)
0327 {
0328 if (adapter->work_queue)
0329 destroy_workqueue(adapter->work_queue);
0330 adapter->work_queue = NULL;
0331
0332 }
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343 struct zfcp_adapter *zfcp_adapter_enqueue(struct ccw_device *ccw_device)
0344 {
0345 struct zfcp_adapter *adapter;
0346
0347 if (!get_device(&ccw_device->dev))
0348 return ERR_PTR(-ENODEV);
0349
0350 adapter = kzalloc(sizeof(struct zfcp_adapter), GFP_KERNEL);
0351 if (!adapter) {
0352 put_device(&ccw_device->dev);
0353 return ERR_PTR(-ENOMEM);
0354 }
0355
0356 kref_init(&adapter->ref);
0357
0358 ccw_device->handler = NULL;
0359 adapter->ccw_device = ccw_device;
0360
0361 INIT_WORK(&adapter->stat_work, _zfcp_status_read_scheduler);
0362 INIT_DELAYED_WORK(&adapter->scan_work, zfcp_fc_scan_ports);
0363 INIT_WORK(&adapter->ns_up_work, zfcp_fc_sym_name_update);
0364 INIT_WORK(&adapter->version_change_lost_work,
0365 zfcp_version_change_lost_work);
0366
0367 adapter->next_port_scan = jiffies;
0368
0369 adapter->erp_action.adapter = adapter;
0370
0371 if (zfcp_diag_adapter_setup(adapter))
0372 goto failed;
0373
0374 if (zfcp_qdio_setup(adapter))
0375 goto failed;
0376
0377 if (zfcp_allocate_low_mem_buffers(adapter))
0378 goto failed;
0379
0380 adapter->req_list = zfcp_reqlist_alloc();
0381 if (!adapter->req_list)
0382 goto failed;
0383
0384 if (zfcp_dbf_adapter_register(adapter))
0385 goto failed;
0386
0387 if (zfcp_setup_adapter_work_queue(adapter))
0388 goto failed;
0389
0390 if (zfcp_fc_gs_setup(adapter))
0391 goto failed;
0392
0393 rwlock_init(&adapter->port_list_lock);
0394 INIT_LIST_HEAD(&adapter->port_list);
0395
0396 INIT_LIST_HEAD(&adapter->events.list);
0397 INIT_WORK(&adapter->events.work, zfcp_fc_post_event);
0398 spin_lock_init(&adapter->events.list_lock);
0399
0400 init_waitqueue_head(&adapter->erp_ready_wq);
0401 init_waitqueue_head(&adapter->erp_done_wqh);
0402
0403 INIT_LIST_HEAD(&adapter->erp_ready_head);
0404 INIT_LIST_HEAD(&adapter->erp_running_head);
0405
0406 rwlock_init(&adapter->erp_lock);
0407 rwlock_init(&adapter->abort_lock);
0408
0409 if (zfcp_erp_thread_setup(adapter))
0410 goto failed;
0411
0412 adapter->service_level.seq_print = zfcp_print_sl;
0413
0414 dev_set_drvdata(&ccw_device->dev, adapter);
0415
0416 if (device_add_groups(&ccw_device->dev, zfcp_sysfs_adapter_attr_groups))
0417 goto err_sysfs;
0418
0419
0420 adapter->ccw_device->dev.dma_parms = &adapter->dma_parms;
0421
0422 adapter->stat_read_buf_num = FSF_STATUS_READS_RECOM;
0423
0424 return adapter;
0425
0426 err_sysfs:
0427 failed:
0428
0429 cancel_delayed_work_sync(&adapter->scan_work);
0430 cancel_work_sync(&adapter->stat_work);
0431 cancel_work_sync(&adapter->ns_up_work);
0432 cancel_work_sync(&adapter->version_change_lost_work);
0433 zfcp_destroy_adapter_work_queue(adapter);
0434
0435 zfcp_fc_wka_ports_force_offline(adapter->gs);
0436 zfcp_scsi_adapter_unregister(adapter);
0437
0438 zfcp_erp_thread_kill(adapter);
0439 zfcp_dbf_adapter_unregister(adapter);
0440 zfcp_qdio_destroy(adapter->qdio);
0441
0442 zfcp_ccw_adapter_put(adapter);
0443 return ERR_PTR(-ENOMEM);
0444 }
0445
0446 void zfcp_adapter_unregister(struct zfcp_adapter *adapter)
0447 {
0448 struct ccw_device *cdev = adapter->ccw_device;
0449
0450 cancel_delayed_work_sync(&adapter->scan_work);
0451 cancel_work_sync(&adapter->stat_work);
0452 cancel_work_sync(&adapter->ns_up_work);
0453 cancel_work_sync(&adapter->version_change_lost_work);
0454 zfcp_destroy_adapter_work_queue(adapter);
0455
0456 zfcp_fc_wka_ports_force_offline(adapter->gs);
0457 zfcp_scsi_adapter_unregister(adapter);
0458 device_remove_groups(&cdev->dev, zfcp_sysfs_adapter_attr_groups);
0459
0460 zfcp_erp_thread_kill(adapter);
0461 zfcp_dbf_adapter_unregister(adapter);
0462 zfcp_qdio_destroy(adapter->qdio);
0463
0464 zfcp_ccw_adapter_put(adapter);
0465 }
0466
0467
0468
0469
0470
0471
0472 void zfcp_adapter_release(struct kref *ref)
0473 {
0474 struct zfcp_adapter *adapter = container_of(ref, struct zfcp_adapter,
0475 ref);
0476 struct ccw_device *cdev = adapter->ccw_device;
0477
0478 dev_set_drvdata(&adapter->ccw_device->dev, NULL);
0479 zfcp_fc_gs_destroy(adapter);
0480 zfcp_free_low_mem_buffers(adapter);
0481 zfcp_diag_adapter_free(adapter);
0482 kfree(adapter->req_list);
0483 kfree(adapter->fc_stats);
0484 kfree(adapter->stats_reset_data);
0485 kfree(adapter);
0486 put_device(&cdev->dev);
0487 }
0488
0489 static void zfcp_port_release(struct device *dev)
0490 {
0491 struct zfcp_port *port = container_of(dev, struct zfcp_port, dev);
0492
0493 zfcp_ccw_adapter_put(port->adapter);
0494 kfree(port);
0495 }
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509 struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn,
0510 u32 status, u32 d_id)
0511 {
0512 struct zfcp_port *port;
0513 int retval = -ENOMEM;
0514
0515 kref_get(&adapter->ref);
0516
0517 port = zfcp_get_port_by_wwpn(adapter, wwpn);
0518 if (port) {
0519 put_device(&port->dev);
0520 retval = -EEXIST;
0521 goto err_out;
0522 }
0523
0524 port = kzalloc(sizeof(struct zfcp_port), GFP_KERNEL);
0525 if (!port)
0526 goto err_out;
0527
0528 rwlock_init(&port->unit_list_lock);
0529 INIT_LIST_HEAD(&port->unit_list);
0530 atomic_set(&port->units, 0);
0531
0532 INIT_WORK(&port->gid_pn_work, zfcp_fc_port_did_lookup);
0533 INIT_WORK(&port->test_link_work, zfcp_fc_link_test_work);
0534 INIT_WORK(&port->rport_work, zfcp_scsi_rport_work);
0535
0536 port->adapter = adapter;
0537 port->d_id = d_id;
0538 port->wwpn = wwpn;
0539 port->rport_task = RPORT_NONE;
0540 port->dev.parent = &adapter->ccw_device->dev;
0541 port->dev.groups = zfcp_port_attr_groups;
0542 port->dev.release = zfcp_port_release;
0543
0544 port->erp_action.adapter = adapter;
0545 port->erp_action.port = port;
0546
0547 if (dev_set_name(&port->dev, "0x%016llx", (unsigned long long)wwpn)) {
0548 kfree(port);
0549 goto err_out;
0550 }
0551 retval = -EINVAL;
0552
0553 if (device_register(&port->dev)) {
0554 put_device(&port->dev);
0555 goto err_out;
0556 }
0557
0558 write_lock_irq(&adapter->port_list_lock);
0559 list_add_tail(&port->list, &adapter->port_list);
0560 write_unlock_irq(&adapter->port_list_lock);
0561
0562 atomic_or(status | ZFCP_STATUS_COMMON_RUNNING, &port->status);
0563
0564 return port;
0565
0566 err_out:
0567 zfcp_ccw_adapter_put(adapter);
0568 return ERR_PTR(retval);
0569 }