xref: /openbmc/linux/drivers/message/fusion/mptspi.c (revision f606f5718fa5a36e400000f91c44a5725b0f005d)
1 /*
2  *  linux/drivers/message/fusion/mptspi.c
3  *      For use with LSI Logic PCI chip/adapter(s)
4  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
5  *
6  *  Copyright (c) 1999-2007 LSI Logic Corporation
7  *  (mailto:DL-MPTFusionLinux@lsi.com)
8  *
9  */
10 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
11 /*
12     This program is free software; you can redistribute it and/or modify
13     it under the terms of the GNU General Public License as published by
14     the Free Software Foundation; version 2 of the License.
15 
16     This program is distributed in the hope that it will be useful,
17     but WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19     GNU General Public License for more details.
20 
21     NO WARRANTY
22     THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
23     CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
24     LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
25     MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
26     solely responsible for determining the appropriateness of using and
27     distributing the Program and assumes all risks associated with its
28     exercise of rights under this Agreement, including but not limited to
29     the risks and costs of program errors, damage to or loss of data,
30     programs or equipment, and unavailability or interruption of operations.
31 
32     DISCLAIMER OF LIABILITY
33     NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
34     DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35     DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
36     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
37     TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
38     USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
39     HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
40 
41     You should have received a copy of the GNU General Public License
42     along with this program; if not, write to the Free Software
43     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
44 */
45 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
46 
47 #include <linux/module.h>
48 #include <linux/kernel.h>
49 #include <linux/init.h>
50 #include <linux/errno.h>
51 #include <linux/kdev_t.h>
52 #include <linux/blkdev.h>
53 #include <linux/delay.h>	/* for mdelay */
54 #include <linux/interrupt.h>	/* needed for in_interrupt() proto */
55 #include <linux/reboot.h>	/* notifier code */
56 #include <linux/workqueue.h>
57 #include <linux/raid_class.h>
58 
59 #include <scsi/scsi.h>
60 #include <scsi/scsi_cmnd.h>
61 #include <scsi/scsi_device.h>
62 #include <scsi/scsi_host.h>
63 #include <scsi/scsi_tcq.h>
64 #include <scsi/scsi_transport.h>
65 #include <scsi/scsi_transport_spi.h>
66 #include <scsi/scsi_dbg.h>
67 
68 #include "mptbase.h"
69 #include "mptscsih.h"
70 
71 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
72 #define my_NAME		"Fusion MPT SPI Host driver"
73 #define my_VERSION	MPT_LINUX_VERSION_COMMON
74 #define MYNAM		"mptspi"
75 
76 MODULE_AUTHOR(MODULEAUTHOR);
77 MODULE_DESCRIPTION(my_NAME);
78 MODULE_LICENSE("GPL");
79 MODULE_VERSION(my_VERSION);
80 
81 /* Command line args */
82 static int mpt_saf_te = MPTSCSIH_SAF_TE;
83 module_param(mpt_saf_te, int, 0);
84 MODULE_PARM_DESC(mpt_saf_te, " Force enabling SEP Processor: enable=1  (default=MPTSCSIH_SAF_TE=0)");
85 
86 static void mptspi_write_offset(struct scsi_target *, int);
87 static void mptspi_write_width(struct scsi_target *, int);
88 static int mptspi_write_spi_device_pg1(struct scsi_target *,
89 				       struct _CONFIG_PAGE_SCSI_DEVICE_1 *);
90 
91 static struct scsi_transport_template *mptspi_transport_template = NULL;
92 
93 static u8	mptspiDoneCtx = MPT_MAX_PROTOCOL_DRIVERS;
94 static u8	mptspiTaskCtx = MPT_MAX_PROTOCOL_DRIVERS;
95 static u8	mptspiInternalCtx = MPT_MAX_PROTOCOL_DRIVERS; /* Used only for internal commands */
96 
97 /**
98  * 	mptspi_setTargetNegoParms  - Update the target negotiation parameters
99  *	@hd: Pointer to a SCSI Host Structure
100  *	@target: per target private data
101  *	@sdev: SCSI device
102  *
103  * 	Update the target negotiation parameters based on the the Inquiry
104  *	data, adapter capabilities, and NVRAM settings.
105  **/
106 static void
107 mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
108 			    struct scsi_device *sdev)
109 {
110 	SpiCfgData *pspi_data = &hd->ioc->spi_data;
111 	int  id = (int) target->id;
112 	int  nvram;
113 	u8 width = MPT_NARROW;
114 	u8 factor = MPT_ASYNC;
115 	u8 offset = 0;
116 	u8 nfactor;
117 	u8 noQas = 1;
118 
119 	target->negoFlags = pspi_data->noQas;
120 
121 	if (sdev->scsi_level < SCSI_2) {
122 		width = 0;
123 		factor = MPT_ULTRA2;
124 		offset = pspi_data->maxSyncOffset;
125 		target->tflags &= ~MPT_TARGET_FLAGS_Q_YES;
126 	} else {
127 		if (scsi_device_wide(sdev))
128 			width = 1;
129 
130 		if (scsi_device_sync(sdev)) {
131 			factor = pspi_data->minSyncFactor;
132 			if (!scsi_device_dt(sdev))
133 					factor = MPT_ULTRA2;
134 			else {
135 				if (!scsi_device_ius(sdev) &&
136 				    !scsi_device_qas(sdev))
137 					factor = MPT_ULTRA160;
138 				else {
139 					factor = MPT_ULTRA320;
140 					if (scsi_device_qas(sdev)) {
141 						ddvprintk(hd->ioc,
142 						printk(KERN_DEBUG "Enabling QAS due to "
143 						"byte56=%02x on id=%d!\n", scsi_device_qas(sdev), id));
144 						noQas = 0;
145 					}
146 					if (sdev->type == TYPE_TAPE &&
147 					    scsi_device_ius(sdev))
148 						target->negoFlags |= MPT_TAPE_NEGO_IDP;
149 				}
150 			}
151 			offset = pspi_data->maxSyncOffset;
152 
153 			/* If RAID, never disable QAS
154 			 * else if non RAID, do not disable
155 			 *   QAS if bit 1 is set
156 			 * bit 1 QAS support, non-raid only
157 			 * bit 0 IU support
158 			 */
159 			if (target->raidVolume == 1)
160 				noQas = 0;
161 		} else {
162 			factor = MPT_ASYNC;
163 			offset = 0;
164 		}
165 	}
166 
167 	if (!sdev->tagged_supported)
168 		target->tflags &= ~MPT_TARGET_FLAGS_Q_YES;
169 
170 	/* Update tflags based on NVRAM settings. (SCSI only)
171 	 */
172 	if (pspi_data->nvram && (pspi_data->nvram[id] != MPT_HOST_NVRAM_INVALID)) {
173 		nvram = pspi_data->nvram[id];
174 		nfactor = (nvram & MPT_NVRAM_SYNC_MASK) >> 8;
175 
176 		if (width)
177 			width = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1;
178 
179 		if (offset > 0) {
180 			/* Ensure factor is set to the
181 			 * maximum of: adapter, nvram, inquiry
182 			 */
183 			if (nfactor) {
184 				if (nfactor < pspi_data->minSyncFactor )
185 					nfactor = pspi_data->minSyncFactor;
186 
187 				factor = max(factor, nfactor);
188 				if (factor == MPT_ASYNC)
189 					offset = 0;
190 			} else {
191 				offset = 0;
192 				factor = MPT_ASYNC;
193 		}
194 		} else {
195 			factor = MPT_ASYNC;
196 		}
197 	}
198 
199 	/* Make sure data is consistent
200 	 */
201 	if ((!width) && (factor < MPT_ULTRA2))
202 		factor = MPT_ULTRA2;
203 
204 	/* Save the data to the target structure.
205 	 */
206 	target->minSyncFactor = factor;
207 	target->maxOffset = offset;
208 	target->maxWidth = width;
209 
210 	target->tflags |= MPT_TARGET_FLAGS_VALID_NEGO;
211 
212 	/* Disable unused features.
213 	 */
214 	if (!width)
215 		target->negoFlags |= MPT_TARGET_NO_NEGO_WIDE;
216 
217 	if (!offset)
218 		target->negoFlags |= MPT_TARGET_NO_NEGO_SYNC;
219 
220 	if ( factor > MPT_ULTRA320 )
221 		noQas = 0;
222 
223 	if (noQas && (pspi_data->noQas == 0)) {
224 		pspi_data->noQas |= MPT_TARGET_NO_NEGO_QAS;
225 		target->negoFlags |= MPT_TARGET_NO_NEGO_QAS;
226 
227 		/* Disable QAS in a mixed configuration case
228 		 */
229 
230 		ddvprintk(hd->ioc, printk(KERN_DEBUG
231 			"Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id));
232 	}
233 }
234 
235 /**
236  * 	mptspi_writeIOCPage4  - write IOC Page 4
237  *	@hd: Pointer to a SCSI Host Structure
238  *	@channel: channel number
239  *	@id: write IOC Page4 for this ID & Bus
240  *
241  *	Return: -EAGAIN if unable to obtain a Message Frame
242  *		or 0 if success.
243  *
244  *	Remark: We do not wait for a return, write pages sequentially.
245  **/
246 static int
247 mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, u8 channel , u8 id)
248 {
249 	MPT_ADAPTER		*ioc = hd->ioc;
250 	Config_t		*pReq;
251 	IOCPage4_t		*IOCPage4Ptr;
252 	MPT_FRAME_HDR		*mf;
253 	dma_addr_t		 dataDma;
254 	u16			 req_idx;
255 	u32			 frameOffset;
256 	u32			 flagsLength;
257 	int			 ii;
258 
259 	/* Get a MF for this command.
260 	 */
261 	if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) {
262 		dfailprintk(ioc, printk(MYIOC_s_WARN_FMT
263 				"writeIOCPage4 : no msg frames!\n",ioc->name));
264 		return -EAGAIN;
265 	}
266 
267 	/* Set the request and the data pointers.
268 	 * Place data at end of MF.
269 	 */
270 	pReq = (Config_t *)mf;
271 
272 	req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx);
273 	frameOffset = ioc->req_sz - sizeof(IOCPage4_t);
274 
275 	/* Complete the request frame (same for all requests).
276 	 */
277 	pReq->Action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
278 	pReq->Reserved = 0;
279 	pReq->ChainOffset = 0;
280 	pReq->Function = MPI_FUNCTION_CONFIG;
281 	pReq->ExtPageLength = 0;
282 	pReq->ExtPageType = 0;
283 	pReq->MsgFlags = 0;
284 	for (ii=0; ii < 8; ii++) {
285 		pReq->Reserved2[ii] = 0;
286 	}
287 
288 	IOCPage4Ptr = ioc->spi_data.pIocPg4;
289 	dataDma = ioc->spi_data.IocPg4_dma;
290 	ii = IOCPage4Ptr->ActiveSEP++;
291 	IOCPage4Ptr->SEP[ii].SEPTargetID = id;
292 	IOCPage4Ptr->SEP[ii].SEPBus = channel;
293 	pReq->Header = IOCPage4Ptr->Header;
294 	pReq->PageAddress = cpu_to_le32(id | (channel << 8 ));
295 
296 	/* Add a SGE to the config request.
297 	 */
298 	flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE |
299 		(IOCPage4Ptr->Header.PageLength + ii) * 4;
300 
301 	mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma);
302 
303 	ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
304 		"writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n",
305 			ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel));
306 
307 	mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);
308 
309 	return 0;
310 }
311 
312 /**
313  *	mptspi_initTarget - Target, LUN alloc/free functionality.
314  *	@hd: Pointer to MPT_SCSI_HOST structure
315  *	@vtarget: per target private data
316  *	@sdev: SCSI device
317  *
318  *	NOTE: It's only SAFE to call this routine if data points to
319  *	sane & valid STANDARD INQUIRY data!
320  *
321  *	Allocate and initialize memory for this target.
322  *	Save inquiry data.
323  *
324  **/
325 static void
326 mptspi_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget,
327 		    struct scsi_device *sdev)
328 {
329 
330 	/* Is LUN supported? If so, upper 2 bits will be 0
331 	* in first byte of inquiry data.
332 	*/
333 	if (sdev->inq_periph_qual != 0)
334 		return;
335 
336 	if (vtarget == NULL)
337 		return;
338 
339 	vtarget->type = sdev->type;
340 
341 	if ((sdev->type == TYPE_PROCESSOR) && (hd->ioc->spi_data.Saf_Te)) {
342 		/* Treat all Processors as SAF-TE if
343 		 * command line option is set */
344 		vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
345 		mptspi_writeIOCPage4(hd, vtarget->channel, vtarget->id);
346 	}else if ((sdev->type == TYPE_PROCESSOR) &&
347 		!(vtarget->tflags & MPT_TARGET_FLAGS_SAF_TE_ISSUED )) {
348 		if (sdev->inquiry_len > 49 ) {
349 			if (sdev->inquiry[44] == 'S' &&
350 			    sdev->inquiry[45] == 'A' &&
351 			    sdev->inquiry[46] == 'F' &&
352 			    sdev->inquiry[47] == '-' &&
353 			    sdev->inquiry[48] == 'T' &&
354 			    sdev->inquiry[49] == 'E' ) {
355 				vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
356 				mptspi_writeIOCPage4(hd, vtarget->channel, vtarget->id);
357 			}
358 		}
359 	}
360 	mptspi_setTargetNegoParms(hd, vtarget, sdev);
361 }
362 
363 /**
364  *	mptspi_is_raid - Determines whether target is belonging to volume
365  *	@hd: Pointer to a SCSI HOST structure
366  *	@id: target device id
367  *
368  *	Return:
369  *		non-zero = true
370  *		zero = false
371  *
372  */
373 static int
374 mptspi_is_raid(struct _MPT_SCSI_HOST *hd, u32 id)
375 {
376 	int i, rc = 0;
377 
378 	if (!hd->ioc->raid_data.pIocPg2)
379 		goto out;
380 
381 	if (!hd->ioc->raid_data.pIocPg2->NumActiveVolumes)
382 		goto out;
383 	for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
384 		if (hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == id) {
385 			rc = 1;
386 			goto out;
387 		}
388 	}
389 
390  out:
391 	return rc;
392 }
393 
394 static int mptspi_target_alloc(struct scsi_target *starget)
395 {
396 	struct Scsi_Host *shost = dev_to_shost(&starget->dev);
397 	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
398 	VirtTarget		*vtarget;
399 
400 	if (hd == NULL)
401 		return -ENODEV;
402 
403 	vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
404 	if (!vtarget)
405 		return -ENOMEM;
406 
407 	vtarget->ioc_id = hd->ioc->id;
408 	vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
409 	vtarget->id = (u8)starget->id;
410 	vtarget->channel = (u8)starget->channel;
411 	vtarget->starget = starget;
412 	starget->hostdata = vtarget;
413 
414 	if (starget->channel == 1) {
415 		if (mptscsih_is_phys_disk(hd->ioc, 0, starget->id) == 0)
416 			return 0;
417 		vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT;
418 		/* The real channel for this device is zero */
419 		vtarget->channel = 0;
420 		/* The actual physdisknum (for RAID passthrough) */
421 		vtarget->id = mptscsih_raid_id_to_num(hd->ioc, 0,
422 		    starget->id);
423 	}
424 
425 	if (starget->channel == 0 &&
426 	    mptspi_is_raid(hd, starget->id)) {
427 		vtarget->raidVolume = 1;
428 		ddvprintk(hd->ioc, printk(KERN_DEBUG
429 		    "RAID Volume @ channel=%d id=%d\n", starget->channel,
430 		    starget->id));
431 	}
432 
433 	if (hd->ioc->spi_data.nvram &&
434 	    hd->ioc->spi_data.nvram[starget->id] != MPT_HOST_NVRAM_INVALID) {
435 		u32 nvram = hd->ioc->spi_data.nvram[starget->id];
436 		spi_min_period(starget) = (nvram & MPT_NVRAM_SYNC_MASK) >> MPT_NVRAM_SYNC_SHIFT;
437 		spi_max_width(starget) = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1;
438 	} else {
439 		spi_min_period(starget) = hd->ioc->spi_data.minSyncFactor;
440 		spi_max_width(starget) = hd->ioc->spi_data.maxBusWidth;
441 	}
442 	spi_max_offset(starget) = hd->ioc->spi_data.maxSyncOffset;
443 
444 	spi_offset(starget) = 0;
445 	mptspi_write_width(starget, 0);
446 
447 	return 0;
448 }
449 
450 static void
451 mptspi_target_destroy(struct scsi_target *starget)
452 {
453 	if (starget->hostdata)
454 		kfree(starget->hostdata);
455 	starget->hostdata = NULL;
456 }
457 
458 /**
459  *	mptspi_print_write_nego - negotiation parameters debug info that is being sent
460  *	@hd: Pointer to a SCSI HOST structure
461  *	@starget: SCSI target
462  *	@ii: negotiation parameters
463  *
464  */
465 static void
466 mptspi_print_write_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
467 {
468 	ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d Requested = 0x%08x"
469 	    " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
470 	    hd->ioc->name, starget->id, ii,
471 	    ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
472 	    ((ii >> 8) & 0xFF), ((ii >> 16) & 0xFF),
473 	    ii & MPI_SCSIDEVPAGE0_NP_IU ? "IU ": "",
474 	    ii & MPI_SCSIDEVPAGE0_NP_DT ? "DT ": "",
475 	    ii & MPI_SCSIDEVPAGE0_NP_QAS ? "QAS ": "",
476 	    ii & MPI_SCSIDEVPAGE0_NP_HOLD_MCS ? "HOLDMCS ": "",
477 	    ii & MPI_SCSIDEVPAGE0_NP_WR_FLOW ? "WRFLOW ": "",
478 	    ii & MPI_SCSIDEVPAGE0_NP_RD_STRM ? "RDSTRM ": "",
479 	    ii & MPI_SCSIDEVPAGE0_NP_RTI ? "RTI ": "",
480 	    ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP ": ""));
481 }
482 
483 /**
484  *	mptspi_print_read_nego - negotiation parameters debug info that is being read
485  *	@hd: Pointer to a SCSI HOST structure
486  *	@starget: SCSI target
487  *	@ii: negotiation parameters
488  *
489  */
490 static void
491 mptspi_print_read_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
492 {
493 	ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d Read = 0x%08x"
494 	    " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
495 	    hd->ioc->name, starget->id, ii,
496 	    ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
497 	    ((ii >> 8) & 0xFF), ((ii >> 16) & 0xFF),
498 	    ii & MPI_SCSIDEVPAGE0_NP_IU ? "IU ": "",
499 	    ii & MPI_SCSIDEVPAGE0_NP_DT ? "DT ": "",
500 	    ii & MPI_SCSIDEVPAGE0_NP_QAS ? "QAS ": "",
501 	    ii & MPI_SCSIDEVPAGE0_NP_HOLD_MCS ? "HOLDMCS ": "",
502 	    ii & MPI_SCSIDEVPAGE0_NP_WR_FLOW ? "WRFLOW ": "",
503 	    ii & MPI_SCSIDEVPAGE0_NP_RD_STRM ? "RDSTRM ": "",
504 	    ii & MPI_SCSIDEVPAGE0_NP_RTI ? "RTI ": "",
505 	    ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP ": ""));
506 }
507 
508 static int mptspi_read_spi_device_pg0(struct scsi_target *starget,
509 			     struct _CONFIG_PAGE_SCSI_DEVICE_0 *pass_pg0)
510 {
511 	struct Scsi_Host *shost = dev_to_shost(&starget->dev);
512 	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
513 	struct _MPT_ADAPTER *ioc = hd->ioc;
514 	struct _CONFIG_PAGE_SCSI_DEVICE_0 *pg0;
515 	dma_addr_t pg0_dma;
516 	int size;
517 	struct _x_config_parms cfg;
518 	struct _CONFIG_PAGE_HEADER hdr;
519 	int err = -EBUSY;
520 
521 	/* No SPI parameters for RAID devices */
522 	if (starget->channel == 0 &&
523 	    mptspi_is_raid(hd, starget->id))
524 		return -1;
525 
526 	size = ioc->spi_data.sdp0length * 4;
527 	/*
528 	if (ioc->spi_data.sdp0length & 1)
529 		size += size + 4;
530 	size += 2048;
531 	*/
532 
533 	pg0 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg0_dma, GFP_KERNEL);
534 	if (pg0 == NULL) {
535 		starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n");
536 		return -EINVAL;
537 	}
538 
539 	memset(&hdr, 0, sizeof(hdr));
540 
541 	hdr.PageVersion = ioc->spi_data.sdp0version;
542 	hdr.PageLength = ioc->spi_data.sdp0length;
543 	hdr.PageNumber = 0;
544 	hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
545 
546 	memset(&cfg, 0, sizeof(cfg));
547 
548 	cfg.cfghdr.hdr = &hdr;
549 	cfg.physAddr = pg0_dma;
550 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
551 	cfg.dir = 0;
552 	cfg.pageAddr = starget->id;
553 
554 	if (mpt_config(ioc, &cfg)) {
555 		starget_printk(KERN_ERR, starget, "mpt_config failed\n");
556 		goto out_free;
557 	}
558 	err = 0;
559 	memcpy(pass_pg0, pg0, size);
560 
561 	mptspi_print_read_nego(hd, starget, le32_to_cpu(pg0->NegotiatedParameters));
562 
563  out_free:
564 	dma_free_coherent(&ioc->pcidev->dev, size, pg0, pg0_dma);
565 	return err;
566 }
567 
568 static u32 mptspi_getRP(struct scsi_target *starget)
569 {
570 	u32 nego = 0;
571 
572 	nego |= spi_iu(starget) ? MPI_SCSIDEVPAGE1_RP_IU : 0;
573 	nego |= spi_dt(starget) ? MPI_SCSIDEVPAGE1_RP_DT : 0;
574 	nego |= spi_qas(starget) ? MPI_SCSIDEVPAGE1_RP_QAS : 0;
575 	nego |= spi_hold_mcs(starget) ? MPI_SCSIDEVPAGE1_RP_HOLD_MCS : 0;
576 	nego |= spi_wr_flow(starget) ? MPI_SCSIDEVPAGE1_RP_WR_FLOW : 0;
577 	nego |= spi_rd_strm(starget) ? MPI_SCSIDEVPAGE1_RP_RD_STRM : 0;
578 	nego |= spi_rti(starget) ? MPI_SCSIDEVPAGE1_RP_RTI : 0;
579 	nego |= spi_pcomp_en(starget) ? MPI_SCSIDEVPAGE1_RP_PCOMP_EN : 0;
580 
581 	nego |= (spi_period(starget) <<  MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD) & MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK;
582 	nego |= (spi_offset(starget) << MPI_SCSIDEVPAGE1_RP_SHIFT_MAX_SYNC_OFFSET) & MPI_SCSIDEVPAGE1_RP_MAX_SYNC_OFFSET_MASK;
583 	nego |= spi_width(starget) ?  MPI_SCSIDEVPAGE1_RP_WIDE : 0;
584 
585 	return nego;
586 }
587 
588 static void mptspi_read_parameters(struct scsi_target *starget)
589 {
590 	int nego;
591 	struct _CONFIG_PAGE_SCSI_DEVICE_0 pg0;
592 
593 	mptspi_read_spi_device_pg0(starget, &pg0);
594 
595 	nego = le32_to_cpu(pg0.NegotiatedParameters);
596 
597 	spi_iu(starget) = (nego & MPI_SCSIDEVPAGE0_NP_IU) ? 1 : 0;
598 	spi_dt(starget) = (nego & MPI_SCSIDEVPAGE0_NP_DT) ? 1 : 0;
599 	spi_qas(starget) = (nego & MPI_SCSIDEVPAGE0_NP_QAS) ? 1 : 0;
600 	spi_wr_flow(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WR_FLOW) ? 1 : 0;
601 	spi_rd_strm(starget) = (nego & MPI_SCSIDEVPAGE0_NP_RD_STRM) ? 1 : 0;
602 	spi_rti(starget) = (nego & MPI_SCSIDEVPAGE0_NP_RTI) ? 1 : 0;
603 	spi_pcomp_en(starget) = (nego & MPI_SCSIDEVPAGE0_NP_PCOMP_EN) ? 1 : 0;
604 	spi_hold_mcs(starget) = (nego & MPI_SCSIDEVPAGE0_NP_HOLD_MCS) ? 1 : 0;
605 	spi_period(starget) = (nego & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK) >> MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_PERIOD;
606 	spi_offset(starget) = (nego & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK) >> MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_OFFSET;
607 	spi_width(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WIDE) ? 1 : 0;
608 }
609 
610 static int
611 mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
612 {
613 	MpiRaidActionRequest_t	*pReq;
614 	MPT_FRAME_HDR		*mf;
615 
616 	/* Get and Populate a free Frame
617 	 */
618 	if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) {
619 		ddvprintk(hd->ioc, printk(MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n",
620 					hd->ioc->name));
621 		return -EAGAIN;
622 	}
623 	pReq = (MpiRaidActionRequest_t *)mf;
624 	if (quiesce)
625 		pReq->Action = MPI_RAID_ACTION_QUIESCE_PHYS_IO;
626 	else
627 		pReq->Action = MPI_RAID_ACTION_ENABLE_PHYS_IO;
628 	pReq->Reserved1 = 0;
629 	pReq->ChainOffset = 0;
630 	pReq->Function = MPI_FUNCTION_RAID_ACTION;
631 	pReq->VolumeID = id;
632 	pReq->VolumeBus = channel;
633 	pReq->PhysDiskNum = 0;
634 	pReq->MsgFlags = 0;
635 	pReq->Reserved2 = 0;
636 	pReq->ActionDataWord = 0; /* Reserved for this action */
637 
638 	mpt_add_sge((char *)&pReq->ActionDataSGE,
639 		MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1);
640 
641 	ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "RAID Volume action=%x channel=%d id=%d\n",
642 			hd->ioc->name, pReq->Action, channel, id));
643 
644 	hd->pLocal = NULL;
645 	hd->timer.expires = jiffies + HZ*10; /* 10 second timeout */
646 	hd->scandv_wait_done = 0;
647 
648 	/* Save cmd pointer, for resource free if timeout or
649 	 * FW reload occurs
650 	 */
651 	hd->cmdPtr = mf;
652 
653 	add_timer(&hd->timer);
654 	mpt_put_msg_frame(hd->ioc->InternalCtx, hd->ioc, mf);
655 	wait_event(hd->scandv_waitq, hd->scandv_wait_done);
656 
657 	if ((hd->pLocal == NULL) || (hd->pLocal->completion != 0))
658 		return -1;
659 
660 	return 0;
661 }
662 
663 static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
664 			     struct scsi_device *sdev)
665 {
666 	VirtTarget *vtarget = scsi_target(sdev)->hostdata;
667 
668 	/* no DV on RAID devices */
669 	if (sdev->channel == 0 &&
670 	    mptspi_is_raid(hd, sdev->id))
671 		return;
672 
673 	/* If this is a piece of a RAID, then quiesce first */
674 	if (sdev->channel == 1 &&
675 	    mptscsih_quiesce_raid(hd, 1, vtarget->channel, vtarget->id) < 0) {
676 		starget_printk(KERN_ERR, scsi_target(sdev),
677 			       "Integrated RAID quiesce failed\n");
678 		return;
679 	}
680 
681 	hd->spi_pending |= (1 << sdev->id);
682 	spi_dv_device(sdev);
683 	hd->spi_pending &= ~(1 << sdev->id);
684 
685 	if (sdev->channel == 1 &&
686 	    mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0)
687 		starget_printk(KERN_ERR, scsi_target(sdev),
688 			       "Integrated RAID resume failed\n");
689 
690 	mptspi_read_parameters(sdev->sdev_target);
691 	spi_display_xfer_agreement(sdev->sdev_target);
692 	mptspi_read_parameters(sdev->sdev_target);
693 }
694 
695 static int mptspi_slave_alloc(struct scsi_device *sdev)
696 {
697 	MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)sdev->host->hostdata;
698 	VirtTarget		*vtarget;
699 	VirtDevice		*vdev;
700 	struct scsi_target 	*starget;
701 
702 	if (sdev->channel == 1 &&
703 		mptscsih_is_phys_disk(hd->ioc, 0, sdev->id) == 0)
704 			return -ENXIO;
705 
706 	vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
707 	if (!vdev) {
708 		printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
709 				hd->ioc->name, sizeof(VirtDevice));
710 		return -ENOMEM;
711 	}
712 
713 	vdev->lun = sdev->lun;
714 	sdev->hostdata = vdev;
715 
716 	starget = scsi_target(sdev);
717 	vtarget = starget->hostdata;
718 	vdev->vtarget = vtarget;
719 	vtarget->num_luns++;
720 
721 	if (sdev->channel == 1)
722 		sdev->no_uld_attach = 1;
723 
724 	return 0;
725 }
726 
727 static int mptspi_slave_configure(struct scsi_device *sdev)
728 {
729 	struct _MPT_SCSI_HOST *hd =
730 		(struct _MPT_SCSI_HOST *)sdev->host->hostdata;
731 	VirtTarget *vtarget = scsi_target(sdev)->hostdata;
732 	int ret;
733 
734 	mptspi_initTarget(hd, vtarget, sdev);
735 
736 	ret = mptscsih_slave_configure(sdev);
737 
738 	if (ret)
739 		return ret;
740 
741 	ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d min_period=0x%02x"
742 		" max_offset=0x%02x max_width=%d\n", hd->ioc->name,
743 		sdev->id, spi_min_period(scsi_target(sdev)),
744 		spi_max_offset(scsi_target(sdev)),
745 		spi_max_width(scsi_target(sdev))));
746 
747 	if ((sdev->channel == 1 ||
748 	     !(mptspi_is_raid(hd, sdev->id))) &&
749 	    !spi_initial_dv(sdev->sdev_target))
750 		mptspi_dv_device(hd, sdev);
751 
752 	return 0;
753 }
754 
755 static int
756 mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
757 {
758 	struct _MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata;
759 	VirtDevice	*vdev = SCpnt->device->hostdata;
760 
761 	if (!vdev || !vdev->vtarget) {
762 		SCpnt->result = DID_NO_CONNECT << 16;
763 		done(SCpnt);
764 		return 0;
765 	}
766 
767 	if (SCpnt->device->channel == 1 &&
768 		mptscsih_is_phys_disk(hd->ioc, 0, SCpnt->device->id) == 0) {
769 		SCpnt->result = DID_NO_CONNECT << 16;
770 		done(SCpnt);
771 		return 0;
772 	}
773 
774 	if (spi_dv_pending(scsi_target(SCpnt->device)))
775 		ddvprintk(hd->ioc, scsi_print_command(SCpnt));
776 
777 	return mptscsih_qcmd(SCpnt,done);
778 }
779 
780 static void mptspi_slave_destroy(struct scsi_device *sdev)
781 {
782 	struct scsi_target *starget = scsi_target(sdev);
783 	VirtTarget *vtarget = starget->hostdata;
784 	VirtDevice *vdevice = sdev->hostdata;
785 
786 	/* Will this be the last lun on a non-raid device? */
787 	if (vtarget->num_luns == 1 && vdevice->configured_lun) {
788 		struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
789 
790 		/* Async Narrow */
791 		pg1.RequestedParameters = 0;
792 		pg1.Reserved = 0;
793 		pg1.Configuration = 0;
794 
795 		mptspi_write_spi_device_pg1(starget, &pg1);
796 	}
797 
798 	mptscsih_slave_destroy(sdev);
799 }
800 
801 static struct scsi_host_template mptspi_driver_template = {
802 	.module				= THIS_MODULE,
803 	.proc_name			= "mptspi",
804 	.proc_info			= mptscsih_proc_info,
805 	.name				= "MPT SPI Host",
806 	.info				= mptscsih_info,
807 	.queuecommand			= mptspi_qcmd,
808 	.target_alloc			= mptspi_target_alloc,
809 	.slave_alloc			= mptspi_slave_alloc,
810 	.slave_configure		= mptspi_slave_configure,
811 	.target_destroy			= mptspi_target_destroy,
812 	.slave_destroy			= mptspi_slave_destroy,
813 	.change_queue_depth 		= mptscsih_change_queue_depth,
814 	.eh_abort_handler		= mptscsih_abort,
815 	.eh_device_reset_handler	= mptscsih_dev_reset,
816 	.eh_bus_reset_handler		= mptscsih_bus_reset,
817 	.eh_host_reset_handler		= mptscsih_host_reset,
818 	.bios_param			= mptscsih_bios_param,
819 	.can_queue			= MPT_SCSI_CAN_QUEUE,
820 	.this_id			= -1,
821 	.sg_tablesize			= MPT_SCSI_SG_DEPTH,
822 	.max_sectors			= 8192,
823 	.cmd_per_lun			= 7,
824 	.use_clustering			= ENABLE_CLUSTERING,
825 	.shost_attrs			= mptscsih_host_attrs,
826 };
827 
828 static int mptspi_write_spi_device_pg1(struct scsi_target *starget,
829 			       struct _CONFIG_PAGE_SCSI_DEVICE_1 *pass_pg1)
830 {
831 	struct Scsi_Host *shost = dev_to_shost(&starget->dev);
832 	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
833 	struct _MPT_ADAPTER *ioc = hd->ioc;
834 	struct _CONFIG_PAGE_SCSI_DEVICE_1 *pg1;
835 	dma_addr_t pg1_dma;
836 	int size;
837 	struct _x_config_parms cfg;
838 	struct _CONFIG_PAGE_HEADER hdr;
839 	int err = -EBUSY;
840 
841 	/* don't allow updating nego parameters on RAID devices */
842 	if (starget->channel == 0 &&
843 	    mptspi_is_raid(hd, starget->id))
844 		return -1;
845 
846 	size = ioc->spi_data.sdp1length * 4;
847 
848 	pg1 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg1_dma, GFP_KERNEL);
849 	if (pg1 == NULL) {
850 		starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n");
851 		return -EINVAL;
852 	}
853 
854 	memset(&hdr, 0, sizeof(hdr));
855 
856 	hdr.PageVersion = ioc->spi_data.sdp1version;
857 	hdr.PageLength = ioc->spi_data.sdp1length;
858 	hdr.PageNumber = 1;
859 	hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
860 
861 	memset(&cfg, 0, sizeof(cfg));
862 
863 	cfg.cfghdr.hdr = &hdr;
864 	cfg.physAddr = pg1_dma;
865 	cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
866 	cfg.dir = 1;
867 	cfg.pageAddr = starget->id;
868 
869 	memcpy(pg1, pass_pg1, size);
870 
871 	pg1->Header.PageVersion = hdr.PageVersion;
872 	pg1->Header.PageLength = hdr.PageLength;
873 	pg1->Header.PageNumber = hdr.PageNumber;
874 	pg1->Header.PageType = hdr.PageType;
875 
876 	mptspi_print_write_nego(hd, starget, le32_to_cpu(pg1->RequestedParameters));
877 
878 	if (mpt_config(ioc, &cfg)) {
879 		starget_printk(KERN_ERR, starget, "mpt_config failed\n");
880 		goto out_free;
881 	}
882 	err = 0;
883 
884  out_free:
885 	dma_free_coherent(&ioc->pcidev->dev, size, pg1, pg1_dma);
886 	return err;
887 }
888 
889 static void mptspi_write_offset(struct scsi_target *starget, int offset)
890 {
891 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
892 	u32 nego;
893 
894 	if (offset < 0)
895 		offset = 0;
896 
897 	if (offset > 255)
898 		offset = 255;
899 
900 	if (spi_offset(starget) == -1)
901 		mptspi_read_parameters(starget);
902 
903 	spi_offset(starget) = offset;
904 
905 	nego = mptspi_getRP(starget);
906 
907 	pg1.RequestedParameters = cpu_to_le32(nego);
908 	pg1.Reserved = 0;
909 	pg1.Configuration = 0;
910 
911 	mptspi_write_spi_device_pg1(starget, &pg1);
912 }
913 
914 static void mptspi_write_period(struct scsi_target *starget, int period)
915 {
916 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
917 	u32 nego;
918 
919 	if (period < 8)
920 		period = 8;
921 
922 	if (period > 255)
923 		period = 255;
924 
925 	if (spi_period(starget) == -1)
926 		mptspi_read_parameters(starget);
927 
928 	if (period == 8) {
929 		spi_iu(starget) = 1;
930 		spi_dt(starget) = 1;
931 	} else if (period == 9) {
932 		spi_dt(starget) = 1;
933 	}
934 
935 	spi_period(starget) = period;
936 
937 	nego = mptspi_getRP(starget);
938 
939 	pg1.RequestedParameters = cpu_to_le32(nego);
940 	pg1.Reserved = 0;
941 	pg1.Configuration = 0;
942 
943 	mptspi_write_spi_device_pg1(starget, &pg1);
944 }
945 
946 static void mptspi_write_dt(struct scsi_target *starget, int dt)
947 {
948 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
949 	u32 nego;
950 
951 	if (spi_period(starget) == -1)
952 		mptspi_read_parameters(starget);
953 
954 	if (!dt && spi_period(starget) < 10)
955 		spi_period(starget) = 10;
956 
957 	spi_dt(starget) = dt;
958 
959 	nego = mptspi_getRP(starget);
960 
961 
962 	pg1.RequestedParameters = cpu_to_le32(nego);
963 	pg1.Reserved = 0;
964 	pg1.Configuration = 0;
965 
966 	mptspi_write_spi_device_pg1(starget, &pg1);
967 }
968 
969 static void mptspi_write_iu(struct scsi_target *starget, int iu)
970 {
971 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
972 	u32 nego;
973 
974 	if (spi_period(starget) == -1)
975 		mptspi_read_parameters(starget);
976 
977 	if (!iu && spi_period(starget) < 9)
978 		spi_period(starget) = 9;
979 
980 	spi_iu(starget) = iu;
981 
982 	nego = mptspi_getRP(starget);
983 
984 	pg1.RequestedParameters = cpu_to_le32(nego);
985 	pg1.Reserved = 0;
986 	pg1.Configuration = 0;
987 
988 	mptspi_write_spi_device_pg1(starget, &pg1);
989 }
990 
991 #define MPTSPI_SIMPLE_TRANSPORT_PARM(parm) 				\
992 static void mptspi_write_##parm(struct scsi_target *starget, int parm)\
993 {									\
994 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;				\
995 	u32 nego;							\
996 									\
997 	spi_##parm(starget) = parm;					\
998 									\
999 	nego = mptspi_getRP(starget);					\
1000 									\
1001 	pg1.RequestedParameters = cpu_to_le32(nego);			\
1002 	pg1.Reserved = 0;						\
1003 	pg1.Configuration = 0;						\
1004 									\
1005 	mptspi_write_spi_device_pg1(starget, &pg1);				\
1006 }
1007 
1008 MPTSPI_SIMPLE_TRANSPORT_PARM(rd_strm)
1009 MPTSPI_SIMPLE_TRANSPORT_PARM(wr_flow)
1010 MPTSPI_SIMPLE_TRANSPORT_PARM(rti)
1011 MPTSPI_SIMPLE_TRANSPORT_PARM(hold_mcs)
1012 MPTSPI_SIMPLE_TRANSPORT_PARM(pcomp_en)
1013 
1014 static void mptspi_write_qas(struct scsi_target *starget, int qas)
1015 {
1016 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
1017 	struct Scsi_Host *shost = dev_to_shost(&starget->dev);
1018 	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
1019 	VirtTarget *vtarget = starget->hostdata;
1020 	u32 nego;
1021 
1022 	if ((vtarget->negoFlags & MPT_TARGET_NO_NEGO_QAS) ||
1023 	    hd->ioc->spi_data.noQas)
1024 		spi_qas(starget) = 0;
1025 	else
1026 		spi_qas(starget) = qas;
1027 
1028 	nego = mptspi_getRP(starget);
1029 
1030 	pg1.RequestedParameters = cpu_to_le32(nego);
1031 	pg1.Reserved = 0;
1032 	pg1.Configuration = 0;
1033 
1034 	mptspi_write_spi_device_pg1(starget, &pg1);
1035 }
1036 
1037 static void mptspi_write_width(struct scsi_target *starget, int width)
1038 {
1039 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
1040 	u32 nego;
1041 
1042 	if (!width) {
1043 		spi_dt(starget) = 0;
1044 		if (spi_period(starget) < 10)
1045 			spi_period(starget) = 10;
1046 	}
1047 
1048 	spi_width(starget) = width;
1049 
1050 	nego = mptspi_getRP(starget);
1051 
1052 	pg1.RequestedParameters = cpu_to_le32(nego);
1053 	pg1.Reserved = 0;
1054 	pg1.Configuration = 0;
1055 
1056 	mptspi_write_spi_device_pg1(starget, &pg1);
1057 }
1058 
1059 struct work_queue_wrapper {
1060 	struct work_struct	work;
1061 	struct _MPT_SCSI_HOST	*hd;
1062 	int			disk;
1063 };
1064 
1065 static void mpt_work_wrapper(struct work_struct *work)
1066 {
1067 	struct work_queue_wrapper *wqw =
1068 		container_of(work, struct work_queue_wrapper, work);
1069 	struct _MPT_SCSI_HOST *hd = wqw->hd;
1070 	struct Scsi_Host *shost = hd->ioc->sh;
1071 	struct scsi_device *sdev;
1072 	int disk = wqw->disk;
1073 	struct _CONFIG_PAGE_IOC_3 *pg3;
1074 
1075 	kfree(wqw);
1076 
1077 	mpt_findImVolumes(hd->ioc);
1078 	pg3 = hd->ioc->raid_data.pIocPg3;
1079 	if (!pg3)
1080 		return;
1081 
1082 	shost_for_each_device(sdev,shost) {
1083 		struct scsi_target *starget = scsi_target(sdev);
1084 		VirtTarget *vtarget = starget->hostdata;
1085 
1086 		/* only want to search RAID components */
1087 		if (sdev->channel != 1)
1088 			continue;
1089 
1090 		/* The id is the raid PhysDiskNum, even if
1091 		 * starget->id is the actual target address */
1092 		if(vtarget->id != disk)
1093 			continue;
1094 
1095 		starget_printk(KERN_INFO, vtarget->starget,
1096 			       "Integrated RAID requests DV of new device\n");
1097 		mptspi_dv_device(hd, sdev);
1098 	}
1099 	shost_printk(KERN_INFO, shost,
1100 		     "Integrated RAID detects new device %d\n", disk);
1101 	scsi_scan_target(&hd->ioc->sh->shost_gendev, 1, disk, 0, 1);
1102 }
1103 
1104 
1105 static void mpt_dv_raid(struct _MPT_SCSI_HOST *hd, int disk)
1106 {
1107 	struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC);
1108 
1109 	if (!wqw) {
1110 		shost_printk(KERN_ERR, hd->ioc->sh,
1111 			     "Failed to act on RAID event for physical disk %d\n",
1112 			   disk);
1113 		return;
1114 	}
1115 	INIT_WORK(&wqw->work, mpt_work_wrapper);
1116 	wqw->hd = hd;
1117 	wqw->disk = disk;
1118 
1119 	schedule_work(&wqw->work);
1120 }
1121 
1122 static int
1123 mptspi_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
1124 {
1125 	u8 event = le32_to_cpu(pEvReply->Event) & 0xFF;
1126 	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
1127 
1128 	if (hd && event ==  MPI_EVENT_INTEGRATED_RAID) {
1129 		int reason
1130 			= (le32_to_cpu(pEvReply->Data[0]) & 0x00FF0000) >> 16;
1131 
1132 		if (reason == MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED) {
1133 			int disk = (le32_to_cpu(pEvReply->Data[0]) & 0xFF000000) >> 24;
1134 			mpt_dv_raid(hd, disk);
1135 		}
1136 	}
1137 	return mptscsih_event_process(ioc, pEvReply);
1138 }
1139 
1140 static int
1141 mptspi_deny_binding(struct scsi_target *starget)
1142 {
1143 	struct _MPT_SCSI_HOST *hd =
1144 		(struct _MPT_SCSI_HOST *)dev_to_shost(starget->dev.parent)->hostdata;
1145 	return ((mptspi_is_raid(hd, starget->id)) &&
1146 		starget->channel == 0) ? 1 : 0;
1147 }
1148 
1149 static struct spi_function_template mptspi_transport_functions = {
1150 	.get_offset	= mptspi_read_parameters,
1151 	.set_offset	= mptspi_write_offset,
1152 	.show_offset	= 1,
1153 	.get_period	= mptspi_read_parameters,
1154 	.set_period	= mptspi_write_period,
1155 	.show_period	= 1,
1156 	.get_width	= mptspi_read_parameters,
1157 	.set_width	= mptspi_write_width,
1158 	.show_width	= 1,
1159 	.get_iu		= mptspi_read_parameters,
1160 	.set_iu		= mptspi_write_iu,
1161 	.show_iu	= 1,
1162 	.get_dt		= mptspi_read_parameters,
1163 	.set_dt		= mptspi_write_dt,
1164 	.show_dt	= 1,
1165 	.get_qas	= mptspi_read_parameters,
1166 	.set_qas	= mptspi_write_qas,
1167 	.show_qas	= 1,
1168 	.get_wr_flow	= mptspi_read_parameters,
1169 	.set_wr_flow	= mptspi_write_wr_flow,
1170 	.show_wr_flow	= 1,
1171 	.get_rd_strm	= mptspi_read_parameters,
1172 	.set_rd_strm	= mptspi_write_rd_strm,
1173 	.show_rd_strm	= 1,
1174 	.get_rti	= mptspi_read_parameters,
1175 	.set_rti	= mptspi_write_rti,
1176 	.show_rti	= 1,
1177 	.get_pcomp_en	= mptspi_read_parameters,
1178 	.set_pcomp_en	= mptspi_write_pcomp_en,
1179 	.show_pcomp_en	= 1,
1180 	.get_hold_mcs	= mptspi_read_parameters,
1181 	.set_hold_mcs	= mptspi_write_hold_mcs,
1182 	.show_hold_mcs	= 1,
1183 	.deny_binding	= mptspi_deny_binding,
1184 };
1185 
1186 /****************************************************************************
1187  * Supported hardware
1188  */
1189 
1190 static struct pci_device_id mptspi_pci_table[] = {
1191 	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1030,
1192 		PCI_ANY_ID, PCI_ANY_ID },
1193 	{ PCI_VENDOR_ID_ATTO, MPI_MANUFACTPAGE_DEVID_53C1030,
1194 		PCI_ANY_ID, PCI_ANY_ID },
1195 	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1035,
1196 		PCI_ANY_ID, PCI_ANY_ID },
1197 	{0}	/* Terminating entry */
1198 };
1199 MODULE_DEVICE_TABLE(pci, mptspi_pci_table);
1200 
1201 
1202 /*
1203  * renegotiate for a given target
1204  */
1205 static void
1206 mptspi_dv_renegotiate_work(struct work_struct *work)
1207 {
1208 	struct work_queue_wrapper *wqw =
1209 		container_of(work, struct work_queue_wrapper, work);
1210 	struct _MPT_SCSI_HOST *hd = wqw->hd;
1211 	struct scsi_device *sdev;
1212 	struct scsi_target *starget;
1213 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
1214 	u32 nego;
1215 
1216 	kfree(wqw);
1217 
1218 	if (hd->spi_pending) {
1219 		shost_for_each_device(sdev, hd->ioc->sh) {
1220 			if  (hd->spi_pending & (1 << sdev->id))
1221 				continue;
1222 			starget = scsi_target(sdev);
1223 			nego = mptspi_getRP(starget);
1224 			pg1.RequestedParameters = cpu_to_le32(nego);
1225 			pg1.Reserved = 0;
1226 			pg1.Configuration = 0;
1227 			mptspi_write_spi_device_pg1(starget, &pg1);
1228 		}
1229 	} else {
1230 		shost_for_each_device(sdev, hd->ioc->sh)
1231 			mptspi_dv_device(hd, sdev);
1232 	}
1233 }
1234 
1235 static void
1236 mptspi_dv_renegotiate(struct _MPT_SCSI_HOST *hd)
1237 {
1238 	struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC);
1239 
1240 	if (!wqw)
1241 		return;
1242 
1243 	INIT_WORK(&wqw->work, mptspi_dv_renegotiate_work);
1244 	wqw->hd = hd;
1245 
1246 	schedule_work(&wqw->work);
1247 }
1248 
1249 /*
1250  * spi module reset handler
1251  */
1252 static int
1253 mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
1254 {
1255 	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
1256 	int rc;
1257 
1258 	rc = mptscsih_ioc_reset(ioc, reset_phase);
1259 
1260 	if (reset_phase == MPT_IOC_POST_RESET)
1261 		mptspi_dv_renegotiate(hd);
1262 
1263 	return rc;
1264 }
1265 
1266 #ifdef CONFIG_PM
1267 /*
1268  * spi module resume handler
1269  */
1270 static int
1271 mptspi_resume(struct pci_dev *pdev)
1272 {
1273 	MPT_ADAPTER 	*ioc = pci_get_drvdata(pdev);
1274 	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
1275 	int rc;
1276 
1277 	rc = mptscsih_resume(pdev);
1278 	mptspi_dv_renegotiate(hd);
1279 
1280 	return rc;
1281 }
1282 #endif
1283 
1284 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1285 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1286 /*
1287  *	mptspi_probe - Installs scsi devices per bus.
1288  *	@pdev: Pointer to pci_dev structure
1289  *
1290  *	Returns 0 for success, non-zero for failure.
1291  *
1292  */
1293 static int
1294 mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1295 {
1296 	struct Scsi_Host	*sh;
1297 	MPT_SCSI_HOST		*hd;
1298 	MPT_ADAPTER 		*ioc;
1299 	unsigned long		 flags;
1300 	int			 ii;
1301 	int			 numSGE = 0;
1302 	int			 scale;
1303 	int			 ioc_cap;
1304 	int			error=0;
1305 	int			r;
1306 
1307 	if ((r = mpt_attach(pdev,id)) != 0)
1308 		return r;
1309 
1310 	ioc = pci_get_drvdata(pdev);
1311 	ioc->DoneCtx = mptspiDoneCtx;
1312 	ioc->TaskCtx = mptspiTaskCtx;
1313 	ioc->InternalCtx = mptspiInternalCtx;
1314 
1315 	/*  Added sanity check on readiness of the MPT adapter.
1316 	 */
1317 	if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
1318 		printk(MYIOC_s_WARN_FMT
1319 		  "Skipping because it's not operational!\n",
1320 		  ioc->name);
1321 		error = -ENODEV;
1322 		goto out_mptspi_probe;
1323 	}
1324 
1325 	if (!ioc->active) {
1326 		printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
1327 		  ioc->name);
1328 		error = -ENODEV;
1329 		goto out_mptspi_probe;
1330 	}
1331 
1332 	/*  Sanity check - ensure at least 1 port is INITIATOR capable
1333 	 */
1334 	ioc_cap = 0;
1335 	for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
1336 		if (ioc->pfacts[ii].ProtocolFlags &
1337 		    MPI_PORTFACTS_PROTOCOL_INITIATOR)
1338 			ioc_cap ++;
1339 	}
1340 
1341 	if (!ioc_cap) {
1342 		printk(MYIOC_s_WARN_FMT
1343 			"Skipping ioc=%p because SCSI Initiator mode is NOT enabled!\n",
1344 			ioc->name, ioc);
1345 		return 0;
1346 	}
1347 
1348 	sh = scsi_host_alloc(&mptspi_driver_template, sizeof(MPT_SCSI_HOST));
1349 
1350 	if (!sh) {
1351 		printk(MYIOC_s_WARN_FMT
1352 			"Unable to register controller with SCSI subsystem\n",
1353 			ioc->name);
1354 		error = -1;
1355 		goto out_mptspi_probe;
1356         }
1357 
1358 	spin_lock_irqsave(&ioc->FreeQlock, flags);
1359 
1360 	/* Attach the SCSI Host to the IOC structure
1361 	 */
1362 	ioc->sh = sh;
1363 
1364 	sh->io_port = 0;
1365 	sh->n_io_port = 0;
1366 	sh->irq = 0;
1367 
1368 	/* set 16 byte cdb's */
1369 	sh->max_cmd_len = 16;
1370 
1371 	/* Yikes!  This is important!
1372 	 * Otherwise, by default, linux
1373 	 * only scans target IDs 0-7!
1374 	 * pfactsN->MaxDevices unreliable
1375 	 * (not supported in early
1376 	 *	versions of the FW).
1377 	 * max_id = 1 + actual max id,
1378 	 * max_lun = 1 + actual last lun,
1379 	 *	see hosts.h :o(
1380 	 */
1381 	sh->max_id = ioc->devices_per_bus;
1382 
1383 	sh->max_lun = MPT_LAST_LUN + 1;
1384 	/*
1385 	 * If RAID Firmware Detected, setup virtual channel
1386 	 */
1387 	if (ioc->ir_firmware)
1388 		sh->max_channel = 1;
1389 	else
1390 		sh->max_channel = 0;
1391 	sh->this_id = ioc->pfacts[0].PortSCSIID;
1392 
1393 	/* Required entry.
1394 	 */
1395 	sh->unique_id = ioc->id;
1396 
1397 	/* Verify that we won't exceed the maximum
1398 	 * number of chain buffers
1399 	 * We can optimize:  ZZ = req_sz/sizeof(SGE)
1400 	 * For 32bit SGE's:
1401 	 *  numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
1402 	 *               + (req_sz - 64)/sizeof(SGE)
1403 	 * A slightly different algorithm is required for
1404 	 * 64bit SGEs.
1405 	 */
1406 	scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
1407 	if (sizeof(dma_addr_t) == sizeof(u64)) {
1408 		numSGE = (scale - 1) *
1409 		  (ioc->facts.MaxChainDepth-1) + scale +
1410 		  (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
1411 		  sizeof(u32));
1412 	} else {
1413 		numSGE = 1 + (scale - 1) *
1414 		  (ioc->facts.MaxChainDepth-1) + scale +
1415 		  (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
1416 		  sizeof(u32));
1417 	}
1418 
1419 	if (numSGE < sh->sg_tablesize) {
1420 		/* Reset this value */
1421 		dprintk(ioc, printk(MYIOC_s_INFO_FMT
1422 		  "Resetting sg_tablesize to %d from %d\n",
1423 		  ioc->name, numSGE, sh->sg_tablesize));
1424 		sh->sg_tablesize = numSGE;
1425 	}
1426 
1427 	spin_unlock_irqrestore(&ioc->FreeQlock, flags);
1428 
1429 	hd = (MPT_SCSI_HOST *) sh->hostdata;
1430 	hd->ioc = ioc;
1431 
1432 	/* SCSI needs scsi_cmnd lookup table!
1433 	 * (with size equal to req_depth*PtrSz!)
1434 	 */
1435 	hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
1436 	if (!hd->ScsiLookup) {
1437 		error = -ENOMEM;
1438 		goto out_mptspi_probe;
1439 	}
1440 
1441 	dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
1442 		 ioc->name, hd->ScsiLookup));
1443 
1444 	/* Clear the TM flags
1445 	 */
1446 	hd->tmPending = 0;
1447 	hd->tmState = TM_STATE_NONE;
1448 	hd->resetPending = 0;
1449 	hd->abortSCpnt = NULL;
1450 
1451 	/* Clear the pointer used to store
1452 	 * single-threaded commands, i.e., those
1453 	 * issued during a bus scan, dv and
1454 	 * configuration pages.
1455 	 */
1456 	hd->cmdPtr = NULL;
1457 
1458 	/* Initialize this SCSI Hosts' timers
1459 	 * To use, set the timer expires field
1460 	 * and add_timer
1461 	 */
1462 	init_timer(&hd->timer);
1463 	hd->timer.data = (unsigned long) hd;
1464 	hd->timer.function = mptscsih_timer_expired;
1465 
1466 	ioc->spi_data.Saf_Te = mpt_saf_te;
1467 
1468 	hd->negoNvram = MPT_SCSICFG_USE_NVRAM;
1469 	ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1470 		"saf_te %x\n",
1471 		ioc->name,
1472 		mpt_saf_te));
1473 	ioc->spi_data.noQas = 0;
1474 
1475 	init_waitqueue_head(&hd->scandv_waitq);
1476 	hd->scandv_wait_done = 0;
1477 	hd->last_queue_full = 0;
1478 	hd->spi_pending = 0;
1479 
1480 	/* Some versions of the firmware don't support page 0; without
1481 	 * that we can't get the parameters */
1482 	if (hd->ioc->spi_data.sdp0length != 0)
1483 		sh->transportt = mptspi_transport_template;
1484 
1485 	error = scsi_add_host (sh, &ioc->pcidev->dev);
1486 	if(error) {
1487 		dprintk(ioc, printk(KERN_ERR MYNAM
1488 		  "scsi_add_host failed\n"));
1489 		goto out_mptspi_probe;
1490 	}
1491 
1492 	/*
1493 	 * issue internal bus reset
1494 	 */
1495 	if (ioc->spi_data.bus_reset)
1496 		mptscsih_TMHandler(hd,
1497 		    MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
1498 		    0, 0, 0, 0, 5);
1499 
1500 	scsi_scan_host(sh);
1501 	return 0;
1502 
1503 out_mptspi_probe:
1504 
1505 	mptscsih_remove(pdev);
1506 	return error;
1507 }
1508 
1509 static struct pci_driver mptspi_driver = {
1510 	.name		= "mptspi",
1511 	.id_table	= mptspi_pci_table,
1512 	.probe		= mptspi_probe,
1513 	.remove		= __devexit_p(mptscsih_remove),
1514 	.shutdown	= mptscsih_shutdown,
1515 #ifdef CONFIG_PM
1516 	.suspend	= mptscsih_suspend,
1517 	.resume		= mptspi_resume,
1518 #endif
1519 };
1520 
1521 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1522 /**
1523  *	mptspi_init - Register MPT adapter(s) as SCSI host(s) with SCSI mid-layer.
1524  *
1525  *	Returns 0 for success, non-zero for failure.
1526  */
1527 static int __init
1528 mptspi_init(void)
1529 {
1530 	int error;
1531 
1532 	show_mptmod_ver(my_NAME, my_VERSION);
1533 
1534 	mptspi_transport_template = spi_attach_transport(&mptspi_transport_functions);
1535 	if (!mptspi_transport_template)
1536 		return -ENODEV;
1537 
1538 	mptspiDoneCtx = mpt_register(mptscsih_io_done, MPTSPI_DRIVER);
1539 	mptspiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSPI_DRIVER);
1540 	mptspiInternalCtx = mpt_register(mptscsih_scandv_complete, MPTSPI_DRIVER);
1541 
1542 	mpt_event_register(mptspiDoneCtx, mptspi_event_process);
1543 	mpt_reset_register(mptspiDoneCtx, mptspi_ioc_reset);
1544 
1545 	error = pci_register_driver(&mptspi_driver);
1546 	if (error)
1547 		spi_release_transport(mptspi_transport_template);
1548 
1549 	return error;
1550 }
1551 
1552 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1553 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1554 /**
1555  *	mptspi_exit - Unregisters MPT adapter(s)
1556  */
1557 static void __exit
1558 mptspi_exit(void)
1559 {
1560 	pci_unregister_driver(&mptspi_driver);
1561 
1562 	mpt_reset_deregister(mptspiDoneCtx);
1563 	mpt_event_deregister(mptspiDoneCtx);
1564 
1565 	mpt_deregister(mptspiInternalCtx);
1566 	mpt_deregister(mptspiTaskCtx);
1567 	mpt_deregister(mptspiDoneCtx);
1568 	spi_release_transport(mptspi_transport_template);
1569 }
1570 
1571 module_init(mptspi_init);
1572 module_exit(mptspi_exit);
1573