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@lsil.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/sched.h>
58 #include <linux/workqueue.h>
59 #include <linux/raid_class.h>
61 #include <scsi/scsi.h>
62 #include <scsi/scsi_cmnd.h>
63 #include <scsi/scsi_device.h>
64 #include <scsi/scsi_host.h>
65 #include <scsi/scsi_tcq.h>
66 #include <scsi/scsi_transport.h>
67 #include <scsi/scsi_transport_spi.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 */
100 * mptspi_is_raid - Determines whether target is belonging to volume
101 * @hd: Pointer to a SCSI HOST structure
102 * @id: target device id
110 mptspi_is_raid(struct _MPT_SCSI_HOST *hd, u32 id)
114 if (!hd->ioc->raid_data.pIocPg2)
117 if (!hd->ioc->raid_data.pIocPg2->NumActiveVolumes)
119 for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
120 if (hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == id) {
130 static int mptspi_target_alloc(struct scsi_target *starget)
132 struct Scsi_Host *shost = dev_to_shost(&starget->dev);
133 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
139 vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
143 vtarget->ioc_id = hd->ioc->id;
144 vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
145 vtarget->id = (u8)starget->id;
146 vtarget->channel = (u8)starget->channel;
147 vtarget->starget = starget;
148 starget->hostdata = vtarget;
150 if (starget->channel == 1) {
151 if (mptscsih_is_phys_disk(hd->ioc, 0, starget->id) == 0)
153 vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT;
154 /* The real channel for this device is zero */
155 vtarget->channel = 0;
156 /* The actual physdisknum (for RAID passthrough) */
157 vtarget->id = mptscsih_raid_id_to_num(hd->ioc, 0,
161 if (starget->channel == 0 &&
162 mptspi_is_raid(hd, starget->id)) {
163 vtarget->raidVolume = 1;
165 "RAID Volume @ channel=%d id=%d\n", starget->channel,
169 if (hd->ioc->spi_data.nvram &&
170 hd->ioc->spi_data.nvram[starget->id] != MPT_HOST_NVRAM_INVALID) {
171 u32 nvram = hd->ioc->spi_data.nvram[starget->id];
172 spi_min_period(starget) = (nvram & MPT_NVRAM_SYNC_MASK) >> MPT_NVRAM_SYNC_SHIFT;
173 spi_max_width(starget) = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1;
175 spi_min_period(starget) = hd->ioc->spi_data.minSyncFactor;
176 spi_max_width(starget) = hd->ioc->spi_data.maxBusWidth;
178 spi_max_offset(starget) = hd->ioc->spi_data.maxSyncOffset;
180 spi_offset(starget) = 0;
181 mptspi_write_width(starget, 0);
187 mptspi_target_destroy(struct scsi_target *starget)
189 if (starget->hostdata)
190 kfree(starget->hostdata);
191 starget->hostdata = NULL;
194 static int mptspi_read_spi_device_pg0(struct scsi_target *starget,
195 struct _CONFIG_PAGE_SCSI_DEVICE_0 *pass_pg0)
197 struct Scsi_Host *shost = dev_to_shost(&starget->dev);
198 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
199 struct _MPT_ADAPTER *ioc = hd->ioc;
200 struct _CONFIG_PAGE_SCSI_DEVICE_0 *pg0;
203 struct _x_config_parms cfg;
204 struct _CONFIG_PAGE_HEADER hdr;
207 /* No SPI parameters for RAID devices */
208 if (starget->channel == 0 &&
209 mptspi_is_raid(hd, starget->id))
212 size = ioc->spi_data.sdp0length * 4;
214 if (ioc->spi_data.sdp0length & 1)
219 pg0 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg0_dma, GFP_KERNEL);
221 starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n");
225 memset(&hdr, 0, sizeof(hdr));
227 hdr.PageVersion = ioc->spi_data.sdp0version;
228 hdr.PageLength = ioc->spi_data.sdp0length;
230 hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
232 memset(&cfg, 0, sizeof(cfg));
234 cfg.cfghdr.hdr = &hdr;
235 cfg.physAddr = pg0_dma;
236 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
238 cfg.pageAddr = starget->id;
240 if (mpt_config(ioc, &cfg)) {
241 starget_printk(KERN_ERR, starget, "mpt_config failed\n");
245 memcpy(pass_pg0, pg0, size);
248 dma_free_coherent(&ioc->pcidev->dev, size, pg0, pg0_dma);
252 static u32 mptspi_getRP(struct scsi_target *starget)
256 nego |= spi_iu(starget) ? MPI_SCSIDEVPAGE1_RP_IU : 0;
257 nego |= spi_dt(starget) ? MPI_SCSIDEVPAGE1_RP_DT : 0;
258 nego |= spi_qas(starget) ? MPI_SCSIDEVPAGE1_RP_QAS : 0;
259 nego |= spi_hold_mcs(starget) ? MPI_SCSIDEVPAGE1_RP_HOLD_MCS : 0;
260 nego |= spi_wr_flow(starget) ? MPI_SCSIDEVPAGE1_RP_WR_FLOW : 0;
261 nego |= spi_rd_strm(starget) ? MPI_SCSIDEVPAGE1_RP_RD_STRM : 0;
262 nego |= spi_rti(starget) ? MPI_SCSIDEVPAGE1_RP_RTI : 0;
263 nego |= spi_pcomp_en(starget) ? MPI_SCSIDEVPAGE1_RP_PCOMP_EN : 0;
265 nego |= (spi_period(starget) << MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD) & MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK;
266 nego |= (spi_offset(starget) << MPI_SCSIDEVPAGE1_RP_SHIFT_MAX_SYNC_OFFSET) & MPI_SCSIDEVPAGE1_RP_MAX_SYNC_OFFSET_MASK;
267 nego |= spi_width(starget) ? MPI_SCSIDEVPAGE1_RP_WIDE : 0;
272 static void mptspi_read_parameters(struct scsi_target *starget)
275 struct _CONFIG_PAGE_SCSI_DEVICE_0 pg0;
277 mptspi_read_spi_device_pg0(starget, &pg0);
279 nego = le32_to_cpu(pg0.NegotiatedParameters);
281 spi_iu(starget) = (nego & MPI_SCSIDEVPAGE0_NP_IU) ? 1 : 0;
282 spi_dt(starget) = (nego & MPI_SCSIDEVPAGE0_NP_DT) ? 1 : 0;
283 spi_qas(starget) = (nego & MPI_SCSIDEVPAGE0_NP_QAS) ? 1 : 0;
284 spi_wr_flow(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WR_FLOW) ? 1 : 0;
285 spi_rd_strm(starget) = (nego & MPI_SCSIDEVPAGE0_NP_RD_STRM) ? 1 : 0;
286 spi_rti(starget) = (nego & MPI_SCSIDEVPAGE0_NP_RTI) ? 1 : 0;
287 spi_pcomp_en(starget) = (nego & MPI_SCSIDEVPAGE0_NP_PCOMP_EN) ? 1 : 0;
288 spi_hold_mcs(starget) = (nego & MPI_SCSIDEVPAGE0_NP_HOLD_MCS) ? 1 : 0;
289 spi_period(starget) = (nego & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK) >> MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_PERIOD;
290 spi_offset(starget) = (nego & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK) >> MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_OFFSET;
291 spi_width(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WIDE) ? 1 : 0;
295 mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
297 MpiRaidActionRequest_t *pReq;
300 /* Get and Populate a free Frame
302 if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) {
303 ddvprintk((MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n",
307 pReq = (MpiRaidActionRequest_t *)mf;
309 pReq->Action = MPI_RAID_ACTION_QUIESCE_PHYS_IO;
311 pReq->Action = MPI_RAID_ACTION_ENABLE_PHYS_IO;
313 pReq->ChainOffset = 0;
314 pReq->Function = MPI_FUNCTION_RAID_ACTION;
316 pReq->VolumeBus = channel;
317 pReq->PhysDiskNum = 0;
320 pReq->ActionDataWord = 0; /* Reserved for this action */
322 mpt_add_sge((char *)&pReq->ActionDataSGE,
323 MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1);
325 ddvprintk((MYIOC_s_INFO_FMT "RAID Volume action=%x channel=%d id=%d\n",
326 hd->ioc->name, pReq->Action, channel, id));
329 hd->timer.expires = jiffies + HZ*10; /* 10 second timeout */
330 hd->scandv_wait_done = 0;
332 /* Save cmd pointer, for resource free if timeout or
337 add_timer(&hd->timer);
338 mpt_put_msg_frame(hd->ioc->InternalCtx, hd->ioc, mf);
339 wait_event(hd->scandv_waitq, hd->scandv_wait_done);
341 if ((hd->pLocal == NULL) || (hd->pLocal->completion != 0))
347 static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
348 struct scsi_device *sdev)
350 VirtTarget *vtarget = scsi_target(sdev)->hostdata;
352 /* no DV on RAID devices */
353 if (sdev->channel == 0 &&
354 mptspi_is_raid(hd, sdev->id))
357 /* If this is a piece of a RAID, then quiesce first */
358 if (sdev->channel == 1 &&
359 mptscsih_quiesce_raid(hd, 1, vtarget->channel, vtarget->id) < 0) {
360 starget_printk(KERN_ERR, scsi_target(sdev),
361 "Integrated RAID quiesce failed\n");
367 if (sdev->channel == 1 &&
368 mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0)
369 starget_printk(KERN_ERR, scsi_target(sdev),
370 "Integrated RAID resume failed\n");
372 mptspi_read_parameters(sdev->sdev_target);
373 spi_display_xfer_agreement(sdev->sdev_target);
374 mptspi_read_parameters(sdev->sdev_target);
377 static int mptspi_slave_alloc(struct scsi_device *sdev)
379 MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)sdev->host->hostdata;
382 struct scsi_target *starget;
384 if (sdev->channel == 1 &&
385 mptscsih_is_phys_disk(hd->ioc, 0, sdev->id) == 0)
388 vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
390 printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
391 hd->ioc->name, sizeof(VirtDevice));
395 vdev->lun = sdev->lun;
396 sdev->hostdata = vdev;
398 starget = scsi_target(sdev);
399 vtarget = starget->hostdata;
400 vdev->vtarget = vtarget;
403 if (sdev->channel == 1)
404 sdev->no_uld_attach = 1;
409 static int mptspi_slave_configure(struct scsi_device *sdev)
411 int ret = mptscsih_slave_configure(sdev);
412 struct _MPT_SCSI_HOST *hd =
413 (struct _MPT_SCSI_HOST *)sdev->host->hostdata;
418 if ((sdev->channel == 1 ||
419 !(mptspi_is_raid(hd, sdev->id))) &&
420 !spi_initial_dv(sdev->sdev_target))
421 mptspi_dv_device(hd, sdev);
427 mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
429 struct _MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata;
430 VirtDevice *vdev = SCpnt->device->hostdata;
432 if (!vdev || !vdev->vtarget) {
433 SCpnt->result = DID_NO_CONNECT << 16;
438 if (SCpnt->device->channel == 1 &&
439 mptscsih_is_phys_disk(hd->ioc, 0, SCpnt->device->id) == 0) {
440 SCpnt->result = DID_NO_CONNECT << 16;
445 return mptscsih_qcmd(SCpnt,done);
448 static void mptspi_slave_destroy(struct scsi_device *sdev)
450 struct scsi_target *starget = scsi_target(sdev);
451 VirtTarget *vtarget = starget->hostdata;
452 VirtDevice *vdevice = sdev->hostdata;
454 /* Will this be the last lun on a non-raid device? */
455 if (vtarget->num_luns == 1 && vdevice->configured_lun) {
456 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
459 pg1.RequestedParameters = 0;
461 pg1.Configuration = 0;
463 mptspi_write_spi_device_pg1(starget, &pg1);
466 mptscsih_slave_destroy(sdev);
469 static struct scsi_host_template mptspi_driver_template = {
470 .module = THIS_MODULE,
471 .proc_name = "mptspi",
472 .proc_info = mptscsih_proc_info,
473 .name = "MPT SPI Host",
474 .info = mptscsih_info,
475 .queuecommand = mptspi_qcmd,
476 .target_alloc = mptspi_target_alloc,
477 .slave_alloc = mptspi_slave_alloc,
478 .slave_configure = mptspi_slave_configure,
479 .target_destroy = mptspi_target_destroy,
480 .slave_destroy = mptspi_slave_destroy,
481 .change_queue_depth = mptscsih_change_queue_depth,
482 .eh_abort_handler = mptscsih_abort,
483 .eh_device_reset_handler = mptscsih_dev_reset,
484 .eh_bus_reset_handler = mptscsih_bus_reset,
485 .eh_host_reset_handler = mptscsih_host_reset,
486 .bios_param = mptscsih_bios_param,
487 .can_queue = MPT_SCSI_CAN_QUEUE,
489 .sg_tablesize = MPT_SCSI_SG_DEPTH,
492 .use_clustering = ENABLE_CLUSTERING,
495 static int mptspi_write_spi_device_pg1(struct scsi_target *starget,
496 struct _CONFIG_PAGE_SCSI_DEVICE_1 *pass_pg1)
498 struct Scsi_Host *shost = dev_to_shost(&starget->dev);
499 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
500 struct _MPT_ADAPTER *ioc = hd->ioc;
501 struct _CONFIG_PAGE_SCSI_DEVICE_1 *pg1;
504 struct _x_config_parms cfg;
505 struct _CONFIG_PAGE_HEADER hdr;
508 /* don't allow updating nego parameters on RAID devices */
509 if (starget->channel == 0 &&
510 mptspi_is_raid(hd, starget->id))
513 size = ioc->spi_data.sdp1length * 4;
515 pg1 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg1_dma, GFP_KERNEL);
517 starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n");
521 memset(&hdr, 0, sizeof(hdr));
523 hdr.PageVersion = ioc->spi_data.sdp1version;
524 hdr.PageLength = ioc->spi_data.sdp1length;
526 hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
528 memset(&cfg, 0, sizeof(cfg));
530 cfg.cfghdr.hdr = &hdr;
531 cfg.physAddr = pg1_dma;
532 cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
534 cfg.pageAddr = starget->id;
536 memcpy(pg1, pass_pg1, size);
538 pg1->Header.PageVersion = hdr.PageVersion;
539 pg1->Header.PageLength = hdr.PageLength;
540 pg1->Header.PageNumber = hdr.PageNumber;
541 pg1->Header.PageType = hdr.PageType;
543 if (mpt_config(ioc, &cfg)) {
544 starget_printk(KERN_ERR, starget, "mpt_config failed\n");
550 dma_free_coherent(&ioc->pcidev->dev, size, pg1, pg1_dma);
554 static void mptspi_write_offset(struct scsi_target *starget, int offset)
556 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
565 if (spi_offset(starget) == -1)
566 mptspi_read_parameters(starget);
568 spi_offset(starget) = offset;
570 nego = mptspi_getRP(starget);
572 pg1.RequestedParameters = cpu_to_le32(nego);
574 pg1.Configuration = 0;
576 mptspi_write_spi_device_pg1(starget, &pg1);
579 static void mptspi_write_period(struct scsi_target *starget, int period)
581 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
590 if (spi_period(starget) == -1)
591 mptspi_read_parameters(starget);
596 } else if (period == 9) {
600 spi_period(starget) = period;
602 nego = mptspi_getRP(starget);
604 pg1.RequestedParameters = cpu_to_le32(nego);
606 pg1.Configuration = 0;
608 mptspi_write_spi_device_pg1(starget, &pg1);
611 static void mptspi_write_dt(struct scsi_target *starget, int dt)
613 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
616 if (spi_period(starget) == -1)
617 mptspi_read_parameters(starget);
619 if (!dt && spi_period(starget) < 10)
620 spi_period(starget) = 10;
622 spi_dt(starget) = dt;
624 nego = mptspi_getRP(starget);
627 pg1.RequestedParameters = cpu_to_le32(nego);
629 pg1.Configuration = 0;
631 mptspi_write_spi_device_pg1(starget, &pg1);
634 static void mptspi_write_iu(struct scsi_target *starget, int iu)
636 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
639 if (spi_period(starget) == -1)
640 mptspi_read_parameters(starget);
642 if (!iu && spi_period(starget) < 9)
643 spi_period(starget) = 9;
645 spi_iu(starget) = iu;
647 nego = mptspi_getRP(starget);
649 pg1.RequestedParameters = cpu_to_le32(nego);
651 pg1.Configuration = 0;
653 mptspi_write_spi_device_pg1(starget, &pg1);
656 #define MPTSPI_SIMPLE_TRANSPORT_PARM(parm) \
657 static void mptspi_write_##parm(struct scsi_target *starget, int parm)\
659 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; \
662 spi_##parm(starget) = parm; \
664 nego = mptspi_getRP(starget); \
666 pg1.RequestedParameters = cpu_to_le32(nego); \
668 pg1.Configuration = 0; \
670 mptspi_write_spi_device_pg1(starget, &pg1); \
673 MPTSPI_SIMPLE_TRANSPORT_PARM(rd_strm)
674 MPTSPI_SIMPLE_TRANSPORT_PARM(wr_flow)
675 MPTSPI_SIMPLE_TRANSPORT_PARM(rti)
676 MPTSPI_SIMPLE_TRANSPORT_PARM(hold_mcs)
677 MPTSPI_SIMPLE_TRANSPORT_PARM(pcomp_en)
679 static void mptspi_write_qas(struct scsi_target *starget, int qas)
681 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
682 struct Scsi_Host *shost = dev_to_shost(&starget->dev);
683 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
684 VirtTarget *vtarget = starget->hostdata;
687 if ((vtarget->negoFlags & MPT_TARGET_NO_NEGO_QAS) ||
688 hd->ioc->spi_data.noQas)
689 spi_qas(starget) = 0;
691 spi_qas(starget) = qas;
693 nego = mptspi_getRP(starget);
695 pg1.RequestedParameters = cpu_to_le32(nego);
697 pg1.Configuration = 0;
699 mptspi_write_spi_device_pg1(starget, &pg1);
702 static void mptspi_write_width(struct scsi_target *starget, int width)
704 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
709 if (spi_period(starget) < 10)
710 spi_period(starget) = 10;
713 spi_width(starget) = width;
715 nego = mptspi_getRP(starget);
717 pg1.RequestedParameters = cpu_to_le32(nego);
719 pg1.Configuration = 0;
721 mptspi_write_spi_device_pg1(starget, &pg1);
724 struct work_queue_wrapper {
725 struct work_struct work;
726 struct _MPT_SCSI_HOST *hd;
730 static void mpt_work_wrapper(struct work_struct *work)
732 struct work_queue_wrapper *wqw =
733 container_of(work, struct work_queue_wrapper, work);
734 struct _MPT_SCSI_HOST *hd = wqw->hd;
735 struct Scsi_Host *shost = hd->ioc->sh;
736 struct scsi_device *sdev;
737 int disk = wqw->disk;
738 struct _CONFIG_PAGE_IOC_3 *pg3;
742 mpt_findImVolumes(hd->ioc);
743 pg3 = hd->ioc->raid_data.pIocPg3;
747 shost_for_each_device(sdev,shost) {
748 struct scsi_target *starget = scsi_target(sdev);
749 VirtTarget *vtarget = starget->hostdata;
751 /* only want to search RAID components */
752 if (sdev->channel != 1)
755 /* The id is the raid PhysDiskNum, even if
756 * starget->id is the actual target address */
757 if(vtarget->id != disk)
760 starget_printk(KERN_INFO, vtarget->starget,
761 "Integrated RAID requests DV of new device\n");
762 mptspi_dv_device(hd, sdev);
764 shost_printk(KERN_INFO, shost,
765 "Integrated RAID detects new device %d\n", disk);
766 scsi_scan_target(&hd->ioc->sh->shost_gendev, 1, disk, 0, 1);
770 static void mpt_dv_raid(struct _MPT_SCSI_HOST *hd, int disk)
772 struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC);
775 shost_printk(KERN_ERR, hd->ioc->sh,
776 "Failed to act on RAID event for physical disk %d\n",
780 INIT_WORK(&wqw->work, mpt_work_wrapper);
784 schedule_work(&wqw->work);
788 mptspi_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
790 u8 event = le32_to_cpu(pEvReply->Event) & 0xFF;
791 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
793 if (hd && event == MPI_EVENT_INTEGRATED_RAID) {
795 = (le32_to_cpu(pEvReply->Data[0]) & 0x00FF0000) >> 16;
797 if (reason == MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED) {
798 int disk = (le32_to_cpu(pEvReply->Data[0]) & 0xFF000000) >> 24;
799 mpt_dv_raid(hd, disk);
802 return mptscsih_event_process(ioc, pEvReply);
806 mptspi_deny_binding(struct scsi_target *starget)
808 struct _MPT_SCSI_HOST *hd =
809 (struct _MPT_SCSI_HOST *)dev_to_shost(starget->dev.parent)->hostdata;
810 return ((mptspi_is_raid(hd, starget->id)) &&
811 starget->channel == 0) ? 1 : 0;
814 static struct spi_function_template mptspi_transport_functions = {
815 .get_offset = mptspi_read_parameters,
816 .set_offset = mptspi_write_offset,
818 .get_period = mptspi_read_parameters,
819 .set_period = mptspi_write_period,
821 .get_width = mptspi_read_parameters,
822 .set_width = mptspi_write_width,
824 .get_iu = mptspi_read_parameters,
825 .set_iu = mptspi_write_iu,
827 .get_dt = mptspi_read_parameters,
828 .set_dt = mptspi_write_dt,
830 .get_qas = mptspi_read_parameters,
831 .set_qas = mptspi_write_qas,
833 .get_wr_flow = mptspi_read_parameters,
834 .set_wr_flow = mptspi_write_wr_flow,
836 .get_rd_strm = mptspi_read_parameters,
837 .set_rd_strm = mptspi_write_rd_strm,
839 .get_rti = mptspi_read_parameters,
840 .set_rti = mptspi_write_rti,
842 .get_pcomp_en = mptspi_read_parameters,
843 .set_pcomp_en = mptspi_write_pcomp_en,
845 .get_hold_mcs = mptspi_read_parameters,
846 .set_hold_mcs = mptspi_write_hold_mcs,
848 .deny_binding = mptspi_deny_binding,
851 /****************************************************************************
855 static struct pci_device_id mptspi_pci_table[] = {
856 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1030,
857 PCI_ANY_ID, PCI_ANY_ID },
858 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1035,
859 PCI_ANY_ID, PCI_ANY_ID },
860 {0} /* Terminating entry */
862 MODULE_DEVICE_TABLE(pci, mptspi_pci_table);
866 * renegotiate for a given target
869 mptspi_dv_renegotiate_work(struct work_struct *work)
871 struct work_queue_wrapper *wqw =
872 container_of(work, struct work_queue_wrapper, work);
873 struct _MPT_SCSI_HOST *hd = wqw->hd;
874 struct scsi_device *sdev;
878 shost_for_each_device(sdev, hd->ioc->sh)
879 mptspi_dv_device(hd, sdev);
883 mptspi_dv_renegotiate(struct _MPT_SCSI_HOST *hd)
885 struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC);
890 INIT_WORK(&wqw->work, mptspi_dv_renegotiate_work);
893 schedule_work(&wqw->work);
897 * spi module reset handler
900 mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
902 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
905 rc = mptscsih_ioc_reset(ioc, reset_phase);
907 if (reset_phase == MPT_IOC_POST_RESET)
908 mptspi_dv_renegotiate(hd);
915 * spi module resume handler
918 mptspi_resume(struct pci_dev *pdev)
920 MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
921 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
924 rc = mptscsih_resume(pdev);
925 mptspi_dv_renegotiate(hd);
931 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
932 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
934 * mptspi_probe - Installs scsi devices per bus.
935 * @pdev: Pointer to pci_dev structure
937 * Returns 0 for success, non-zero for failure.
941 mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
943 struct Scsi_Host *sh;
954 if ((r = mpt_attach(pdev,id)) != 0)
957 ioc = pci_get_drvdata(pdev);
958 ioc->DoneCtx = mptspiDoneCtx;
959 ioc->TaskCtx = mptspiTaskCtx;
960 ioc->InternalCtx = mptspiInternalCtx;
962 /* Added sanity check on readiness of the MPT adapter.
964 if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
965 printk(MYIOC_s_WARN_FMT
966 "Skipping because it's not operational!\n",
969 goto out_mptspi_probe;
973 printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
976 goto out_mptspi_probe;
979 /* Sanity check - ensure at least 1 port is INITIATOR capable
982 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
983 if (ioc->pfacts[ii].ProtocolFlags &
984 MPI_PORTFACTS_PROTOCOL_INITIATOR)
989 printk(MYIOC_s_WARN_FMT
990 "Skipping ioc=%p because SCSI Initiator mode is NOT enabled!\n",
995 sh = scsi_host_alloc(&mptspi_driver_template, sizeof(MPT_SCSI_HOST));
998 printk(MYIOC_s_WARN_FMT
999 "Unable to register controller with SCSI subsystem\n",
1002 goto out_mptspi_probe;
1005 spin_lock_irqsave(&ioc->FreeQlock, flags);
1007 /* Attach the SCSI Host to the IOC structure
1015 /* set 16 byte cdb's */
1016 sh->max_cmd_len = 16;
1018 /* Yikes! This is important!
1019 * Otherwise, by default, linux
1020 * only scans target IDs 0-7!
1021 * pfactsN->MaxDevices unreliable
1022 * (not supported in early
1023 * versions of the FW).
1024 * max_id = 1 + actual max id,
1025 * max_lun = 1 + actual last lun,
1028 sh->max_id = ioc->devices_per_bus;
1030 sh->max_lun = MPT_LAST_LUN + 1;
1032 * If RAID Firmware Detected, setup virtual channel
1034 if ((ioc->facts.ProductID & MPI_FW_HEADER_PID_PROD_MASK)
1035 > MPI_FW_HEADER_PID_PROD_TARGET_SCSI)
1036 sh->max_channel = 1;
1038 sh->max_channel = 0;
1039 sh->this_id = ioc->pfacts[0].PortSCSIID;
1043 sh->unique_id = ioc->id;
1045 /* Verify that we won't exceed the maximum
1046 * number of chain buffers
1047 * We can optimize: ZZ = req_sz/sizeof(SGE)
1049 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
1050 * + (req_sz - 64)/sizeof(SGE)
1051 * A slightly different algorithm is required for
1054 scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
1055 if (sizeof(dma_addr_t) == sizeof(u64)) {
1056 numSGE = (scale - 1) *
1057 (ioc->facts.MaxChainDepth-1) + scale +
1058 (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
1061 numSGE = 1 + (scale - 1) *
1062 (ioc->facts.MaxChainDepth-1) + scale +
1063 (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
1067 if (numSGE < sh->sg_tablesize) {
1068 /* Reset this value */
1069 dprintk((MYIOC_s_INFO_FMT
1070 "Resetting sg_tablesize to %d from %d\n",
1071 ioc->name, numSGE, sh->sg_tablesize));
1072 sh->sg_tablesize = numSGE;
1075 spin_unlock_irqrestore(&ioc->FreeQlock, flags);
1077 hd = (MPT_SCSI_HOST *) sh->hostdata;
1080 /* SCSI needs scsi_cmnd lookup table!
1081 * (with size equal to req_depth*PtrSz!)
1083 hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
1084 if (!hd->ScsiLookup) {
1086 goto out_mptspi_probe;
1089 dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
1090 ioc->name, hd->ScsiLookup));
1092 /* Clear the TM flags
1095 hd->tmState = TM_STATE_NONE;
1096 hd->resetPending = 0;
1097 hd->abortSCpnt = NULL;
1099 /* Clear the pointer used to store
1100 * single-threaded commands, i.e., those
1101 * issued during a bus scan, dv and
1102 * configuration pages.
1106 /* Initialize this SCSI Hosts' timers
1107 * To use, set the timer expires field
1110 init_timer(&hd->timer);
1111 hd->timer.data = (unsigned long) hd;
1112 hd->timer.function = mptscsih_timer_expired;
1114 ioc->spi_data.Saf_Te = mpt_saf_te;
1116 hd->negoNvram = MPT_SCSICFG_USE_NVRAM;
1117 ddvprintk((MYIOC_s_INFO_FMT
1121 ioc->spi_data.noQas = 0;
1123 init_waitqueue_head(&hd->scandv_waitq);
1124 hd->scandv_wait_done = 0;
1125 hd->last_queue_full = 0;
1127 /* Some versions of the firmware don't support page 0; without
1128 * that we can't get the parameters */
1129 if (hd->ioc->spi_data.sdp0length != 0)
1130 sh->transportt = mptspi_transport_template;
1132 error = scsi_add_host (sh, &ioc->pcidev->dev);
1134 dprintk((KERN_ERR MYNAM
1135 "scsi_add_host failed\n"));
1136 goto out_mptspi_probe;
1140 * issue internal bus reset
1142 if (ioc->spi_data.bus_reset)
1143 mptscsih_TMHandler(hd,
1144 MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
1152 mptscsih_remove(pdev);
1156 static struct pci_driver mptspi_driver = {
1158 .id_table = mptspi_pci_table,
1159 .probe = mptspi_probe,
1160 .remove = __devexit_p(mptscsih_remove),
1161 .shutdown = mptscsih_shutdown,
1163 .suspend = mptscsih_suspend,
1164 .resume = mptspi_resume,
1168 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1170 * mptspi_init - Register MPT adapter(s) as SCSI host(s) with SCSI mid-layer.
1172 * Returns 0 for success, non-zero for failure.
1177 show_mptmod_ver(my_NAME, my_VERSION);
1179 mptspi_transport_template = spi_attach_transport(&mptspi_transport_functions);
1180 if (!mptspi_transport_template)
1183 mptspiDoneCtx = mpt_register(mptscsih_io_done, MPTSPI_DRIVER);
1184 mptspiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSPI_DRIVER);
1185 mptspiInternalCtx = mpt_register(mptscsih_scandv_complete, MPTSPI_DRIVER);
1187 if (mpt_event_register(mptspiDoneCtx, mptspi_event_process) == 0) {
1188 devtverboseprintk((KERN_INFO MYNAM
1189 ": Registered for IOC event notifications\n"));
1192 if (mpt_reset_register(mptspiDoneCtx, mptspi_ioc_reset) == 0) {
1193 dprintk((KERN_INFO MYNAM
1194 ": Registered for IOC reset notifications\n"));
1197 return pci_register_driver(&mptspi_driver);
1200 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1201 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1203 * mptspi_exit - Unregisters MPT adapter(s)
1208 pci_unregister_driver(&mptspi_driver);
1210 mpt_reset_deregister(mptspiDoneCtx);
1211 dprintk((KERN_INFO MYNAM
1212 ": Deregistered for IOC reset notifications\n"));
1214 mpt_event_deregister(mptspiDoneCtx);
1215 dprintk((KERN_INFO MYNAM
1216 ": Deregistered for IOC event notifications\n"));
1218 mpt_deregister(mptspiInternalCtx);
1219 mpt_deregister(mptspiTaskCtx);
1220 mpt_deregister(mptspiDoneCtx);
1221 spi_release_transport(mptspi_transport_template);
1224 module_init(mptspi_init);
1225 module_exit(mptspi_exit);