xref: /openbmc/linux/drivers/message/fusion/mptspi.c (revision 9ac8d3fb)
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-2008 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 	spi_period(starget) = 0xFF;
451 	mptspi_write_width(starget, 0);
452 
453 	return 0;
454 }
455 
456 static void
457 mptspi_target_destroy(struct scsi_target *starget)
458 {
459 	if (starget->hostdata)
460 		kfree(starget->hostdata);
461 	starget->hostdata = NULL;
462 }
463 
464 /**
465  *	mptspi_print_write_nego - negotiation parameters debug info that is being sent
466  *	@hd: Pointer to a SCSI HOST structure
467  *	@starget: SCSI target
468  *	@ii: negotiation parameters
469  *
470  */
471 static void
472 mptspi_print_write_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
473 {
474 	ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d Requested = 0x%08x"
475 	    " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
476 	    hd->ioc->name, starget->id, ii,
477 	    ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
478 	    ((ii >> 8) & 0xFF), ((ii >> 16) & 0xFF),
479 	    ii & MPI_SCSIDEVPAGE0_NP_IU ? "IU ": "",
480 	    ii & MPI_SCSIDEVPAGE0_NP_DT ? "DT ": "",
481 	    ii & MPI_SCSIDEVPAGE0_NP_QAS ? "QAS ": "",
482 	    ii & MPI_SCSIDEVPAGE0_NP_HOLD_MCS ? "HOLDMCS ": "",
483 	    ii & MPI_SCSIDEVPAGE0_NP_WR_FLOW ? "WRFLOW ": "",
484 	    ii & MPI_SCSIDEVPAGE0_NP_RD_STRM ? "RDSTRM ": "",
485 	    ii & MPI_SCSIDEVPAGE0_NP_RTI ? "RTI ": "",
486 	    ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP ": ""));
487 }
488 
489 /**
490  *	mptspi_print_read_nego - negotiation parameters debug info that is being read
491  *	@hd: Pointer to a SCSI HOST structure
492  *	@starget: SCSI target
493  *	@ii: negotiation parameters
494  *
495  */
496 static void
497 mptspi_print_read_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
498 {
499 	ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d Read = 0x%08x"
500 	    " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
501 	    hd->ioc->name, starget->id, ii,
502 	    ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
503 	    ((ii >> 8) & 0xFF), ((ii >> 16) & 0xFF),
504 	    ii & MPI_SCSIDEVPAGE0_NP_IU ? "IU ": "",
505 	    ii & MPI_SCSIDEVPAGE0_NP_DT ? "DT ": "",
506 	    ii & MPI_SCSIDEVPAGE0_NP_QAS ? "QAS ": "",
507 	    ii & MPI_SCSIDEVPAGE0_NP_HOLD_MCS ? "HOLDMCS ": "",
508 	    ii & MPI_SCSIDEVPAGE0_NP_WR_FLOW ? "WRFLOW ": "",
509 	    ii & MPI_SCSIDEVPAGE0_NP_RD_STRM ? "RDSTRM ": "",
510 	    ii & MPI_SCSIDEVPAGE0_NP_RTI ? "RTI ": "",
511 	    ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP ": ""));
512 }
513 
514 static int mptspi_read_spi_device_pg0(struct scsi_target *starget,
515 			     struct _CONFIG_PAGE_SCSI_DEVICE_0 *pass_pg0)
516 {
517 	struct Scsi_Host *shost = dev_to_shost(&starget->dev);
518 	struct _MPT_SCSI_HOST *hd = shost_priv(shost);
519 	struct _MPT_ADAPTER *ioc = hd->ioc;
520 	struct _CONFIG_PAGE_SCSI_DEVICE_0 *spi_dev_pg0;
521 	dma_addr_t spi_dev_pg0_dma;
522 	int size;
523 	struct _x_config_parms cfg;
524 	struct _CONFIG_PAGE_HEADER hdr;
525 	int err = -EBUSY;
526 
527 	/* No SPI parameters for RAID devices */
528 	if (starget->channel == 0 &&
529 	    mptspi_is_raid(hd, starget->id))
530 		return -1;
531 
532 	size = ioc->spi_data.sdp0length * 4;
533 	/*
534 	if (ioc->spi_data.sdp0length & 1)
535 		size += size + 4;
536 	size += 2048;
537 	*/
538 
539 	spi_dev_pg0 = dma_alloc_coherent(&ioc->pcidev->dev, size, &spi_dev_pg0_dma, GFP_KERNEL);
540 	if (spi_dev_pg0 == NULL) {
541 		starget_printk(KERN_ERR, starget, MYIOC_s_FMT
542 		    "dma_alloc_coherent for parameters failed\n", ioc->name);
543 		return -EINVAL;
544 	}
545 
546 	memset(&hdr, 0, sizeof(hdr));
547 
548 	hdr.PageVersion = ioc->spi_data.sdp0version;
549 	hdr.PageLength = ioc->spi_data.sdp0length;
550 	hdr.PageNumber = 0;
551 	hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
552 
553 	memset(&cfg, 0, sizeof(cfg));
554 
555 	cfg.cfghdr.hdr = &hdr;
556 	cfg.physAddr = spi_dev_pg0_dma;
557 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
558 	cfg.dir = 0;
559 	cfg.pageAddr = starget->id;
560 
561 	if (mpt_config(ioc, &cfg)) {
562 		starget_printk(KERN_ERR, starget, MYIOC_s_FMT "mpt_config failed\n", ioc->name);
563 		goto out_free;
564 	}
565 	err = 0;
566 	memcpy(pass_pg0, spi_dev_pg0, size);
567 
568 	mptspi_print_read_nego(hd, starget, le32_to_cpu(spi_dev_pg0->NegotiatedParameters));
569 
570  out_free:
571 	dma_free_coherent(&ioc->pcidev->dev, size, spi_dev_pg0, spi_dev_pg0_dma);
572 	return err;
573 }
574 
575 static u32 mptspi_getRP(struct scsi_target *starget)
576 {
577 	u32 nego = 0;
578 
579 	nego |= spi_iu(starget) ? MPI_SCSIDEVPAGE1_RP_IU : 0;
580 	nego |= spi_dt(starget) ? MPI_SCSIDEVPAGE1_RP_DT : 0;
581 	nego |= spi_qas(starget) ? MPI_SCSIDEVPAGE1_RP_QAS : 0;
582 	nego |= spi_hold_mcs(starget) ? MPI_SCSIDEVPAGE1_RP_HOLD_MCS : 0;
583 	nego |= spi_wr_flow(starget) ? MPI_SCSIDEVPAGE1_RP_WR_FLOW : 0;
584 	nego |= spi_rd_strm(starget) ? MPI_SCSIDEVPAGE1_RP_RD_STRM : 0;
585 	nego |= spi_rti(starget) ? MPI_SCSIDEVPAGE1_RP_RTI : 0;
586 	nego |= spi_pcomp_en(starget) ? MPI_SCSIDEVPAGE1_RP_PCOMP_EN : 0;
587 
588 	nego |= (spi_period(starget) <<  MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD) & MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK;
589 	nego |= (spi_offset(starget) << MPI_SCSIDEVPAGE1_RP_SHIFT_MAX_SYNC_OFFSET) & MPI_SCSIDEVPAGE1_RP_MAX_SYNC_OFFSET_MASK;
590 	nego |= spi_width(starget) ?  MPI_SCSIDEVPAGE1_RP_WIDE : 0;
591 
592 	return nego;
593 }
594 
595 static void mptspi_read_parameters(struct scsi_target *starget)
596 {
597 	int nego;
598 	struct _CONFIG_PAGE_SCSI_DEVICE_0 spi_dev_pg0;
599 
600 	mptspi_read_spi_device_pg0(starget, &spi_dev_pg0);
601 
602 	nego = le32_to_cpu(spi_dev_pg0.NegotiatedParameters);
603 
604 	spi_iu(starget) = (nego & MPI_SCSIDEVPAGE0_NP_IU) ? 1 : 0;
605 	spi_dt(starget) = (nego & MPI_SCSIDEVPAGE0_NP_DT) ? 1 : 0;
606 	spi_qas(starget) = (nego & MPI_SCSIDEVPAGE0_NP_QAS) ? 1 : 0;
607 	spi_wr_flow(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WR_FLOW) ? 1 : 0;
608 	spi_rd_strm(starget) = (nego & MPI_SCSIDEVPAGE0_NP_RD_STRM) ? 1 : 0;
609 	spi_rti(starget) = (nego & MPI_SCSIDEVPAGE0_NP_RTI) ? 1 : 0;
610 	spi_pcomp_en(starget) = (nego & MPI_SCSIDEVPAGE0_NP_PCOMP_EN) ? 1 : 0;
611 	spi_hold_mcs(starget) = (nego & MPI_SCSIDEVPAGE0_NP_HOLD_MCS) ? 1 : 0;
612 	spi_period(starget) = (nego & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK) >> MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_PERIOD;
613 	spi_offset(starget) = (nego & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK) >> MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_OFFSET;
614 	spi_width(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WIDE) ? 1 : 0;
615 }
616 
617 static int
618 mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
619 {
620 	MpiRaidActionRequest_t	*pReq;
621 	MPT_FRAME_HDR		*mf;
622 	MPT_ADAPTER *ioc = hd->ioc;
623 
624 	/* Get and Populate a free Frame
625 	 */
626 	if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) {
627 		ddvprintk(ioc, printk(MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n",
628 					ioc->name));
629 		return -EAGAIN;
630 	}
631 	pReq = (MpiRaidActionRequest_t *)mf;
632 	if (quiesce)
633 		pReq->Action = MPI_RAID_ACTION_QUIESCE_PHYS_IO;
634 	else
635 		pReq->Action = MPI_RAID_ACTION_ENABLE_PHYS_IO;
636 	pReq->Reserved1 = 0;
637 	pReq->ChainOffset = 0;
638 	pReq->Function = MPI_FUNCTION_RAID_ACTION;
639 	pReq->VolumeID = id;
640 	pReq->VolumeBus = channel;
641 	pReq->PhysDiskNum = 0;
642 	pReq->MsgFlags = 0;
643 	pReq->Reserved2 = 0;
644 	pReq->ActionDataWord = 0; /* Reserved for this action */
645 
646 	mpt_add_sge((char *)&pReq->ActionDataSGE,
647 		MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1);
648 
649 	ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RAID Volume action=%x channel=%d id=%d\n",
650 			ioc->name, pReq->Action, channel, id));
651 
652 	hd->pLocal = NULL;
653 	hd->timer.expires = jiffies + HZ*10; /* 10 second timeout */
654 	hd->scandv_wait_done = 0;
655 
656 	/* Save cmd pointer, for resource free if timeout or
657 	 * FW reload occurs
658 	 */
659 	hd->cmdPtr = mf;
660 
661 	add_timer(&hd->timer);
662 	mpt_put_msg_frame(ioc->InternalCtx, ioc, mf);
663 	wait_event(hd->scandv_waitq, hd->scandv_wait_done);
664 
665 	if ((hd->pLocal == NULL) || (hd->pLocal->completion != 0))
666 		return -1;
667 
668 	return 0;
669 }
670 
671 static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
672 			     struct scsi_device *sdev)
673 {
674 	VirtTarget *vtarget = scsi_target(sdev)->hostdata;
675 	MPT_ADAPTER *ioc = hd->ioc;
676 
677 	/* no DV on RAID devices */
678 	if (sdev->channel == 0 &&
679 	    mptspi_is_raid(hd, sdev->id))
680 		return;
681 
682 	/* If this is a piece of a RAID, then quiesce first */
683 	if (sdev->channel == 1 &&
684 	    mptscsih_quiesce_raid(hd, 1, vtarget->channel, vtarget->id) < 0) {
685 		starget_printk(KERN_ERR, scsi_target(sdev), MYIOC_s_FMT
686 		    "Integrated RAID quiesce failed\n", ioc->name);
687 		return;
688 	}
689 
690 	hd->spi_pending |= (1 << sdev->id);
691 	spi_dv_device(sdev);
692 	hd->spi_pending &= ~(1 << sdev->id);
693 
694 	if (sdev->channel == 1 &&
695 	    mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0)
696 		starget_printk(KERN_ERR, scsi_target(sdev), MYIOC_s_FMT
697 		    "Integrated RAID resume failed\n", ioc->name);
698 
699 	mptspi_read_parameters(sdev->sdev_target);
700 	spi_display_xfer_agreement(sdev->sdev_target);
701 	mptspi_read_parameters(sdev->sdev_target);
702 }
703 
704 static int mptspi_slave_alloc(struct scsi_device *sdev)
705 {
706 	MPT_SCSI_HOST *hd = shost_priv(sdev->host);
707 	VirtTarget		*vtarget;
708 	VirtDevice		*vdevice;
709 	struct scsi_target 	*starget;
710 	MPT_ADAPTER *ioc = hd->ioc;
711 
712 	if (sdev->channel == 1 &&
713 		mptscsih_is_phys_disk(ioc, 0, sdev->id) == 0)
714 			return -ENXIO;
715 
716 	vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
717 	if (!vdevice) {
718 		printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
719 				ioc->name, sizeof(VirtDevice));
720 		return -ENOMEM;
721 	}
722 
723 	vdevice->lun = sdev->lun;
724 	sdev->hostdata = vdevice;
725 
726 	starget = scsi_target(sdev);
727 	vtarget = starget->hostdata;
728 	vdevice->vtarget = vtarget;
729 	vtarget->num_luns++;
730 
731 	if (sdev->channel == 1)
732 		sdev->no_uld_attach = 1;
733 
734 	return 0;
735 }
736 
737 static int mptspi_slave_configure(struct scsi_device *sdev)
738 {
739 	struct _MPT_SCSI_HOST *hd = shost_priv(sdev->host);
740 	VirtTarget *vtarget = scsi_target(sdev)->hostdata;
741 	int ret;
742 
743 	mptspi_initTarget(hd, vtarget, sdev);
744 
745 	ret = mptscsih_slave_configure(sdev);
746 
747 	if (ret)
748 		return ret;
749 
750 	ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d min_period=0x%02x"
751 		" max_offset=0x%02x max_width=%d\n", hd->ioc->name,
752 		sdev->id, spi_min_period(scsi_target(sdev)),
753 		spi_max_offset(scsi_target(sdev)),
754 		spi_max_width(scsi_target(sdev))));
755 
756 	if ((sdev->channel == 1 ||
757 	     !(mptspi_is_raid(hd, sdev->id))) &&
758 	    !spi_initial_dv(sdev->sdev_target))
759 		mptspi_dv_device(hd, sdev);
760 
761 	return 0;
762 }
763 
764 static int
765 mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
766 {
767 	struct _MPT_SCSI_HOST *hd = shost_priv(SCpnt->device->host);
768 	VirtDevice	*vdevice = SCpnt->device->hostdata;
769 	MPT_ADAPTER *ioc = hd->ioc;
770 
771 	if (!vdevice || !vdevice->vtarget) {
772 		SCpnt->result = DID_NO_CONNECT << 16;
773 		done(SCpnt);
774 		return 0;
775 	}
776 
777 	if (SCpnt->device->channel == 1 &&
778 		mptscsih_is_phys_disk(ioc, 0, SCpnt->device->id) == 0) {
779 		SCpnt->result = DID_NO_CONNECT << 16;
780 		done(SCpnt);
781 		return 0;
782 	}
783 
784 	if (spi_dv_pending(scsi_target(SCpnt->device)))
785 		ddvprintk(ioc, scsi_print_command(SCpnt));
786 
787 	return mptscsih_qcmd(SCpnt,done);
788 }
789 
790 static void mptspi_slave_destroy(struct scsi_device *sdev)
791 {
792 	struct scsi_target *starget = scsi_target(sdev);
793 	VirtTarget *vtarget = starget->hostdata;
794 	VirtDevice *vdevice = sdev->hostdata;
795 
796 	/* Will this be the last lun on a non-raid device? */
797 	if (vtarget->num_luns == 1 && vdevice->configured_lun) {
798 		struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
799 
800 		/* Async Narrow */
801 		pg1.RequestedParameters = 0;
802 		pg1.Reserved = 0;
803 		pg1.Configuration = 0;
804 
805 		mptspi_write_spi_device_pg1(starget, &pg1);
806 	}
807 
808 	mptscsih_slave_destroy(sdev);
809 }
810 
811 static struct scsi_host_template mptspi_driver_template = {
812 	.module				= THIS_MODULE,
813 	.proc_name			= "mptspi",
814 	.proc_info			= mptscsih_proc_info,
815 	.name				= "MPT SPI Host",
816 	.info				= mptscsih_info,
817 	.queuecommand			= mptspi_qcmd,
818 	.target_alloc			= mptspi_target_alloc,
819 	.slave_alloc			= mptspi_slave_alloc,
820 	.slave_configure		= mptspi_slave_configure,
821 	.target_destroy			= mptspi_target_destroy,
822 	.slave_destroy			= mptspi_slave_destroy,
823 	.change_queue_depth 		= mptscsih_change_queue_depth,
824 	.eh_abort_handler		= mptscsih_abort,
825 	.eh_device_reset_handler	= mptscsih_dev_reset,
826 	.eh_bus_reset_handler		= mptscsih_bus_reset,
827 	.eh_host_reset_handler		= mptscsih_host_reset,
828 	.bios_param			= mptscsih_bios_param,
829 	.can_queue			= MPT_SCSI_CAN_QUEUE,
830 	.this_id			= -1,
831 	.sg_tablesize			= MPT_SCSI_SG_DEPTH,
832 	.max_sectors			= 8192,
833 	.cmd_per_lun			= 7,
834 	.use_clustering			= ENABLE_CLUSTERING,
835 	.shost_attrs			= mptscsih_host_attrs,
836 };
837 
838 static int mptspi_write_spi_device_pg1(struct scsi_target *starget,
839 			       struct _CONFIG_PAGE_SCSI_DEVICE_1 *pass_pg1)
840 {
841 	struct Scsi_Host *shost = dev_to_shost(&starget->dev);
842 	struct _MPT_SCSI_HOST *hd = shost_priv(shost);
843 	struct _MPT_ADAPTER *ioc = hd->ioc;
844 	struct _CONFIG_PAGE_SCSI_DEVICE_1 *pg1;
845 	dma_addr_t pg1_dma;
846 	int size;
847 	struct _x_config_parms cfg;
848 	struct _CONFIG_PAGE_HEADER hdr;
849 	int err = -EBUSY;
850 
851 	/* don't allow updating nego parameters on RAID devices */
852 	if (starget->channel == 0 &&
853 	    mptspi_is_raid(hd, starget->id))
854 		return -1;
855 
856 	size = ioc->spi_data.sdp1length * 4;
857 
858 	pg1 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg1_dma, GFP_KERNEL);
859 	if (pg1 == NULL) {
860 		starget_printk(KERN_ERR, starget, MYIOC_s_FMT
861 		    "dma_alloc_coherent for parameters failed\n", ioc->name);
862 		return -EINVAL;
863 	}
864 
865 	memset(&hdr, 0, sizeof(hdr));
866 
867 	hdr.PageVersion = ioc->spi_data.sdp1version;
868 	hdr.PageLength = ioc->spi_data.sdp1length;
869 	hdr.PageNumber = 1;
870 	hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
871 
872 	memset(&cfg, 0, sizeof(cfg));
873 
874 	cfg.cfghdr.hdr = &hdr;
875 	cfg.physAddr = pg1_dma;
876 	cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
877 	cfg.dir = 1;
878 	cfg.pageAddr = starget->id;
879 
880 	memcpy(pg1, pass_pg1, size);
881 
882 	pg1->Header.PageVersion = hdr.PageVersion;
883 	pg1->Header.PageLength = hdr.PageLength;
884 	pg1->Header.PageNumber = hdr.PageNumber;
885 	pg1->Header.PageType = hdr.PageType;
886 
887 	mptspi_print_write_nego(hd, starget, le32_to_cpu(pg1->RequestedParameters));
888 
889 	if (mpt_config(ioc, &cfg)) {
890 		starget_printk(KERN_ERR, starget, MYIOC_s_FMT
891 		    "mpt_config failed\n", ioc->name);
892 		goto out_free;
893 	}
894 	err = 0;
895 
896  out_free:
897 	dma_free_coherent(&ioc->pcidev->dev, size, pg1, pg1_dma);
898 	return err;
899 }
900 
901 static void mptspi_write_offset(struct scsi_target *starget, int offset)
902 {
903 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
904 	u32 nego;
905 
906 	if (offset < 0)
907 		offset = 0;
908 
909 	if (offset > 255)
910 		offset = 255;
911 
912 	if (spi_offset(starget) == -1)
913 		mptspi_read_parameters(starget);
914 
915 	spi_offset(starget) = offset;
916 
917 	nego = mptspi_getRP(starget);
918 
919 	pg1.RequestedParameters = cpu_to_le32(nego);
920 	pg1.Reserved = 0;
921 	pg1.Configuration = 0;
922 
923 	mptspi_write_spi_device_pg1(starget, &pg1);
924 }
925 
926 static void mptspi_write_period(struct scsi_target *starget, int period)
927 {
928 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
929 	u32 nego;
930 
931 	if (period < 8)
932 		period = 8;
933 
934 	if (period > 255)
935 		period = 255;
936 
937 	if (spi_period(starget) == -1)
938 		mptspi_read_parameters(starget);
939 
940 	if (period == 8) {
941 		spi_iu(starget) = 1;
942 		spi_dt(starget) = 1;
943 	} else if (period == 9) {
944 		spi_dt(starget) = 1;
945 	}
946 
947 	spi_period(starget) = period;
948 
949 	nego = mptspi_getRP(starget);
950 
951 	pg1.RequestedParameters = cpu_to_le32(nego);
952 	pg1.Reserved = 0;
953 	pg1.Configuration = 0;
954 
955 	mptspi_write_spi_device_pg1(starget, &pg1);
956 }
957 
958 static void mptspi_write_dt(struct scsi_target *starget, int dt)
959 {
960 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
961 	u32 nego;
962 
963 	if (spi_period(starget) == -1)
964 		mptspi_read_parameters(starget);
965 
966 	if (!dt && spi_period(starget) < 10)
967 		spi_period(starget) = 10;
968 
969 	spi_dt(starget) = dt;
970 
971 	nego = mptspi_getRP(starget);
972 
973 
974 	pg1.RequestedParameters = cpu_to_le32(nego);
975 	pg1.Reserved = 0;
976 	pg1.Configuration = 0;
977 
978 	mptspi_write_spi_device_pg1(starget, &pg1);
979 }
980 
981 static void mptspi_write_iu(struct scsi_target *starget, int iu)
982 {
983 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
984 	u32 nego;
985 
986 	if (spi_period(starget) == -1)
987 		mptspi_read_parameters(starget);
988 
989 	if (!iu && spi_period(starget) < 9)
990 		spi_period(starget) = 9;
991 
992 	spi_iu(starget) = iu;
993 
994 	nego = mptspi_getRP(starget);
995 
996 	pg1.RequestedParameters = cpu_to_le32(nego);
997 	pg1.Reserved = 0;
998 	pg1.Configuration = 0;
999 
1000 	mptspi_write_spi_device_pg1(starget, &pg1);
1001 }
1002 
1003 #define MPTSPI_SIMPLE_TRANSPORT_PARM(parm) 				\
1004 static void mptspi_write_##parm(struct scsi_target *starget, int parm)\
1005 {									\
1006 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;				\
1007 	u32 nego;							\
1008 									\
1009 	spi_##parm(starget) = parm;					\
1010 									\
1011 	nego = mptspi_getRP(starget);					\
1012 									\
1013 	pg1.RequestedParameters = cpu_to_le32(nego);			\
1014 	pg1.Reserved = 0;						\
1015 	pg1.Configuration = 0;						\
1016 									\
1017 	mptspi_write_spi_device_pg1(starget, &pg1);				\
1018 }
1019 
1020 MPTSPI_SIMPLE_TRANSPORT_PARM(rd_strm)
1021 MPTSPI_SIMPLE_TRANSPORT_PARM(wr_flow)
1022 MPTSPI_SIMPLE_TRANSPORT_PARM(rti)
1023 MPTSPI_SIMPLE_TRANSPORT_PARM(hold_mcs)
1024 MPTSPI_SIMPLE_TRANSPORT_PARM(pcomp_en)
1025 
1026 static void mptspi_write_qas(struct scsi_target *starget, int qas)
1027 {
1028 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
1029 	struct Scsi_Host *shost = dev_to_shost(&starget->dev);
1030 	struct _MPT_SCSI_HOST *hd = shost_priv(shost);
1031 	VirtTarget *vtarget = starget->hostdata;
1032 	u32 nego;
1033 
1034 	if ((vtarget->negoFlags & MPT_TARGET_NO_NEGO_QAS) ||
1035 	    hd->ioc->spi_data.noQas)
1036 		spi_qas(starget) = 0;
1037 	else
1038 		spi_qas(starget) = qas;
1039 
1040 	nego = mptspi_getRP(starget);
1041 
1042 	pg1.RequestedParameters = cpu_to_le32(nego);
1043 	pg1.Reserved = 0;
1044 	pg1.Configuration = 0;
1045 
1046 	mptspi_write_spi_device_pg1(starget, &pg1);
1047 }
1048 
1049 static void mptspi_write_width(struct scsi_target *starget, int width)
1050 {
1051 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
1052 	u32 nego;
1053 
1054 	if (!width) {
1055 		spi_dt(starget) = 0;
1056 		if (spi_period(starget) < 10)
1057 			spi_period(starget) = 10;
1058 	}
1059 
1060 	spi_width(starget) = width;
1061 
1062 	nego = mptspi_getRP(starget);
1063 
1064 	pg1.RequestedParameters = cpu_to_le32(nego);
1065 	pg1.Reserved = 0;
1066 	pg1.Configuration = 0;
1067 
1068 	mptspi_write_spi_device_pg1(starget, &pg1);
1069 }
1070 
1071 struct work_queue_wrapper {
1072 	struct work_struct	work;
1073 	struct _MPT_SCSI_HOST	*hd;
1074 	int			disk;
1075 };
1076 
1077 static void mpt_work_wrapper(struct work_struct *work)
1078 {
1079 	struct work_queue_wrapper *wqw =
1080 		container_of(work, struct work_queue_wrapper, work);
1081 	struct _MPT_SCSI_HOST *hd = wqw->hd;
1082 	MPT_ADAPTER *ioc = hd->ioc;
1083 	struct Scsi_Host *shost = ioc->sh;
1084 	struct scsi_device *sdev;
1085 	int disk = wqw->disk;
1086 	struct _CONFIG_PAGE_IOC_3 *pg3;
1087 
1088 	kfree(wqw);
1089 
1090 	mpt_findImVolumes(ioc);
1091 	pg3 = ioc->raid_data.pIocPg3;
1092 	if (!pg3)
1093 		return;
1094 
1095 	shost_for_each_device(sdev,shost) {
1096 		struct scsi_target *starget = scsi_target(sdev);
1097 		VirtTarget *vtarget = starget->hostdata;
1098 
1099 		/* only want to search RAID components */
1100 		if (sdev->channel != 1)
1101 			continue;
1102 
1103 		/* The id is the raid PhysDiskNum, even if
1104 		 * starget->id is the actual target address */
1105 		if(vtarget->id != disk)
1106 			continue;
1107 
1108 		starget_printk(KERN_INFO, vtarget->starget, MYIOC_s_FMT
1109 		    "Integrated RAID requests DV of new device\n", ioc->name);
1110 		mptspi_dv_device(hd, sdev);
1111 	}
1112 	shost_printk(KERN_INFO, shost, MYIOC_s_FMT
1113 	    "Integrated RAID detects new device %d\n", ioc->name, disk);
1114 	scsi_scan_target(&ioc->sh->shost_gendev, 1, disk, 0, 1);
1115 }
1116 
1117 
1118 static void mpt_dv_raid(struct _MPT_SCSI_HOST *hd, int disk)
1119 {
1120 	struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC);
1121 	MPT_ADAPTER *ioc = hd->ioc;
1122 
1123 	if (!wqw) {
1124 		shost_printk(KERN_ERR, ioc->sh, MYIOC_s_FMT
1125 		    "Failed to act on RAID event for physical disk %d\n",
1126 		    ioc->name, disk);
1127 		return;
1128 	}
1129 	INIT_WORK(&wqw->work, mpt_work_wrapper);
1130 	wqw->hd = hd;
1131 	wqw->disk = disk;
1132 
1133 	schedule_work(&wqw->work);
1134 }
1135 
1136 static int
1137 mptspi_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
1138 {
1139 	u8 event = le32_to_cpu(pEvReply->Event) & 0xFF;
1140 	struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
1141 
1142 	if (hd && event ==  MPI_EVENT_INTEGRATED_RAID) {
1143 		int reason
1144 			= (le32_to_cpu(pEvReply->Data[0]) & 0x00FF0000) >> 16;
1145 
1146 		if (reason == MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED) {
1147 			int disk = (le32_to_cpu(pEvReply->Data[0]) & 0xFF000000) >> 24;
1148 			mpt_dv_raid(hd, disk);
1149 		}
1150 	}
1151 	return mptscsih_event_process(ioc, pEvReply);
1152 }
1153 
1154 static int
1155 mptspi_deny_binding(struct scsi_target *starget)
1156 {
1157 	struct _MPT_SCSI_HOST *hd =
1158 		(struct _MPT_SCSI_HOST *)dev_to_shost(starget->dev.parent)->hostdata;
1159 	return ((mptspi_is_raid(hd, starget->id)) &&
1160 		starget->channel == 0) ? 1 : 0;
1161 }
1162 
1163 static struct spi_function_template mptspi_transport_functions = {
1164 	.get_offset	= mptspi_read_parameters,
1165 	.set_offset	= mptspi_write_offset,
1166 	.show_offset	= 1,
1167 	.get_period	= mptspi_read_parameters,
1168 	.set_period	= mptspi_write_period,
1169 	.show_period	= 1,
1170 	.get_width	= mptspi_read_parameters,
1171 	.set_width	= mptspi_write_width,
1172 	.show_width	= 1,
1173 	.get_iu		= mptspi_read_parameters,
1174 	.set_iu		= mptspi_write_iu,
1175 	.show_iu	= 1,
1176 	.get_dt		= mptspi_read_parameters,
1177 	.set_dt		= mptspi_write_dt,
1178 	.show_dt	= 1,
1179 	.get_qas	= mptspi_read_parameters,
1180 	.set_qas	= mptspi_write_qas,
1181 	.show_qas	= 1,
1182 	.get_wr_flow	= mptspi_read_parameters,
1183 	.set_wr_flow	= mptspi_write_wr_flow,
1184 	.show_wr_flow	= 1,
1185 	.get_rd_strm	= mptspi_read_parameters,
1186 	.set_rd_strm	= mptspi_write_rd_strm,
1187 	.show_rd_strm	= 1,
1188 	.get_rti	= mptspi_read_parameters,
1189 	.set_rti	= mptspi_write_rti,
1190 	.show_rti	= 1,
1191 	.get_pcomp_en	= mptspi_read_parameters,
1192 	.set_pcomp_en	= mptspi_write_pcomp_en,
1193 	.show_pcomp_en	= 1,
1194 	.get_hold_mcs	= mptspi_read_parameters,
1195 	.set_hold_mcs	= mptspi_write_hold_mcs,
1196 	.show_hold_mcs	= 1,
1197 	.deny_binding	= mptspi_deny_binding,
1198 };
1199 
1200 /****************************************************************************
1201  * Supported hardware
1202  */
1203 
1204 static struct pci_device_id mptspi_pci_table[] = {
1205 	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1030,
1206 		PCI_ANY_ID, PCI_ANY_ID },
1207 	{ PCI_VENDOR_ID_ATTO, MPI_MANUFACTPAGE_DEVID_53C1030,
1208 		PCI_ANY_ID, PCI_ANY_ID },
1209 	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1035,
1210 		PCI_ANY_ID, PCI_ANY_ID },
1211 	{0}	/* Terminating entry */
1212 };
1213 MODULE_DEVICE_TABLE(pci, mptspi_pci_table);
1214 
1215 
1216 /*
1217  * renegotiate for a given target
1218  */
1219 static void
1220 mptspi_dv_renegotiate_work(struct work_struct *work)
1221 {
1222 	struct work_queue_wrapper *wqw =
1223 		container_of(work, struct work_queue_wrapper, work);
1224 	struct _MPT_SCSI_HOST *hd = wqw->hd;
1225 	struct scsi_device *sdev;
1226 	struct scsi_target *starget;
1227 	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
1228 	u32 nego;
1229 	MPT_ADAPTER *ioc = hd->ioc;
1230 
1231 	kfree(wqw);
1232 
1233 	if (hd->spi_pending) {
1234 		shost_for_each_device(sdev, ioc->sh) {
1235 			if  (hd->spi_pending & (1 << sdev->id))
1236 				continue;
1237 			starget = scsi_target(sdev);
1238 			nego = mptspi_getRP(starget);
1239 			pg1.RequestedParameters = cpu_to_le32(nego);
1240 			pg1.Reserved = 0;
1241 			pg1.Configuration = 0;
1242 			mptspi_write_spi_device_pg1(starget, &pg1);
1243 		}
1244 	} else {
1245 		shost_for_each_device(sdev, ioc->sh)
1246 			mptspi_dv_device(hd, sdev);
1247 	}
1248 }
1249 
1250 static void
1251 mptspi_dv_renegotiate(struct _MPT_SCSI_HOST *hd)
1252 {
1253 	struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC);
1254 
1255 	if (!wqw)
1256 		return;
1257 
1258 	INIT_WORK(&wqw->work, mptspi_dv_renegotiate_work);
1259 	wqw->hd = hd;
1260 
1261 	schedule_work(&wqw->work);
1262 }
1263 
1264 /*
1265  * spi module reset handler
1266  */
1267 static int
1268 mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
1269 {
1270 	int rc;
1271 
1272 	rc = mptscsih_ioc_reset(ioc, reset_phase);
1273 
1274 	/* only try to do a renegotiation if we're properly set up
1275 	 * if we get an ioc fault on bringup, ioc->sh will be NULL */
1276 	if (reset_phase == MPT_IOC_POST_RESET &&
1277 	    ioc->sh) {
1278 		struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
1279 
1280 		mptspi_dv_renegotiate(hd);
1281 	}
1282 
1283 	return rc;
1284 }
1285 
1286 #ifdef CONFIG_PM
1287 /*
1288  * spi module resume handler
1289  */
1290 static int
1291 mptspi_resume(struct pci_dev *pdev)
1292 {
1293 	MPT_ADAPTER 	*ioc = pci_get_drvdata(pdev);
1294 	struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
1295 	int rc;
1296 
1297 	rc = mptscsih_resume(pdev);
1298 	mptspi_dv_renegotiate(hd);
1299 
1300 	return rc;
1301 }
1302 #endif
1303 
1304 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1305 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1306 /*
1307  *	mptspi_probe - Installs scsi devices per bus.
1308  *	@pdev: Pointer to pci_dev structure
1309  *
1310  *	Returns 0 for success, non-zero for failure.
1311  *
1312  */
1313 static int
1314 mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1315 {
1316 	struct Scsi_Host	*sh;
1317 	MPT_SCSI_HOST		*hd;
1318 	MPT_ADAPTER 		*ioc;
1319 	unsigned long		 flags;
1320 	int			 ii;
1321 	int			 numSGE = 0;
1322 	int			 scale;
1323 	int			 ioc_cap;
1324 	int			error=0;
1325 	int			r;
1326 
1327 	if ((r = mpt_attach(pdev,id)) != 0)
1328 		return r;
1329 
1330 	ioc = pci_get_drvdata(pdev);
1331 	ioc->DoneCtx = mptspiDoneCtx;
1332 	ioc->TaskCtx = mptspiTaskCtx;
1333 	ioc->InternalCtx = mptspiInternalCtx;
1334 
1335 	/*  Added sanity check on readiness of the MPT adapter.
1336 	 */
1337 	if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
1338 		printk(MYIOC_s_WARN_FMT
1339 		  "Skipping because it's not operational!\n",
1340 		  ioc->name);
1341 		error = -ENODEV;
1342 		goto out_mptspi_probe;
1343 	}
1344 
1345 	if (!ioc->active) {
1346 		printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
1347 		  ioc->name);
1348 		error = -ENODEV;
1349 		goto out_mptspi_probe;
1350 	}
1351 
1352 	/*  Sanity check - ensure at least 1 port is INITIATOR capable
1353 	 */
1354 	ioc_cap = 0;
1355 	for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
1356 		if (ioc->pfacts[ii].ProtocolFlags &
1357 		    MPI_PORTFACTS_PROTOCOL_INITIATOR)
1358 			ioc_cap ++;
1359 	}
1360 
1361 	if (!ioc_cap) {
1362 		printk(MYIOC_s_WARN_FMT
1363 			"Skipping ioc=%p because SCSI Initiator mode is NOT enabled!\n",
1364 			ioc->name, ioc);
1365 		return 0;
1366 	}
1367 
1368 	sh = scsi_host_alloc(&mptspi_driver_template, sizeof(MPT_SCSI_HOST));
1369 
1370 	if (!sh) {
1371 		printk(MYIOC_s_WARN_FMT
1372 			"Unable to register controller with SCSI subsystem\n",
1373 			ioc->name);
1374 		error = -1;
1375 		goto out_mptspi_probe;
1376         }
1377 
1378 	spin_lock_irqsave(&ioc->FreeQlock, flags);
1379 
1380 	/* Attach the SCSI Host to the IOC structure
1381 	 */
1382 	ioc->sh = sh;
1383 
1384 	sh->io_port = 0;
1385 	sh->n_io_port = 0;
1386 	sh->irq = 0;
1387 
1388 	/* set 16 byte cdb's */
1389 	sh->max_cmd_len = 16;
1390 
1391 	/* Yikes!  This is important!
1392 	 * Otherwise, by default, linux
1393 	 * only scans target IDs 0-7!
1394 	 * pfactsN->MaxDevices unreliable
1395 	 * (not supported in early
1396 	 *	versions of the FW).
1397 	 * max_id = 1 + actual max id,
1398 	 * max_lun = 1 + actual last lun,
1399 	 *	see hosts.h :o(
1400 	 */
1401 	sh->max_id = ioc->devices_per_bus;
1402 
1403 	sh->max_lun = MPT_LAST_LUN + 1;
1404 	/*
1405 	 * If RAID Firmware Detected, setup virtual channel
1406 	 */
1407 	if (ioc->ir_firmware)
1408 		sh->max_channel = 1;
1409 	else
1410 		sh->max_channel = 0;
1411 	sh->this_id = ioc->pfacts[0].PortSCSIID;
1412 
1413 	/* Required entry.
1414 	 */
1415 	sh->unique_id = ioc->id;
1416 
1417 	/* Verify that we won't exceed the maximum
1418 	 * number of chain buffers
1419 	 * We can optimize:  ZZ = req_sz/sizeof(SGE)
1420 	 * For 32bit SGE's:
1421 	 *  numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
1422 	 *               + (req_sz - 64)/sizeof(SGE)
1423 	 * A slightly different algorithm is required for
1424 	 * 64bit SGEs.
1425 	 */
1426 	scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
1427 	if (sizeof(dma_addr_t) == sizeof(u64)) {
1428 		numSGE = (scale - 1) *
1429 		  (ioc->facts.MaxChainDepth-1) + scale +
1430 		  (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
1431 		  sizeof(u32));
1432 	} else {
1433 		numSGE = 1 + (scale - 1) *
1434 		  (ioc->facts.MaxChainDepth-1) + scale +
1435 		  (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
1436 		  sizeof(u32));
1437 	}
1438 
1439 	if (numSGE < sh->sg_tablesize) {
1440 		/* Reset this value */
1441 		dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1442 		  "Resetting sg_tablesize to %d from %d\n",
1443 		  ioc->name, numSGE, sh->sg_tablesize));
1444 		sh->sg_tablesize = numSGE;
1445 	}
1446 
1447 	spin_unlock_irqrestore(&ioc->FreeQlock, flags);
1448 
1449 	hd = shost_priv(sh);
1450 	hd->ioc = ioc;
1451 
1452 	/* SCSI needs scsi_cmnd lookup table!
1453 	 * (with size equal to req_depth*PtrSz!)
1454 	 */
1455 	ioc->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
1456 	if (!ioc->ScsiLookup) {
1457 		error = -ENOMEM;
1458 		goto out_mptspi_probe;
1459 	}
1460 	spin_lock_init(&ioc->scsi_lookup_lock);
1461 
1462 	dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
1463 		 ioc->name, ioc->ScsiLookup));
1464 
1465 	/* Clear the TM flags
1466 	 */
1467 	hd->tmPending = 0;
1468 	hd->tmState = TM_STATE_NONE;
1469 	hd->resetPending = 0;
1470 	hd->abortSCpnt = NULL;
1471 
1472 	/* Clear the pointer used to store
1473 	 * single-threaded commands, i.e., those
1474 	 * issued during a bus scan, dv and
1475 	 * configuration pages.
1476 	 */
1477 	hd->cmdPtr = NULL;
1478 
1479 	/* Initialize this SCSI Hosts' timers
1480 	 * To use, set the timer expires field
1481 	 * and add_timer
1482 	 */
1483 	init_timer(&hd->timer);
1484 	hd->timer.data = (unsigned long) hd;
1485 	hd->timer.function = mptscsih_timer_expired;
1486 
1487 	ioc->spi_data.Saf_Te = mpt_saf_te;
1488 
1489 	hd->negoNvram = MPT_SCSICFG_USE_NVRAM;
1490 	ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1491 		"saf_te %x\n",
1492 		ioc->name,
1493 		mpt_saf_te));
1494 	ioc->spi_data.noQas = 0;
1495 
1496 	init_waitqueue_head(&hd->scandv_waitq);
1497 	hd->scandv_wait_done = 0;
1498 	hd->last_queue_full = 0;
1499 	hd->spi_pending = 0;
1500 
1501 	/* Some versions of the firmware don't support page 0; without
1502 	 * that we can't get the parameters */
1503 	if (ioc->spi_data.sdp0length != 0)
1504 		sh->transportt = mptspi_transport_template;
1505 
1506 	error = scsi_add_host (sh, &ioc->pcidev->dev);
1507 	if(error) {
1508 		dprintk(ioc, printk(MYIOC_s_ERR_FMT
1509 		  "scsi_add_host failed\n", ioc->name));
1510 		goto out_mptspi_probe;
1511 	}
1512 
1513 	/*
1514 	 * issue internal bus reset
1515 	 */
1516 	if (ioc->spi_data.bus_reset)
1517 		mptscsih_TMHandler(hd,
1518 		    MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
1519 		    0, 0, 0, 0, 5);
1520 
1521 	scsi_scan_host(sh);
1522 	return 0;
1523 
1524 out_mptspi_probe:
1525 
1526 	mptscsih_remove(pdev);
1527 	return error;
1528 }
1529 
1530 static struct pci_driver mptspi_driver = {
1531 	.name		= "mptspi",
1532 	.id_table	= mptspi_pci_table,
1533 	.probe		= mptspi_probe,
1534 	.remove		= __devexit_p(mptscsih_remove),
1535 	.shutdown	= mptscsih_shutdown,
1536 #ifdef CONFIG_PM
1537 	.suspend	= mptscsih_suspend,
1538 	.resume		= mptspi_resume,
1539 #endif
1540 };
1541 
1542 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1543 /**
1544  *	mptspi_init - Register MPT adapter(s) as SCSI host(s) with SCSI mid-layer.
1545  *
1546  *	Returns 0 for success, non-zero for failure.
1547  */
1548 static int __init
1549 mptspi_init(void)
1550 {
1551 	int error;
1552 
1553 	show_mptmod_ver(my_NAME, my_VERSION);
1554 
1555 	mptspi_transport_template = spi_attach_transport(&mptspi_transport_functions);
1556 	if (!mptspi_transport_template)
1557 		return -ENODEV;
1558 
1559 	mptspiDoneCtx = mpt_register(mptscsih_io_done, MPTSPI_DRIVER);
1560 	mptspiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSPI_DRIVER);
1561 	mptspiInternalCtx = mpt_register(mptscsih_scandv_complete, MPTSPI_DRIVER);
1562 
1563 	mpt_event_register(mptspiDoneCtx, mptspi_event_process);
1564 	mpt_reset_register(mptspiDoneCtx, mptspi_ioc_reset);
1565 
1566 	error = pci_register_driver(&mptspi_driver);
1567 	if (error)
1568 		spi_release_transport(mptspi_transport_template);
1569 
1570 	return error;
1571 }
1572 
1573 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1574 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1575 /**
1576  *	mptspi_exit - Unregisters MPT adapter(s)
1577  */
1578 static void __exit
1579 mptspi_exit(void)
1580 {
1581 	pci_unregister_driver(&mptspi_driver);
1582 
1583 	mpt_reset_deregister(mptspiDoneCtx);
1584 	mpt_event_deregister(mptspiDoneCtx);
1585 
1586 	mpt_deregister(mptspiInternalCtx);
1587 	mpt_deregister(mptspiTaskCtx);
1588 	mpt_deregister(mptspiDoneCtx);
1589 	spi_release_transport(mptspi_transport_template);
1590 }
1591 
1592 module_init(mptspi_init);
1593 module_exit(mptspi_exit);
1594