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