xref: /openbmc/linux/drivers/message/fusion/mptctl.c (revision f762326b)
1 /*
2  *  linux/drivers/message/fusion/mptctl.c
3  *      mpt Ioctl driver.
4  *      For use with LSI PCI chip/adapters
5  *      running LSI Fusion MPT (Message Passing Technology) firmware.
6  *
7  *  Copyright (c) 1999-2008 LSI Corporation
8  *  (mailto:DL-MPTFusionLinux@lsi.com)
9  *
10  */
11 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
12 /*
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.
16 
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.
21 
22     NO WARRANTY
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.
32 
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
41 
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
45 */
46 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
47 
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/mutex.h>
58 #include <linux/compat.h>
59 
60 #include <asm/io.h>
61 #include <linux/uaccess.h>
62 
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>
68 
69 #define COPYRIGHT	"Copyright (c) 1999-2008 LSI Corporation"
70 #define MODULEAUTHOR	"LSI Corporation"
71 #include "mptbase.h"
72 #include "mptctl.h"
73 
74 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
75 #define my_NAME		"Fusion MPT misc device (ioctl) driver"
76 #define my_VERSION	MPT_LINUX_VERSION_COMMON
77 #define MYNAM		"mptctl"
78 
79 MODULE_AUTHOR(MODULEAUTHOR);
80 MODULE_DESCRIPTION(my_NAME);
81 MODULE_LICENSE("GPL");
82 MODULE_VERSION(my_VERSION);
83 
84 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
85 
86 static DEFINE_MUTEX(mpctl_mutex);
87 static u8 mptctl_id = MPT_MAX_PROTOCOL_DRIVERS;
88 static u8 mptctl_taskmgmt_id = MPT_MAX_PROTOCOL_DRIVERS;
89 
90 static DECLARE_WAIT_QUEUE_HEAD ( mptctl_wait );
91 
92 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
93 
94 struct buflist {
95 	u8	*kptr;
96 	int	 len;
97 };
98 
99 /*
100  * Function prototypes. Called from OS entry point mptctl_ioctl.
101  * arg contents specific to function.
102  */
103 static int mptctl_fw_download(MPT_ADAPTER *iocp, unsigned long arg);
104 static int mptctl_getiocinfo(MPT_ADAPTER *iocp, unsigned long arg, unsigned int cmd);
105 static int mptctl_gettargetinfo(MPT_ADAPTER *iocp, unsigned long arg);
106 static int mptctl_readtest(MPT_ADAPTER *iocp, unsigned long arg);
107 static int mptctl_mpt_command(MPT_ADAPTER *iocp, unsigned long arg);
108 static int mptctl_eventquery(MPT_ADAPTER *iocp, unsigned long arg);
109 static int mptctl_eventenable(MPT_ADAPTER *iocp, unsigned long arg);
110 static int mptctl_eventreport(MPT_ADAPTER *iocp, unsigned long arg);
111 static int mptctl_replace_fw(MPT_ADAPTER *iocp, unsigned long arg);
112 
113 static int mptctl_do_reset(MPT_ADAPTER *iocp, unsigned long arg);
114 static int mptctl_hp_hostinfo(MPT_ADAPTER *iocp, unsigned long arg, unsigned int cmd);
115 static int mptctl_hp_targetinfo(MPT_ADAPTER *iocp, unsigned long arg);
116 
117 static int  mptctl_probe(struct pci_dev *);
118 static void mptctl_remove(struct pci_dev *);
119 
120 #ifdef CONFIG_COMPAT
121 static long compat_mpctl_ioctl(struct file *f, unsigned cmd, unsigned long arg);
122 #endif
123 /*
124  * Private function calls.
125  */
126 static int mptctl_do_mpt_command(MPT_ADAPTER *iocp, struct mpt_ioctl_command karg, void __user *mfPtr);
127 static int mptctl_do_fw_download(MPT_ADAPTER *iocp, char __user *ufwbuf, size_t fwlen);
128 static MptSge_t *kbuf_alloc_2_sgl(int bytes, u32 dir, int sge_offset, int *frags,
129 		struct buflist **blp, dma_addr_t *sglbuf_dma, MPT_ADAPTER *ioc);
130 static void kfree_sgl(MptSge_t *sgl, dma_addr_t sgl_dma,
131 		struct buflist *buflist, MPT_ADAPTER *ioc);
132 
133 /*
134  * Reset Handler cleanup function
135  */
136 static int  mptctl_ioc_reset(MPT_ADAPTER *ioc, int reset_phase);
137 
138 /*
139  * Event Handler function
140  */
141 static int mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply);
142 static struct fasync_struct *async_queue=NULL;
143 
144 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
145 /*
146  * Scatter gather list (SGL) sizes and limits...
147  */
148 //#define MAX_SCSI_FRAGS	9
149 #define MAX_FRAGS_SPILL1	9
150 #define MAX_FRAGS_SPILL2	15
151 #define FRAGS_PER_BUCKET	(MAX_FRAGS_SPILL2 + 1)
152 
153 //#define MAX_CHAIN_FRAGS	64
154 //#define MAX_CHAIN_FRAGS	(15+15+15+16)
155 #define MAX_CHAIN_FRAGS		(4 * MAX_FRAGS_SPILL2 + 1)
156 
157 //  Define max sg LIST bytes ( == (#frags + #chains) * 8 bytes each)
158 //  Works out to: 592d bytes!     (9+1)*8 + 4*(15+1)*8
159 //                  ^----------------- 80 + 512
160 #define MAX_SGL_BYTES		((MAX_FRAGS_SPILL1 + 1 + (4 * FRAGS_PER_BUCKET)) * 8)
161 
162 /* linux only seems to ever give 128kB MAX contiguous (GFP_USER) mem bytes */
163 #define MAX_KMALLOC_SZ		(128*1024)
164 
165 #define MPT_IOCTL_DEFAULT_TIMEOUT 10	/* Default timeout value (seconds) */
166 
167 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
168 /**
169  *	mptctl_syscall_down - Down the MPT adapter syscall semaphore.
170  *	@ioc: Pointer to MPT adapter
171  *	@nonblock: boolean, non-zero if O_NONBLOCK is set
172  *
173  *	All of the ioctl commands can potentially sleep, which is illegal
174  *	with a spinlock held, thus we perform mutual exclusion here.
175  *
176  *	Returns negative errno on error, or zero for success.
177  */
178 static inline int
179 mptctl_syscall_down(MPT_ADAPTER *ioc, int nonblock)
180 {
181 	int rc = 0;
182 
183 	if (nonblock) {
184 		if (!mutex_trylock(&ioc->ioctl_cmds.mutex))
185 			rc = -EAGAIN;
186 	} else {
187 		if (mutex_lock_interruptible(&ioc->ioctl_cmds.mutex))
188 			rc = -ERESTARTSYS;
189 	}
190 	return rc;
191 }
192 
193 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
194 /*
195  *  This is the callback for any message we have posted. The message itself
196  *  will be returned to the message pool when we return from the IRQ
197  *
198  *  This runs in irq context so be short and sweet.
199  */
200 static int
201 mptctl_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply)
202 {
203 	char	*sense_data;
204 	int	req_index;
205 	int	sz;
206 
207 	if (!req)
208 		return 0;
209 
210 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "completing mpi function "
211 	    "(0x%02X), req=%p, reply=%p\n", ioc->name,  req->u.hdr.Function,
212 	    req, reply));
213 
214 	/*
215 	 * Handling continuation of the same reply. Processing the first
216 	 * reply, and eating the other replys that come later.
217 	 */
218 	if (ioc->ioctl_cmds.msg_context != req->u.hdr.MsgContext)
219 		goto out_continuation;
220 
221 	ioc->ioctl_cmds.status |= MPT_MGMT_STATUS_COMMAND_GOOD;
222 
223 	if (!reply)
224 		goto out;
225 
226 	ioc->ioctl_cmds.status |= MPT_MGMT_STATUS_RF_VALID;
227 	sz = min(ioc->reply_sz, 4*reply->u.reply.MsgLength);
228 	memcpy(ioc->ioctl_cmds.reply, reply, sz);
229 
230 	if (reply->u.reply.IOCStatus || reply->u.reply.IOCLogInfo)
231 		dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
232 		    "iocstatus (0x%04X), loginfo (0x%08X)\n", ioc->name,
233 		    le16_to_cpu(reply->u.reply.IOCStatus),
234 		    le32_to_cpu(reply->u.reply.IOCLogInfo)));
235 
236 	if ((req->u.hdr.Function == MPI_FUNCTION_SCSI_IO_REQUEST) ||
237 		(req->u.hdr.Function ==
238 		 MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) {
239 
240 		if (reply->u.sreply.SCSIStatus || reply->u.sreply.SCSIState)
241 			dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
242 			"scsi_status (0x%02x), scsi_state (0x%02x), "
243 			"tag = (0x%04x), transfer_count (0x%08x)\n", ioc->name,
244 			reply->u.sreply.SCSIStatus,
245 			reply->u.sreply.SCSIState,
246 			le16_to_cpu(reply->u.sreply.TaskTag),
247 			le32_to_cpu(reply->u.sreply.TransferCount)));
248 
249 		if (reply->u.sreply.SCSIState &
250 			MPI_SCSI_STATE_AUTOSENSE_VALID) {
251 			sz = req->u.scsireq.SenseBufferLength;
252 			req_index =
253 			    le16_to_cpu(req->u.frame.hwhdr.msgctxu.fld.req_idx);
254 			sense_data = ((u8 *)ioc->sense_buf_pool +
255 			     (req_index * MPT_SENSE_BUFFER_ALLOC));
256 			memcpy(ioc->ioctl_cmds.sense, sense_data, sz);
257 			ioc->ioctl_cmds.status |= MPT_MGMT_STATUS_SENSE_VALID;
258 		}
259 	}
260 
261  out:
262 	/* We are done, issue wake up
263 	 */
264 	if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_PENDING) {
265 		if (req->u.hdr.Function == MPI_FUNCTION_SCSI_TASK_MGMT) {
266 			mpt_clear_taskmgmt_in_progress_flag(ioc);
267 			ioc->ioctl_cmds.status &= ~MPT_MGMT_STATUS_PENDING;
268 			complete(&ioc->ioctl_cmds.done);
269 			if (ioc->bus_type == SAS)
270 				ioc->schedule_target_reset(ioc);
271 		} else {
272 			ioc->ioctl_cmds.status &= ~MPT_MGMT_STATUS_PENDING;
273 			complete(&ioc->ioctl_cmds.done);
274 		}
275 	}
276 
277  out_continuation:
278 	if (reply && (reply->u.reply.MsgFlags &
279 	    MPI_MSGFLAGS_CONTINUATION_REPLY))
280 		return 0;
281 	return 1;
282 }
283 
284 
285 static int
286 mptctl_taskmgmt_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
287 {
288 	if (!mf)
289 		return 0;
290 
291 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
292 		"TaskMgmt completed (mf=%p, mr=%p)\n",
293 		ioc->name, mf, mr));
294 
295 	ioc->taskmgmt_cmds.status |= MPT_MGMT_STATUS_COMMAND_GOOD;
296 
297 	if (!mr)
298 		goto out;
299 
300 	ioc->taskmgmt_cmds.status |= MPT_MGMT_STATUS_RF_VALID;
301 	memcpy(ioc->taskmgmt_cmds.reply, mr,
302 	    min(MPT_DEFAULT_FRAME_SIZE, 4 * mr->u.reply.MsgLength));
303  out:
304 	if (ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_PENDING) {
305 		mpt_clear_taskmgmt_in_progress_flag(ioc);
306 		ioc->taskmgmt_cmds.status &= ~MPT_MGMT_STATUS_PENDING;
307 		complete(&ioc->taskmgmt_cmds.done);
308 		if (ioc->bus_type == SAS)
309 			ioc->schedule_target_reset(ioc);
310 		return 1;
311 	}
312 	return 0;
313 }
314 
315 static int
316 mptctl_do_taskmgmt(MPT_ADAPTER *ioc, u8 tm_type, u8 bus_id, u8 target_id)
317 {
318 	MPT_FRAME_HDR	*mf;
319 	SCSITaskMgmt_t	*pScsiTm;
320 	SCSITaskMgmtReply_t *pScsiTmReply;
321 	int		 ii;
322 	int		 retval;
323 	unsigned long	 timeout;
324 	u16		 iocstatus;
325 
326 
327 	mutex_lock(&ioc->taskmgmt_cmds.mutex);
328 	if (mpt_set_taskmgmt_in_progress_flag(ioc) != 0) {
329 		mutex_unlock(&ioc->taskmgmt_cmds.mutex);
330 		return -EPERM;
331 	}
332 
333 	retval = 0;
334 
335 	mf = mpt_get_msg_frame(mptctl_taskmgmt_id, ioc);
336 	if (mf == NULL) {
337 		dtmprintk(ioc,
338 			printk(MYIOC_s_WARN_FMT "TaskMgmt, no msg frames!!\n",
339 			ioc->name));
340 		mpt_clear_taskmgmt_in_progress_flag(ioc);
341 		retval = -ENOMEM;
342 		goto tm_done;
343 	}
344 
345 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt request (mf=%p)\n",
346 		ioc->name, mf));
347 
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))
354 		pScsiTm->MsgFlags =
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;
366 
367 	switch (ioc->bus_type) {
368 	case FC:
369 		timeout = 40;
370 		break;
371 	case SAS:
372 		timeout = 30;
373 		break;
374 	case SPI:
375 		default:
376 		timeout = 10;
377 		break;
378 	}
379 
380 	dtmprintk(ioc,
381 		printk(MYIOC_s_DEBUG_FMT "TaskMgmt type=%d timeout=%ld\n",
382 		ioc->name, tm_type, timeout));
383 
384 	INITIALIZE_MGMT_STATUS(ioc->taskmgmt_cmds.status)
385 	if ((ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q) &&
386 	    (ioc->facts.MsgVersion >= MPI_VERSION_01_05))
387 		mpt_put_msg_frame_hi_pri(mptctl_taskmgmt_id, ioc, mf);
388 	else {
389 		retval = mpt_send_handshake_request(mptctl_taskmgmt_id, ioc,
390 		    sizeof(SCSITaskMgmt_t), (u32 *)pScsiTm, CAN_SLEEP);
391 		if (retval != 0) {
392 			dfailprintk(ioc,
393 				printk(MYIOC_s_ERR_FMT
394 				"TaskMgmt send_handshake FAILED!"
395 				" (ioc %p, mf %p, rc=%d) \n", ioc->name,
396 				ioc, mf, retval));
397 			mpt_free_msg_frame(ioc, mf);
398 			mpt_clear_taskmgmt_in_progress_flag(ioc);
399 			goto tm_done;
400 		}
401 	}
402 
403 	/* Now wait for the command to complete */
404 	ii = wait_for_completion_timeout(&ioc->taskmgmt_cmds.done, timeout*HZ);
405 
406 	if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
407 		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
408 		    "TaskMgmt failed\n", ioc->name));
409 		mpt_free_msg_frame(ioc, mf);
410 		mpt_clear_taskmgmt_in_progress_flag(ioc);
411 		if (ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET)
412 			retval = 0;
413 		else
414 			retval = -1; /* return failure */
415 		goto tm_done;
416 	}
417 
418 	if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_RF_VALID)) {
419 		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
420 		    "TaskMgmt failed\n", ioc->name));
421 		retval = -1; /* return failure */
422 		goto tm_done;
423 	}
424 
425 	pScsiTmReply = (SCSITaskMgmtReply_t *) ioc->taskmgmt_cmds.reply;
426 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
427 	    "TaskMgmt fw_channel = %d, fw_id = %d, task_type=0x%02X, "
428 	    "iocstatus=0x%04X\n\tloginfo=0x%08X, response_code=0x%02X, "
429 	    "term_cmnds=%d\n", ioc->name, pScsiTmReply->Bus,
430 	    pScsiTmReply->TargetID, tm_type,
431 	    le16_to_cpu(pScsiTmReply->IOCStatus),
432 	    le32_to_cpu(pScsiTmReply->IOCLogInfo),
433 	    pScsiTmReply->ResponseCode,
434 	    le32_to_cpu(pScsiTmReply->TerminationCount)));
435 
436 	iocstatus = le16_to_cpu(pScsiTmReply->IOCStatus) & MPI_IOCSTATUS_MASK;
437 
438 	if (iocstatus == MPI_IOCSTATUS_SCSI_TASK_TERMINATED ||
439 	   iocstatus == MPI_IOCSTATUS_SCSI_IOC_TERMINATED ||
440 	   iocstatus == MPI_IOCSTATUS_SUCCESS)
441 		retval = 0;
442 	else {
443 		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
444 		    "TaskMgmt failed\n", ioc->name));
445 		retval = -1; /* return failure */
446 	}
447 
448  tm_done:
449 	mutex_unlock(&ioc->taskmgmt_cmds.mutex);
450 	CLEAR_MGMT_STATUS(ioc->taskmgmt_cmds.status)
451 	return retval;
452 }
453 
454 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
455 /* mptctl_timeout_expired
456  *
457  * Expecting an interrupt, however timed out.
458  *
459  */
460 static void
461 mptctl_timeout_expired(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
462 {
463 	unsigned long flags;
464 	int ret_val = -1;
465 	SCSIIORequest_t *scsi_req = (SCSIIORequest_t *) mf;
466 	u8 function = mf->u.hdr.Function;
467 
468 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": %s\n",
469 		ioc->name, __func__));
470 
471 	if (mpt_fwfault_debug)
472 		mpt_halt_firmware(ioc);
473 
474 	spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
475 	if (ioc->ioc_reset_in_progress) {
476 		spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
477 		CLEAR_MGMT_PENDING_STATUS(ioc->ioctl_cmds.status)
478 		mpt_free_msg_frame(ioc, mf);
479 		return;
480 	}
481 	spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
482 
483 
484 	CLEAR_MGMT_PENDING_STATUS(ioc->ioctl_cmds.status)
485 
486 	if (ioc->bus_type == SAS) {
487 		if (function == MPI_FUNCTION_SCSI_IO_REQUEST)
488 			ret_val = mptctl_do_taskmgmt(ioc,
489 				MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET,
490 				scsi_req->Bus, scsi_req->TargetID);
491 		else if (function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)
492 			ret_val = mptctl_do_taskmgmt(ioc,
493 				MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
494 				scsi_req->Bus, 0);
495 		if (!ret_val)
496 			return;
497 	} else {
498 		if ((function == MPI_FUNCTION_SCSI_IO_REQUEST) ||
499 			(function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH))
500 			ret_val = mptctl_do_taskmgmt(ioc,
501 				MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
502 				scsi_req->Bus, 0);
503 		if (!ret_val)
504 			return;
505 	}
506 
507 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Calling Reset! \n",
508 		 ioc->name));
509 	mpt_Soft_Hard_ResetHandler(ioc, CAN_SLEEP);
510 	mpt_free_msg_frame(ioc, mf);
511 }
512 
513 
514 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
515 /* mptctl_ioc_reset
516  *
517  * Clean-up functionality. Used only if there has been a
518  * reload of the FW due.
519  *
520  */
521 static int
522 mptctl_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
523 {
524 	switch(reset_phase) {
525 	case MPT_IOC_SETUP_RESET:
526 		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
527 		    "%s: MPT_IOC_SETUP_RESET\n", ioc->name, __func__));
528 		break;
529 	case MPT_IOC_PRE_RESET:
530 		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
531 		    "%s: MPT_IOC_PRE_RESET\n", ioc->name, __func__));
532 		break;
533 	case MPT_IOC_POST_RESET:
534 		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
535 		    "%s: MPT_IOC_POST_RESET\n", ioc->name, __func__));
536 		if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_PENDING) {
537 			ioc->ioctl_cmds.status |= MPT_MGMT_STATUS_DID_IOCRESET;
538 			complete(&ioc->ioctl_cmds.done);
539 		}
540 		break;
541 	default:
542 		break;
543 	}
544 
545 	return 1;
546 }
547 
548 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
549 /* ASYNC Event Notification Support */
550 static int
551 mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
552 {
553 	u8 event;
554 
555 	event = le32_to_cpu(pEvReply->Event) & 0xFF;
556 
557 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s() called\n",
558 	    ioc->name, __func__));
559 	if(async_queue == NULL)
560 		return 1;
561 
562 	/* Raise SIGIO for persistent events.
563 	 * TODO - this define is not in MPI spec yet,
564 	 * but they plan to set it to 0x21
565 	 */
566 	if (event == 0x21) {
567 		ioc->aen_event_read_flag=1;
568 		dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Raised SIGIO to application\n",
569 		    ioc->name));
570 		devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
571 		    "Raised SIGIO to application\n", ioc->name));
572 		kill_fasync(&async_queue, SIGIO, POLL_IN);
573 		return 1;
574 	 }
575 
576 	/* This flag is set after SIGIO was raised, and
577 	 * remains set until the application has read
578 	 * the event log via ioctl=MPTEVENTREPORT
579 	 */
580 	if(ioc->aen_event_read_flag)
581 		return 1;
582 
583 	/* Signal only for the events that are
584 	 * requested for by the application
585 	 */
586 	if (ioc->events && (ioc->eventTypes & ( 1 << event))) {
587 		ioc->aen_event_read_flag=1;
588 		dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
589 		    "Raised SIGIO to application\n", ioc->name));
590 		devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
591 		    "Raised SIGIO to application\n", ioc->name));
592 		kill_fasync(&async_queue, SIGIO, POLL_IN);
593 	}
594 	return 1;
595 }
596 
597 static int
598 mptctl_fasync(int fd, struct file *filep, int mode)
599 {
600 	MPT_ADAPTER	*ioc;
601 	int ret;
602 
603 	mutex_lock(&mpctl_mutex);
604 	list_for_each_entry(ioc, &ioc_list, list)
605 		ioc->aen_event_read_flag=0;
606 
607 	ret = fasync_helper(fd, filep, mode, &async_queue);
608 	mutex_unlock(&mpctl_mutex);
609 	return ret;
610 }
611 
612 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
613 /*
614  *  MPT ioctl handler
615  *  cmd - specify the particular IOCTL command to be issued
616  *  arg - data specific to the command. Must not be null.
617  */
618 static long
619 __mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
620 {
621 	mpt_ioctl_header __user *uhdr = (void __user *) arg;
622 	mpt_ioctl_header	 khdr;
623 	unsigned iocnumX;
624 	int nonblock = (file->f_flags & O_NONBLOCK);
625 	int ret;
626 	MPT_ADAPTER *iocp = NULL;
627 
628 	if (copy_from_user(&khdr, uhdr, sizeof(khdr))) {
629 		printk(KERN_ERR MYNAM "%s::mptctl_ioctl() @%d - "
630 				"Unable to copy mpt_ioctl_header data @ %p\n",
631 				__FILE__, __LINE__, uhdr);
632 		return -EFAULT;
633 	}
634 	ret = -ENXIO;				/* (-6) No such device or address */
635 
636 	/* Verify intended MPT adapter - set iocnumX and the adapter
637 	 * pointer (iocp)
638 	 */
639 	iocnumX = khdr.iocnum & 0xFF;
640 	if ((mpt_verify_adapter(iocnumX, &iocp) < 0) || (iocp == NULL))
641 		return -ENODEV;
642 
643 	if (!iocp->active) {
644 		printk(KERN_DEBUG MYNAM "%s::mptctl_ioctl() @%d - Controller disabled.\n",
645 				__FILE__, __LINE__);
646 		return -EFAULT;
647 	}
648 
649 	/* Handle those commands that are just returning
650 	 * information stored in the driver.
651 	 * These commands should never time out and are unaffected
652 	 * by TM and FW reloads.
653 	 */
654 	if ((cmd & ~IOCSIZE_MASK) == (MPTIOCINFO & ~IOCSIZE_MASK)) {
655 		return mptctl_getiocinfo(iocp, arg, _IOC_SIZE(cmd));
656 	} else if (cmd == MPTTARGETINFO) {
657 		return mptctl_gettargetinfo(iocp, arg);
658 	} else if (cmd == MPTTEST) {
659 		return mptctl_readtest(iocp, arg);
660 	} else if (cmd == MPTEVENTQUERY) {
661 		return mptctl_eventquery(iocp, arg);
662 	} else if (cmd == MPTEVENTENABLE) {
663 		return mptctl_eventenable(iocp, arg);
664 	} else if (cmd == MPTEVENTREPORT) {
665 		return mptctl_eventreport(iocp, arg);
666 	} else if (cmd == MPTFWREPLACE) {
667 		return mptctl_replace_fw(iocp, arg);
668 	}
669 
670 	/* All of these commands require an interrupt or
671 	 * are unknown/illegal.
672 	 */
673 	if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0)
674 		return ret;
675 
676 	if (cmd == MPTFWDOWNLOAD)
677 		ret = mptctl_fw_download(iocp, arg);
678 	else if (cmd == MPTCOMMAND)
679 		ret = mptctl_mpt_command(iocp, arg);
680 	else if (cmd == MPTHARDRESET)
681 		ret = mptctl_do_reset(iocp, arg);
682 	else if ((cmd & ~IOCSIZE_MASK) == (HP_GETHOSTINFO & ~IOCSIZE_MASK))
683 		ret = mptctl_hp_hostinfo(iocp, arg, _IOC_SIZE(cmd));
684 	else if (cmd == HP_GETTARGETINFO)
685 		ret = mptctl_hp_targetinfo(iocp, arg);
686 	else
687 		ret = -EINVAL;
688 
689 	mutex_unlock(&iocp->ioctl_cmds.mutex);
690 
691 	return ret;
692 }
693 
694 static long
695 mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
696 {
697 	long ret;
698 	mutex_lock(&mpctl_mutex);
699 	ret = __mptctl_ioctl(file, cmd, arg);
700 	mutex_unlock(&mpctl_mutex);
701 	return ret;
702 }
703 
704 static int mptctl_do_reset(MPT_ADAPTER *iocp, unsigned long arg)
705 {
706 	struct mpt_ioctl_diag_reset __user *urinfo = (void __user *) arg;
707 	struct mpt_ioctl_diag_reset krinfo;
708 
709 	if (copy_from_user(&krinfo, urinfo, sizeof(struct mpt_ioctl_diag_reset))) {
710 		printk(KERN_ERR MYNAM "%s@%d::mptctl_do_reset - "
711 				"Unable to copy mpt_ioctl_diag_reset struct @ %p\n",
712 				__FILE__, __LINE__, urinfo);
713 		return -EFAULT;
714 	}
715 
716 	dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "mptctl_do_reset called.\n",
717 	    iocp->name));
718 
719 	if (mpt_HardResetHandler(iocp, CAN_SLEEP) != 0) {
720 		printk (MYIOC_s_ERR_FMT "%s@%d::mptctl_do_reset - reset failed.\n",
721 			iocp->name, __FILE__, __LINE__);
722 		return -1;
723 	}
724 
725 	return 0;
726 }
727 
728 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
729 /*
730  * MPT FW download function.  Cast the arg into the mpt_fw_xfer structure.
731  * This structure contains: iocnum, firmware length (bytes),
732  *      pointer to user space memory where the fw image is stored.
733  *
734  * Outputs:	None.
735  * Return:	0 if successful
736  *		-EFAULT if data unavailable
737  *		-ENXIO  if no such device
738  *		-EAGAIN if resource problem
739  *		-ENOMEM if no memory for SGE
740  *		-EMLINK if too many chain buffers required
741  *		-EBADRQC if adapter does not support FW download
742  *		-EBUSY if adapter is busy
743  *		-ENOMSG if FW upload returned bad status
744  */
745 static int
746 mptctl_fw_download(MPT_ADAPTER *iocp, unsigned long arg)
747 {
748 	struct mpt_fw_xfer __user *ufwdl = (void __user *) arg;
749 	struct mpt_fw_xfer	 kfwdl;
750 
751 	if (copy_from_user(&kfwdl, ufwdl, sizeof(struct mpt_fw_xfer))) {
752 		printk(KERN_ERR MYNAM "%s@%d::_ioctl_fwdl - "
753 				"Unable to copy mpt_fw_xfer struct @ %p\n",
754 				__FILE__, __LINE__, ufwdl);
755 		return -EFAULT;
756 	}
757 
758 	return mptctl_do_fw_download(iocp, kfwdl.bufp, kfwdl.fwlen);
759 }
760 
761 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
762 /*
763  * FW Download engine.
764  * Outputs:	None.
765  * Return:	0 if successful
766  *		-EFAULT if data unavailable
767  *		-ENXIO  if no such device
768  *		-EAGAIN if resource problem
769  *		-ENOMEM if no memory for SGE
770  *		-EMLINK if too many chain buffers required
771  *		-EBADRQC if adapter does not support FW download
772  *		-EBUSY if adapter is busy
773  *		-ENOMSG if FW upload returned bad status
774  */
775 static int
776 mptctl_do_fw_download(MPT_ADAPTER *iocp, char __user *ufwbuf, size_t fwlen)
777 {
778 	FWDownload_t		*dlmsg;
779 	MPT_FRAME_HDR		*mf;
780 	FWDownloadTCSGE_t	*ptsge;
781 	MptSge_t		*sgl, *sgIn;
782 	char			*sgOut;
783 	struct buflist		*buflist;
784 	struct buflist		*bl;
785 	dma_addr_t		 sgl_dma;
786 	int			 ret;
787 	int			 numfrags = 0;
788 	int			 maxfrags;
789 	int			 n = 0;
790 	u32			 sgdir;
791 	u32			 nib;
792 	int			 fw_bytes_copied = 0;
793 	int			 i;
794 	int			 sge_offset = 0;
795 	u16			 iocstat;
796 	pFWDownloadReply_t	 ReplyMsg = NULL;
797 	unsigned long		 timeleft;
798 
799 	/*  Valid device. Get a message frame and construct the FW download message.
800 	*/
801 	if ((mf = mpt_get_msg_frame(mptctl_id, iocp)) == NULL)
802 		return -EAGAIN;
803 
804 	dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT
805 	    "mptctl_do_fwdl called. mptctl_id = %xh.\n", iocp->name, mptctl_id));
806 	dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: kfwdl.bufp  = %p\n",
807 	    iocp->name, ufwbuf));
808 	dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: kfwdl.fwlen = %d\n",
809 	    iocp->name, (int)fwlen));
810 
811 	dlmsg = (FWDownload_t*) mf;
812 	ptsge = (FWDownloadTCSGE_t *) &dlmsg->SGL;
813 	sgOut = (char *) (ptsge + 1);
814 
815 	/*
816 	 * Construct f/w download request
817 	 */
818 	dlmsg->ImageType = MPI_FW_DOWNLOAD_ITYPE_FW;
819 	dlmsg->Reserved = 0;
820 	dlmsg->ChainOffset = 0;
821 	dlmsg->Function = MPI_FUNCTION_FW_DOWNLOAD;
822 	dlmsg->Reserved1[0] = dlmsg->Reserved1[1] = dlmsg->Reserved1[2] = 0;
823 	if (iocp->facts.MsgVersion >= MPI_VERSION_01_05)
824 		dlmsg->MsgFlags = MPI_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT;
825 	else
826 		dlmsg->MsgFlags = 0;
827 
828 
829 	/* Set up the Transaction SGE.
830 	 */
831 	ptsge->Reserved = 0;
832 	ptsge->ContextSize = 0;
833 	ptsge->DetailsLength = 12;
834 	ptsge->Flags = MPI_SGE_FLAGS_TRANSACTION_ELEMENT;
835 	ptsge->Reserved_0100_Checksum = 0;
836 	ptsge->ImageOffset = 0;
837 	ptsge->ImageSize = cpu_to_le32(fwlen);
838 
839 	/* Add the SGL
840 	 */
841 
842 	/*
843 	 * Need to kmalloc area(s) for holding firmware image bytes.
844 	 * But we need to do it piece meal, using a proper
845 	 * scatter gather list (with 128kB MAX hunks).
846 	 *
847 	 * A practical limit here might be # of sg hunks that fit into
848 	 * a single IOC request frame; 12 or 8 (see below), so:
849 	 * For FC9xx: 12 x 128kB == 1.5 mB (max)
850 	 * For C1030:  8 x 128kB == 1   mB (max)
851 	 * We could support chaining, but things get ugly(ier:)
852 	 *
853 	 * Set the sge_offset to the start of the sgl (bytes).
854 	 */
855 	sgdir = 0x04000000;		/* IOC will READ from sys mem */
856 	sge_offset = sizeof(MPIHeader_t) + sizeof(FWDownloadTCSGE_t);
857 	if ((sgl = kbuf_alloc_2_sgl(fwlen, sgdir, sge_offset,
858 				    &numfrags, &buflist, &sgl_dma, iocp)) == NULL)
859 		return -ENOMEM;
860 
861 	/*
862 	 * We should only need SGL with 2 simple_32bit entries (up to 256 kB)
863 	 * for FC9xx f/w image, but calculate max number of sge hunks
864 	 * we can fit into a request frame, and limit ourselves to that.
865 	 * (currently no chain support)
866 	 * maxfrags = (Request Size - FWdownload Size ) / Size of 32 bit SGE
867 	 *	Request		maxfrags
868 	 *	128		12
869 	 *	96		8
870 	 *	64		4
871 	 */
872 	maxfrags = (iocp->req_sz - sizeof(MPIHeader_t) -
873 			sizeof(FWDownloadTCSGE_t))
874 			/ iocp->SGE_size;
875 	if (numfrags > maxfrags) {
876 		ret = -EMLINK;
877 		goto fwdl_out;
878 	}
879 
880 	dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: sgl buffer = %p, sgfrags = %d\n",
881 	    iocp->name, sgl, numfrags));
882 
883 	/*
884 	 * Parse SG list, copying sgl itself,
885 	 * plus f/w image hunks from user space as we go...
886 	 */
887 	ret = -EFAULT;
888 	sgIn = sgl;
889 	bl = buflist;
890 	for (i=0; i < numfrags; i++) {
891 
892 		/* Get the SGE type: 0 - TCSGE, 3 - Chain, 1 - Simple SGE
893 		 * Skip everything but Simple. If simple, copy from
894 		 *	user space into kernel space.
895 		 * Note: we should not have anything but Simple as
896 		 *	Chain SGE are illegal.
897 		 */
898 		nib = (sgIn->FlagsLength & 0x30000000) >> 28;
899 		if (nib == 0 || nib == 3) {
900 			;
901 		} else if (sgIn->Address) {
902 			iocp->add_sge(sgOut, sgIn->FlagsLength, sgIn->Address);
903 			n++;
904 			if (copy_from_user(bl->kptr, ufwbuf+fw_bytes_copied, bl->len)) {
905 				printk(MYIOC_s_ERR_FMT "%s@%d::_ioctl_fwdl - "
906 					"Unable to copy f/w buffer hunk#%d @ %p\n",
907 					iocp->name, __FILE__, __LINE__, n, ufwbuf);
908 				goto fwdl_out;
909 			}
910 			fw_bytes_copied += bl->len;
911 		}
912 		sgIn++;
913 		bl++;
914 		sgOut += iocp->SGE_size;
915 	}
916 
917 	DBG_DUMP_FW_DOWNLOAD(iocp, (u32 *)mf, numfrags);
918 
919 	/*
920 	 * Finally, perform firmware download.
921 	 */
922 	ReplyMsg = NULL;
923 	SET_MGMT_MSG_CONTEXT(iocp->ioctl_cmds.msg_context, dlmsg->MsgContext);
924 	INITIALIZE_MGMT_STATUS(iocp->ioctl_cmds.status)
925 	mpt_put_msg_frame(mptctl_id, iocp, mf);
926 
927 	/* Now wait for the command to complete */
928 retry_wait:
929 	timeleft = wait_for_completion_timeout(&iocp->ioctl_cmds.done, HZ*60);
930 	if (!(iocp->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
931 		ret = -ETIME;
932 		printk(MYIOC_s_WARN_FMT "%s: failed\n", iocp->name, __func__);
933 		if (iocp->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
934 			mpt_free_msg_frame(iocp, mf);
935 			goto fwdl_out;
936 		}
937 		if (!timeleft) {
938 			printk(MYIOC_s_WARN_FMT
939 			       "FW download timeout, doorbell=0x%08x\n",
940 			       iocp->name, mpt_GetIocState(iocp, 0));
941 			mptctl_timeout_expired(iocp, mf);
942 		} else
943 			goto retry_wait;
944 		goto fwdl_out;
945 	}
946 
947 	if (!(iocp->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID)) {
948 		printk(MYIOC_s_WARN_FMT "%s: failed\n", iocp->name, __func__);
949 		mpt_free_msg_frame(iocp, mf);
950 		ret = -ENODATA;
951 		goto fwdl_out;
952 	}
953 
954 	if (sgl)
955 		kfree_sgl(sgl, sgl_dma, buflist, iocp);
956 
957 	ReplyMsg = (pFWDownloadReply_t)iocp->ioctl_cmds.reply;
958 	iocstat = le16_to_cpu(ReplyMsg->IOCStatus) & MPI_IOCSTATUS_MASK;
959 	if (iocstat == MPI_IOCSTATUS_SUCCESS) {
960 		printk(MYIOC_s_INFO_FMT "F/W update successful!\n", iocp->name);
961 		return 0;
962 	} else if (iocstat == MPI_IOCSTATUS_INVALID_FUNCTION) {
963 		printk(MYIOC_s_WARN_FMT "Hmmm...  F/W download not supported!?!\n",
964 			iocp->name);
965 		printk(MYIOC_s_WARN_FMT "(time to go bang on somebodies door)\n",
966 			iocp->name);
967 		return -EBADRQC;
968 	} else if (iocstat == MPI_IOCSTATUS_BUSY) {
969 		printk(MYIOC_s_WARN_FMT "IOC_BUSY!\n", iocp->name);
970 		printk(MYIOC_s_WARN_FMT "(try again later?)\n", iocp->name);
971 		return -EBUSY;
972 	} else {
973 		printk(MYIOC_s_WARN_FMT "ioctl_fwdl() returned [bad] status = %04xh\n",
974 			iocp->name, iocstat);
975 		printk(MYIOC_s_WARN_FMT "(bad VooDoo)\n", iocp->name);
976 		return -ENOMSG;
977 	}
978 	return 0;
979 
980 fwdl_out:
981 
982 	CLEAR_MGMT_STATUS(iocp->ioctl_cmds.status);
983 	SET_MGMT_MSG_CONTEXT(iocp->ioctl_cmds.msg_context, 0);
984         kfree_sgl(sgl, sgl_dma, buflist, iocp);
985 	return ret;
986 }
987 
988 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
989 /*
990  * SGE Allocation routine
991  *
992  * Inputs:	bytes - number of bytes to be transferred
993  *		sgdir - data direction
994  *		sge_offset - offset (in bytes) from the start of the request
995  *			frame to the first SGE
996  *		ioc - pointer to the mptadapter
997  * Outputs:	frags - number of scatter gather elements
998  *		blp - point to the buflist pointer
999  *		sglbuf_dma - pointer to the (dma) sgl
1000  * Returns:	Null if failes
1001  *		pointer to the (virtual) sgl if successful.
1002  */
1003 static MptSge_t *
1004 kbuf_alloc_2_sgl(int bytes, u32 sgdir, int sge_offset, int *frags,
1005 		 struct buflist **blp, dma_addr_t *sglbuf_dma, MPT_ADAPTER *ioc)
1006 {
1007 	MptSge_t	*sglbuf = NULL;		/* pointer to array of SGE */
1008 						/* and chain buffers */
1009 	struct buflist	*buflist = NULL;	/* kernel routine */
1010 	MptSge_t	*sgl;
1011 	int		 numfrags = 0;
1012 	int		 fragcnt = 0;
1013 	int		 alloc_sz = min(bytes,MAX_KMALLOC_SZ);	// avoid kernel warning msg!
1014 	int		 bytes_allocd = 0;
1015 	int		 this_alloc;
1016 	dma_addr_t	 pa;					// phys addr
1017 	int		 i, buflist_ent;
1018 	int		 sg_spill = MAX_FRAGS_SPILL1;
1019 	int		 dir;
1020 
1021 	if (bytes < 0)
1022 		return NULL;
1023 
1024 	/* initialization */
1025 	*frags = 0;
1026 	*blp = NULL;
1027 
1028 	/* Allocate and initialize an array of kernel
1029 	 * structures for the SG elements.
1030 	 */
1031 	i = MAX_SGL_BYTES / 8;
1032 	buflist = kzalloc(i, GFP_USER);
1033 	if (!buflist)
1034 		return NULL;
1035 	buflist_ent = 0;
1036 
1037 	/* Allocate a single block of memory to store the sg elements and
1038 	 * the chain buffers.  The calling routine is responsible for
1039 	 * copying the data in this array into the correct place in the
1040 	 * request and chain buffers.
1041 	 */
1042 	sglbuf = dma_alloc_coherent(&ioc->pcidev->dev, MAX_SGL_BYTES,
1043 				    sglbuf_dma, GFP_KERNEL);
1044 	if (sglbuf == NULL)
1045 		goto free_and_fail;
1046 
1047 	if (sgdir & 0x04000000)
1048 		dir = DMA_TO_DEVICE;
1049 	else
1050 		dir = DMA_FROM_DEVICE;
1051 
1052 	/* At start:
1053 	 *	sgl = sglbuf = point to beginning of sg buffer
1054 	 *	buflist_ent = 0 = first kernel structure
1055 	 *	sg_spill = number of SGE that can be written before the first
1056 	 *		chain element.
1057 	 *
1058 	 */
1059 	sgl = sglbuf;
1060 	sg_spill = ((ioc->req_sz - sge_offset)/ioc->SGE_size) - 1;
1061 	while (bytes_allocd < bytes) {
1062 		this_alloc = min(alloc_sz, bytes-bytes_allocd);
1063 		buflist[buflist_ent].len = this_alloc;
1064 		buflist[buflist_ent].kptr = dma_alloc_coherent(&ioc->pcidev->dev,
1065 							       this_alloc,
1066 							       &pa, GFP_KERNEL);
1067 		if (buflist[buflist_ent].kptr == NULL) {
1068 			alloc_sz = alloc_sz / 2;
1069 			if (alloc_sz == 0) {
1070 				printk(MYIOC_s_WARN_FMT "-SG: No can do - "
1071 				    "not enough memory!   :-(\n", ioc->name);
1072 				printk(MYIOC_s_WARN_FMT "-SG: (freeing %d frags)\n",
1073 					ioc->name, numfrags);
1074 				goto free_and_fail;
1075 			}
1076 			continue;
1077 		} else {
1078 			dma_addr_t dma_addr;
1079 
1080 			bytes_allocd += this_alloc;
1081 			sgl->FlagsLength = (0x10000000|sgdir|this_alloc);
1082 			dma_addr = dma_map_single(&ioc->pcidev->dev,
1083 						  buflist[buflist_ent].kptr,
1084 						  this_alloc, dir);
1085 			sgl->Address = dma_addr;
1086 
1087 			fragcnt++;
1088 			numfrags++;
1089 			sgl++;
1090 			buflist_ent++;
1091 		}
1092 
1093 		if (bytes_allocd >= bytes)
1094 			break;
1095 
1096 		/* Need to chain? */
1097 		if (fragcnt == sg_spill) {
1098 			printk(MYIOC_s_WARN_FMT
1099 			    "-SG: No can do - " "Chain required!   :-(\n", ioc->name);
1100 			printk(MYIOC_s_WARN_FMT "(freeing %d frags)\n", ioc->name, numfrags);
1101 			goto free_and_fail;
1102 		}
1103 
1104 		/* overflow check... */
1105 		if (numfrags*8 > MAX_SGL_BYTES){
1106 			/* GRRRRR... */
1107 			printk(MYIOC_s_WARN_FMT "-SG: No can do - "
1108 				"too many SG frags!   :-(\n", ioc->name);
1109 			printk(MYIOC_s_WARN_FMT "-SG: (freeing %d frags)\n",
1110 				ioc->name, numfrags);
1111 			goto free_and_fail;
1112 		}
1113 	}
1114 
1115 	/* Last sge fixup: set LE+eol+eob bits */
1116 	sgl[-1].FlagsLength |= 0xC1000000;
1117 
1118 	*frags = numfrags;
1119 	*blp = buflist;
1120 
1121 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "-SG: kbuf_alloc_2_sgl() - "
1122 	   "%d SG frags generated!\n", ioc->name, numfrags));
1123 
1124 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "-SG: kbuf_alloc_2_sgl() - "
1125 	   "last (big) alloc_sz=%d\n", ioc->name, alloc_sz));
1126 
1127 	return sglbuf;
1128 
1129 free_and_fail:
1130 	if (sglbuf != NULL) {
1131 		for (i = 0; i < numfrags; i++) {
1132 			dma_addr_t dma_addr;
1133 			u8 *kptr;
1134 			int len;
1135 
1136 			if ((sglbuf[i].FlagsLength >> 24) == 0x30)
1137 				continue;
1138 
1139 			dma_addr = sglbuf[i].Address;
1140 			kptr = buflist[i].kptr;
1141 			len = buflist[i].len;
1142 
1143 			dma_free_coherent(&ioc->pcidev->dev, len, kptr,
1144 					  dma_addr);
1145 		}
1146 		dma_free_coherent(&ioc->pcidev->dev, MAX_SGL_BYTES, sglbuf,
1147 				  *sglbuf_dma);
1148 	}
1149 	kfree(buflist);
1150 	return NULL;
1151 }
1152 
1153 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1154 /*
1155  * Routine to free the SGL elements.
1156  */
1157 static void
1158 kfree_sgl(MptSge_t *sgl, dma_addr_t sgl_dma, struct buflist *buflist, MPT_ADAPTER *ioc)
1159 {
1160 	MptSge_t	*sg = sgl;
1161 	struct buflist	*bl = buflist;
1162 	u32		 nib;
1163 	int		 dir;
1164 	int		 n = 0;
1165 
1166 	if (sg->FlagsLength & 0x04000000)
1167 		dir = DMA_TO_DEVICE;
1168 	else
1169 		dir = DMA_FROM_DEVICE;
1170 
1171 	nib = (sg->FlagsLength & 0xF0000000) >> 28;
1172 	while (! (nib & 0x4)) { /* eob */
1173 		/* skip ignore/chain. */
1174 		if (nib == 0 || nib == 3) {
1175 			;
1176 		} else if (sg->Address) {
1177 			dma_addr_t dma_addr;
1178 			void *kptr;
1179 			int len;
1180 
1181 			dma_addr = sg->Address;
1182 			kptr = bl->kptr;
1183 			len = bl->len;
1184 			dma_unmap_single(&ioc->pcidev->dev, dma_addr, len,
1185 					 dir);
1186 			dma_free_coherent(&ioc->pcidev->dev, len, kptr,
1187 					  dma_addr);
1188 			n++;
1189 		}
1190 		sg++;
1191 		bl++;
1192 		nib = (le32_to_cpu(sg->FlagsLength) & 0xF0000000) >> 28;
1193 	}
1194 
1195 	/* we're at eob! */
1196 	if (sg->Address) {
1197 		dma_addr_t dma_addr;
1198 		void *kptr;
1199 		int len;
1200 
1201 		dma_addr = sg->Address;
1202 		kptr = bl->kptr;
1203 		len = bl->len;
1204 		dma_unmap_single(&ioc->pcidev->dev, dma_addr, len, dir);
1205 		dma_free_coherent(&ioc->pcidev->dev, len, kptr, dma_addr);
1206 		n++;
1207 	}
1208 
1209 	dma_free_coherent(&ioc->pcidev->dev, MAX_SGL_BYTES, sgl, sgl_dma);
1210 	kfree(buflist);
1211 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "-SG: Free'd 1 SGL buf + %d kbufs!\n",
1212 	    ioc->name, n));
1213 }
1214 
1215 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1216 /*
1217  *	mptctl_getiocinfo - Query the host adapter for IOC information.
1218  *	@arg: User space argument
1219  *
1220  * Outputs:	None.
1221  * Return:	0 if successful
1222  *		-EFAULT if data unavailable
1223  *		-ENODEV  if no such device/adapter
1224  */
1225 static int
1226 mptctl_getiocinfo (MPT_ADAPTER *ioc, unsigned long arg, unsigned int data_size)
1227 {
1228 	struct mpt_ioctl_iocinfo __user *uarg = (void __user *) arg;
1229 	struct mpt_ioctl_iocinfo *karg;
1230 	struct pci_dev		*pdev;
1231 	unsigned int		port;
1232 	int			cim_rev;
1233 	struct scsi_device 	*sdev;
1234 	VirtDevice		*vdevice;
1235 
1236 	/* Add of PCI INFO results in unaligned access for
1237 	 * IA64 and Sparc. Reset long to int. Return no PCI
1238 	 * data for obsolete format.
1239 	 */
1240 	if (data_size == sizeof(struct mpt_ioctl_iocinfo_rev0))
1241 		cim_rev = 0;
1242 	else if (data_size == sizeof(struct mpt_ioctl_iocinfo_rev1))
1243 		cim_rev = 1;
1244 	else if (data_size == sizeof(struct mpt_ioctl_iocinfo))
1245 		cim_rev = 2;
1246 	else if (data_size == (sizeof(struct mpt_ioctl_iocinfo_rev0)+12))
1247 		cim_rev = 0;	/* obsolete */
1248 	else
1249 		return -EFAULT;
1250 
1251 	karg = memdup_user(uarg, data_size);
1252 	if (IS_ERR(karg)) {
1253 		printk(KERN_ERR MYNAM "%s@%d::mpt_ioctl_iocinfo() - memdup_user returned error [%ld]\n",
1254 				__FILE__, __LINE__, PTR_ERR(karg));
1255 		return PTR_ERR(karg);
1256 	}
1257 
1258 	/* Verify the data transfer size is correct. */
1259 	if (karg->hdr.maxDataSize != data_size) {
1260 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_getiocinfo - "
1261 			"Structure size mismatch. Command not completed.\n",
1262 			ioc->name, __FILE__, __LINE__);
1263 		kfree(karg);
1264 		return -EFAULT;
1265 	}
1266 
1267 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_getiocinfo called.\n",
1268 	    ioc->name));
1269 
1270 	/* Fill in the data and return the structure to the calling
1271 	 * program
1272 	 */
1273 	if (ioc->bus_type == SAS)
1274 		karg->adapterType = MPT_IOCTL_INTERFACE_SAS;
1275 	else if (ioc->bus_type == FC)
1276 		karg->adapterType = MPT_IOCTL_INTERFACE_FC;
1277 	else
1278 		karg->adapterType = MPT_IOCTL_INTERFACE_SCSI;
1279 
1280 	if (karg->hdr.port > 1) {
1281 		kfree(karg);
1282 		return -EINVAL;
1283 	}
1284 	port = karg->hdr.port;
1285 
1286 	karg->port = port;
1287 	pdev = (struct pci_dev *) ioc->pcidev;
1288 
1289 	karg->pciId = pdev->device;
1290 	karg->hwRev = pdev->revision;
1291 	karg->subSystemDevice = pdev->subsystem_device;
1292 	karg->subSystemVendor = pdev->subsystem_vendor;
1293 
1294 	if (cim_rev == 1) {
1295 		/* Get the PCI bus, device, and function numbers for the IOC
1296 		 */
1297 		karg->pciInfo.u.bits.busNumber = pdev->bus->number;
1298 		karg->pciInfo.u.bits.deviceNumber = PCI_SLOT( pdev->devfn );
1299 		karg->pciInfo.u.bits.functionNumber = PCI_FUNC( pdev->devfn );
1300 	} else if (cim_rev == 2) {
1301 		/* Get the PCI bus, device, function and segment ID numbers
1302 		   for the IOC */
1303 		karg->pciInfo.u.bits.busNumber = pdev->bus->number;
1304 		karg->pciInfo.u.bits.deviceNumber = PCI_SLOT( pdev->devfn );
1305 		karg->pciInfo.u.bits.functionNumber = PCI_FUNC( pdev->devfn );
1306 		karg->pciInfo.segmentID = pci_domain_nr(pdev->bus);
1307 	}
1308 
1309 	/* Get number of devices
1310          */
1311 	karg->numDevices = 0;
1312 	if (ioc->sh) {
1313 		shost_for_each_device(sdev, ioc->sh) {
1314 			vdevice = sdev->hostdata;
1315 			if (vdevice == NULL || vdevice->vtarget == NULL)
1316 				continue;
1317 			if (vdevice->vtarget->tflags &
1318 			    MPT_TARGET_FLAGS_RAID_COMPONENT)
1319 				continue;
1320 			karg->numDevices++;
1321 		}
1322 	}
1323 
1324 	/* Set the BIOS and FW Version
1325 	 */
1326 	karg->FWVersion = ioc->facts.FWVersion.Word;
1327 	karg->BIOSVersion = ioc->biosVersion;
1328 
1329 	/* Set the Version Strings.
1330 	 */
1331 	strncpy (karg->driverVersion, MPT_LINUX_PACKAGE_NAME, MPT_IOCTL_VERSION_LENGTH);
1332 	karg->driverVersion[MPT_IOCTL_VERSION_LENGTH-1]='\0';
1333 
1334 	karg->busChangeEvent = 0;
1335 	karg->hostId = ioc->pfacts[port].PortSCSIID;
1336 	karg->rsvd[0] = karg->rsvd[1] = 0;
1337 
1338 	/* Copy the data from kernel memory to user memory
1339 	 */
1340 	if (copy_to_user((char __user *)arg, karg, data_size)) {
1341 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_getiocinfo - "
1342 			"Unable to write out mpt_ioctl_iocinfo struct @ %p\n",
1343 			ioc->name, __FILE__, __LINE__, uarg);
1344 		kfree(karg);
1345 		return -EFAULT;
1346 	}
1347 
1348 	kfree(karg);
1349 	return 0;
1350 }
1351 
1352 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1353 /*
1354  *	mptctl_gettargetinfo - Query the host adapter for target information.
1355  *	@arg: User space argument
1356  *
1357  * Outputs:	None.
1358  * Return:	0 if successful
1359  *		-EFAULT if data unavailable
1360  *		-ENODEV  if no such device/adapter
1361  */
1362 static int
1363 mptctl_gettargetinfo (MPT_ADAPTER *ioc, unsigned long arg)
1364 {
1365 	struct mpt_ioctl_targetinfo __user *uarg = (void __user *) arg;
1366 	struct mpt_ioctl_targetinfo karg;
1367 	VirtDevice		*vdevice;
1368 	char			*pmem;
1369 	int			*pdata;
1370 	int			numDevices = 0;
1371 	int			lun;
1372 	int			maxWordsLeft;
1373 	int			numBytes;
1374 	struct scsi_device 	*sdev;
1375 
1376 	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_targetinfo))) {
1377 		printk(KERN_ERR MYNAM "%s@%d::mptctl_gettargetinfo - "
1378 			"Unable to read in mpt_ioctl_targetinfo struct @ %p\n",
1379 				__FILE__, __LINE__, uarg);
1380 		return -EFAULT;
1381 	}
1382 
1383 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_gettargetinfo called.\n",
1384 	    ioc->name));
1385 	numBytes = karg.hdr.maxDataSize - sizeof(mpt_ioctl_header);
1386 	maxWordsLeft = numBytes/sizeof(int);
1387 
1388 	if (maxWordsLeft <= 0) {
1389 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo() - no memory available!\n",
1390 			ioc->name, __FILE__, __LINE__);
1391 		return -ENOMEM;
1392 	}
1393 
1394 	/* Fill in the data and return the structure to the calling
1395 	 * program
1396 	 */
1397 
1398 	/* struct mpt_ioctl_targetinfo does not contain sufficient space
1399 	 * for the target structures so when the IOCTL is called, there is
1400 	 * not sufficient stack space for the structure. Allocate memory,
1401 	 * populate the memory, copy back to the user, then free memory.
1402 	 * targetInfo format:
1403 	 * bits 31-24: reserved
1404 	 *      23-16: LUN
1405 	 *      15- 8: Bus Number
1406 	 *       7- 0: Target ID
1407 	 */
1408 	pmem = kzalloc(numBytes, GFP_KERNEL);
1409 	if (!pmem) {
1410 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo() - no memory available!\n",
1411 			ioc->name, __FILE__, __LINE__);
1412 		return -ENOMEM;
1413 	}
1414 	pdata =  (int *) pmem;
1415 
1416 	/* Get number of devices
1417          */
1418 	if (ioc->sh){
1419 		shost_for_each_device(sdev, ioc->sh) {
1420 			if (!maxWordsLeft)
1421 				continue;
1422 			vdevice = sdev->hostdata;
1423 			if (vdevice == NULL || vdevice->vtarget == NULL)
1424 				continue;
1425 			if (vdevice->vtarget->tflags &
1426 			    MPT_TARGET_FLAGS_RAID_COMPONENT)
1427 				continue;
1428 			lun = (vdevice->vtarget->raidVolume) ? 0x80 : vdevice->lun;
1429 			*pdata = (((u8)lun << 16) + (vdevice->vtarget->channel << 8) +
1430 			    (vdevice->vtarget->id ));
1431 			pdata++;
1432 			numDevices++;
1433 			--maxWordsLeft;
1434 		}
1435 	}
1436 	karg.numDevices = numDevices;
1437 
1438 	/* Copy part of the data from kernel memory to user memory
1439 	 */
1440 	if (copy_to_user((char __user *)arg, &karg,
1441 				sizeof(struct mpt_ioctl_targetinfo))) {
1442 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo - "
1443 			"Unable to write out mpt_ioctl_targetinfo struct @ %p\n",
1444 			ioc->name, __FILE__, __LINE__, uarg);
1445 		kfree(pmem);
1446 		return -EFAULT;
1447 	}
1448 
1449 	/* Copy the remaining data from kernel memory to user memory
1450 	 */
1451 	if (copy_to_user(uarg->targetInfo, pmem, numBytes)) {
1452 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo - "
1453 			"Unable to write out mpt_ioctl_targetinfo struct @ %p\n",
1454 			ioc->name, __FILE__, __LINE__, pdata);
1455 		kfree(pmem);
1456 		return -EFAULT;
1457 	}
1458 
1459 	kfree(pmem);
1460 
1461 	return 0;
1462 }
1463 
1464 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1465 /* MPT IOCTL Test function.
1466  *
1467  * Outputs:	None.
1468  * Return:	0 if successful
1469  *		-EFAULT if data unavailable
1470  *		-ENODEV  if no such device/adapter
1471  */
1472 static int
1473 mptctl_readtest (MPT_ADAPTER *ioc, unsigned long arg)
1474 {
1475 	struct mpt_ioctl_test __user *uarg = (void __user *) arg;
1476 	struct mpt_ioctl_test	 karg;
1477 
1478 	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_test))) {
1479 		printk(KERN_ERR MYNAM "%s@%d::mptctl_readtest - "
1480 			"Unable to read in mpt_ioctl_test struct @ %p\n",
1481 				__FILE__, __LINE__, uarg);
1482 		return -EFAULT;
1483 	}
1484 
1485 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_readtest called.\n",
1486 	    ioc->name));
1487 	/* Fill in the data and return the structure to the calling
1488 	 * program
1489 	 */
1490 
1491 #ifdef MFCNT
1492 	karg.chip_type = ioc->mfcnt;
1493 #else
1494 	karg.chip_type = ioc->pcidev->device;
1495 #endif
1496 	strncpy (karg.name, ioc->name, MPT_MAX_NAME);
1497 	karg.name[MPT_MAX_NAME-1]='\0';
1498 	strncpy (karg.product, ioc->prod_name, MPT_PRODUCT_LENGTH);
1499 	karg.product[MPT_PRODUCT_LENGTH-1]='\0';
1500 
1501 	/* Copy the data from kernel memory to user memory
1502 	 */
1503 	if (copy_to_user((char __user *)arg, &karg, sizeof(struct mpt_ioctl_test))) {
1504 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_readtest - "
1505 			"Unable to write out mpt_ioctl_test struct @ %p\n",
1506 			ioc->name, __FILE__, __LINE__, uarg);
1507 		return -EFAULT;
1508 	}
1509 
1510 	return 0;
1511 }
1512 
1513 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1514 /*
1515  *	mptctl_eventquery - Query the host adapter for the event types
1516  *	that are being logged.
1517  *	@arg: User space argument
1518  *
1519  * Outputs:	None.
1520  * Return:	0 if successful
1521  *		-EFAULT if data unavailable
1522  *		-ENODEV  if no such device/adapter
1523  */
1524 static int
1525 mptctl_eventquery (MPT_ADAPTER *ioc, unsigned long arg)
1526 {
1527 	struct mpt_ioctl_eventquery __user *uarg = (void __user *) arg;
1528 	struct mpt_ioctl_eventquery	 karg;
1529 
1530 	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventquery))) {
1531 		printk(KERN_ERR MYNAM "%s@%d::mptctl_eventquery - "
1532 			"Unable to read in mpt_ioctl_eventquery struct @ %p\n",
1533 				__FILE__, __LINE__, uarg);
1534 		return -EFAULT;
1535 	}
1536 
1537 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_eventquery called.\n",
1538 	    ioc->name));
1539 	karg.eventEntries = MPTCTL_EVENT_LOG_SIZE;
1540 	karg.eventTypes = ioc->eventTypes;
1541 
1542 	/* Copy the data from kernel memory to user memory
1543 	 */
1544 	if (copy_to_user((char __user *)arg, &karg, sizeof(struct mpt_ioctl_eventquery))) {
1545 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_eventquery - "
1546 			"Unable to write out mpt_ioctl_eventquery struct @ %p\n",
1547 			ioc->name, __FILE__, __LINE__, uarg);
1548 		return -EFAULT;
1549 	}
1550 	return 0;
1551 }
1552 
1553 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1554 static int
1555 mptctl_eventenable (MPT_ADAPTER *ioc, unsigned long arg)
1556 {
1557 	struct mpt_ioctl_eventenable __user *uarg = (void __user *) arg;
1558 	struct mpt_ioctl_eventenable	 karg;
1559 
1560 	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventenable))) {
1561 		printk(KERN_ERR MYNAM "%s@%d::mptctl_eventenable - "
1562 			"Unable to read in mpt_ioctl_eventenable struct @ %p\n",
1563 				__FILE__, __LINE__, uarg);
1564 		return -EFAULT;
1565 	}
1566 
1567 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_eventenable called.\n",
1568 	    ioc->name));
1569 	if (ioc->events == NULL) {
1570 		/* Have not yet allocated memory - do so now.
1571 		 */
1572 		int sz = MPTCTL_EVENT_LOG_SIZE * sizeof(MPT_IOCTL_EVENTS);
1573 		ioc->events = kzalloc(sz, GFP_KERNEL);
1574 		if (!ioc->events) {
1575 			printk(MYIOC_s_ERR_FMT
1576 			    ": ERROR - Insufficient memory to add adapter!\n",
1577 			    ioc->name);
1578 			return -ENOMEM;
1579 		}
1580 		ioc->alloc_total += sz;
1581 
1582 		ioc->eventContext = 0;
1583         }
1584 
1585 	/* Update the IOC event logging flag.
1586 	 */
1587 	ioc->eventTypes = karg.eventTypes;
1588 
1589 	return 0;
1590 }
1591 
1592 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1593 static int
1594 mptctl_eventreport (MPT_ADAPTER *ioc, unsigned long arg)
1595 {
1596 	struct mpt_ioctl_eventreport __user *uarg = (void __user *) arg;
1597 	struct mpt_ioctl_eventreport	 karg;
1598 	int			 numBytes, maxEvents, max;
1599 
1600 	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventreport))) {
1601 		printk(KERN_ERR MYNAM "%s@%d::mptctl_eventreport - "
1602 			"Unable to read in mpt_ioctl_eventreport struct @ %p\n",
1603 				__FILE__, __LINE__, uarg);
1604 		return -EFAULT;
1605 	}
1606 
1607 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_eventreport called.\n",
1608 	    ioc->name));
1609 
1610 	numBytes = karg.hdr.maxDataSize - sizeof(mpt_ioctl_header);
1611 	maxEvents = numBytes/sizeof(MPT_IOCTL_EVENTS);
1612 
1613 
1614 	max = MPTCTL_EVENT_LOG_SIZE < maxEvents ? MPTCTL_EVENT_LOG_SIZE : maxEvents;
1615 
1616 	/* If fewer than 1 event is requested, there must have
1617 	 * been some type of error.
1618 	 */
1619 	if ((max < 1) || !ioc->events)
1620 		return -ENODATA;
1621 
1622 	/* reset this flag so SIGIO can restart */
1623 	ioc->aen_event_read_flag=0;
1624 
1625 	/* Copy the data from kernel memory to user memory
1626 	 */
1627 	numBytes = max * sizeof(MPT_IOCTL_EVENTS);
1628 	if (copy_to_user(uarg->eventData, ioc->events, numBytes)) {
1629 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_eventreport - "
1630 			"Unable to write out mpt_ioctl_eventreport struct @ %p\n",
1631 			ioc->name, __FILE__, __LINE__, ioc->events);
1632 		return -EFAULT;
1633 	}
1634 
1635 	return 0;
1636 }
1637 
1638 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1639 static int
1640 mptctl_replace_fw (MPT_ADAPTER *ioc, unsigned long arg)
1641 {
1642 	struct mpt_ioctl_replace_fw __user *uarg = (void __user *) arg;
1643 	struct mpt_ioctl_replace_fw	 karg;
1644 	int			 newFwSize;
1645 
1646 	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_replace_fw))) {
1647 		printk(KERN_ERR MYNAM "%s@%d::mptctl_replace_fw - "
1648 			"Unable to read in mpt_ioctl_replace_fw struct @ %p\n",
1649 				__FILE__, __LINE__, uarg);
1650 		return -EFAULT;
1651 	}
1652 
1653 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_replace_fw called.\n",
1654 	    ioc->name));
1655 	/* If caching FW, Free the old FW image
1656 	 */
1657 	if (ioc->cached_fw == NULL)
1658 		return 0;
1659 
1660 	mpt_free_fw_memory(ioc);
1661 
1662 	/* Allocate memory for the new FW image
1663 	 */
1664 	newFwSize = ALIGN(karg.newImageSize, 4);
1665 
1666 	mpt_alloc_fw_memory(ioc, newFwSize);
1667 	if (ioc->cached_fw == NULL)
1668 		return -ENOMEM;
1669 
1670 	/* Copy the data from user memory to kernel space
1671 	 */
1672 	if (copy_from_user(ioc->cached_fw, uarg->newImage, newFwSize)) {
1673 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_replace_fw - "
1674 				"Unable to read in mpt_ioctl_replace_fw image "
1675 				"@ %p\n", ioc->name, __FILE__, __LINE__, uarg);
1676 		mpt_free_fw_memory(ioc);
1677 		return -EFAULT;
1678 	}
1679 
1680 	/* Update IOCFactsReply
1681 	 */
1682 	ioc->facts.FWImageSize = newFwSize;
1683 	return 0;
1684 }
1685 
1686 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1687 /* MPT IOCTL MPTCOMMAND function.
1688  * Cast the arg into the mpt_ioctl_mpt_command structure.
1689  *
1690  * Outputs:	None.
1691  * Return:	0 if successful
1692  *		-EBUSY  if previous command timeout and IOC reset is not complete.
1693  *		-EFAULT if data unavailable
1694  *		-ENODEV if no such device/adapter
1695  *		-ETIME	if timer expires
1696  *		-ENOMEM if memory allocation error
1697  */
1698 static int
1699 mptctl_mpt_command (MPT_ADAPTER *ioc, unsigned long arg)
1700 {
1701 	struct mpt_ioctl_command __user *uarg = (void __user *) arg;
1702 	struct mpt_ioctl_command  karg;
1703 	int		rc;
1704 
1705 
1706 	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_command))) {
1707 		printk(KERN_ERR MYNAM "%s@%d::mptctl_mpt_command - "
1708 			"Unable to read in mpt_ioctl_command struct @ %p\n",
1709 				__FILE__, __LINE__, uarg);
1710 		return -EFAULT;
1711 	}
1712 
1713 	rc = mptctl_do_mpt_command (ioc, karg, &uarg->MF);
1714 
1715 	return rc;
1716 }
1717 
1718 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1719 /* Worker routine for the IOCTL MPTCOMMAND and MPTCOMMAND32 (sparc) commands.
1720  *
1721  * Outputs:	None.
1722  * Return:	0 if successful
1723  *		-EBUSY  if previous command timeout and IOC reset is not complete.
1724  *		-EFAULT if data unavailable
1725  *		-ENODEV if no such device/adapter
1726  *		-ETIME	if timer expires
1727  *		-ENOMEM if memory allocation error
1728  *		-EPERM if SCSI I/O and target is untagged
1729  */
1730 static int
1731 mptctl_do_mpt_command (MPT_ADAPTER *ioc, struct mpt_ioctl_command karg, void __user *mfPtr)
1732 {
1733 	MPT_FRAME_HDR	*mf = NULL;
1734 	MPIHeader_t	*hdr;
1735 	char		*psge;
1736 	struct buflist	bufIn;	/* data In buffer */
1737 	struct buflist	bufOut; /* data Out buffer */
1738 	dma_addr_t	dma_addr_in;
1739 	dma_addr_t	dma_addr_out;
1740 	int		sgSize = 0;	/* Num SG elements */
1741 	int		flagsLength;
1742 	int		sz, rc = 0;
1743 	int		msgContext;
1744 	u16		req_idx;
1745 	ulong 		timeout;
1746 	unsigned long	timeleft;
1747 	struct scsi_device *sdev;
1748 	unsigned long	 flags;
1749 	u8		 function;
1750 
1751 	/* bufIn and bufOut are used for user to kernel space transfers
1752 	 */
1753 	bufIn.kptr = bufOut.kptr = NULL;
1754 	bufIn.len = bufOut.len = 0;
1755 
1756 	spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
1757 	if (ioc->ioc_reset_in_progress) {
1758 		spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
1759 		printk(KERN_ERR MYNAM "%s@%d::mptctl_do_mpt_command - "
1760 			"Busy with diagnostic reset\n", __FILE__, __LINE__);
1761 		return -EBUSY;
1762 	}
1763 	spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
1764 
1765 	/* Basic sanity checks to prevent underflows or integer overflows */
1766 	if (karg.maxReplyBytes < 0 ||
1767 	    karg.dataInSize < 0 ||
1768 	    karg.dataOutSize < 0 ||
1769 	    karg.dataSgeOffset < 0 ||
1770 	    karg.maxSenseBytes < 0 ||
1771 	    karg.dataSgeOffset > ioc->req_sz / 4)
1772 		return -EINVAL;
1773 
1774 	/* Verify that the final request frame will not be too large.
1775 	 */
1776 	sz = karg.dataSgeOffset * 4;
1777 	if (karg.dataInSize > 0)
1778 		sz += ioc->SGE_size;
1779 	if (karg.dataOutSize > 0)
1780 		sz += ioc->SGE_size;
1781 
1782 	if (sz > ioc->req_sz) {
1783 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
1784 			"Request frame too large (%d) maximum (%d)\n",
1785 			ioc->name, __FILE__, __LINE__, sz, ioc->req_sz);
1786 		return -EFAULT;
1787 	}
1788 
1789 	/* Get a free request frame and save the message context.
1790 	 */
1791         if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL)
1792                 return -EAGAIN;
1793 
1794 	hdr = (MPIHeader_t *) mf;
1795 	msgContext = le32_to_cpu(hdr->MsgContext);
1796 	req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx);
1797 
1798 	/* Copy the request frame
1799 	 * Reset the saved message context.
1800 	 * Request frame in user space
1801 	 */
1802 	if (copy_from_user(mf, mfPtr, karg.dataSgeOffset * 4)) {
1803 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
1804 			"Unable to read MF from mpt_ioctl_command struct @ %p\n",
1805 			ioc->name, __FILE__, __LINE__, mfPtr);
1806 		function = -1;
1807 		rc = -EFAULT;
1808 		goto done_free_mem;
1809 	}
1810 	hdr->MsgContext = cpu_to_le32(msgContext);
1811 	function = hdr->Function;
1812 
1813 
1814 	/* Verify that this request is allowed.
1815 	 */
1816 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sending mpi function (0x%02X), req=%p\n",
1817 	    ioc->name, hdr->Function, mf));
1818 
1819 	switch (function) {
1820 	case MPI_FUNCTION_IOC_FACTS:
1821 	case MPI_FUNCTION_PORT_FACTS:
1822 		karg.dataOutSize  = karg.dataInSize = 0;
1823 		break;
1824 
1825 	case MPI_FUNCTION_CONFIG:
1826 	{
1827 		Config_t *config_frame;
1828 		config_frame = (Config_t *)mf;
1829 		dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\ttype=0x%02x ext_type=0x%02x "
1830 		    "number=0x%02x action=0x%02x\n", ioc->name,
1831 		    config_frame->Header.PageType,
1832 		    config_frame->ExtPageType,
1833 		    config_frame->Header.PageNumber,
1834 		    config_frame->Action));
1835 		break;
1836 	}
1837 
1838 	case MPI_FUNCTION_FC_COMMON_TRANSPORT_SEND:
1839 	case MPI_FUNCTION_FC_EX_LINK_SRVC_SEND:
1840 	case MPI_FUNCTION_FW_UPLOAD:
1841 	case MPI_FUNCTION_SCSI_ENCLOSURE_PROCESSOR:
1842 	case MPI_FUNCTION_FW_DOWNLOAD:
1843 	case MPI_FUNCTION_FC_PRIMITIVE_SEND:
1844 	case MPI_FUNCTION_TOOLBOX:
1845 	case MPI_FUNCTION_SAS_IO_UNIT_CONTROL:
1846 		break;
1847 
1848 	case MPI_FUNCTION_SCSI_IO_REQUEST:
1849 		if (ioc->sh) {
1850 			SCSIIORequest_t *pScsiReq = (SCSIIORequest_t *) mf;
1851 			int qtag = MPI_SCSIIO_CONTROL_UNTAGGED;
1852 			int scsidir = 0;
1853 			int dataSize;
1854 			u32 id;
1855 
1856 			id = (ioc->devices_per_bus == 0) ? 256 : ioc->devices_per_bus;
1857 			if (pScsiReq->TargetID > id) {
1858 				printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
1859 					"Target ID out of bounds. \n",
1860 					ioc->name, __FILE__, __LINE__);
1861 				rc = -ENODEV;
1862 				goto done_free_mem;
1863 			}
1864 
1865 			if (pScsiReq->Bus >= ioc->number_of_buses) {
1866 				printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
1867 					"Target Bus out of bounds. \n",
1868 					ioc->name, __FILE__, __LINE__);
1869 				rc = -ENODEV;
1870 				goto done_free_mem;
1871 			}
1872 
1873 			pScsiReq->MsgFlags &= ~MPI_SCSIIO_MSGFLGS_SENSE_WIDTH;
1874 			pScsiReq->MsgFlags |= mpt_msg_flags(ioc);
1875 
1876 
1877 			/* verify that app has not requested
1878 			 *	more sense data than driver
1879 			 *	can provide, if so, reset this parameter
1880 			 * set the sense buffer pointer low address
1881 			 * update the control field to specify Q type
1882 			 */
1883 			if (karg.maxSenseBytes > MPT_SENSE_BUFFER_SIZE)
1884 				pScsiReq->SenseBufferLength = MPT_SENSE_BUFFER_SIZE;
1885 			else
1886 				pScsiReq->SenseBufferLength = karg.maxSenseBytes;
1887 
1888 			pScsiReq->SenseBufferLowAddr =
1889 				cpu_to_le32(ioc->sense_buf_low_dma
1890 				   + (req_idx * MPT_SENSE_BUFFER_ALLOC));
1891 
1892 			shost_for_each_device(sdev, ioc->sh) {
1893 				struct scsi_target *starget = scsi_target(sdev);
1894 				VirtTarget *vtarget = starget->hostdata;
1895 
1896 				if (vtarget == NULL)
1897 					continue;
1898 
1899 				if ((pScsiReq->TargetID == vtarget->id) &&
1900 				    (pScsiReq->Bus == vtarget->channel) &&
1901 				    (vtarget->tflags & MPT_TARGET_FLAGS_Q_YES))
1902 					qtag = MPI_SCSIIO_CONTROL_SIMPLEQ;
1903 			}
1904 
1905 			/* Have the IOCTL driver set the direction based
1906 			 * on the dataOutSize (ordering issue with Sparc).
1907 			 */
1908 			if (karg.dataOutSize > 0) {
1909 				scsidir = MPI_SCSIIO_CONTROL_WRITE;
1910 				dataSize = karg.dataOutSize;
1911 			} else {
1912 				scsidir = MPI_SCSIIO_CONTROL_READ;
1913 				dataSize = karg.dataInSize;
1914 			}
1915 
1916 			pScsiReq->Control = cpu_to_le32(scsidir | qtag);
1917 			pScsiReq->DataLength = cpu_to_le32(dataSize);
1918 
1919 
1920 		} else {
1921 			printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
1922 				"SCSI driver is not loaded. \n",
1923 				ioc->name, __FILE__, __LINE__);
1924 			rc = -EFAULT;
1925 			goto done_free_mem;
1926 		}
1927 		break;
1928 
1929 	case MPI_FUNCTION_SMP_PASSTHROUGH:
1930 		/* Check mf->PassthruFlags to determine if
1931 		 * transfer is ImmediateMode or not.
1932 		 * Immediate mode returns data in the ReplyFrame.
1933 		 * Else, we are sending request and response data
1934 		 * in two SGLs at the end of the mf.
1935 		 */
1936 		break;
1937 
1938 	case MPI_FUNCTION_SATA_PASSTHROUGH:
1939 		if (!ioc->sh) {
1940 			printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
1941 				"SCSI driver is not loaded. \n",
1942 				ioc->name, __FILE__, __LINE__);
1943 			rc = -EFAULT;
1944 			goto done_free_mem;
1945 		}
1946 		break;
1947 
1948 	case MPI_FUNCTION_RAID_ACTION:
1949 		/* Just add a SGE
1950 		 */
1951 		break;
1952 
1953 	case MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH:
1954 		if (ioc->sh) {
1955 			SCSIIORequest_t *pScsiReq = (SCSIIORequest_t *) mf;
1956 			int qtag = MPI_SCSIIO_CONTROL_SIMPLEQ;
1957 			int scsidir = MPI_SCSIIO_CONTROL_READ;
1958 			int dataSize;
1959 
1960 			pScsiReq->MsgFlags &= ~MPI_SCSIIO_MSGFLGS_SENSE_WIDTH;
1961 			pScsiReq->MsgFlags |= mpt_msg_flags(ioc);
1962 
1963 
1964 			/* verify that app has not requested
1965 			 *	more sense data than driver
1966 			 *	can provide, if so, reset this parameter
1967 			 * set the sense buffer pointer low address
1968 			 * update the control field to specify Q type
1969 			 */
1970 			if (karg.maxSenseBytes > MPT_SENSE_BUFFER_SIZE)
1971 				pScsiReq->SenseBufferLength = MPT_SENSE_BUFFER_SIZE;
1972 			else
1973 				pScsiReq->SenseBufferLength = karg.maxSenseBytes;
1974 
1975 			pScsiReq->SenseBufferLowAddr =
1976 				cpu_to_le32(ioc->sense_buf_low_dma
1977 				   + (req_idx * MPT_SENSE_BUFFER_ALLOC));
1978 
1979 			/* All commands to physical devices are tagged
1980 			 */
1981 
1982 			/* Have the IOCTL driver set the direction based
1983 			 * on the dataOutSize (ordering issue with Sparc).
1984 			 */
1985 			if (karg.dataOutSize > 0) {
1986 				scsidir = MPI_SCSIIO_CONTROL_WRITE;
1987 				dataSize = karg.dataOutSize;
1988 			} else {
1989 				scsidir = MPI_SCSIIO_CONTROL_READ;
1990 				dataSize = karg.dataInSize;
1991 			}
1992 
1993 			pScsiReq->Control = cpu_to_le32(scsidir | qtag);
1994 			pScsiReq->DataLength = cpu_to_le32(dataSize);
1995 
1996 		} else {
1997 			printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
1998 				"SCSI driver is not loaded. \n",
1999 				ioc->name, __FILE__, __LINE__);
2000 			rc = -EFAULT;
2001 			goto done_free_mem;
2002 		}
2003 		break;
2004 
2005 	case MPI_FUNCTION_SCSI_TASK_MGMT:
2006 	{
2007 		SCSITaskMgmt_t	*pScsiTm;
2008 		pScsiTm = (SCSITaskMgmt_t *)mf;
2009 		dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
2010 			"\tTaskType=0x%x MsgFlags=0x%x "
2011 			"TaskMsgContext=0x%x id=%d channel=%d\n",
2012 			ioc->name, pScsiTm->TaskType, le32_to_cpu
2013 			(pScsiTm->TaskMsgContext), pScsiTm->MsgFlags,
2014 			pScsiTm->TargetID, pScsiTm->Bus));
2015 		break;
2016 	}
2017 
2018 	case MPI_FUNCTION_IOC_INIT:
2019 		{
2020 			IOCInit_t	*pInit = (IOCInit_t *) mf;
2021 			u32		high_addr, sense_high;
2022 
2023 			/* Verify that all entries in the IOC INIT match
2024 			 * existing setup (and in LE format).
2025 			 */
2026 			if (sizeof(dma_addr_t) == sizeof(u64)) {
2027 				high_addr = cpu_to_le32((u32)((u64)ioc->req_frames_dma >> 32));
2028 				sense_high= cpu_to_le32((u32)((u64)ioc->sense_buf_pool_dma >> 32));
2029 			} else {
2030 				high_addr = 0;
2031 				sense_high= 0;
2032 			}
2033 
2034 			if ((pInit->Flags != 0) || (pInit->MaxDevices != ioc->facts.MaxDevices) ||
2035 				(pInit->MaxBuses != ioc->facts.MaxBuses) ||
2036 				(pInit->ReplyFrameSize != cpu_to_le16(ioc->reply_sz)) ||
2037 				(pInit->HostMfaHighAddr != high_addr) ||
2038 				(pInit->SenseBufferHighAddr != sense_high)) {
2039 				printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
2040 					"IOC_INIT issued with 1 or more incorrect parameters. Rejected.\n",
2041 					ioc->name, __FILE__, __LINE__);
2042 				rc = -EFAULT;
2043 				goto done_free_mem;
2044 			}
2045 		}
2046 		break;
2047 	default:
2048 		/*
2049 		 * MPI_FUNCTION_PORT_ENABLE
2050 		 * MPI_FUNCTION_TARGET_CMD_BUFFER_POST
2051 		 * MPI_FUNCTION_TARGET_ASSIST
2052 		 * MPI_FUNCTION_TARGET_STATUS_SEND
2053 		 * MPI_FUNCTION_TARGET_MODE_ABORT
2054 		 * MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET
2055 		 * MPI_FUNCTION_IO_UNIT_RESET
2056 		 * MPI_FUNCTION_HANDSHAKE
2057 		 * MPI_FUNCTION_REPLY_FRAME_REMOVAL
2058 		 * MPI_FUNCTION_EVENT_NOTIFICATION
2059 		 *  (driver handles event notification)
2060 		 * MPI_FUNCTION_EVENT_ACK
2061 		 */
2062 
2063 		/*  What to do with these???  CHECK ME!!!
2064 			MPI_FUNCTION_FC_LINK_SRVC_BUF_POST
2065 			MPI_FUNCTION_FC_LINK_SRVC_RSP
2066 			MPI_FUNCTION_FC_ABORT
2067 			MPI_FUNCTION_LAN_SEND
2068 			MPI_FUNCTION_LAN_RECEIVE
2069 		 	MPI_FUNCTION_LAN_RESET
2070 		*/
2071 
2072 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
2073 			"Illegal request (function 0x%x) \n",
2074 			ioc->name, __FILE__, __LINE__, hdr->Function);
2075 		rc = -EFAULT;
2076 		goto done_free_mem;
2077 	}
2078 
2079 	/* Add the SGL ( at most one data in SGE and one data out SGE )
2080 	 * In the case of two SGE's - the data out (write) will always
2081 	 * preceede the data in (read) SGE. psgList is used to free the
2082 	 * allocated memory.
2083 	 */
2084 	psge = (char *) (((int *) mf) + karg.dataSgeOffset);
2085 	flagsLength = 0;
2086 
2087 	if (karg.dataOutSize > 0)
2088 		sgSize ++;
2089 
2090 	if (karg.dataInSize > 0)
2091 		sgSize ++;
2092 
2093 	if (sgSize > 0) {
2094 
2095 		/* Set up the dataOut memory allocation */
2096 		if (karg.dataOutSize > 0) {
2097 			if (karg.dataInSize > 0) {
2098 				flagsLength = ( MPI_SGE_FLAGS_SIMPLE_ELEMENT |
2099 						MPI_SGE_FLAGS_END_OF_BUFFER |
2100 						MPI_SGE_FLAGS_DIRECTION)
2101 						<< MPI_SGE_FLAGS_SHIFT;
2102 			} else {
2103 				flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE;
2104 			}
2105 			flagsLength |= karg.dataOutSize;
2106 			bufOut.len = karg.dataOutSize;
2107 			bufOut.kptr = dma_alloc_coherent(&ioc->pcidev->dev,
2108 							 bufOut.len,
2109 							 &dma_addr_out, GFP_KERNEL);
2110 
2111 			if (bufOut.kptr == NULL) {
2112 				rc = -ENOMEM;
2113 				goto done_free_mem;
2114 			} else {
2115 				/* Set up this SGE.
2116 				 * Copy to MF and to sglbuf
2117 				 */
2118 				ioc->add_sge(psge, flagsLength, dma_addr_out);
2119 				psge += ioc->SGE_size;
2120 
2121 				/* Copy user data to kernel space.
2122 				 */
2123 				if (copy_from_user(bufOut.kptr,
2124 						karg.dataOutBufPtr,
2125 						bufOut.len)) {
2126 					printk(MYIOC_s_ERR_FMT
2127 						"%s@%d::mptctl_do_mpt_command - Unable "
2128 						"to read user data "
2129 						"struct @ %p\n",
2130 						ioc->name, __FILE__, __LINE__,karg.dataOutBufPtr);
2131 					rc =  -EFAULT;
2132 					goto done_free_mem;
2133 				}
2134 			}
2135 		}
2136 
2137 		if (karg.dataInSize > 0) {
2138 			flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ;
2139 			flagsLength |= karg.dataInSize;
2140 
2141 			bufIn.len = karg.dataInSize;
2142 			bufIn.kptr = dma_alloc_coherent(&ioc->pcidev->dev,
2143 							bufIn.len,
2144 							&dma_addr_in, GFP_KERNEL);
2145 
2146 			if (bufIn.kptr == NULL) {
2147 				rc = -ENOMEM;
2148 				goto done_free_mem;
2149 			} else {
2150 				/* Set up this SGE
2151 				 * Copy to MF and to sglbuf
2152 				 */
2153 				ioc->add_sge(psge, flagsLength, dma_addr_in);
2154 			}
2155 		}
2156 	} else  {
2157 		/* Add a NULL SGE
2158 		 */
2159 		ioc->add_sge(psge, flagsLength, (dma_addr_t) -1);
2160 	}
2161 
2162 	SET_MGMT_MSG_CONTEXT(ioc->ioctl_cmds.msg_context, hdr->MsgContext);
2163 	INITIALIZE_MGMT_STATUS(ioc->ioctl_cmds.status)
2164 	if (hdr->Function == MPI_FUNCTION_SCSI_TASK_MGMT) {
2165 
2166 		mutex_lock(&ioc->taskmgmt_cmds.mutex);
2167 		if (mpt_set_taskmgmt_in_progress_flag(ioc) != 0) {
2168 			mutex_unlock(&ioc->taskmgmt_cmds.mutex);
2169 			goto done_free_mem;
2170 		}
2171 
2172 		DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf);
2173 
2174 		if ((ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q) &&
2175 		    (ioc->facts.MsgVersion >= MPI_VERSION_01_05))
2176 			mpt_put_msg_frame_hi_pri(mptctl_id, ioc, mf);
2177 		else {
2178 			rc =mpt_send_handshake_request(mptctl_id, ioc,
2179 				sizeof(SCSITaskMgmt_t), (u32*)mf, CAN_SLEEP);
2180 			if (rc != 0) {
2181 				dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
2182 				    "send_handshake FAILED! (ioc %p, mf %p)\n",
2183 				    ioc->name, ioc, mf));
2184 				mpt_clear_taskmgmt_in_progress_flag(ioc);
2185 				rc = -ENODATA;
2186 				mutex_unlock(&ioc->taskmgmt_cmds.mutex);
2187 				goto done_free_mem;
2188 			}
2189 		}
2190 
2191 	} else
2192 		mpt_put_msg_frame(mptctl_id, ioc, mf);
2193 
2194 	/* Now wait for the command to complete */
2195 	timeout = (karg.timeout > 0) ? karg.timeout : MPT_IOCTL_DEFAULT_TIMEOUT;
2196 retry_wait:
2197 	timeleft = wait_for_completion_timeout(&ioc->ioctl_cmds.done,
2198 				HZ*timeout);
2199 	if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
2200 		rc = -ETIME;
2201 		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "%s: TIMED OUT!\n",
2202 		    ioc->name, __func__));
2203 		if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
2204 			if (function == MPI_FUNCTION_SCSI_TASK_MGMT)
2205 				mutex_unlock(&ioc->taskmgmt_cmds.mutex);
2206 			goto done_free_mem;
2207 		}
2208 		if (!timeleft) {
2209 			printk(MYIOC_s_WARN_FMT
2210 			       "mpt cmd timeout, doorbell=0x%08x"
2211 			       " function=0x%x\n",
2212 			       ioc->name, mpt_GetIocState(ioc, 0), function);
2213 			if (function == MPI_FUNCTION_SCSI_TASK_MGMT)
2214 				mutex_unlock(&ioc->taskmgmt_cmds.mutex);
2215 			mptctl_timeout_expired(ioc, mf);
2216 			mf = NULL;
2217 		} else
2218 			goto retry_wait;
2219 		goto done_free_mem;
2220 	}
2221 
2222 	if (function == MPI_FUNCTION_SCSI_TASK_MGMT)
2223 		mutex_unlock(&ioc->taskmgmt_cmds.mutex);
2224 
2225 
2226 	mf = NULL;
2227 
2228 	/* If a valid reply frame, copy to the user.
2229 	 * Offset 2: reply length in U32's
2230 	 */
2231 	if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID) {
2232 		if (karg.maxReplyBytes < ioc->reply_sz) {
2233 			sz = min(karg.maxReplyBytes,
2234 				4*ioc->ioctl_cmds.reply[2]);
2235 		} else {
2236 			 sz = min(ioc->reply_sz, 4*ioc->ioctl_cmds.reply[2]);
2237 		}
2238 		if (sz > 0) {
2239 			if (copy_to_user(karg.replyFrameBufPtr,
2240 				 ioc->ioctl_cmds.reply, sz)){
2241 				 printk(MYIOC_s_ERR_FMT
2242 				     "%s@%d::mptctl_do_mpt_command - "
2243 				 "Unable to write out reply frame %p\n",
2244 				 ioc->name, __FILE__, __LINE__, karg.replyFrameBufPtr);
2245 				 rc =  -ENODATA;
2246 				 goto done_free_mem;
2247 			}
2248 		}
2249 	}
2250 
2251 	/* If valid sense data, copy to user.
2252 	 */
2253 	if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_SENSE_VALID) {
2254 		sz = min(karg.maxSenseBytes, MPT_SENSE_BUFFER_SIZE);
2255 		if (sz > 0) {
2256 			if (copy_to_user(karg.senseDataPtr,
2257 				ioc->ioctl_cmds.sense, sz)) {
2258 				printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
2259 				"Unable to write sense data to user %p\n",
2260 				ioc->name, __FILE__, __LINE__,
2261 				karg.senseDataPtr);
2262 				rc =  -ENODATA;
2263 				goto done_free_mem;
2264 			}
2265 		}
2266 	}
2267 
2268 	/* If the overall status is _GOOD and data in, copy data
2269 	 * to user.
2270 	 */
2271 	if ((ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD) &&
2272 				(karg.dataInSize > 0) && (bufIn.kptr)) {
2273 
2274 		if (copy_to_user(karg.dataInBufPtr,
2275 				 bufIn.kptr, karg.dataInSize)) {
2276 			printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "
2277 				"Unable to write data to user %p\n",
2278 				ioc->name, __FILE__, __LINE__,
2279 				karg.dataInBufPtr);
2280 			rc =  -ENODATA;
2281 		}
2282 	}
2283 
2284 done_free_mem:
2285 
2286 	CLEAR_MGMT_STATUS(ioc->ioctl_cmds.status)
2287 	SET_MGMT_MSG_CONTEXT(ioc->ioctl_cmds.msg_context, 0);
2288 
2289 	/* Free the allocated memory.
2290 	 */
2291 	if (bufOut.kptr != NULL) {
2292 		dma_free_coherent(&ioc->pcidev->dev, bufOut.len,
2293 				  (void *)bufOut.kptr, dma_addr_out);
2294 	}
2295 
2296 	if (bufIn.kptr != NULL) {
2297 		dma_free_coherent(&ioc->pcidev->dev, bufIn.len,
2298 				  (void *)bufIn.kptr, dma_addr_in);
2299 	}
2300 
2301 	/* mf is null if command issued successfully
2302 	 * otherwise, failure occurred after mf acquired.
2303 	 */
2304 	if (mf)
2305 		mpt_free_msg_frame(ioc, mf);
2306 
2307 	return rc;
2308 }
2309 
2310 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2311 /* Prototype Routine for the HOST INFO command.
2312  *
2313  * Outputs:	None.
2314  * Return:	0 if successful
2315  *		-EFAULT if data unavailable
2316  *		-EBUSY  if previous command timeout and IOC reset is not complete.
2317  *		-ENODEV if no such device/adapter
2318  *		-ETIME	if timer expires
2319  *		-ENOMEM if memory allocation error
2320  */
2321 static int
2322 mptctl_hp_hostinfo(MPT_ADAPTER *ioc, unsigned long arg, unsigned int data_size)
2323 {
2324 	hp_host_info_t	__user *uarg = (void __user *) arg;
2325 	struct pci_dev		*pdev;
2326 	char                    *pbuf=NULL;
2327 	dma_addr_t		buf_dma;
2328 	hp_host_info_t		karg;
2329 	CONFIGPARMS		cfg;
2330 	ConfigPageHeader_t	hdr;
2331 	int			rc, cim_rev;
2332 	ToolboxIstwiReadWriteRequest_t	*IstwiRWRequest;
2333 	MPT_FRAME_HDR		*mf = NULL;
2334 	unsigned long		timeleft;
2335 	u32			msgcontext;
2336 
2337 	/* Reset long to int. Should affect IA64 and SPARC only
2338 	 */
2339 	if (data_size == sizeof(hp_host_info_t))
2340 		cim_rev = 1;
2341 	else if (data_size == sizeof(hp_host_info_rev0_t))
2342 		cim_rev = 0;	/* obsolete */
2343 	else
2344 		return -EFAULT;
2345 
2346 	if (copy_from_user(&karg, uarg, sizeof(hp_host_info_t))) {
2347 		printk(KERN_ERR MYNAM "%s@%d::mptctl_hp_host_info - "
2348 			"Unable to read in hp_host_info struct @ %p\n",
2349 				__FILE__, __LINE__, uarg);
2350 		return -EFAULT;
2351 	}
2352 
2353 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": mptctl_hp_hostinfo called.\n",
2354 	    ioc->name));
2355 
2356 	/* Fill in the data and return the structure to the calling
2357 	 * program
2358 	 */
2359 	pdev = (struct pci_dev *) ioc->pcidev;
2360 
2361 	karg.vendor = pdev->vendor;
2362 	karg.device = pdev->device;
2363 	karg.subsystem_id = pdev->subsystem_device;
2364 	karg.subsystem_vendor = pdev->subsystem_vendor;
2365 	karg.devfn = pdev->devfn;
2366 	karg.bus = pdev->bus->number;
2367 
2368 	/* Save the SCSI host no. if
2369 	 * SCSI driver loaded
2370 	 */
2371 	if (ioc->sh != NULL)
2372 		karg.host_no = ioc->sh->host_no;
2373 	else
2374 		karg.host_no =  -1;
2375 
2376 	/* Reformat the fw_version into a string */
2377 	snprintf(karg.fw_version, sizeof(karg.fw_version),
2378 		 "%.2hhu.%.2hhu.%.2hhu.%.2hhu",
2379 		 ioc->facts.FWVersion.Struct.Major,
2380 		 ioc->facts.FWVersion.Struct.Minor,
2381 		 ioc->facts.FWVersion.Struct.Unit,
2382 		 ioc->facts.FWVersion.Struct.Dev);
2383 
2384 	/* Issue a config request to get the device serial number
2385 	 */
2386 	hdr.PageVersion = 0;
2387 	hdr.PageLength = 0;
2388 	hdr.PageNumber = 0;
2389 	hdr.PageType = MPI_CONFIG_PAGETYPE_MANUFACTURING;
2390 	cfg.cfghdr.hdr = &hdr;
2391 	cfg.physAddr = -1;
2392 	cfg.pageAddr = 0;
2393 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2394 	cfg.dir = 0;	/* read */
2395 	cfg.timeout = 10;
2396 
2397 	strncpy(karg.serial_number, " ", 24);
2398 	if (mpt_config(ioc, &cfg) == 0) {
2399 		if (cfg.cfghdr.hdr->PageLength > 0) {
2400 			/* Issue the second config page request */
2401 			cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2402 
2403 			pbuf = dma_alloc_coherent(&ioc->pcidev->dev,
2404 						  hdr.PageLength * 4,
2405 						  &buf_dma, GFP_KERNEL);
2406 			if (pbuf) {
2407 				cfg.physAddr = buf_dma;
2408 				if (mpt_config(ioc, &cfg) == 0) {
2409 					ManufacturingPage0_t *pdata = (ManufacturingPage0_t *) pbuf;
2410 					if (strlen(pdata->BoardTracerNumber) > 1) {
2411 						strscpy(karg.serial_number,
2412 							pdata->BoardTracerNumber, 24);
2413 					}
2414 				}
2415 				dma_free_coherent(&ioc->pcidev->dev,
2416 						  hdr.PageLength * 4, pbuf,
2417 						  buf_dma);
2418 				pbuf = NULL;
2419 			}
2420 		}
2421 	}
2422 	rc = mpt_GetIocState(ioc, 1);
2423 	switch (rc) {
2424 	case MPI_IOC_STATE_OPERATIONAL:
2425 		karg.ioc_status =  HP_STATUS_OK;
2426 		break;
2427 
2428 	case MPI_IOC_STATE_FAULT:
2429 		karg.ioc_status =  HP_STATUS_FAILED;
2430 		break;
2431 
2432 	case MPI_IOC_STATE_RESET:
2433 	case MPI_IOC_STATE_READY:
2434 	default:
2435 		karg.ioc_status =  HP_STATUS_OTHER;
2436 		break;
2437 	}
2438 
2439 	karg.base_io_addr = pci_resource_start(pdev, 0);
2440 
2441 	if ((ioc->bus_type == SAS) || (ioc->bus_type == FC))
2442 		karg.bus_phys_width = HP_BUS_WIDTH_UNK;
2443 	else
2444 		karg.bus_phys_width = HP_BUS_WIDTH_16;
2445 
2446 	karg.hard_resets = 0;
2447 	karg.soft_resets = 0;
2448 	karg.timeouts = 0;
2449 	if (ioc->sh != NULL) {
2450 		MPT_SCSI_HOST *hd =  shost_priv(ioc->sh);
2451 
2452 		if (hd && (cim_rev == 1)) {
2453 			karg.hard_resets = ioc->hard_resets;
2454 			karg.soft_resets = ioc->soft_resets;
2455 			karg.timeouts = ioc->timeouts;
2456 		}
2457 	}
2458 
2459 	/*
2460 	 * Gather ISTWI(Industry Standard Two Wire Interface) Data
2461 	 */
2462 	if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL) {
2463 		dfailprintk(ioc, printk(MYIOC_s_WARN_FMT
2464 			"%s, no msg frames!!\n", ioc->name, __func__));
2465 		goto out;
2466 	}
2467 
2468 	IstwiRWRequest = (ToolboxIstwiReadWriteRequest_t *)mf;
2469 	msgcontext = IstwiRWRequest->MsgContext;
2470 	memset(IstwiRWRequest,0,sizeof(ToolboxIstwiReadWriteRequest_t));
2471 	IstwiRWRequest->MsgContext = msgcontext;
2472 	IstwiRWRequest->Function = MPI_FUNCTION_TOOLBOX;
2473 	IstwiRWRequest->Tool = MPI_TOOLBOX_ISTWI_READ_WRITE_TOOL;
2474 	IstwiRWRequest->Flags = MPI_TB_ISTWI_FLAGS_READ;
2475 	IstwiRWRequest->NumAddressBytes = 0x01;
2476 	IstwiRWRequest->DataLength = cpu_to_le16(0x04);
2477 	if (pdev->devfn & 1)
2478 		IstwiRWRequest->DeviceAddr = 0xB2;
2479 	else
2480 		IstwiRWRequest->DeviceAddr = 0xB0;
2481 
2482 	pbuf = dma_alloc_coherent(&ioc->pcidev->dev, 4, &buf_dma, GFP_KERNEL);
2483 	if (!pbuf)
2484 		goto out;
2485 	ioc->add_sge((char *)&IstwiRWRequest->SGL,
2486 	    (MPT_SGE_FLAGS_SSIMPLE_READ|4), buf_dma);
2487 
2488 	SET_MGMT_MSG_CONTEXT(ioc->ioctl_cmds.msg_context,
2489 				IstwiRWRequest->MsgContext);
2490 	INITIALIZE_MGMT_STATUS(ioc->ioctl_cmds.status)
2491 	mpt_put_msg_frame(mptctl_id, ioc, mf);
2492 
2493 retry_wait:
2494 	timeleft = wait_for_completion_timeout(&ioc->ioctl_cmds.done,
2495 			HZ*MPT_IOCTL_DEFAULT_TIMEOUT);
2496 	if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
2497 		printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name, __func__);
2498 		if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
2499 			mpt_free_msg_frame(ioc, mf);
2500 			goto out;
2501 		}
2502 		if (!timeleft) {
2503 			printk(MYIOC_s_WARN_FMT
2504 			       "HOST INFO command timeout, doorbell=0x%08x\n",
2505 			       ioc->name, mpt_GetIocState(ioc, 0));
2506 			mptctl_timeout_expired(ioc, mf);
2507 		} else
2508 			goto retry_wait;
2509 		goto out;
2510 	}
2511 
2512 	/*
2513 	 *ISTWI Data Definition
2514 	 * pbuf[0] = FW_VERSION = 0x4
2515 	 * pbuf[1] = Bay Count = 6 or 4 or 2, depending on
2516 	 *  the config, you should be seeing one out of these three values
2517 	 * pbuf[2] = Drive Installed Map = bit pattern depend on which
2518 	 *   bays have drives in them
2519 	 * pbuf[3] = Checksum (0x100 = (byte0 + byte2 + byte3)
2520 	 */
2521 	if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID)
2522 		karg.rsvd = *(u32 *)pbuf;
2523 
2524  out:
2525 	CLEAR_MGMT_STATUS(ioc->ioctl_cmds.status)
2526 	SET_MGMT_MSG_CONTEXT(ioc->ioctl_cmds.msg_context, 0);
2527 
2528 	if (pbuf)
2529 		dma_free_coherent(&ioc->pcidev->dev, 4, pbuf, buf_dma);
2530 
2531 	/* Copy the data from kernel memory to user memory
2532 	 */
2533 	if (copy_to_user((char __user *)arg, &karg, sizeof(hp_host_info_t))) {
2534 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_hpgethostinfo - "
2535 			"Unable to write out hp_host_info @ %p\n",
2536 			ioc->name, __FILE__, __LINE__, uarg);
2537 		return -EFAULT;
2538 	}
2539 
2540 	return 0;
2541 
2542 }
2543 
2544 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2545 /* Prototype Routine for the TARGET INFO command.
2546  *
2547  * Outputs:	None.
2548  * Return:	0 if successful
2549  *		-EFAULT if data unavailable
2550  *		-EBUSY  if previous command timeout and IOC reset is not complete.
2551  *		-ENODEV if no such device/adapter
2552  *		-ETIME	if timer expires
2553  *		-ENOMEM if memory allocation error
2554  */
2555 static int
2556 mptctl_hp_targetinfo(MPT_ADAPTER *ioc, unsigned long arg)
2557 {
2558 	hp_target_info_t __user *uarg = (void __user *) arg;
2559 	SCSIDevicePage0_t	*pg0_alloc;
2560 	SCSIDevicePage3_t	*pg3_alloc;
2561 	MPT_SCSI_HOST 		*hd = NULL;
2562 	hp_target_info_t	karg;
2563 	int			data_sz;
2564 	dma_addr_t		page_dma;
2565 	CONFIGPARMS	 	cfg;
2566 	ConfigPageHeader_t	hdr;
2567 	int			tmp, np, rc = 0;
2568 
2569 	if (copy_from_user(&karg, uarg, sizeof(hp_target_info_t))) {
2570 		printk(KERN_ERR MYNAM "%s@%d::mptctl_hp_targetinfo - "
2571 			"Unable to read in hp_host_targetinfo struct @ %p\n",
2572 				__FILE__, __LINE__, uarg);
2573 		return -EFAULT;
2574 	}
2575 
2576 	if (karg.hdr.id >= MPT_MAX_FC_DEVICES)
2577 		return -EINVAL;
2578 	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_hp_targetinfo called.\n",
2579 	    ioc->name));
2580 
2581 	/*  There is nothing to do for FCP parts.
2582 	 */
2583 	if ((ioc->bus_type == SAS) || (ioc->bus_type == FC))
2584 		return 0;
2585 
2586 	if ((ioc->spi_data.sdp0length == 0) || (ioc->sh == NULL))
2587 		return 0;
2588 
2589 	if (ioc->sh->host_no != karg.hdr.host)
2590 		return -ENODEV;
2591 
2592        /* Get the data transfer speeds
2593         */
2594 	data_sz = ioc->spi_data.sdp0length * 4;
2595 	pg0_alloc = dma_alloc_coherent(&ioc->pcidev->dev, data_sz, &page_dma,
2596 				       GFP_KERNEL);
2597 	if (pg0_alloc) {
2598 		hdr.PageVersion = ioc->spi_data.sdp0version;
2599 		hdr.PageLength = data_sz;
2600 		hdr.PageNumber = 0;
2601 		hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
2602 
2603 		cfg.cfghdr.hdr = &hdr;
2604 		cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2605 		cfg.dir = 0;
2606 		cfg.timeout = 0;
2607 		cfg.physAddr = page_dma;
2608 
2609 		cfg.pageAddr = (karg.hdr.channel << 8) | karg.hdr.id;
2610 
2611 		if ((rc = mpt_config(ioc, &cfg)) == 0) {
2612 			np = le32_to_cpu(pg0_alloc->NegotiatedParameters);
2613 			karg.negotiated_width = np & MPI_SCSIDEVPAGE0_NP_WIDE ?
2614 					HP_BUS_WIDTH_16 : HP_BUS_WIDTH_8;
2615 
2616 			if (np & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK) {
2617 				tmp = (np & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK) >> 8;
2618 				if (tmp < 0x09)
2619 					karg.negotiated_speed = HP_DEV_SPEED_ULTRA320;
2620 				else if (tmp <= 0x09)
2621 					karg.negotiated_speed = HP_DEV_SPEED_ULTRA160;
2622 				else if (tmp <= 0x0A)
2623 					karg.negotiated_speed = HP_DEV_SPEED_ULTRA2;
2624 				else if (tmp <= 0x0C)
2625 					karg.negotiated_speed = HP_DEV_SPEED_ULTRA;
2626 				else if (tmp <= 0x25)
2627 					karg.negotiated_speed = HP_DEV_SPEED_FAST;
2628 				else
2629 					karg.negotiated_speed = HP_DEV_SPEED_ASYNC;
2630 			} else
2631 				karg.negotiated_speed = HP_DEV_SPEED_ASYNC;
2632 		}
2633 
2634 		dma_free_coherent(&ioc->pcidev->dev, data_sz, (u8 *)pg0_alloc,
2635 				  page_dma);
2636 	}
2637 
2638 	/* Set defaults
2639 	 */
2640 	karg.message_rejects = -1;
2641 	karg.phase_errors = -1;
2642 	karg.parity_errors = -1;
2643 	karg.select_timeouts = -1;
2644 
2645 	/* Get the target error parameters
2646 	 */
2647 	hdr.PageVersion = 0;
2648 	hdr.PageLength = 0;
2649 	hdr.PageNumber = 3;
2650 	hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
2651 
2652 	cfg.cfghdr.hdr = &hdr;
2653 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2654 	cfg.dir = 0;
2655 	cfg.timeout = 0;
2656 	cfg.physAddr = -1;
2657 	if ((mpt_config(ioc, &cfg) == 0) && (cfg.cfghdr.hdr->PageLength > 0)) {
2658 		/* Issue the second config page request */
2659 		cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2660 		data_sz = (int) cfg.cfghdr.hdr->PageLength * 4;
2661 		pg3_alloc = dma_alloc_coherent(&ioc->pcidev->dev, data_sz,
2662 					       &page_dma, GFP_KERNEL);
2663 		if (pg3_alloc) {
2664 			cfg.physAddr = page_dma;
2665 			cfg.pageAddr = (karg.hdr.channel << 8) | karg.hdr.id;
2666 			if ((rc = mpt_config(ioc, &cfg)) == 0) {
2667 				karg.message_rejects = (u32) le16_to_cpu(pg3_alloc->MsgRejectCount);
2668 				karg.phase_errors = (u32) le16_to_cpu(pg3_alloc->PhaseErrorCount);
2669 				karg.parity_errors = (u32) le16_to_cpu(pg3_alloc->ParityErrorCount);
2670 			}
2671 			dma_free_coherent(&ioc->pcidev->dev, data_sz,
2672 					  (u8 *)pg3_alloc, page_dma);
2673 		}
2674 	}
2675 	hd = shost_priv(ioc->sh);
2676 	if (hd != NULL)
2677 		karg.select_timeouts = hd->sel_timeout[karg.hdr.id];
2678 
2679 	/* Copy the data from kernel memory to user memory
2680 	 */
2681 	if (copy_to_user((char __user *)arg, &karg, sizeof(hp_target_info_t))) {
2682 		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_hp_target_info - "
2683 			"Unable to write out mpt_ioctl_targetinfo struct @ %p\n",
2684 			ioc->name, __FILE__, __LINE__, uarg);
2685 		return -EFAULT;
2686 	}
2687 
2688 	return 0;
2689 }
2690 
2691 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2692 
2693 static const struct file_operations mptctl_fops = {
2694 	.owner =	THIS_MODULE,
2695 	.llseek =	no_llseek,
2696 	.fasync = 	mptctl_fasync,
2697 	.unlocked_ioctl = mptctl_ioctl,
2698 #ifdef CONFIG_COMPAT
2699 	.compat_ioctl = compat_mpctl_ioctl,
2700 #endif
2701 };
2702 
2703 static struct miscdevice mptctl_miscdev = {
2704 	MPT_MINOR,
2705 	MYNAM,
2706 	&mptctl_fops
2707 };
2708 
2709 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2710 
2711 #ifdef CONFIG_COMPAT
2712 
2713 static int
2714 compat_mptfwxfer_ioctl(struct file *filp, unsigned int cmd,
2715 			unsigned long arg)
2716 {
2717 	struct mpt_fw_xfer32 kfw32;
2718 	struct mpt_fw_xfer kfw;
2719 	MPT_ADAPTER *iocp = NULL;
2720 	int iocnum, iocnumX;
2721 	int nonblock = (filp->f_flags & O_NONBLOCK);
2722 	int ret;
2723 
2724 
2725 	if (copy_from_user(&kfw32, (char __user *)arg, sizeof(kfw32)))
2726 		return -EFAULT;
2727 
2728 	/* Verify intended MPT adapter */
2729 	iocnumX = kfw32.iocnum & 0xFF;
2730 	if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
2731 	    (iocp == NULL)) {
2732 		printk(KERN_DEBUG MYNAM "::compat_mptfwxfer_ioctl @%d - ioc%d not found!\n",
2733 			__LINE__, iocnumX);
2734 		return -ENODEV;
2735 	}
2736 
2737 	if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0)
2738 		return ret;
2739 
2740 	dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "compat_mptfwxfer_ioctl() called\n",
2741 	    iocp->name));
2742 	kfw.iocnum = iocnum;
2743 	kfw.fwlen = kfw32.fwlen;
2744 	kfw.bufp = compat_ptr(kfw32.bufp);
2745 
2746 	ret = mptctl_do_fw_download(iocp, kfw.bufp, kfw.fwlen);
2747 
2748 	mutex_unlock(&iocp->ioctl_cmds.mutex);
2749 
2750 	return ret;
2751 }
2752 
2753 static int
2754 compat_mpt_command(struct file *filp, unsigned int cmd,
2755 			unsigned long arg)
2756 {
2757 	struct mpt_ioctl_command32 karg32;
2758 	struct mpt_ioctl_command32 __user *uarg = (struct mpt_ioctl_command32 __user *) arg;
2759 	struct mpt_ioctl_command karg;
2760 	MPT_ADAPTER *iocp = NULL;
2761 	int iocnum, iocnumX;
2762 	int nonblock = (filp->f_flags & O_NONBLOCK);
2763 	int ret;
2764 
2765 	if (copy_from_user(&karg32, (char __user *)arg, sizeof(karg32)))
2766 		return -EFAULT;
2767 
2768 	/* Verify intended MPT adapter */
2769 	iocnumX = karg32.hdr.iocnum & 0xFF;
2770 	if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
2771 	    (iocp == NULL)) {
2772 		printk(KERN_DEBUG MYNAM "::compat_mpt_command @%d - ioc%d not found!\n",
2773 			__LINE__, iocnumX);
2774 		return -ENODEV;
2775 	}
2776 
2777 	if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0)
2778 		return ret;
2779 
2780 	dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "compat_mpt_command() called\n",
2781 	    iocp->name));
2782 	/* Copy data to karg */
2783 	karg.hdr.iocnum = karg32.hdr.iocnum;
2784 	karg.hdr.port = karg32.hdr.port;
2785 	karg.timeout = karg32.timeout;
2786 	karg.maxReplyBytes = karg32.maxReplyBytes;
2787 
2788 	karg.dataInSize = karg32.dataInSize;
2789 	karg.dataOutSize = karg32.dataOutSize;
2790 	karg.maxSenseBytes = karg32.maxSenseBytes;
2791 	karg.dataSgeOffset = karg32.dataSgeOffset;
2792 
2793 	karg.replyFrameBufPtr = (char __user *)(unsigned long)karg32.replyFrameBufPtr;
2794 	karg.dataInBufPtr = (char __user *)(unsigned long)karg32.dataInBufPtr;
2795 	karg.dataOutBufPtr = (char __user *)(unsigned long)karg32.dataOutBufPtr;
2796 	karg.senseDataPtr = (char __user *)(unsigned long)karg32.senseDataPtr;
2797 
2798 	/* Pass new structure to do_mpt_command
2799 	 */
2800 	ret = mptctl_do_mpt_command (iocp, karg, &uarg->MF);
2801 
2802 	mutex_unlock(&iocp->ioctl_cmds.mutex);
2803 
2804 	return ret;
2805 }
2806 
2807 static long compat_mpctl_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
2808 {
2809 	long ret;
2810 	mutex_lock(&mpctl_mutex);
2811 	switch (cmd) {
2812 	case MPTIOCINFO:
2813 	case MPTIOCINFO1:
2814 	case MPTIOCINFO2:
2815 	case MPTTARGETINFO:
2816 	case MPTEVENTQUERY:
2817 	case MPTEVENTENABLE:
2818 	case MPTEVENTREPORT:
2819 	case MPTHARDRESET:
2820 	case HP_GETHOSTINFO:
2821 	case HP_GETTARGETINFO:
2822 	case MPTTEST:
2823 		ret = __mptctl_ioctl(f, cmd, arg);
2824 		break;
2825 	case MPTCOMMAND32:
2826 		ret = compat_mpt_command(f, cmd, arg);
2827 		break;
2828 	case MPTFWDOWNLOAD32:
2829 		ret = compat_mptfwxfer_ioctl(f, cmd, arg);
2830 		break;
2831 	default:
2832 		ret = -ENOIOCTLCMD;
2833 		break;
2834 	}
2835 	mutex_unlock(&mpctl_mutex);
2836 	return ret;
2837 }
2838 
2839 #endif
2840 
2841 
2842 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2843 /*
2844  *	mptctl_probe - Installs ioctl devices per bus.
2845  *	@pdev: Pointer to pci_dev structure
2846  *
2847  *	Returns 0 for success, non-zero for failure.
2848  *
2849  */
2850 
2851 static int
2852 mptctl_probe(struct pci_dev *pdev)
2853 {
2854 	MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
2855 
2856 	mutex_init(&ioc->ioctl_cmds.mutex);
2857 	init_completion(&ioc->ioctl_cmds.done);
2858 	return 0;
2859 }
2860 
2861 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2862 /*
2863  *	mptctl_remove - Removed ioctl devices
2864  *	@pdev: Pointer to pci_dev structure
2865  *
2866  *
2867  */
2868 static void
2869 mptctl_remove(struct pci_dev *pdev)
2870 {
2871 }
2872 
2873 static struct mpt_pci_driver mptctl_driver = {
2874   .probe		= mptctl_probe,
2875   .remove		= mptctl_remove,
2876 };
2877 
2878 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2879 static int __init mptctl_init(void)
2880 {
2881 	int err;
2882 
2883 	show_mptmod_ver(my_NAME, my_VERSION);
2884 
2885 	mpt_device_driver_register(&mptctl_driver, MPTCTL_DRIVER);
2886 
2887 	/* Register this device */
2888 	err = misc_register(&mptctl_miscdev);
2889 	if (err < 0) {
2890 		printk(KERN_ERR MYNAM ": Can't register misc device [minor=%d].\n", MPT_MINOR);
2891 		goto out_fail;
2892 	}
2893 	printk(KERN_INFO MYNAM ": Registered with Fusion MPT base driver\n");
2894 	printk(KERN_INFO MYNAM ": /dev/%s @ (major,minor=%d,%d)\n",
2895 			 mptctl_miscdev.name, MISC_MAJOR, mptctl_miscdev.minor);
2896 
2897 	/*
2898 	 *  Install our handler
2899 	 */
2900 	mptctl_id = mpt_register(mptctl_reply, MPTCTL_DRIVER,
2901 	    "mptctl_reply");
2902 	if (!mptctl_id || mptctl_id >= MPT_MAX_PROTOCOL_DRIVERS) {
2903 		printk(KERN_ERR MYNAM ": ERROR: Failed to register with Fusion MPT base driver\n");
2904 		misc_deregister(&mptctl_miscdev);
2905 		err = -EBUSY;
2906 		goto out_fail;
2907 	}
2908 
2909 	mptctl_taskmgmt_id = mpt_register(mptctl_taskmgmt_reply, MPTCTL_DRIVER,
2910 	    "mptctl_taskmgmt_reply");
2911 	if (!mptctl_taskmgmt_id || mptctl_taskmgmt_id >= MPT_MAX_PROTOCOL_DRIVERS) {
2912 		printk(KERN_ERR MYNAM ": ERROR: Failed to register with Fusion MPT base driver\n");
2913 		mpt_deregister(mptctl_id);
2914 		misc_deregister(&mptctl_miscdev);
2915 		err = -EBUSY;
2916 		goto out_fail;
2917 	}
2918 
2919 	mpt_reset_register(mptctl_id, mptctl_ioc_reset);
2920 	mpt_event_register(mptctl_id, mptctl_event_process);
2921 
2922 	return 0;
2923 
2924 out_fail:
2925 
2926 	mpt_device_driver_deregister(MPTCTL_DRIVER);
2927 
2928 	return err;
2929 }
2930 
2931 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2932 static void mptctl_exit(void)
2933 {
2934 	misc_deregister(&mptctl_miscdev);
2935 	printk(KERN_INFO MYNAM ": Deregistered /dev/%s @ (major,minor=%d,%d)\n",
2936 			 mptctl_miscdev.name, MISC_MAJOR, mptctl_miscdev.minor);
2937 
2938 	/* De-register event handler from base module */
2939 	mpt_event_deregister(mptctl_id);
2940 
2941 	/* De-register reset handler from base module */
2942 	mpt_reset_deregister(mptctl_id);
2943 
2944 	/* De-register callback handler from base module */
2945 	mpt_deregister(mptctl_taskmgmt_id);
2946 	mpt_deregister(mptctl_id);
2947 
2948         mpt_device_driver_deregister(MPTCTL_DRIVER);
2949 
2950 }
2951 
2952 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
2953 
2954 module_init(mptctl_init);
2955 module_exit(mptctl_exit);
2956