Loading drivers/scsi/Kconfig +1 −0 Original line number Diff line number Diff line Loading @@ -839,6 +839,7 @@ config SCSI_IPS config SCSI_IBMVSCSI tristate "IBM Virtual SCSI support" depends on PPC_PSERIES || PPC_ISERIES select SCSI_SRP_ATTRS help This is the IBM POWER Virtual SCSI Client Loading drivers/scsi/ibmvscsi/ibmvscsi.c +32 −2 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ #include <scsi/scsi_cmnd.h> #include <scsi/scsi_host.h> #include <scsi/scsi_device.h> #include <scsi/scsi_transport_srp.h> #include "ibmvscsi.h" /* The values below are somewhat arbitrary default values, but Loading @@ -87,6 +88,8 @@ static int max_channel = 3; static int init_timeout = 5; static int max_requests = IBMVSCSI_MAX_REQUESTS_DEFAULT; static struct scsi_transport_template *ibmvscsi_transport_template; #define IBMVSCSI_VERSION "1.5.8" MODULE_DESCRIPTION("IBM Virtual SCSI"); Loading Loading @@ -1553,6 +1556,8 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) struct ibmvscsi_host_data *hostdata; struct Scsi_Host *host; struct device *dev = &vdev->dev; struct srp_rport_identifiers ids; struct srp_rport *rport; unsigned long wait_switch = 0; int rc; Loading @@ -1565,6 +1570,7 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) goto scsi_host_alloc_failed; } host->transportt = ibmvscsi_transport_template; hostdata = shost_priv(host); memset(hostdata, 0x00, sizeof(*hostdata)); INIT_LIST_HEAD(&hostdata->sent); Loading @@ -1590,6 +1596,13 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) if (scsi_add_host(hostdata->host, hostdata->dev)) goto add_host_failed; /* we don't have a proper target_port_id so let's use the fake one */ memcpy(ids.port_id, hostdata->madapter_info.partition_name, sizeof(ids.port_id)); rport = srp_rport_add(host, &ids); if (IS_ERR(rport)) goto add_srp_port_failed; /* Try to send an initialization message. Note that this is allowed * to fail if the other end is not acive. In that case we don't * want to scan Loading Loading @@ -1617,6 +1630,8 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) vdev->dev.driver_data = hostdata; return 0; add_srp_port_failed: scsi_remove_host(hostdata->host); add_host_failed: release_event_pool(&hostdata->pool, hostdata); init_pool_failed: Loading @@ -1634,6 +1649,7 @@ static int ibmvscsi_remove(struct vio_dev *vdev) ibmvscsi_release_crq_queue(&hostdata->queue, hostdata, max_requests); srp_remove_host(hostdata->host); scsi_remove_host(hostdata->host); scsi_host_put(hostdata->host); Loading @@ -1660,14 +1676,28 @@ static struct vio_driver ibmvscsi_driver = { } }; static struct srp_function_template ibmvscsi_transport_functions = { }; int __init ibmvscsi_module_init(void) { return vio_register_driver(&ibmvscsi_driver); int ret; ibmvscsi_transport_template = srp_attach_transport(&ibmvscsi_transport_functions); if (!ibmvscsi_transport_template) return -ENOMEM; ret = vio_register_driver(&ibmvscsi_driver); if (ret) srp_release_transport(ibmvscsi_transport_template); return ret; } void __exit ibmvscsi_module_exit(void) { vio_unregister_driver(&ibmvscsi_driver); srp_release_transport(ibmvscsi_transport_template); } module_init(ibmvscsi_module_init); Loading Loading
drivers/scsi/Kconfig +1 −0 Original line number Diff line number Diff line Loading @@ -839,6 +839,7 @@ config SCSI_IPS config SCSI_IBMVSCSI tristate "IBM Virtual SCSI support" depends on PPC_PSERIES || PPC_ISERIES select SCSI_SRP_ATTRS help This is the IBM POWER Virtual SCSI Client Loading
drivers/scsi/ibmvscsi/ibmvscsi.c +32 −2 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ #include <scsi/scsi_cmnd.h> #include <scsi/scsi_host.h> #include <scsi/scsi_device.h> #include <scsi/scsi_transport_srp.h> #include "ibmvscsi.h" /* The values below are somewhat arbitrary default values, but Loading @@ -87,6 +88,8 @@ static int max_channel = 3; static int init_timeout = 5; static int max_requests = IBMVSCSI_MAX_REQUESTS_DEFAULT; static struct scsi_transport_template *ibmvscsi_transport_template; #define IBMVSCSI_VERSION "1.5.8" MODULE_DESCRIPTION("IBM Virtual SCSI"); Loading Loading @@ -1553,6 +1556,8 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) struct ibmvscsi_host_data *hostdata; struct Scsi_Host *host; struct device *dev = &vdev->dev; struct srp_rport_identifiers ids; struct srp_rport *rport; unsigned long wait_switch = 0; int rc; Loading @@ -1565,6 +1570,7 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) goto scsi_host_alloc_failed; } host->transportt = ibmvscsi_transport_template; hostdata = shost_priv(host); memset(hostdata, 0x00, sizeof(*hostdata)); INIT_LIST_HEAD(&hostdata->sent); Loading @@ -1590,6 +1596,13 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) if (scsi_add_host(hostdata->host, hostdata->dev)) goto add_host_failed; /* we don't have a proper target_port_id so let's use the fake one */ memcpy(ids.port_id, hostdata->madapter_info.partition_name, sizeof(ids.port_id)); rport = srp_rport_add(host, &ids); if (IS_ERR(rport)) goto add_srp_port_failed; /* Try to send an initialization message. Note that this is allowed * to fail if the other end is not acive. In that case we don't * want to scan Loading Loading @@ -1617,6 +1630,8 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) vdev->dev.driver_data = hostdata; return 0; add_srp_port_failed: scsi_remove_host(hostdata->host); add_host_failed: release_event_pool(&hostdata->pool, hostdata); init_pool_failed: Loading @@ -1634,6 +1649,7 @@ static int ibmvscsi_remove(struct vio_dev *vdev) ibmvscsi_release_crq_queue(&hostdata->queue, hostdata, max_requests); srp_remove_host(hostdata->host); scsi_remove_host(hostdata->host); scsi_host_put(hostdata->host); Loading @@ -1660,14 +1676,28 @@ static struct vio_driver ibmvscsi_driver = { } }; static struct srp_function_template ibmvscsi_transport_functions = { }; int __init ibmvscsi_module_init(void) { return vio_register_driver(&ibmvscsi_driver); int ret; ibmvscsi_transport_template = srp_attach_transport(&ibmvscsi_transport_functions); if (!ibmvscsi_transport_template) return -ENOMEM; ret = vio_register_driver(&ibmvscsi_driver); if (ret) srp_release_transport(ibmvscsi_transport_template); return ret; } void __exit ibmvscsi_module_exit(void) { vio_unregister_driver(&ibmvscsi_driver); srp_release_transport(ibmvscsi_transport_template); } module_init(ibmvscsi_module_init); Loading