Commit 4d680419 authored by FUJITA Tomonori's avatar FUJITA Tomonori Committed by James Bottomley

[SCSI] ibmvscsi: convert to use the srp transport class

This converts ibmvscsi to use the srp transport class.
Signed-off-by: default avatarFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Acked-by: default avatarBrian King <brking@us.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 09345f65
...@@ -839,6 +839,7 @@ config SCSI_IPS ...@@ -839,6 +839,7 @@ config SCSI_IPS
config SCSI_IBMVSCSI config SCSI_IBMVSCSI
tristate "IBM Virtual SCSI support" tristate "IBM Virtual SCSI support"
depends on PPC_PSERIES || PPC_ISERIES depends on PPC_PSERIES || PPC_ISERIES
select SCSI_SRP_ATTRS
help help
This is the IBM POWER Virtual SCSI Client This is the IBM POWER Virtual SCSI Client
......
...@@ -75,6 +75,7 @@ ...@@ -75,6 +75,7 @@
#include <scsi/scsi_cmnd.h> #include <scsi/scsi_cmnd.h>
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
#include <scsi/scsi_device.h> #include <scsi/scsi_device.h>
#include <scsi/scsi_transport_srp.h>
#include "ibmvscsi.h" #include "ibmvscsi.h"
/* The values below are somewhat arbitrary default values, but /* The values below are somewhat arbitrary default values, but
...@@ -87,6 +88,8 @@ static int max_channel = 3; ...@@ -87,6 +88,8 @@ static int max_channel = 3;
static int init_timeout = 5; static int init_timeout = 5;
static int max_requests = IBMVSCSI_MAX_REQUESTS_DEFAULT; static int max_requests = IBMVSCSI_MAX_REQUESTS_DEFAULT;
static struct scsi_transport_template *ibmvscsi_transport_template;
#define IBMVSCSI_VERSION "1.5.8" #define IBMVSCSI_VERSION "1.5.8"
MODULE_DESCRIPTION("IBM Virtual SCSI"); MODULE_DESCRIPTION("IBM Virtual SCSI");
...@@ -1553,6 +1556,8 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) ...@@ -1553,6 +1556,8 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id)
struct ibmvscsi_host_data *hostdata; struct ibmvscsi_host_data *hostdata;
struct Scsi_Host *host; struct Scsi_Host *host;
struct device *dev = &vdev->dev; struct device *dev = &vdev->dev;
struct srp_rport_identifiers ids;
struct srp_rport *rport;
unsigned long wait_switch = 0; unsigned long wait_switch = 0;
int rc; int rc;
...@@ -1565,6 +1570,7 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) ...@@ -1565,6 +1570,7 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id)
goto scsi_host_alloc_failed; goto scsi_host_alloc_failed;
} }
host->transportt = ibmvscsi_transport_template;
hostdata = shost_priv(host); hostdata = shost_priv(host);
memset(hostdata, 0x00, sizeof(*hostdata)); memset(hostdata, 0x00, sizeof(*hostdata));
INIT_LIST_HEAD(&hostdata->sent); INIT_LIST_HEAD(&hostdata->sent);
...@@ -1590,6 +1596,13 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) ...@@ -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)) if (scsi_add_host(hostdata->host, hostdata->dev))
goto add_host_failed; 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 /* 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 * to fail if the other end is not acive. In that case we don't
* want to scan * want to scan
...@@ -1617,6 +1630,8 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) ...@@ -1617,6 +1630,8 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id)
vdev->dev.driver_data = hostdata; vdev->dev.driver_data = hostdata;
return 0; return 0;
add_srp_port_failed:
scsi_remove_host(hostdata->host);
add_host_failed: add_host_failed:
release_event_pool(&hostdata->pool, hostdata); release_event_pool(&hostdata->pool, hostdata);
init_pool_failed: init_pool_failed:
...@@ -1633,7 +1648,8 @@ static int ibmvscsi_remove(struct vio_dev *vdev) ...@@ -1633,7 +1648,8 @@ static int ibmvscsi_remove(struct vio_dev *vdev)
release_event_pool(&hostdata->pool, hostdata); release_event_pool(&hostdata->pool, hostdata);
ibmvscsi_release_crq_queue(&hostdata->queue, hostdata, ibmvscsi_release_crq_queue(&hostdata->queue, hostdata,
max_requests); max_requests);
srp_remove_host(hostdata->host);
scsi_remove_host(hostdata->host); scsi_remove_host(hostdata->host);
scsi_host_put(hostdata->host); scsi_host_put(hostdata->host);
...@@ -1660,14 +1676,28 @@ static struct vio_driver ibmvscsi_driver = { ...@@ -1660,14 +1676,28 @@ static struct vio_driver ibmvscsi_driver = {
} }
}; };
static struct srp_function_template ibmvscsi_transport_functions = {
};
int __init ibmvscsi_module_init(void) 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) void __exit ibmvscsi_module_exit(void)
{ {
vio_unregister_driver(&ibmvscsi_driver); vio_unregister_driver(&ibmvscsi_driver);
srp_release_transport(ibmvscsi_transport_template);
} }
module_init(ibmvscsi_module_init); module_init(ibmvscsi_module_init);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment