Linux 2.6.21
[linux/fpc-iii.git] / drivers / message / fusion / mptspi.c
blob85f21b54cb7de6702e89d4fb6728fa25e37e0e3c
1 /*
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)
9 */
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.
21 NO WARRANTY
22 THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
23 CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
24 LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
25 MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
26 solely responsible for determining the appropriateness of using and
27 distributing the Program and assumes all risks associated with its
28 exercise of rights under this Agreement, including but not limited to
29 the risks and costs of program errors, damage to or loss of data,
30 programs or equipment, and unavailability or interruption of operations.
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>
69 #include "mptbase.h"
70 #include "mptscsih.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 */
98 /**
99 * mptspi_setTargetNegoParms - Update the target negotiation
100 * parameters based on the the Inquiry data, adapter capabilities,
101 * and NVRAM settings
103 * @hd: Pointer to a SCSI Host Structure
104 * @vtarget: per target private data
105 * @sdev: SCSI device
108 static void
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;
114 int nvram;
115 u8 width = MPT_NARROW;
116 u8 factor = MPT_ASYNC;
117 u8 offset = 0;
118 u8 nfactor;
119 u8 noQas = 1;
121 target->negoFlags = pspi_data->noQas;
123 if (sdev->scsi_level < SCSI_2) {
124 width = 0;
125 factor = MPT_ULTRA2;
126 offset = pspi_data->maxSyncOffset;
127 target->tflags &= ~MPT_TARGET_FLAGS_Q_YES;
128 } else {
129 if (scsi_device_wide(sdev))
130 width = 1;
132 if (scsi_device_sync(sdev)) {
133 factor = pspi_data->minSyncFactor;
134 if (!scsi_device_dt(sdev))
135 factor = MPT_ULTRA2;
136 else {
137 if (!scsi_device_ius(sdev) &&
138 !scsi_device_qas(sdev))
139 factor = MPT_ULTRA160;
140 else {
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));
144 noQas = 0;
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
157 * bit 0 IU support
159 if (target->raidVolume == 1)
160 noQas = 0;
161 } else {
162 factor = MPT_ASYNC;
163 offset = 0;
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;
176 if (width)
177 width = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1;
179 if (offset > 0) {
180 /* Ensure factor is set to the
181 * maximum of: adapter, nvram, inquiry
183 if (nfactor) {
184 if (nfactor < pspi_data->minSyncFactor )
185 nfactor = pspi_data->minSyncFactor;
187 factor = max(factor, nfactor);
188 if (factor == MPT_ASYNC)
189 offset = 0;
190 } else {
191 offset = 0;
192 factor = MPT_ASYNC;
194 } else {
195 factor = MPT_ASYNC;
199 /* Make sure data is consistent
201 if ((!width) && (factor < MPT_ULTRA2))
202 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.
214 if (!width)
215 target->negoFlags |= MPT_TARGET_NO_NEGO_WIDE;
217 if (!offset)
218 target->negoFlags |= MPT_TARGET_NO_NEGO_SYNC;
220 if ( factor > MPT_ULTRA320 )
221 noQas = 0;
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
237 * @channel:
238 * @id: write IOC Page4 for this ID & Bus
240 * Return: -EAGAIN if unable to obtain a Message Frame
241 * or 0 if success.
243 * Remark: We do not wait for a return, write pages sequentially.
245 static int
246 mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, u8 channel , u8 id)
248 MPT_ADAPTER *ioc = hd->ioc;
249 Config_t *pReq;
250 IOCPage4_t *IOCPage4Ptr;
251 MPT_FRAME_HDR *mf;
252 dma_addr_t dataDma;
253 u16 req_idx;
254 u32 frameOffset;
255 u32 flagsLength;
256 int ii;
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",
262 ioc->name));
263 return -EAGAIN;
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;
277 pReq->Reserved = 0;
278 pReq->ChainOffset = 0;
279 pReq->Function = MPI_FUNCTION_CONFIG;
280 pReq->ExtPageLength = 0;
281 pReq->ExtPageType = 0;
282 pReq->MsgFlags = 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);
308 return 0;
312 * mptspi_initTarget - Target, LUN alloc/free functionality.
313 * @hd: Pointer to MPT_SCSI_HOST structure
314 * @vtarget: per target private data
315 * @sdev: SCSI device
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.
321 * Save inquiry data.
324 static void
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)
333 return;
335 if (vtarget == NULL)
336 return;
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
367 * Return:
368 * non-zero = true
369 * zero = false
372 static int
373 mptspi_is_raid(struct _MPT_SCSI_HOST *hd, u32 id)
375 int i, rc = 0;
377 if (!hd->ioc->raid_data.pIocPg2)
378 goto out;
380 if (!hd->ioc->raid_data.pIocPg2->NumActiveVolumes)
381 goto out;
382 for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
383 if (hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == id) {
384 rc = 1;
385 goto out;
389 out:
390 return rc;
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;
397 VirtTarget *vtarget;
399 if (hd == NULL)
400 return -ENODEV;
402 vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
403 if (!vtarget)
404 return -ENOMEM;
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)
415 return 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,
421 starget->id);
424 if (starget->channel == 0 &&
425 mptspi_is_raid(hd, starget->id)) {
426 vtarget->raidVolume = 1;
427 ddvprintk((KERN_INFO
428 "RAID Volume @ channel=%d id=%d\n", starget->channel,
429 starget->id));
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;
437 } else {
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);
446 return 0;
449 void
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
464 static void
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
489 static void
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;
514 dma_addr_t pg0_dma;
515 int size;
516 struct _x_config_parms cfg;
517 struct _CONFIG_PAGE_HEADER hdr;
518 int err = -EBUSY;
520 /* No SPI parameters for RAID devices */
521 if (starget->channel == 0 &&
522 mptspi_is_raid(hd, starget->id))
523 return -1;
525 size = ioc->spi_data.sdp0length * 4;
527 if (ioc->spi_data.sdp0length & 1)
528 size += size + 4;
529 size += 2048;
532 pg0 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg0_dma, GFP_KERNEL);
533 if (pg0 == NULL) {
534 starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n");
535 return -EINVAL;
538 memset(&hdr, 0, sizeof(hdr));
540 hdr.PageVersion = ioc->spi_data.sdp0version;
541 hdr.PageLength = ioc->spi_data.sdp0length;
542 hdr.PageNumber = 0;
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;
550 cfg.dir = 0;
551 cfg.pageAddr = starget->id;
553 if (mpt_config(ioc, &cfg)) {
554 starget_printk(KERN_ERR, starget, "mpt_config failed\n");
555 goto out_free;
557 err = 0;
558 memcpy(pass_pg0, pg0, size);
560 mptspi_print_read_nego(hd, starget, le32_to_cpu(pg0->NegotiatedParameters));
562 out_free:
563 dma_free_coherent(&ioc->pcidev->dev, size, pg0, pg0_dma);
564 return err;
567 static u32 mptspi_getRP(struct scsi_target *starget)
569 u32 nego = 0;
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;
584 return nego;
587 static void mptspi_read_parameters(struct scsi_target *starget)
589 int nego;
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;
609 static int
610 mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
612 MpiRaidActionRequest_t *pReq;
613 MPT_FRAME_HDR *mf;
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",
619 hd->ioc->name));
620 return -EAGAIN;
622 pReq = (MpiRaidActionRequest_t *)mf;
623 if (quiesce)
624 pReq->Action = MPI_RAID_ACTION_QUIESCE_PHYS_IO;
625 else
626 pReq->Action = MPI_RAID_ACTION_ENABLE_PHYS_IO;
627 pReq->Reserved1 = 0;
628 pReq->ChainOffset = 0;
629 pReq->Function = MPI_FUNCTION_RAID_ACTION;
630 pReq->VolumeID = id;
631 pReq->VolumeBus = channel;
632 pReq->PhysDiskNum = 0;
633 pReq->MsgFlags = 0;
634 pReq->Reserved2 = 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));
643 hd->pLocal = NULL;
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
648 * FW reload occurs
650 hd->cmdPtr = mf;
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))
657 return -1;
659 return 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))
670 return;
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");
677 return;
680 spi_dv_device(sdev);
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;
695 VirtTarget *vtarget;
696 VirtDevice *vdev;
697 struct scsi_target *starget;
699 if (sdev->channel == 1 &&
700 mptscsih_is_phys_disk(hd->ioc, 0, sdev->id) == 0)
701 return -ENXIO;
703 vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
704 if (!vdev) {
705 printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
706 hd->ioc->name, sizeof(VirtDevice));
707 return -ENOMEM;
710 vdev->lun = sdev->lun;
711 sdev->hostdata = vdev;
713 starget = scsi_target(sdev);
714 vtarget = starget->hostdata;
715 vdev->vtarget = vtarget;
716 vtarget->num_luns++;
718 if (sdev->channel == 1)
719 sdev->no_uld_attach = 1;
721 return 0;
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);
731 if (ret)
732 return ret;
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);
747 return 0;
750 static int
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;
758 done(SCpnt);
759 return 0;
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;
765 done(SCpnt);
766 return 0;
769 #ifdef MPT_DEBUG_DV
770 if (spi_dv_pending(scsi_target(SCpnt->device)))
771 scsi_print_command(SCpnt);
772 #endif
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;
787 /* Async Narrow */
788 pg1.RequestedParameters = 0;
789 pg1.Reserved = 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,
817 .this_id = -1,
818 .sg_tablesize = MPT_SCSI_SG_DEPTH,
819 .max_sectors = 8192,
820 .cmd_per_lun = 7,
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;
831 dma_addr_t pg1_dma;
832 int size;
833 struct _x_config_parms cfg;
834 struct _CONFIG_PAGE_HEADER hdr;
835 int err = -EBUSY;
837 /* don't allow updating nego parameters on RAID devices */
838 if (starget->channel == 0 &&
839 mptspi_is_raid(hd, starget->id))
840 return -1;
842 size = ioc->spi_data.sdp1length * 4;
844 pg1 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg1_dma, GFP_KERNEL);
845 if (pg1 == NULL) {
846 starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n");
847 return -EINVAL;
850 memset(&hdr, 0, sizeof(hdr));
852 hdr.PageVersion = ioc->spi_data.sdp1version;
853 hdr.PageLength = ioc->spi_data.sdp1length;
854 hdr.PageNumber = 1;
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;
862 cfg.dir = 1;
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");
876 goto out_free;
878 err = 0;
880 out_free:
881 dma_free_coherent(&ioc->pcidev->dev, size, pg1, pg1_dma);
882 return err;
885 static void mptspi_write_offset(struct scsi_target *starget, int offset)
887 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
888 u32 nego;
890 if (offset < 0)
891 offset = 0;
893 if (offset > 255)
894 offset = 255;
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);
904 pg1.Reserved = 0;
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;
913 u32 nego;
915 if (period < 8)
916 period = 8;
918 if (period > 255)
919 period = 255;
921 if (spi_period(starget) == -1)
922 mptspi_read_parameters(starget);
924 if (period == 8) {
925 spi_iu(starget) = 1;
926 spi_dt(starget) = 1;
927 } else if (period == 9) {
928 spi_dt(starget) = 1;
931 spi_period(starget) = period;
933 nego = mptspi_getRP(starget);
935 pg1.RequestedParameters = cpu_to_le32(nego);
936 pg1.Reserved = 0;
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;
945 u32 nego;
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);
959 pg1.Reserved = 0;
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;
968 u32 nego;
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);
981 pg1.Reserved = 0;
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; \
991 u32 nego; \
993 spi_##parm(starget) = parm; \
995 nego = mptspi_getRP(starget); \
997 pg1.RequestedParameters = cpu_to_le32(nego); \
998 pg1.Reserved = 0; \
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;
1016 u32 nego;
1018 if ((vtarget->negoFlags & MPT_TARGET_NO_NEGO_QAS) ||
1019 hd->ioc->spi_data.noQas)
1020 spi_qas(starget) = 0;
1021 else
1022 spi_qas(starget) = qas;
1024 nego = mptspi_getRP(starget);
1026 pg1.RequestedParameters = cpu_to_le32(nego);
1027 pg1.Reserved = 0;
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;
1036 u32 nego;
1038 if (!width) {
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);
1049 pg1.Reserved = 0;
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;
1058 int disk;
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;
1071 kfree(wqw);
1073 mpt_findImVolumes(hd->ioc);
1074 pg3 = hd->ioc->raid_data.pIocPg3;
1075 if (!pg3)
1076 return;
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)
1084 continue;
1086 /* The id is the raid PhysDiskNum, even if
1087 * starget->id is the actual target address */
1088 if(vtarget->id != disk)
1089 continue;
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);
1105 if (!wqw) {
1106 shost_printk(KERN_ERR, hd->ioc->sh,
1107 "Failed to act on RAID event for physical disk %d\n",
1108 disk);
1109 return;
1111 INIT_WORK(&wqw->work, mpt_work_wrapper);
1112 wqw->hd = hd;
1113 wqw->disk = disk;
1115 schedule_work(&wqw->work);
1118 static int
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) {
1125 int reason
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);
1136 static int
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,
1148 .show_offset = 1,
1149 .get_period = mptspi_read_parameters,
1150 .set_period = mptspi_write_period,
1151 .show_period = 1,
1152 .get_width = mptspi_read_parameters,
1153 .set_width = mptspi_write_width,
1154 .show_width = 1,
1155 .get_iu = mptspi_read_parameters,
1156 .set_iu = mptspi_write_iu,
1157 .show_iu = 1,
1158 .get_dt = mptspi_read_parameters,
1159 .set_dt = mptspi_write_dt,
1160 .show_dt = 1,
1161 .get_qas = mptspi_read_parameters,
1162 .set_qas = mptspi_write_qas,
1163 .show_qas = 1,
1164 .get_wr_flow = mptspi_read_parameters,
1165 .set_wr_flow = mptspi_write_wr_flow,
1166 .show_wr_flow = 1,
1167 .get_rd_strm = mptspi_read_parameters,
1168 .set_rd_strm = mptspi_write_rd_strm,
1169 .show_rd_strm = 1,
1170 .get_rti = mptspi_read_parameters,
1171 .set_rti = mptspi_write_rti,
1172 .show_rti = 1,
1173 .get_pcomp_en = mptspi_read_parameters,
1174 .set_pcomp_en = mptspi_write_pcomp_en,
1175 .show_pcomp_en = 1,
1176 .get_hold_mcs = mptspi_read_parameters,
1177 .set_hold_mcs = mptspi_write_hold_mcs,
1178 .show_hold_mcs = 1,
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
1199 static void
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;
1207 kfree(wqw);
1209 shost_for_each_device(sdev, hd->ioc->sh)
1210 mptspi_dv_device(hd, sdev);
1213 static void
1214 mptspi_dv_renegotiate(struct _MPT_SCSI_HOST *hd)
1216 struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC);
1218 if (!wqw)
1219 return;
1221 INIT_WORK(&wqw->work, mptspi_dv_renegotiate_work);
1222 wqw->hd = hd;
1224 schedule_work(&wqw->work);
1228 * spi module reset handler
1230 static int
1231 mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
1233 struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata;
1234 int rc;
1236 rc = mptscsih_ioc_reset(ioc, reset_phase);
1238 if (reset_phase == MPT_IOC_POST_RESET)
1239 mptspi_dv_renegotiate(hd);
1241 return rc;
1244 #ifdef CONFIG_PM
1246 * spi module resume handler
1248 static int
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;
1253 int rc;
1255 rc = mptscsih_resume(pdev);
1256 mptspi_dv_renegotiate(hd);
1258 return rc;
1260 #endif
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.
1271 static int
1272 mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1274 struct Scsi_Host *sh;
1275 MPT_SCSI_HOST *hd;
1276 MPT_ADAPTER *ioc;
1277 unsigned long flags;
1278 int ii;
1279 int numSGE = 0;
1280 int scale;
1281 int ioc_cap;
1282 int error=0;
1283 int r;
1285 if ((r = mpt_attach(pdev,id)) != 0)
1286 return r;
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",
1298 ioc->name);
1299 error = -ENODEV;
1300 goto out_mptspi_probe;
1303 if (!ioc->active) {
1304 printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
1305 ioc->name);
1306 error = -ENODEV;
1307 goto out_mptspi_probe;
1310 /* Sanity check - ensure at least 1 port is INITIATOR capable
1312 ioc_cap = 0;
1313 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
1314 if (ioc->pfacts[ii].ProtocolFlags &
1315 MPI_PORTFACTS_PROTOCOL_INITIATOR)
1316 ioc_cap ++;
1319 if (!ioc_cap) {
1320 printk(MYIOC_s_WARN_FMT
1321 "Skipping ioc=%p because SCSI Initiator mode is NOT enabled!\n",
1322 ioc->name, ioc);
1323 return 0;
1326 sh = scsi_host_alloc(&mptspi_driver_template, sizeof(MPT_SCSI_HOST));
1328 if (!sh) {
1329 printk(MYIOC_s_WARN_FMT
1330 "Unable to register controller with SCSI subsystem\n",
1331 ioc->name);
1332 error = -1;
1333 goto out_mptspi_probe;
1336 spin_lock_irqsave(&ioc->FreeQlock, flags);
1338 /* Attach the SCSI Host to the IOC structure
1340 ioc->sh = sh;
1342 sh->io_port = 0;
1343 sh->n_io_port = 0;
1344 sh->irq = 0;
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,
1357 * see hosts.h :o(
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;
1367 else
1368 sh->max_channel = 0;
1369 sh->this_id = ioc->pfacts[0].PortSCSIID;
1371 /* Required entry.
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)
1378 * For 32bit SGE's:
1379 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
1380 * + (req_sz - 64)/sizeof(SGE)
1381 * A slightly different algorithm is required for
1382 * 64bit SGEs.
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) +
1389 sizeof(u32));
1390 } else {
1391 numSGE = 1 + (scale - 1) *
1392 (ioc->facts.MaxChainDepth-1) + scale +
1393 (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
1394 sizeof(u32));
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;
1408 hd->ioc = ioc;
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) {
1415 error = -ENOMEM;
1416 goto out_mptspi_probe;
1419 dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
1420 ioc->name, hd->ScsiLookup));
1422 /* Clear the TM flags
1424 hd->tmPending = 0;
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.
1434 hd->cmdPtr = NULL;
1436 /* Initialize this SCSI Hosts' timers
1437 * To use, set the timer expires field
1438 * and add_timer
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
1448 "saf_te %x\n",
1449 ioc->name,
1450 mpt_saf_te));
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);
1463 if(error) {
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,
1475 0, 0, 0, 0, 5);
1477 scsi_scan_host(sh);
1478 return 0;
1480 out_mptspi_probe:
1482 mptscsih_remove(pdev);
1483 return error;
1486 static struct pci_driver mptspi_driver = {
1487 .name = "mptspi",
1488 .id_table = mptspi_pci_table,
1489 .probe = mptspi_probe,
1490 .remove = __devexit_p(mptscsih_remove),
1491 .shutdown = mptscsih_shutdown,
1492 #ifdef CONFIG_PM
1493 .suspend = mptscsih_suspend,
1494 .resume = mptspi_resume,
1495 #endif
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.
1504 static int __init
1505 mptspi_init(void)
1507 show_mptmod_ver(my_NAME, my_VERSION);
1509 mptspi_transport_template = spi_attach_transport(&mptspi_transport_functions);
1510 if (!mptspi_transport_template)
1511 return -ENODEV;
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)
1535 static void __exit
1536 mptspi_exit(void)
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);