2 * linux/drivers/message/fusion/mptctl.c
4 * For use with LSI PCI chip/adapters
5 * running LSI Fusion MPT (Message Passing Technology) firmware.
7 * Copyright (c) 1999-2008 LSI Corporation
8 * (mailto:DL-MPTFusionLinux@lsi.com)
11 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; version 2 of the License.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
23 THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
24 CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
25 LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
26 MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
27 solely responsible for determining the appropriateness of using and
28 distributing the Program and assumes all risks associated with its
29 exercise of rights under this Agreement, including but not limited to
30 the risks and costs of program errors, damage to or loss of data,
31 programs or equipment, and unavailability or interruption of operations.
33 DISCLAIMER OF LIABILITY
34 NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
35 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
37 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
38 TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
39 USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
40 HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
42 You should have received a copy of the GNU General Public License
43 along with this program; if not, write to the Free Software
44 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
46 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
48 #include <linux/kernel.h>
49 #include <linux/module.h>
50 #include <linux/errno.h>
51 #include <linux/init.h>
52 #include <linux/slab.h>
53 #include <linux/types.h>
54 #include <linux/pci.h>
55 #include <linux/delay.h> /* for mdelay */
56 #include <linux/miscdevice.h>
57 #include <linux/smp_lock.h>
58 #include <linux/compat.h>
61 #include <asm/uaccess.h>
63 #include <scsi/scsi.h>
64 #include <scsi/scsi_cmnd.h>
65 #include <scsi/scsi_device.h>
66 #include <scsi/scsi_host.h>
67 #include <scsi/scsi_tcq.h>
69 #define COPYRIGHT "Copyright (c) 1999-2008 LSI Corporation"
70 #define MODULEAUTHOR "LSI Corporation"
74 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
75 #define my_NAME "Fusion MPT misc device (ioctl) driver"
76 #define my_VERSION MPT_LINUX_VERSION_COMMON
77 #define MYNAM "mptctl"
79 MODULE_AUTHOR(MODULEAUTHOR);
80 MODULE_DESCRIPTION(my_NAME);
81 MODULE_LICENSE("GPL");
82 MODULE_VERSION(my_VERSION);
84 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
86 static u8 mptctl_id = MPT_MAX_PROTOCOL_DRIVERS;
87 static u8 mptctl_taskmgmt_id = MPT_MAX_PROTOCOL_DRIVERS;
89 static DECLARE_WAIT_QUEUE_HEAD ( mptctl_wait );
91 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
99 * Function prototypes. Called from OS entry point mptctl_ioctl.
100 * arg contents specific to function.
102 static int mptctl_fw_download(unsigned long arg);
103 static int mptctl_getiocinfo(unsigned long arg, unsigned int cmd);
104 static int mptctl_gettargetinfo(unsigned long arg);
105 static int mptctl_readtest(unsigned long arg);
106 static int mptctl_mpt_command(unsigned long arg);
107 static int mptctl_eventquery(unsigned long arg);
108 static int mptctl_eventenable(unsigned long arg);
109 static int mptctl_eventreport(unsigned long arg);
110 static int mptctl_replace_fw(unsigned long arg);
112 static int mptctl_do_reset(unsigned long arg);
113 static int mptctl_hp_hostinfo(unsigned long arg, unsigned int cmd);
114 static int mptctl_hp_targetinfo(unsigned long arg);
116 static int mptctl_probe(struct pci_dev *, const struct pci_device_id *);
117 static void mptctl_remove(struct pci_dev *);
120 static long compat_mpctl_ioctl(struct file *f, unsigned cmd, unsigned long arg);
123 * Private function calls.
125 static int mptctl_do_mpt_command(struct mpt_ioctl_command karg, void __user *mfPtr);
126 static int mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen);
127 static MptSge_t *kbuf_alloc_2_sgl(int bytes, u32 dir, int sge_offset, int *frags,
128 struct buflist **blp, dma_addr_t *sglbuf_dma, MPT_ADAPTER *ioc);
129 static void kfree_sgl(MptSge_t *sgl, dma_addr_t sgl_dma,
130 struct buflist *buflist, MPT_ADAPTER *ioc);
133 * Reset Handler cleanup function
135 static int mptctl_ioc_reset(MPT_ADAPTER *ioc, int reset_phase);
138 * Event Handler function
140 static int mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply);
141 static struct fasync_struct *async_queue=NULL;
143 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
145 * Scatter gather list (SGL) sizes and limits...
147 //#define MAX_SCSI_FRAGS 9
148 #define MAX_FRAGS_SPILL1 9
149 #define MAX_FRAGS_SPILL2 15
150 #define FRAGS_PER_BUCKET (MAX_FRAGS_SPILL2 + 1)
152 //#define MAX_CHAIN_FRAGS 64
153 //#define MAX_CHAIN_FRAGS (15+15+15+16)
154 #define MAX_CHAIN_FRAGS (4 * MAX_FRAGS_SPILL2 + 1)
156 // Define max sg LIST bytes ( == (#frags + #chains) * 8 bytes each)
157 // Works out to: 592d bytes! (9+1)*8 + 4*(15+1)*8
158 // ^----------------- 80 + 512
159 #define MAX_SGL_BYTES ((MAX_FRAGS_SPILL1 + 1 + (4 * FRAGS_PER_BUCKET)) * 8)
161 /* linux only seems to ever give 128kB MAX contiguous (GFP_USER) mem bytes */
162 #define MAX_KMALLOC_SZ (128*1024)
164 #define MPT_IOCTL_DEFAULT_TIMEOUT 10 /* Default timeout value (seconds) */
166 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
168 * mptctl_syscall_down - Down the MPT adapter syscall semaphore.
169 * @ioc: Pointer to MPT adapter
170 * @nonblock: boolean, non-zero if O_NONBLOCK is set
172 * All of the ioctl commands can potentially sleep, which is illegal
173 * with a spinlock held, thus we perform mutual exclusion here.
175 * Returns negative errno on error, or zero for success.
178 mptctl_syscall_down(MPT_ADAPTER *ioc, int nonblock)
183 if (!mutex_trylock(&ioc->ioctl_cmds.mutex))
186 if (mutex_lock_interruptible(&ioc->ioctl_cmds.mutex))
192 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
194 * This is the callback for any message we have posted. The message itself
195 * will be returned to the message pool when we return from the IRQ
197 * This runs in irq context so be short and sweet.
200 mptctl_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply)
209 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "completing mpi function "
210 "(0x%02X), req=%p, reply=%p\n", ioc->name, req->u.hdr.Function,
214 * Handling continuation of the same reply. Processing the first
215 * reply, and eating the other replys that come later.
217 if (ioc->ioctl_cmds.msg_context != req->u.hdr.MsgContext)
218 goto out_continuation;
220 ioc->ioctl_cmds.status |= MPT_MGMT_STATUS_COMMAND_GOOD;
225 ioc->ioctl_cmds.status |= MPT_MGMT_STATUS_RF_VALID;
226 sz = min(ioc->reply_sz, 4*reply->u.reply.MsgLength);
227 memcpy(ioc->ioctl_cmds.reply, reply, sz);
229 if (reply->u.reply.IOCStatus || reply->u.reply.IOCLogInfo)
230 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
231 "iocstatus (0x%04X), loginfo (0x%08X)\n", ioc->name,
232 le16_to_cpu(reply->u.reply.IOCStatus),
233 le32_to_cpu(reply->u.reply.IOCLogInfo)));
235 if ((req->u.hdr.Function == MPI_FUNCTION_SCSI_IO_REQUEST) ||
236 (req->u.hdr.Function ==
237 MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) {
239 if (reply->u.sreply.SCSIStatus || reply->u.sreply.SCSIState)
240 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
241 "scsi_status (0x%02x), scsi_state (0x%02x), "
242 "tag = (0x%04x), transfer_count (0x%08x)\n", ioc->name,
243 reply->u.sreply.SCSIStatus,
244 reply->u.sreply.SCSIState,
245 le16_to_cpu(reply->u.sreply.TaskTag),
246 le32_to_cpu(reply->u.sreply.TransferCount)));
248 if (reply->u.sreply.SCSIState &
249 MPI_SCSI_STATE_AUTOSENSE_VALID) {
250 sz = req->u.scsireq.SenseBufferLength;
252 le16_to_cpu(req->u.frame.hwhdr.msgctxu.fld.req_idx);
253 sense_data = ((u8 *)ioc->sense_buf_pool +
254 (req_index * MPT_SENSE_BUFFER_ALLOC));
255 memcpy(ioc->ioctl_cmds.sense, sense_data, sz);
256 ioc->ioctl_cmds.status |= MPT_MGMT_STATUS_SENSE_VALID;
261 /* We are done, issue wake up
263 if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_PENDING) {
264 if (req->u.hdr.Function == MPI_FUNCTION_SCSI_TASK_MGMT) {
265 mpt_clear_taskmgmt_in_progress_flag(ioc);
266 ioc->ioctl_cmds.status &= ~MPT_MGMT_STATUS_PENDING;
267 complete(&ioc->ioctl_cmds.done);
268 if (ioc->bus_type == SAS)
269 ioc->schedule_target_reset(ioc);
271 ioc->ioctl_cmds.status &= ~MPT_MGMT_STATUS_PENDING;
272 complete(&ioc->ioctl_cmds.done);
277 if (reply && (reply->u.reply.MsgFlags &
278 MPI_MSGFLAGS_CONTINUATION_REPLY))
285 mptctl_taskmgmt_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
290 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
291 "TaskMgmt completed (mf=%p, mr=%p)\n",
294 ioc->taskmgmt_cmds.status |= MPT_MGMT_STATUS_COMMAND_GOOD;
299 ioc->taskmgmt_cmds.status |= MPT_MGMT_STATUS_RF_VALID;
300 memcpy(ioc->taskmgmt_cmds.reply, mr,
301 min(MPT_DEFAULT_FRAME_SIZE, 4 * mr->u.reply.MsgLength));
303 if (ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_PENDING) {
304 mpt_clear_taskmgmt_in_progress_flag(ioc);
305 ioc->taskmgmt_cmds.status &= ~MPT_MGMT_STATUS_PENDING;
306 complete(&ioc->taskmgmt_cmds.done);
307 if (ioc->bus_type == SAS)
308 ioc->schedule_target_reset(ioc);
315 mptctl_do_taskmgmt(MPT_ADAPTER *ioc, u8 tm_type, u8 bus_id, u8 target_id)
318 SCSITaskMgmt_t *pScsiTm;
319 SCSITaskMgmtReply_t *pScsiTmReply;
322 unsigned long timeout;
323 unsigned long time_count;
327 mutex_lock(&ioc->taskmgmt_cmds.mutex);
328 if (mpt_set_taskmgmt_in_progress_flag(ioc) != 0) {
329 mutex_unlock(&ioc->taskmgmt_cmds.mutex);
335 mf = mpt_get_msg_frame(mptctl_taskmgmt_id, ioc);
338 printk(MYIOC_s_WARN_FMT "TaskMgmt, no msg frames!!\n",
340 mpt_clear_taskmgmt_in_progress_flag(ioc);
345 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt request (mf=%p)\n",
348 pScsiTm = (SCSITaskMgmt_t *) mf;
349 memset(pScsiTm, 0, sizeof(SCSITaskMgmt_t));
350 pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT;
351 pScsiTm->TaskType = tm_type;
352 if ((tm_type == MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS) &&
353 (ioc->bus_type == FC))
355 MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION;
356 pScsiTm->TargetID = target_id;
357 pScsiTm->Bus = bus_id;
358 pScsiTm->ChainOffset = 0;
359 pScsiTm->Reserved = 0;
360 pScsiTm->Reserved1 = 0;
361 pScsiTm->TaskMsgContext = 0;
362 for (ii= 0; ii < 8; ii++)
363 pScsiTm->LUN[ii] = 0;
364 for (ii=0; ii < 7; ii++)
365 pScsiTm->Reserved2[ii] = 0;
367 switch (ioc->bus_type) {
381 printk(MYIOC_s_DEBUG_FMT "TaskMgmt type=%d timeout=%ld\n",
382 ioc->name, tm_type, timeout));
384 INITIALIZE_MGMT_STATUS(ioc->taskmgmt_cmds.status)
385 time_count = jiffies;
386 if ((ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q) &&
387 (ioc->facts.MsgVersion >= MPI_VERSION_01_05))
388 mpt_put_msg_frame_hi_pri(mptctl_taskmgmt_id, ioc, mf);
390 retval = mpt_send_handshake_request(mptctl_taskmgmt_id, ioc,
391 sizeof(SCSITaskMgmt_t), (u32 *)pScsiTm, CAN_SLEEP);
394 printk(MYIOC_s_ERR_FMT
395 "TaskMgmt send_handshake FAILED!"
396 " (ioc %p, mf %p, rc=%d) \n", ioc->name,
398 mpt_free_msg_frame(ioc, mf);
399 mpt_clear_taskmgmt_in_progress_flag(ioc);
404 /* Now wait for the command to complete */
405 ii = wait_for_completion_timeout(&ioc->taskmgmt_cmds.done, timeout*HZ);
407 if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
408 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
409 "TaskMgmt failed\n", ioc->name));
410 mpt_free_msg_frame(ioc, mf);
411 mpt_clear_taskmgmt_in_progress_flag(ioc);
412 if (ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET)
415 retval = -1; /* return failure */
419 if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_RF_VALID)) {
420 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
421 "TaskMgmt failed\n", ioc->name));
422 retval = -1; /* return failure */
426 pScsiTmReply = (SCSITaskMgmtReply_t *) ioc->taskmgmt_cmds.reply;
427 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
428 "TaskMgmt fw_channel = %d, fw_id = %d, task_type=0x%02X, "
429 "iocstatus=0x%04X\n\tloginfo=0x%08X, response_code=0x%02X, "
430 "term_cmnds=%d\n", ioc->name, pScsiTmReply->Bus,
431 pScsiTmReply->TargetID, tm_type,
432 le16_to_cpu(pScsiTmReply->IOCStatus),
433 le32_to_cpu(pScsiTmReply->IOCLogInfo),
434 pScsiTmReply->ResponseCode,
435 le32_to_cpu(pScsiTmReply->TerminationCount)));
437 iocstatus = le16_to_cpu(pScsiTmReply->IOCStatus) & MPI_IOCSTATUS_MASK;
439 if (iocstatus == MPI_IOCSTATUS_SCSI_TASK_TERMINATED ||
440 iocstatus == MPI_IOCSTATUS_SCSI_IOC_TERMINATED ||
441 iocstatus == MPI_IOCSTATUS_SUCCESS)
444 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
445 "TaskMgmt failed\n", ioc->name));
446 retval = -1; /* return failure */
450 mutex_unlock(&ioc->taskmgmt_cmds.mutex);
451 CLEAR_MGMT_STATUS(ioc->taskmgmt_cmds.status)
455 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
456 /* mptctl_timeout_expired
458 * Expecting an interrupt, however timed out.
462 mptctl_timeout_expired(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
466 SCSIIORequest_t *scsi_req = (SCSIIORequest_t *) mf;
467 u8 function = mf->u.hdr.Function;
469 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": %s\n",
470 ioc->name, __func__));
472 if (mpt_fwfault_debug)
473 mpt_halt_firmware(ioc);
475 spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
476 if (ioc->ioc_reset_in_progress) {
477 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
478 CLEAR_MGMT_PENDING_STATUS(ioc->ioctl_cmds.status)
479 mpt_free_msg_frame(ioc, mf);
482 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
485 CLEAR_MGMT_PENDING_STATUS(ioc->ioctl_cmds.status)
487 if (ioc->bus_type == SAS) {
488 if (function == MPI_FUNCTION_SCSI_IO_REQUEST)
489 ret_val = mptctl_do_taskmgmt(ioc,
490 MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET,
491 scsi_req->Bus, scsi_req->TargetID);
492 else if (function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)
493 ret_val = mptctl_do_taskmgmt(ioc,
494 MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
499 if ((function == MPI_FUNCTION_SCSI_IO_REQUEST) ||
500 (function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH))
501 ret_val = mptctl_do_taskmgmt(ioc,
502 MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
508 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Calling Reset! \n",
510 mpt_Soft_Hard_ResetHandler(ioc, CAN_SLEEP);
511 mpt_free_msg_frame(ioc, mf);
515 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
518 * Clean-up functionality. Used only if there has been a
519 * reload of the FW due.
523 mptctl_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
525 switch(reset_phase) {
526 case MPT_IOC_SETUP_RESET:
527 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
528 "%s: MPT_IOC_SETUP_RESET\n", ioc->name, __func__));
530 case MPT_IOC_PRE_RESET:
531 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
532 "%s: MPT_IOC_PRE_RESET\n", ioc->name, __func__));
534 case MPT_IOC_POST_RESET:
535 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
536 "%s: MPT_IOC_POST_RESET\n", ioc->name, __func__));
537 if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_PENDING) {
538 ioc->ioctl_cmds.status |= MPT_MGMT_STATUS_DID_IOCRESET;
539 complete(&ioc->ioctl_cmds.done);
549 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
550 /* ASYNC Event Notification Support */
552 mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
556 event = le32_to_cpu(pEvReply->Event) & 0xFF;
558 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s() called\n",
559 ioc->name, __func__));
560 if(async_queue == NULL)
563 /* Raise SIGIO for persistent events.
564 * TODO - this define is not in MPI spec yet,
565 * but they plan to set it to 0x21
567 if (event == 0x21 ) {
568 ioc->aen_event_read_flag=1;
569 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Raised SIGIO to application\n",
571 devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
572 "Raised SIGIO to application\n", ioc->name));
573 kill_fasync(&async_queue, SIGIO, POLL_IN);
577 /* This flag is set after SIGIO was raised, and
578 * remains set until the application has read
579 * the event log via ioctl=MPTEVENTREPORT
581 if(ioc->aen_event_read_flag)
584 /* Signal only for the events that are
585 * requested for by the application
587 if (ioc->events && (ioc->eventTypes & ( 1 << event))) {
588 ioc->aen_event_read_flag=1;
589 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
590 "Raised SIGIO to application\n", ioc->name));
591 devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
592 "Raised SIGIO to application\n", ioc->name));
593 kill_fasync(&async_queue, SIGIO, POLL_IN);
599 mptctl_fasync(int fd, struct file *filep, int mode)
605 list_for_each_entry(ioc, &ioc_list, list)
606 ioc->aen_event_read_flag=0;
608 ret = fasync_helper(fd, filep, mode, &async_queue);
613 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
616 * cmd - specify the particular IOCTL command to be issued
617 * arg - data specific to the command. Must not be null.
620 __mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
622 mpt_ioctl_header __user *uhdr = (void __user *) arg;
623 mpt_ioctl_header khdr;
626 int nonblock = (file->f_flags & O_NONBLOCK);
628 MPT_ADAPTER *iocp = NULL;
630 if (copy_from_user(&khdr, uhdr, sizeof(khdr))) {
631 printk(KERN_ERR MYNAM "%s::mptctl_ioctl() @%d - "
632 "Unable to copy mpt_ioctl_header data @ %p\n",
633 __FILE__, __LINE__, uhdr);
636 ret = -ENXIO; /* (-6) No such device or address */
638 /* Verify intended MPT adapter - set iocnum and the adapter
641 iocnumX = khdr.iocnum & 0xFF;
642 if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
647 printk(KERN_DEBUG MYNAM "%s::mptctl_ioctl() @%d - Controller disabled.\n",
652 /* Handle those commands that are just returning
653 * information stored in the driver.
654 * These commands should never time out and are unaffected
655 * by TM and FW reloads.
657 if ((cmd & ~IOCSIZE_MASK) == (MPTIOCINFO & ~IOCSIZE_MASK)) {
658 return mptctl_getiocinfo(arg, _IOC_SIZE(cmd));
659 } else if (cmd == MPTTARGETINFO) {
660 return mptctl_gettargetinfo(arg);
661 } else if (cmd == MPTTEST) {
662 return mptctl_readtest(arg);
663 } else if (cmd == MPTEVENTQUERY) {
664 return mptctl_eventquery(arg);
665 } else if (cmd == MPTEVENTENABLE) {
666 return mptctl_eventenable(arg);
667 } else if (cmd == MPTEVENTREPORT) {
668 return mptctl_eventreport(arg);
669 } else if (cmd == MPTFWREPLACE) {
670 return mptctl_replace_fw(arg);
673 /* All of these commands require an interrupt or
674 * are unknown/illegal.
676 if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0)
679 if (cmd == MPTFWDOWNLOAD)
680 ret = mptctl_fw_download(arg);
681 else if (cmd == MPTCOMMAND)
682 ret = mptctl_mpt_command(arg);
683 else if (cmd == MPTHARDRESET)
684 ret = mptctl_do_reset(arg);
685 else if ((cmd & ~IOCSIZE_MASK) == (HP_GETHOSTINFO & ~IOCSIZE_MASK))
686 ret = mptctl_hp_hostinfo(arg, _IOC_SIZE(cmd));
687 else if (cmd == HP_GETTARGETINFO)
688 ret = mptctl_hp_targetinfo(arg);
692 mutex_unlock(&iocp->ioctl_cmds.mutex);
698 mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
702 ret = __mptctl_ioctl(file, cmd, arg);
707 static int mptctl_do_reset(unsigned long arg)
709 struct mpt_ioctl_diag_reset __user *urinfo = (void __user *) arg;
710 struct mpt_ioctl_diag_reset krinfo;
713 if (copy_from_user(&krinfo, urinfo, sizeof(struct mpt_ioctl_diag_reset))) {
714 printk(KERN_ERR MYNAM "%s@%d::mptctl_do_reset - "
715 "Unable to copy mpt_ioctl_diag_reset struct @ %p\n",
716 __FILE__, __LINE__, urinfo);
720 if (mpt_verify_adapter(krinfo.hdr.iocnum, &iocp) < 0) {
721 printk(KERN_DEBUG MYNAM "%s@%d::mptctl_do_reset - ioc%d not found!\n",
722 __FILE__, __LINE__, krinfo.hdr.iocnum);
723 return -ENODEV; /* (-6) No such device or address */
726 dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "mptctl_do_reset called.\n",
729 if (mpt_HardResetHandler(iocp, CAN_SLEEP) != 0) {
730 printk (MYIOC_s_ERR_FMT "%s@%d::mptctl_do_reset - reset failed.\n",
731 iocp->name, __FILE__, __LINE__);
738 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
740 * MPT FW download function. Cast the arg into the mpt_fw_xfer structure.
741 * This structure contains: iocnum, firmware length (bytes),
742 * pointer to user space memory where the fw image is stored.
745 * Return: 0 if successful
746 * -EFAULT if data unavailable
747 * -ENXIO if no such device
748 * -EAGAIN if resource problem
749 * -ENOMEM if no memory for SGE
750 * -EMLINK if too many chain buffers required
751 * -EBADRQC if adapter does not support FW download
752 * -EBUSY if adapter is busy
753 * -ENOMSG if FW upload returned bad status
756 mptctl_fw_download(unsigned long arg)
758 struct mpt_fw_xfer __user *ufwdl = (void __user *) arg;
759 struct mpt_fw_xfer kfwdl;
761 if (copy_from_user(&kfwdl, ufwdl, sizeof(struct mpt_fw_xfer))) {
762 printk(KERN_ERR MYNAM "%s@%d::_ioctl_fwdl - "
763 "Unable to copy mpt_fw_xfer struct @ %p\n",
764 __FILE__, __LINE__, ufwdl);
768 return mptctl_do_fw_download(kfwdl.iocnum, kfwdl.bufp, kfwdl.fwlen);
771 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
773 * FW Download engine.
775 * Return: 0 if successful
776 * -EFAULT if data unavailable
777 * -ENXIO if no such device
778 * -EAGAIN if resource problem
779 * -ENOMEM if no memory for SGE
780 * -EMLINK if too many chain buffers required
781 * -EBADRQC if adapter does not support FW download
782 * -EBUSY if adapter is busy
783 * -ENOMSG if FW upload returned bad status
786 mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)
791 FWDownloadTCSGE_t *ptsge;
792 MptSge_t *sgl, *sgIn;
794 struct buflist *buflist;
803 int fw_bytes_copied = 0;
807 pFWDownloadReply_t ReplyMsg = NULL;
808 unsigned long timeleft;
810 if (mpt_verify_adapter(ioc, &iocp) < 0) {
811 printk(KERN_DEBUG MYNAM "ioctl_fwdl - ioc%d not found!\n",
813 return -ENODEV; /* (-6) No such device or address */
816 /* Valid device. Get a message frame and construct the FW download message.
818 if ((mf = mpt_get_msg_frame(mptctl_id, iocp)) == NULL)
822 dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT
823 "mptctl_do_fwdl called. mptctl_id = %xh.\n", iocp->name, mptctl_id));
824 dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: kfwdl.bufp = %p\n",
825 iocp->name, ufwbuf));
826 dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: kfwdl.fwlen = %d\n",
827 iocp->name, (int)fwlen));
828 dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: kfwdl.ioc = %04xh\n",
831 dlmsg = (FWDownload_t*) mf;
832 ptsge = (FWDownloadTCSGE_t *) &dlmsg->SGL;
833 sgOut = (char *) (ptsge + 1);
836 * Construct f/w download request
838 dlmsg->ImageType = MPI_FW_DOWNLOAD_ITYPE_FW;
840 dlmsg->ChainOffset = 0;
841 dlmsg->Function = MPI_FUNCTION_FW_DOWNLOAD;
842 dlmsg->Reserved1[0] = dlmsg->Reserved1[1] = dlmsg->Reserved1[2] = 0;
843 if (iocp->facts.MsgVersion >= MPI_VERSION_01_05)
844 dlmsg->MsgFlags = MPI_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT;
849 /* Set up the Transaction SGE.
852 ptsge->ContextSize = 0;
853 ptsge->DetailsLength = 12;
854 ptsge->Flags = MPI_SGE_FLAGS_TRANSACTION_ELEMENT;
855 ptsge->Reserved_0100_Checksum = 0;
856 ptsge->ImageOffset = 0;
857 ptsge->ImageSize = cpu_to_le32(fwlen);
863 * Need to kmalloc area(s) for holding firmware image bytes.
864 * But we need to do it piece meal, using a proper
865 * scatter gather list (with 128kB MAX hunks).
867 * A practical limit here might be # of sg hunks that fit into
868 * a single IOC request frame; 12 or 8 (see below), so:
869 * For FC9xx: 12 x 128kB == 1.5 mB (max)
870 * For C1030: 8 x 128kB == 1 mB (max)
871 * We could support chaining, but things get ugly(ier:)
873 * Set the sge_offset to the start of the sgl (bytes).
875 sgdir = 0x04000000; /* IOC will READ from sys mem */
876 sge_offset = sizeof(MPIHeader_t) + sizeof(FWDownloadTCSGE_t);
877 if ((sgl = kbuf_alloc_2_sgl(fwlen, sgdir, sge_offset,
878 &numfrags, &buflist, &sgl_dma, iocp)) == NULL)
882 * We should only need SGL with 2 simple_32bit entries (up to 256 kB)
883 * for FC9xx f/w image, but calculate max number of sge hunks
884 * we can fit into a request frame, and limit ourselves to that.
885 * (currently no chain support)
886 * maxfrags = (Request Size - FWdownload Size ) / Size of 32 bit SGE
892 maxfrags = (iocp->req_sz - sizeof(MPIHeader_t) -
893 sizeof(FWDownloadTCSGE_t))
895 if (numfrags > maxfrags) {
900 dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: sgl buffer = %p, sgfrags = %d\n",
901 iocp->name, sgl, numfrags));
904 * Parse SG list, copying sgl itself,
905 * plus f/w image hunks from user space as we go...
910 for (i=0; i < numfrags; i++) {
912 /* Get the SGE type: 0 - TCSGE, 3 - Chain, 1 - Simple SGE
913 * Skip everything but Simple. If simple, copy from
914 * user space into kernel space.
915 * Note: we should not have anything but Simple as
916 * Chain SGE are illegal.
918 nib = (sgIn->FlagsLength & 0x30000000) >> 28;
919 if (nib == 0 || nib == 3) {
921 } else if (sgIn->Address) {
922 iocp->add_sge(sgOut, sgIn->FlagsLength, sgIn->Address);
924 if (copy_from_user(bl->kptr, ufwbuf+fw_bytes_copied, bl->len)) {
925 printk(MYIOC_s_ERR_FMT "%s@%d::_ioctl_fwdl - "
926 "Unable to copy f/w buffer hunk#%d @ %p\n",
927 iocp->name, __FILE__, __LINE__, n, ufwbuf);
930 fw_bytes_copied += bl->len;
934 sgOut += iocp->SGE_size;
937 DBG_DUMP_FW_DOWNLOAD(iocp, (u32 *)mf, numfrags);
940 * Finally, perform firmware download.
943 SET_MGMT_MSG_CONTEXT(iocp->ioctl_cmds.msg_context, dlmsg->MsgContext);
944 INITIALIZE_MGMT_STATUS(iocp->ioctl_cmds.status)
945 mpt_put_msg_frame(mptctl_id, iocp, mf);
947 /* Now wait for the command to complete */
949 timeleft = wait_for_completion_timeout(&iocp->ioctl_cmds.done, HZ*60);
950 if (!(iocp->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
952 printk(MYIOC_s_WARN_FMT "%s: failed\n", iocp->name, __func__);
953 if (iocp->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
954 mpt_free_msg_frame(iocp, mf);
958 mptctl_timeout_expired(iocp, mf);
964 if (!(iocp->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID)) {
965 printk(MYIOC_s_WARN_FMT "%s: failed\n", iocp->name, __func__);
966 mpt_free_msg_frame(iocp, mf);
972 kfree_sgl(sgl, sgl_dma, buflist, iocp);
974 ReplyMsg = (pFWDownloadReply_t)iocp->ioctl_cmds.reply;
975 iocstat = le16_to_cpu(ReplyMsg->IOCStatus) & MPI_IOCSTATUS_MASK;
976 if (iocstat == MPI_IOCSTATUS_SUCCESS) {
977 printk(MYIOC_s_INFO_FMT "F/W update successfull!\n", iocp->name);
979 } else if (iocstat == MPI_IOCSTATUS_INVALID_FUNCTION) {
980 printk(MYIOC_s_WARN_FMT "Hmmm... F/W download not supported!?!\n",
982 printk(MYIOC_s_WARN_FMT "(time to go bang on somebodies door)\n",
985 } else if (iocstat == MPI_IOCSTATUS_BUSY) {
986 printk(MYIOC_s_WARN_FMT "IOC_BUSY!\n", iocp->name);
987 printk(MYIOC_s_WARN_FMT "(try again later?)\n", iocp->name);
990 printk(MYIOC_s_WARN_FMT "ioctl_fwdl() returned [bad] status = %04xh\n",
991 iocp->name, iocstat);
992 printk(MYIOC_s_WARN_FMT "(bad VooDoo)\n", iocp->name);
999 CLEAR_MGMT_STATUS(iocp->ioctl_cmds.status);
1000 SET_MGMT_MSG_CONTEXT(iocp->ioctl_cmds.msg_context, 0);
1001 kfree_sgl(sgl, sgl_dma, buflist, iocp);
1005 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1007 * SGE Allocation routine
1009 * Inputs: bytes - number of bytes to be transferred
1010 * sgdir - data direction
1011 * sge_offset - offset (in bytes) from the start of the request
1012 * frame to the first SGE
1013 * ioc - pointer to the mptadapter
1014 * Outputs: frags - number of scatter gather elements
1015 * blp - point to the buflist pointer
1016 * sglbuf_dma - pointer to the (dma) sgl
1017 * Returns: Null if failes
1018 * pointer to the (virtual) sgl if successful.
1021 kbuf_alloc_2_sgl(int bytes, u32 sgdir, int sge_offset, int *frags,
1022 struct buflist **blp, dma_addr_t *sglbuf_dma, MPT_ADAPTER *ioc)
1024 MptSge_t *sglbuf = NULL; /* pointer to array of SGE */
1025 /* and chain buffers */
1026 struct buflist *buflist = NULL; /* kernel routine */
1030 int alloc_sz = min(bytes,MAX_KMALLOC_SZ); // avoid kernel warning msg!
1031 int bytes_allocd = 0;
1033 dma_addr_t pa; // phys addr
1035 int sg_spill = MAX_FRAGS_SPILL1;
1037 /* initialization */
1041 /* Allocate and initialize an array of kernel
1042 * structures for the SG elements.
1044 i = MAX_SGL_BYTES / 8;
1045 buflist = kzalloc(i, GFP_USER);
1050 /* Allocate a single block of memory to store the sg elements and
1051 * the chain buffers. The calling routine is responsible for
1052 * copying the data in this array into the correct place in the
1053 * request and chain buffers.
1055 sglbuf = pci_alloc_consistent(ioc->pcidev, MAX_SGL_BYTES, sglbuf_dma);
1059 if (sgdir & 0x04000000)
1060 dir = PCI_DMA_TODEVICE;
1062 dir = PCI_DMA_FROMDEVICE;
1065 * sgl = sglbuf = point to beginning of sg buffer
1066 * buflist_ent = 0 = first kernel structure
1067 * sg_spill = number of SGE that can be written before the first
1072 sg_spill = ((ioc->req_sz - sge_offset)/ioc->SGE_size) - 1;
1073 while (bytes_allocd < bytes) {
1074 this_alloc = min(alloc_sz, bytes-bytes_allocd);
1075 buflist[buflist_ent].len = this_alloc;
1076 buflist[buflist_ent].kptr = pci_alloc_consistent(ioc->pcidev,
1079 if (buflist[buflist_ent].kptr == NULL) {
1080 alloc_sz = alloc_sz / 2;
1081 if (alloc_sz == 0) {
1082 printk(MYIOC_s_WARN_FMT "-SG: No can do - "
1083 "not enough memory! :-(\n", ioc->name);
1084 printk(MYIOC_s_WARN_FMT "-SG: (freeing %d frags)\n",
1085 ioc->name, numfrags);
1090 dma_addr_t dma_addr;
1092 bytes_allocd += this_alloc;
1093 sgl->FlagsLength = (0x10000000|sgdir|this_alloc);
1094 dma_addr = pci_map_single(ioc->pcidev,
1095 buflist[buflist_ent].kptr, this_alloc, dir);
1096 sgl->Address = dma_addr;
1104 if (bytes_allocd >= bytes)
1107 /* Need to chain? */
1108 if (fragcnt == sg_spill) {
1109 printk(MYIOC_s_WARN_FMT
1110 "-SG: No can do - " "Chain required! :-(\n", ioc->name);
1111 printk(MYIOC_s_WARN_FMT "(freeing %d frags)\n", ioc->name, numfrags);
1115 /* overflow check... */
1116 if (numfrags*8 > MAX_SGL_BYTES){
1118 printk(MYIOC_s_WARN_FMT "-SG: No can do - "
1119 "too many SG frags! :-(\n", ioc->name);
1120 printk(MYIOC_s_WARN_FMT "-SG: (freeing %d frags)\n",
1121 ioc->name, numfrags);
1126 /* Last sge fixup: set LE+eol+eob bits */
1127 sgl[-1].FlagsLength |= 0xC1000000;
1132 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "-SG: kbuf_alloc_2_sgl() - "
1133 "%d SG frags generated!\n", ioc->name, numfrags));
1135 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "-SG: kbuf_alloc_2_sgl() - "
1136 "last (big) alloc_sz=%d\n", ioc->name, alloc_sz));
1141 if (sglbuf != NULL) {
1142 for (i = 0; i < numfrags; i++) {
1143 dma_addr_t dma_addr;
1147 if ((sglbuf[i].FlagsLength >> 24) == 0x30)
1150 dma_addr = sglbuf[i].Address;
1151 kptr = buflist[i].kptr;
1152 len = buflist[i].len;
1154 pci_free_consistent(ioc->pcidev, len, kptr, dma_addr);
1156 pci_free_consistent(ioc->pcidev, MAX_SGL_BYTES, sglbuf, *sglbuf_dma);
1162 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1164 * Routine to free the SGL elements.
1167 kfree_sgl(MptSge_t *sgl, dma_addr_t sgl_dma, struct buflist *buflist, MPT_ADAPTER *ioc)
1170 struct buflist *bl = buflist;
1175 if (sg->FlagsLength & 0x04000000)
1176 dir = PCI_DMA_TODEVICE;
1178 dir = PCI_DMA_FROMDEVICE;
1180 nib = (sg->FlagsLength & 0xF0000000) >> 28;
1181 while (! (nib & 0x4)) { /* eob */
1182 /* skip ignore/chain. */
1183 if (nib == 0 || nib == 3) {
1185 } else if (sg->Address) {
1186 dma_addr_t dma_addr;
1190 dma_addr = sg->Address;
1193 pci_unmap_single(ioc->pcidev, dma_addr, len, dir);
1194 pci_free_consistent(ioc->pcidev, len, kptr, dma_addr);
1199 nib = (le32_to_cpu(sg->FlagsLength) & 0xF0000000) >> 28;
1204 dma_addr_t dma_addr;
1208 dma_addr = sg->Address;
1211 pci_unmap_single(ioc->pcidev, dma_addr, len, dir);
1212 pci_free_consistent(ioc->pcidev, len, kptr, dma_addr);
1216 pci_free_consistent(ioc->pcidev, MAX_SGL_BYTES, sgl, sgl_dma);
1218 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "-SG: Free'd 1 SGL buf + %d kbufs!\n",
1222 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1224 * mptctl_getiocinfo - Query the host adapter for IOC information.
1225 * @arg: User space argument
1228 * Return: 0 if successful
1229 * -EFAULT if data unavailable
1230 * -ENODEV if no such device/adapter
1233 mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
1235 struct mpt_ioctl_iocinfo __user *uarg = (void __user *) arg;
1236 struct mpt_ioctl_iocinfo *karg;
1238 struct pci_dev *pdev;
1243 struct scsi_device *sdev;
1244 VirtDevice *vdevice;
1246 /* Add of PCI INFO results in unaligned access for
1247 * IA64 and Sparc. Reset long to int. Return no PCI
1248 * data for obsolete format.
1250 if (data_size == sizeof(struct mpt_ioctl_iocinfo_rev0))
1252 else if (data_size == sizeof(struct mpt_ioctl_iocinfo_rev1))
1254 else if (data_size == sizeof(struct mpt_ioctl_iocinfo))
1256 else if (data_size == (sizeof(struct mpt_ioctl_iocinfo_rev0)+12))
1257 cim_rev = 0; /* obsolete */
1261 karg = kmalloc(data_size, GFP_KERNEL);
1263 printk(KERN_ERR MYNAM "%s::mpt_ioctl_iocinfo() @%d - no memory available!\n",
1264 __FILE__, __LINE__);
1268 if (copy_from_user(karg, uarg, data_size)) {
1269 printk(KERN_ERR MYNAM "%s@%d::mptctl_getiocinfo - "
1270 "Unable to read in mpt_ioctl_iocinfo struct @ %p\n",
1271 __FILE__, __LINE__, uarg);
1276 if (((iocnum = mpt_verify_adapter(karg->hdr.iocnum, &ioc)) < 0) ||
1278 printk(KERN_DEBUG MYNAM "%s::mptctl_getiocinfo() @%d - ioc%d not found!\n",
1279 __FILE__, __LINE__, iocnum);
1284 /* Verify the data transfer size is correct. */
1285 if (karg->hdr.maxDataSize != data_size) {
1286 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_getiocinfo - "
1287 "Structure size mismatch. Command not completed.\n",
1288 ioc->name, __FILE__, __LINE__);
1293 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_getiocinfo called.\n",
1296 /* Fill in the data and return the structure to the calling
1299 if (ioc->bus_type == SAS)
1300 karg->adapterType = MPT_IOCTL_INTERFACE_SAS;
1301 else if (ioc->bus_type == FC)
1302 karg->adapterType = MPT_IOCTL_INTERFACE_FC;
1304 karg->adapterType = MPT_IOCTL_INTERFACE_SCSI;
1306 if (karg->hdr.port > 1)
1308 port = karg->hdr.port;
1311 pdev = (struct pci_dev *) ioc->pcidev;
1313 karg->pciId = pdev->device;
1314 pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision);
1315 karg->hwRev = revision;
1316 karg->subSystemDevice = pdev->subsystem_device;
1317 karg->subSystemVendor = pdev->subsystem_vendor;
1320 /* Get the PCI bus, device, and function numbers for the IOC
1322 karg->pciInfo.u.bits.busNumber = pdev->bus->number;
1323 karg->pciInfo.u.bits.deviceNumber = PCI_SLOT( pdev->devfn );
1324 karg->pciInfo.u.bits.functionNumber = PCI_FUNC( pdev->devfn );
1325 } else if (cim_rev == 2) {
1326 /* Get the PCI bus, device, function and segment ID numbers
1328 karg->pciInfo.u.bits.busNumber = pdev->bus->number;
1329 karg->pciInfo.u.bits.deviceNumber = PCI_SLOT( pdev->devfn );
1330 karg->pciInfo.u.bits.functionNumber = PCI_FUNC( pdev->devfn );
1331 karg->pciInfo.segmentID = pci_domain_nr(pdev->bus);
1334 /* Get number of devices
1336 karg->numDevices = 0;
1338 shost_for_each_device(sdev, ioc->sh) {
1339 vdevice = sdev->hostdata;
1340 if (vdevice == NULL || vdevice->vtarget == NULL)
1342 if (vdevice->vtarget->tflags &
1343 MPT_TARGET_FLAGS_RAID_COMPONENT)
1349 /* Set the BIOS and FW Version
1351 karg->FWVersion = ioc->facts.FWVersion.Word;
1352 karg->BIOSVersion = ioc->biosVersion;
1354 /* Set the Version Strings.
1356 strncpy (karg->driverVersion, MPT_LINUX_PACKAGE_NAME, MPT_IOCTL_VERSION_LENGTH);
1357 karg->driverVersion[MPT_IOCTL_VERSION_LENGTH-1]='\0';
1359 karg->busChangeEvent = 0;
1360 karg->hostId = ioc->pfacts[port].PortSCSIID;
1361 karg->rsvd[0] = karg->rsvd[1] = 0;
1363 /* Copy the data from kernel memory to user memory
1365 if (copy_to_user((char __user *)arg, karg, data_size)) {
1366 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_getiocinfo - "
1367 "Unable to write out mpt_ioctl_iocinfo struct @ %p\n",
1368 ioc->name, __FILE__, __LINE__, uarg);
1377 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1379 * mptctl_gettargetinfo - Query the host adapter for target information.
1380 * @arg: User space argument
1383 * Return: 0 if successful
1384 * -EFAULT if data unavailable
1385 * -ENODEV if no such device/adapter
1388 mptctl_gettargetinfo (unsigned long arg)
1390 struct mpt_ioctl_targetinfo __user *uarg = (void __user *) arg;
1391 struct mpt_ioctl_targetinfo karg;
1393 VirtDevice *vdevice;
1402 struct scsi_device *sdev;
1404 if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_targetinfo))) {
1405 printk(KERN_ERR MYNAM "%s@%d::mptctl_gettargetinfo - "
1406 "Unable to read in mpt_ioctl_targetinfo struct @ %p\n",
1407 __FILE__, __LINE__, uarg);
1411 if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
1413 printk(KERN_DEBUG MYNAM "%s::mptctl_gettargetinfo() @%d - ioc%d not found!\n",
1414 __FILE__, __LINE__, iocnum);
1418 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_gettargetinfo called.\n",
1420 /* Get the port number and set the maximum number of bytes
1421 * in the returned structure.
1422 * Ignore the port setting.
1424 numBytes = karg.hdr.maxDataSize - sizeof(mpt_ioctl_header);
1425 maxWordsLeft = numBytes/sizeof(int);
1426 port = karg.hdr.port;
1428 if (maxWordsLeft <= 0) {
1429 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo() - no memory available!\n",
1430 ioc->name, __FILE__, __LINE__);
1434 /* Fill in the data and return the structure to the calling
1438 /* struct mpt_ioctl_targetinfo does not contain sufficient space
1439 * for the target structures so when the IOCTL is called, there is
1440 * not sufficient stack space for the structure. Allocate memory,
1441 * populate the memory, copy back to the user, then free memory.
1442 * targetInfo format:
1443 * bits 31-24: reserved
1448 pmem = kzalloc(numBytes, GFP_KERNEL);
1450 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo() - no memory available!\n",
1451 ioc->name, __FILE__, __LINE__);
1454 pdata = (int *) pmem;
1456 /* Get number of devices
1459 shost_for_each_device(sdev, ioc->sh) {
1462 vdevice = sdev->hostdata;
1463 if (vdevice == NULL || vdevice->vtarget == NULL)
1465 if (vdevice->vtarget->tflags &
1466 MPT_TARGET_FLAGS_RAID_COMPONENT)
1468 lun = (vdevice->vtarget->raidVolume) ? 0x80 : vdevice->lun;
1469 *pdata = (((u8)lun << 16) + (vdevice->vtarget->channel << 8) +
1470 (vdevice->vtarget->id ));
1476 karg.numDevices = numDevices;
1478 /* Copy part of the data from kernel memory to user memory
1480 if (copy_to_user((char __user *)arg, &karg,
1481 sizeof(struct mpt_ioctl_targetinfo))) {
1482 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo - "
1483 "Unable to write out mpt_ioctl_targetinfo struct @ %p\n",
1484 ioc->name, __FILE__, __LINE__, uarg);
1489 /* Copy the remaining data from kernel memory to user memory
1491 if (copy_to_user(uarg->targetInfo, pmem, numBytes)) {
1492 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo - "
1493 "Unable to write out mpt_ioctl_targetinfo struct @ %p\n",
1494 ioc->name, __FILE__, __LINE__, pdata);
1504 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1505 /* MPT IOCTL Test function.
1508 * Return: 0 if successful
1509 * -EFAULT if data unavailable
1510 * -ENODEV if no such device/adapter
1513 mptctl_readtest (unsigned long arg)
1515 struct mpt_ioctl_test __user *uarg = (void __user *) arg;
1516 struct mpt_ioctl_test karg;
1520 if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_test))) {
1521 printk(KERN_ERR MYNAM "%s@%d::mptctl_readtest - "
1522 "Unable to read in mpt_ioctl_test struct @ %p\n",
1523 __FILE__, __LINE__, uarg);
1527 if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
1529 printk(KERN_DEBUG MYNAM "%s::mptctl_readtest() @%d - ioc%d not found!\n",
1530 __FILE__, __LINE__, iocnum);
1534 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_readtest called.\n",
1536 /* Fill in the data and return the structure to the calling
1541 karg.chip_type = ioc->mfcnt;
1543 karg.chip_type = ioc->pcidev->device;
1545 strncpy (karg.name, ioc->name, MPT_MAX_NAME);
1546 karg.name[MPT_MAX_NAME-1]='\0';
1547 strncpy (karg.product, ioc->prod_name, MPT_PRODUCT_LENGTH);
1548 karg.product[MPT_PRODUCT_LENGTH-1]='\0';
1550 /* Copy the data from kernel memory to user memory
1552 if (copy_to_user((char __user *)arg, &karg, sizeof(struct mpt_ioctl_test))) {
1553 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_readtest - "
1554 "Unable to write out mpt_ioctl_test struct @ %p\n",
1555 ioc->name, __FILE__, __LINE__, uarg);
1562 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1564 * mptctl_eventquery - Query the host adapter for the event types
1565 * that are being logged.
1566 * @arg: User space argument
1569 * Return: 0 if successful
1570 * -EFAULT if data unavailable
1571 * -ENODEV if no such device/adapter
1574 mptctl_eventquery (unsigned long arg)
1576 struct mpt_ioctl_eventquery __user *uarg = (void __user *) arg;
1577 struct mpt_ioctl_eventquery karg;
1581 if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventquery))) {
1582 printk(KERN_ERR MYNAM "%s@%d::mptctl_eventquery - "
1583 "Unable to read in mpt_ioctl_eventquery struct @ %p\n",
1584 __FILE__, __LINE__, uarg);
1588 if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
1590 printk(KERN_DEBUG MYNAM "%s::mptctl_eventquery() @%d - ioc%d not found!\n",
1591 __FILE__, __LINE__, iocnum);
1595 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_eventquery called.\n",
1597 karg.eventEntries = MPTCTL_EVENT_LOG_SIZE;
1598 karg.eventTypes = ioc->eventTypes;
1600 /* Copy the data from kernel memory to user memory
1602 if (copy_to_user((char __user *)arg, &karg, sizeof(struct mpt_ioctl_eventquery))) {
1603 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_eventquery - "
1604 "Unable to write out mpt_ioctl_eventquery struct @ %p\n",
1605 ioc->name, __FILE__, __LINE__, uarg);
1611 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1613 mptctl_eventenable (unsigned long arg)
1615 struct mpt_ioctl_eventenable __user *uarg = (void __user *) arg;
1616 struct mpt_ioctl_eventenable karg;
1620 if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventenable))) {
1621 printk(KERN_ERR MYNAM "%s@%d::mptctl_eventenable - "
1622 "Unable to read in mpt_ioctl_eventenable struct @ %p\n",
1623 __FILE__, __LINE__, uarg);
1627 if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
1629 printk(KERN_DEBUG MYNAM "%s::mptctl_eventenable() @%d - ioc%d not found!\n",
1630 __FILE__, __LINE__, iocnum);
1634 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_eventenable called.\n",
1636 if (ioc->events == NULL) {
1637 /* Have not yet allocated memory - do so now.
1639 int sz = MPTCTL_EVENT_LOG_SIZE * sizeof(MPT_IOCTL_EVENTS);
1640 ioc->events = kzalloc(sz, GFP_KERNEL);
1642 printk(MYIOC_s_ERR_FMT
1643 ": ERROR - Insufficient memory to add adapter!\n",
1647 ioc->alloc_total += sz;
1649 ioc->eventContext = 0;
1652 /* Update the IOC event logging flag.
1654 ioc->eventTypes = karg.eventTypes;
1659 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1661 mptctl_eventreport (unsigned long arg)
1663 struct mpt_ioctl_eventreport __user *uarg = (void __user *) arg;
1664 struct mpt_ioctl_eventreport karg;
1667 int numBytes, maxEvents, max;
1669 if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventreport))) {
1670 printk(KERN_ERR MYNAM "%s@%d::mptctl_eventreport - "
1671 "Unable to read in mpt_ioctl_eventreport struct @ %p\n",
1672 __FILE__, __LINE__, uarg);
1676 if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
1678 printk(KERN_DEBUG MYNAM "%s::mptctl_eventreport() @%d - ioc%d not found!\n",
1679 __FILE__, __LINE__, iocnum);
1682 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_eventreport called.\n",
1685 numBytes = karg.hdr.maxDataSize - sizeof(mpt_ioctl_header);
1686 maxEvents = numBytes/sizeof(MPT_IOCTL_EVENTS);
1689 max = MPTCTL_EVENT_LOG_SIZE < maxEvents ? MPTCTL_EVENT_LOG_SIZE : maxEvents;
1691 /* If fewer than 1 event is requested, there must have
1692 * been some type of error.
1694 if ((max < 1) || !ioc->events)
1697 /* reset this flag so SIGIO can restart */
1698 ioc->aen_event_read_flag=0;
1700 /* Copy the data from kernel memory to user memory
1702 numBytes = max * sizeof(MPT_IOCTL_EVENTS);
1703 if (copy_to_user(uarg->eventData, ioc->events, numBytes)) {
1704 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_eventreport - "
1705 "Unable to write out mpt_ioctl_eventreport struct @ %p\n",
1706 ioc->name, __FILE__, __LINE__, ioc->events);
1713 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1715 mptctl_replace_fw (unsigned long arg)
1717 struct mpt_ioctl_replace_fw __user *uarg = (void __user *) arg;
1718 struct mpt_ioctl_replace_fw karg;
1723 if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_replace_fw))) {
1724 printk(KERN_ERR MYNAM "%s@%d::mptctl_replace_fw - "
1725 "Unable to read in mpt_ioctl_replace_fw struct @ %p\n",
1726 __FILE__, __LINE__, uarg);
1730 if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
1732 printk(KERN_DEBUG MYNAM "%s::mptctl_replace_fw() @%d - ioc%d not found!\n",
1733 __FILE__, __LINE__, iocnum);
1737 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_replace_fw called.\n",
1739 /* If caching FW, Free the old FW image
1741 if (ioc->cached_fw == NULL)
1744 mpt_free_fw_memory(ioc);
1746 /* Allocate memory for the new FW image
1748 newFwSize = karg.newImageSize;
1750 if (newFwSize & 0x01)
1752 if (newFwSize & 0x02)
1755 mpt_alloc_fw_memory(ioc, newFwSize);
1756 if (ioc->cached_fw == NULL)
1759 /* Copy the data from user memory to kernel space
1761 if (copy_from_user(ioc->cached_fw, uarg->newImage, newFwSize)) {
1762 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_replace_fw - "
1763 "Unable to read in mpt_ioctl_replace_fw image "
1764 "@ %p\n", ioc->name, __FILE__, __LINE__, uarg);
1765 mpt_free_fw_memory(ioc);
1769 /* Update IOCFactsReply
1771 ioc->facts.FWImageSize = newFwSize;
1775 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1776 /* MPT IOCTL MPTCOMMAND function.
1777 * Cast the arg into the mpt_ioctl_mpt_command structure.
1780 * Return: 0 if successful
1781 * -EBUSY if previous command timeout and IOC reset is not complete.
1782 * -EFAULT if data unavailable
1783 * -ENODEV if no such device/adapter
1784 * -ETIME if timer expires
1785 * -ENOMEM if memory allocation error
1788 mptctl_mpt_command (unsigned long arg)
1790 struct mpt_ioctl_command __user *uarg = (void __user *) arg;
1791 struct mpt_ioctl_command karg;
1797 if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_command))) {
1798 printk(KERN_ERR MYNAM "%s@%d::mptctl_mpt_command - "
1799 "Unable to read in mpt_ioctl_command struct @ %p\n",
1800 __FILE__, __LINE__, uarg);
1804 if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
1806 printk(KERN_DEBUG MYNAM "%s::mptctl_mpt_command() @%d - ioc%d not found!\n",
1807 __FILE__, __LINE__, iocnum);
1811 rc = mptctl_do_mpt_command (karg, &uarg->MF);
1816 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1817 /* Worker routine for the IOCTL MPTCOMMAND and MPTCOMMAND32 (sparc) commands.
1820 * Return: 0 if successful
1821 * -EBUSY if previous command timeout and IOC reset is not complete.
1822 * -EFAULT if data unavailable
1823 * -ENODEV if no such device/adapter
1824 * -ETIME if timer expires
1825 * -ENOMEM if memory allocation error
1826 * -EPERM if SCSI I/O and target is untagged
1829 mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
1832 MPT_FRAME_HDR *mf = NULL;
1835 struct buflist bufIn; /* data In buffer */
1836 struct buflist bufOut; /* data Out buffer */
1837 dma_addr_t dma_addr_in;
1838 dma_addr_t dma_addr_out;
1839 int sgSize = 0; /* Num SG elements */
1840 int iocnum, flagsLength;
1845 unsigned long timeleft;
1846 struct scsi_device *sdev;
1847 unsigned long flags;
1850 /* bufIn and bufOut are used for user to kernel space transfers
1852 bufIn.kptr = bufOut.kptr = NULL;
1853 bufIn.len = bufOut.len = 0;
1855 if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
1857 printk(KERN_DEBUG MYNAM "%s::mptctl_do_mpt_command() @%d - ioc%d not found!\n",
1858 __FILE__, __LINE__, iocnum);
1862 spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
1863 if (ioc->ioc_reset_in_progress) {
1864 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
1865 printk(KERN_ERR MYNAM "%s@%d::mptctl_do_mpt_command - "
1866 "Busy with diagnostic reset\n", __FILE__, __LINE__);
1869 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
1871 /* Verify that the final request frame will not be too large.
1873 sz = karg.dataSgeOffset * 4;
1874 if (karg.dataInSize > 0)
1875 sz += ioc->SGE_size;
1876 if (karg.dataOutSize > 0)
1877 sz += ioc->SGE_size;
1879 if (sz > ioc->req_sz) {
1880 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
1881 "Request frame too large (%d) maximum (%d)\n",
1882 ioc->name, __FILE__, __LINE__, sz, ioc->req_sz);
1886 /* Get a free request frame and save the message context.
1888 if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL)
1891 hdr = (MPIHeader_t *) mf;
1892 msgContext = le32_to_cpu(hdr->MsgContext);
1893 req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx);
1895 /* Copy the request frame
1896 * Reset the saved message context.
1897 * Request frame in user space
1899 if (copy_from_user(mf, mfPtr, karg.dataSgeOffset * 4)) {
1900 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
1901 "Unable to read MF from mpt_ioctl_command struct @ %p\n",
1902 ioc->name, __FILE__, __LINE__, mfPtr);
1907 hdr->MsgContext = cpu_to_le32(msgContext);
1908 function = hdr->Function;
1911 /* Verify that this request is allowed.
1913 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sending mpi function (0x%02X), req=%p\n",
1914 ioc->name, hdr->Function, mf));
1917 case MPI_FUNCTION_IOC_FACTS:
1918 case MPI_FUNCTION_PORT_FACTS:
1919 karg.dataOutSize = karg.dataInSize = 0;
1922 case MPI_FUNCTION_CONFIG:
1924 Config_t *config_frame;
1925 config_frame = (Config_t *)mf;
1926 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\ttype=0x%02x ext_type=0x%02x "
1927 "number=0x%02x action=0x%02x\n", ioc->name,
1928 config_frame->Header.PageType,
1929 config_frame->ExtPageType,
1930 config_frame->Header.PageNumber,
1931 config_frame->Action));
1935 case MPI_FUNCTION_FC_COMMON_TRANSPORT_SEND:
1936 case MPI_FUNCTION_FC_EX_LINK_SRVC_SEND:
1937 case MPI_FUNCTION_FW_UPLOAD:
1938 case MPI_FUNCTION_SCSI_ENCLOSURE_PROCESSOR:
1939 case MPI_FUNCTION_FW_DOWNLOAD:
1940 case MPI_FUNCTION_FC_PRIMITIVE_SEND:
1941 case MPI_FUNCTION_TOOLBOX:
1942 case MPI_FUNCTION_SAS_IO_UNIT_CONTROL:
1945 case MPI_FUNCTION_SCSI_IO_REQUEST:
1947 SCSIIORequest_t *pScsiReq = (SCSIIORequest_t *) mf;
1948 int qtag = MPI_SCSIIO_CONTROL_UNTAGGED;
1953 id = (ioc->devices_per_bus == 0) ? 256 : ioc->devices_per_bus;
1954 if (pScsiReq->TargetID > id) {
1955 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
1956 "Target ID out of bounds. \n",
1957 ioc->name, __FILE__, __LINE__);
1962 if (pScsiReq->Bus >= ioc->number_of_buses) {
1963 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
1964 "Target Bus out of bounds. \n",
1965 ioc->name, __FILE__, __LINE__);
1970 pScsiReq->MsgFlags &= ~MPI_SCSIIO_MSGFLGS_SENSE_WIDTH;
1971 pScsiReq->MsgFlags |= mpt_msg_flags(ioc);
1974 /* verify that app has not requested
1975 * more sense data than driver
1976 * can provide, if so, reset this parameter
1977 * set the sense buffer pointer low address
1978 * update the control field to specify Q type
1980 if (karg.maxSenseBytes > MPT_SENSE_BUFFER_SIZE)
1981 pScsiReq->SenseBufferLength = MPT_SENSE_BUFFER_SIZE;
1983 pScsiReq->SenseBufferLength = karg.maxSenseBytes;
1985 pScsiReq->SenseBufferLowAddr =
1986 cpu_to_le32(ioc->sense_buf_low_dma
1987 + (req_idx * MPT_SENSE_BUFFER_ALLOC));
1989 shost_for_each_device(sdev, ioc->sh) {
1990 struct scsi_target *starget = scsi_target(sdev);
1991 VirtTarget *vtarget = starget->hostdata;
1993 if (vtarget == NULL)
1996 if ((pScsiReq->TargetID == vtarget->id) &&
1997 (pScsiReq->Bus == vtarget->channel) &&
1998 (vtarget->tflags & MPT_TARGET_FLAGS_Q_YES))
1999 qtag = MPI_SCSIIO_CONTROL_SIMPLEQ;
2002 /* Have the IOCTL driver set the direction based
2003 * on the dataOutSize (ordering issue with Sparc).
2005 if (karg.dataOutSize > 0) {
2006 scsidir = MPI_SCSIIO_CONTROL_WRITE;
2007 dataSize = karg.dataOutSize;
2009 scsidir = MPI_SCSIIO_CONTROL_READ;
2010 dataSize = karg.dataInSize;
2013 pScsiReq->Control = cpu_to_le32(scsidir | qtag);
2014 pScsiReq->DataLength = cpu_to_le32(dataSize);
2018 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
2019 "SCSI driver is not loaded. \n",
2020 ioc->name, __FILE__, __LINE__);
2026 case MPI_FUNCTION_SMP_PASSTHROUGH:
2027 /* Check mf->PassthruFlags to determine if
2028 * transfer is ImmediateMode or not.
2029 * Immediate mode returns data in the ReplyFrame.
2030 * Else, we are sending request and response data
2031 * in two SGLs at the end of the mf.
2035 case MPI_FUNCTION_SATA_PASSTHROUGH:
2037 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
2038 "SCSI driver is not loaded. \n",
2039 ioc->name, __FILE__, __LINE__);
2045 case MPI_FUNCTION_RAID_ACTION:
2050 case MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH:
2052 SCSIIORequest_t *pScsiReq = (SCSIIORequest_t *) mf;
2053 int qtag = MPI_SCSIIO_CONTROL_SIMPLEQ;
2054 int scsidir = MPI_SCSIIO_CONTROL_READ;
2057 pScsiReq->MsgFlags &= ~MPI_SCSIIO_MSGFLGS_SENSE_WIDTH;
2058 pScsiReq->MsgFlags |= mpt_msg_flags(ioc);
2061 /* verify that app has not requested
2062 * more sense data than driver
2063 * can provide, if so, reset this parameter
2064 * set the sense buffer pointer low address
2065 * update the control field to specify Q type
2067 if (karg.maxSenseBytes > MPT_SENSE_BUFFER_SIZE)
2068 pScsiReq->SenseBufferLength = MPT_SENSE_BUFFER_SIZE;
2070 pScsiReq->SenseBufferLength = karg.maxSenseBytes;
2072 pScsiReq->SenseBufferLowAddr =
2073 cpu_to_le32(ioc->sense_buf_low_dma
2074 + (req_idx * MPT_SENSE_BUFFER_ALLOC));
2076 /* All commands to physical devices are tagged
2079 /* Have the IOCTL driver set the direction based
2080 * on the dataOutSize (ordering issue with Sparc).
2082 if (karg.dataOutSize > 0) {
2083 scsidir = MPI_SCSIIO_CONTROL_WRITE;
2084 dataSize = karg.dataOutSize;
2086 scsidir = MPI_SCSIIO_CONTROL_READ;
2087 dataSize = karg.dataInSize;
2090 pScsiReq->Control = cpu_to_le32(scsidir | qtag);
2091 pScsiReq->DataLength = cpu_to_le32(dataSize);
2094 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
2095 "SCSI driver is not loaded. \n",
2096 ioc->name, __FILE__, __LINE__);
2102 case MPI_FUNCTION_SCSI_TASK_MGMT:
2104 SCSITaskMgmt_t *pScsiTm;
2105 pScsiTm = (SCSITaskMgmt_t *)mf;
2106 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
2107 "\tTaskType=0x%x MsgFlags=0x%x "
2108 "TaskMsgContext=0x%x id=%d channel=%d\n",
2109 ioc->name, pScsiTm->TaskType, le32_to_cpu
2110 (pScsiTm->TaskMsgContext), pScsiTm->MsgFlags,
2111 pScsiTm->TargetID, pScsiTm->Bus));
2115 case MPI_FUNCTION_IOC_INIT:
2117 IOCInit_t *pInit = (IOCInit_t *) mf;
2118 u32 high_addr, sense_high;
2120 /* Verify that all entries in the IOC INIT match
2121 * existing setup (and in LE format).
2123 if (sizeof(dma_addr_t) == sizeof(u64)) {
2124 high_addr = cpu_to_le32((u32)((u64)ioc->req_frames_dma >> 32));
2125 sense_high= cpu_to_le32((u32)((u64)ioc->sense_buf_pool_dma >> 32));
2131 if ((pInit->Flags != 0) || (pInit->MaxDevices != ioc->facts.MaxDevices) ||
2132 (pInit->MaxBuses != ioc->facts.MaxBuses) ||
2133 (pInit->ReplyFrameSize != cpu_to_le16(ioc->reply_sz)) ||
2134 (pInit->HostMfaHighAddr != high_addr) ||
2135 (pInit->SenseBufferHighAddr != sense_high)) {
2136 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
2137 "IOC_INIT issued with 1 or more incorrect parameters. Rejected.\n",
2138 ioc->name, __FILE__, __LINE__);
2146 * MPI_FUNCTION_PORT_ENABLE
2147 * MPI_FUNCTION_TARGET_CMD_BUFFER_POST
2148 * MPI_FUNCTION_TARGET_ASSIST
2149 * MPI_FUNCTION_TARGET_STATUS_SEND
2150 * MPI_FUNCTION_TARGET_MODE_ABORT
2151 * MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET
2152 * MPI_FUNCTION_IO_UNIT_RESET
2153 * MPI_FUNCTION_HANDSHAKE
2154 * MPI_FUNCTION_REPLY_FRAME_REMOVAL
2155 * MPI_FUNCTION_EVENT_NOTIFICATION
2156 * (driver handles event notification)
2157 * MPI_FUNCTION_EVENT_ACK
2160 /* What to do with these??? CHECK ME!!!
2161 MPI_FUNCTION_FC_LINK_SRVC_BUF_POST
2162 MPI_FUNCTION_FC_LINK_SRVC_RSP
2163 MPI_FUNCTION_FC_ABORT
2164 MPI_FUNCTION_LAN_SEND
2165 MPI_FUNCTION_LAN_RECEIVE
2166 MPI_FUNCTION_LAN_RESET
2169 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
2170 "Illegal request (function 0x%x) \n",
2171 ioc->name, __FILE__, __LINE__, hdr->Function);
2176 /* Add the SGL ( at most one data in SGE and one data out SGE )
2177 * In the case of two SGE's - the data out (write) will always
2178 * preceede the data in (read) SGE. psgList is used to free the
2181 psge = (char *) (((int *) mf) + karg.dataSgeOffset);
2184 if (karg.dataOutSize > 0)
2187 if (karg.dataInSize > 0)
2192 /* Set up the dataOut memory allocation */
2193 if (karg.dataOutSize > 0) {
2194 if (karg.dataInSize > 0) {
2195 flagsLength = ( MPI_SGE_FLAGS_SIMPLE_ELEMENT |
2196 MPI_SGE_FLAGS_END_OF_BUFFER |
2197 MPI_SGE_FLAGS_DIRECTION)
2198 << MPI_SGE_FLAGS_SHIFT;
2200 flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE;
2202 flagsLength |= karg.dataOutSize;
2203 bufOut.len = karg.dataOutSize;
2204 bufOut.kptr = pci_alloc_consistent(
2205 ioc->pcidev, bufOut.len, &dma_addr_out);
2207 if (bufOut.kptr == NULL) {
2212 * Copy to MF and to sglbuf
2214 ioc->add_sge(psge, flagsLength, dma_addr_out);
2215 psge += ioc->SGE_size;
2217 /* Copy user data to kernel space.
2219 if (copy_from_user(bufOut.kptr,
2222 printk(MYIOC_s_ERR_FMT
2223 "%s@%d::mptctl_do_mpt_command - Unable "
2224 "to read user data "
2226 ioc->name, __FILE__, __LINE__,karg.dataOutBufPtr);
2233 if (karg.dataInSize > 0) {
2234 flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ;
2235 flagsLength |= karg.dataInSize;
2237 bufIn.len = karg.dataInSize;
2238 bufIn.kptr = pci_alloc_consistent(ioc->pcidev,
2239 bufIn.len, &dma_addr_in);
2241 if (bufIn.kptr == NULL) {
2246 * Copy to MF and to sglbuf
2248 ioc->add_sge(psge, flagsLength, dma_addr_in);
2254 ioc->add_sge(psge, flagsLength, (dma_addr_t) -1);
2257 SET_MGMT_MSG_CONTEXT(ioc->ioctl_cmds.msg_context, hdr->MsgContext);
2258 INITIALIZE_MGMT_STATUS(ioc->ioctl_cmds.status)
2259 if (hdr->Function == MPI_FUNCTION_SCSI_TASK_MGMT) {
2261 mutex_lock(&ioc->taskmgmt_cmds.mutex);
2262 if (mpt_set_taskmgmt_in_progress_flag(ioc) != 0) {
2263 mutex_unlock(&ioc->taskmgmt_cmds.mutex);
2267 DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf);
2269 if ((ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q) &&
2270 (ioc->facts.MsgVersion >= MPI_VERSION_01_05))
2271 mpt_put_msg_frame_hi_pri(mptctl_id, ioc, mf);
2273 rc =mpt_send_handshake_request(mptctl_id, ioc,
2274 sizeof(SCSITaskMgmt_t), (u32*)mf, CAN_SLEEP);
2276 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2277 "send_handshake FAILED! (ioc %p, mf %p)\n",
2278 ioc->name, ioc, mf));
2279 mpt_clear_taskmgmt_in_progress_flag(ioc);
2281 mutex_unlock(&ioc->taskmgmt_cmds.mutex);
2287 mpt_put_msg_frame(mptctl_id, ioc, mf);
2289 /* Now wait for the command to complete */
2290 timeout = (karg.timeout > 0) ? karg.timeout : MPT_IOCTL_DEFAULT_TIMEOUT;
2292 timeleft = wait_for_completion_timeout(&ioc->ioctl_cmds.done,
2294 if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
2296 dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "%s: TIMED OUT!\n",
2297 ioc->name, __func__));
2298 if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
2299 if (function == MPI_FUNCTION_SCSI_TASK_MGMT)
2300 mutex_unlock(&ioc->taskmgmt_cmds.mutex);
2304 if (function == MPI_FUNCTION_SCSI_TASK_MGMT)
2305 mutex_unlock(&ioc->taskmgmt_cmds.mutex);
2306 mptctl_timeout_expired(ioc, mf);
2313 if (function == MPI_FUNCTION_SCSI_TASK_MGMT)
2314 mutex_unlock(&ioc->taskmgmt_cmds.mutex);
2319 /* If a valid reply frame, copy to the user.
2320 * Offset 2: reply length in U32's
2322 if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID) {
2323 if (karg.maxReplyBytes < ioc->reply_sz) {
2324 sz = min(karg.maxReplyBytes,
2325 4*ioc->ioctl_cmds.reply[2]);
2327 sz = min(ioc->reply_sz, 4*ioc->ioctl_cmds.reply[2]);
2330 if (copy_to_user(karg.replyFrameBufPtr,
2331 ioc->ioctl_cmds.reply, sz)){
2332 printk(MYIOC_s_ERR_FMT
2333 "%s@%d::mptctl_do_mpt_command - "
2334 "Unable to write out reply frame %p\n",
2335 ioc->name, __FILE__, __LINE__, karg.replyFrameBufPtr);
2342 /* If valid sense data, copy to user.
2344 if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_SENSE_VALID) {
2345 sz = min(karg.maxSenseBytes, MPT_SENSE_BUFFER_SIZE);
2347 if (copy_to_user(karg.senseDataPtr,
2348 ioc->ioctl_cmds.sense, sz)) {
2349 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
2350 "Unable to write sense data to user %p\n",
2351 ioc->name, __FILE__, __LINE__,
2359 /* If the overall status is _GOOD and data in, copy data
2362 if ((ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD) &&
2363 (karg.dataInSize > 0) && (bufIn.kptr)) {
2365 if (copy_to_user(karg.dataInBufPtr,
2366 bufIn.kptr, karg.dataInSize)) {
2367 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
2368 "Unable to write data to user %p\n",
2369 ioc->name, __FILE__, __LINE__,
2377 CLEAR_MGMT_STATUS(ioc->ioctl_cmds.status)
2378 SET_MGMT_MSG_CONTEXT(ioc->ioctl_cmds.msg_context, 0);
2380 /* Free the allocated memory.
2382 if (bufOut.kptr != NULL) {
2383 pci_free_consistent(ioc->pcidev,
2384 bufOut.len, (void *) bufOut.kptr, dma_addr_out);
2387 if (bufIn.kptr != NULL) {
2388 pci_free_consistent(ioc->pcidev,
2389 bufIn.len, (void *) bufIn.kptr, dma_addr_in);
2392 /* mf is null if command issued successfully
2393 * otherwise, failure occured after mf acquired.
2396 mpt_free_msg_frame(ioc, mf);
2401 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2402 /* Prototype Routine for the HOST INFO command.
2405 * Return: 0 if successful
2406 * -EFAULT if data unavailable
2407 * -EBUSY if previous command timeout and IOC reset is not complete.
2408 * -ENODEV if no such device/adapter
2409 * -ETIME if timer expires
2410 * -ENOMEM if memory allocation error
2413 mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
2415 hp_host_info_t __user *uarg = (void __user *) arg;
2417 struct pci_dev *pdev;
2420 hp_host_info_t karg;
2422 ConfigPageHeader_t hdr;
2425 ToolboxIstwiReadWriteRequest_t *IstwiRWRequest;
2426 MPT_FRAME_HDR *mf = NULL;
2427 MPIHeader_t *mpi_hdr;
2428 unsigned long timeleft;
2431 /* Reset long to int. Should affect IA64 and SPARC only
2433 if (data_size == sizeof(hp_host_info_t))
2435 else if (data_size == sizeof(hp_host_info_rev0_t))
2436 cim_rev = 0; /* obsolete */
2440 if (copy_from_user(&karg, uarg, sizeof(hp_host_info_t))) {
2441 printk(KERN_ERR MYNAM "%s@%d::mptctl_hp_host_info - "
2442 "Unable to read in hp_host_info struct @ %p\n",
2443 __FILE__, __LINE__, uarg);
2447 if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
2449 printk(KERN_DEBUG MYNAM "%s::mptctl_hp_hostinfo() @%d - ioc%d not found!\n",
2450 __FILE__, __LINE__, iocnum);
2453 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": mptctl_hp_hostinfo called.\n",
2456 /* Fill in the data and return the structure to the calling
2459 pdev = (struct pci_dev *) ioc->pcidev;
2461 karg.vendor = pdev->vendor;
2462 karg.device = pdev->device;
2463 karg.subsystem_id = pdev->subsystem_device;
2464 karg.subsystem_vendor = pdev->subsystem_vendor;
2465 karg.devfn = pdev->devfn;
2466 karg.bus = pdev->bus->number;
2468 /* Save the SCSI host no. if
2469 * SCSI driver loaded
2471 if (ioc->sh != NULL)
2472 karg.host_no = ioc->sh->host_no;
2476 /* Reformat the fw_version into a string
2478 karg.fw_version[0] = ioc->facts.FWVersion.Struct.Major >= 10 ?
2479 ((ioc->facts.FWVersion.Struct.Major / 10) + '0') : '0';
2480 karg.fw_version[1] = (ioc->facts.FWVersion.Struct.Major % 10 ) + '0';
2481 karg.fw_version[2] = '.';
2482 karg.fw_version[3] = ioc->facts.FWVersion.Struct.Minor >= 10 ?
2483 ((ioc->facts.FWVersion.Struct.Minor / 10) + '0') : '0';
2484 karg.fw_version[4] = (ioc->facts.FWVersion.Struct.Minor % 10 ) + '0';
2485 karg.fw_version[5] = '.';
2486 karg.fw_version[6] = ioc->facts.FWVersion.Struct.Unit >= 10 ?
2487 ((ioc->facts.FWVersion.Struct.Unit / 10) + '0') : '0';
2488 karg.fw_version[7] = (ioc->facts.FWVersion.Struct.Unit % 10 ) + '0';
2489 karg.fw_version[8] = '.';
2490 karg.fw_version[9] = ioc->facts.FWVersion.Struct.Dev >= 10 ?
2491 ((ioc->facts.FWVersion.Struct.Dev / 10) + '0') : '0';
2492 karg.fw_version[10] = (ioc->facts.FWVersion.Struct.Dev % 10 ) + '0';
2493 karg.fw_version[11] = '\0';
2495 /* Issue a config request to get the device serial number
2497 hdr.PageVersion = 0;
2500 hdr.PageType = MPI_CONFIG_PAGETYPE_MANUFACTURING;
2501 cfg.cfghdr.hdr = &hdr;
2504 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2505 cfg.dir = 0; /* read */
2508 strncpy(karg.serial_number, " ", 24);
2509 if (mpt_config(ioc, &cfg) == 0) {
2510 if (cfg.cfghdr.hdr->PageLength > 0) {
2511 /* Issue the second config page request */
2512 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2514 pbuf = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4, &buf_dma);
2516 cfg.physAddr = buf_dma;
2517 if (mpt_config(ioc, &cfg) == 0) {
2518 ManufacturingPage0_t *pdata = (ManufacturingPage0_t *) pbuf;
2519 if (strlen(pdata->BoardTracerNumber) > 1) {
2520 strncpy(karg.serial_number, pdata->BoardTracerNumber, 24);
2521 karg.serial_number[24-1]='\0';
2524 pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, pbuf, buf_dma);
2529 rc = mpt_GetIocState(ioc, 1);
2531 case MPI_IOC_STATE_OPERATIONAL:
2532 karg.ioc_status = HP_STATUS_OK;
2535 case MPI_IOC_STATE_FAULT:
2536 karg.ioc_status = HP_STATUS_FAILED;
2539 case MPI_IOC_STATE_RESET:
2540 case MPI_IOC_STATE_READY:
2542 karg.ioc_status = HP_STATUS_OTHER;
2546 karg.base_io_addr = pci_resource_start(pdev, 0);
2548 if ((ioc->bus_type == SAS) || (ioc->bus_type == FC))
2549 karg.bus_phys_width = HP_BUS_WIDTH_UNK;
2551 karg.bus_phys_width = HP_BUS_WIDTH_16;
2553 karg.hard_resets = 0;
2554 karg.soft_resets = 0;
2556 if (ioc->sh != NULL) {
2557 MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
2559 if (hd && (cim_rev == 1)) {
2560 karg.hard_resets = ioc->hard_resets;
2561 karg.soft_resets = ioc->soft_resets;
2562 karg.timeouts = ioc->timeouts;
2567 * Gather ISTWI(Industry Standard Two Wire Interface) Data
2569 if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL) {
2570 dfailprintk(ioc, printk(MYIOC_s_WARN_FMT
2571 "%s, no msg frames!!\n", ioc->name, __func__));
2575 IstwiRWRequest = (ToolboxIstwiReadWriteRequest_t *)mf;
2576 mpi_hdr = (MPIHeader_t *) mf;
2577 memset(IstwiRWRequest,0,sizeof(ToolboxIstwiReadWriteRequest_t));
2578 IstwiRWRequest->Function = MPI_FUNCTION_TOOLBOX;
2579 IstwiRWRequest->Tool = MPI_TOOLBOX_ISTWI_READ_WRITE_TOOL;
2580 IstwiRWRequest->MsgContext = mpi_hdr->MsgContext;
2581 IstwiRWRequest->Flags = MPI_TB_ISTWI_FLAGS_READ;
2582 IstwiRWRequest->NumAddressBytes = 0x01;
2583 IstwiRWRequest->DataLength = cpu_to_le16(0x04);
2584 if (pdev->devfn & 1)
2585 IstwiRWRequest->DeviceAddr = 0xB2;
2587 IstwiRWRequest->DeviceAddr = 0xB0;
2589 pbuf = pci_alloc_consistent(ioc->pcidev, 4, &buf_dma);
2592 ioc->add_sge((char *)&IstwiRWRequest->SGL,
2593 (MPT_SGE_FLAGS_SSIMPLE_READ|4), buf_dma);
2596 SET_MGMT_MSG_CONTEXT(ioc->ioctl_cmds.msg_context,
2597 IstwiRWRequest->MsgContext);
2598 INITIALIZE_MGMT_STATUS(ioc->ioctl_cmds.status)
2599 mpt_put_msg_frame(mptctl_id, ioc, mf);
2602 timeleft = wait_for_completion_timeout(&ioc->ioctl_cmds.done,
2603 HZ*MPT_IOCTL_DEFAULT_TIMEOUT);
2604 if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
2606 printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name, __func__);
2607 if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
2608 mpt_free_msg_frame(ioc, mf);
2612 mptctl_timeout_expired(ioc, mf);
2619 *ISTWI Data Definition
2620 * pbuf[0] = FW_VERSION = 0x4
2621 * pbuf[1] = Bay Count = 6 or 4 or 2, depending on
2622 * the config, you should be seeing one out of these three values
2623 * pbuf[2] = Drive Installed Map = bit pattern depend on which
2624 * bays have drives in them
2625 * pbuf[3] = Checksum (0x100 = (byte0 + byte2 + byte3)
2627 if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID)
2628 karg.rsvd = *(u32 *)pbuf;
2631 CLEAR_MGMT_STATUS(ioc->ioctl_cmds.status)
2632 SET_MGMT_MSG_CONTEXT(ioc->ioctl_cmds.msg_context, 0);
2635 pci_free_consistent(ioc->pcidev, 4, pbuf, buf_dma);
2637 /* Copy the data from kernel memory to user memory
2639 if (copy_to_user((char __user *)arg, &karg, sizeof(hp_host_info_t))) {
2640 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_hpgethostinfo - "
2641 "Unable to write out hp_host_info @ %p\n",
2642 ioc->name, __FILE__, __LINE__, uarg);
2650 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2651 /* Prototype Routine for the TARGET INFO command.
2654 * Return: 0 if successful
2655 * -EFAULT if data unavailable
2656 * -EBUSY if previous command timeout and IOC reset is not complete.
2657 * -ENODEV if no such device/adapter
2658 * -ETIME if timer expires
2659 * -ENOMEM if memory allocation error
2662 mptctl_hp_targetinfo(unsigned long arg)
2664 hp_target_info_t __user *uarg = (void __user *) arg;
2665 SCSIDevicePage0_t *pg0_alloc;
2666 SCSIDevicePage3_t *pg3_alloc;
2668 MPT_SCSI_HOST *hd = NULL;
2669 hp_target_info_t karg;
2672 dma_addr_t page_dma;
2674 ConfigPageHeader_t hdr;
2675 int tmp, np, rc = 0;
2677 if (copy_from_user(&karg, uarg, sizeof(hp_target_info_t))) {
2678 printk(KERN_ERR MYNAM "%s@%d::mptctl_hp_targetinfo - "
2679 "Unable to read in hp_host_targetinfo struct @ %p\n",
2680 __FILE__, __LINE__, uarg);
2684 if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
2686 printk(KERN_DEBUG MYNAM "%s::mptctl_hp_targetinfo() @%d - ioc%d not found!\n",
2687 __FILE__, __LINE__, iocnum);
2690 dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_hp_targetinfo called.\n",
2693 /* There is nothing to do for FCP parts.
2695 if ((ioc->bus_type == SAS) || (ioc->bus_type == FC))
2698 if ((ioc->spi_data.sdp0length == 0) || (ioc->sh == NULL))
2701 if (ioc->sh->host_no != karg.hdr.host)
2704 /* Get the data transfer speeds
2706 data_sz = ioc->spi_data.sdp0length * 4;
2707 pg0_alloc = (SCSIDevicePage0_t *) pci_alloc_consistent(ioc->pcidev, data_sz, &page_dma);
2709 hdr.PageVersion = ioc->spi_data.sdp0version;
2710 hdr.PageLength = data_sz;
2712 hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
2714 cfg.cfghdr.hdr = &hdr;
2715 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2718 cfg.physAddr = page_dma;
2720 cfg.pageAddr = (karg.hdr.channel << 8) | karg.hdr.id;
2722 if ((rc = mpt_config(ioc, &cfg)) == 0) {
2723 np = le32_to_cpu(pg0_alloc->NegotiatedParameters);
2724 karg.negotiated_width = np & MPI_SCSIDEVPAGE0_NP_WIDE ?
2725 HP_BUS_WIDTH_16 : HP_BUS_WIDTH_8;
2727 if (np & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK) {
2728 tmp = (np & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK) >> 8;
2730 karg.negotiated_speed = HP_DEV_SPEED_ULTRA320;
2731 else if (tmp <= 0x09)
2732 karg.negotiated_speed = HP_DEV_SPEED_ULTRA160;
2733 else if (tmp <= 0x0A)
2734 karg.negotiated_speed = HP_DEV_SPEED_ULTRA2;
2735 else if (tmp <= 0x0C)
2736 karg.negotiated_speed = HP_DEV_SPEED_ULTRA;
2737 else if (tmp <= 0x25)
2738 karg.negotiated_speed = HP_DEV_SPEED_FAST;
2740 karg.negotiated_speed = HP_DEV_SPEED_ASYNC;
2742 karg.negotiated_speed = HP_DEV_SPEED_ASYNC;
2745 pci_free_consistent(ioc->pcidev, data_sz, (u8 *) pg0_alloc, page_dma);
2750 karg.message_rejects = -1;
2751 karg.phase_errors = -1;
2752 karg.parity_errors = -1;
2753 karg.select_timeouts = -1;
2755 /* Get the target error parameters
2757 hdr.PageVersion = 0;
2760 hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
2762 cfg.cfghdr.hdr = &hdr;
2763 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2767 if ((mpt_config(ioc, &cfg) == 0) && (cfg.cfghdr.hdr->PageLength > 0)) {
2768 /* Issue the second config page request */
2769 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2770 data_sz = (int) cfg.cfghdr.hdr->PageLength * 4;
2771 pg3_alloc = (SCSIDevicePage3_t *) pci_alloc_consistent(
2772 ioc->pcidev, data_sz, &page_dma);
2774 cfg.physAddr = page_dma;
2775 cfg.pageAddr = (karg.hdr.channel << 8) | karg.hdr.id;
2776 if ((rc = mpt_config(ioc, &cfg)) == 0) {
2777 karg.message_rejects = (u32) le16_to_cpu(pg3_alloc->MsgRejectCount);
2778 karg.phase_errors = (u32) le16_to_cpu(pg3_alloc->PhaseErrorCount);
2779 karg.parity_errors = (u32) le16_to_cpu(pg3_alloc->ParityErrorCount);
2781 pci_free_consistent(ioc->pcidev, data_sz, (u8 *) pg3_alloc, page_dma);
2784 hd = shost_priv(ioc->sh);
2786 karg.select_timeouts = hd->sel_timeout[karg.hdr.id];
2788 /* Copy the data from kernel memory to user memory
2790 if (copy_to_user((char __user *)arg, &karg, sizeof(hp_target_info_t))) {
2791 printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_hp_target_info - "
2792 "Unable to write out mpt_ioctl_targetinfo struct @ %p\n",
2793 ioc->name, __FILE__, __LINE__, uarg);
2800 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2802 static const struct file_operations mptctl_fops = {
2803 .owner = THIS_MODULE,
2804 .llseek = no_llseek,
2805 .fasync = mptctl_fasync,
2806 .unlocked_ioctl = mptctl_ioctl,
2807 #ifdef CONFIG_COMPAT
2808 .compat_ioctl = compat_mpctl_ioctl,
2812 static struct miscdevice mptctl_miscdev = {
2818 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2820 #ifdef CONFIG_COMPAT
2823 compat_mptfwxfer_ioctl(struct file *filp, unsigned int cmd,
2826 struct mpt_fw_xfer32 kfw32;
2827 struct mpt_fw_xfer kfw;
2828 MPT_ADAPTER *iocp = NULL;
2829 int iocnum, iocnumX;
2830 int nonblock = (filp->f_flags & O_NONBLOCK);
2834 if (copy_from_user(&kfw32, (char __user *)arg, sizeof(kfw32)))
2837 /* Verify intended MPT adapter */
2838 iocnumX = kfw32.iocnum & 0xFF;
2839 if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
2841 printk(KERN_DEBUG MYNAM "::compat_mptfwxfer_ioctl @%d - ioc%d not found!\n",
2846 if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0)
2849 dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "compat_mptfwxfer_ioctl() called\n",
2851 kfw.iocnum = iocnum;
2852 kfw.fwlen = kfw32.fwlen;
2853 kfw.bufp = compat_ptr(kfw32.bufp);
2855 ret = mptctl_do_fw_download(kfw.iocnum, kfw.bufp, kfw.fwlen);
2857 mutex_unlock(&iocp->ioctl_cmds.mutex);
2863 compat_mpt_command(struct file *filp, unsigned int cmd,
2866 struct mpt_ioctl_command32 karg32;
2867 struct mpt_ioctl_command32 __user *uarg = (struct mpt_ioctl_command32 __user *) arg;
2868 struct mpt_ioctl_command karg;
2869 MPT_ADAPTER *iocp = NULL;
2870 int iocnum, iocnumX;
2871 int nonblock = (filp->f_flags & O_NONBLOCK);
2874 if (copy_from_user(&karg32, (char __user *)arg, sizeof(karg32)))
2877 /* Verify intended MPT adapter */
2878 iocnumX = karg32.hdr.iocnum & 0xFF;
2879 if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
2881 printk(KERN_DEBUG MYNAM "::compat_mpt_command @%d - ioc%d not found!\n",
2886 if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0)
2889 dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "compat_mpt_command() called\n",
2891 /* Copy data to karg */
2892 karg.hdr.iocnum = karg32.hdr.iocnum;
2893 karg.hdr.port = karg32.hdr.port;
2894 karg.timeout = karg32.timeout;
2895 karg.maxReplyBytes = karg32.maxReplyBytes;
2897 karg.dataInSize = karg32.dataInSize;
2898 karg.dataOutSize = karg32.dataOutSize;
2899 karg.maxSenseBytes = karg32.maxSenseBytes;
2900 karg.dataSgeOffset = karg32.dataSgeOffset;
2902 karg.replyFrameBufPtr = (char __user *)(unsigned long)karg32.replyFrameBufPtr;
2903 karg.dataInBufPtr = (char __user *)(unsigned long)karg32.dataInBufPtr;
2904 karg.dataOutBufPtr = (char __user *)(unsigned long)karg32.dataOutBufPtr;
2905 karg.senseDataPtr = (char __user *)(unsigned long)karg32.senseDataPtr;
2907 /* Pass new structure to do_mpt_command
2909 ret = mptctl_do_mpt_command (karg, &uarg->MF);
2911 mutex_unlock(&iocp->ioctl_cmds.mutex);
2916 static long compat_mpctl_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
2926 case MPTEVENTENABLE:
2927 case MPTEVENTREPORT:
2929 case HP_GETHOSTINFO:
2930 case HP_GETTARGETINFO:
2932 ret = __mptctl_ioctl(f, cmd, arg);
2935 ret = compat_mpt_command(f, cmd, arg);
2937 case MPTFWDOWNLOAD32:
2938 ret = compat_mptfwxfer_ioctl(f, cmd, arg);
2951 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2953 * mptctl_probe - Installs ioctl devices per bus.
2954 * @pdev: Pointer to pci_dev structure
2956 * Returns 0 for success, non-zero for failure.
2961 mptctl_probe(struct pci_dev *pdev, const struct pci_device_id *id)
2963 MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
2965 mutex_init(&ioc->ioctl_cmds.mutex);
2966 init_completion(&ioc->ioctl_cmds.done);
2970 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2972 * mptctl_remove - Removed ioctl devices
2973 * @pdev: Pointer to pci_dev structure
2978 mptctl_remove(struct pci_dev *pdev)
2982 static struct mpt_pci_driver mptctl_driver = {
2983 .probe = mptctl_probe,
2984 .remove = mptctl_remove,
2987 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2988 static int __init mptctl_init(void)
2993 show_mptmod_ver(my_NAME, my_VERSION);
2995 mpt_device_driver_register(&mptctl_driver, MPTCTL_DRIVER);
2997 /* Register this device */
2998 err = misc_register(&mptctl_miscdev);
3000 printk(KERN_ERR MYNAM ": Can't register misc device [minor=%d].\n", MPT_MINOR);
3003 printk(KERN_INFO MYNAM ": Registered with Fusion MPT base driver\n");
3004 printk(KERN_INFO MYNAM ": /dev/%s @ (major,minor=%d,%d)\n",
3005 mptctl_miscdev.name, MISC_MAJOR, mptctl_miscdev.minor);
3008 * Install our handler
3011 mptctl_id = mpt_register(mptctl_reply, MPTCTL_DRIVER);
3012 if (!mptctl_id || mptctl_id >= MPT_MAX_PROTOCOL_DRIVERS) {
3013 printk(KERN_ERR MYNAM ": ERROR: Failed to register with Fusion MPT base driver\n");
3014 misc_deregister(&mptctl_miscdev);
3019 mptctl_taskmgmt_id = mpt_register(mptctl_taskmgmt_reply, MPTCTL_DRIVER);
3020 if (!mptctl_taskmgmt_id || mptctl_taskmgmt_id >= MPT_MAX_PROTOCOL_DRIVERS) {
3021 printk(KERN_ERR MYNAM ": ERROR: Failed to register with Fusion MPT base driver\n");
3022 mpt_deregister(mptctl_id);
3023 misc_deregister(&mptctl_miscdev);
3028 mpt_reset_register(mptctl_id, mptctl_ioc_reset);
3029 mpt_event_register(mptctl_id, mptctl_event_process);
3035 mpt_device_driver_deregister(MPTCTL_DRIVER);
3040 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
3041 static void mptctl_exit(void)
3043 misc_deregister(&mptctl_miscdev);
3044 printk(KERN_INFO MYNAM ": Deregistered /dev/%s @ (major,minor=%d,%d)\n",
3045 mptctl_miscdev.name, MISC_MAJOR, mptctl_miscdev.minor);
3047 /* De-register event handler from base module */
3048 mpt_event_deregister(mptctl_id);
3050 /* De-register reset handler from base module */
3051 mpt_reset_deregister(mptctl_id);
3053 /* De-register callback handler from base module */
3054 mpt_deregister(mptctl_taskmgmt_id);
3055 mpt_deregister(mptctl_id);
3057 mpt_device_driver_deregister(MPTCTL_DRIVER);
3061 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
3063 module_init(mptctl_init);
3064 module_exit(mptctl_exit);