aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/ibmvscsi/iseries_vscsi.c
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2007-09-21 18:29:36 -0400
committerJames Bottomley <jejb@mulgrave.localdomain>2007-10-12 14:49:26 -0400
commitd3849d512fb0ca1e369e3efcaec910a949f55f62 (patch)
tree52b79dd6cd4fe8835ad46b35083edf803c5180b5 /drivers/scsi/ibmvscsi/iseries_vscsi.c
parent5307b1e8b050f309901acc9c6121061206a70ba5 (diff)
[SCSI] Fix ibmvscsi client for multiplatform iSeries+pSeries kernel
If you build a multiplatform kernel for iSeries and pSeries, with ibmvscsic support, the resulting client doesn't work on iSeries. This fixes that, using the appropriate low-level operations for the machine detected at runtime. [jejb: fixed up rejections around the srp transport patch] Signed-off-by: David Woodhouse <dwmw2@infradead.org> Acked by: Brian King <brking@linux.vnet.ibm.com> Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/ibmvscsi/iseries_vscsi.c')
-rw-r--r--drivers/scsi/ibmvscsi/iseries_vscsi.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/drivers/scsi/ibmvscsi/iseries_vscsi.c b/drivers/scsi/ibmvscsi/iseries_vscsi.c
index 6aeb5f003c3c..0775fdee5fa8 100644
--- a/drivers/scsi/ibmvscsi/iseries_vscsi.c
+++ b/drivers/scsi/ibmvscsi/iseries_vscsi.c
@@ -53,7 +53,7 @@ struct srp_lp_event {
53/** 53/**
54 * standard interface for handling logical partition events. 54 * standard interface for handling logical partition events.
55 */ 55 */
56static void ibmvscsi_handle_event(struct HvLpEvent *lpevt) 56static void iseriesvscsi_handle_event(struct HvLpEvent *lpevt)
57{ 57{
58 struct srp_lp_event *evt = (struct srp_lp_event *)lpevt; 58 struct srp_lp_event *evt = (struct srp_lp_event *)lpevt;
59 59
@@ -74,9 +74,9 @@ static void ibmvscsi_handle_event(struct HvLpEvent *lpevt)
74/* ------------------------------------------------------------ 74/* ------------------------------------------------------------
75 * Routines for driver initialization 75 * Routines for driver initialization
76 */ 76 */
77int ibmvscsi_init_crq_queue(struct crq_queue *queue, 77static int iseriesvscsi_init_crq_queue(struct crq_queue *queue,
78 struct ibmvscsi_host_data *hostdata, 78 struct ibmvscsi_host_data *hostdata,
79 int max_requests) 79 int max_requests)
80{ 80{
81 int rc; 81 int rc;
82 82
@@ -88,7 +88,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
88 goto viopath_open_failed; 88 goto viopath_open_failed;
89 } 89 }
90 90
91 rc = vio_setHandler(viomajorsubtype_scsi, ibmvscsi_handle_event); 91 rc = vio_setHandler(viomajorsubtype_scsi, iseriesvscsi_handle_event);
92 if (rc < 0) { 92 if (rc < 0) {
93 printk("vio_setHandler failed with rc %d in open_event_path\n", 93 printk("vio_setHandler failed with rc %d in open_event_path\n",
94 rc); 94 rc);
@@ -102,9 +102,9 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
102 return -1; 102 return -1;
103} 103}
104 104
105void ibmvscsi_release_crq_queue(struct crq_queue *queue, 105static void iseriesvscsi_release_crq_queue(struct crq_queue *queue,
106 struct ibmvscsi_host_data *hostdata, 106 struct ibmvscsi_host_data *hostdata,
107 int max_requests) 107 int max_requests)
108{ 108{
109 vio_clearHandler(viomajorsubtype_scsi); 109 vio_clearHandler(viomajorsubtype_scsi);
110 viopath_close(viopath_hostLp, viomajorsubtype_scsi, max_requests); 110 viopath_close(viopath_hostLp, viomajorsubtype_scsi, max_requests);
@@ -117,8 +117,8 @@ void ibmvscsi_release_crq_queue(struct crq_queue *queue,
117 * 117 *
118 * no-op for iSeries 118 * no-op for iSeries
119 */ 119 */
120int ibmvscsi_reset_crq_queue(struct crq_queue *queue, 120static int iseriesvscsi_reset_crq_queue(struct crq_queue *queue,
121 struct ibmvscsi_host_data *hostdata) 121 struct ibmvscsi_host_data *hostdata)
122{ 122{
123 return 0; 123 return 0;
124} 124}
@@ -130,19 +130,20 @@ int ibmvscsi_reset_crq_queue(struct crq_queue *queue,
130 * 130 *
131 * no-op for iSeries 131 * no-op for iSeries
132 */ 132 */
133int ibmvscsi_reenable_crq_queue(struct crq_queue *queue, 133static int iseriesvscsi_reenable_crq_queue(struct crq_queue *queue,
134 struct ibmvscsi_host_data *hostdata) 134 struct ibmvscsi_host_data *hostdata)
135{ 135{
136 return 0; 136 return 0;
137} 137}
138 138
139/** 139/**
140 * ibmvscsi_send_crq: - Send a CRQ 140 * iseriesvscsi_send_crq: - Send a CRQ
141 * @hostdata: the adapter 141 * @hostdata: the adapter
142 * @word1: the first 64 bits of the data 142 * @word1: the first 64 bits of the data
143 * @word2: the second 64 bits of the data 143 * @word2: the second 64 bits of the data
144 */ 144 */
145int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata, u64 word1, u64 word2) 145static int iseriesvscsi_send_crq(struct ibmvscsi_host_data *hostdata,
146 u64 word1, u64 word2)
146{ 147{
147 single_host_data = hostdata; 148 single_host_data = hostdata;
148 return HvCallEvent_signalLpEventFast(viopath_hostLp, 149 return HvCallEvent_signalLpEventFast(viopath_hostLp,
@@ -156,3 +157,11 @@ int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata, u64 word1, u64 word2)
156 VIOVERSION << 16, word1, word2, 0, 157 VIOVERSION << 16, word1, word2, 0,
157 0); 158 0);
158} 159}
160
161struct ibmvscsi_ops iseriesvscsi_ops = {
162 .init_crq_queue = iseriesvscsi_init_crq_queue,
163 .release_crq_queue = iseriesvscsi_release_crq_queue,
164 .reset_crq_queue = iseriesvscsi_reset_crq_queue,
165 .reenable_crq_queue = iseriesvscsi_reenable_crq_queue,
166 .send_crq = iseriesvscsi_send_crq,
167};