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.
6 * Copyright (c) 1999-2007 LSI Corporation
7 * (mailto:DL-MPTFusionLinux@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/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>
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>
71 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
72 #define my_NAME "Fusion MPT SPI Host driver"
73 #define my_VERSION MPT_LINUX_VERSION_COMMON
74 #define MYNAM "mptspi"
76 MODULE_AUTHOR(MODULEAUTHOR);
77 MODULE_DESCRIPTION(my_NAME);
78 MODULE_LICENSE("GPL");
79 MODULE_VERSION(my_VERSION);
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)");
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 *);
91 static struct scsi_transport_template *mptspi_transport_template = NULL;
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 */
98 * mptspi_setTargetNegoParms - Update the target negotiation parameters
99 * @hd: Pointer to a SCSI Host Structure
100 * @target: per target private data
103 * Update the target negotiation parameters based on the the Inquiry
104 * data, adapter capabilities, and NVRAM settings.
107 mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
108 struct scsi_device *sdev)
110 SpiCfgData *pspi_data = &hd->ioc->spi_data;
111 int id = (int) target->id;
113 u8 width = MPT_NARROW;
114 u8 factor = MPT_ASYNC;
119 target->negoFlags = pspi_data->noQas;
121 if (sdev->scsi_level < SCSI_2) {
124 offset = pspi_data->maxSyncOffset;
125 target->tflags &= ~MPT_TARGET_FLAGS_Q_YES;
127 if (scsi_device_wide(sdev))
130 if (scsi_device_sync(sdev)) {
131 factor = pspi_data->minSyncFactor;
132 if (!scsi_device_dt(sdev))
135 if (!scsi_device_ius(sdev) &&
136 !scsi_device_qas(sdev))
137 factor = MPT_ULTRA160;
139 factor = MPT_ULTRA320;
140 if (scsi_device_qas(sdev)) {
142 printk(MYIOC_s_DEBUG_FMT "Enabling QAS due to "
143 "byte56=%02x on id=%d!\n", hd->ioc->name,
144 scsi_device_qas(sdev), id));
147 if (sdev->type == TYPE_TAPE &&
148 scsi_device_ius(sdev))
149 target->negoFlags |= MPT_TAPE_NEGO_IDP;
152 offset = pspi_data->maxSyncOffset;
154 /* If RAID, never disable QAS
155 * else if non RAID, do not disable
156 * QAS if bit 1 is set
157 * bit 1 QAS support, non-raid only
160 if (target->raidVolume == 1)
168 if (!sdev->tagged_supported)
169 target->tflags &= ~MPT_TARGET_FLAGS_Q_YES;
171 /* Update tflags based on NVRAM settings. (SCSI only)
173 if (pspi_data->nvram && (pspi_data->nvram[id] != MPT_HOST_NVRAM_INVALID)) {
174 nvram = pspi_data->nvram[id];
175 nfactor = (nvram & MPT_NVRAM_SYNC_MASK) >> 8;
178 width = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1;
181 /* Ensure factor is set to the
182 * maximum of: adapter, nvram, inquiry
185 if (nfactor < pspi_data->minSyncFactor )
186 nfactor = pspi_data->minSyncFactor;
188 factor = max(factor, nfactor);
189 if (factor == MPT_ASYNC)
200 /* Make sure data is consistent
202 if ((!width) && (factor < MPT_ULTRA2))
205 /* Save the data to the target structure.
207 target->minSyncFactor = factor;
208 target->maxOffset = offset;
209 target->maxWidth = width;
211 target->tflags |= MPT_TARGET_FLAGS_VALID_NEGO;
213 /* Disable unused features.
216 target->negoFlags |= MPT_TARGET_NO_NEGO_WIDE;
219 target->negoFlags |= MPT_TARGET_NO_NEGO_SYNC;
221 if ( factor > MPT_ULTRA320 )
224 if (noQas && (pspi_data->noQas == 0)) {
225 pspi_data->noQas |= MPT_TARGET_NO_NEGO_QAS;
226 target->negoFlags |= MPT_TARGET_NO_NEGO_QAS;
228 /* Disable QAS in a mixed configuration case
231 ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
232 "Disabling QAS due to noQas=%02x on id=%d!\n", hd->ioc->name, noQas, id));
237 * mptspi_writeIOCPage4 - write IOC Page 4
238 * @hd: Pointer to a SCSI Host Structure
239 * @channel: channel number
240 * @id: write IOC Page4 for this ID & Bus
242 * Return: -EAGAIN if unable to obtain a Message Frame
245 * Remark: We do not wait for a return, write pages sequentially.
248 mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, u8 channel , u8 id)
250 MPT_ADAPTER *ioc = hd->ioc;
252 IOCPage4_t *IOCPage4Ptr;
260 /* Get a MF for this command.
262 if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) {
263 dfailprintk(ioc, printk(MYIOC_s_WARN_FMT
264 "writeIOCPage4 : no msg frames!\n",ioc->name));
268 /* Set the request and the data pointers.
269 * Place data at end of MF.
271 pReq = (Config_t *)mf;
273 req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx);
274 frameOffset = ioc->req_sz - sizeof(IOCPage4_t);
276 /* Complete the request frame (same for all requests).
278 pReq->Action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
280 pReq->ChainOffset = 0;
281 pReq->Function = MPI_FUNCTION_CONFIG;
282 pReq->ExtPageLength = 0;
283 pReq->ExtPageType = 0;
285 for (ii=0; ii < 8; ii++) {
286 pReq->Reserved2[ii] = 0;
289 IOCPage4Ptr = ioc->spi_data.pIocPg4;
290 dataDma = ioc->spi_data.IocPg4_dma;
291 ii = IOCPage4Ptr->ActiveSEP++;
292 IOCPage4Ptr->SEP[ii].SEPTargetID = id;
293 IOCPage4Ptr->SEP[ii].SEPBus = channel;
294 pReq->Header = IOCPage4Ptr->Header;
295 pReq->PageAddress = cpu_to_le32(id | (channel << 8 ));
297 /* Add a SGE to the config request.
299 flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE |
300 (IOCPage4Ptr->Header.PageLength + ii) * 4;
302 mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma);
304 ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
305 "writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n",
306 ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel));
308 mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);
314 * mptspi_initTarget - Target, LUN alloc/free functionality.
315 * @hd: Pointer to MPT_SCSI_HOST structure
316 * @vtarget: per target private data
319 * NOTE: It's only SAFE to call this routine if data points to
320 * sane & valid STANDARD INQUIRY data!
322 * Allocate and initialize memory for this target.
327 mptspi_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget,
328 struct scsi_device *sdev)
331 /* Is LUN supported? If so, upper 2 bits will be 0
332 * in first byte of inquiry data.
334 if (sdev->inq_periph_qual != 0)
340 vtarget->type = sdev->type;
342 if ((sdev->type == TYPE_PROCESSOR) && (hd->ioc->spi_data.Saf_Te)) {
343 /* Treat all Processors as SAF-TE if
344 * command line option is set */
345 vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
346 mptspi_writeIOCPage4(hd, vtarget->channel, vtarget->id);
347 }else if ((sdev->type == TYPE_PROCESSOR) &&
348 !(vtarget->tflags & MPT_TARGET_FLAGS_SAF_TE_ISSUED )) {
349 if (sdev->inquiry_len > 49 ) {
350 if (sdev->inquiry[44] == 'S' &&
351 sdev->inquiry[45] == 'A' &&
352 sdev->inquiry[46] == 'F' &&
353 sdev->inquiry[47] == '-' &&
354 sdev->inquiry[48] == 'T' &&
355 sdev->inquiry[49] == 'E' ) {
356 vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
357 mptspi_writeIOCPage4(hd, vtarget->channel, vtarget->id);
361 mptspi_setTargetNegoParms(hd, vtarget, sdev);
365 * mptspi_is_raid - Determines whether target is belonging to volume
366 * @hd: Pointer to a SCSI HOST structure
367 * @id: target device id
375 mptspi_is_raid(struct _MPT_SCSI_HOST *hd, u32 id)
379 if (!hd->ioc->raid_data.pIocPg2)
382 if (!hd->ioc->raid_data.pIocPg2->NumActiveVolumes)
384 for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
385 if (hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == id) {
395 static int mptspi_target_alloc(struct scsi_target *starget)
397 struct Scsi_Host *shost = dev_to_shost(&starget->dev);
398 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
404 vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
408 vtarget->ioc_id = hd->ioc->id;
409 vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
410 vtarget->id = (u8)starget->id;
411 vtarget->channel = (u8)starget->channel;
412 vtarget->starget = starget;
413 starget->hostdata = vtarget;
415 if (starget->channel == 1) {
416 if (mptscsih_is_phys_disk(hd->ioc, 0, starget->id) == 0)
418 vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT;
419 /* The real channel for this device is zero */
420 vtarget->channel = 0;
421 /* The actual physdisknum (for RAID passthrough) */
422 vtarget->id = mptscsih_raid_id_to_num(hd->ioc, 0,
426 if (starget->channel == 0 &&
427 mptspi_is_raid(hd, starget->id)) {
428 vtarget->raidVolume = 1;
429 ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
430 "RAID Volume @ channel=%d id=%d\n", hd->ioc->name, starget->channel,
434 if (hd->ioc->spi_data.nvram &&
435 hd->ioc->spi_data.nvram[starget->id] != MPT_HOST_NVRAM_INVALID) {
436 u32 nvram = hd->ioc->spi_data.nvram[starget->id];
437 spi_min_period(starget) = (nvram & MPT_NVRAM_SYNC_MASK) >> MPT_NVRAM_SYNC_SHIFT;
438 spi_max_width(starget) = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1;
440 spi_min_period(starget) = hd->ioc->spi_data.minSyncFactor;
441 spi_max_width(starget) = hd->ioc->spi_data.maxBusWidth;
443 spi_max_offset(starget) = hd->ioc->spi_data.maxSyncOffset;
445 spi_offset(starget) = 0;
446 mptspi_write_width(starget, 0);
452 mptspi_target_destroy(struct scsi_target *starget)
454 if (starget->hostdata)
455 kfree(starget->hostdata);
456 starget->hostdata = NULL;
460 * mptspi_print_write_nego - negotiation parameters debug info that is being sent
461 * @hd: Pointer to a SCSI HOST structure
462 * @starget: SCSI target
463 * @ii: negotiation parameters
467 mptspi_print_write_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
469 ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d Requested = 0x%08x"
470 " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
471 hd->ioc->name, starget->id, ii,
472 ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
473 ((ii >> 8) & 0xFF), ((ii >> 16) & 0xFF),
474 ii & MPI_SCSIDEVPAGE0_NP_IU ? "IU ": "",
475 ii & MPI_SCSIDEVPAGE0_NP_DT ? "DT ": "",
476 ii & MPI_SCSIDEVPAGE0_NP_QAS ? "QAS ": "",
477 ii & MPI_SCSIDEVPAGE0_NP_HOLD_MCS ? "HOLDMCS ": "",
478 ii & MPI_SCSIDEVPAGE0_NP_WR_FLOW ? "WRFLOW ": "",
479 ii & MPI_SCSIDEVPAGE0_NP_RD_STRM ? "RDSTRM ": "",
480 ii & MPI_SCSIDEVPAGE0_NP_RTI ? "RTI ": "",
481 ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP ": ""));
485 * mptspi_print_read_nego - negotiation parameters debug info that is being read
486 * @hd: Pointer to a SCSI HOST structure
487 * @starget: SCSI target
488 * @ii: negotiation parameters
492 mptspi_print_read_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
494 ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d Read = 0x%08x"
495 " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
496 hd->ioc->name, starget->id, ii,
497 ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
498 ((ii >> 8) & 0xFF), ((ii >> 16) & 0xFF),
499 ii & MPI_SCSIDEVPAGE0_NP_IU ? "IU ": "",
500 ii & MPI_SCSIDEVPAGE0_NP_DT ? "DT ": "",
501 ii & MPI_SCSIDEVPAGE0_NP_QAS ? "QAS ": "",
502 ii & MPI_SCSIDEVPAGE0_NP_HOLD_MCS ? "HOLDMCS ": "",
503 ii & MPI_SCSIDEVPAGE0_NP_WR_FLOW ? "WRFLOW ": "",
504 ii & MPI_SCSIDEVPAGE0_NP_RD_STRM ? "RDSTRM ": "",
505 ii & MPI_SCSIDEVPAGE0_NP_RTI ? "RTI ": "",
506 ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP ": ""));
509 static int mptspi_read_spi_device_pg0(struct scsi_target *starget,
510 struct _CONFIG_PAGE_SCSI_DEVICE_0 *pass_pg0)
512 struct Scsi_Host *shost = dev_to_shost(&starget->dev);
513 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
514 struct _MPT_ADAPTER *ioc = hd->ioc;
515 struct _CONFIG_PAGE_SCSI_DEVICE_0 *pg0;
518 struct _x_config_parms cfg;
519 struct _CONFIG_PAGE_HEADER hdr;
522 /* No SPI parameters for RAID devices */
523 if (starget->channel == 0 &&
524 mptspi_is_raid(hd, starget->id))
527 size = ioc->spi_data.sdp0length * 4;
529 if (ioc->spi_data.sdp0length & 1)
534 pg0 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg0_dma, GFP_KERNEL);
536 starget_printk(MYIOC_s_ERR_FMT, starget,
537 "dma_alloc_coherent for parameters failed\n", ioc->name);
541 memset(&hdr, 0, sizeof(hdr));
543 hdr.PageVersion = ioc->spi_data.sdp0version;
544 hdr.PageLength = ioc->spi_data.sdp0length;
546 hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
548 memset(&cfg, 0, sizeof(cfg));
550 cfg.cfghdr.hdr = &hdr;
551 cfg.physAddr = pg0_dma;
552 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
554 cfg.pageAddr = starget->id;
556 if (mpt_config(ioc, &cfg)) {
557 starget_printk(MYIOC_s_ERR_FMT, starget, "mpt_config failed\n", ioc->name);
561 memcpy(pass_pg0, pg0, size);
563 mptspi_print_read_nego(hd, starget, le32_to_cpu(pg0->NegotiatedParameters));
566 dma_free_coherent(&ioc->pcidev->dev, size, pg0, pg0_dma);
570 static u32 mptspi_getRP(struct scsi_target *starget)
574 nego |= spi_iu(starget) ? MPI_SCSIDEVPAGE1_RP_IU : 0;
575 nego |= spi_dt(starget) ? MPI_SCSIDEVPAGE1_RP_DT : 0;
576 nego |= spi_qas(starget) ? MPI_SCSIDEVPAGE1_RP_QAS : 0;
577 nego |= spi_hold_mcs(starget) ? MPI_SCSIDEVPAGE1_RP_HOLD_MCS : 0;
578 nego |= spi_wr_flow(starget) ? MPI_SCSIDEVPAGE1_RP_WR_FLOW : 0;
579 nego |= spi_rd_strm(starget) ? MPI_SCSIDEVPAGE1_RP_RD_STRM : 0;
580 nego |= spi_rti(starget) ? MPI_SCSIDEVPAGE1_RP_RTI : 0;
581 nego |= spi_pcomp_en(starget) ? MPI_SCSIDEVPAGE1_RP_PCOMP_EN : 0;
583 nego |= (spi_period(starget) << MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD) & MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK;
584 nego |= (spi_offset(starget) << MPI_SCSIDEVPAGE1_RP_SHIFT_MAX_SYNC_OFFSET) & MPI_SCSIDEVPAGE1_RP_MAX_SYNC_OFFSET_MASK;
585 nego |= spi_width(starget) ? MPI_SCSIDEVPAGE1_RP_WIDE : 0;
590 static void mptspi_read_parameters(struct scsi_target *starget)
593 struct _CONFIG_PAGE_SCSI_DEVICE_0 pg0;
595 mptspi_read_spi_device_pg0(starget, &pg0);
597 nego = le32_to_cpu(pg0.NegotiatedParameters);
599 spi_iu(starget) = (nego & MPI_SCSIDEVPAGE0_NP_IU) ? 1 : 0;
600 spi_dt(starget) = (nego & MPI_SCSIDEVPAGE0_NP_DT) ? 1 : 0;
601 spi_qas(starget) = (nego & MPI_SCSIDEVPAGE0_NP_QAS) ? 1 : 0;
602 spi_wr_flow(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WR_FLOW) ? 1 : 0;
603 spi_rd_strm(starget) = (nego & MPI_SCSIDEVPAGE0_NP_RD_STRM) ? 1 : 0;
604 spi_rti(starget) = (nego & MPI_SCSIDEVPAGE0_NP_RTI) ? 1 : 0;
605 spi_pcomp_en(starget) = (nego & MPI_SCSIDEVPAGE0_NP_PCOMP_EN) ? 1 : 0;
606 spi_hold_mcs(starget) = (nego & MPI_SCSIDEVPAGE0_NP_HOLD_MCS) ? 1 : 0;
607 spi_period(starget) = (nego & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK) >> MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_PERIOD;
608 spi_offset(starget) = (nego & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK) >> MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_OFFSET;
609 spi_width(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WIDE) ? 1 : 0;
613 mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
615 MpiRaidActionRequest_t *pReq;
618 /* Get and Populate a free Frame
620 if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) {
621 ddvprintk(hd->ioc, printk(MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n",
625 pReq = (MpiRaidActionRequest_t *)mf;
627 pReq->Action = MPI_RAID_ACTION_QUIESCE_PHYS_IO;
629 pReq->Action = MPI_RAID_ACTION_ENABLE_PHYS_IO;
631 pReq->ChainOffset = 0;
632 pReq->Function = MPI_FUNCTION_RAID_ACTION;
634 pReq->VolumeBus = channel;
635 pReq->PhysDiskNum = 0;
638 pReq->ActionDataWord = 0; /* Reserved for this action */
640 mpt_add_sge((char *)&pReq->ActionDataSGE,
641 MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1);
643 ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "RAID Volume action=%x channel=%d id=%d\n",
644 hd->ioc->name, pReq->Action, channel, id));
647 hd->timer.expires = jiffies + HZ*10; /* 10 second timeout */
648 hd->scandv_wait_done = 0;
650 /* Save cmd pointer, for resource free if timeout or
655 add_timer(&hd->timer);
656 mpt_put_msg_frame(hd->ioc->InternalCtx, hd->ioc, mf);
657 wait_event(hd->scandv_waitq, hd->scandv_wait_done);
659 if ((hd->pLocal == NULL) || (hd->pLocal->completion != 0))
665 static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
666 struct scsi_device *sdev)
668 VirtTarget *vtarget = scsi_target(sdev)->hostdata;
670 /* no DV on RAID devices */
671 if (sdev->channel == 0 &&
672 mptspi_is_raid(hd, sdev->id))
675 /* If this is a piece of a RAID, then quiesce first */
676 if (sdev->channel == 1 &&
677 mptscsih_quiesce_raid(hd, 1, vtarget->channel, vtarget->id) < 0) {
678 starget_printk(MYIOC_s_ERR_FMT, scsi_target(sdev),
679 "Integrated RAID quiesce failed\n", hd->ioc->name);
683 hd->spi_pending |= (1 << sdev->id);
685 hd->spi_pending &= ~(1 << sdev->id);
687 if (sdev->channel == 1 &&
688 mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0)
689 starget_printk(MYIOC_s_ERR_FMT, scsi_target(sdev),
690 "Integrated RAID resume failed\n", hd->ioc->name);
692 mptspi_read_parameters(sdev->sdev_target);
693 spi_display_xfer_agreement(sdev->sdev_target);
694 mptspi_read_parameters(sdev->sdev_target);
697 static int mptspi_slave_alloc(struct scsi_device *sdev)
699 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)sdev->host->hostdata;
702 struct scsi_target *starget;
704 if (sdev->channel == 1 &&
705 mptscsih_is_phys_disk(hd->ioc, 0, sdev->id) == 0)
708 vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
710 printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
711 hd->ioc->name, sizeof(VirtDevice));
715 vdevice->lun = sdev->lun;
716 sdev->hostdata = vdevice;
718 starget = scsi_target(sdev);
719 vtarget = starget->hostdata;
720 vdevice->vtarget = vtarget;
723 if (sdev->channel == 1)
724 sdev->no_uld_attach = 1;
729 static int mptspi_slave_configure(struct scsi_device *sdev)
731 struct _MPT_SCSI_HOST *hd =
732 (struct _MPT_SCSI_HOST *)sdev->host->hostdata;
733 VirtTarget *vtarget = scsi_target(sdev)->hostdata;
736 mptspi_initTarget(hd, vtarget, sdev);
738 ret = mptscsih_slave_configure(sdev);
743 ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d min_period=0x%02x"
744 " max_offset=0x%02x max_width=%d\n", hd->ioc->name,
745 sdev->id, spi_min_period(scsi_target(sdev)),
746 spi_max_offset(scsi_target(sdev)),
747 spi_max_width(scsi_target(sdev))));
749 if ((sdev->channel == 1 ||
750 !(mptspi_is_raid(hd, sdev->id))) &&
751 !spi_initial_dv(sdev->sdev_target))
752 mptspi_dv_device(hd, sdev);
758 mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
760 struct _MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata;
761 VirtDevice *vdevice = SCpnt->device->hostdata;
763 if (!vdevice || !vdevice->vtarget) {
764 SCpnt->result = DID_NO_CONNECT << 16;
769 if (SCpnt->device->channel == 1 &&
770 mptscsih_is_phys_disk(hd->ioc, 0, SCpnt->device->id) == 0) {
771 SCpnt->result = DID_NO_CONNECT << 16;
776 if (spi_dv_pending(scsi_target(SCpnt->device)))
777 ddvprintk(hd->ioc, scsi_print_command(SCpnt));
779 return mptscsih_qcmd(SCpnt,done);
782 static void mptspi_slave_destroy(struct scsi_device *sdev)
784 struct scsi_target *starget = scsi_target(sdev);
785 VirtTarget *vtarget = starget->hostdata;
786 VirtDevice *vdevice = sdev->hostdata;
788 /* Will this be the last lun on a non-raid device? */
789 if (vtarget->num_luns == 1 && vdevice->configured_lun) {
790 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
793 pg1.RequestedParameters = 0;
795 pg1.Configuration = 0;
797 mptspi_write_spi_device_pg1(starget, &pg1);
800 mptscsih_slave_destroy(sdev);
803 static struct scsi_host_template mptspi_driver_template = {
804 .module = THIS_MODULE,
805 .proc_name = "mptspi",
806 .proc_info = mptscsih_proc_info,
807 .name = "MPT SPI Host",
808 .info = mptscsih_info,
809 .queuecommand = mptspi_qcmd,
810 .target_alloc = mptspi_target_alloc,
811 .slave_alloc = mptspi_slave_alloc,
812 .slave_configure = mptspi_slave_configure,
813 .target_destroy = mptspi_target_destroy,
814 .slave_destroy = mptspi_slave_destroy,
815 .change_queue_depth = mptscsih_change_queue_depth,
816 .eh_abort_handler = mptscsih_abort,
817 .eh_device_reset_handler = mptscsih_dev_reset,
818 .eh_bus_reset_handler = mptscsih_bus_reset,
819 .eh_host_reset_handler = mptscsih_host_reset,
820 .bios_param = mptscsih_bios_param,
821 .can_queue = MPT_SCSI_CAN_QUEUE,
823 .sg_tablesize = MPT_SCSI_SG_DEPTH,
826 .use_clustering = ENABLE_CLUSTERING,
827 .shost_attrs = mptscsih_host_attrs,
830 static int mptspi_write_spi_device_pg1(struct scsi_target *starget,
831 struct _CONFIG_PAGE_SCSI_DEVICE_1 *pass_pg1)
833 struct Scsi_Host *shost = dev_to_shost(&starget->dev);
834 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
835 struct _MPT_ADAPTER *ioc = hd->ioc;
836 struct _CONFIG_PAGE_SCSI_DEVICE_1 *pg1;
839 struct _x_config_parms cfg;
840 struct _CONFIG_PAGE_HEADER hdr;
843 /* don't allow updating nego parameters on RAID devices */
844 if (starget->channel == 0 &&
845 mptspi_is_raid(hd, starget->id))
848 size = ioc->spi_data.sdp1length * 4;
850 pg1 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg1_dma, GFP_KERNEL);
852 starget_printk(MYIOC_s_ERR_FMT, starget,
853 "dma_alloc_coherent for parameters failed\n", ioc->name);
857 memset(&hdr, 0, sizeof(hdr));
859 hdr.PageVersion = ioc->spi_data.sdp1version;
860 hdr.PageLength = ioc->spi_data.sdp1length;
862 hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
864 memset(&cfg, 0, sizeof(cfg));
866 cfg.cfghdr.hdr = &hdr;
867 cfg.physAddr = pg1_dma;
868 cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
870 cfg.pageAddr = starget->id;
872 memcpy(pg1, pass_pg1, size);
874 pg1->Header.PageVersion = hdr.PageVersion;
875 pg1->Header.PageLength = hdr.PageLength;
876 pg1->Header.PageNumber = hdr.PageNumber;
877 pg1->Header.PageType = hdr.PageType;
879 mptspi_print_write_nego(hd, starget, le32_to_cpu(pg1->RequestedParameters));
881 if (mpt_config(ioc, &cfg)) {
882 starget_printk(MYIOC_s_ERR_FMT, starget,
883 "mpt_config failed\n", ioc->name);
889 dma_free_coherent(&ioc->pcidev->dev, size, pg1, pg1_dma);
893 static void mptspi_write_offset(struct scsi_target *starget, int offset)
895 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
904 if (spi_offset(starget) == -1)
905 mptspi_read_parameters(starget);
907 spi_offset(starget) = offset;
909 nego = mptspi_getRP(starget);
911 pg1.RequestedParameters = cpu_to_le32(nego);
913 pg1.Configuration = 0;
915 mptspi_write_spi_device_pg1(starget, &pg1);
918 static void mptspi_write_period(struct scsi_target *starget, int period)
920 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
929 if (spi_period(starget) == -1)
930 mptspi_read_parameters(starget);
935 } else if (period == 9) {
939 spi_period(starget) = period;
941 nego = mptspi_getRP(starget);
943 pg1.RequestedParameters = cpu_to_le32(nego);
945 pg1.Configuration = 0;
947 mptspi_write_spi_device_pg1(starget, &pg1);
950 static void mptspi_write_dt(struct scsi_target *starget, int dt)
952 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
955 if (spi_period(starget) == -1)
956 mptspi_read_parameters(starget);
958 if (!dt && spi_period(starget) < 10)
959 spi_period(starget) = 10;
961 spi_dt(starget) = dt;
963 nego = mptspi_getRP(starget);
966 pg1.RequestedParameters = cpu_to_le32(nego);
968 pg1.Configuration = 0;
970 mptspi_write_spi_device_pg1(starget, &pg1);
973 static void mptspi_write_iu(struct scsi_target *starget, int iu)
975 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
978 if (spi_period(starget) == -1)
979 mptspi_read_parameters(starget);
981 if (!iu && spi_period(starget) < 9)
982 spi_period(starget) = 9;
984 spi_iu(starget) = iu;
986 nego = mptspi_getRP(starget);
988 pg1.RequestedParameters = cpu_to_le32(nego);
990 pg1.Configuration = 0;
992 mptspi_write_spi_device_pg1(starget, &pg1);
995 #define MPTSPI_SIMPLE_TRANSPORT_PARM(parm) \
996 static void mptspi_write_##parm(struct scsi_target *starget, int parm)\
998 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; \
1001 spi_##parm(starget) = parm; \
1003 nego = mptspi_getRP(starget); \
1005 pg1.RequestedParameters = cpu_to_le32(nego); \
1007 pg1.Configuration = 0; \
1009 mptspi_write_spi_device_pg1(starget, &pg1); \
1012 MPTSPI_SIMPLE_TRANSPORT_PARM(rd_strm)
1013 MPTSPI_SIMPLE_TRANSPORT_PARM(wr_flow)
1014 MPTSPI_SIMPLE_TRANSPORT_PARM(rti)
1015 MPTSPI_SIMPLE_TRANSPORT_PARM(hold_mcs)
1016 MPTSPI_SIMPLE_TRANSPORT_PARM(pcomp_en)
1018 static void mptspi_write_qas(struct scsi_target *starget, int qas)
1020 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
1021 struct Scsi_Host *shost = dev_to_shost(&starget->dev);
1022 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
1023 VirtTarget *vtarget = starget->hostdata;
1026 if ((vtarget->negoFlags & MPT_TARGET_NO_NEGO_QAS) ||
1027 hd->ioc->spi_data.noQas)
1028 spi_qas(starget) = 0;
1030 spi_qas(starget) = qas;
1032 nego = mptspi_getRP(starget);
1034 pg1.RequestedParameters = cpu_to_le32(nego);
1036 pg1.Configuration = 0;
1038 mptspi_write_spi_device_pg1(starget, &pg1);
1041 static void mptspi_write_width(struct scsi_target *starget, int width)
1043 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
1047 spi_dt(starget) = 0;
1048 if (spi_period(starget) < 10)
1049 spi_period(starget) = 10;
1052 spi_width(starget) = width;
1054 nego = mptspi_getRP(starget);
1056 pg1.RequestedParameters = cpu_to_le32(nego);
1058 pg1.Configuration = 0;
1060 mptspi_write_spi_device_pg1(starget, &pg1);
1063 struct work_queue_wrapper {
1064 struct work_struct work;
1065 struct _MPT_SCSI_HOST *hd;
1069 static void mpt_work_wrapper(struct work_struct *work)
1071 struct work_queue_wrapper *wqw =
1072 container_of(work, struct work_queue_wrapper, work);
1073 struct _MPT_SCSI_HOST *hd = wqw->hd;
1074 struct Scsi_Host *shost = hd->ioc->sh;
1075 struct scsi_device *sdev;
1076 int disk = wqw->disk;
1077 struct _CONFIG_PAGE_IOC_3 *pg3;
1081 mpt_findImVolumes(hd->ioc);
1082 pg3 = hd->ioc->raid_data.pIocPg3;
1086 shost_for_each_device(sdev,shost) {
1087 struct scsi_target *starget = scsi_target(sdev);
1088 VirtTarget *vtarget = starget->hostdata;
1090 /* only want to search RAID components */
1091 if (sdev->channel != 1)
1094 /* The id is the raid PhysDiskNum, even if
1095 * starget->id is the actual target address */
1096 if(vtarget->id != disk)
1099 starget_printk(MYIOC_s_INFO_FMT, vtarget->starget,
1100 "Integrated RAID requests DV of new device\n", hd->ioc->name);
1101 mptspi_dv_device(hd, sdev);
1103 shost_printk(MYIOC_s_INFO_FMT, shost,
1104 "Integrated RAID detects new device %d\n", hd->ioc->name, disk);
1105 scsi_scan_target(&hd->ioc->sh->shost_gendev, 1, disk, 0, 1);
1109 static void mpt_dv_raid(struct _MPT_SCSI_HOST *hd, int disk)
1111 struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC);
1114 shost_printk(MYIOC_s_ERR_FMT, hd->ioc->sh,
1115 "Failed to act on RAID event for physical disk %d\n",
1116 hd->ioc->name, disk);
1119 INIT_WORK(&wqw->work, mpt_work_wrapper);
1123 schedule_work(&wqw->work);
1127 mptspi_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
1129 u8 event = le32_to_cpu(pEvReply->Event) & 0xFF;
1130 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
1132 if (hd && event == MPI_EVENT_INTEGRATED_RAID) {
1134 = (le32_to_cpu(pEvReply->Data[0]) & 0x00FF0000) >> 16;
1136 if (reason == MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED) {
1137 int disk = (le32_to_cpu(pEvReply->Data[0]) & 0xFF000000) >> 24;
1138 mpt_dv_raid(hd, disk);
1141 return mptscsih_event_process(ioc, pEvReply);
1145 mptspi_deny_binding(struct scsi_target *starget)
1147 struct _MPT_SCSI_HOST *hd =
1148 (struct _MPT_SCSI_HOST *)dev_to_shost(starget->dev.parent)->hostdata;
1149 return ((mptspi_is_raid(hd, starget->id)) &&
1150 starget->channel == 0) ? 1 : 0;
1153 static struct spi_function_template mptspi_transport_functions = {
1154 .get_offset = mptspi_read_parameters,
1155 .set_offset = mptspi_write_offset,
1157 .get_period = mptspi_read_parameters,
1158 .set_period = mptspi_write_period,
1160 .get_width = mptspi_read_parameters,
1161 .set_width = mptspi_write_width,
1163 .get_iu = mptspi_read_parameters,
1164 .set_iu = mptspi_write_iu,
1166 .get_dt = mptspi_read_parameters,
1167 .set_dt = mptspi_write_dt,
1169 .get_qas = mptspi_read_parameters,
1170 .set_qas = mptspi_write_qas,
1172 .get_wr_flow = mptspi_read_parameters,
1173 .set_wr_flow = mptspi_write_wr_flow,
1175 .get_rd_strm = mptspi_read_parameters,
1176 .set_rd_strm = mptspi_write_rd_strm,
1178 .get_rti = mptspi_read_parameters,
1179 .set_rti = mptspi_write_rti,
1181 .get_pcomp_en = mptspi_read_parameters,
1182 .set_pcomp_en = mptspi_write_pcomp_en,
1184 .get_hold_mcs = mptspi_read_parameters,
1185 .set_hold_mcs = mptspi_write_hold_mcs,
1187 .deny_binding = mptspi_deny_binding,
1190 /****************************************************************************
1191 * Supported hardware
1194 static struct pci_device_id mptspi_pci_table[] = {
1195 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1030,
1196 PCI_ANY_ID, PCI_ANY_ID },
1197 { PCI_VENDOR_ID_ATTO, MPI_MANUFACTPAGE_DEVID_53C1030,
1198 PCI_ANY_ID, PCI_ANY_ID },
1199 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1035,
1200 PCI_ANY_ID, PCI_ANY_ID },
1201 {0} /* Terminating entry */
1203 MODULE_DEVICE_TABLE(pci, mptspi_pci_table);
1207 * renegotiate for a given target
1210 mptspi_dv_renegotiate_work(struct work_struct *work)
1212 struct work_queue_wrapper *wqw =
1213 container_of(work, struct work_queue_wrapper, work);
1214 struct _MPT_SCSI_HOST *hd = wqw->hd;
1215 struct scsi_device *sdev;
1216 struct scsi_target *starget;
1217 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
1222 if (hd->spi_pending) {
1223 shost_for_each_device(sdev, hd->ioc->sh) {
1224 if (hd->spi_pending & (1 << sdev->id))
1226 starget = scsi_target(sdev);
1227 nego = mptspi_getRP(starget);
1228 pg1.RequestedParameters = cpu_to_le32(nego);
1230 pg1.Configuration = 0;
1231 mptspi_write_spi_device_pg1(starget, &pg1);
1234 shost_for_each_device(sdev, hd->ioc->sh)
1235 mptspi_dv_device(hd, sdev);
1240 mptspi_dv_renegotiate(struct _MPT_SCSI_HOST *hd)
1242 struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC);
1247 INIT_WORK(&wqw->work, mptspi_dv_renegotiate_work);
1250 schedule_work(&wqw->work);
1254 * spi module reset handler
1257 mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
1259 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
1262 rc = mptscsih_ioc_reset(ioc, reset_phase);
1264 if (reset_phase == MPT_IOC_POST_RESET)
1265 mptspi_dv_renegotiate(hd);
1272 * spi module resume handler
1275 mptspi_resume(struct pci_dev *pdev)
1277 MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
1278 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
1281 rc = mptscsih_resume(pdev);
1282 mptspi_dv_renegotiate(hd);
1288 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1289 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1291 * mptspi_probe - Installs scsi devices per bus.
1292 * @pdev: Pointer to pci_dev structure
1294 * Returns 0 for success, non-zero for failure.
1298 mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1300 struct Scsi_Host *sh;
1303 unsigned long flags;
1311 if ((r = mpt_attach(pdev,id)) != 0)
1314 ioc = pci_get_drvdata(pdev);
1315 ioc->DoneCtx = mptspiDoneCtx;
1316 ioc->TaskCtx = mptspiTaskCtx;
1317 ioc->InternalCtx = mptspiInternalCtx;
1319 /* Added sanity check on readiness of the MPT adapter.
1321 if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
1322 printk(MYIOC_s_WARN_FMT
1323 "Skipping because it's not operational!\n",
1326 goto out_mptspi_probe;
1330 printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
1333 goto out_mptspi_probe;
1336 /* Sanity check - ensure at least 1 port is INITIATOR capable
1339 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
1340 if (ioc->pfacts[ii].ProtocolFlags &
1341 MPI_PORTFACTS_PROTOCOL_INITIATOR)
1346 printk(MYIOC_s_WARN_FMT
1347 "Skipping ioc=%p because SCSI Initiator mode is NOT enabled!\n",
1352 sh = scsi_host_alloc(&mptspi_driver_template, sizeof(MPT_SCSI_HOST));
1355 printk(MYIOC_s_WARN_FMT
1356 "Unable to register controller with SCSI subsystem\n",
1359 goto out_mptspi_probe;
1362 spin_lock_irqsave(&ioc->FreeQlock, flags);
1364 /* Attach the SCSI Host to the IOC structure
1372 /* set 16 byte cdb's */
1373 sh->max_cmd_len = 16;
1375 /* Yikes! This is important!
1376 * Otherwise, by default, linux
1377 * only scans target IDs 0-7!
1378 * pfactsN->MaxDevices unreliable
1379 * (not supported in early
1380 * versions of the FW).
1381 * max_id = 1 + actual max id,
1382 * max_lun = 1 + actual last lun,
1385 sh->max_id = ioc->devices_per_bus;
1387 sh->max_lun = MPT_LAST_LUN + 1;
1389 * If RAID Firmware Detected, setup virtual channel
1391 if (ioc->ir_firmware)
1392 sh->max_channel = 1;
1394 sh->max_channel = 0;
1395 sh->this_id = ioc->pfacts[0].PortSCSIID;
1399 sh->unique_id = ioc->id;
1401 /* Verify that we won't exceed the maximum
1402 * number of chain buffers
1403 * We can optimize: ZZ = req_sz/sizeof(SGE)
1405 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
1406 * + (req_sz - 64)/sizeof(SGE)
1407 * A slightly different algorithm is required for
1410 scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
1411 if (sizeof(dma_addr_t) == sizeof(u64)) {
1412 numSGE = (scale - 1) *
1413 (ioc->facts.MaxChainDepth-1) + scale +
1414 (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
1417 numSGE = 1 + (scale - 1) *
1418 (ioc->facts.MaxChainDepth-1) + scale +
1419 (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
1423 if (numSGE < sh->sg_tablesize) {
1424 /* Reset this value */
1425 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1426 "Resetting sg_tablesize to %d from %d\n",
1427 ioc->name, numSGE, sh->sg_tablesize));
1428 sh->sg_tablesize = numSGE;
1431 spin_unlock_irqrestore(&ioc->FreeQlock, flags);
1433 hd = (MPT_SCSI_HOST *) sh->hostdata;
1436 /* SCSI needs scsi_cmnd lookup table!
1437 * (with size equal to req_depth*PtrSz!)
1439 hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
1440 if (!hd->ScsiLookup) {
1442 goto out_mptspi_probe;
1445 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
1446 ioc->name, hd->ScsiLookup));
1448 /* Clear the TM flags
1451 hd->tmState = TM_STATE_NONE;
1452 hd->resetPending = 0;
1453 hd->abortSCpnt = NULL;
1455 /* Clear the pointer used to store
1456 * single-threaded commands, i.e., those
1457 * issued during a bus scan, dv and
1458 * configuration pages.
1462 /* Initialize this SCSI Hosts' timers
1463 * To use, set the timer expires field
1466 init_timer(&hd->timer);
1467 hd->timer.data = (unsigned long) hd;
1468 hd->timer.function = mptscsih_timer_expired;
1470 ioc->spi_data.Saf_Te = mpt_saf_te;
1472 hd->negoNvram = MPT_SCSICFG_USE_NVRAM;
1473 ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1477 ioc->spi_data.noQas = 0;
1479 init_waitqueue_head(&hd->scandv_waitq);
1480 hd->scandv_wait_done = 0;
1481 hd->last_queue_full = 0;
1482 hd->spi_pending = 0;
1484 /* Some versions of the firmware don't support page 0; without
1485 * that we can't get the parameters */
1486 if (hd->ioc->spi_data.sdp0length != 0)
1487 sh->transportt = mptspi_transport_template;
1489 error = scsi_add_host (sh, &ioc->pcidev->dev);
1491 dprintk(ioc, printk(MYIOC_s_ERR_FMT
1492 "scsi_add_host failed\n", ioc->name));
1493 goto out_mptspi_probe;
1497 * issue internal bus reset
1499 if (ioc->spi_data.bus_reset)
1500 mptscsih_TMHandler(hd,
1501 MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
1509 mptscsih_remove(pdev);
1513 static struct pci_driver mptspi_driver = {
1515 .id_table = mptspi_pci_table,
1516 .probe = mptspi_probe,
1517 .remove = __devexit_p(mptscsih_remove),
1518 .shutdown = mptscsih_shutdown,
1520 .suspend = mptscsih_suspend,
1521 .resume = mptspi_resume,
1525 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1527 * mptspi_init - Register MPT adapter(s) as SCSI host(s) with SCSI mid-layer.
1529 * Returns 0 for success, non-zero for failure.
1536 show_mptmod_ver(my_NAME, my_VERSION);
1538 mptspi_transport_template = spi_attach_transport(&mptspi_transport_functions);
1539 if (!mptspi_transport_template)
1542 mptspiDoneCtx = mpt_register(mptscsih_io_done, MPTSPI_DRIVER);
1543 mptspiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSPI_DRIVER);
1544 mptspiInternalCtx = mpt_register(mptscsih_scandv_complete, MPTSPI_DRIVER);
1546 mpt_event_register(mptspiDoneCtx, mptspi_event_process);
1547 mpt_reset_register(mptspiDoneCtx, mptspi_ioc_reset);
1549 error = pci_register_driver(&mptspi_driver);
1551 spi_release_transport(mptspi_transport_template);
1556 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1557 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1559 * mptspi_exit - Unregisters MPT adapter(s)
1564 pci_unregister_driver(&mptspi_driver);
1566 mpt_reset_deregister(mptspiDoneCtx);
1567 mpt_event_deregister(mptspiDoneCtx);
1569 mpt_deregister(mptspiInternalCtx);
1570 mpt_deregister(mptspiTaskCtx);
1571 mpt_deregister(mptspiDoneCtx);
1572 spi_release_transport(mptspi_transport_template);
1575 module_init(mptspi_init);
1576 module_exit(mptspi_exit);