2 * linux/drivers/message/fusion/mptspi.c
3 * For use with LSI Logic PCI chip/adapter(s)
4 * running LSI Logic Fusion MPT (Message Passing Technology) firmware.
6 * Copyright (c) 1999-2007 LSI Logic Corporation
7 * (mailto:mpt_linux_developer@lsi.com)
10 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
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.
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.
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.
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
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
45 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
47 #include "linux_compat.h" /* linux-2.6 tweaks */
48 #include <linux/module.h>
49 #include <linux/kernel.h>
50 #include <linux/init.h>
51 #include <linux/errno.h>
52 #include <linux/kdev_t.h>
53 #include <linux/blkdev.h>
54 #include <linux/delay.h> /* for mdelay */
55 #include <linux/interrupt.h> /* needed for in_interrupt() proto */
56 #include <linux/reboot.h> /* notifier code */
57 #include <linux/workqueue.h>
58 #include <linux/raid_class.h>
60 #include <scsi/scsi.h>
61 #include <scsi/scsi_cmnd.h>
62 #include <scsi/scsi_device.h>
63 #include <scsi/scsi_host.h>
64 #include <scsi/scsi_tcq.h>
65 #include <scsi/scsi_transport.h>
66 #include <scsi/scsi_transport_spi.h>
67 #include <scsi/scsi_dbg.h>
72 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
73 #define my_NAME "Fusion MPT SPI Host driver"
74 #define my_VERSION MPT_LINUX_VERSION_COMMON
75 #define MYNAM "mptspi"
77 MODULE_AUTHOR(MODULEAUTHOR);
78 MODULE_DESCRIPTION(my_NAME);
79 MODULE_LICENSE("GPL");
80 MODULE_VERSION(my_VERSION);
82 /* Command line args */
83 static int mpt_saf_te = MPTSCSIH_SAF_TE;
84 module_param(mpt_saf_te, int, 0);
85 MODULE_PARM_DESC(mpt_saf_te, " Force enabling SEP Processor: enable=1 (default=MPTSCSIH_SAF_TE=0)");
87 static void mptspi_write_offset(struct scsi_target *, int);
88 static void mptspi_write_width(struct scsi_target *, int);
89 static int mptspi_write_spi_device_pg1(struct scsi_target *,
90 struct _CONFIG_PAGE_SCSI_DEVICE_1 *);
92 static struct scsi_transport_template *mptspi_transport_template = NULL;
94 static int mptspiDoneCtx = -1;
95 static int mptspiTaskCtx = -1;
96 static int mptspiInternalCtx = -1; /* Used only for internal commands */
99 * mptspi_setTargetNegoParms - Update the target negotiation
100 * parameters based on the the Inquiry data, adapter capabilities,
103 * @hd: Pointer to a SCSI Host Structure
104 * @vtarget: per target private data
109 mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
110 struct scsi_device *sdev)
112 SpiCfgData *pspi_data = &hd->ioc->spi_data;
113 int id = (int) target->id;
115 u8 width = MPT_NARROW;
116 u8 factor = MPT_ASYNC;
121 target->negoFlags = pspi_data->noQas;
123 if (sdev->scsi_level < SCSI_2) {
126 offset = pspi_data->maxSyncOffset;
127 target->tflags &= ~MPT_TARGET_FLAGS_Q_YES;
129 if (scsi_device_wide(sdev))
132 if (scsi_device_sync(sdev)) {
133 factor = pspi_data->minSyncFactor;
134 if (!scsi_device_dt(sdev))
137 if (!scsi_device_ius(sdev) &&
138 !scsi_device_qas(sdev))
139 factor = MPT_ULTRA160;
141 factor = MPT_ULTRA320;
142 if (scsi_device_qas(sdev)) {
143 ddvprintk((KERN_INFO "Enabling QAS due to byte56=%02x on id=%d!\n", scsi_device_qas(sdev), id));
146 if (sdev->type == TYPE_TAPE &&
147 scsi_device_ius(sdev))
148 target->negoFlags |= MPT_TAPE_NEGO_IDP;
151 offset = pspi_data->maxSyncOffset;
153 /* If RAID, never disable QAS
154 * else if non RAID, do not disable
155 * QAS if bit 1 is set
156 * bit 1 QAS support, non-raid only
159 if (target->raidVolume == 1)
167 if (!sdev->tagged_supported)
168 target->tflags &= ~MPT_TARGET_FLAGS_Q_YES;
170 /* Update tflags based on NVRAM settings. (SCSI only)
172 if (pspi_data->nvram && (pspi_data->nvram[id] != MPT_HOST_NVRAM_INVALID)) {
173 nvram = pspi_data->nvram[id];
174 nfactor = (nvram & MPT_NVRAM_SYNC_MASK) >> 8;
177 width = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1;
180 /* Ensure factor is set to the
181 * maximum of: adapter, nvram, inquiry
184 if (nfactor < pspi_data->minSyncFactor )
185 nfactor = pspi_data->minSyncFactor;
187 factor = max(factor, nfactor);
188 if (factor == MPT_ASYNC)
199 /* Make sure data is consistent
201 if ((!width) && (factor < MPT_ULTRA2))
204 /* Save the data to the target structure.
206 target->minSyncFactor = factor;
207 target->maxOffset = offset;
208 target->maxWidth = width;
210 target->tflags |= MPT_TARGET_FLAGS_VALID_NEGO;
212 /* Disable unused features.
215 target->negoFlags |= MPT_TARGET_NO_NEGO_WIDE;
218 target->negoFlags |= MPT_TARGET_NO_NEGO_SYNC;
220 if ( factor > MPT_ULTRA320 )
223 if (noQas && (pspi_data->noQas == 0)) {
224 pspi_data->noQas |= MPT_TARGET_NO_NEGO_QAS;
225 target->negoFlags |= MPT_TARGET_NO_NEGO_QAS;
227 /* Disable QAS in a mixed configuration case
230 ddvprintk((KERN_INFO "Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id));
235 * mptspi_writeIOCPage4 - write IOC Page 4
236 * @hd: Pointer to a SCSI Host Structure
238 * @id: write IOC Page4 for this ID & Bus
240 * Return: -EAGAIN if unable to obtain a Message Frame
243 * Remark: We do not wait for a return, write pages sequentially.
246 mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, u8 channel , u8 id)
248 MPT_ADAPTER *ioc = hd->ioc;
250 IOCPage4_t *IOCPage4Ptr;
258 /* Get a MF for this command.
260 if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) {
261 dfailprintk((MYIOC_s_WARN_FMT "writeIOCPage4 : no msg frames!\n",
266 /* Set the request and the data pointers.
267 * Place data at end of MF.
269 pReq = (Config_t *)mf;
271 req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx);
272 frameOffset = ioc->req_sz - sizeof(IOCPage4_t);
274 /* Complete the request frame (same for all requests).
276 pReq->Action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
278 pReq->ChainOffset = 0;
279 pReq->Function = MPI_FUNCTION_CONFIG;
280 pReq->ExtPageLength = 0;
281 pReq->ExtPageType = 0;
283 for (ii=0; ii < 8; ii++) {
284 pReq->Reserved2[ii] = 0;
287 IOCPage4Ptr = ioc->spi_data.pIocPg4;
288 dataDma = ioc->spi_data.IocPg4_dma;
289 ii = IOCPage4Ptr->ActiveSEP++;
290 IOCPage4Ptr->SEP[ii].SEPTargetID = id;
291 IOCPage4Ptr->SEP[ii].SEPBus = channel;
292 pReq->Header = IOCPage4Ptr->Header;
293 pReq->PageAddress = cpu_to_le32(id | (channel << 8 ));
295 /* Add a SGE to the config request.
297 flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE |
298 (IOCPage4Ptr->Header.PageLength + ii) * 4;
300 mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma);
302 ddvprintk((MYIOC_s_INFO_FMT
303 "writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n",
304 ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel));
306 mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);
312 * mptspi_initTarget - Target, LUN alloc/free functionality.
313 * @hd: Pointer to MPT_SCSI_HOST structure
314 * @vtarget: per target private data
317 * NOTE: It's only SAFE to call this routine if data points to
318 * sane & valid STANDARD INQUIRY data!
320 * Allocate and initialize memory for this target.
325 mptspi_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget,
326 struct scsi_device *sdev)
329 /* Is LUN supported? If so, upper 2 bits will be 0
330 * in first byte of inquiry data.
332 if (sdev->inq_periph_qual != 0)
338 vtarget->type = sdev->type;
340 if ((sdev->type == TYPE_PROCESSOR) && (hd->ioc->spi_data.Saf_Te)) {
341 /* Treat all Processors as SAF-TE if
342 * command line option is set */
343 vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
344 mptspi_writeIOCPage4(hd, vtarget->channel, vtarget->id);
345 }else if ((sdev->type == TYPE_PROCESSOR) &&
346 !(vtarget->tflags & MPT_TARGET_FLAGS_SAF_TE_ISSUED )) {
347 if (sdev->inquiry_len > 49 ) {
348 if (sdev->inquiry[44] == 'S' &&
349 sdev->inquiry[45] == 'A' &&
350 sdev->inquiry[46] == 'F' &&
351 sdev->inquiry[47] == '-' &&
352 sdev->inquiry[48] == 'T' &&
353 sdev->inquiry[49] == 'E' ) {
354 vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
355 mptspi_writeIOCPage4(hd, vtarget->channel, vtarget->id);
359 mptspi_setTargetNegoParms(hd, vtarget, sdev);
363 * mptspi_is_raid - Determines whether target is belonging to volume
364 * @hd: Pointer to a SCSI HOST structure
365 * @id: target device id
373 mptspi_is_raid(struct _MPT_SCSI_HOST *hd, u32 id)
377 if (!hd->ioc->raid_data.pIocPg2)
380 if (!hd->ioc->raid_data.pIocPg2->NumActiveVolumes)
382 for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
383 if (hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == id) {
393 static int mptspi_target_alloc(struct scsi_target *starget)
395 struct Scsi_Host *shost = dev_to_shost(&starget->dev);
396 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
402 vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
406 vtarget->ioc_id = hd->ioc->id;
407 vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
408 vtarget->id = (u8)starget->id;
409 vtarget->channel = (u8)starget->channel;
410 vtarget->starget = starget;
411 starget->hostdata = vtarget;
413 if (starget->channel == 1) {
414 if (mptscsih_is_phys_disk(hd->ioc, 0, starget->id) == 0)
416 vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT;
417 /* The real channel for this device is zero */
418 vtarget->channel = 0;
419 /* The actual physdisknum (for RAID passthrough) */
420 vtarget->id = mptscsih_raid_id_to_num(hd->ioc, 0,
424 if (starget->channel == 0 &&
425 mptspi_is_raid(hd, starget->id)) {
426 vtarget->raidVolume = 1;
428 "RAID Volume @ channel=%d id=%d\n", starget->channel,
432 if (hd->ioc->spi_data.nvram &&
433 hd->ioc->spi_data.nvram[starget->id] != MPT_HOST_NVRAM_INVALID) {
434 u32 nvram = hd->ioc->spi_data.nvram[starget->id];
435 spi_min_period(starget) = (nvram & MPT_NVRAM_SYNC_MASK) >> MPT_NVRAM_SYNC_SHIFT;
436 spi_max_width(starget) = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1;
438 spi_min_period(starget) = hd->ioc->spi_data.minSyncFactor;
439 spi_max_width(starget) = hd->ioc->spi_data.maxBusWidth;
441 spi_max_offset(starget) = hd->ioc->spi_data.maxSyncOffset;
443 spi_offset(starget) = 0;
444 mptspi_write_width(starget, 0);
450 mptspi_target_destroy(struct scsi_target *starget)
452 if (starget->hostdata)
453 kfree(starget->hostdata);
454 starget->hostdata = NULL;
458 * mptspi_print_write_nego - negotiation parameters debug info that is being sent
459 * @hd: Pointer to a SCSI HOST structure
460 * @starget: SCSI target
461 * @ii: negotiation parameters
465 mptspi_print_write_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
467 ddvprintk((MYIOC_s_INFO_FMT "id=%d Requested = 0x%08x"
468 " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
469 hd->ioc->name, starget->id, ii,
470 ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
471 ((ii >> 8) & 0xFF), ((ii >> 16) & 0xFF),
472 ii & MPI_SCSIDEVPAGE0_NP_IU ? "IU ": "",
473 ii & MPI_SCSIDEVPAGE0_NP_DT ? "DT ": "",
474 ii & MPI_SCSIDEVPAGE0_NP_QAS ? "QAS ": "",
475 ii & MPI_SCSIDEVPAGE0_NP_HOLD_MCS ? "HOLDMCS ": "",
476 ii & MPI_SCSIDEVPAGE0_NP_WR_FLOW ? "WRFLOW ": "",
477 ii & MPI_SCSIDEVPAGE0_NP_RD_STRM ? "RDSTRM ": "",
478 ii & MPI_SCSIDEVPAGE0_NP_RTI ? "RTI ": "",
479 ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP ": ""));
483 * mptspi_print_read_nego - negotiation parameters debug info that is being read
484 * @hd: Pointer to a SCSI HOST structure
485 * @starget: SCSI target
486 * @ii: negotiation parameters
490 mptspi_print_read_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
492 ddvprintk((MYIOC_s_INFO_FMT "id=%d Read = 0x%08x"
493 " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
494 hd->ioc->name, starget->id, ii,
495 ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
496 ((ii >> 8) & 0xFF), ((ii >> 16) & 0xFF),
497 ii & MPI_SCSIDEVPAGE0_NP_IU ? "IU ": "",
498 ii & MPI_SCSIDEVPAGE0_NP_DT ? "DT ": "",
499 ii & MPI_SCSIDEVPAGE0_NP_QAS ? "QAS ": "",
500 ii & MPI_SCSIDEVPAGE0_NP_HOLD_MCS ? "HOLDMCS ": "",
501 ii & MPI_SCSIDEVPAGE0_NP_WR_FLOW ? "WRFLOW ": "",
502 ii & MPI_SCSIDEVPAGE0_NP_RD_STRM ? "RDSTRM ": "",
503 ii & MPI_SCSIDEVPAGE0_NP_RTI ? "RTI ": "",
504 ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP ": ""));
507 static int mptspi_read_spi_device_pg0(struct scsi_target *starget,
508 struct _CONFIG_PAGE_SCSI_DEVICE_0 *pass_pg0)
510 struct Scsi_Host *shost = dev_to_shost(&starget->dev);
511 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
512 struct _MPT_ADAPTER *ioc = hd->ioc;
513 struct _CONFIG_PAGE_SCSI_DEVICE_0 *pg0;
516 struct _x_config_parms cfg;
517 struct _CONFIG_PAGE_HEADER hdr;
520 /* No SPI parameters for RAID devices */
521 if (starget->channel == 0 &&
522 mptspi_is_raid(hd, starget->id))
525 size = ioc->spi_data.sdp0length * 4;
527 if (ioc->spi_data.sdp0length & 1)
532 pg0 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg0_dma, GFP_KERNEL);
534 starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n");
538 memset(&hdr, 0, sizeof(hdr));
540 hdr.PageVersion = ioc->spi_data.sdp0version;
541 hdr.PageLength = ioc->spi_data.sdp0length;
543 hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
545 memset(&cfg, 0, sizeof(cfg));
547 cfg.cfghdr.hdr = &hdr;
548 cfg.physAddr = pg0_dma;
549 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
551 cfg.pageAddr = starget->id;
553 if (mpt_config(ioc, &cfg)) {
554 starget_printk(KERN_ERR, starget, "mpt_config failed\n");
558 memcpy(pass_pg0, pg0, size);
560 mptspi_print_read_nego(hd, starget, le32_to_cpu(pg0->NegotiatedParameters));
563 dma_free_coherent(&ioc->pcidev->dev, size, pg0, pg0_dma);
567 static u32 mptspi_getRP(struct scsi_target *starget)
571 nego |= spi_iu(starget) ? MPI_SCSIDEVPAGE1_RP_IU : 0;
572 nego |= spi_dt(starget) ? MPI_SCSIDEVPAGE1_RP_DT : 0;
573 nego |= spi_qas(starget) ? MPI_SCSIDEVPAGE1_RP_QAS : 0;
574 nego |= spi_hold_mcs(starget) ? MPI_SCSIDEVPAGE1_RP_HOLD_MCS : 0;
575 nego |= spi_wr_flow(starget) ? MPI_SCSIDEVPAGE1_RP_WR_FLOW : 0;
576 nego |= spi_rd_strm(starget) ? MPI_SCSIDEVPAGE1_RP_RD_STRM : 0;
577 nego |= spi_rti(starget) ? MPI_SCSIDEVPAGE1_RP_RTI : 0;
578 nego |= spi_pcomp_en(starget) ? MPI_SCSIDEVPAGE1_RP_PCOMP_EN : 0;
580 nego |= (spi_period(starget) << MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD) & MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK;
581 nego |= (spi_offset(starget) << MPI_SCSIDEVPAGE1_RP_SHIFT_MAX_SYNC_OFFSET) & MPI_SCSIDEVPAGE1_RP_MAX_SYNC_OFFSET_MASK;
582 nego |= spi_width(starget) ? MPI_SCSIDEVPAGE1_RP_WIDE : 0;
587 static void mptspi_read_parameters(struct scsi_target *starget)
590 struct _CONFIG_PAGE_SCSI_DEVICE_0 pg0;
592 mptspi_read_spi_device_pg0(starget, &pg0);
594 nego = le32_to_cpu(pg0.NegotiatedParameters);
596 spi_iu(starget) = (nego & MPI_SCSIDEVPAGE0_NP_IU) ? 1 : 0;
597 spi_dt(starget) = (nego & MPI_SCSIDEVPAGE0_NP_DT) ? 1 : 0;
598 spi_qas(starget) = (nego & MPI_SCSIDEVPAGE0_NP_QAS) ? 1 : 0;
599 spi_wr_flow(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WR_FLOW) ? 1 : 0;
600 spi_rd_strm(starget) = (nego & MPI_SCSIDEVPAGE0_NP_RD_STRM) ? 1 : 0;
601 spi_rti(starget) = (nego & MPI_SCSIDEVPAGE0_NP_RTI) ? 1 : 0;
602 spi_pcomp_en(starget) = (nego & MPI_SCSIDEVPAGE0_NP_PCOMP_EN) ? 1 : 0;
603 spi_hold_mcs(starget) = (nego & MPI_SCSIDEVPAGE0_NP_HOLD_MCS) ? 1 : 0;
604 spi_period(starget) = (nego & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK) >> MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_PERIOD;
605 spi_offset(starget) = (nego & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK) >> MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_OFFSET;
606 spi_width(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WIDE) ? 1 : 0;
610 mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
612 MpiRaidActionRequest_t *pReq;
615 /* Get and Populate a free Frame
617 if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) {
618 ddvprintk((MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n",
622 pReq = (MpiRaidActionRequest_t *)mf;
624 pReq->Action = MPI_RAID_ACTION_QUIESCE_PHYS_IO;
626 pReq->Action = MPI_RAID_ACTION_ENABLE_PHYS_IO;
628 pReq->ChainOffset = 0;
629 pReq->Function = MPI_FUNCTION_RAID_ACTION;
631 pReq->VolumeBus = channel;
632 pReq->PhysDiskNum = 0;
635 pReq->ActionDataWord = 0; /* Reserved for this action */
637 mpt_add_sge((char *)&pReq->ActionDataSGE,
638 MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1);
640 ddvprintk((MYIOC_s_INFO_FMT "RAID Volume action=%x channel=%d id=%d\n",
641 hd->ioc->name, pReq->Action, channel, id));
644 hd->timer.expires = jiffies + HZ*10; /* 10 second timeout */
645 hd->scandv_wait_done = 0;
647 /* Save cmd pointer, for resource free if timeout or
652 add_timer(&hd->timer);
653 mpt_put_msg_frame(hd->ioc->InternalCtx, hd->ioc, mf);
654 wait_event(hd->scandv_waitq, hd->scandv_wait_done);
656 if ((hd->pLocal == NULL) || (hd->pLocal->completion != 0))
662 static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
663 struct scsi_device *sdev)
665 VirtTarget *vtarget = scsi_target(sdev)->hostdata;
667 /* no DV on RAID devices */
668 if (sdev->channel == 0 &&
669 mptspi_is_raid(hd, sdev->id))
672 /* If this is a piece of a RAID, then quiesce first */
673 if (sdev->channel == 1 &&
674 mptscsih_quiesce_raid(hd, 1, vtarget->channel, vtarget->id) < 0) {
675 starget_printk(KERN_ERR, scsi_target(sdev),
676 "Integrated RAID quiesce failed\n");
682 if (sdev->channel == 1 &&
683 mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0)
684 starget_printk(KERN_ERR, scsi_target(sdev),
685 "Integrated RAID resume failed\n");
687 mptspi_read_parameters(sdev->sdev_target);
688 spi_display_xfer_agreement(sdev->sdev_target);
689 mptspi_read_parameters(sdev->sdev_target);
692 static int mptspi_slave_alloc(struct scsi_device *sdev)
694 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)sdev->host->hostdata;
697 struct scsi_target *starget;
699 if (sdev->channel == 1 &&
700 mptscsih_is_phys_disk(hd->ioc, 0, sdev->id) == 0)
703 vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
705 printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
706 hd->ioc->name, sizeof(VirtDevice));
710 vdev->lun = sdev->lun;
711 sdev->hostdata = vdev;
713 starget = scsi_target(sdev);
714 vtarget = starget->hostdata;
715 vdev->vtarget = vtarget;
718 if (sdev->channel == 1)
719 sdev->no_uld_attach = 1;
724 static int mptspi_slave_configure(struct scsi_device *sdev)
726 struct _MPT_SCSI_HOST *hd =
727 (struct _MPT_SCSI_HOST *)sdev->host->hostdata;
728 VirtTarget *vtarget = scsi_target(sdev)->hostdata;
729 int ret = mptscsih_slave_configure(sdev);
734 mptspi_initTarget(hd, vtarget, sdev);
736 ddvprintk((MYIOC_s_INFO_FMT "id=%d min_period=0x%02x"
737 " max_offset=0x%02x max_width=%d\n", hd->ioc->name,
738 sdev->id, spi_min_period(scsi_target(sdev)),
739 spi_max_offset(scsi_target(sdev)),
740 spi_max_width(scsi_target(sdev))));
742 if ((sdev->channel == 1 ||
743 !(mptspi_is_raid(hd, sdev->id))) &&
744 !spi_initial_dv(sdev->sdev_target))
745 mptspi_dv_device(hd, sdev);
751 mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
753 struct _MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata;
754 VirtDevice *vdev = SCpnt->device->hostdata;
756 if (!vdev || !vdev->vtarget) {
757 SCpnt->result = DID_NO_CONNECT << 16;
762 if (SCpnt->device->channel == 1 &&
763 mptscsih_is_phys_disk(hd->ioc, 0, SCpnt->device->id) == 0) {
764 SCpnt->result = DID_NO_CONNECT << 16;
770 if (spi_dv_pending(scsi_target(SCpnt->device)))
771 scsi_print_command(SCpnt);
774 return mptscsih_qcmd(SCpnt,done);
777 static void mptspi_slave_destroy(struct scsi_device *sdev)
779 struct scsi_target *starget = scsi_target(sdev);
780 VirtTarget *vtarget = starget->hostdata;
781 VirtDevice *vdevice = sdev->hostdata;
783 /* Will this be the last lun on a non-raid device? */
784 if (vtarget->num_luns == 1 && vdevice->configured_lun) {
785 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
788 pg1.RequestedParameters = 0;
790 pg1.Configuration = 0;
792 mptspi_write_spi_device_pg1(starget, &pg1);
795 mptscsih_slave_destroy(sdev);
798 static struct scsi_host_template mptspi_driver_template = {
799 .module = THIS_MODULE,
800 .proc_name = "mptspi",
801 .proc_info = mptscsih_proc_info,
802 .name = "MPT SPI Host",
803 .info = mptscsih_info,
804 .queuecommand = mptspi_qcmd,
805 .target_alloc = mptspi_target_alloc,
806 .slave_alloc = mptspi_slave_alloc,
807 .slave_configure = mptspi_slave_configure,
808 .target_destroy = mptspi_target_destroy,
809 .slave_destroy = mptspi_slave_destroy,
810 .change_queue_depth = mptscsih_change_queue_depth,
811 .eh_abort_handler = mptscsih_abort,
812 .eh_device_reset_handler = mptscsih_dev_reset,
813 .eh_bus_reset_handler = mptscsih_bus_reset,
814 .eh_host_reset_handler = mptscsih_host_reset,
815 .bios_param = mptscsih_bios_param,
816 .can_queue = MPT_SCSI_CAN_QUEUE,
818 .sg_tablesize = MPT_SCSI_SG_DEPTH,
821 .use_clustering = ENABLE_CLUSTERING,
824 static int mptspi_write_spi_device_pg1(struct scsi_target *starget,
825 struct _CONFIG_PAGE_SCSI_DEVICE_1 *pass_pg1)
827 struct Scsi_Host *shost = dev_to_shost(&starget->dev);
828 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
829 struct _MPT_ADAPTER *ioc = hd->ioc;
830 struct _CONFIG_PAGE_SCSI_DEVICE_1 *pg1;
833 struct _x_config_parms cfg;
834 struct _CONFIG_PAGE_HEADER hdr;
837 /* don't allow updating nego parameters on RAID devices */
838 if (starget->channel == 0 &&
839 mptspi_is_raid(hd, starget->id))
842 size = ioc->spi_data.sdp1length * 4;
844 pg1 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg1_dma, GFP_KERNEL);
846 starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n");
850 memset(&hdr, 0, sizeof(hdr));
852 hdr.PageVersion = ioc->spi_data.sdp1version;
853 hdr.PageLength = ioc->spi_data.sdp1length;
855 hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
857 memset(&cfg, 0, sizeof(cfg));
859 cfg.cfghdr.hdr = &hdr;
860 cfg.physAddr = pg1_dma;
861 cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
863 cfg.pageAddr = starget->id;
865 memcpy(pg1, pass_pg1, size);
867 pg1->Header.PageVersion = hdr.PageVersion;
868 pg1->Header.PageLength = hdr.PageLength;
869 pg1->Header.PageNumber = hdr.PageNumber;
870 pg1->Header.PageType = hdr.PageType;
872 mptspi_print_write_nego(hd, starget, le32_to_cpu(pg1->RequestedParameters));
874 if (mpt_config(ioc, &cfg)) {
875 starget_printk(KERN_ERR, starget, "mpt_config failed\n");
881 dma_free_coherent(&ioc->pcidev->dev, size, pg1, pg1_dma);
885 static void mptspi_write_offset(struct scsi_target *starget, int offset)
887 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
896 if (spi_offset(starget) == -1)
897 mptspi_read_parameters(starget);
899 spi_offset(starget) = offset;
901 nego = mptspi_getRP(starget);
903 pg1.RequestedParameters = cpu_to_le32(nego);
905 pg1.Configuration = 0;
907 mptspi_write_spi_device_pg1(starget, &pg1);
910 static void mptspi_write_period(struct scsi_target *starget, int period)
912 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
921 if (spi_period(starget) == -1)
922 mptspi_read_parameters(starget);
927 } else if (period == 9) {
931 spi_period(starget) = period;
933 nego = mptspi_getRP(starget);
935 pg1.RequestedParameters = cpu_to_le32(nego);
937 pg1.Configuration = 0;
939 mptspi_write_spi_device_pg1(starget, &pg1);
942 static void mptspi_write_dt(struct scsi_target *starget, int dt)
944 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
947 if (spi_period(starget) == -1)
948 mptspi_read_parameters(starget);
950 if (!dt && spi_period(starget) < 10)
951 spi_period(starget) = 10;
953 spi_dt(starget) = dt;
955 nego = mptspi_getRP(starget);
958 pg1.RequestedParameters = cpu_to_le32(nego);
960 pg1.Configuration = 0;
962 mptspi_write_spi_device_pg1(starget, &pg1);
965 static void mptspi_write_iu(struct scsi_target *starget, int iu)
967 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
970 if (spi_period(starget) == -1)
971 mptspi_read_parameters(starget);
973 if (!iu && spi_period(starget) < 9)
974 spi_period(starget) = 9;
976 spi_iu(starget) = iu;
978 nego = mptspi_getRP(starget);
980 pg1.RequestedParameters = cpu_to_le32(nego);
982 pg1.Configuration = 0;
984 mptspi_write_spi_device_pg1(starget, &pg1);
987 #define MPTSPI_SIMPLE_TRANSPORT_PARM(parm) \
988 static void mptspi_write_##parm(struct scsi_target *starget, int parm)\
990 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; \
993 spi_##parm(starget) = parm; \
995 nego = mptspi_getRP(starget); \
997 pg1.RequestedParameters = cpu_to_le32(nego); \
999 pg1.Configuration = 0; \
1001 mptspi_write_spi_device_pg1(starget, &pg1); \
1004 MPTSPI_SIMPLE_TRANSPORT_PARM(rd_strm)
1005 MPTSPI_SIMPLE_TRANSPORT_PARM(wr_flow)
1006 MPTSPI_SIMPLE_TRANSPORT_PARM(rti)
1007 MPTSPI_SIMPLE_TRANSPORT_PARM(hold_mcs)
1008 MPTSPI_SIMPLE_TRANSPORT_PARM(pcomp_en)
1010 static void mptspi_write_qas(struct scsi_target *starget, int qas)
1012 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
1013 struct Scsi_Host *shost = dev_to_shost(&starget->dev);
1014 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
1015 VirtTarget *vtarget = starget->hostdata;
1018 if ((vtarget->negoFlags & MPT_TARGET_NO_NEGO_QAS) ||
1019 hd->ioc->spi_data.noQas)
1020 spi_qas(starget) = 0;
1022 spi_qas(starget) = qas;
1024 nego = mptspi_getRP(starget);
1026 pg1.RequestedParameters = cpu_to_le32(nego);
1028 pg1.Configuration = 0;
1030 mptspi_write_spi_device_pg1(starget, &pg1);
1033 static void mptspi_write_width(struct scsi_target *starget, int width)
1035 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
1039 spi_dt(starget) = 0;
1040 if (spi_period(starget) < 10)
1041 spi_period(starget) = 10;
1044 spi_width(starget) = width;
1046 nego = mptspi_getRP(starget);
1048 pg1.RequestedParameters = cpu_to_le32(nego);
1050 pg1.Configuration = 0;
1052 mptspi_write_spi_device_pg1(starget, &pg1);
1055 struct work_queue_wrapper {
1056 struct work_struct work;
1057 struct _MPT_SCSI_HOST *hd;
1061 static void mpt_work_wrapper(struct work_struct *work)
1063 struct work_queue_wrapper *wqw =
1064 container_of(work, struct work_queue_wrapper, work);
1065 struct _MPT_SCSI_HOST *hd = wqw->hd;
1066 struct Scsi_Host *shost = hd->ioc->sh;
1067 struct scsi_device *sdev;
1068 int disk = wqw->disk;
1069 struct _CONFIG_PAGE_IOC_3 *pg3;
1073 mpt_findImVolumes(hd->ioc);
1074 pg3 = hd->ioc->raid_data.pIocPg3;
1078 shost_for_each_device(sdev,shost) {
1079 struct scsi_target *starget = scsi_target(sdev);
1080 VirtTarget *vtarget = starget->hostdata;
1082 /* only want to search RAID components */
1083 if (sdev->channel != 1)
1086 /* The id is the raid PhysDiskNum, even if
1087 * starget->id is the actual target address */
1088 if(vtarget->id != disk)
1091 starget_printk(KERN_INFO, vtarget->starget,
1092 "Integrated RAID requests DV of new device\n");
1093 mptspi_dv_device(hd, sdev);
1095 shost_printk(KERN_INFO, shost,
1096 "Integrated RAID detects new device %d\n", disk);
1097 scsi_scan_target(&hd->ioc->sh->shost_gendev, 1, disk, 0, 1);
1101 static void mpt_dv_raid(struct _MPT_SCSI_HOST *hd, int disk)
1103 struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC);
1106 shost_printk(KERN_ERR, hd->ioc->sh,
1107 "Failed to act on RAID event for physical disk %d\n",
1111 INIT_WORK(&wqw->work, mpt_work_wrapper);
1115 schedule_work(&wqw->work);
1119 mptspi_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
1121 u8 event = le32_to_cpu(pEvReply->Event) & 0xFF;
1122 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
1124 if (hd && event == MPI_EVENT_INTEGRATED_RAID) {
1126 = (le32_to_cpu(pEvReply->Data[0]) & 0x00FF0000) >> 16;
1128 if (reason == MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED) {
1129 int disk = (le32_to_cpu(pEvReply->Data[0]) & 0xFF000000) >> 24;
1130 mpt_dv_raid(hd, disk);
1133 return mptscsih_event_process(ioc, pEvReply);
1137 mptspi_deny_binding(struct scsi_target *starget)
1139 struct _MPT_SCSI_HOST *hd =
1140 (struct _MPT_SCSI_HOST *)dev_to_shost(starget->dev.parent)->hostdata;
1141 return ((mptspi_is_raid(hd, starget->id)) &&
1142 starget->channel == 0) ? 1 : 0;
1145 static struct spi_function_template mptspi_transport_functions = {
1146 .get_offset = mptspi_read_parameters,
1147 .set_offset = mptspi_write_offset,
1149 .get_period = mptspi_read_parameters,
1150 .set_period = mptspi_write_period,
1152 .get_width = mptspi_read_parameters,
1153 .set_width = mptspi_write_width,
1155 .get_iu = mptspi_read_parameters,
1156 .set_iu = mptspi_write_iu,
1158 .get_dt = mptspi_read_parameters,
1159 .set_dt = mptspi_write_dt,
1161 .get_qas = mptspi_read_parameters,
1162 .set_qas = mptspi_write_qas,
1164 .get_wr_flow = mptspi_read_parameters,
1165 .set_wr_flow = mptspi_write_wr_flow,
1167 .get_rd_strm = mptspi_read_parameters,
1168 .set_rd_strm = mptspi_write_rd_strm,
1170 .get_rti = mptspi_read_parameters,
1171 .set_rti = mptspi_write_rti,
1173 .get_pcomp_en = mptspi_read_parameters,
1174 .set_pcomp_en = mptspi_write_pcomp_en,
1176 .get_hold_mcs = mptspi_read_parameters,
1177 .set_hold_mcs = mptspi_write_hold_mcs,
1179 .deny_binding = mptspi_deny_binding,
1182 /****************************************************************************
1183 * Supported hardware
1186 static struct pci_device_id mptspi_pci_table[] = {
1187 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1030,
1188 PCI_ANY_ID, PCI_ANY_ID },
1189 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1035,
1190 PCI_ANY_ID, PCI_ANY_ID },
1191 {0} /* Terminating entry */
1193 MODULE_DEVICE_TABLE(pci, mptspi_pci_table);
1197 * renegotiate for a given target
1200 mptspi_dv_renegotiate_work(struct work_struct *work)
1202 struct work_queue_wrapper *wqw =
1203 container_of(work, struct work_queue_wrapper, work);
1204 struct _MPT_SCSI_HOST *hd = wqw->hd;
1205 struct scsi_device *sdev;
1209 shost_for_each_device(sdev, hd->ioc->sh)
1210 mptspi_dv_device(hd, sdev);
1214 mptspi_dv_renegotiate(struct _MPT_SCSI_HOST *hd)
1216 struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC);
1221 INIT_WORK(&wqw->work, mptspi_dv_renegotiate_work);
1224 schedule_work(&wqw->work);
1228 * spi module reset handler
1231 mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
1233 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
1236 rc = mptscsih_ioc_reset(ioc, reset_phase);
1238 if (reset_phase == MPT_IOC_POST_RESET)
1239 mptspi_dv_renegotiate(hd);
1246 * spi module resume handler
1249 mptspi_resume(struct pci_dev *pdev)
1251 MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
1252 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
1255 rc = mptscsih_resume(pdev);
1256 mptspi_dv_renegotiate(hd);
1262 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1263 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1265 * mptspi_probe - Installs scsi devices per bus.
1266 * @pdev: Pointer to pci_dev structure
1268 * Returns 0 for success, non-zero for failure.
1272 mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1274 struct Scsi_Host *sh;
1277 unsigned long flags;
1285 if ((r = mpt_attach(pdev,id)) != 0)
1288 ioc = pci_get_drvdata(pdev);
1289 ioc->DoneCtx = mptspiDoneCtx;
1290 ioc->TaskCtx = mptspiTaskCtx;
1291 ioc->InternalCtx = mptspiInternalCtx;
1293 /* Added sanity check on readiness of the MPT adapter.
1295 if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
1296 printk(MYIOC_s_WARN_FMT
1297 "Skipping because it's not operational!\n",
1300 goto out_mptspi_probe;
1304 printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
1307 goto out_mptspi_probe;
1310 /* Sanity check - ensure at least 1 port is INITIATOR capable
1313 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
1314 if (ioc->pfacts[ii].ProtocolFlags &
1315 MPI_PORTFACTS_PROTOCOL_INITIATOR)
1320 printk(MYIOC_s_WARN_FMT
1321 "Skipping ioc=%p because SCSI Initiator mode is NOT enabled!\n",
1326 sh = scsi_host_alloc(&mptspi_driver_template, sizeof(MPT_SCSI_HOST));
1329 printk(MYIOC_s_WARN_FMT
1330 "Unable to register controller with SCSI subsystem\n",
1333 goto out_mptspi_probe;
1336 spin_lock_irqsave(&ioc->FreeQlock, flags);
1338 /* Attach the SCSI Host to the IOC structure
1346 /* set 16 byte cdb's */
1347 sh->max_cmd_len = 16;
1349 /* Yikes! This is important!
1350 * Otherwise, by default, linux
1351 * only scans target IDs 0-7!
1352 * pfactsN->MaxDevices unreliable
1353 * (not supported in early
1354 * versions of the FW).
1355 * max_id = 1 + actual max id,
1356 * max_lun = 1 + actual last lun,
1359 sh->max_id = ioc->devices_per_bus;
1361 sh->max_lun = MPT_LAST_LUN + 1;
1363 * If RAID Firmware Detected, setup virtual channel
1365 if (ioc->ir_firmware)
1366 sh->max_channel = 1;
1368 sh->max_channel = 0;
1369 sh->this_id = ioc->pfacts[0].PortSCSIID;
1373 sh->unique_id = ioc->id;
1375 /* Verify that we won't exceed the maximum
1376 * number of chain buffers
1377 * We can optimize: ZZ = req_sz/sizeof(SGE)
1379 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
1380 * + (req_sz - 64)/sizeof(SGE)
1381 * A slightly different algorithm is required for
1384 scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
1385 if (sizeof(dma_addr_t) == sizeof(u64)) {
1386 numSGE = (scale - 1) *
1387 (ioc->facts.MaxChainDepth-1) + scale +
1388 (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
1391 numSGE = 1 + (scale - 1) *
1392 (ioc->facts.MaxChainDepth-1) + scale +
1393 (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
1397 if (numSGE < sh->sg_tablesize) {
1398 /* Reset this value */
1399 dprintk((MYIOC_s_INFO_FMT
1400 "Resetting sg_tablesize to %d from %d\n",
1401 ioc->name, numSGE, sh->sg_tablesize));
1402 sh->sg_tablesize = numSGE;
1405 spin_unlock_irqrestore(&ioc->FreeQlock, flags);
1407 hd = (MPT_SCSI_HOST *) sh->hostdata;
1410 /* SCSI needs scsi_cmnd lookup table!
1411 * (with size equal to req_depth*PtrSz!)
1413 hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
1414 if (!hd->ScsiLookup) {
1416 goto out_mptspi_probe;
1419 dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
1420 ioc->name, hd->ScsiLookup));
1422 /* Clear the TM flags
1425 hd->tmState = TM_STATE_NONE;
1426 hd->resetPending = 0;
1427 hd->abortSCpnt = NULL;
1429 /* Clear the pointer used to store
1430 * single-threaded commands, i.e., those
1431 * issued during a bus scan, dv and
1432 * configuration pages.
1436 /* Initialize this SCSI Hosts' timers
1437 * To use, set the timer expires field
1440 init_timer(&hd->timer);
1441 hd->timer.data = (unsigned long) hd;
1442 hd->timer.function = mptscsih_timer_expired;
1444 ioc->spi_data.Saf_Te = mpt_saf_te;
1446 hd->negoNvram = MPT_SCSICFG_USE_NVRAM;
1447 ddvprintk((MYIOC_s_INFO_FMT
1451 ioc->spi_data.noQas = 0;
1453 init_waitqueue_head(&hd->scandv_waitq);
1454 hd->scandv_wait_done = 0;
1455 hd->last_queue_full = 0;
1457 /* Some versions of the firmware don't support page 0; without
1458 * that we can't get the parameters */
1459 if (hd->ioc->spi_data.sdp0length != 0)
1460 sh->transportt = mptspi_transport_template;
1462 error = scsi_add_host (sh, &ioc->pcidev->dev);
1464 dprintk((KERN_ERR MYNAM
1465 "scsi_add_host failed\n"));
1466 goto out_mptspi_probe;
1470 * issue internal bus reset
1472 if (ioc->spi_data.bus_reset)
1473 mptscsih_TMHandler(hd,
1474 MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
1482 mptscsih_remove(pdev);
1486 static struct pci_driver mptspi_driver = {
1488 .id_table = mptspi_pci_table,
1489 .probe = mptspi_probe,
1490 .remove = __devexit_p(mptscsih_remove),
1491 .shutdown = mptscsih_shutdown,
1493 .suspend = mptscsih_suspend,
1494 .resume = mptspi_resume,
1498 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1500 * mptspi_init - Register MPT adapter(s) as SCSI host(s) with SCSI mid-layer.
1502 * Returns 0 for success, non-zero for failure.
1507 show_mptmod_ver(my_NAME, my_VERSION);
1509 mptspi_transport_template = spi_attach_transport(&mptspi_transport_functions);
1510 if (!mptspi_transport_template)
1513 mptspiDoneCtx = mpt_register(mptscsih_io_done, MPTSPI_DRIVER);
1514 mptspiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSPI_DRIVER);
1515 mptspiInternalCtx = mpt_register(mptscsih_scandv_complete, MPTSPI_DRIVER);
1517 if (mpt_event_register(mptspiDoneCtx, mptspi_event_process) == 0) {
1518 devtverboseprintk((KERN_INFO MYNAM
1519 ": Registered for IOC event notifications\n"));
1522 if (mpt_reset_register(mptspiDoneCtx, mptspi_ioc_reset) == 0) {
1523 dprintk((KERN_INFO MYNAM
1524 ": Registered for IOC reset notifications\n"));
1527 return pci_register_driver(&mptspi_driver);
1530 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1531 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1533 * mptspi_exit - Unregisters MPT adapter(s)
1538 pci_unregister_driver(&mptspi_driver);
1540 mpt_reset_deregister(mptspiDoneCtx);
1541 dprintk((KERN_INFO MYNAM
1542 ": Deregistered for IOC reset notifications\n"));
1544 mpt_event_deregister(mptspiDoneCtx);
1545 dprintk((KERN_INFO MYNAM
1546 ": Deregistered for IOC event notifications\n"));
1548 mpt_deregister(mptspiInternalCtx);
1549 mpt_deregister(mptspiTaskCtx);
1550 mpt_deregister(mptspiDoneCtx);
1551 spi_release_transport(mptspi_transport_template);
1554 module_init(mptspi_init);
1555 module_exit(mptspi_exit);