xref: /freebsd/sys/dev/mrsas/mrsas.c (revision 076ad2f8)
1 /*
2  * Copyright (c) 2015, AVAGO Tech. All rights reserved. Author: Marian Choy
3  * Copyright (c) 2014, LSI Corp. All rights reserved. Author: Marian Choy
4  * Support: freebsdraid@avagotech.com
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice,
11  * this list of conditions and the following disclaimer. 2. Redistributions
12  * in binary form must reproduce the above copyright notice, this list of
13  * conditions and the following disclaimer in the documentation and/or other
14  * materials provided with the distribution. 3. Neither the name of the
15  * <ORGANIZATION> nor the names of its contributors may be used to endorse or
16  * promote products derived from this software without specific prior written
17  * permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  *
31  * The views and conclusions contained in the software and documentation are
32  * those of the authors and should not be interpreted as representing
33  * official policies,either expressed or implied, of the FreeBSD Project.
34  *
35  * Send feedback to: <megaraidfbsd@avagotech.com> Mail to: AVAGO TECHNOLOGIES 1621
36  * Barber Lane, Milpitas, CA 95035 ATTN: MegaRaid FreeBSD
37  *
38  */
39 
40 #include <sys/cdefs.h>
41 __FBSDID("$FreeBSD$");
42 
43 #include <dev/mrsas/mrsas.h>
44 #include <dev/mrsas/mrsas_ioctl.h>
45 
46 #include <cam/cam.h>
47 #include <cam/cam_ccb.h>
48 
49 #include <sys/sysctl.h>
50 #include <sys/types.h>
51 #include <sys/sysent.h>
52 #include <sys/kthread.h>
53 #include <sys/taskqueue.h>
54 #include <sys/smp.h>
55 
56 
57 /*
58  * Function prototypes
59  */
60 static d_open_t mrsas_open;
61 static d_close_t mrsas_close;
62 static d_read_t mrsas_read;
63 static d_write_t mrsas_write;
64 static d_ioctl_t mrsas_ioctl;
65 static d_poll_t mrsas_poll;
66 
67 static void mrsas_ich_startup(void *arg);
68 static struct mrsas_mgmt_info mrsas_mgmt_info;
69 static struct mrsas_ident *mrsas_find_ident(device_t);
70 static int mrsas_setup_msix(struct mrsas_softc *sc);
71 static int mrsas_allocate_msix(struct mrsas_softc *sc);
72 static void mrsas_shutdown_ctlr(struct mrsas_softc *sc, u_int32_t opcode);
73 static void mrsas_flush_cache(struct mrsas_softc *sc);
74 static void mrsas_reset_reply_desc(struct mrsas_softc *sc);
75 static void mrsas_ocr_thread(void *arg);
76 static int mrsas_get_map_info(struct mrsas_softc *sc);
77 static int mrsas_get_ld_map_info(struct mrsas_softc *sc);
78 static int mrsas_sync_map_info(struct mrsas_softc *sc);
79 static int mrsas_get_pd_list(struct mrsas_softc *sc);
80 static int mrsas_get_ld_list(struct mrsas_softc *sc);
81 static int mrsas_setup_irq(struct mrsas_softc *sc);
82 static int mrsas_alloc_mem(struct mrsas_softc *sc);
83 static int mrsas_init_fw(struct mrsas_softc *sc);
84 static int mrsas_setup_raidmap(struct mrsas_softc *sc);
85 static void megasas_setup_jbod_map(struct mrsas_softc *sc);
86 static int megasas_sync_pd_seq_num(struct mrsas_softc *sc, boolean_t pend);
87 static int mrsas_clear_intr(struct mrsas_softc *sc);
88 static int mrsas_get_ctrl_info(struct mrsas_softc *sc);
89 static void mrsas_update_ext_vd_details(struct mrsas_softc *sc);
90 static int
91 mrsas_issue_blocked_abort_cmd(struct mrsas_softc *sc,
92     struct mrsas_mfi_cmd *cmd_to_abort);
93 static struct mrsas_softc *
94 mrsas_get_softc_instance(struct cdev *dev,
95     u_long cmd, caddr_t arg);
96 u_int32_t mrsas_read_reg(struct mrsas_softc *sc, int offset);
97 u_int8_t
98 mrsas_build_mptmfi_passthru(struct mrsas_softc *sc,
99     struct mrsas_mfi_cmd *mfi_cmd);
100 void	mrsas_complete_outstanding_ioctls(struct mrsas_softc *sc);
101 int	mrsas_transition_to_ready(struct mrsas_softc *sc, int ocr);
102 int	mrsas_init_adapter(struct mrsas_softc *sc);
103 int	mrsas_alloc_mpt_cmds(struct mrsas_softc *sc);
104 int	mrsas_alloc_ioc_cmd(struct mrsas_softc *sc);
105 int	mrsas_alloc_ctlr_info_cmd(struct mrsas_softc *sc);
106 int	mrsas_ioc_init(struct mrsas_softc *sc);
107 int	mrsas_bus_scan(struct mrsas_softc *sc);
108 int	mrsas_issue_dcmd(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd);
109 int	mrsas_issue_polled(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd);
110 int	mrsas_reset_ctrl(struct mrsas_softc *sc, u_int8_t reset_reason);
111 int	mrsas_wait_for_outstanding(struct mrsas_softc *sc, u_int8_t check_reason);
112 int mrsas_complete_cmd(struct mrsas_softc *sc, u_int32_t MSIxIndex);
113 int mrsas_reset_targets(struct mrsas_softc *sc);
114 int
115 mrsas_issue_blocked_cmd(struct mrsas_softc *sc,
116     struct mrsas_mfi_cmd *cmd);
117 int
118 mrsas_alloc_tmp_dcmd(struct mrsas_softc *sc, struct mrsas_tmp_dcmd *tcmd,
119     int size);
120 void	mrsas_release_mfi_cmd(struct mrsas_mfi_cmd *cmd);
121 void	mrsas_wakeup(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd);
122 void	mrsas_complete_aen(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd);
123 void	mrsas_complete_abort(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd);
124 void	mrsas_disable_intr(struct mrsas_softc *sc);
125 void	mrsas_enable_intr(struct mrsas_softc *sc);
126 void	mrsas_free_ioc_cmd(struct mrsas_softc *sc);
127 void	mrsas_free_mem(struct mrsas_softc *sc);
128 void	mrsas_free_tmp_dcmd(struct mrsas_tmp_dcmd *tmp);
129 void	mrsas_isr(void *arg);
130 void	mrsas_teardown_intr(struct mrsas_softc *sc);
131 void	mrsas_addr_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error);
132 void	mrsas_kill_hba(struct mrsas_softc *sc);
133 void	mrsas_aen_handler(struct mrsas_softc *sc);
134 void
135 mrsas_write_reg(struct mrsas_softc *sc, int offset,
136     u_int32_t value);
137 void
138 mrsas_fire_cmd(struct mrsas_softc *sc, u_int32_t req_desc_lo,
139     u_int32_t req_desc_hi);
140 void	mrsas_free_ctlr_info_cmd(struct mrsas_softc *sc);
141 void
142 mrsas_complete_mptmfi_passthru(struct mrsas_softc *sc,
143     struct mrsas_mfi_cmd *cmd, u_int8_t status);
144 void
145 mrsas_map_mpt_cmd_status(struct mrsas_mpt_cmd *cmd, u_int8_t status,
146     u_int8_t extStatus);
147 struct mrsas_mfi_cmd *mrsas_get_mfi_cmd(struct mrsas_softc *sc);
148 
149 MRSAS_REQUEST_DESCRIPTOR_UNION *mrsas_build_mpt_cmd
150         (struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd);
151 
152 extern int mrsas_cam_attach(struct mrsas_softc *sc);
153 extern void mrsas_cam_detach(struct mrsas_softc *sc);
154 extern void mrsas_cmd_done(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd);
155 extern void mrsas_free_frame(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd);
156 extern int mrsas_alloc_mfi_cmds(struct mrsas_softc *sc);
157 extern struct mrsas_mpt_cmd *mrsas_get_mpt_cmd(struct mrsas_softc *sc);
158 extern int mrsas_passthru(struct mrsas_softc *sc, void *arg, u_long ioctlCmd);
159 extern uint8_t MR_ValidateMapInfo(struct mrsas_softc *sc);
160 extern u_int16_t MR_GetLDTgtId(u_int32_t ld, MR_DRV_RAID_MAP_ALL * map);
161 extern MR_LD_RAID *MR_LdRaidGet(u_int32_t ld, MR_DRV_RAID_MAP_ALL * map);
162 extern void mrsas_xpt_freeze(struct mrsas_softc *sc);
163 extern void mrsas_xpt_release(struct mrsas_softc *sc);
164 extern MRSAS_REQUEST_DESCRIPTOR_UNION *
165 mrsas_get_request_desc(struct mrsas_softc *sc,
166     u_int16_t index);
167 extern int mrsas_bus_scan_sim(struct mrsas_softc *sc, struct cam_sim *sim);
168 static int mrsas_alloc_evt_log_info_cmd(struct mrsas_softc *sc);
169 static void mrsas_free_evt_log_info_cmd(struct mrsas_softc *sc);
170 
171 SYSCTL_NODE(_hw, OID_AUTO, mrsas, CTLFLAG_RD, 0, "MRSAS Driver Parameters");
172 
173 /*
174  * PCI device struct and table
175  *
176  */
177 typedef struct mrsas_ident {
178 	uint16_t vendor;
179 	uint16_t device;
180 	uint16_t subvendor;
181 	uint16_t subdevice;
182 	const char *desc;
183 }	MRSAS_CTLR_ID;
184 
185 MRSAS_CTLR_ID device_table[] = {
186 	{0x1000, MRSAS_TBOLT, 0xffff, 0xffff, "AVAGO Thunderbolt SAS Controller"},
187 	{0x1000, MRSAS_INVADER, 0xffff, 0xffff, "AVAGO Invader SAS Controller"},
188 	{0x1000, MRSAS_FURY, 0xffff, 0xffff, "AVAGO Fury SAS Controller"},
189 	{0x1000, MRSAS_INTRUDER, 0xffff, 0xffff, "AVAGO Intruder SAS Controller"},
190 	{0x1000, MRSAS_INTRUDER_24, 0xffff, 0xffff, "AVAGO Intruder_24 SAS Controller"},
191 	{0x1000, MRSAS_CUTLASS_52, 0xffff, 0xffff, "AVAGO Cutlass_52 SAS Controller"},
192 	{0x1000, MRSAS_CUTLASS_53, 0xffff, 0xffff, "AVAGO Cutlass_53 SAS Controller"},
193 	{0, 0, 0, 0, NULL}
194 };
195 
196 /*
197  * Character device entry points
198  *
199  */
200 static struct cdevsw mrsas_cdevsw = {
201 	.d_version = D_VERSION,
202 	.d_open = mrsas_open,
203 	.d_close = mrsas_close,
204 	.d_read = mrsas_read,
205 	.d_write = mrsas_write,
206 	.d_ioctl = mrsas_ioctl,
207 	.d_poll = mrsas_poll,
208 	.d_name = "mrsas",
209 };
210 
211 MALLOC_DEFINE(M_MRSAS, "mrsasbuf", "Buffers for the MRSAS driver");
212 
213 /*
214  * In the cdevsw routines, we find our softc by using the si_drv1 member of
215  * struct cdev.  We set this variable to point to our softc in our attach
216  * routine when we create the /dev entry.
217  */
218 int
219 mrsas_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
220 {
221 	struct mrsas_softc *sc;
222 
223 	sc = dev->si_drv1;
224 	return (0);
225 }
226 
227 int
228 mrsas_close(struct cdev *dev, int fflag, int devtype, struct thread *td)
229 {
230 	struct mrsas_softc *sc;
231 
232 	sc = dev->si_drv1;
233 	return (0);
234 }
235 
236 int
237 mrsas_read(struct cdev *dev, struct uio *uio, int ioflag)
238 {
239 	struct mrsas_softc *sc;
240 
241 	sc = dev->si_drv1;
242 	return (0);
243 }
244 int
245 mrsas_write(struct cdev *dev, struct uio *uio, int ioflag)
246 {
247 	struct mrsas_softc *sc;
248 
249 	sc = dev->si_drv1;
250 	return (0);
251 }
252 
253 /*
254  * Register Read/Write Functions
255  *
256  */
257 void
258 mrsas_write_reg(struct mrsas_softc *sc, int offset,
259     u_int32_t value)
260 {
261 	bus_space_tag_t bus_tag = sc->bus_tag;
262 	bus_space_handle_t bus_handle = sc->bus_handle;
263 
264 	bus_space_write_4(bus_tag, bus_handle, offset, value);
265 }
266 
267 u_int32_t
268 mrsas_read_reg(struct mrsas_softc *sc, int offset)
269 {
270 	bus_space_tag_t bus_tag = sc->bus_tag;
271 	bus_space_handle_t bus_handle = sc->bus_handle;
272 
273 	return ((u_int32_t)bus_space_read_4(bus_tag, bus_handle, offset));
274 }
275 
276 
277 /*
278  * Interrupt Disable/Enable/Clear Functions
279  *
280  */
281 void
282 mrsas_disable_intr(struct mrsas_softc *sc)
283 {
284 	u_int32_t mask = 0xFFFFFFFF;
285 	u_int32_t status;
286 
287 	sc->mask_interrupts = 1;
288 	mrsas_write_reg(sc, offsetof(mrsas_reg_set, outbound_intr_mask), mask);
289 	/* Dummy read to force pci flush */
290 	status = mrsas_read_reg(sc, offsetof(mrsas_reg_set, outbound_intr_mask));
291 }
292 
293 void
294 mrsas_enable_intr(struct mrsas_softc *sc)
295 {
296 	u_int32_t mask = MFI_FUSION_ENABLE_INTERRUPT_MASK;
297 	u_int32_t status;
298 
299 	sc->mask_interrupts = 0;
300 	mrsas_write_reg(sc, offsetof(mrsas_reg_set, outbound_intr_status), ~0);
301 	status = mrsas_read_reg(sc, offsetof(mrsas_reg_set, outbound_intr_status));
302 
303 	mrsas_write_reg(sc, offsetof(mrsas_reg_set, outbound_intr_mask), ~mask);
304 	status = mrsas_read_reg(sc, offsetof(mrsas_reg_set, outbound_intr_mask));
305 }
306 
307 static int
308 mrsas_clear_intr(struct mrsas_softc *sc)
309 {
310 	u_int32_t status;
311 
312 	/* Read received interrupt */
313 	status = mrsas_read_reg(sc, offsetof(mrsas_reg_set, outbound_intr_status));
314 
315 	/* Not our interrupt, so just return */
316 	if (!(status & MFI_FUSION_ENABLE_INTERRUPT_MASK))
317 		return (0);
318 
319 	/* We got a reply interrupt */
320 	return (1);
321 }
322 
323 /*
324  * PCI Support Functions
325  *
326  */
327 static struct mrsas_ident *
328 mrsas_find_ident(device_t dev)
329 {
330 	struct mrsas_ident *pci_device;
331 
332 	for (pci_device = device_table; pci_device->vendor != 0; pci_device++) {
333 		if ((pci_device->vendor == pci_get_vendor(dev)) &&
334 		    (pci_device->device == pci_get_device(dev)) &&
335 		    ((pci_device->subvendor == pci_get_subvendor(dev)) ||
336 		    (pci_device->subvendor == 0xffff)) &&
337 		    ((pci_device->subdevice == pci_get_subdevice(dev)) ||
338 		    (pci_device->subdevice == 0xffff)))
339 			return (pci_device);
340 	}
341 	return (NULL);
342 }
343 
344 static int
345 mrsas_probe(device_t dev)
346 {
347 	static u_int8_t first_ctrl = 1;
348 	struct mrsas_ident *id;
349 
350 	if ((id = mrsas_find_ident(dev)) != NULL) {
351 		if (first_ctrl) {
352 			printf("AVAGO MegaRAID SAS FreeBSD mrsas driver version: %s\n",
353 			    MRSAS_VERSION);
354 			first_ctrl = 0;
355 		}
356 		device_set_desc(dev, id->desc);
357 		/* between BUS_PROBE_DEFAULT and BUS_PROBE_LOW_PRIORITY */
358 		return (-30);
359 	}
360 	return (ENXIO);
361 }
362 
363 /*
364  * mrsas_setup_sysctl:	setup sysctl values for mrsas
365  * input:				Adapter instance soft state
366  *
367  * Setup sysctl entries for mrsas driver.
368  */
369 static void
370 mrsas_setup_sysctl(struct mrsas_softc *sc)
371 {
372 	struct sysctl_ctx_list *sysctl_ctx = NULL;
373 	struct sysctl_oid *sysctl_tree = NULL;
374 	char tmpstr[80], tmpstr2[80];
375 
376 	/*
377 	 * Setup the sysctl variable so the user can change the debug level
378 	 * on the fly.
379 	 */
380 	snprintf(tmpstr, sizeof(tmpstr), "MRSAS controller %d",
381 	    device_get_unit(sc->mrsas_dev));
382 	snprintf(tmpstr2, sizeof(tmpstr2), "%d", device_get_unit(sc->mrsas_dev));
383 
384 	sysctl_ctx = device_get_sysctl_ctx(sc->mrsas_dev);
385 	if (sysctl_ctx != NULL)
386 		sysctl_tree = device_get_sysctl_tree(sc->mrsas_dev);
387 
388 	if (sysctl_tree == NULL) {
389 		sysctl_ctx_init(&sc->sysctl_ctx);
390 		sc->sysctl_tree = SYSCTL_ADD_NODE(&sc->sysctl_ctx,
391 		    SYSCTL_STATIC_CHILDREN(_hw_mrsas), OID_AUTO, tmpstr2,
392 		    CTLFLAG_RD, 0, tmpstr);
393 		if (sc->sysctl_tree == NULL)
394 			return;
395 		sysctl_ctx = &sc->sysctl_ctx;
396 		sysctl_tree = sc->sysctl_tree;
397 	}
398 	SYSCTL_ADD_UINT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
399 	    OID_AUTO, "disable_ocr", CTLFLAG_RW, &sc->disableOnlineCtrlReset, 0,
400 	    "Disable the use of OCR");
401 
402 	SYSCTL_ADD_STRING(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
403 	    OID_AUTO, "driver_version", CTLFLAG_RD, MRSAS_VERSION,
404 	    strlen(MRSAS_VERSION), "driver version");
405 
406 	SYSCTL_ADD_INT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
407 	    OID_AUTO, "reset_count", CTLFLAG_RD,
408 	    &sc->reset_count, 0, "number of ocr from start of the day");
409 
410 	SYSCTL_ADD_INT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
411 	    OID_AUTO, "fw_outstanding", CTLFLAG_RD,
412 	    &sc->fw_outstanding.val_rdonly, 0, "FW outstanding commands");
413 
414 	SYSCTL_ADD_INT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
415 	    OID_AUTO, "io_cmds_highwater", CTLFLAG_RD,
416 	    &sc->io_cmds_highwater, 0, "Max FW outstanding commands");
417 
418 	SYSCTL_ADD_UINT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
419 	    OID_AUTO, "mrsas_debug", CTLFLAG_RW, &sc->mrsas_debug, 0,
420 	    "Driver debug level");
421 
422 	SYSCTL_ADD_UINT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
423 	    OID_AUTO, "mrsas_io_timeout", CTLFLAG_RW, &sc->mrsas_io_timeout,
424 	    0, "Driver IO timeout value in mili-second.");
425 
426 	SYSCTL_ADD_UINT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
427 	    OID_AUTO, "mrsas_fw_fault_check_delay", CTLFLAG_RW,
428 	    &sc->mrsas_fw_fault_check_delay,
429 	    0, "FW fault check thread delay in seconds. <default is 1 sec>");
430 
431 	SYSCTL_ADD_INT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
432 	    OID_AUTO, "reset_in_progress", CTLFLAG_RD,
433 	    &sc->reset_in_progress, 0, "ocr in progress status");
434 
435 	SYSCTL_ADD_UINT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
436 	    OID_AUTO, "block_sync_cache", CTLFLAG_RW,
437 	    &sc->block_sync_cache, 0,
438 	    "Block SYNC CACHE at driver. <default: 0, send it to FW>");
439 
440 }
441 
442 /*
443  * mrsas_get_tunables:	get tunable parameters.
444  * input:				Adapter instance soft state
445  *
446  * Get tunable parameters. This will help to debug driver at boot time.
447  */
448 static void
449 mrsas_get_tunables(struct mrsas_softc *sc)
450 {
451 	char tmpstr[80];
452 
453 	/* XXX default to some debugging for now */
454 	sc->mrsas_debug = MRSAS_FAULT;
455 	sc->mrsas_io_timeout = MRSAS_IO_TIMEOUT;
456 	sc->mrsas_fw_fault_check_delay = 1;
457 	sc->reset_count = 0;
458 	sc->reset_in_progress = 0;
459 	sc->block_sync_cache = 0;
460 
461 	/*
462 	 * Grab the global variables.
463 	 */
464 	TUNABLE_INT_FETCH("hw.mrsas.debug_level", &sc->mrsas_debug);
465 
466 	/*
467 	 * Grab the global variables.
468 	 */
469 	TUNABLE_INT_FETCH("hw.mrsas.lb_pending_cmds", &sc->lb_pending_cmds);
470 
471 	/* Grab the unit-instance variables */
472 	snprintf(tmpstr, sizeof(tmpstr), "dev.mrsas.%d.debug_level",
473 	    device_get_unit(sc->mrsas_dev));
474 	TUNABLE_INT_FETCH(tmpstr, &sc->mrsas_debug);
475 }
476 
477 /*
478  * mrsas_alloc_evt_log_info cmd: Allocates memory to get event log information.
479  * Used to get sequence number at driver load time.
480  * input:		Adapter soft state
481  *
482  * Allocates DMAable memory for the event log info internal command.
483  */
484 int
485 mrsas_alloc_evt_log_info_cmd(struct mrsas_softc *sc)
486 {
487 	int el_info_size;
488 
489 	/* Allocate get event log info command */
490 	el_info_size = sizeof(struct mrsas_evt_log_info);
491 	if (bus_dma_tag_create(sc->mrsas_parent_tag,
492 	    1, 0,
493 	    BUS_SPACE_MAXADDR_32BIT,
494 	    BUS_SPACE_MAXADDR,
495 	    NULL, NULL,
496 	    el_info_size,
497 	    1,
498 	    el_info_size,
499 	    BUS_DMA_ALLOCNOW,
500 	    NULL, NULL,
501 	    &sc->el_info_tag)) {
502 		device_printf(sc->mrsas_dev, "Cannot allocate event log info tag\n");
503 		return (ENOMEM);
504 	}
505 	if (bus_dmamem_alloc(sc->el_info_tag, (void **)&sc->el_info_mem,
506 	    BUS_DMA_NOWAIT, &sc->el_info_dmamap)) {
507 		device_printf(sc->mrsas_dev, "Cannot allocate event log info cmd mem\n");
508 		return (ENOMEM);
509 	}
510 	if (bus_dmamap_load(sc->el_info_tag, sc->el_info_dmamap,
511 	    sc->el_info_mem, el_info_size, mrsas_addr_cb,
512 	    &sc->el_info_phys_addr, BUS_DMA_NOWAIT)) {
513 		device_printf(sc->mrsas_dev, "Cannot load event log info cmd mem\n");
514 		return (ENOMEM);
515 	}
516 	memset(sc->el_info_mem, 0, el_info_size);
517 	return (0);
518 }
519 
520 /*
521  * mrsas_free_evt_info_cmd:	Free memory for Event log info command
522  * input:					Adapter soft state
523  *
524  * Deallocates memory for the event log info internal command.
525  */
526 void
527 mrsas_free_evt_log_info_cmd(struct mrsas_softc *sc)
528 {
529 	if (sc->el_info_phys_addr)
530 		bus_dmamap_unload(sc->el_info_tag, sc->el_info_dmamap);
531 	if (sc->el_info_mem != NULL)
532 		bus_dmamem_free(sc->el_info_tag, sc->el_info_mem, sc->el_info_dmamap);
533 	if (sc->el_info_tag != NULL)
534 		bus_dma_tag_destroy(sc->el_info_tag);
535 }
536 
537 /*
538  *  mrsas_get_seq_num:	Get latest event sequence number
539  *  @sc:				Adapter soft state
540  *  @eli:				Firmware event log sequence number information.
541  *
542  * Firmware maintains a log of all events in a non-volatile area.
543  * Driver get the sequence number using DCMD
544  * "MR_DCMD_CTRL_EVENT_GET_INFO" at driver load time.
545  */
546 
547 static int
548 mrsas_get_seq_num(struct mrsas_softc *sc,
549     struct mrsas_evt_log_info *eli)
550 {
551 	struct mrsas_mfi_cmd *cmd;
552 	struct mrsas_dcmd_frame *dcmd;
553 	u_int8_t do_ocr = 1, retcode = 0;
554 
555 	cmd = mrsas_get_mfi_cmd(sc);
556 
557 	if (!cmd) {
558 		device_printf(sc->mrsas_dev, "Failed to get a free cmd\n");
559 		return -ENOMEM;
560 	}
561 	dcmd = &cmd->frame->dcmd;
562 
563 	if (mrsas_alloc_evt_log_info_cmd(sc) != SUCCESS) {
564 		device_printf(sc->mrsas_dev, "Cannot allocate evt log info cmd\n");
565 		mrsas_release_mfi_cmd(cmd);
566 		return -ENOMEM;
567 	}
568 	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
569 
570 	dcmd->cmd = MFI_CMD_DCMD;
571 	dcmd->cmd_status = 0x0;
572 	dcmd->sge_count = 1;
573 	dcmd->flags = MFI_FRAME_DIR_READ;
574 	dcmd->timeout = 0;
575 	dcmd->pad_0 = 0;
576 	dcmd->data_xfer_len = sizeof(struct mrsas_evt_log_info);
577 	dcmd->opcode = MR_DCMD_CTRL_EVENT_GET_INFO;
578 	dcmd->sgl.sge32[0].phys_addr = sc->el_info_phys_addr;
579 	dcmd->sgl.sge32[0].length = sizeof(struct mrsas_evt_log_info);
580 
581 	retcode = mrsas_issue_blocked_cmd(sc, cmd);
582 	if (retcode == ETIMEDOUT)
583 		goto dcmd_timeout;
584 
585 	do_ocr = 0;
586 	/*
587 	 * Copy the data back into callers buffer
588 	 */
589 	memcpy(eli, sc->el_info_mem, sizeof(struct mrsas_evt_log_info));
590 	mrsas_free_evt_log_info_cmd(sc);
591 
592 dcmd_timeout:
593 	if (do_ocr)
594 		sc->do_timedout_reset = MFI_DCMD_TIMEOUT_OCR;
595 	else
596 		mrsas_release_mfi_cmd(cmd);
597 
598 	return retcode;
599 }
600 
601 
602 /*
603  *  mrsas_register_aen:		Register for asynchronous event notification
604  *  @sc:			Adapter soft state
605  *  @seq_num:			Starting sequence number
606  *  @class_locale:		Class of the event
607  *
608  *  This function subscribes for events beyond the @seq_num
609  *  and type @class_locale.
610  *
611  */
612 static int
613 mrsas_register_aen(struct mrsas_softc *sc, u_int32_t seq_num,
614     u_int32_t class_locale_word)
615 {
616 	int ret_val;
617 	struct mrsas_mfi_cmd *cmd;
618 	struct mrsas_dcmd_frame *dcmd;
619 	union mrsas_evt_class_locale curr_aen;
620 	union mrsas_evt_class_locale prev_aen;
621 
622 	/*
623 	 * If there an AEN pending already (aen_cmd), check if the
624 	 * class_locale of that pending AEN is inclusive of the new AEN
625 	 * request we currently have. If it is, then we don't have to do
626 	 * anything. In other words, whichever events the current AEN request
627 	 * is subscribing to, have already been subscribed to. If the old_cmd
628 	 * is _not_ inclusive, then we have to abort that command, form a
629 	 * class_locale that is superset of both old and current and re-issue
630 	 * to the FW
631 	 */
632 
633 	curr_aen.word = class_locale_word;
634 
635 	if (sc->aen_cmd) {
636 
637 		prev_aen.word = sc->aen_cmd->frame->dcmd.mbox.w[1];
638 
639 		/*
640 		 * A class whose enum value is smaller is inclusive of all
641 		 * higher values. If a PROGRESS (= -1) was previously
642 		 * registered, then a new registration requests for higher
643 		 * classes need not be sent to FW. They are automatically
644 		 * included. Locale numbers don't have such hierarchy. They
645 		 * are bitmap values
646 		 */
647 		if ((prev_aen.members.class <= curr_aen.members.class) &&
648 		    !((prev_aen.members.locale & curr_aen.members.locale) ^
649 		    curr_aen.members.locale)) {
650 			/*
651 			 * Previously issued event registration includes
652 			 * current request. Nothing to do.
653 			 */
654 			return 0;
655 		} else {
656 			curr_aen.members.locale |= prev_aen.members.locale;
657 
658 			if (prev_aen.members.class < curr_aen.members.class)
659 				curr_aen.members.class = prev_aen.members.class;
660 
661 			sc->aen_cmd->abort_aen = 1;
662 			ret_val = mrsas_issue_blocked_abort_cmd(sc,
663 			    sc->aen_cmd);
664 
665 			if (ret_val) {
666 				printf("mrsas: Failed to abort previous AEN command\n");
667 				return ret_val;
668 			} else
669 				sc->aen_cmd = NULL;
670 		}
671 	}
672 	cmd = mrsas_get_mfi_cmd(sc);
673 	if (!cmd)
674 		return ENOMEM;
675 
676 	dcmd = &cmd->frame->dcmd;
677 
678 	memset(sc->evt_detail_mem, 0, sizeof(struct mrsas_evt_detail));
679 
680 	/*
681 	 * Prepare DCMD for aen registration
682 	 */
683 	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
684 
685 	dcmd->cmd = MFI_CMD_DCMD;
686 	dcmd->cmd_status = 0x0;
687 	dcmd->sge_count = 1;
688 	dcmd->flags = MFI_FRAME_DIR_READ;
689 	dcmd->timeout = 0;
690 	dcmd->pad_0 = 0;
691 	dcmd->data_xfer_len = sizeof(struct mrsas_evt_detail);
692 	dcmd->opcode = MR_DCMD_CTRL_EVENT_WAIT;
693 	dcmd->mbox.w[0] = seq_num;
694 	sc->last_seq_num = seq_num;
695 	dcmd->mbox.w[1] = curr_aen.word;
696 	dcmd->sgl.sge32[0].phys_addr = (u_int32_t)sc->evt_detail_phys_addr;
697 	dcmd->sgl.sge32[0].length = sizeof(struct mrsas_evt_detail);
698 
699 	if (sc->aen_cmd != NULL) {
700 		mrsas_release_mfi_cmd(cmd);
701 		return 0;
702 	}
703 	/*
704 	 * Store reference to the cmd used to register for AEN. When an
705 	 * application wants us to register for AEN, we have to abort this
706 	 * cmd and re-register with a new EVENT LOCALE supplied by that app
707 	 */
708 	sc->aen_cmd = cmd;
709 
710 	/*
711 	 * Issue the aen registration frame
712 	 */
713 	if (mrsas_issue_dcmd(sc, cmd)) {
714 		device_printf(sc->mrsas_dev, "Cannot issue AEN DCMD command.\n");
715 		return (1);
716 	}
717 	return 0;
718 }
719 
720 /*
721  * mrsas_start_aen:	Subscribes to AEN during driver load time
722  * @instance:		Adapter soft state
723  */
724 static int
725 mrsas_start_aen(struct mrsas_softc *sc)
726 {
727 	struct mrsas_evt_log_info eli;
728 	union mrsas_evt_class_locale class_locale;
729 
730 
731 	/* Get the latest sequence number from FW */
732 
733 	memset(&eli, 0, sizeof(eli));
734 
735 	if (mrsas_get_seq_num(sc, &eli))
736 		return -1;
737 
738 	/* Register AEN with FW for latest sequence number plus 1 */
739 	class_locale.members.reserved = 0;
740 	class_locale.members.locale = MR_EVT_LOCALE_ALL;
741 	class_locale.members.class = MR_EVT_CLASS_DEBUG;
742 
743 	return mrsas_register_aen(sc, eli.newest_seq_num + 1,
744 	    class_locale.word);
745 
746 }
747 
748 /*
749  * mrsas_setup_msix:	Allocate MSI-x vectors
750  * @sc:					adapter soft state
751  */
752 static int
753 mrsas_setup_msix(struct mrsas_softc *sc)
754 {
755 	int i;
756 
757 	for (i = 0; i < sc->msix_vectors; i++) {
758 		sc->irq_context[i].sc = sc;
759 		sc->irq_context[i].MSIxIndex = i;
760 		sc->irq_id[i] = i + 1;
761 		sc->mrsas_irq[i] = bus_alloc_resource_any
762 		    (sc->mrsas_dev, SYS_RES_IRQ, &sc->irq_id[i]
763 		    ,RF_ACTIVE);
764 		if (sc->mrsas_irq[i] == NULL) {
765 			device_printf(sc->mrsas_dev, "Can't allocate MSI-x\n");
766 			goto irq_alloc_failed;
767 		}
768 		if (bus_setup_intr(sc->mrsas_dev,
769 		    sc->mrsas_irq[i],
770 		    INTR_MPSAFE | INTR_TYPE_CAM,
771 		    NULL, mrsas_isr, &sc->irq_context[i],
772 		    &sc->intr_handle[i])) {
773 			device_printf(sc->mrsas_dev,
774 			    "Cannot set up MSI-x interrupt handler\n");
775 			goto irq_alloc_failed;
776 		}
777 	}
778 	return SUCCESS;
779 
780 irq_alloc_failed:
781 	mrsas_teardown_intr(sc);
782 	return (FAIL);
783 }
784 
785 /*
786  * mrsas_allocate_msix:		Setup MSI-x vectors
787  * @sc:						adapter soft state
788  */
789 static int
790 mrsas_allocate_msix(struct mrsas_softc *sc)
791 {
792 	if (pci_alloc_msix(sc->mrsas_dev, &sc->msix_vectors) == 0) {
793 		device_printf(sc->mrsas_dev, "Using MSI-X with %d number"
794 		    " of vectors\n", sc->msix_vectors);
795 	} else {
796 		device_printf(sc->mrsas_dev, "MSI-x setup failed\n");
797 		goto irq_alloc_failed;
798 	}
799 	return SUCCESS;
800 
801 irq_alloc_failed:
802 	mrsas_teardown_intr(sc);
803 	return (FAIL);
804 }
805 
806 /*
807  * mrsas_attach:	PCI entry point
808  * input:			pointer to device struct
809  *
810  * Performs setup of PCI and registers, initializes mutexes and linked lists,
811  * registers interrupts and CAM, and initializes   the adapter/controller to
812  * its proper state.
813  */
814 static int
815 mrsas_attach(device_t dev)
816 {
817 	struct mrsas_softc *sc = device_get_softc(dev);
818 	uint32_t cmd, bar, error;
819 
820 	memset(sc, 0, sizeof(struct mrsas_softc));
821 
822 	/* Look up our softc and initialize its fields. */
823 	sc->mrsas_dev = dev;
824 	sc->device_id = pci_get_device(dev);
825 
826 	if ((sc->device_id == MRSAS_INVADER) ||
827 	    (sc->device_id == MRSAS_FURY) ||
828 	    (sc->device_id == MRSAS_INTRUDER) ||
829 	    (sc->device_id == MRSAS_INTRUDER_24) ||
830 	    (sc->device_id == MRSAS_CUTLASS_52) ||
831 	    (sc->device_id == MRSAS_CUTLASS_53)) {
832 		sc->mrsas_gen3_ctrl = 1;
833     }
834 
835 	mrsas_get_tunables(sc);
836 
837 	/*
838 	 * Set up PCI and registers
839 	 */
840 	cmd = pci_read_config(dev, PCIR_COMMAND, 2);
841 	if ((cmd & PCIM_CMD_PORTEN) == 0) {
842 		return (ENXIO);
843 	}
844 	/* Force the busmaster enable bit on. */
845 	cmd |= PCIM_CMD_BUSMASTEREN;
846 	pci_write_config(dev, PCIR_COMMAND, cmd, 2);
847 
848 	bar = pci_read_config(dev, MRSAS_PCI_BAR1, 4);
849 
850 	sc->reg_res_id = MRSAS_PCI_BAR1;/* BAR1 offset */
851 	if ((sc->reg_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
852 	    &(sc->reg_res_id), RF_ACTIVE))
853 	    == NULL) {
854 		device_printf(dev, "Cannot allocate PCI registers\n");
855 		goto attach_fail;
856 	}
857 	sc->bus_tag = rman_get_bustag(sc->reg_res);
858 	sc->bus_handle = rman_get_bushandle(sc->reg_res);
859 
860 	/* Intialize mutexes */
861 	mtx_init(&sc->sim_lock, "mrsas_sim_lock", NULL, MTX_DEF);
862 	mtx_init(&sc->pci_lock, "mrsas_pci_lock", NULL, MTX_DEF);
863 	mtx_init(&sc->io_lock, "mrsas_io_lock", NULL, MTX_DEF);
864 	mtx_init(&sc->aen_lock, "mrsas_aen_lock", NULL, MTX_DEF);
865 	mtx_init(&sc->ioctl_lock, "mrsas_ioctl_lock", NULL, MTX_SPIN);
866 	mtx_init(&sc->mpt_cmd_pool_lock, "mrsas_mpt_cmd_pool_lock", NULL, MTX_DEF);
867 	mtx_init(&sc->mfi_cmd_pool_lock, "mrsas_mfi_cmd_pool_lock", NULL, MTX_DEF);
868 	mtx_init(&sc->raidmap_lock, "mrsas_raidmap_lock", NULL, MTX_DEF);
869 
870 	/* Intialize linked list */
871 	TAILQ_INIT(&sc->mrsas_mpt_cmd_list_head);
872 	TAILQ_INIT(&sc->mrsas_mfi_cmd_list_head);
873 
874 	mrsas_atomic_set(&sc->fw_outstanding, 0);
875 	mrsas_atomic_set(&sc->target_reset_outstanding, 0);
876 
877 	sc->io_cmds_highwater = 0;
878 
879 	sc->adprecovery = MRSAS_HBA_OPERATIONAL;
880 	sc->UnevenSpanSupport = 0;
881 
882 	sc->msix_enable = 0;
883 
884 	/* Initialize Firmware */
885 	if (mrsas_init_fw(sc) != SUCCESS) {
886 		goto attach_fail_fw;
887 	}
888 	/* Register mrsas to CAM layer */
889 	if ((mrsas_cam_attach(sc) != SUCCESS)) {
890 		goto attach_fail_cam;
891 	}
892 	/* Register IRQs */
893 	if (mrsas_setup_irq(sc) != SUCCESS) {
894 		goto attach_fail_irq;
895 	}
896 	error = mrsas_kproc_create(mrsas_ocr_thread, sc,
897 	    &sc->ocr_thread, 0, 0, "mrsas_ocr%d",
898 	    device_get_unit(sc->mrsas_dev));
899 	if (error) {
900 		device_printf(sc->mrsas_dev, "Error %d starting OCR thread\n", error);
901 		goto attach_fail_ocr_thread;
902 	}
903 	/*
904 	 * After FW initialization and OCR thread creation
905 	 * we will defer the cdev creation, AEN setup on ICH callback
906 	 */
907 	sc->mrsas_ich.ich_func = mrsas_ich_startup;
908 	sc->mrsas_ich.ich_arg = sc;
909 	if (config_intrhook_establish(&sc->mrsas_ich) != 0) {
910 		device_printf(sc->mrsas_dev, "Config hook is already established\n");
911 	}
912 	mrsas_setup_sysctl(sc);
913 	return SUCCESS;
914 
915 attach_fail_ocr_thread:
916 	if (sc->ocr_thread_active)
917 		wakeup(&sc->ocr_chan);
918 attach_fail_irq:
919 	mrsas_teardown_intr(sc);
920 attach_fail_cam:
921 	mrsas_cam_detach(sc);
922 attach_fail_fw:
923 	/* if MSIX vector is allocated and FW Init FAILED then release MSIX */
924 	if (sc->msix_enable == 1)
925 		pci_release_msi(sc->mrsas_dev);
926 	mrsas_free_mem(sc);
927 	mtx_destroy(&sc->sim_lock);
928 	mtx_destroy(&sc->aen_lock);
929 	mtx_destroy(&sc->pci_lock);
930 	mtx_destroy(&sc->io_lock);
931 	mtx_destroy(&sc->ioctl_lock);
932 	mtx_destroy(&sc->mpt_cmd_pool_lock);
933 	mtx_destroy(&sc->mfi_cmd_pool_lock);
934 	mtx_destroy(&sc->raidmap_lock);
935 attach_fail:
936 	if (sc->reg_res) {
937 		bus_release_resource(sc->mrsas_dev, SYS_RES_MEMORY,
938 		    sc->reg_res_id, sc->reg_res);
939 	}
940 	return (ENXIO);
941 }
942 
943 /*
944  * Interrupt config hook
945  */
946 static void
947 mrsas_ich_startup(void *arg)
948 {
949 	struct mrsas_softc *sc = (struct mrsas_softc *)arg;
950 
951 	/*
952 	 * Intialize a counting Semaphore to take care no. of concurrent IOCTLs
953 	 */
954 	sema_init(&sc->ioctl_count_sema, MRSAS_MAX_IOCTL_CMDS,
955 	    IOCTL_SEMA_DESCRIPTION);
956 
957 	/* Create a /dev entry for mrsas controller. */
958 	sc->mrsas_cdev = make_dev(&mrsas_cdevsw, device_get_unit(sc->mrsas_dev), UID_ROOT,
959 	    GID_OPERATOR, (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP), "mrsas%u",
960 	    device_get_unit(sc->mrsas_dev));
961 
962 	if (device_get_unit(sc->mrsas_dev) == 0) {
963 		make_dev_alias_p(MAKEDEV_CHECKNAME,
964 		    &sc->mrsas_linux_emulator_cdev, sc->mrsas_cdev,
965 		    "megaraid_sas_ioctl_node");
966 	}
967 	if (sc->mrsas_cdev)
968 		sc->mrsas_cdev->si_drv1 = sc;
969 
970 	/*
971 	 * Add this controller to mrsas_mgmt_info structure so that it can be
972 	 * exported to management applications
973 	 */
974 	if (device_get_unit(sc->mrsas_dev) == 0)
975 		memset(&mrsas_mgmt_info, 0, sizeof(mrsas_mgmt_info));
976 
977 	mrsas_mgmt_info.count++;
978 	mrsas_mgmt_info.sc_ptr[mrsas_mgmt_info.max_index] = sc;
979 	mrsas_mgmt_info.max_index++;
980 
981 	/* Enable Interrupts */
982 	mrsas_enable_intr(sc);
983 
984 	/* Initiate AEN (Asynchronous Event Notification) */
985 	if (mrsas_start_aen(sc)) {
986 		device_printf(sc->mrsas_dev, "Error: AEN registration FAILED !!! "
987 		    "Further events from the controller will not be communicated.\n"
988 		    "Either there is some problem in the controller"
989 		    "or the controller does not support AEN.\n"
990 		    "Please contact to the SUPPORT TEAM if the problem persists\n");
991 	}
992 	if (sc->mrsas_ich.ich_arg != NULL) {
993 		device_printf(sc->mrsas_dev, "Disestablish mrsas intr hook\n");
994 		config_intrhook_disestablish(&sc->mrsas_ich);
995 		sc->mrsas_ich.ich_arg = NULL;
996 	}
997 }
998 
999 /*
1000  * mrsas_detach:	De-allocates and teardown resources
1001  * input:			pointer to device struct
1002  *
1003  * This function is the entry point for device disconnect and detach.
1004  * It performs memory de-allocations, shutdown of the controller and various
1005  * teardown and destroy resource functions.
1006  */
1007 static int
1008 mrsas_detach(device_t dev)
1009 {
1010 	struct mrsas_softc *sc;
1011 	int i = 0;
1012 
1013 	sc = device_get_softc(dev);
1014 	sc->remove_in_progress = 1;
1015 
1016 	/* Destroy the character device so no other IOCTL will be handled */
1017 	if ((device_get_unit(dev) == 0) && sc->mrsas_linux_emulator_cdev)
1018 		destroy_dev(sc->mrsas_linux_emulator_cdev);
1019 	destroy_dev(sc->mrsas_cdev);
1020 
1021 	/*
1022 	 * Take the instance off the instance array. Note that we will not
1023 	 * decrement the max_index. We let this array be sparse array
1024 	 */
1025 	for (i = 0; i < mrsas_mgmt_info.max_index; i++) {
1026 		if (mrsas_mgmt_info.sc_ptr[i] == sc) {
1027 			mrsas_mgmt_info.count--;
1028 			mrsas_mgmt_info.sc_ptr[i] = NULL;
1029 			break;
1030 		}
1031 	}
1032 
1033 	if (sc->ocr_thread_active)
1034 		wakeup(&sc->ocr_chan);
1035 	while (sc->reset_in_progress) {
1036 		i++;
1037 		if (!(i % MRSAS_RESET_NOTICE_INTERVAL)) {
1038 			mrsas_dprint(sc, MRSAS_INFO,
1039 			    "[%2d]waiting for OCR to be finished from %s\n", i, __func__);
1040 		}
1041 		pause("mr_shutdown", hz);
1042 	}
1043 	i = 0;
1044 	while (sc->ocr_thread_active) {
1045 		i++;
1046 		if (!(i % MRSAS_RESET_NOTICE_INTERVAL)) {
1047 			mrsas_dprint(sc, MRSAS_INFO,
1048 			    "[%2d]waiting for "
1049 			    "mrsas_ocr thread to quit ocr %d\n", i,
1050 			    sc->ocr_thread_active);
1051 		}
1052 		pause("mr_shutdown", hz);
1053 	}
1054 	mrsas_flush_cache(sc);
1055 	mrsas_shutdown_ctlr(sc, MR_DCMD_CTRL_SHUTDOWN);
1056 	mrsas_disable_intr(sc);
1057 	mrsas_cam_detach(sc);
1058 	mrsas_teardown_intr(sc);
1059 	mrsas_free_mem(sc);
1060 	mtx_destroy(&sc->sim_lock);
1061 	mtx_destroy(&sc->aen_lock);
1062 	mtx_destroy(&sc->pci_lock);
1063 	mtx_destroy(&sc->io_lock);
1064 	mtx_destroy(&sc->ioctl_lock);
1065 	mtx_destroy(&sc->mpt_cmd_pool_lock);
1066 	mtx_destroy(&sc->mfi_cmd_pool_lock);
1067 	mtx_destroy(&sc->raidmap_lock);
1068 
1069 	/* Wait for all the semaphores to be released */
1070 	while (sema_value(&sc->ioctl_count_sema) != MRSAS_MAX_IOCTL_CMDS)
1071 		pause("mr_shutdown", hz);
1072 
1073 	/* Destroy the counting semaphore created for Ioctl */
1074 	sema_destroy(&sc->ioctl_count_sema);
1075 
1076 	if (sc->reg_res) {
1077 		bus_release_resource(sc->mrsas_dev,
1078 		    SYS_RES_MEMORY, sc->reg_res_id, sc->reg_res);
1079 	}
1080 	if (sc->sysctl_tree != NULL)
1081 		sysctl_ctx_free(&sc->sysctl_ctx);
1082 
1083 	return (0);
1084 }
1085 
1086 /*
1087  * mrsas_free_mem:		Frees allocated memory
1088  * input:				Adapter instance soft state
1089  *
1090  * This function is called from mrsas_detach() to free previously allocated
1091  * memory.
1092  */
1093 void
1094 mrsas_free_mem(struct mrsas_softc *sc)
1095 {
1096 	int i;
1097 	u_int32_t max_cmd;
1098 	struct mrsas_mfi_cmd *mfi_cmd;
1099 	struct mrsas_mpt_cmd *mpt_cmd;
1100 
1101 	/*
1102 	 * Free RAID map memory
1103 	 */
1104 	for (i = 0; i < 2; i++) {
1105 		if (sc->raidmap_phys_addr[i])
1106 			bus_dmamap_unload(sc->raidmap_tag[i], sc->raidmap_dmamap[i]);
1107 		if (sc->raidmap_mem[i] != NULL)
1108 			bus_dmamem_free(sc->raidmap_tag[i], sc->raidmap_mem[i], sc->raidmap_dmamap[i]);
1109 		if (sc->raidmap_tag[i] != NULL)
1110 			bus_dma_tag_destroy(sc->raidmap_tag[i]);
1111 
1112 		if (sc->ld_drv_map[i] != NULL)
1113 			free(sc->ld_drv_map[i], M_MRSAS);
1114 	}
1115 	for (i = 0; i < 2; i++) {
1116 		if (sc->jbodmap_phys_addr[i])
1117 			bus_dmamap_unload(sc->jbodmap_tag[i], sc->jbodmap_dmamap[i]);
1118 		if (sc->jbodmap_mem[i] != NULL)
1119 			bus_dmamem_free(sc->jbodmap_tag[i], sc->jbodmap_mem[i], sc->jbodmap_dmamap[i]);
1120 		if (sc->jbodmap_tag[i] != NULL)
1121 			bus_dma_tag_destroy(sc->jbodmap_tag[i]);
1122 	}
1123 	/*
1124 	 * Free version buffer memory
1125 	 */
1126 	if (sc->verbuf_phys_addr)
1127 		bus_dmamap_unload(sc->verbuf_tag, sc->verbuf_dmamap);
1128 	if (sc->verbuf_mem != NULL)
1129 		bus_dmamem_free(sc->verbuf_tag, sc->verbuf_mem, sc->verbuf_dmamap);
1130 	if (sc->verbuf_tag != NULL)
1131 		bus_dma_tag_destroy(sc->verbuf_tag);
1132 
1133 
1134 	/*
1135 	 * Free sense buffer memory
1136 	 */
1137 	if (sc->sense_phys_addr)
1138 		bus_dmamap_unload(sc->sense_tag, sc->sense_dmamap);
1139 	if (sc->sense_mem != NULL)
1140 		bus_dmamem_free(sc->sense_tag, sc->sense_mem, sc->sense_dmamap);
1141 	if (sc->sense_tag != NULL)
1142 		bus_dma_tag_destroy(sc->sense_tag);
1143 
1144 	/*
1145 	 * Free chain frame memory
1146 	 */
1147 	if (sc->chain_frame_phys_addr)
1148 		bus_dmamap_unload(sc->chain_frame_tag, sc->chain_frame_dmamap);
1149 	if (sc->chain_frame_mem != NULL)
1150 		bus_dmamem_free(sc->chain_frame_tag, sc->chain_frame_mem, sc->chain_frame_dmamap);
1151 	if (sc->chain_frame_tag != NULL)
1152 		bus_dma_tag_destroy(sc->chain_frame_tag);
1153 
1154 	/*
1155 	 * Free IO Request memory
1156 	 */
1157 	if (sc->io_request_phys_addr)
1158 		bus_dmamap_unload(sc->io_request_tag, sc->io_request_dmamap);
1159 	if (sc->io_request_mem != NULL)
1160 		bus_dmamem_free(sc->io_request_tag, sc->io_request_mem, sc->io_request_dmamap);
1161 	if (sc->io_request_tag != NULL)
1162 		bus_dma_tag_destroy(sc->io_request_tag);
1163 
1164 	/*
1165 	 * Free Reply Descriptor memory
1166 	 */
1167 	if (sc->reply_desc_phys_addr)
1168 		bus_dmamap_unload(sc->reply_desc_tag, sc->reply_desc_dmamap);
1169 	if (sc->reply_desc_mem != NULL)
1170 		bus_dmamem_free(sc->reply_desc_tag, sc->reply_desc_mem, sc->reply_desc_dmamap);
1171 	if (sc->reply_desc_tag != NULL)
1172 		bus_dma_tag_destroy(sc->reply_desc_tag);
1173 
1174 	/*
1175 	 * Free event detail memory
1176 	 */
1177 	if (sc->evt_detail_phys_addr)
1178 		bus_dmamap_unload(sc->evt_detail_tag, sc->evt_detail_dmamap);
1179 	if (sc->evt_detail_mem != NULL)
1180 		bus_dmamem_free(sc->evt_detail_tag, sc->evt_detail_mem, sc->evt_detail_dmamap);
1181 	if (sc->evt_detail_tag != NULL)
1182 		bus_dma_tag_destroy(sc->evt_detail_tag);
1183 
1184 	/*
1185 	 * Free MFI frames
1186 	 */
1187 	if (sc->mfi_cmd_list) {
1188 		for (i = 0; i < MRSAS_MAX_MFI_CMDS; i++) {
1189 			mfi_cmd = sc->mfi_cmd_list[i];
1190 			mrsas_free_frame(sc, mfi_cmd);
1191 		}
1192 	}
1193 	if (sc->mficmd_frame_tag != NULL)
1194 		bus_dma_tag_destroy(sc->mficmd_frame_tag);
1195 
1196 	/*
1197 	 * Free MPT internal command list
1198 	 */
1199 	max_cmd = sc->max_fw_cmds;
1200 	if (sc->mpt_cmd_list) {
1201 		for (i = 0; i < max_cmd; i++) {
1202 			mpt_cmd = sc->mpt_cmd_list[i];
1203 			bus_dmamap_destroy(sc->data_tag, mpt_cmd->data_dmamap);
1204 			free(sc->mpt_cmd_list[i], M_MRSAS);
1205 		}
1206 		free(sc->mpt_cmd_list, M_MRSAS);
1207 		sc->mpt_cmd_list = NULL;
1208 	}
1209 	/*
1210 	 * Free MFI internal command list
1211 	 */
1212 
1213 	if (sc->mfi_cmd_list) {
1214 		for (i = 0; i < MRSAS_MAX_MFI_CMDS; i++) {
1215 			free(sc->mfi_cmd_list[i], M_MRSAS);
1216 		}
1217 		free(sc->mfi_cmd_list, M_MRSAS);
1218 		sc->mfi_cmd_list = NULL;
1219 	}
1220 	/*
1221 	 * Free request descriptor memory
1222 	 */
1223 	free(sc->req_desc, M_MRSAS);
1224 	sc->req_desc = NULL;
1225 
1226 	/*
1227 	 * Destroy parent tag
1228 	 */
1229 	if (sc->mrsas_parent_tag != NULL)
1230 		bus_dma_tag_destroy(sc->mrsas_parent_tag);
1231 
1232 	/*
1233 	 * Free ctrl_info memory
1234 	 */
1235 	if (sc->ctrl_info != NULL)
1236 		free(sc->ctrl_info, M_MRSAS);
1237 }
1238 
1239 /*
1240  * mrsas_teardown_intr:	Teardown interrupt
1241  * input:				Adapter instance soft state
1242  *
1243  * This function is called from mrsas_detach() to teardown and release bus
1244  * interrupt resourse.
1245  */
1246 void
1247 mrsas_teardown_intr(struct mrsas_softc *sc)
1248 {
1249 	int i;
1250 
1251 	if (!sc->msix_enable) {
1252 		if (sc->intr_handle[0])
1253 			bus_teardown_intr(sc->mrsas_dev, sc->mrsas_irq[0], sc->intr_handle[0]);
1254 		if (sc->mrsas_irq[0] != NULL)
1255 			bus_release_resource(sc->mrsas_dev, SYS_RES_IRQ,
1256 			    sc->irq_id[0], sc->mrsas_irq[0]);
1257 		sc->intr_handle[0] = NULL;
1258 	} else {
1259 		for (i = 0; i < sc->msix_vectors; i++) {
1260 			if (sc->intr_handle[i])
1261 				bus_teardown_intr(sc->mrsas_dev, sc->mrsas_irq[i],
1262 				    sc->intr_handle[i]);
1263 
1264 			if (sc->mrsas_irq[i] != NULL)
1265 				bus_release_resource(sc->mrsas_dev, SYS_RES_IRQ,
1266 				    sc->irq_id[i], sc->mrsas_irq[i]);
1267 
1268 			sc->intr_handle[i] = NULL;
1269 		}
1270 		pci_release_msi(sc->mrsas_dev);
1271 	}
1272 
1273 }
1274 
1275 /*
1276  * mrsas_suspend:	Suspend entry point
1277  * input:			Device struct pointer
1278  *
1279  * This function is the entry point for system suspend from the OS.
1280  */
1281 static int
1282 mrsas_suspend(device_t dev)
1283 {
1284 	/* This will be filled when the driver will have hibernation support */
1285 	return (0);
1286 }
1287 
1288 /*
1289  * mrsas_resume:	Resume entry point
1290  * input:			Device struct pointer
1291  *
1292  * This function is the entry point for system resume from the OS.
1293  */
1294 static int
1295 mrsas_resume(device_t dev)
1296 {
1297 	/* This will be filled when the driver will have hibernation support */
1298 	return (0);
1299 }
1300 
1301 /**
1302  * mrsas_get_softc_instance:    Find softc instance based on cmd type
1303  *
1304  * This function will return softc instance based on cmd type.
1305  * In some case, application fire ioctl on required management instance and
1306  * do not provide host_no. Use cdev->si_drv1 to get softc instance for those
1307  * case, else get the softc instance from host_no provided by application in
1308  * user data.
1309  */
1310 
1311 static struct mrsas_softc *
1312 mrsas_get_softc_instance(struct cdev *dev, u_long cmd, caddr_t arg)
1313 {
1314 	struct mrsas_softc *sc = NULL;
1315 	struct mrsas_iocpacket *user_ioc = (struct mrsas_iocpacket *)arg;
1316 
1317 	if (cmd == MRSAS_IOC_GET_PCI_INFO) {
1318 		sc = dev->si_drv1;
1319 	} else {
1320 		/*
1321 		 * get the Host number & the softc from data sent by the
1322 		 * Application
1323 		 */
1324 		sc = mrsas_mgmt_info.sc_ptr[user_ioc->host_no];
1325 		if (sc == NULL)
1326 			printf("There is no Controller number %d\n",
1327 			    user_ioc->host_no);
1328 		else if (user_ioc->host_no >= mrsas_mgmt_info.max_index)
1329 			mrsas_dprint(sc, MRSAS_FAULT,
1330 			    "Invalid Controller number %d\n", user_ioc->host_no);
1331 	}
1332 
1333 	return sc;
1334 }
1335 
1336 /*
1337  * mrsas_ioctl:	IOCtl commands entry point.
1338  *
1339  * This function is the entry point for IOCtls from the OS.  It calls the
1340  * appropriate function for processing depending on the command received.
1341  */
1342 static int
1343 mrsas_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag,
1344     struct thread *td)
1345 {
1346 	struct mrsas_softc *sc;
1347 	int ret = 0, i = 0;
1348 	MRSAS_DRV_PCI_INFORMATION *pciDrvInfo;
1349 
1350 	sc = mrsas_get_softc_instance(dev, cmd, arg);
1351 	if (!sc)
1352 		return ENOENT;
1353 
1354 	if (sc->remove_in_progress ||
1355 		(sc->adprecovery == MRSAS_HW_CRITICAL_ERROR)) {
1356 		mrsas_dprint(sc, MRSAS_INFO,
1357 		    "Either driver remove or shutdown called or "
1358 			"HW is in unrecoverable critical error state.\n");
1359 		return ENOENT;
1360 	}
1361 	mtx_lock_spin(&sc->ioctl_lock);
1362 	if (!sc->reset_in_progress) {
1363 		mtx_unlock_spin(&sc->ioctl_lock);
1364 		goto do_ioctl;
1365 	}
1366 	mtx_unlock_spin(&sc->ioctl_lock);
1367 	while (sc->reset_in_progress) {
1368 		i++;
1369 		if (!(i % MRSAS_RESET_NOTICE_INTERVAL)) {
1370 			mrsas_dprint(sc, MRSAS_INFO,
1371 			    "[%2d]waiting for OCR to be finished from %s\n", i, __func__);
1372 		}
1373 		pause("mr_ioctl", hz);
1374 	}
1375 
1376 do_ioctl:
1377 	switch (cmd) {
1378 	case MRSAS_IOC_FIRMWARE_PASS_THROUGH64:
1379 #ifdef COMPAT_FREEBSD32
1380 	case MRSAS_IOC_FIRMWARE_PASS_THROUGH32:
1381 #endif
1382 		/*
1383 		 * Decrement the Ioctl counting Semaphore before getting an
1384 		 * mfi command
1385 		 */
1386 		sema_wait(&sc->ioctl_count_sema);
1387 
1388 		ret = mrsas_passthru(sc, (void *)arg, cmd);
1389 
1390 		/* Increment the Ioctl counting semaphore value */
1391 		sema_post(&sc->ioctl_count_sema);
1392 
1393 		break;
1394 	case MRSAS_IOC_SCAN_BUS:
1395 		ret = mrsas_bus_scan(sc);
1396 		break;
1397 
1398 	case MRSAS_IOC_GET_PCI_INFO:
1399 		pciDrvInfo = (MRSAS_DRV_PCI_INFORMATION *) arg;
1400 		memset(pciDrvInfo, 0, sizeof(MRSAS_DRV_PCI_INFORMATION));
1401 		pciDrvInfo->busNumber = pci_get_bus(sc->mrsas_dev);
1402 		pciDrvInfo->deviceNumber = pci_get_slot(sc->mrsas_dev);
1403 		pciDrvInfo->functionNumber = pci_get_function(sc->mrsas_dev);
1404 		pciDrvInfo->domainID = pci_get_domain(sc->mrsas_dev);
1405 		mrsas_dprint(sc, MRSAS_INFO, "pci bus no: %d,"
1406 		    "pci device no: %d, pci function no: %d,"
1407 		    "pci domain ID: %d\n",
1408 		    pciDrvInfo->busNumber, pciDrvInfo->deviceNumber,
1409 		    pciDrvInfo->functionNumber, pciDrvInfo->domainID);
1410 		ret = 0;
1411 		break;
1412 
1413 	default:
1414 		mrsas_dprint(sc, MRSAS_TRACE, "IOCTL command 0x%lx is not handled\n", cmd);
1415 		ret = ENOENT;
1416 	}
1417 
1418 	return (ret);
1419 }
1420 
1421 /*
1422  * mrsas_poll:	poll entry point for mrsas driver fd
1423  *
1424  * This function is the entry point for poll from the OS.  It waits for some AEN
1425  * events to be triggered from the controller and notifies back.
1426  */
1427 static int
1428 mrsas_poll(struct cdev *dev, int poll_events, struct thread *td)
1429 {
1430 	struct mrsas_softc *sc;
1431 	int revents = 0;
1432 
1433 	sc = dev->si_drv1;
1434 
1435 	if (poll_events & (POLLIN | POLLRDNORM)) {
1436 		if (sc->mrsas_aen_triggered) {
1437 			revents |= poll_events & (POLLIN | POLLRDNORM);
1438 		}
1439 	}
1440 	if (revents == 0) {
1441 		if (poll_events & (POLLIN | POLLRDNORM)) {
1442 			mtx_lock(&sc->aen_lock);
1443 			sc->mrsas_poll_waiting = 1;
1444 			selrecord(td, &sc->mrsas_select);
1445 			mtx_unlock(&sc->aen_lock);
1446 		}
1447 	}
1448 	return revents;
1449 }
1450 
1451 /*
1452  * mrsas_setup_irq:	Set up interrupt
1453  * input:			Adapter instance soft state
1454  *
1455  * This function sets up interrupts as a bus resource, with flags indicating
1456  * resource permitting contemporaneous sharing and for resource to activate
1457  * atomically.
1458  */
1459 static int
1460 mrsas_setup_irq(struct mrsas_softc *sc)
1461 {
1462 	if (sc->msix_enable && (mrsas_setup_msix(sc) == SUCCESS))
1463 		device_printf(sc->mrsas_dev, "MSI-x interrupts setup success\n");
1464 
1465 	else {
1466 		device_printf(sc->mrsas_dev, "Fall back to legacy interrupt\n");
1467 		sc->irq_context[0].sc = sc;
1468 		sc->irq_context[0].MSIxIndex = 0;
1469 		sc->irq_id[0] = 0;
1470 		sc->mrsas_irq[0] = bus_alloc_resource_any(sc->mrsas_dev,
1471 		    SYS_RES_IRQ, &sc->irq_id[0], RF_SHAREABLE | RF_ACTIVE);
1472 		if (sc->mrsas_irq[0] == NULL) {
1473 			device_printf(sc->mrsas_dev, "Cannot allocate legcay"
1474 			    "interrupt\n");
1475 			return (FAIL);
1476 		}
1477 		if (bus_setup_intr(sc->mrsas_dev, sc->mrsas_irq[0],
1478 		    INTR_MPSAFE | INTR_TYPE_CAM, NULL, mrsas_isr,
1479 		    &sc->irq_context[0], &sc->intr_handle[0])) {
1480 			device_printf(sc->mrsas_dev, "Cannot set up legacy"
1481 			    "interrupt\n");
1482 			return (FAIL);
1483 		}
1484 	}
1485 	return (0);
1486 }
1487 
1488 /*
1489  * mrsas_isr:	ISR entry point
1490  * input:		argument pointer
1491  *
1492  * This function is the interrupt service routine entry point.  There are two
1493  * types of interrupts, state change interrupt and response interrupt.  If an
1494  * interrupt is not ours, we just return.
1495  */
1496 void
1497 mrsas_isr(void *arg)
1498 {
1499 	struct mrsas_irq_context *irq_context = (struct mrsas_irq_context *)arg;
1500 	struct mrsas_softc *sc = irq_context->sc;
1501 	int status = 0;
1502 
1503 	if (sc->mask_interrupts)
1504 		return;
1505 
1506 	if (!sc->msix_vectors) {
1507 		status = mrsas_clear_intr(sc);
1508 		if (!status)
1509 			return;
1510 	}
1511 	/* If we are resetting, bail */
1512 	if (mrsas_test_bit(MRSAS_FUSION_IN_RESET, &sc->reset_flags)) {
1513 		printf(" Entered into ISR when OCR is going active. \n");
1514 		mrsas_clear_intr(sc);
1515 		return;
1516 	}
1517 	/* Process for reply request and clear response interrupt */
1518 	if (mrsas_complete_cmd(sc, irq_context->MSIxIndex) != SUCCESS)
1519 		mrsas_clear_intr(sc);
1520 
1521 	return;
1522 }
1523 
1524 /*
1525  * mrsas_complete_cmd:	Process reply request
1526  * input:				Adapter instance soft state
1527  *
1528  * This function is called from mrsas_isr() to process reply request and clear
1529  * response interrupt. Processing of the reply request entails walking
1530  * through the reply descriptor array for the command request  pended from
1531  * Firmware.  We look at the Function field to determine the command type and
1532  * perform the appropriate action.  Before we return, we clear the response
1533  * interrupt.
1534  */
1535 int
1536 mrsas_complete_cmd(struct mrsas_softc *sc, u_int32_t MSIxIndex)
1537 {
1538 	Mpi2ReplyDescriptorsUnion_t *desc;
1539 	MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR *reply_desc;
1540 	MRSAS_RAID_SCSI_IO_REQUEST *scsi_io_req;
1541 	struct mrsas_mpt_cmd *cmd_mpt;
1542 	struct mrsas_mfi_cmd *cmd_mfi;
1543 	u_int8_t reply_descript_type;
1544 	u_int16_t smid, num_completed;
1545 	u_int8_t status, extStatus;
1546 	union desc_value desc_val;
1547 	PLD_LOAD_BALANCE_INFO lbinfo;
1548 	u_int32_t device_id;
1549 	int threshold_reply_count = 0;
1550 #if TM_DEBUG
1551 	MR_TASK_MANAGE_REQUEST *mr_tm_req;
1552 	MPI2_SCSI_TASK_MANAGE_REQUEST *mpi_tm_req;
1553 #endif
1554 
1555 	/* If we have a hardware error, not need to continue */
1556 	if (sc->adprecovery == MRSAS_HW_CRITICAL_ERROR)
1557 		return (DONE);
1558 
1559 	desc = sc->reply_desc_mem;
1560 	desc += ((MSIxIndex * sc->reply_alloc_sz) / sizeof(MPI2_REPLY_DESCRIPTORS_UNION))
1561 	    + sc->last_reply_idx[MSIxIndex];
1562 
1563 	reply_desc = (MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR *) desc;
1564 
1565 	desc_val.word = desc->Words;
1566 	num_completed = 0;
1567 
1568 	reply_descript_type = reply_desc->ReplyFlags & MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK;
1569 
1570 	/* Find our reply descriptor for the command and process */
1571 	while ((desc_val.u.low != 0xFFFFFFFF) && (desc_val.u.high != 0xFFFFFFFF)) {
1572 		smid = reply_desc->SMID;
1573 		cmd_mpt = sc->mpt_cmd_list[smid - 1];
1574 		scsi_io_req = (MRSAS_RAID_SCSI_IO_REQUEST *) cmd_mpt->io_request;
1575 
1576 		status = scsi_io_req->RaidContext.status;
1577 		extStatus = scsi_io_req->RaidContext.exStatus;
1578 
1579 		switch (scsi_io_req->Function) {
1580 		case MPI2_FUNCTION_SCSI_TASK_MGMT:
1581 #if TM_DEBUG
1582 			mr_tm_req = (MR_TASK_MANAGE_REQUEST *) cmd_mpt->io_request;
1583 			mpi_tm_req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)
1584 			    &mr_tm_req->TmRequest;
1585 			device_printf(sc->mrsas_dev, "TM completion type 0x%X, "
1586 			    "TaskMID: 0x%X", mpi_tm_req->TaskType, mpi_tm_req->TaskMID);
1587 #endif
1588             wakeup_one((void *)&sc->ocr_chan);
1589             break;
1590 		case MPI2_FUNCTION_SCSI_IO_REQUEST:	/* Fast Path IO. */
1591 			device_id = cmd_mpt->ccb_ptr->ccb_h.target_id;
1592 			lbinfo = &sc->load_balance_info[device_id];
1593 			if (cmd_mpt->load_balance == MRSAS_LOAD_BALANCE_FLAG) {
1594 				mrsas_atomic_dec(&lbinfo->scsi_pending_cmds[cmd_mpt->pd_r1_lb]);
1595 				cmd_mpt->load_balance &= ~MRSAS_LOAD_BALANCE_FLAG;
1596 			}
1597 			/* Fall thru and complete IO */
1598 		case MRSAS_MPI2_FUNCTION_LD_IO_REQUEST:
1599 			mrsas_map_mpt_cmd_status(cmd_mpt, status, extStatus);
1600 			mrsas_cmd_done(sc, cmd_mpt);
1601 			scsi_io_req->RaidContext.status = 0;
1602 			scsi_io_req->RaidContext.exStatus = 0;
1603 			mrsas_atomic_dec(&sc->fw_outstanding);
1604 			break;
1605 		case MRSAS_MPI2_FUNCTION_PASSTHRU_IO_REQUEST:	/* MFI command */
1606 			cmd_mfi = sc->mfi_cmd_list[cmd_mpt->sync_cmd_idx];
1607 			/*
1608 			 * Make sure NOT TO release the mfi command from the called
1609 			 * function's context if it is fired with issue_polled call.
1610 			 * And also make sure that the issue_polled call should only be
1611 			 * used if INTERRUPT IS DISABLED.
1612 			 */
1613 			if (cmd_mfi->frame->hdr.flags & MFI_FRAME_DONT_POST_IN_REPLY_QUEUE)
1614 				mrsas_release_mfi_cmd(cmd_mfi);
1615 			else
1616 				mrsas_complete_mptmfi_passthru(sc, cmd_mfi, status);
1617 			break;
1618 		}
1619 
1620 		sc->last_reply_idx[MSIxIndex]++;
1621 		if (sc->last_reply_idx[MSIxIndex] >= sc->reply_q_depth)
1622 			sc->last_reply_idx[MSIxIndex] = 0;
1623 
1624 		desc->Words = ~((uint64_t)0x00);	/* set it back to all
1625 							 * 0xFFFFFFFFs */
1626 		num_completed++;
1627 		threshold_reply_count++;
1628 
1629 		/* Get the next reply descriptor */
1630 		if (!sc->last_reply_idx[MSIxIndex]) {
1631 			desc = sc->reply_desc_mem;
1632 			desc += ((MSIxIndex * sc->reply_alloc_sz) / sizeof(MPI2_REPLY_DESCRIPTORS_UNION));
1633 		} else
1634 			desc++;
1635 
1636 		reply_desc = (MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR *) desc;
1637 		desc_val.word = desc->Words;
1638 
1639 		reply_descript_type = reply_desc->ReplyFlags & MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK;
1640 
1641 		if (reply_descript_type == MPI2_RPY_DESCRIPT_FLAGS_UNUSED)
1642 			break;
1643 
1644 		/*
1645 		 * Write to reply post index after completing threshold reply
1646 		 * count and still there are more replies in reply queue
1647 		 * pending to be completed.
1648 		 */
1649 		if (threshold_reply_count >= THRESHOLD_REPLY_COUNT) {
1650 			if (sc->msix_enable) {
1651 				if (sc->mrsas_gen3_ctrl)
1652 					mrsas_write_reg(sc, sc->msix_reg_offset[MSIxIndex / 8],
1653 					    ((MSIxIndex & 0x7) << 24) |
1654 					    sc->last_reply_idx[MSIxIndex]);
1655 				else
1656 					mrsas_write_reg(sc, sc->msix_reg_offset[0], (MSIxIndex << 24) |
1657 					    sc->last_reply_idx[MSIxIndex]);
1658 			} else
1659 				mrsas_write_reg(sc, offsetof(mrsas_reg_set,
1660 				    reply_post_host_index), sc->last_reply_idx[0]);
1661 
1662 			threshold_reply_count = 0;
1663 		}
1664 	}
1665 
1666 	/* No match, just return */
1667 	if (num_completed == 0)
1668 		return (DONE);
1669 
1670 	/* Clear response interrupt */
1671 	if (sc->msix_enable) {
1672 			if (sc->mrsas_gen3_ctrl) {
1673 			mrsas_write_reg(sc, sc->msix_reg_offset[MSIxIndex / 8],
1674 			    ((MSIxIndex & 0x7) << 24) |
1675 			    sc->last_reply_idx[MSIxIndex]);
1676 		} else
1677 			mrsas_write_reg(sc, sc->msix_reg_offset[0], (MSIxIndex << 24) |
1678 			    sc->last_reply_idx[MSIxIndex]);
1679 	} else
1680 		mrsas_write_reg(sc, offsetof(mrsas_reg_set,
1681 		    reply_post_host_index), sc->last_reply_idx[0]);
1682 
1683 	return (0);
1684 }
1685 
1686 /*
1687  * mrsas_map_mpt_cmd_status:	Allocate DMAable memory.
1688  * input:						Adapter instance soft state
1689  *
1690  * This function is called from mrsas_complete_cmd(), for LD IO and FastPath IO.
1691  * It checks the command status and maps the appropriate CAM status for the
1692  * CCB.
1693  */
1694 void
1695 mrsas_map_mpt_cmd_status(struct mrsas_mpt_cmd *cmd, u_int8_t status, u_int8_t extStatus)
1696 {
1697 	struct mrsas_softc *sc = cmd->sc;
1698 	u_int8_t *sense_data;
1699 
1700 	switch (status) {
1701 	case MFI_STAT_OK:
1702 		cmd->ccb_ptr->ccb_h.status = CAM_REQ_CMP;
1703 		break;
1704 	case MFI_STAT_SCSI_IO_FAILED:
1705 	case MFI_STAT_SCSI_DONE_WITH_ERROR:
1706 		cmd->ccb_ptr->ccb_h.status = CAM_SCSI_STATUS_ERROR;
1707 		sense_data = (u_int8_t *)&cmd->ccb_ptr->csio.sense_data;
1708 		if (sense_data) {
1709 			/* For now just copy 18 bytes back */
1710 			memcpy(sense_data, cmd->sense, 18);
1711 			cmd->ccb_ptr->csio.sense_len = 18;
1712 			cmd->ccb_ptr->ccb_h.status |= CAM_AUTOSNS_VALID;
1713 		}
1714 		break;
1715 	case MFI_STAT_LD_OFFLINE:
1716 	case MFI_STAT_DEVICE_NOT_FOUND:
1717 		if (cmd->ccb_ptr->ccb_h.target_lun)
1718 			cmd->ccb_ptr->ccb_h.status |= CAM_LUN_INVALID;
1719 		else
1720 			cmd->ccb_ptr->ccb_h.status |= CAM_DEV_NOT_THERE;
1721 		break;
1722 	case MFI_STAT_CONFIG_SEQ_MISMATCH:
1723 		cmd->ccb_ptr->ccb_h.status |= CAM_REQUEUE_REQ;
1724 		break;
1725 	default:
1726 		device_printf(sc->mrsas_dev, "FW cmd complete status %x\n", status);
1727 		cmd->ccb_ptr->ccb_h.status = CAM_REQ_CMP_ERR;
1728 		cmd->ccb_ptr->csio.scsi_status = status;
1729 	}
1730 	return;
1731 }
1732 
1733 /*
1734  * mrsas_alloc_mem:	Allocate DMAable memory
1735  * input:			Adapter instance soft state
1736  *
1737  * This function creates the parent DMA tag and allocates DMAable memory. DMA
1738  * tag describes constraints of DMA mapping. Memory allocated is mapped into
1739  * Kernel virtual address. Callback argument is physical memory address.
1740  */
1741 static int
1742 mrsas_alloc_mem(struct mrsas_softc *sc)
1743 {
1744 	u_int32_t verbuf_size, io_req_size, reply_desc_size, sense_size,
1745 	          chain_frame_size, evt_detail_size, count;
1746 
1747 	/*
1748 	 * Allocate parent DMA tag
1749 	 */
1750 	if (bus_dma_tag_create(NULL,	/* parent */
1751 	    1,				/* alignment */
1752 	    0,				/* boundary */
1753 	    BUS_SPACE_MAXADDR,		/* lowaddr */
1754 	    BUS_SPACE_MAXADDR,		/* highaddr */
1755 	    NULL, NULL,			/* filter, filterarg */
1756 	    MAXPHYS,			/* maxsize */
1757 	    sc->max_num_sge,		/* nsegments */
1758 	    MAXPHYS,			/* maxsegsize */
1759 	    0,				/* flags */
1760 	    NULL, NULL,			/* lockfunc, lockarg */
1761 	    &sc->mrsas_parent_tag	/* tag */
1762 	    )) {
1763 		device_printf(sc->mrsas_dev, "Cannot allocate parent DMA tag\n");
1764 		return (ENOMEM);
1765 	}
1766 	/*
1767 	 * Allocate for version buffer
1768 	 */
1769 	verbuf_size = MRSAS_MAX_NAME_LENGTH * (sizeof(bus_addr_t));
1770 	if (bus_dma_tag_create(sc->mrsas_parent_tag,
1771 	    1, 0,
1772 	    BUS_SPACE_MAXADDR_32BIT,
1773 	    BUS_SPACE_MAXADDR,
1774 	    NULL, NULL,
1775 	    verbuf_size,
1776 	    1,
1777 	    verbuf_size,
1778 	    BUS_DMA_ALLOCNOW,
1779 	    NULL, NULL,
1780 	    &sc->verbuf_tag)) {
1781 		device_printf(sc->mrsas_dev, "Cannot allocate verbuf DMA tag\n");
1782 		return (ENOMEM);
1783 	}
1784 	if (bus_dmamem_alloc(sc->verbuf_tag, (void **)&sc->verbuf_mem,
1785 	    BUS_DMA_NOWAIT, &sc->verbuf_dmamap)) {
1786 		device_printf(sc->mrsas_dev, "Cannot allocate verbuf memory\n");
1787 		return (ENOMEM);
1788 	}
1789 	bzero(sc->verbuf_mem, verbuf_size);
1790 	if (bus_dmamap_load(sc->verbuf_tag, sc->verbuf_dmamap, sc->verbuf_mem,
1791 	    verbuf_size, mrsas_addr_cb, &sc->verbuf_phys_addr,
1792 	    BUS_DMA_NOWAIT)) {
1793 		device_printf(sc->mrsas_dev, "Cannot load verbuf DMA map\n");
1794 		return (ENOMEM);
1795 	}
1796 	/*
1797 	 * Allocate IO Request Frames
1798 	 */
1799 	io_req_size = sc->io_frames_alloc_sz;
1800 	if (bus_dma_tag_create(sc->mrsas_parent_tag,
1801 	    16, 0,
1802 	    BUS_SPACE_MAXADDR_32BIT,
1803 	    BUS_SPACE_MAXADDR,
1804 	    NULL, NULL,
1805 	    io_req_size,
1806 	    1,
1807 	    io_req_size,
1808 	    BUS_DMA_ALLOCNOW,
1809 	    NULL, NULL,
1810 	    &sc->io_request_tag)) {
1811 		device_printf(sc->mrsas_dev, "Cannot create IO request tag\n");
1812 		return (ENOMEM);
1813 	}
1814 	if (bus_dmamem_alloc(sc->io_request_tag, (void **)&sc->io_request_mem,
1815 	    BUS_DMA_NOWAIT, &sc->io_request_dmamap)) {
1816 		device_printf(sc->mrsas_dev, "Cannot alloc IO request memory\n");
1817 		return (ENOMEM);
1818 	}
1819 	bzero(sc->io_request_mem, io_req_size);
1820 	if (bus_dmamap_load(sc->io_request_tag, sc->io_request_dmamap,
1821 	    sc->io_request_mem, io_req_size, mrsas_addr_cb,
1822 	    &sc->io_request_phys_addr, BUS_DMA_NOWAIT)) {
1823 		device_printf(sc->mrsas_dev, "Cannot load IO request memory\n");
1824 		return (ENOMEM);
1825 	}
1826 	/*
1827 	 * Allocate Chain Frames
1828 	 */
1829 	chain_frame_size = sc->chain_frames_alloc_sz;
1830 	if (bus_dma_tag_create(sc->mrsas_parent_tag,
1831 	    4, 0,
1832 	    BUS_SPACE_MAXADDR_32BIT,
1833 	    BUS_SPACE_MAXADDR,
1834 	    NULL, NULL,
1835 	    chain_frame_size,
1836 	    1,
1837 	    chain_frame_size,
1838 	    BUS_DMA_ALLOCNOW,
1839 	    NULL, NULL,
1840 	    &sc->chain_frame_tag)) {
1841 		device_printf(sc->mrsas_dev, "Cannot create chain frame tag\n");
1842 		return (ENOMEM);
1843 	}
1844 	if (bus_dmamem_alloc(sc->chain_frame_tag, (void **)&sc->chain_frame_mem,
1845 	    BUS_DMA_NOWAIT, &sc->chain_frame_dmamap)) {
1846 		device_printf(sc->mrsas_dev, "Cannot alloc chain frame memory\n");
1847 		return (ENOMEM);
1848 	}
1849 	bzero(sc->chain_frame_mem, chain_frame_size);
1850 	if (bus_dmamap_load(sc->chain_frame_tag, sc->chain_frame_dmamap,
1851 	    sc->chain_frame_mem, chain_frame_size, mrsas_addr_cb,
1852 	    &sc->chain_frame_phys_addr, BUS_DMA_NOWAIT)) {
1853 		device_printf(sc->mrsas_dev, "Cannot load chain frame memory\n");
1854 		return (ENOMEM);
1855 	}
1856 	count = sc->msix_vectors > 0 ? sc->msix_vectors : 1;
1857 	/*
1858 	 * Allocate Reply Descriptor Array
1859 	 */
1860 	reply_desc_size = sc->reply_alloc_sz * count;
1861 	if (bus_dma_tag_create(sc->mrsas_parent_tag,
1862 	    16, 0,
1863 	    BUS_SPACE_MAXADDR_32BIT,
1864 	    BUS_SPACE_MAXADDR,
1865 	    NULL, NULL,
1866 	    reply_desc_size,
1867 	    1,
1868 	    reply_desc_size,
1869 	    BUS_DMA_ALLOCNOW,
1870 	    NULL, NULL,
1871 	    &sc->reply_desc_tag)) {
1872 		device_printf(sc->mrsas_dev, "Cannot create reply descriptor tag\n");
1873 		return (ENOMEM);
1874 	}
1875 	if (bus_dmamem_alloc(sc->reply_desc_tag, (void **)&sc->reply_desc_mem,
1876 	    BUS_DMA_NOWAIT, &sc->reply_desc_dmamap)) {
1877 		device_printf(sc->mrsas_dev, "Cannot alloc reply descriptor memory\n");
1878 		return (ENOMEM);
1879 	}
1880 	if (bus_dmamap_load(sc->reply_desc_tag, sc->reply_desc_dmamap,
1881 	    sc->reply_desc_mem, reply_desc_size, mrsas_addr_cb,
1882 	    &sc->reply_desc_phys_addr, BUS_DMA_NOWAIT)) {
1883 		device_printf(sc->mrsas_dev, "Cannot load reply descriptor memory\n");
1884 		return (ENOMEM);
1885 	}
1886 	/*
1887 	 * Allocate Sense Buffer Array.  Keep in lower 4GB
1888 	 */
1889 	sense_size = sc->max_fw_cmds * MRSAS_SENSE_LEN;
1890 	if (bus_dma_tag_create(sc->mrsas_parent_tag,
1891 	    64, 0,
1892 	    BUS_SPACE_MAXADDR_32BIT,
1893 	    BUS_SPACE_MAXADDR,
1894 	    NULL, NULL,
1895 	    sense_size,
1896 	    1,
1897 	    sense_size,
1898 	    BUS_DMA_ALLOCNOW,
1899 	    NULL, NULL,
1900 	    &sc->sense_tag)) {
1901 		device_printf(sc->mrsas_dev, "Cannot allocate sense buf tag\n");
1902 		return (ENOMEM);
1903 	}
1904 	if (bus_dmamem_alloc(sc->sense_tag, (void **)&sc->sense_mem,
1905 	    BUS_DMA_NOWAIT, &sc->sense_dmamap)) {
1906 		device_printf(sc->mrsas_dev, "Cannot allocate sense buf memory\n");
1907 		return (ENOMEM);
1908 	}
1909 	if (bus_dmamap_load(sc->sense_tag, sc->sense_dmamap,
1910 	    sc->sense_mem, sense_size, mrsas_addr_cb, &sc->sense_phys_addr,
1911 	    BUS_DMA_NOWAIT)) {
1912 		device_printf(sc->mrsas_dev, "Cannot load sense buf memory\n");
1913 		return (ENOMEM);
1914 	}
1915 	/*
1916 	 * Allocate for Event detail structure
1917 	 */
1918 	evt_detail_size = sizeof(struct mrsas_evt_detail);
1919 	if (bus_dma_tag_create(sc->mrsas_parent_tag,
1920 	    1, 0,
1921 	    BUS_SPACE_MAXADDR_32BIT,
1922 	    BUS_SPACE_MAXADDR,
1923 	    NULL, NULL,
1924 	    evt_detail_size,
1925 	    1,
1926 	    evt_detail_size,
1927 	    BUS_DMA_ALLOCNOW,
1928 	    NULL, NULL,
1929 	    &sc->evt_detail_tag)) {
1930 		device_printf(sc->mrsas_dev, "Cannot create Event detail tag\n");
1931 		return (ENOMEM);
1932 	}
1933 	if (bus_dmamem_alloc(sc->evt_detail_tag, (void **)&sc->evt_detail_mem,
1934 	    BUS_DMA_NOWAIT, &sc->evt_detail_dmamap)) {
1935 		device_printf(sc->mrsas_dev, "Cannot alloc Event detail buffer memory\n");
1936 		return (ENOMEM);
1937 	}
1938 	bzero(sc->evt_detail_mem, evt_detail_size);
1939 	if (bus_dmamap_load(sc->evt_detail_tag, sc->evt_detail_dmamap,
1940 	    sc->evt_detail_mem, evt_detail_size, mrsas_addr_cb,
1941 	    &sc->evt_detail_phys_addr, BUS_DMA_NOWAIT)) {
1942 		device_printf(sc->mrsas_dev, "Cannot load Event detail buffer memory\n");
1943 		return (ENOMEM);
1944 	}
1945 	/*
1946 	 * Create a dma tag for data buffers; size will be the maximum
1947 	 * possible I/O size (280kB).
1948 	 */
1949 	if (bus_dma_tag_create(sc->mrsas_parent_tag,
1950 	    1,
1951 	    0,
1952 	    BUS_SPACE_MAXADDR,
1953 	    BUS_SPACE_MAXADDR,
1954 	    NULL, NULL,
1955 	    MAXPHYS,
1956 	    sc->max_num_sge,		/* nsegments */
1957 	    MAXPHYS,
1958 	    BUS_DMA_ALLOCNOW,
1959 	    busdma_lock_mutex,
1960 	    &sc->io_lock,
1961 	    &sc->data_tag)) {
1962 		device_printf(sc->mrsas_dev, "Cannot create data dma tag\n");
1963 		return (ENOMEM);
1964 	}
1965 	return (0);
1966 }
1967 
1968 /*
1969  * mrsas_addr_cb:	Callback function of bus_dmamap_load()
1970  * input:			callback argument, machine dependent type
1971  * 					that describes DMA segments, number of segments, error code
1972  *
1973  * This function is for the driver to receive mapping information resultant of
1974  * the bus_dmamap_load(). The information is actually not being used, but the
1975  * address is saved anyway.
1976  */
1977 void
1978 mrsas_addr_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
1979 {
1980 	bus_addr_t *addr;
1981 
1982 	addr = arg;
1983 	*addr = segs[0].ds_addr;
1984 }
1985 
1986 /*
1987  * mrsas_setup_raidmap:	Set up RAID map.
1988  * input:				Adapter instance soft state
1989  *
1990  * Allocate DMA memory for the RAID maps and perform setup.
1991  */
1992 static int
1993 mrsas_setup_raidmap(struct mrsas_softc *sc)
1994 {
1995 	int i;
1996 
1997 	for (i = 0; i < 2; i++) {
1998 		sc->ld_drv_map[i] =
1999 		    (void *)malloc(sc->drv_map_sz, M_MRSAS, M_NOWAIT);
2000 		/* Do Error handling */
2001 		if (!sc->ld_drv_map[i]) {
2002 			device_printf(sc->mrsas_dev, "Could not allocate memory for local map");
2003 
2004 			if (i == 1)
2005 				free(sc->ld_drv_map[0], M_MRSAS);
2006 			/* ABORT driver initialization */
2007 			goto ABORT;
2008 		}
2009 	}
2010 
2011 	for (int i = 0; i < 2; i++) {
2012 		if (bus_dma_tag_create(sc->mrsas_parent_tag,
2013 		    4, 0,
2014 		    BUS_SPACE_MAXADDR_32BIT,
2015 		    BUS_SPACE_MAXADDR,
2016 		    NULL, NULL,
2017 		    sc->max_map_sz,
2018 		    1,
2019 		    sc->max_map_sz,
2020 		    BUS_DMA_ALLOCNOW,
2021 		    NULL, NULL,
2022 		    &sc->raidmap_tag[i])) {
2023 			device_printf(sc->mrsas_dev,
2024 			    "Cannot allocate raid map tag.\n");
2025 			return (ENOMEM);
2026 		}
2027 		if (bus_dmamem_alloc(sc->raidmap_tag[i],
2028 		    (void **)&sc->raidmap_mem[i],
2029 		    BUS_DMA_NOWAIT, &sc->raidmap_dmamap[i])) {
2030 			device_printf(sc->mrsas_dev,
2031 			    "Cannot allocate raidmap memory.\n");
2032 			return (ENOMEM);
2033 		}
2034 		bzero(sc->raidmap_mem[i], sc->max_map_sz);
2035 
2036 		if (bus_dmamap_load(sc->raidmap_tag[i], sc->raidmap_dmamap[i],
2037 		    sc->raidmap_mem[i], sc->max_map_sz,
2038 		    mrsas_addr_cb, &sc->raidmap_phys_addr[i],
2039 		    BUS_DMA_NOWAIT)) {
2040 			device_printf(sc->mrsas_dev, "Cannot load raidmap memory.\n");
2041 			return (ENOMEM);
2042 		}
2043 		if (!sc->raidmap_mem[i]) {
2044 			device_printf(sc->mrsas_dev,
2045 			    "Cannot allocate memory for raid map.\n");
2046 			return (ENOMEM);
2047 		}
2048 	}
2049 
2050 	if (!mrsas_get_map_info(sc))
2051 		mrsas_sync_map_info(sc);
2052 
2053 	return (0);
2054 
2055 ABORT:
2056 	return (1);
2057 }
2058 
2059 /**
2060  * megasas_setup_jbod_map -	setup jbod map for FP seq_number.
2061  * @sc:				Adapter soft state
2062  *
2063  * Return 0 on success.
2064  */
2065 void
2066 megasas_setup_jbod_map(struct mrsas_softc *sc)
2067 {
2068 	int i;
2069 	uint32_t pd_seq_map_sz;
2070 
2071 	pd_seq_map_sz = sizeof(struct MR_PD_CFG_SEQ_NUM_SYNC) +
2072 	    (sizeof(struct MR_PD_CFG_SEQ) * (MAX_PHYSICAL_DEVICES - 1));
2073 
2074 	if (!sc->ctrl_info->adapterOperations3.useSeqNumJbodFP) {
2075 		sc->use_seqnum_jbod_fp = 0;
2076 		return;
2077 	}
2078 	if (sc->jbodmap_mem[0])
2079 		goto skip_alloc;
2080 
2081 	for (i = 0; i < 2; i++) {
2082 		if (bus_dma_tag_create(sc->mrsas_parent_tag,
2083 		    4, 0,
2084 		    BUS_SPACE_MAXADDR_32BIT,
2085 		    BUS_SPACE_MAXADDR,
2086 		    NULL, NULL,
2087 		    pd_seq_map_sz,
2088 		    1,
2089 		    pd_seq_map_sz,
2090 		    BUS_DMA_ALLOCNOW,
2091 		    NULL, NULL,
2092 		    &sc->jbodmap_tag[i])) {
2093 			device_printf(sc->mrsas_dev,
2094 			    "Cannot allocate jbod map tag.\n");
2095 			return;
2096 		}
2097 		if (bus_dmamem_alloc(sc->jbodmap_tag[i],
2098 		    (void **)&sc->jbodmap_mem[i],
2099 		    BUS_DMA_NOWAIT, &sc->jbodmap_dmamap[i])) {
2100 			device_printf(sc->mrsas_dev,
2101 			    "Cannot allocate jbod map memory.\n");
2102 			return;
2103 		}
2104 		bzero(sc->jbodmap_mem[i], pd_seq_map_sz);
2105 
2106 		if (bus_dmamap_load(sc->jbodmap_tag[i], sc->jbodmap_dmamap[i],
2107 		    sc->jbodmap_mem[i], pd_seq_map_sz,
2108 		    mrsas_addr_cb, &sc->jbodmap_phys_addr[i],
2109 		    BUS_DMA_NOWAIT)) {
2110 			device_printf(sc->mrsas_dev, "Cannot load jbod map memory.\n");
2111 			return;
2112 		}
2113 		if (!sc->jbodmap_mem[i]) {
2114 			device_printf(sc->mrsas_dev,
2115 			    "Cannot allocate memory for jbod map.\n");
2116 			sc->use_seqnum_jbod_fp = 0;
2117 			return;
2118 		}
2119 	}
2120 
2121 skip_alloc:
2122 	if (!megasas_sync_pd_seq_num(sc, false) &&
2123 	    !megasas_sync_pd_seq_num(sc, true))
2124 		sc->use_seqnum_jbod_fp = 1;
2125 	else
2126 		sc->use_seqnum_jbod_fp = 0;
2127 
2128 	device_printf(sc->mrsas_dev, "Jbod map is supported\n");
2129 }
2130 
2131 /*
2132  * mrsas_init_fw:	Initialize Firmware
2133  * input:			Adapter soft state
2134  *
2135  * Calls transition_to_ready() to make sure Firmware is in operational state and
2136  * calls mrsas_init_adapter() to send IOC_INIT command to Firmware.  It
2137  * issues internal commands to get the controller info after the IOC_INIT
2138  * command response is received by Firmware.  Note:  code relating to
2139  * get_pdlist, get_ld_list and max_sectors are currently not being used, it
2140  * is left here as placeholder.
2141  */
2142 static int
2143 mrsas_init_fw(struct mrsas_softc *sc)
2144 {
2145 
2146 	int ret, loop, ocr = 0;
2147 	u_int32_t max_sectors_1;
2148 	u_int32_t max_sectors_2;
2149 	u_int32_t tmp_sectors;
2150 	u_int32_t scratch_pad_2;
2151 	int msix_enable = 0;
2152 	int fw_msix_count = 0;
2153 
2154 	/* Make sure Firmware is ready */
2155 	ret = mrsas_transition_to_ready(sc, ocr);
2156 	if (ret != SUCCESS) {
2157 		return (ret);
2158 	}
2159 	/* MSI-x index 0- reply post host index register */
2160 	sc->msix_reg_offset[0] = MPI2_REPLY_POST_HOST_INDEX_OFFSET;
2161 	/* Check if MSI-X is supported while in ready state */
2162 	msix_enable = (mrsas_read_reg(sc, offsetof(mrsas_reg_set, outbound_scratch_pad)) & 0x4000000) >> 0x1a;
2163 
2164 	if (msix_enable) {
2165 		scratch_pad_2 = mrsas_read_reg(sc, offsetof(mrsas_reg_set,
2166 		    outbound_scratch_pad_2));
2167 
2168 		/* Check max MSI-X vectors */
2169 		if (sc->device_id == MRSAS_TBOLT) {
2170 			sc->msix_vectors = (scratch_pad_2
2171 			    & MR_MAX_REPLY_QUEUES_OFFSET) + 1;
2172 			fw_msix_count = sc->msix_vectors;
2173 		} else {
2174 			/* Invader/Fury supports 96 MSI-X vectors */
2175 			sc->msix_vectors = ((scratch_pad_2
2176 			    & MR_MAX_REPLY_QUEUES_EXT_OFFSET)
2177 			    >> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
2178 			fw_msix_count = sc->msix_vectors;
2179 
2180 			for (loop = 1; loop < MR_MAX_MSIX_REG_ARRAY;
2181 			    loop++) {
2182 				sc->msix_reg_offset[loop] =
2183 				    MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET +
2184 				    (loop * 0x10);
2185 			}
2186 		}
2187 
2188 		/* Don't bother allocating more MSI-X vectors than cpus */
2189 		sc->msix_vectors = min(sc->msix_vectors,
2190 		    mp_ncpus);
2191 
2192 		/* Allocate MSI-x vectors */
2193 		if (mrsas_allocate_msix(sc) == SUCCESS)
2194 			sc->msix_enable = 1;
2195 		else
2196 			sc->msix_enable = 0;
2197 
2198 		device_printf(sc->mrsas_dev, "FW supports <%d> MSIX vector,"
2199 		    "Online CPU %d Current MSIX <%d>\n",
2200 		    fw_msix_count, mp_ncpus, sc->msix_vectors);
2201 	}
2202 	if (mrsas_init_adapter(sc) != SUCCESS) {
2203 		device_printf(sc->mrsas_dev, "Adapter initialize Fail.\n");
2204 		return (1);
2205 	}
2206 	/* Allocate internal commands for pass-thru */
2207 	if (mrsas_alloc_mfi_cmds(sc) != SUCCESS) {
2208 		device_printf(sc->mrsas_dev, "Allocate MFI cmd failed.\n");
2209 		return (1);
2210 	}
2211 	sc->ctrl_info = malloc(sizeof(struct mrsas_ctrl_info), M_MRSAS, M_NOWAIT);
2212 	if (!sc->ctrl_info) {
2213 		device_printf(sc->mrsas_dev, "Malloc for ctrl_info failed.\n");
2214 		return (1);
2215 	}
2216 	/*
2217 	 * Get the controller info from FW, so that the MAX VD support
2218 	 * availability can be decided.
2219 	 */
2220 	if (mrsas_get_ctrl_info(sc)) {
2221 		device_printf(sc->mrsas_dev, "Unable to get FW ctrl_info.\n");
2222 		return (1);
2223 	}
2224 	sc->secure_jbod_support =
2225 	    (u_int8_t)sc->ctrl_info->adapterOperations3.supportSecurityonJBOD;
2226 
2227 	if (sc->secure_jbod_support)
2228 		device_printf(sc->mrsas_dev, "FW supports SED \n");
2229 
2230 	if (sc->use_seqnum_jbod_fp)
2231 		device_printf(sc->mrsas_dev, "FW supports JBOD Map \n");
2232 
2233 	if (mrsas_setup_raidmap(sc) != SUCCESS) {
2234 		device_printf(sc->mrsas_dev, "Error: RAID map setup FAILED !!! "
2235 		    "There seems to be some problem in the controller\n"
2236 		    "Please contact to the SUPPORT TEAM if the problem persists\n");
2237 	}
2238 	megasas_setup_jbod_map(sc);
2239 
2240 	/* For pass-thru, get PD/LD list and controller info */
2241 	memset(sc->pd_list, 0,
2242 	    MRSAS_MAX_PD * sizeof(struct mrsas_pd_list));
2243 	if (mrsas_get_pd_list(sc) != SUCCESS) {
2244 		device_printf(sc->mrsas_dev, "Get PD list failed.\n");
2245 		return (1);
2246 	}
2247 	memset(sc->ld_ids, 0xff, MRSAS_MAX_LD_IDS);
2248 	if (mrsas_get_ld_list(sc) != SUCCESS) {
2249 		device_printf(sc->mrsas_dev, "Get LD lsit failed.\n");
2250 		return (1);
2251 	}
2252 	/*
2253 	 * Compute the max allowed sectors per IO: The controller info has
2254 	 * two limits on max sectors. Driver should use the minimum of these
2255 	 * two.
2256 	 *
2257 	 * 1 << stripe_sz_ops.min = max sectors per strip
2258 	 *
2259 	 * Note that older firmwares ( < FW ver 30) didn't report information to
2260 	 * calculate max_sectors_1. So the number ended up as zero always.
2261 	 */
2262 	tmp_sectors = 0;
2263 	max_sectors_1 = (1 << sc->ctrl_info->stripe_sz_ops.min) *
2264 	    sc->ctrl_info->max_strips_per_io;
2265 	max_sectors_2 = sc->ctrl_info->max_request_size;
2266 	tmp_sectors = min(max_sectors_1, max_sectors_2);
2267 	sc->max_sectors_per_req = sc->max_num_sge * MRSAS_PAGE_SIZE / 512;
2268 
2269 	if (tmp_sectors && (sc->max_sectors_per_req > tmp_sectors))
2270 		sc->max_sectors_per_req = tmp_sectors;
2271 
2272 	sc->disableOnlineCtrlReset =
2273 	    sc->ctrl_info->properties.OnOffProperties.disableOnlineCtrlReset;
2274 	sc->UnevenSpanSupport =
2275 	    sc->ctrl_info->adapterOperations2.supportUnevenSpans;
2276 	if (sc->UnevenSpanSupport) {
2277 		device_printf(sc->mrsas_dev, "FW supports: UnevenSpanSupport=%x\n\n",
2278 		    sc->UnevenSpanSupport);
2279 
2280 		if (MR_ValidateMapInfo(sc))
2281 			sc->fast_path_io = 1;
2282 		else
2283 			sc->fast_path_io = 0;
2284 	}
2285 	return (0);
2286 }
2287 
2288 /*
2289  * mrsas_init_adapter:	Initializes the adapter/controller
2290  * input:				Adapter soft state
2291  *
2292  * Prepares for the issuing of the IOC Init cmd to FW for initializing the
2293  * ROC/controller.  The FW register is read to determined the number of
2294  * commands that is supported.  All memory allocations for IO is based on
2295  * max_cmd.  Appropriate calculations are performed in this function.
2296  */
2297 int
2298 mrsas_init_adapter(struct mrsas_softc *sc)
2299 {
2300 	uint32_t status;
2301 	u_int32_t max_cmd, scratch_pad_2;
2302 	int ret;
2303 	int i = 0;
2304 
2305 	/* Read FW status register */
2306 	status = mrsas_read_reg(sc, offsetof(mrsas_reg_set, outbound_scratch_pad));
2307 
2308 	/* Get operational params from status register */
2309 	sc->max_fw_cmds = status & MRSAS_FWSTATE_MAXCMD_MASK;
2310 
2311 	/* Decrement the max supported by 1, to correlate with FW */
2312 	sc->max_fw_cmds = sc->max_fw_cmds - 1;
2313 	max_cmd = sc->max_fw_cmds;
2314 
2315 	/* Determine allocation size of command frames */
2316 	sc->reply_q_depth = ((max_cmd + 1 + 15) / 16 * 16) * 2;
2317 	sc->request_alloc_sz = sizeof(MRSAS_REQUEST_DESCRIPTOR_UNION) * max_cmd;
2318 	sc->reply_alloc_sz = sizeof(MPI2_REPLY_DESCRIPTORS_UNION) * (sc->reply_q_depth);
2319 	sc->io_frames_alloc_sz = MRSAS_MPI2_RAID_DEFAULT_IO_FRAME_SIZE + (MRSAS_MPI2_RAID_DEFAULT_IO_FRAME_SIZE * (max_cmd + 1));
2320 	scratch_pad_2 = mrsas_read_reg(sc, offsetof(mrsas_reg_set,
2321 	    outbound_scratch_pad_2));
2322 	/*
2323 	 * If scratch_pad_2 & MEGASAS_MAX_CHAIN_SIZE_UNITS_MASK is set,
2324 	 * Firmware support extended IO chain frame which is 4 time more
2325 	 * than legacy Firmware. Legacy Firmware - Frame size is (8 * 128) =
2326 	 * 1K 1M IO Firmware  - Frame size is (8 * 128 * 4)  = 4K
2327 	 */
2328 	if (scratch_pad_2 & MEGASAS_MAX_CHAIN_SIZE_UNITS_MASK)
2329 		sc->max_chain_frame_sz =
2330 		    ((scratch_pad_2 & MEGASAS_MAX_CHAIN_SIZE_MASK) >> 5)
2331 		    * MEGASAS_1MB_IO;
2332 	else
2333 		sc->max_chain_frame_sz =
2334 		    ((scratch_pad_2 & MEGASAS_MAX_CHAIN_SIZE_MASK) >> 5)
2335 		    * MEGASAS_256K_IO;
2336 
2337 	sc->chain_frames_alloc_sz = sc->max_chain_frame_sz * max_cmd;
2338 	sc->max_sge_in_main_msg = (MRSAS_MPI2_RAID_DEFAULT_IO_FRAME_SIZE -
2339 	    offsetof(MRSAS_RAID_SCSI_IO_REQUEST, SGL)) / 16;
2340 
2341 	sc->max_sge_in_chain = sc->max_chain_frame_sz / sizeof(MPI2_SGE_IO_UNION);
2342 	sc->max_num_sge = sc->max_sge_in_main_msg + sc->max_sge_in_chain - 2;
2343 
2344 	mrsas_dprint(sc, MRSAS_INFO, "Avago Debug: MAX sge 0x%X MAX chain frame size 0x%X \n",
2345 	    sc->max_num_sge, sc->max_chain_frame_sz);
2346 
2347 	/* Used for pass thru MFI frame (DCMD) */
2348 	sc->chain_offset_mfi_pthru = offsetof(MRSAS_RAID_SCSI_IO_REQUEST, SGL) / 16;
2349 
2350 	sc->chain_offset_io_request = (MRSAS_MPI2_RAID_DEFAULT_IO_FRAME_SIZE -
2351 	    sizeof(MPI2_SGE_IO_UNION)) / 16;
2352 
2353 	int count = sc->msix_vectors > 0 ? sc->msix_vectors : 1;
2354 
2355 	for (i = 0; i < count; i++)
2356 		sc->last_reply_idx[i] = 0;
2357 
2358 	ret = mrsas_alloc_mem(sc);
2359 	if (ret != SUCCESS)
2360 		return (ret);
2361 
2362 	ret = mrsas_alloc_mpt_cmds(sc);
2363 	if (ret != SUCCESS)
2364 		return (ret);
2365 
2366 	ret = mrsas_ioc_init(sc);
2367 	if (ret != SUCCESS)
2368 		return (ret);
2369 
2370 	return (0);
2371 }
2372 
2373 /*
2374  * mrsas_alloc_ioc_cmd:	Allocates memory for IOC Init command
2375  * input:				Adapter soft state
2376  *
2377  * Allocates for the IOC Init cmd to FW to initialize the ROC/controller.
2378  */
2379 int
2380 mrsas_alloc_ioc_cmd(struct mrsas_softc *sc)
2381 {
2382 	int ioc_init_size;
2383 
2384 	/* Allocate IOC INIT command */
2385 	ioc_init_size = 1024 + sizeof(MPI2_IOC_INIT_REQUEST);
2386 	if (bus_dma_tag_create(sc->mrsas_parent_tag,
2387 	    1, 0,
2388 	    BUS_SPACE_MAXADDR_32BIT,
2389 	    BUS_SPACE_MAXADDR,
2390 	    NULL, NULL,
2391 	    ioc_init_size,
2392 	    1,
2393 	    ioc_init_size,
2394 	    BUS_DMA_ALLOCNOW,
2395 	    NULL, NULL,
2396 	    &sc->ioc_init_tag)) {
2397 		device_printf(sc->mrsas_dev, "Cannot allocate ioc init tag\n");
2398 		return (ENOMEM);
2399 	}
2400 	if (bus_dmamem_alloc(sc->ioc_init_tag, (void **)&sc->ioc_init_mem,
2401 	    BUS_DMA_NOWAIT, &sc->ioc_init_dmamap)) {
2402 		device_printf(sc->mrsas_dev, "Cannot allocate ioc init cmd mem\n");
2403 		return (ENOMEM);
2404 	}
2405 	bzero(sc->ioc_init_mem, ioc_init_size);
2406 	if (bus_dmamap_load(sc->ioc_init_tag, sc->ioc_init_dmamap,
2407 	    sc->ioc_init_mem, ioc_init_size, mrsas_addr_cb,
2408 	    &sc->ioc_init_phys_mem, BUS_DMA_NOWAIT)) {
2409 		device_printf(sc->mrsas_dev, "Cannot load ioc init cmd mem\n");
2410 		return (ENOMEM);
2411 	}
2412 	return (0);
2413 }
2414 
2415 /*
2416  * mrsas_free_ioc_cmd:	Allocates memory for IOC Init command
2417  * input:				Adapter soft state
2418  *
2419  * Deallocates memory of the IOC Init cmd.
2420  */
2421 void
2422 mrsas_free_ioc_cmd(struct mrsas_softc *sc)
2423 {
2424 	if (sc->ioc_init_phys_mem)
2425 		bus_dmamap_unload(sc->ioc_init_tag, sc->ioc_init_dmamap);
2426 	if (sc->ioc_init_mem != NULL)
2427 		bus_dmamem_free(sc->ioc_init_tag, sc->ioc_init_mem, sc->ioc_init_dmamap);
2428 	if (sc->ioc_init_tag != NULL)
2429 		bus_dma_tag_destroy(sc->ioc_init_tag);
2430 }
2431 
2432 /*
2433  * mrsas_ioc_init:	Sends IOC Init command to FW
2434  * input:			Adapter soft state
2435  *
2436  * Issues the IOC Init cmd to FW to initialize the ROC/controller.
2437  */
2438 int
2439 mrsas_ioc_init(struct mrsas_softc *sc)
2440 {
2441 	struct mrsas_init_frame *init_frame;
2442 	pMpi2IOCInitRequest_t IOCInitMsg;
2443 	MRSAS_REQUEST_DESCRIPTOR_UNION req_desc;
2444 	u_int8_t max_wait = MRSAS_IOC_INIT_WAIT_TIME;
2445 	bus_addr_t phys_addr;
2446 	int i, retcode = 0;
2447 	u_int32_t scratch_pad_2;
2448 
2449 	/* Allocate memory for the IOC INIT command */
2450 	if (mrsas_alloc_ioc_cmd(sc)) {
2451 		device_printf(sc->mrsas_dev, "Cannot allocate IOC command.\n");
2452 		return (1);
2453 	}
2454 
2455 	if (!sc->block_sync_cache) {
2456 		scratch_pad_2 = mrsas_read_reg(sc, offsetof(mrsas_reg_set,
2457 		    outbound_scratch_pad_2));
2458 		sc->fw_sync_cache_support = (scratch_pad_2 &
2459 		    MR_CAN_HANDLE_SYNC_CACHE_OFFSET) ? 1 : 0;
2460 	}
2461 
2462 	IOCInitMsg = (pMpi2IOCInitRequest_t)(((char *)sc->ioc_init_mem) + 1024);
2463 	IOCInitMsg->Function = MPI2_FUNCTION_IOC_INIT;
2464 	IOCInitMsg->WhoInit = MPI2_WHOINIT_HOST_DRIVER;
2465 	IOCInitMsg->MsgVersion = MPI2_VERSION;
2466 	IOCInitMsg->HeaderVersion = MPI2_HEADER_VERSION;
2467 	IOCInitMsg->SystemRequestFrameSize = MRSAS_MPI2_RAID_DEFAULT_IO_FRAME_SIZE / 4;
2468 	IOCInitMsg->ReplyDescriptorPostQueueDepth = sc->reply_q_depth;
2469 	IOCInitMsg->ReplyDescriptorPostQueueAddress = sc->reply_desc_phys_addr;
2470 	IOCInitMsg->SystemRequestFrameBaseAddress = sc->io_request_phys_addr;
2471 	IOCInitMsg->HostMSIxVectors = (sc->msix_vectors > 0 ? sc->msix_vectors : 0);
2472 
2473 	init_frame = (struct mrsas_init_frame *)sc->ioc_init_mem;
2474 	init_frame->cmd = MFI_CMD_INIT;
2475 	init_frame->cmd_status = 0xFF;
2476 	init_frame->flags |= MFI_FRAME_DONT_POST_IN_REPLY_QUEUE;
2477 
2478 	/* driver support Extended MSIX */
2479 		if (sc->mrsas_gen3_ctrl) {
2480 		init_frame->driver_operations.
2481 		    mfi_capabilities.support_additional_msix = 1;
2482 	}
2483 	if (sc->verbuf_mem) {
2484 		snprintf((char *)sc->verbuf_mem, strlen(MRSAS_VERSION) + 2, "%s\n",
2485 		    MRSAS_VERSION);
2486 		init_frame->driver_ver_lo = (bus_addr_t)sc->verbuf_phys_addr;
2487 		init_frame->driver_ver_hi = 0;
2488 	}
2489 	init_frame->driver_operations.mfi_capabilities.support_ndrive_r1_lb = 1;
2490 	init_frame->driver_operations.mfi_capabilities.support_max_255lds = 1;
2491 	init_frame->driver_operations.mfi_capabilities.security_protocol_cmds_fw = 1;
2492 	if (sc->max_chain_frame_sz > MEGASAS_CHAIN_FRAME_SZ_MIN)
2493 		init_frame->driver_operations.mfi_capabilities.support_ext_io_size = 1;
2494 	phys_addr = (bus_addr_t)sc->ioc_init_phys_mem + 1024;
2495 	init_frame->queue_info_new_phys_addr_lo = phys_addr;
2496 	init_frame->data_xfer_len = sizeof(Mpi2IOCInitRequest_t);
2497 
2498 	req_desc.addr.Words = (bus_addr_t)sc->ioc_init_phys_mem;
2499 	req_desc.MFAIo.RequestFlags =
2500 	    (MRSAS_REQ_DESCRIPT_FLAGS_MFA << MRSAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
2501 
2502 	mrsas_disable_intr(sc);
2503 	mrsas_dprint(sc, MRSAS_OCR, "Issuing IOC INIT command to FW.\n");
2504 	mrsas_fire_cmd(sc, req_desc.addr.u.low, req_desc.addr.u.high);
2505 
2506 	/*
2507 	 * Poll response timer to wait for Firmware response.  While this
2508 	 * timer with the DELAY call could block CPU, the time interval for
2509 	 * this is only 1 millisecond.
2510 	 */
2511 	if (init_frame->cmd_status == 0xFF) {
2512 		for (i = 0; i < (max_wait * 1000); i++) {
2513 			if (init_frame->cmd_status == 0xFF)
2514 				DELAY(1000);
2515 			else
2516 				break;
2517 		}
2518 	}
2519 	if (init_frame->cmd_status == 0)
2520 		mrsas_dprint(sc, MRSAS_OCR,
2521 		    "IOC INIT response received from FW.\n");
2522 	else {
2523 		if (init_frame->cmd_status == 0xFF)
2524 			device_printf(sc->mrsas_dev, "IOC Init timed out after %d seconds.\n", max_wait);
2525 		else
2526 			device_printf(sc->mrsas_dev, "IOC Init failed, status = 0x%x\n", init_frame->cmd_status);
2527 		retcode = 1;
2528 	}
2529 
2530 	mrsas_free_ioc_cmd(sc);
2531 	return (retcode);
2532 }
2533 
2534 /*
2535  * mrsas_alloc_mpt_cmds:	Allocates the command packets
2536  * input:					Adapter instance soft state
2537  *
2538  * This function allocates the internal commands for IOs. Each command that is
2539  * issued to FW is wrapped in a local data structure called mrsas_mpt_cmd. An
2540  * array is allocated with mrsas_mpt_cmd context.  The free commands are
2541  * maintained in a linked list (cmd pool). SMID value range is from 1 to
2542  * max_fw_cmds.
2543  */
2544 int
2545 mrsas_alloc_mpt_cmds(struct mrsas_softc *sc)
2546 {
2547 	int i, j;
2548 	u_int32_t max_cmd, count;
2549 	struct mrsas_mpt_cmd *cmd;
2550 	pMpi2ReplyDescriptorsUnion_t reply_desc;
2551 	u_int32_t offset, chain_offset, sense_offset;
2552 	bus_addr_t io_req_base_phys, chain_frame_base_phys, sense_base_phys;
2553 	u_int8_t *io_req_base, *chain_frame_base, *sense_base;
2554 
2555 	max_cmd = sc->max_fw_cmds;
2556 
2557 	sc->req_desc = malloc(sc->request_alloc_sz, M_MRSAS, M_NOWAIT);
2558 	if (!sc->req_desc) {
2559 		device_printf(sc->mrsas_dev, "Out of memory, cannot alloc req desc\n");
2560 		return (ENOMEM);
2561 	}
2562 	memset(sc->req_desc, 0, sc->request_alloc_sz);
2563 
2564 	/*
2565 	 * sc->mpt_cmd_list is an array of struct mrsas_mpt_cmd pointers.
2566 	 * Allocate the dynamic array first and then allocate individual
2567 	 * commands.
2568 	 */
2569 	sc->mpt_cmd_list = malloc(sizeof(struct mrsas_mpt_cmd *) * max_cmd, M_MRSAS, M_NOWAIT);
2570 	if (!sc->mpt_cmd_list) {
2571 		device_printf(sc->mrsas_dev, "Cannot alloc memory for mpt_cmd_list.\n");
2572 		return (ENOMEM);
2573 	}
2574 	memset(sc->mpt_cmd_list, 0, sizeof(struct mrsas_mpt_cmd *) * max_cmd);
2575 	for (i = 0; i < max_cmd; i++) {
2576 		sc->mpt_cmd_list[i] = malloc(sizeof(struct mrsas_mpt_cmd),
2577 		    M_MRSAS, M_NOWAIT);
2578 		if (!sc->mpt_cmd_list[i]) {
2579 			for (j = 0; j < i; j++)
2580 				free(sc->mpt_cmd_list[j], M_MRSAS);
2581 			free(sc->mpt_cmd_list, M_MRSAS);
2582 			sc->mpt_cmd_list = NULL;
2583 			return (ENOMEM);
2584 		}
2585 	}
2586 
2587 	io_req_base = (u_int8_t *)sc->io_request_mem + MRSAS_MPI2_RAID_DEFAULT_IO_FRAME_SIZE;
2588 	io_req_base_phys = (bus_addr_t)sc->io_request_phys_addr + MRSAS_MPI2_RAID_DEFAULT_IO_FRAME_SIZE;
2589 	chain_frame_base = (u_int8_t *)sc->chain_frame_mem;
2590 	chain_frame_base_phys = (bus_addr_t)sc->chain_frame_phys_addr;
2591 	sense_base = (u_int8_t *)sc->sense_mem;
2592 	sense_base_phys = (bus_addr_t)sc->sense_phys_addr;
2593 	for (i = 0; i < max_cmd; i++) {
2594 		cmd = sc->mpt_cmd_list[i];
2595 		offset = MRSAS_MPI2_RAID_DEFAULT_IO_FRAME_SIZE * i;
2596 		chain_offset = sc->max_chain_frame_sz * i;
2597 		sense_offset = MRSAS_SENSE_LEN * i;
2598 		memset(cmd, 0, sizeof(struct mrsas_mpt_cmd));
2599 		cmd->index = i + 1;
2600 		cmd->ccb_ptr = NULL;
2601 		callout_init_mtx(&cmd->cm_callout, &sc->sim_lock, 0);
2602 		cmd->sync_cmd_idx = (u_int32_t)MRSAS_ULONG_MAX;
2603 		cmd->sc = sc;
2604 		cmd->io_request = (MRSAS_RAID_SCSI_IO_REQUEST *) (io_req_base + offset);
2605 		memset(cmd->io_request, 0, sizeof(MRSAS_RAID_SCSI_IO_REQUEST));
2606 		cmd->io_request_phys_addr = io_req_base_phys + offset;
2607 		cmd->chain_frame = (MPI2_SGE_IO_UNION *) (chain_frame_base + chain_offset);
2608 		cmd->chain_frame_phys_addr = chain_frame_base_phys + chain_offset;
2609 		cmd->sense = sense_base + sense_offset;
2610 		cmd->sense_phys_addr = sense_base_phys + sense_offset;
2611 		if (bus_dmamap_create(sc->data_tag, 0, &cmd->data_dmamap)) {
2612 			return (FAIL);
2613 		}
2614 		TAILQ_INSERT_TAIL(&(sc->mrsas_mpt_cmd_list_head), cmd, next);
2615 	}
2616 
2617 	/* Initialize reply descriptor array to 0xFFFFFFFF */
2618 	reply_desc = sc->reply_desc_mem;
2619 	count = sc->msix_vectors > 0 ? sc->msix_vectors : 1;
2620 	for (i = 0; i < sc->reply_q_depth * count; i++, reply_desc++) {
2621 		reply_desc->Words = MRSAS_ULONG_MAX;
2622 	}
2623 	return (0);
2624 }
2625 
2626 /*
2627  * mrsas_fire_cmd:	Sends command to FW
2628  * input:			Adapter softstate
2629  * 					request descriptor address low
2630  * 					request descriptor address high
2631  *
2632  * This functions fires the command to Firmware by writing to the
2633  * inbound_low_queue_port and inbound_high_queue_port.
2634  */
2635 void
2636 mrsas_fire_cmd(struct mrsas_softc *sc, u_int32_t req_desc_lo,
2637     u_int32_t req_desc_hi)
2638 {
2639 	mtx_lock(&sc->pci_lock);
2640 	mrsas_write_reg(sc, offsetof(mrsas_reg_set, inbound_low_queue_port),
2641 	    req_desc_lo);
2642 	mrsas_write_reg(sc, offsetof(mrsas_reg_set, inbound_high_queue_port),
2643 	    req_desc_hi);
2644 	mtx_unlock(&sc->pci_lock);
2645 }
2646 
2647 /*
2648  * mrsas_transition_to_ready:  Move FW to Ready state input:
2649  * Adapter instance soft state
2650  *
2651  * During the initialization, FW passes can potentially be in any one of several
2652  * possible states. If the FW in operational, waiting-for-handshake states,
2653  * driver must take steps to bring it to ready state. Otherwise, it has to
2654  * wait for the ready state.
2655  */
2656 int
2657 mrsas_transition_to_ready(struct mrsas_softc *sc, int ocr)
2658 {
2659 	int i;
2660 	u_int8_t max_wait;
2661 	u_int32_t val, fw_state;
2662 	u_int32_t cur_state;
2663 	u_int32_t abs_state, curr_abs_state;
2664 
2665 	val = mrsas_read_reg(sc, offsetof(mrsas_reg_set, outbound_scratch_pad));
2666 	fw_state = val & MFI_STATE_MASK;
2667 	max_wait = MRSAS_RESET_WAIT_TIME;
2668 
2669 	if (fw_state != MFI_STATE_READY)
2670 		device_printf(sc->mrsas_dev, "Waiting for FW to come to ready state\n");
2671 
2672 	while (fw_state != MFI_STATE_READY) {
2673 		abs_state = mrsas_read_reg(sc, offsetof(mrsas_reg_set, outbound_scratch_pad));
2674 		switch (fw_state) {
2675 		case MFI_STATE_FAULT:
2676 			device_printf(sc->mrsas_dev, "FW is in FAULT state!!\n");
2677 			if (ocr) {
2678 				cur_state = MFI_STATE_FAULT;
2679 				break;
2680 			} else
2681 				return -ENODEV;
2682 		case MFI_STATE_WAIT_HANDSHAKE:
2683 			/* Set the CLR bit in inbound doorbell */
2684 			mrsas_write_reg(sc, offsetof(mrsas_reg_set, doorbell),
2685 			    MFI_INIT_CLEAR_HANDSHAKE | MFI_INIT_HOTPLUG);
2686 			cur_state = MFI_STATE_WAIT_HANDSHAKE;
2687 			break;
2688 		case MFI_STATE_BOOT_MESSAGE_PENDING:
2689 			mrsas_write_reg(sc, offsetof(mrsas_reg_set, doorbell),
2690 			    MFI_INIT_HOTPLUG);
2691 			cur_state = MFI_STATE_BOOT_MESSAGE_PENDING;
2692 			break;
2693 		case MFI_STATE_OPERATIONAL:
2694 			/*
2695 			 * Bring it to READY state; assuming max wait 10
2696 			 * secs
2697 			 */
2698 			mrsas_disable_intr(sc);
2699 			mrsas_write_reg(sc, offsetof(mrsas_reg_set, doorbell), MFI_RESET_FLAGS);
2700 			for (i = 0; i < max_wait * 1000; i++) {
2701 				if (mrsas_read_reg(sc, offsetof(mrsas_reg_set, doorbell)) & 1)
2702 					DELAY(1000);
2703 				else
2704 					break;
2705 			}
2706 			cur_state = MFI_STATE_OPERATIONAL;
2707 			break;
2708 		case MFI_STATE_UNDEFINED:
2709 			/*
2710 			 * This state should not last for more than 2
2711 			 * seconds
2712 			 */
2713 			cur_state = MFI_STATE_UNDEFINED;
2714 			break;
2715 		case MFI_STATE_BB_INIT:
2716 			cur_state = MFI_STATE_BB_INIT;
2717 			break;
2718 		case MFI_STATE_FW_INIT:
2719 			cur_state = MFI_STATE_FW_INIT;
2720 			break;
2721 		case MFI_STATE_FW_INIT_2:
2722 			cur_state = MFI_STATE_FW_INIT_2;
2723 			break;
2724 		case MFI_STATE_DEVICE_SCAN:
2725 			cur_state = MFI_STATE_DEVICE_SCAN;
2726 			break;
2727 		case MFI_STATE_FLUSH_CACHE:
2728 			cur_state = MFI_STATE_FLUSH_CACHE;
2729 			break;
2730 		default:
2731 			device_printf(sc->mrsas_dev, "Unknown state 0x%x\n", fw_state);
2732 			return -ENODEV;
2733 		}
2734 
2735 		/*
2736 		 * The cur_state should not last for more than max_wait secs
2737 		 */
2738 		for (i = 0; i < (max_wait * 1000); i++) {
2739 			fw_state = (mrsas_read_reg(sc, offsetof(mrsas_reg_set,
2740 			    outbound_scratch_pad)) & MFI_STATE_MASK);
2741 			curr_abs_state = mrsas_read_reg(sc, offsetof(mrsas_reg_set,
2742 			    outbound_scratch_pad));
2743 			if (abs_state == curr_abs_state)
2744 				DELAY(1000);
2745 			else
2746 				break;
2747 		}
2748 
2749 		/*
2750 		 * Return error if fw_state hasn't changed after max_wait
2751 		 */
2752 		if (curr_abs_state == abs_state) {
2753 			device_printf(sc->mrsas_dev, "FW state [%d] hasn't changed "
2754 			    "in %d secs\n", fw_state, max_wait);
2755 			return -ENODEV;
2756 		}
2757 	}
2758 	mrsas_dprint(sc, MRSAS_OCR, "FW now in Ready state\n");
2759 	return 0;
2760 }
2761 
2762 /*
2763  * mrsas_get_mfi_cmd:	Get a cmd from free command pool
2764  * input:				Adapter soft state
2765  *
2766  * This function removes an MFI command from the command list.
2767  */
2768 struct mrsas_mfi_cmd *
2769 mrsas_get_mfi_cmd(struct mrsas_softc *sc)
2770 {
2771 	struct mrsas_mfi_cmd *cmd = NULL;
2772 
2773 	mtx_lock(&sc->mfi_cmd_pool_lock);
2774 	if (!TAILQ_EMPTY(&sc->mrsas_mfi_cmd_list_head)) {
2775 		cmd = TAILQ_FIRST(&sc->mrsas_mfi_cmd_list_head);
2776 		TAILQ_REMOVE(&sc->mrsas_mfi_cmd_list_head, cmd, next);
2777 	}
2778 	mtx_unlock(&sc->mfi_cmd_pool_lock);
2779 
2780 	return cmd;
2781 }
2782 
2783 /*
2784  * mrsas_ocr_thread:	Thread to handle OCR/Kill Adapter.
2785  * input:				Adapter Context.
2786  *
2787  * This function will check FW status register and flag do_timeout_reset flag.
2788  * It will do OCR/Kill adapter if FW is in fault state or IO timed out has
2789  * trigger reset.
2790  */
2791 static void
2792 mrsas_ocr_thread(void *arg)
2793 {
2794 	struct mrsas_softc *sc;
2795 	u_int32_t fw_status, fw_state;
2796 	u_int8_t tm_target_reset_failed = 0;
2797 
2798 	sc = (struct mrsas_softc *)arg;
2799 
2800 	mrsas_dprint(sc, MRSAS_TRACE, "%s\n", __func__);
2801 
2802 	sc->ocr_thread_active = 1;
2803 	mtx_lock(&sc->sim_lock);
2804 	for (;;) {
2805 		/* Sleep for 1 second and check the queue status */
2806 		msleep(&sc->ocr_chan, &sc->sim_lock, PRIBIO,
2807 		    "mrsas_ocr", sc->mrsas_fw_fault_check_delay * hz);
2808 		if (sc->remove_in_progress ||
2809 		    sc->adprecovery == MRSAS_HW_CRITICAL_ERROR) {
2810 			mrsas_dprint(sc, MRSAS_OCR,
2811 			    "Exit due to %s from %s\n",
2812 			    sc->remove_in_progress ? "Shutdown" :
2813 			    "Hardware critical error", __func__);
2814 			break;
2815 		}
2816 		fw_status = mrsas_read_reg(sc,
2817 		    offsetof(mrsas_reg_set, outbound_scratch_pad));
2818 		fw_state = fw_status & MFI_STATE_MASK;
2819 		if (fw_state == MFI_STATE_FAULT || sc->do_timedout_reset ||
2820 			mrsas_atomic_read(&sc->target_reset_outstanding)) {
2821 
2822 			/* First, freeze further IOs to come to the SIM */
2823 			mrsas_xpt_freeze(sc);
2824 
2825 			/* If this is an IO timeout then go for target reset */
2826 			if (mrsas_atomic_read(&sc->target_reset_outstanding)) {
2827 				device_printf(sc->mrsas_dev, "Initiating Target RESET "
2828 				    "because of SCSI IO timeout!\n");
2829 
2830 				/* Let the remaining IOs to complete */
2831 				msleep(&sc->ocr_chan, &sc->sim_lock, PRIBIO,
2832 				      "mrsas_reset_targets", 5 * hz);
2833 
2834 				/* Try to reset the target device */
2835 				if (mrsas_reset_targets(sc) == FAIL)
2836 					tm_target_reset_failed = 1;
2837 			}
2838 
2839 			/* If this is a DCMD timeout or FW fault,
2840 			 * then go for controller reset
2841 			 */
2842 			if (fw_state == MFI_STATE_FAULT || tm_target_reset_failed ||
2843 			    (sc->do_timedout_reset == MFI_DCMD_TIMEOUT_OCR)) {
2844 				if (tm_target_reset_failed)
2845 					device_printf(sc->mrsas_dev, "Initiaiting OCR because of "
2846 					    "TM FAILURE!\n");
2847 				else
2848 					device_printf(sc->mrsas_dev, "Initiaiting OCR "
2849 						"because of %s!\n", sc->do_timedout_reset ?
2850 						"DCMD IO Timeout" : "FW fault");
2851 
2852 				mtx_lock_spin(&sc->ioctl_lock);
2853 				sc->reset_in_progress = 1;
2854 				mtx_unlock_spin(&sc->ioctl_lock);
2855 				sc->reset_count++;
2856 
2857 				/*
2858 				 * Wait for the AEN task to be completed if it is running.
2859 				 */
2860 				mtx_unlock(&sc->sim_lock);
2861 				taskqueue_drain(sc->ev_tq, &sc->ev_task);
2862 				mtx_lock(&sc->sim_lock);
2863 
2864 				taskqueue_block(sc->ev_tq);
2865 				/* Try to reset the controller */
2866 				mrsas_reset_ctrl(sc, sc->do_timedout_reset);
2867 
2868 				sc->do_timedout_reset = 0;
2869 				sc->reset_in_progress = 0;
2870 				tm_target_reset_failed = 0;
2871 				mrsas_atomic_set(&sc->target_reset_outstanding, 0);
2872 				memset(sc->target_reset_pool, 0,
2873 				    sizeof(sc->target_reset_pool));
2874 				taskqueue_unblock(sc->ev_tq);
2875 			}
2876 
2877 			/* Now allow IOs to come to the SIM */
2878 			 mrsas_xpt_release(sc);
2879 		}
2880 	}
2881 	mtx_unlock(&sc->sim_lock);
2882 	sc->ocr_thread_active = 0;
2883 	mrsas_kproc_exit(0);
2884 }
2885 
2886 /*
2887  * mrsas_reset_reply_desc:	Reset Reply descriptor as part of OCR.
2888  * input:					Adapter Context.
2889  *
2890  * This function will clear reply descriptor so that post OCR driver and FW will
2891  * lost old history.
2892  */
2893 void
2894 mrsas_reset_reply_desc(struct mrsas_softc *sc)
2895 {
2896 	int i, count;
2897 	pMpi2ReplyDescriptorsUnion_t reply_desc;
2898 
2899 	count = sc->msix_vectors > 0 ? sc->msix_vectors : 1;
2900 	for (i = 0; i < count; i++)
2901 		sc->last_reply_idx[i] = 0;
2902 
2903 	reply_desc = sc->reply_desc_mem;
2904 	for (i = 0; i < sc->reply_q_depth; i++, reply_desc++) {
2905 		reply_desc->Words = MRSAS_ULONG_MAX;
2906 	}
2907 }
2908 
2909 /*
2910  * mrsas_reset_ctrl:	Core function to OCR/Kill adapter.
2911  * input:				Adapter Context.
2912  *
2913  * This function will run from thread context so that it can sleep. 1. Do not
2914  * handle OCR if FW is in HW critical error. 2. Wait for outstanding command
2915  * to complete for 180 seconds. 3. If #2 does not find any outstanding
2916  * command Controller is in working state, so skip OCR. Otherwise, do
2917  * OCR/kill Adapter based on flag disableOnlineCtrlReset. 4. Start of the
2918  * OCR, return all SCSI command back to CAM layer which has ccb_ptr. 5. Post
2919  * OCR, Re-fire Management command and move Controller to Operation state.
2920  */
2921 int
2922 mrsas_reset_ctrl(struct mrsas_softc *sc, u_int8_t reset_reason)
2923 {
2924 	int retval = SUCCESS, i, j, retry = 0;
2925 	u_int32_t host_diag, abs_state, status_reg, reset_adapter;
2926 	union ccb *ccb;
2927 	struct mrsas_mfi_cmd *mfi_cmd;
2928 	struct mrsas_mpt_cmd *mpt_cmd;
2929 	union mrsas_evt_class_locale class_locale;
2930 	MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc;
2931 
2932 	if (sc->adprecovery == MRSAS_HW_CRITICAL_ERROR) {
2933 		device_printf(sc->mrsas_dev,
2934 		    "mrsas: Hardware critical error, returning FAIL.\n");
2935 		return FAIL;
2936 	}
2937 	mrsas_set_bit(MRSAS_FUSION_IN_RESET, &sc->reset_flags);
2938 	sc->adprecovery = MRSAS_ADPRESET_SM_INFAULT;
2939 	mrsas_disable_intr(sc);
2940 	msleep(&sc->ocr_chan, &sc->sim_lock, PRIBIO, "mrsas_ocr",
2941 	    sc->mrsas_fw_fault_check_delay * hz);
2942 
2943 	/* First try waiting for commands to complete */
2944 	if (mrsas_wait_for_outstanding(sc, reset_reason)) {
2945 		mrsas_dprint(sc, MRSAS_OCR,
2946 		    "resetting adapter from %s.\n",
2947 		    __func__);
2948 		/* Now return commands back to the CAM layer */
2949 		mtx_unlock(&sc->sim_lock);
2950 		for (i = 0; i < sc->max_fw_cmds; i++) {
2951 			mpt_cmd = sc->mpt_cmd_list[i];
2952 			if (mpt_cmd->ccb_ptr) {
2953 				ccb = (union ccb *)(mpt_cmd->ccb_ptr);
2954 				ccb->ccb_h.status = CAM_SCSI_BUS_RESET;
2955 				mrsas_cmd_done(sc, mpt_cmd);
2956 				mrsas_atomic_dec(&sc->fw_outstanding);
2957 			}
2958 		}
2959 		mtx_lock(&sc->sim_lock);
2960 
2961 		status_reg = mrsas_read_reg(sc, offsetof(mrsas_reg_set,
2962 		    outbound_scratch_pad));
2963 		abs_state = status_reg & MFI_STATE_MASK;
2964 		reset_adapter = status_reg & MFI_RESET_ADAPTER;
2965 		if (sc->disableOnlineCtrlReset ||
2966 		    (abs_state == MFI_STATE_FAULT && !reset_adapter)) {
2967 			/* Reset not supported, kill adapter */
2968 			mrsas_dprint(sc, MRSAS_OCR, "Reset not supported, killing adapter.\n");
2969 			mrsas_kill_hba(sc);
2970 			retval = FAIL;
2971 			goto out;
2972 		}
2973 		/* Now try to reset the chip */
2974 		for (i = 0; i < MRSAS_FUSION_MAX_RESET_TRIES; i++) {
2975 			mrsas_write_reg(sc, offsetof(mrsas_reg_set, fusion_seq_offset),
2976 			    MPI2_WRSEQ_FLUSH_KEY_VALUE);
2977 			mrsas_write_reg(sc, offsetof(mrsas_reg_set, fusion_seq_offset),
2978 			    MPI2_WRSEQ_1ST_KEY_VALUE);
2979 			mrsas_write_reg(sc, offsetof(mrsas_reg_set, fusion_seq_offset),
2980 			    MPI2_WRSEQ_2ND_KEY_VALUE);
2981 			mrsas_write_reg(sc, offsetof(mrsas_reg_set, fusion_seq_offset),
2982 			    MPI2_WRSEQ_3RD_KEY_VALUE);
2983 			mrsas_write_reg(sc, offsetof(mrsas_reg_set, fusion_seq_offset),
2984 			    MPI2_WRSEQ_4TH_KEY_VALUE);
2985 			mrsas_write_reg(sc, offsetof(mrsas_reg_set, fusion_seq_offset),
2986 			    MPI2_WRSEQ_5TH_KEY_VALUE);
2987 			mrsas_write_reg(sc, offsetof(mrsas_reg_set, fusion_seq_offset),
2988 			    MPI2_WRSEQ_6TH_KEY_VALUE);
2989 
2990 			/* Check that the diag write enable (DRWE) bit is on */
2991 			host_diag = mrsas_read_reg(sc, offsetof(mrsas_reg_set,
2992 			    fusion_host_diag));
2993 			retry = 0;
2994 			while (!(host_diag & HOST_DIAG_WRITE_ENABLE)) {
2995 				DELAY(100 * 1000);
2996 				host_diag = mrsas_read_reg(sc, offsetof(mrsas_reg_set,
2997 				    fusion_host_diag));
2998 				if (retry++ == 100) {
2999 					mrsas_dprint(sc, MRSAS_OCR,
3000 					    "Host diag unlock failed!\n");
3001 					break;
3002 				}
3003 			}
3004 			if (!(host_diag & HOST_DIAG_WRITE_ENABLE))
3005 				continue;
3006 
3007 			/* Send chip reset command */
3008 			mrsas_write_reg(sc, offsetof(mrsas_reg_set, fusion_host_diag),
3009 			    host_diag | HOST_DIAG_RESET_ADAPTER);
3010 			DELAY(3000 * 1000);
3011 
3012 			/* Make sure reset adapter bit is cleared */
3013 			host_diag = mrsas_read_reg(sc, offsetof(mrsas_reg_set,
3014 			    fusion_host_diag));
3015 			retry = 0;
3016 			while (host_diag & HOST_DIAG_RESET_ADAPTER) {
3017 				DELAY(100 * 1000);
3018 				host_diag = mrsas_read_reg(sc, offsetof(mrsas_reg_set,
3019 				    fusion_host_diag));
3020 				if (retry++ == 1000) {
3021 					mrsas_dprint(sc, MRSAS_OCR,
3022 					    "Diag reset adapter never cleared!\n");
3023 					break;
3024 				}
3025 			}
3026 			if (host_diag & HOST_DIAG_RESET_ADAPTER)
3027 				continue;
3028 
3029 			abs_state = mrsas_read_reg(sc, offsetof(mrsas_reg_set,
3030 			    outbound_scratch_pad)) & MFI_STATE_MASK;
3031 			retry = 0;
3032 
3033 			while ((abs_state <= MFI_STATE_FW_INIT) && (retry++ < 1000)) {
3034 				DELAY(100 * 1000);
3035 				abs_state = mrsas_read_reg(sc, offsetof(mrsas_reg_set,
3036 				    outbound_scratch_pad)) & MFI_STATE_MASK;
3037 			}
3038 			if (abs_state <= MFI_STATE_FW_INIT) {
3039 				mrsas_dprint(sc, MRSAS_OCR, "firmware state < MFI_STATE_FW_INIT,"
3040 				    " state = 0x%x\n", abs_state);
3041 				continue;
3042 			}
3043 			/* Wait for FW to become ready */
3044 			if (mrsas_transition_to_ready(sc, 1)) {
3045 				mrsas_dprint(sc, MRSAS_OCR,
3046 				    "mrsas: Failed to transition controller to ready.\n");
3047 				continue;
3048 			}
3049 			mrsas_reset_reply_desc(sc);
3050 			if (mrsas_ioc_init(sc)) {
3051 				mrsas_dprint(sc, MRSAS_OCR, "mrsas_ioc_init() failed!\n");
3052 				continue;
3053 			}
3054 			for (j = 0; j < sc->max_fw_cmds; j++) {
3055 				mpt_cmd = sc->mpt_cmd_list[j];
3056 				if (mpt_cmd->sync_cmd_idx != (u_int32_t)MRSAS_ULONG_MAX) {
3057 					mfi_cmd = sc->mfi_cmd_list[mpt_cmd->sync_cmd_idx];
3058 					/* If not an IOCTL then release the command else re-fire */
3059 					if (!mfi_cmd->sync_cmd) {
3060 						mrsas_release_mfi_cmd(mfi_cmd);
3061 					} else {
3062 						req_desc = mrsas_get_request_desc(sc,
3063 						    mfi_cmd->cmd_id.context.smid - 1);
3064 						mrsas_dprint(sc, MRSAS_OCR,
3065 						    "Re-fire command DCMD opcode 0x%x index %d\n ",
3066 						    mfi_cmd->frame->dcmd.opcode, j);
3067 						if (!req_desc)
3068 							device_printf(sc->mrsas_dev,
3069 							    "Cannot build MPT cmd.\n");
3070 						else
3071 							mrsas_fire_cmd(sc, req_desc->addr.u.low,
3072 							    req_desc->addr.u.high);
3073 					}
3074 				}
3075 			}
3076 
3077 			/* Reset load balance info */
3078 			memset(sc->load_balance_info, 0,
3079 			    sizeof(LD_LOAD_BALANCE_INFO) * MAX_LOGICAL_DRIVES_EXT);
3080 
3081 			if (mrsas_get_ctrl_info(sc)) {
3082 				mrsas_kill_hba(sc);
3083 				retval = FAIL;
3084 				goto out;
3085 			}
3086 			if (!mrsas_get_map_info(sc))
3087 				mrsas_sync_map_info(sc);
3088 
3089 			megasas_setup_jbod_map(sc);
3090 
3091 			mrsas_clear_bit(MRSAS_FUSION_IN_RESET, &sc->reset_flags);
3092 			mrsas_enable_intr(sc);
3093 			sc->adprecovery = MRSAS_HBA_OPERATIONAL;
3094 
3095 			/* Register AEN with FW for last sequence number */
3096 			class_locale.members.reserved = 0;
3097 			class_locale.members.locale = MR_EVT_LOCALE_ALL;
3098 			class_locale.members.class = MR_EVT_CLASS_DEBUG;
3099 
3100 			mtx_unlock(&sc->sim_lock);
3101 			if (mrsas_register_aen(sc, sc->last_seq_num,
3102 			    class_locale.word)) {
3103 				device_printf(sc->mrsas_dev,
3104 				    "ERROR: AEN registration FAILED from OCR !!! "
3105 				    "Further events from the controller cannot be notified."
3106 				    "Either there is some problem in the controller"
3107 				    "or the controller does not support AEN.\n"
3108 				    "Please contact to the SUPPORT TEAM if the problem persists\n");
3109 			}
3110 			mtx_lock(&sc->sim_lock);
3111 
3112 			/* Adapter reset completed successfully */
3113 			device_printf(sc->mrsas_dev, "Reset successful\n");
3114 			retval = SUCCESS;
3115 			goto out;
3116 		}
3117 		/* Reset failed, kill the adapter */
3118 		device_printf(sc->mrsas_dev, "Reset failed, killing adapter.\n");
3119 		mrsas_kill_hba(sc);
3120 		retval = FAIL;
3121 	} else {
3122 		mrsas_clear_bit(MRSAS_FUSION_IN_RESET, &sc->reset_flags);
3123 		mrsas_enable_intr(sc);
3124 		sc->adprecovery = MRSAS_HBA_OPERATIONAL;
3125 	}
3126 out:
3127 	mrsas_clear_bit(MRSAS_FUSION_IN_RESET, &sc->reset_flags);
3128 	mrsas_dprint(sc, MRSAS_OCR,
3129 	    "Reset Exit with %d.\n", retval);
3130 	return retval;
3131 }
3132 
3133 /*
3134  * mrsas_kill_hba:	Kill HBA when OCR is not supported
3135  * input:			Adapter Context.
3136  *
3137  * This function will kill HBA when OCR is not supported.
3138  */
3139 void
3140 mrsas_kill_hba(struct mrsas_softc *sc)
3141 {
3142 	sc->adprecovery = MRSAS_HW_CRITICAL_ERROR;
3143 	DELAY(1000 * 1000);
3144 	mrsas_dprint(sc, MRSAS_OCR, "%s\n", __func__);
3145 	mrsas_write_reg(sc, offsetof(mrsas_reg_set, doorbell),
3146 	    MFI_STOP_ADP);
3147 	/* Flush */
3148 	mrsas_read_reg(sc, offsetof(mrsas_reg_set, doorbell));
3149 	mrsas_complete_outstanding_ioctls(sc);
3150 }
3151 
3152 /**
3153  * mrsas_complete_outstanding_ioctls	Complete pending IOCTLS after kill_hba
3154  * input:			Controller softc
3155  *
3156  * Returns void
3157  */
3158 void
3159 mrsas_complete_outstanding_ioctls(struct mrsas_softc *sc)
3160 {
3161 	int i;
3162 	struct mrsas_mpt_cmd *cmd_mpt;
3163 	struct mrsas_mfi_cmd *cmd_mfi;
3164 	u_int32_t count, MSIxIndex;
3165 
3166 	count = sc->msix_vectors > 0 ? sc->msix_vectors : 1;
3167 	for (i = 0; i < sc->max_fw_cmds; i++) {
3168 		cmd_mpt = sc->mpt_cmd_list[i];
3169 
3170 		if (cmd_mpt->sync_cmd_idx != (u_int32_t)MRSAS_ULONG_MAX) {
3171 			cmd_mfi = sc->mfi_cmd_list[cmd_mpt->sync_cmd_idx];
3172 			if (cmd_mfi->sync_cmd && cmd_mfi->frame->hdr.cmd != MFI_CMD_ABORT) {
3173 				for (MSIxIndex = 0; MSIxIndex < count; MSIxIndex++)
3174 					mrsas_complete_mptmfi_passthru(sc, cmd_mfi,
3175 					    cmd_mpt->io_request->RaidContext.status);
3176 			}
3177 		}
3178 	}
3179 }
3180 
3181 /*
3182  * mrsas_wait_for_outstanding:	Wait for outstanding commands
3183  * input:						Adapter Context.
3184  *
3185  * This function will wait for 180 seconds for outstanding commands to be
3186  * completed.
3187  */
3188 int
3189 mrsas_wait_for_outstanding(struct mrsas_softc *sc, u_int8_t check_reason)
3190 {
3191 	int i, outstanding, retval = 0;
3192 	u_int32_t fw_state, count, MSIxIndex;
3193 
3194 
3195 	for (i = 0; i < MRSAS_RESET_WAIT_TIME; i++) {
3196 		if (sc->remove_in_progress) {
3197 			mrsas_dprint(sc, MRSAS_OCR,
3198 			    "Driver remove or shutdown called.\n");
3199 			retval = 1;
3200 			goto out;
3201 		}
3202 		/* Check if firmware is in fault state */
3203 		fw_state = mrsas_read_reg(sc, offsetof(mrsas_reg_set,
3204 		    outbound_scratch_pad)) & MFI_STATE_MASK;
3205 		if (fw_state == MFI_STATE_FAULT) {
3206 			mrsas_dprint(sc, MRSAS_OCR,
3207 			    "Found FW in FAULT state, will reset adapter.\n");
3208 			count = sc->msix_vectors > 0 ? sc->msix_vectors : 1;
3209 			mtx_unlock(&sc->sim_lock);
3210 			for (MSIxIndex = 0; MSIxIndex < count; MSIxIndex++)
3211 				mrsas_complete_cmd(sc, MSIxIndex);
3212 			mtx_lock(&sc->sim_lock);
3213 			retval = 1;
3214 			goto out;
3215 		}
3216 		if (check_reason == MFI_DCMD_TIMEOUT_OCR) {
3217 			mrsas_dprint(sc, MRSAS_OCR,
3218 			    "DCMD IO TIMEOUT detected, will reset adapter.\n");
3219 			retval = 1;
3220 			goto out;
3221 		}
3222 		outstanding = mrsas_atomic_read(&sc->fw_outstanding);
3223 		if (!outstanding)
3224 			goto out;
3225 
3226 		if (!(i % MRSAS_RESET_NOTICE_INTERVAL)) {
3227 			mrsas_dprint(sc, MRSAS_OCR, "[%2d]waiting for %d "
3228 			    "commands to complete\n", i, outstanding);
3229 			count = sc->msix_vectors > 0 ? sc->msix_vectors : 1;
3230 			mtx_unlock(&sc->sim_lock);
3231 			for (MSIxIndex = 0; MSIxIndex < count; MSIxIndex++)
3232 				mrsas_complete_cmd(sc, MSIxIndex);
3233 			mtx_lock(&sc->sim_lock);
3234 		}
3235 		DELAY(1000 * 1000);
3236 	}
3237 
3238 	if (mrsas_atomic_read(&sc->fw_outstanding)) {
3239 		mrsas_dprint(sc, MRSAS_OCR,
3240 		    " pending commands remain after waiting,"
3241 		    " will reset adapter.\n");
3242 		retval = 1;
3243 	}
3244 out:
3245 	return retval;
3246 }
3247 
3248 /*
3249  * mrsas_release_mfi_cmd:	Return a cmd to free command pool
3250  * input:					Command packet for return to free cmd pool
3251  *
3252  * This function returns the MFI & MPT command to the command list.
3253  */
3254 void
3255 mrsas_release_mfi_cmd(struct mrsas_mfi_cmd *cmd_mfi)
3256 {
3257 	struct mrsas_softc *sc = cmd_mfi->sc;
3258 	struct mrsas_mpt_cmd *cmd_mpt;
3259 
3260 
3261 	mtx_lock(&sc->mfi_cmd_pool_lock);
3262 	/*
3263 	 * Release the mpt command (if at all it is allocated
3264 	 * associated with the mfi command
3265 	 */
3266 	if (cmd_mfi->cmd_id.context.smid) {
3267 		mtx_lock(&sc->mpt_cmd_pool_lock);
3268 		/* Get the mpt cmd from mfi cmd frame's smid value */
3269 		cmd_mpt = sc->mpt_cmd_list[cmd_mfi->cmd_id.context.smid-1];
3270 		cmd_mpt->flags = 0;
3271 		cmd_mpt->sync_cmd_idx = (u_int32_t)MRSAS_ULONG_MAX;
3272 		TAILQ_INSERT_HEAD(&(sc->mrsas_mpt_cmd_list_head), cmd_mpt, next);
3273 		mtx_unlock(&sc->mpt_cmd_pool_lock);
3274 	}
3275 	/* Release the mfi command */
3276 	cmd_mfi->ccb_ptr = NULL;
3277 	cmd_mfi->cmd_id.frame_count = 0;
3278 	TAILQ_INSERT_HEAD(&(sc->mrsas_mfi_cmd_list_head), cmd_mfi, next);
3279 	mtx_unlock(&sc->mfi_cmd_pool_lock);
3280 
3281 	return;
3282 }
3283 
3284 /*
3285  * mrsas_get_controller_info:	Returns FW's controller structure
3286  * input:						Adapter soft state
3287  * 								Controller information structure
3288  *
3289  * Issues an internal command (DCMD) to get the FW's controller structure. This
3290  * information is mainly used to find out the maximum IO transfer per command
3291  * supported by the FW.
3292  */
3293 static int
3294 mrsas_get_ctrl_info(struct mrsas_softc *sc)
3295 {
3296 	int retcode = 0;
3297 	u_int8_t do_ocr = 1;
3298 	struct mrsas_mfi_cmd *cmd;
3299 	struct mrsas_dcmd_frame *dcmd;
3300 
3301 	cmd = mrsas_get_mfi_cmd(sc);
3302 
3303 	if (!cmd) {
3304 		device_printf(sc->mrsas_dev, "Failed to get a free cmd\n");
3305 		return -ENOMEM;
3306 	}
3307 	dcmd = &cmd->frame->dcmd;
3308 
3309 	if (mrsas_alloc_ctlr_info_cmd(sc) != SUCCESS) {
3310 		device_printf(sc->mrsas_dev, "Cannot allocate get ctlr info cmd\n");
3311 		mrsas_release_mfi_cmd(cmd);
3312 		return -ENOMEM;
3313 	}
3314 	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
3315 
3316 	dcmd->cmd = MFI_CMD_DCMD;
3317 	dcmd->cmd_status = 0xFF;
3318 	dcmd->sge_count = 1;
3319 	dcmd->flags = MFI_FRAME_DIR_READ;
3320 	dcmd->timeout = 0;
3321 	dcmd->pad_0 = 0;
3322 	dcmd->data_xfer_len = sizeof(struct mrsas_ctrl_info);
3323 	dcmd->opcode = MR_DCMD_CTRL_GET_INFO;
3324 	dcmd->sgl.sge32[0].phys_addr = sc->ctlr_info_phys_addr;
3325 	dcmd->sgl.sge32[0].length = sizeof(struct mrsas_ctrl_info);
3326 
3327 	if (!sc->mask_interrupts)
3328 		retcode = mrsas_issue_blocked_cmd(sc, cmd);
3329 	else
3330 		retcode = mrsas_issue_polled(sc, cmd);
3331 
3332 	if (retcode == ETIMEDOUT)
3333 		goto dcmd_timeout;
3334 	else
3335 		memcpy(sc->ctrl_info, sc->ctlr_info_mem, sizeof(struct mrsas_ctrl_info));
3336 
3337 	do_ocr = 0;
3338 	mrsas_update_ext_vd_details(sc);
3339 
3340 	sc->use_seqnum_jbod_fp =
3341 	    sc->ctrl_info->adapterOperations3.useSeqNumJbodFP;
3342 	sc->disableOnlineCtrlReset =
3343 	    sc->ctrl_info->properties.OnOffProperties.disableOnlineCtrlReset;
3344 
3345 dcmd_timeout:
3346 	mrsas_free_ctlr_info_cmd(sc);
3347 
3348 	if (do_ocr)
3349 		sc->do_timedout_reset = MFI_DCMD_TIMEOUT_OCR;
3350 
3351 	if (!sc->mask_interrupts)
3352 		mrsas_release_mfi_cmd(cmd);
3353 
3354 	return (retcode);
3355 }
3356 
3357 /*
3358  * mrsas_update_ext_vd_details : Update details w.r.t Extended VD
3359  * input:
3360  *	sc - Controller's softc
3361 */
3362 static void
3363 mrsas_update_ext_vd_details(struct mrsas_softc *sc)
3364 {
3365 	sc->max256vdSupport =
3366 	sc->ctrl_info->adapterOperations3.supportMaxExtLDs;
3367 	/* Below is additional check to address future FW enhancement */
3368 	if (sc->ctrl_info->max_lds > 64)
3369 		sc->max256vdSupport = 1;
3370 
3371 	sc->drv_supported_vd_count = MRSAS_MAX_LD_CHANNELS
3372 	    * MRSAS_MAX_DEV_PER_CHANNEL;
3373 	sc->drv_supported_pd_count = MRSAS_MAX_PD_CHANNELS
3374 	    * MRSAS_MAX_DEV_PER_CHANNEL;
3375 	if (sc->max256vdSupport) {
3376 		sc->fw_supported_vd_count = MAX_LOGICAL_DRIVES_EXT;
3377 		sc->fw_supported_pd_count = MAX_PHYSICAL_DEVICES;
3378 	} else {
3379 		sc->fw_supported_vd_count = MAX_LOGICAL_DRIVES;
3380 		sc->fw_supported_pd_count = MAX_PHYSICAL_DEVICES;
3381 	}
3382 
3383 	sc->old_map_sz = sizeof(MR_FW_RAID_MAP) +
3384 	    (sizeof(MR_LD_SPAN_MAP) *
3385 	    (sc->fw_supported_vd_count - 1));
3386 	sc->new_map_sz = sizeof(MR_FW_RAID_MAP_EXT);
3387 	sc->drv_map_sz = sizeof(MR_DRV_RAID_MAP) +
3388 	    (sizeof(MR_LD_SPAN_MAP) *
3389 	    (sc->drv_supported_vd_count - 1));
3390 
3391 	sc->max_map_sz = max(sc->old_map_sz, sc->new_map_sz);
3392 
3393 	if (sc->max256vdSupport)
3394 		sc->current_map_sz = sc->new_map_sz;
3395 	else
3396 		sc->current_map_sz = sc->old_map_sz;
3397 }
3398 
3399 /*
3400  * mrsas_alloc_ctlr_info_cmd:	Allocates memory for controller info command
3401  * input:						Adapter soft state
3402  *
3403  * Allocates DMAable memory for the controller info internal command.
3404  */
3405 int
3406 mrsas_alloc_ctlr_info_cmd(struct mrsas_softc *sc)
3407 {
3408 	int ctlr_info_size;
3409 
3410 	/* Allocate get controller info command */
3411 	ctlr_info_size = sizeof(struct mrsas_ctrl_info);
3412 	if (bus_dma_tag_create(sc->mrsas_parent_tag,
3413 	    1, 0,
3414 	    BUS_SPACE_MAXADDR_32BIT,
3415 	    BUS_SPACE_MAXADDR,
3416 	    NULL, NULL,
3417 	    ctlr_info_size,
3418 	    1,
3419 	    ctlr_info_size,
3420 	    BUS_DMA_ALLOCNOW,
3421 	    NULL, NULL,
3422 	    &sc->ctlr_info_tag)) {
3423 		device_printf(sc->mrsas_dev, "Cannot allocate ctlr info tag\n");
3424 		return (ENOMEM);
3425 	}
3426 	if (bus_dmamem_alloc(sc->ctlr_info_tag, (void **)&sc->ctlr_info_mem,
3427 	    BUS_DMA_NOWAIT, &sc->ctlr_info_dmamap)) {
3428 		device_printf(sc->mrsas_dev, "Cannot allocate ctlr info cmd mem\n");
3429 		return (ENOMEM);
3430 	}
3431 	if (bus_dmamap_load(sc->ctlr_info_tag, sc->ctlr_info_dmamap,
3432 	    sc->ctlr_info_mem, ctlr_info_size, mrsas_addr_cb,
3433 	    &sc->ctlr_info_phys_addr, BUS_DMA_NOWAIT)) {
3434 		device_printf(sc->mrsas_dev, "Cannot load ctlr info cmd mem\n");
3435 		return (ENOMEM);
3436 	}
3437 	memset(sc->ctlr_info_mem, 0, ctlr_info_size);
3438 	return (0);
3439 }
3440 
3441 /*
3442  * mrsas_free_ctlr_info_cmd:	Free memory for controller info command
3443  * input:						Adapter soft state
3444  *
3445  * Deallocates memory of the get controller info cmd.
3446  */
3447 void
3448 mrsas_free_ctlr_info_cmd(struct mrsas_softc *sc)
3449 {
3450 	if (sc->ctlr_info_phys_addr)
3451 		bus_dmamap_unload(sc->ctlr_info_tag, sc->ctlr_info_dmamap);
3452 	if (sc->ctlr_info_mem != NULL)
3453 		bus_dmamem_free(sc->ctlr_info_tag, sc->ctlr_info_mem, sc->ctlr_info_dmamap);
3454 	if (sc->ctlr_info_tag != NULL)
3455 		bus_dma_tag_destroy(sc->ctlr_info_tag);
3456 }
3457 
3458 /*
3459  * mrsas_issue_polled:	Issues a polling command
3460  * inputs:				Adapter soft state
3461  * 						Command packet to be issued
3462  *
3463  * This function is for posting of internal commands to Firmware.  MFI requires
3464  * the cmd_status to be set to 0xFF before posting.  The maximun wait time of
3465  * the poll response timer is 180 seconds.
3466  */
3467 int
3468 mrsas_issue_polled(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd)
3469 {
3470 	struct mrsas_header *frame_hdr = &cmd->frame->hdr;
3471 	u_int8_t max_wait = MRSAS_INTERNAL_CMD_WAIT_TIME;
3472 	int i, retcode = SUCCESS;
3473 
3474 	frame_hdr->cmd_status = 0xFF;
3475 	frame_hdr->flags |= MFI_FRAME_DONT_POST_IN_REPLY_QUEUE;
3476 
3477 	/* Issue the frame using inbound queue port */
3478 	if (mrsas_issue_dcmd(sc, cmd)) {
3479 		device_printf(sc->mrsas_dev, "Cannot issue DCMD internal command.\n");
3480 		return (1);
3481 	}
3482 	/*
3483 	 * Poll response timer to wait for Firmware response.  While this
3484 	 * timer with the DELAY call could block CPU, the time interval for
3485 	 * this is only 1 millisecond.
3486 	 */
3487 	if (frame_hdr->cmd_status == 0xFF) {
3488 		for (i = 0; i < (max_wait * 1000); i++) {
3489 			if (frame_hdr->cmd_status == 0xFF)
3490 				DELAY(1000);
3491 			else
3492 				break;
3493 		}
3494 	}
3495 	if (frame_hdr->cmd_status == 0xFF) {
3496 		device_printf(sc->mrsas_dev, "DCMD timed out after %d "
3497 		    "seconds from %s\n", max_wait, __func__);
3498 		device_printf(sc->mrsas_dev, "DCMD opcode 0x%X\n",
3499 		    cmd->frame->dcmd.opcode);
3500 		retcode = ETIMEDOUT;
3501 	}
3502 	return (retcode);
3503 }
3504 
3505 /*
3506  * mrsas_issue_dcmd:	Issues a MFI Pass thru cmd
3507  * input:				Adapter soft state mfi cmd pointer
3508  *
3509  * This function is called by mrsas_issued_blocked_cmd() and
3510  * mrsas_issued_polled(), to build the MPT command and then fire the command
3511  * to Firmware.
3512  */
3513 int
3514 mrsas_issue_dcmd(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd)
3515 {
3516 	MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc;
3517 
3518 	req_desc = mrsas_build_mpt_cmd(sc, cmd);
3519 	if (!req_desc) {
3520 		device_printf(sc->mrsas_dev, "Cannot build MPT cmd.\n");
3521 		return (1);
3522 	}
3523 	mrsas_fire_cmd(sc, req_desc->addr.u.low, req_desc->addr.u.high);
3524 
3525 	return (0);
3526 }
3527 
3528 /*
3529  * mrsas_build_mpt_cmd:	Calls helper function to build Passthru cmd
3530  * input:				Adapter soft state mfi cmd to build
3531  *
3532  * This function is called by mrsas_issue_cmd() to build the MPT-MFI passthru
3533  * command and prepares the MPT command to send to Firmware.
3534  */
3535 MRSAS_REQUEST_DESCRIPTOR_UNION *
3536 mrsas_build_mpt_cmd(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd)
3537 {
3538 	MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc;
3539 	u_int16_t index;
3540 
3541 	if (mrsas_build_mptmfi_passthru(sc, cmd)) {
3542 		device_printf(sc->mrsas_dev, "Cannot build MPT-MFI passthru cmd.\n");
3543 		return NULL;
3544 	}
3545 	index = cmd->cmd_id.context.smid;
3546 
3547 	req_desc = mrsas_get_request_desc(sc, index - 1);
3548 	if (!req_desc)
3549 		return NULL;
3550 
3551 	req_desc->addr.Words = 0;
3552 	req_desc->SCSIIO.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO << MRSAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
3553 
3554 	req_desc->SCSIIO.SMID = index;
3555 
3556 	return (req_desc);
3557 }
3558 
3559 /*
3560  * mrsas_build_mptmfi_passthru:	Builds a MPT MFI Passthru command
3561  * input:						Adapter soft state mfi cmd pointer
3562  *
3563  * The MPT command and the io_request are setup as a passthru command. The SGE
3564  * chain address is set to frame_phys_addr of the MFI command.
3565  */
3566 u_int8_t
3567 mrsas_build_mptmfi_passthru(struct mrsas_softc *sc, struct mrsas_mfi_cmd *mfi_cmd)
3568 {
3569 	MPI25_IEEE_SGE_CHAIN64 *mpi25_ieee_chain;
3570 	PTR_MRSAS_RAID_SCSI_IO_REQUEST io_req;
3571 	struct mrsas_mpt_cmd *mpt_cmd;
3572 	struct mrsas_header *frame_hdr = &mfi_cmd->frame->hdr;
3573 
3574 	mpt_cmd = mrsas_get_mpt_cmd(sc);
3575 	if (!mpt_cmd)
3576 		return (1);
3577 
3578 	/* Save the smid. To be used for returning the cmd */
3579 	mfi_cmd->cmd_id.context.smid = mpt_cmd->index;
3580 
3581 	mpt_cmd->sync_cmd_idx = mfi_cmd->index;
3582 
3583 	/*
3584 	 * For cmds where the flag is set, store the flag and check on
3585 	 * completion. For cmds with this flag, don't call
3586 	 * mrsas_complete_cmd.
3587 	 */
3588 
3589 	if (frame_hdr->flags & MFI_FRAME_DONT_POST_IN_REPLY_QUEUE)
3590 		mpt_cmd->flags = MFI_FRAME_DONT_POST_IN_REPLY_QUEUE;
3591 
3592 	io_req = mpt_cmd->io_request;
3593 
3594 		if (sc->mrsas_gen3_ctrl) {
3595 		pMpi25IeeeSgeChain64_t sgl_ptr_end = (pMpi25IeeeSgeChain64_t)&io_req->SGL;
3596 
3597 		sgl_ptr_end += sc->max_sge_in_main_msg - 1;
3598 		sgl_ptr_end->Flags = 0;
3599 	}
3600 	mpi25_ieee_chain = (MPI25_IEEE_SGE_CHAIN64 *) & io_req->SGL.IeeeChain;
3601 
3602 	io_req->Function = MRSAS_MPI2_FUNCTION_PASSTHRU_IO_REQUEST;
3603 	io_req->SGLOffset0 = offsetof(MRSAS_RAID_SCSI_IO_REQUEST, SGL) / 4;
3604 	io_req->ChainOffset = sc->chain_offset_mfi_pthru;
3605 
3606 	mpi25_ieee_chain->Address = mfi_cmd->frame_phys_addr;
3607 
3608 	mpi25_ieee_chain->Flags = IEEE_SGE_FLAGS_CHAIN_ELEMENT |
3609 	    MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR;
3610 
3611 	mpi25_ieee_chain->Length = sc->max_chain_frame_sz;
3612 
3613 	return (0);
3614 }
3615 
3616 /*
3617  * mrsas_issue_blocked_cmd:	Synchronous wrapper around regular FW cmds
3618  * input:					Adapter soft state Command to be issued
3619  *
3620  * This function waits on an event for the command to be returned from the ISR.
3621  * Max wait time is MRSAS_INTERNAL_CMD_WAIT_TIME secs. Used for issuing
3622  * internal and ioctl commands.
3623  */
3624 int
3625 mrsas_issue_blocked_cmd(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd)
3626 {
3627 	u_int8_t max_wait = MRSAS_INTERNAL_CMD_WAIT_TIME;
3628 	unsigned long total_time = 0;
3629 	int retcode = SUCCESS;
3630 
3631 	/* Initialize cmd_status */
3632 	cmd->cmd_status = 0xFF;
3633 
3634 	/* Build MPT-MFI command for issue to FW */
3635 	if (mrsas_issue_dcmd(sc, cmd)) {
3636 		device_printf(sc->mrsas_dev, "Cannot issue DCMD internal command.\n");
3637 		return (1);
3638 	}
3639 	sc->chan = (void *)&cmd;
3640 
3641 	while (1) {
3642 		if (cmd->cmd_status == 0xFF) {
3643 			tsleep((void *)&sc->chan, 0, "mrsas_sleep", hz);
3644 		} else
3645 			break;
3646 
3647 		if (!cmd->sync_cmd) {	/* cmd->sync will be set for an IOCTL
3648 					 * command */
3649 			total_time++;
3650 			if (total_time >= max_wait) {
3651 				device_printf(sc->mrsas_dev,
3652 				    "Internal command timed out after %d seconds.\n", max_wait);
3653 				retcode = 1;
3654 				break;
3655 			}
3656 		}
3657 	}
3658 
3659 	if (cmd->cmd_status == 0xFF) {
3660 		device_printf(sc->mrsas_dev, "DCMD timed out after %d "
3661 		    "seconds from %s\n", max_wait, __func__);
3662 		device_printf(sc->mrsas_dev, "DCMD opcode 0x%X\n",
3663 		    cmd->frame->dcmd.opcode);
3664 		retcode = ETIMEDOUT;
3665 	}
3666 	return (retcode);
3667 }
3668 
3669 /*
3670  * mrsas_complete_mptmfi_passthru:	Completes a command
3671  * input:	@sc:					Adapter soft state
3672  * 			@cmd:					Command to be completed
3673  * 			@status:				cmd completion status
3674  *
3675  * This function is called from mrsas_complete_cmd() after an interrupt is
3676  * received from Firmware, and io_request->Function is
3677  * MRSAS_MPI2_FUNCTION_PASSTHRU_IO_REQUEST.
3678  */
3679 void
3680 mrsas_complete_mptmfi_passthru(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd,
3681     u_int8_t status)
3682 {
3683 	struct mrsas_header *hdr = &cmd->frame->hdr;
3684 	u_int8_t cmd_status = cmd->frame->hdr.cmd_status;
3685 
3686 	/* Reset the retry counter for future re-tries */
3687 	cmd->retry_for_fw_reset = 0;
3688 
3689 	if (cmd->ccb_ptr)
3690 		cmd->ccb_ptr = NULL;
3691 
3692 	switch (hdr->cmd) {
3693 	case MFI_CMD_INVALID:
3694 		device_printf(sc->mrsas_dev, "MFI_CMD_INVALID command.\n");
3695 		break;
3696 	case MFI_CMD_PD_SCSI_IO:
3697 	case MFI_CMD_LD_SCSI_IO:
3698 		/*
3699 		 * MFI_CMD_PD_SCSI_IO and MFI_CMD_LD_SCSI_IO could have been
3700 		 * issued either through an IO path or an IOCTL path. If it
3701 		 * was via IOCTL, we will send it to internal completion.
3702 		 */
3703 		if (cmd->sync_cmd) {
3704 			cmd->sync_cmd = 0;
3705 			mrsas_wakeup(sc, cmd);
3706 			break;
3707 		}
3708 	case MFI_CMD_SMP:
3709 	case MFI_CMD_STP:
3710 	case MFI_CMD_DCMD:
3711 		/* Check for LD map update */
3712 		if ((cmd->frame->dcmd.opcode == MR_DCMD_LD_MAP_GET_INFO) &&
3713 		    (cmd->frame->dcmd.mbox.b[1] == 1)) {
3714 			sc->fast_path_io = 0;
3715 			mtx_lock(&sc->raidmap_lock);
3716 			sc->map_update_cmd = NULL;
3717 			if (cmd_status != 0) {
3718 				if (cmd_status != MFI_STAT_NOT_FOUND)
3719 					device_printf(sc->mrsas_dev, "map sync failed, status=%x\n", cmd_status);
3720 				else {
3721 					mrsas_release_mfi_cmd(cmd);
3722 					mtx_unlock(&sc->raidmap_lock);
3723 					break;
3724 				}
3725 			} else
3726 				sc->map_id++;
3727 			mrsas_release_mfi_cmd(cmd);
3728 			if (MR_ValidateMapInfo(sc))
3729 				sc->fast_path_io = 0;
3730 			else
3731 				sc->fast_path_io = 1;
3732 			mrsas_sync_map_info(sc);
3733 			mtx_unlock(&sc->raidmap_lock);
3734 			break;
3735 		}
3736 		if (cmd->frame->dcmd.opcode == MR_DCMD_CTRL_EVENT_GET_INFO ||
3737 		    cmd->frame->dcmd.opcode == MR_DCMD_CTRL_EVENT_GET) {
3738 			sc->mrsas_aen_triggered = 0;
3739 		}
3740 		/* FW has an updated PD sequence */
3741 		if ((cmd->frame->dcmd.opcode ==
3742 		    MR_DCMD_SYSTEM_PD_MAP_GET_INFO) &&
3743 		    (cmd->frame->dcmd.mbox.b[0] == 1)) {
3744 
3745 			mtx_lock(&sc->raidmap_lock);
3746 			sc->jbod_seq_cmd = NULL;
3747 			mrsas_release_mfi_cmd(cmd);
3748 
3749 			if (cmd_status == MFI_STAT_OK) {
3750 				sc->pd_seq_map_id++;
3751 				/* Re-register a pd sync seq num cmd */
3752 				if (megasas_sync_pd_seq_num(sc, true))
3753 					sc->use_seqnum_jbod_fp = 0;
3754 			} else {
3755 				sc->use_seqnum_jbod_fp = 0;
3756 				device_printf(sc->mrsas_dev,
3757 				    "Jbod map sync failed, status=%x\n", cmd_status);
3758 			}
3759 			mtx_unlock(&sc->raidmap_lock);
3760 			break;
3761 		}
3762 		/* See if got an event notification */
3763 		if (cmd->frame->dcmd.opcode == MR_DCMD_CTRL_EVENT_WAIT)
3764 			mrsas_complete_aen(sc, cmd);
3765 		else
3766 			mrsas_wakeup(sc, cmd);
3767 		break;
3768 	case MFI_CMD_ABORT:
3769 		/* Command issued to abort another cmd return */
3770 		mrsas_complete_abort(sc, cmd);
3771 		break;
3772 	default:
3773 		device_printf(sc->mrsas_dev, "Unknown command completed! [0x%X]\n", hdr->cmd);
3774 		break;
3775 	}
3776 }
3777 
3778 /*
3779  * mrsas_wakeup:	Completes an internal command
3780  * input:			Adapter soft state
3781  * 					Command to be completed
3782  *
3783  * In mrsas_issue_blocked_cmd(), after a command is issued to Firmware, a wait
3784  * timer is started.  This function is called from
3785  * mrsas_complete_mptmfi_passthru() as it completes the command, to wake up
3786  * from the command wait.
3787  */
3788 void
3789 mrsas_wakeup(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd)
3790 {
3791 	cmd->cmd_status = cmd->frame->io.cmd_status;
3792 
3793 	if (cmd->cmd_status == 0xFF)
3794 		cmd->cmd_status = 0;
3795 
3796 	sc->chan = (void *)&cmd;
3797 	wakeup_one((void *)&sc->chan);
3798 	return;
3799 }
3800 
3801 /*
3802  * mrsas_shutdown_ctlr:       Instructs FW to shutdown the controller input:
3803  * Adapter soft state Shutdown/Hibernate
3804  *
3805  * This function issues a DCMD internal command to Firmware to initiate shutdown
3806  * of the controller.
3807  */
3808 static void
3809 mrsas_shutdown_ctlr(struct mrsas_softc *sc, u_int32_t opcode)
3810 {
3811 	struct mrsas_mfi_cmd *cmd;
3812 	struct mrsas_dcmd_frame *dcmd;
3813 
3814 	if (sc->adprecovery == MRSAS_HW_CRITICAL_ERROR)
3815 		return;
3816 
3817 	cmd = mrsas_get_mfi_cmd(sc);
3818 	if (!cmd) {
3819 		device_printf(sc->mrsas_dev, "Cannot allocate for shutdown cmd.\n");
3820 		return;
3821 	}
3822 	if (sc->aen_cmd)
3823 		mrsas_issue_blocked_abort_cmd(sc, sc->aen_cmd);
3824 	if (sc->map_update_cmd)
3825 		mrsas_issue_blocked_abort_cmd(sc, sc->map_update_cmd);
3826 	if (sc->jbod_seq_cmd)
3827 		mrsas_issue_blocked_abort_cmd(sc, sc->jbod_seq_cmd);
3828 
3829 	dcmd = &cmd->frame->dcmd;
3830 	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
3831 
3832 	dcmd->cmd = MFI_CMD_DCMD;
3833 	dcmd->cmd_status = 0x0;
3834 	dcmd->sge_count = 0;
3835 	dcmd->flags = MFI_FRAME_DIR_NONE;
3836 	dcmd->timeout = 0;
3837 	dcmd->pad_0 = 0;
3838 	dcmd->data_xfer_len = 0;
3839 	dcmd->opcode = opcode;
3840 
3841 	device_printf(sc->mrsas_dev, "Preparing to shut down controller.\n");
3842 
3843 	mrsas_issue_blocked_cmd(sc, cmd);
3844 	mrsas_release_mfi_cmd(cmd);
3845 
3846 	return;
3847 }
3848 
3849 /*
3850  * mrsas_flush_cache:         Requests FW to flush all its caches input:
3851  * Adapter soft state
3852  *
3853  * This function is issues a DCMD internal command to Firmware to initiate
3854  * flushing of all caches.
3855  */
3856 static void
3857 mrsas_flush_cache(struct mrsas_softc *sc)
3858 {
3859 	struct mrsas_mfi_cmd *cmd;
3860 	struct mrsas_dcmd_frame *dcmd;
3861 
3862 	if (sc->adprecovery == MRSAS_HW_CRITICAL_ERROR)
3863 		return;
3864 
3865 	cmd = mrsas_get_mfi_cmd(sc);
3866 	if (!cmd) {
3867 		device_printf(sc->mrsas_dev, "Cannot allocate for flush cache cmd.\n");
3868 		return;
3869 	}
3870 	dcmd = &cmd->frame->dcmd;
3871 	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
3872 
3873 	dcmd->cmd = MFI_CMD_DCMD;
3874 	dcmd->cmd_status = 0x0;
3875 	dcmd->sge_count = 0;
3876 	dcmd->flags = MFI_FRAME_DIR_NONE;
3877 	dcmd->timeout = 0;
3878 	dcmd->pad_0 = 0;
3879 	dcmd->data_xfer_len = 0;
3880 	dcmd->opcode = MR_DCMD_CTRL_CACHE_FLUSH;
3881 	dcmd->mbox.b[0] = MR_FLUSH_CTRL_CACHE | MR_FLUSH_DISK_CACHE;
3882 
3883 	mrsas_issue_blocked_cmd(sc, cmd);
3884 	mrsas_release_mfi_cmd(cmd);
3885 
3886 	return;
3887 }
3888 
3889 int
3890 megasas_sync_pd_seq_num(struct mrsas_softc *sc, boolean_t pend)
3891 {
3892 	int retcode = 0;
3893 	u_int8_t do_ocr = 1;
3894 	struct mrsas_mfi_cmd *cmd;
3895 	struct mrsas_dcmd_frame *dcmd;
3896 	uint32_t pd_seq_map_sz;
3897 	struct MR_PD_CFG_SEQ_NUM_SYNC *pd_sync;
3898 	bus_addr_t pd_seq_h;
3899 
3900 	pd_seq_map_sz = sizeof(struct MR_PD_CFG_SEQ_NUM_SYNC) +
3901 	    (sizeof(struct MR_PD_CFG_SEQ) *
3902 	    (MAX_PHYSICAL_DEVICES - 1));
3903 
3904 	cmd = mrsas_get_mfi_cmd(sc);
3905 	if (!cmd) {
3906 		device_printf(sc->mrsas_dev,
3907 		    "Cannot alloc for ld map info cmd.\n");
3908 		return 1;
3909 	}
3910 	dcmd = &cmd->frame->dcmd;
3911 
3912 	pd_sync = (void *)sc->jbodmap_mem[(sc->pd_seq_map_id & 1)];
3913 	pd_seq_h = sc->jbodmap_phys_addr[(sc->pd_seq_map_id & 1)];
3914 	if (!pd_sync) {
3915 		device_printf(sc->mrsas_dev,
3916 		    "Failed to alloc mem for jbod map info.\n");
3917 		mrsas_release_mfi_cmd(cmd);
3918 		return (ENOMEM);
3919 	}
3920 	memset(pd_sync, 0, pd_seq_map_sz);
3921 	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
3922 	dcmd->cmd = MFI_CMD_DCMD;
3923 	dcmd->cmd_status = 0xFF;
3924 	dcmd->sge_count = 1;
3925 	dcmd->timeout = 0;
3926 	dcmd->pad_0 = 0;
3927 	dcmd->data_xfer_len = (pd_seq_map_sz);
3928 	dcmd->opcode = (MR_DCMD_SYSTEM_PD_MAP_GET_INFO);
3929 	dcmd->sgl.sge32[0].phys_addr = (pd_seq_h);
3930 	dcmd->sgl.sge32[0].length = (pd_seq_map_sz);
3931 
3932 	if (pend) {
3933 		dcmd->mbox.b[0] = MRSAS_DCMD_MBOX_PEND_FLAG;
3934 		dcmd->flags = (MFI_FRAME_DIR_WRITE);
3935 		sc->jbod_seq_cmd = cmd;
3936 		if (mrsas_issue_dcmd(sc, cmd)) {
3937 			device_printf(sc->mrsas_dev,
3938 			    "Fail to send sync map info command.\n");
3939 			return 1;
3940 		} else
3941 			return 0;
3942 	} else
3943 		dcmd->flags = MFI_FRAME_DIR_READ;
3944 
3945 	retcode = mrsas_issue_polled(sc, cmd);
3946 	if (retcode == ETIMEDOUT)
3947 		goto dcmd_timeout;
3948 
3949 	if (pd_sync->count > MAX_PHYSICAL_DEVICES) {
3950 		device_printf(sc->mrsas_dev,
3951 		    "driver supports max %d JBOD, but FW reports %d\n",
3952 		    MAX_PHYSICAL_DEVICES, pd_sync->count);
3953 		retcode = -EINVAL;
3954 	}
3955 	if (!retcode)
3956 		sc->pd_seq_map_id++;
3957 	do_ocr = 0;
3958 
3959 dcmd_timeout:
3960 	if (do_ocr)
3961 		sc->do_timedout_reset = MFI_DCMD_TIMEOUT_OCR;
3962 
3963 	return (retcode);
3964 }
3965 
3966 /*
3967  * mrsas_get_map_info:        Load and validate RAID map input:
3968  * Adapter instance soft state
3969  *
3970  * This function calls mrsas_get_ld_map_info() and MR_ValidateMapInfo() to load
3971  * and validate RAID map.  It returns 0 if successful, 1 other- wise.
3972  */
3973 static int
3974 mrsas_get_map_info(struct mrsas_softc *sc)
3975 {
3976 	uint8_t retcode = 0;
3977 
3978 	sc->fast_path_io = 0;
3979 	if (!mrsas_get_ld_map_info(sc)) {
3980 		retcode = MR_ValidateMapInfo(sc);
3981 		if (retcode == 0) {
3982 			sc->fast_path_io = 1;
3983 			return 0;
3984 		}
3985 	}
3986 	return 1;
3987 }
3988 
3989 /*
3990  * mrsas_get_ld_map_info:      Get FW's ld_map structure input:
3991  * Adapter instance soft state
3992  *
3993  * Issues an internal command (DCMD) to get the FW's controller PD list
3994  * structure.
3995  */
3996 static int
3997 mrsas_get_ld_map_info(struct mrsas_softc *sc)
3998 {
3999 	int retcode = 0;
4000 	struct mrsas_mfi_cmd *cmd;
4001 	struct mrsas_dcmd_frame *dcmd;
4002 	void *map;
4003 	bus_addr_t map_phys_addr = 0;
4004 
4005 	cmd = mrsas_get_mfi_cmd(sc);
4006 	if (!cmd) {
4007 		device_printf(sc->mrsas_dev,
4008 		    "Cannot alloc for ld map info cmd.\n");
4009 		return 1;
4010 	}
4011 	dcmd = &cmd->frame->dcmd;
4012 
4013 	map = (void *)sc->raidmap_mem[(sc->map_id & 1)];
4014 	map_phys_addr = sc->raidmap_phys_addr[(sc->map_id & 1)];
4015 	if (!map) {
4016 		device_printf(sc->mrsas_dev,
4017 		    "Failed to alloc mem for ld map info.\n");
4018 		mrsas_release_mfi_cmd(cmd);
4019 		return (ENOMEM);
4020 	}
4021 	memset(map, 0, sizeof(sc->max_map_sz));
4022 	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
4023 
4024 	dcmd->cmd = MFI_CMD_DCMD;
4025 	dcmd->cmd_status = 0xFF;
4026 	dcmd->sge_count = 1;
4027 	dcmd->flags = MFI_FRAME_DIR_READ;
4028 	dcmd->timeout = 0;
4029 	dcmd->pad_0 = 0;
4030 	dcmd->data_xfer_len = sc->current_map_sz;
4031 	dcmd->opcode = MR_DCMD_LD_MAP_GET_INFO;
4032 	dcmd->sgl.sge32[0].phys_addr = map_phys_addr;
4033 	dcmd->sgl.sge32[0].length = sc->current_map_sz;
4034 
4035 	retcode = mrsas_issue_polled(sc, cmd);
4036 	if (retcode == ETIMEDOUT)
4037 		sc->do_timedout_reset = MFI_DCMD_TIMEOUT_OCR;
4038 
4039 	return (retcode);
4040 }
4041 
4042 /*
4043  * mrsas_sync_map_info:        Get FW's ld_map structure input:
4044  * Adapter instance soft state
4045  *
4046  * Issues an internal command (DCMD) to get the FW's controller PD list
4047  * structure.
4048  */
4049 static int
4050 mrsas_sync_map_info(struct mrsas_softc *sc)
4051 {
4052 	int retcode = 0, i;
4053 	struct mrsas_mfi_cmd *cmd;
4054 	struct mrsas_dcmd_frame *dcmd;
4055 	uint32_t size_sync_info, num_lds;
4056 	MR_LD_TARGET_SYNC *target_map = NULL;
4057 	MR_DRV_RAID_MAP_ALL *map;
4058 	MR_LD_RAID *raid;
4059 	MR_LD_TARGET_SYNC *ld_sync;
4060 	bus_addr_t map_phys_addr = 0;
4061 
4062 	cmd = mrsas_get_mfi_cmd(sc);
4063 	if (!cmd) {
4064 		device_printf(sc->mrsas_dev, "Cannot alloc for sync map info cmd\n");
4065 		return ENOMEM;
4066 	}
4067 	map = sc->ld_drv_map[sc->map_id & 1];
4068 	num_lds = map->raidMap.ldCount;
4069 
4070 	dcmd = &cmd->frame->dcmd;
4071 	size_sync_info = sizeof(MR_LD_TARGET_SYNC) * num_lds;
4072 	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
4073 
4074 	target_map = (MR_LD_TARGET_SYNC *) sc->raidmap_mem[(sc->map_id - 1) & 1];
4075 	memset(target_map, 0, sc->max_map_sz);
4076 
4077 	map_phys_addr = sc->raidmap_phys_addr[(sc->map_id - 1) & 1];
4078 
4079 	ld_sync = (MR_LD_TARGET_SYNC *) target_map;
4080 
4081 	for (i = 0; i < num_lds; i++, ld_sync++) {
4082 		raid = MR_LdRaidGet(i, map);
4083 		ld_sync->targetId = MR_GetLDTgtId(i, map);
4084 		ld_sync->seqNum = raid->seqNum;
4085 	}
4086 
4087 	dcmd->cmd = MFI_CMD_DCMD;
4088 	dcmd->cmd_status = 0xFF;
4089 	dcmd->sge_count = 1;
4090 	dcmd->flags = MFI_FRAME_DIR_WRITE;
4091 	dcmd->timeout = 0;
4092 	dcmd->pad_0 = 0;
4093 	dcmd->data_xfer_len = sc->current_map_sz;
4094 	dcmd->mbox.b[0] = num_lds;
4095 	dcmd->mbox.b[1] = MRSAS_DCMD_MBOX_PEND_FLAG;
4096 	dcmd->opcode = MR_DCMD_LD_MAP_GET_INFO;
4097 	dcmd->sgl.sge32[0].phys_addr = map_phys_addr;
4098 	dcmd->sgl.sge32[0].length = sc->current_map_sz;
4099 
4100 	sc->map_update_cmd = cmd;
4101 	if (mrsas_issue_dcmd(sc, cmd)) {
4102 		device_printf(sc->mrsas_dev,
4103 		    "Fail to send sync map info command.\n");
4104 		return (1);
4105 	}
4106 	return (retcode);
4107 }
4108 
4109 /*
4110  * mrsas_get_pd_list:           Returns FW's PD list structure input:
4111  * Adapter soft state
4112  *
4113  * Issues an internal command (DCMD) to get the FW's controller PD list
4114  * structure.  This information is mainly used to find out about system
4115  * supported by Firmware.
4116  */
4117 static int
4118 mrsas_get_pd_list(struct mrsas_softc *sc)
4119 {
4120 	int retcode = 0, pd_index = 0, pd_count = 0, pd_list_size;
4121 	u_int8_t do_ocr = 1;
4122 	struct mrsas_mfi_cmd *cmd;
4123 	struct mrsas_dcmd_frame *dcmd;
4124 	struct MR_PD_LIST *pd_list_mem;
4125 	struct MR_PD_ADDRESS *pd_addr;
4126 	bus_addr_t pd_list_phys_addr = 0;
4127 	struct mrsas_tmp_dcmd *tcmd;
4128 
4129 	cmd = mrsas_get_mfi_cmd(sc);
4130 	if (!cmd) {
4131 		device_printf(sc->mrsas_dev,
4132 		    "Cannot alloc for get PD list cmd\n");
4133 		return 1;
4134 	}
4135 	dcmd = &cmd->frame->dcmd;
4136 
4137 	tcmd = malloc(sizeof(struct mrsas_tmp_dcmd), M_MRSAS, M_NOWAIT);
4138 	pd_list_size = MRSAS_MAX_PD * sizeof(struct MR_PD_LIST);
4139 	if (mrsas_alloc_tmp_dcmd(sc, tcmd, pd_list_size) != SUCCESS) {
4140 		device_printf(sc->mrsas_dev,
4141 		    "Cannot alloc dmamap for get PD list cmd\n");
4142 		mrsas_release_mfi_cmd(cmd);
4143 		mrsas_free_tmp_dcmd(tcmd);
4144 		free(tcmd, M_MRSAS);
4145 		return (ENOMEM);
4146 	} else {
4147 		pd_list_mem = tcmd->tmp_dcmd_mem;
4148 		pd_list_phys_addr = tcmd->tmp_dcmd_phys_addr;
4149 	}
4150 	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
4151 
4152 	dcmd->mbox.b[0] = MR_PD_QUERY_TYPE_EXPOSED_TO_HOST;
4153 	dcmd->mbox.b[1] = 0;
4154 	dcmd->cmd = MFI_CMD_DCMD;
4155 	dcmd->cmd_status = 0xFF;
4156 	dcmd->sge_count = 1;
4157 	dcmd->flags = MFI_FRAME_DIR_READ;
4158 	dcmd->timeout = 0;
4159 	dcmd->pad_0 = 0;
4160 	dcmd->data_xfer_len = MRSAS_MAX_PD * sizeof(struct MR_PD_LIST);
4161 	dcmd->opcode = MR_DCMD_PD_LIST_QUERY;
4162 	dcmd->sgl.sge32[0].phys_addr = pd_list_phys_addr;
4163 	dcmd->sgl.sge32[0].length = MRSAS_MAX_PD * sizeof(struct MR_PD_LIST);
4164 
4165 	if (!sc->mask_interrupts)
4166 		retcode = mrsas_issue_blocked_cmd(sc, cmd);
4167 	else
4168 		retcode = mrsas_issue_polled(sc, cmd);
4169 
4170 	if (retcode == ETIMEDOUT)
4171 		goto dcmd_timeout;
4172 
4173 	/* Get the instance PD list */
4174 	pd_count = MRSAS_MAX_PD;
4175 	pd_addr = pd_list_mem->addr;
4176 	if (pd_list_mem->count < pd_count) {
4177 		memset(sc->local_pd_list, 0,
4178 		    MRSAS_MAX_PD * sizeof(struct mrsas_pd_list));
4179 		for (pd_index = 0; pd_index < pd_list_mem->count; pd_index++) {
4180 			sc->local_pd_list[pd_addr->deviceId].tid = pd_addr->deviceId;
4181 			sc->local_pd_list[pd_addr->deviceId].driveType =
4182 			    pd_addr->scsiDevType;
4183 			sc->local_pd_list[pd_addr->deviceId].driveState =
4184 			    MR_PD_STATE_SYSTEM;
4185 			pd_addr++;
4186 		}
4187 		/*
4188 		 * Use mutext/spinlock if pd_list component size increase more than
4189 		 * 32 bit.
4190 		 */
4191 		memcpy(sc->pd_list, sc->local_pd_list, sizeof(sc->local_pd_list));
4192 		do_ocr = 0;
4193 	}
4194 dcmd_timeout:
4195 	mrsas_free_tmp_dcmd(tcmd);
4196 	free(tcmd, M_MRSAS);
4197 
4198 	if (do_ocr)
4199 		sc->do_timedout_reset = MFI_DCMD_TIMEOUT_OCR;
4200 
4201 	if (!sc->mask_interrupts)
4202 		mrsas_release_mfi_cmd(cmd);
4203 
4204 	return (retcode);
4205 }
4206 
4207 /*
4208  * mrsas_get_ld_list:           Returns FW's LD list structure input:
4209  * Adapter soft state
4210  *
4211  * Issues an internal command (DCMD) to get the FW's controller PD list
4212  * structure.  This information is mainly used to find out about supported by
4213  * the FW.
4214  */
4215 static int
4216 mrsas_get_ld_list(struct mrsas_softc *sc)
4217 {
4218 	int ld_list_size, retcode = 0, ld_index = 0, ids = 0;
4219 	u_int8_t do_ocr = 1;
4220 	struct mrsas_mfi_cmd *cmd;
4221 	struct mrsas_dcmd_frame *dcmd;
4222 	struct MR_LD_LIST *ld_list_mem;
4223 	bus_addr_t ld_list_phys_addr = 0;
4224 	struct mrsas_tmp_dcmd *tcmd;
4225 
4226 	cmd = mrsas_get_mfi_cmd(sc);
4227 	if (!cmd) {
4228 		device_printf(sc->mrsas_dev,
4229 		    "Cannot alloc for get LD list cmd\n");
4230 		return 1;
4231 	}
4232 	dcmd = &cmd->frame->dcmd;
4233 
4234 	tcmd = malloc(sizeof(struct mrsas_tmp_dcmd), M_MRSAS, M_NOWAIT);
4235 	ld_list_size = sizeof(struct MR_LD_LIST);
4236 	if (mrsas_alloc_tmp_dcmd(sc, tcmd, ld_list_size) != SUCCESS) {
4237 		device_printf(sc->mrsas_dev,
4238 		    "Cannot alloc dmamap for get LD list cmd\n");
4239 		mrsas_release_mfi_cmd(cmd);
4240 		mrsas_free_tmp_dcmd(tcmd);
4241 		free(tcmd, M_MRSAS);
4242 		return (ENOMEM);
4243 	} else {
4244 		ld_list_mem = tcmd->tmp_dcmd_mem;
4245 		ld_list_phys_addr = tcmd->tmp_dcmd_phys_addr;
4246 	}
4247 	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
4248 
4249 	if (sc->max256vdSupport)
4250 		dcmd->mbox.b[0] = 1;
4251 
4252 	dcmd->cmd = MFI_CMD_DCMD;
4253 	dcmd->cmd_status = 0xFF;
4254 	dcmd->sge_count = 1;
4255 	dcmd->flags = MFI_FRAME_DIR_READ;
4256 	dcmd->timeout = 0;
4257 	dcmd->data_xfer_len = sizeof(struct MR_LD_LIST);
4258 	dcmd->opcode = MR_DCMD_LD_GET_LIST;
4259 	dcmd->sgl.sge32[0].phys_addr = ld_list_phys_addr;
4260 	dcmd->sgl.sge32[0].length = sizeof(struct MR_LD_LIST);
4261 	dcmd->pad_0 = 0;
4262 
4263 	if (!sc->mask_interrupts)
4264 		retcode = mrsas_issue_blocked_cmd(sc, cmd);
4265 	else
4266 		retcode = mrsas_issue_polled(sc, cmd);
4267 
4268 	if (retcode == ETIMEDOUT)
4269 		goto dcmd_timeout;
4270 
4271 #if VD_EXT_DEBUG
4272 	printf("Number of LDs %d\n", ld_list_mem->ldCount);
4273 #endif
4274 
4275 	/* Get the instance LD list */
4276 	if (ld_list_mem->ldCount <= sc->fw_supported_vd_count) {
4277 		sc->CurLdCount = ld_list_mem->ldCount;
4278 		memset(sc->ld_ids, 0xff, MAX_LOGICAL_DRIVES_EXT);
4279 		for (ld_index = 0; ld_index < ld_list_mem->ldCount; ld_index++) {
4280 			if (ld_list_mem->ldList[ld_index].state != 0) {
4281 				ids = ld_list_mem->ldList[ld_index].ref.ld_context.targetId;
4282 				sc->ld_ids[ids] = ld_list_mem->ldList[ld_index].ref.ld_context.targetId;
4283 			}
4284 		}
4285 		do_ocr = 0;
4286 	}
4287 dcmd_timeout:
4288 	mrsas_free_tmp_dcmd(tcmd);
4289 	free(tcmd, M_MRSAS);
4290 
4291 	if (do_ocr)
4292 		sc->do_timedout_reset = MFI_DCMD_TIMEOUT_OCR;
4293 	if (!sc->mask_interrupts)
4294 		mrsas_release_mfi_cmd(cmd);
4295 
4296 	return (retcode);
4297 }
4298 
4299 /*
4300  * mrsas_alloc_tmp_dcmd:       Allocates memory for temporary command input:
4301  * Adapter soft state Temp command Size of alloction
4302  *
4303  * Allocates DMAable memory for a temporary internal command. The allocated
4304  * memory is initialized to all zeros upon successful loading of the dma
4305  * mapped memory.
4306  */
4307 int
4308 mrsas_alloc_tmp_dcmd(struct mrsas_softc *sc,
4309     struct mrsas_tmp_dcmd *tcmd, int size)
4310 {
4311 	if (bus_dma_tag_create(sc->mrsas_parent_tag,
4312 	    1, 0,
4313 	    BUS_SPACE_MAXADDR_32BIT,
4314 	    BUS_SPACE_MAXADDR,
4315 	    NULL, NULL,
4316 	    size,
4317 	    1,
4318 	    size,
4319 	    BUS_DMA_ALLOCNOW,
4320 	    NULL, NULL,
4321 	    &tcmd->tmp_dcmd_tag)) {
4322 		device_printf(sc->mrsas_dev, "Cannot allocate tmp dcmd tag\n");
4323 		return (ENOMEM);
4324 	}
4325 	if (bus_dmamem_alloc(tcmd->tmp_dcmd_tag, (void **)&tcmd->tmp_dcmd_mem,
4326 	    BUS_DMA_NOWAIT, &tcmd->tmp_dcmd_dmamap)) {
4327 		device_printf(sc->mrsas_dev, "Cannot allocate tmp dcmd mem\n");
4328 		return (ENOMEM);
4329 	}
4330 	if (bus_dmamap_load(tcmd->tmp_dcmd_tag, tcmd->tmp_dcmd_dmamap,
4331 	    tcmd->tmp_dcmd_mem, size, mrsas_addr_cb,
4332 	    &tcmd->tmp_dcmd_phys_addr, BUS_DMA_NOWAIT)) {
4333 		device_printf(sc->mrsas_dev, "Cannot load tmp dcmd mem\n");
4334 		return (ENOMEM);
4335 	}
4336 	memset(tcmd->tmp_dcmd_mem, 0, size);
4337 	return (0);
4338 }
4339 
4340 /*
4341  * mrsas_free_tmp_dcmd:      Free memory for temporary command input:
4342  * temporary dcmd pointer
4343  *
4344  * Deallocates memory of the temporary command for use in the construction of
4345  * the internal DCMD.
4346  */
4347 void
4348 mrsas_free_tmp_dcmd(struct mrsas_tmp_dcmd *tmp)
4349 {
4350 	if (tmp->tmp_dcmd_phys_addr)
4351 		bus_dmamap_unload(tmp->tmp_dcmd_tag, tmp->tmp_dcmd_dmamap);
4352 	if (tmp->tmp_dcmd_mem != NULL)
4353 		bus_dmamem_free(tmp->tmp_dcmd_tag, tmp->tmp_dcmd_mem, tmp->tmp_dcmd_dmamap);
4354 	if (tmp->tmp_dcmd_tag != NULL)
4355 		bus_dma_tag_destroy(tmp->tmp_dcmd_tag);
4356 }
4357 
4358 /*
4359  * mrsas_issue_blocked_abort_cmd:       Aborts previously issued cmd input:
4360  * Adapter soft state Previously issued cmd to be aborted
4361  *
4362  * This function is used to abort previously issued commands, such as AEN and
4363  * RAID map sync map commands.  The abort command is sent as a DCMD internal
4364  * command and subsequently the driver will wait for a return status.  The
4365  * max wait time is MRSAS_INTERNAL_CMD_WAIT_TIME seconds.
4366  */
4367 static int
4368 mrsas_issue_blocked_abort_cmd(struct mrsas_softc *sc,
4369     struct mrsas_mfi_cmd *cmd_to_abort)
4370 {
4371 	struct mrsas_mfi_cmd *cmd;
4372 	struct mrsas_abort_frame *abort_fr;
4373 	u_int8_t retcode = 0;
4374 	unsigned long total_time = 0;
4375 	u_int8_t max_wait = MRSAS_INTERNAL_CMD_WAIT_TIME;
4376 
4377 	cmd = mrsas_get_mfi_cmd(sc);
4378 	if (!cmd) {
4379 		device_printf(sc->mrsas_dev, "Cannot alloc for abort cmd\n");
4380 		return (1);
4381 	}
4382 	abort_fr = &cmd->frame->abort;
4383 
4384 	/* Prepare and issue the abort frame */
4385 	abort_fr->cmd = MFI_CMD_ABORT;
4386 	abort_fr->cmd_status = 0xFF;
4387 	abort_fr->flags = 0;
4388 	abort_fr->abort_context = cmd_to_abort->index;
4389 	abort_fr->abort_mfi_phys_addr_lo = cmd_to_abort->frame_phys_addr;
4390 	abort_fr->abort_mfi_phys_addr_hi = 0;
4391 
4392 	cmd->sync_cmd = 1;
4393 	cmd->cmd_status = 0xFF;
4394 
4395 	if (mrsas_issue_dcmd(sc, cmd)) {
4396 		device_printf(sc->mrsas_dev, "Fail to send abort command.\n");
4397 		return (1);
4398 	}
4399 	/* Wait for this cmd to complete */
4400 	sc->chan = (void *)&cmd;
4401 	while (1) {
4402 		if (cmd->cmd_status == 0xFF) {
4403 			tsleep((void *)&sc->chan, 0, "mrsas_sleep", hz);
4404 		} else
4405 			break;
4406 		total_time++;
4407 		if (total_time >= max_wait) {
4408 			device_printf(sc->mrsas_dev, "Abort cmd timed out after %d sec.\n", max_wait);
4409 			retcode = 1;
4410 			break;
4411 		}
4412 	}
4413 
4414 	cmd->sync_cmd = 0;
4415 	mrsas_release_mfi_cmd(cmd);
4416 	return (retcode);
4417 }
4418 
4419 /*
4420  * mrsas_complete_abort:      Completes aborting a command input:
4421  * Adapter soft state Cmd that was issued to abort another cmd
4422  *
4423  * The mrsas_issue_blocked_abort_cmd() function waits for the command status to
4424  * change after sending the command.  This function is called from
4425  * mrsas_complete_mptmfi_passthru() to wake up the sleep thread associated.
4426  */
4427 void
4428 mrsas_complete_abort(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd)
4429 {
4430 	if (cmd->sync_cmd) {
4431 		cmd->sync_cmd = 0;
4432 		cmd->cmd_status = 0;
4433 		sc->chan = (void *)&cmd;
4434 		wakeup_one((void *)&sc->chan);
4435 	}
4436 	return;
4437 }
4438 
4439 /*
4440  * mrsas_aen_handler:	AEN processing callback function from thread context
4441  * input:				Adapter soft state
4442  *
4443  * Asynchronous event handler
4444  */
4445 void
4446 mrsas_aen_handler(struct mrsas_softc *sc)
4447 {
4448 	union mrsas_evt_class_locale class_locale;
4449 	int doscan = 0;
4450 	u_int32_t seq_num;
4451  	int error, fail_aen = 0;
4452 
4453 	if (sc == NULL) {
4454 		printf("invalid instance!\n");
4455 		return;
4456 	}
4457 	if (sc->remove_in_progress || sc->reset_in_progress) {
4458 		device_printf(sc->mrsas_dev, "Returning from %s, line no %d\n",
4459 			__func__, __LINE__);
4460 		return;
4461 	}
4462 	if (sc->evt_detail_mem) {
4463 		switch (sc->evt_detail_mem->code) {
4464 		case MR_EVT_PD_INSERTED:
4465 			fail_aen = mrsas_get_pd_list(sc);
4466 			if (!fail_aen)
4467 				mrsas_bus_scan_sim(sc, sc->sim_1);
4468 			else
4469 				goto skip_register_aen;
4470 			break;
4471 		case MR_EVT_PD_REMOVED:
4472 			fail_aen = mrsas_get_pd_list(sc);
4473 			if (!fail_aen)
4474 				mrsas_bus_scan_sim(sc, sc->sim_1);
4475 			else
4476 				goto skip_register_aen;
4477 			break;
4478 		case MR_EVT_LD_OFFLINE:
4479 		case MR_EVT_CFG_CLEARED:
4480 		case MR_EVT_LD_DELETED:
4481 			mrsas_bus_scan_sim(sc, sc->sim_0);
4482 			break;
4483 		case MR_EVT_LD_CREATED:
4484 			fail_aen = mrsas_get_ld_list(sc);
4485 			if (!fail_aen)
4486 				mrsas_bus_scan_sim(sc, sc->sim_0);
4487 			else
4488 				goto skip_register_aen;
4489 			break;
4490 		case MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED:
4491 		case MR_EVT_FOREIGN_CFG_IMPORTED:
4492 		case MR_EVT_LD_STATE_CHANGE:
4493 			doscan = 1;
4494 			break;
4495 		case MR_EVT_CTRL_PROP_CHANGED:
4496 			fail_aen = mrsas_get_ctrl_info(sc);
4497 			if (fail_aen)
4498 				goto skip_register_aen;
4499 			break;
4500 		default:
4501 			break;
4502 		}
4503 	} else {
4504 		device_printf(sc->mrsas_dev, "invalid evt_detail\n");
4505 		return;
4506 	}
4507 	if (doscan) {
4508 		fail_aen = mrsas_get_pd_list(sc);
4509 		if (!fail_aen) {
4510 			mrsas_dprint(sc, MRSAS_AEN, "scanning ...sim 1\n");
4511 			mrsas_bus_scan_sim(sc, sc->sim_1);
4512 		} else
4513 			goto skip_register_aen;
4514 
4515 		fail_aen = mrsas_get_ld_list(sc);
4516 		if (!fail_aen) {
4517 			mrsas_dprint(sc, MRSAS_AEN, "scanning ...sim 0\n");
4518 			mrsas_bus_scan_sim(sc, sc->sim_0);
4519 		} else
4520 			goto skip_register_aen;
4521 	}
4522 	seq_num = sc->evt_detail_mem->seq_num + 1;
4523 
4524 	/* Register AEN with FW for latest sequence number plus 1 */
4525 	class_locale.members.reserved = 0;
4526 	class_locale.members.locale = MR_EVT_LOCALE_ALL;
4527 	class_locale.members.class = MR_EVT_CLASS_DEBUG;
4528 
4529 	if (sc->aen_cmd != NULL)
4530 		return;
4531 
4532 	mtx_lock(&sc->aen_lock);
4533 	error = mrsas_register_aen(sc, seq_num,
4534 	    class_locale.word);
4535 	mtx_unlock(&sc->aen_lock);
4536 
4537 	if (error)
4538 		device_printf(sc->mrsas_dev, "register aen failed error %x\n", error);
4539 
4540 skip_register_aen:
4541 	return;
4542 
4543 }
4544 
4545 
4546 /*
4547  * mrsas_complete_aen:	Completes AEN command
4548  * input:				Adapter soft state
4549  * 						Cmd that was issued to abort another cmd
4550  *
4551  * This function will be called from ISR and will continue event processing from
4552  * thread context by enqueuing task in ev_tq (callback function
4553  * "mrsas_aen_handler").
4554  */
4555 void
4556 mrsas_complete_aen(struct mrsas_softc *sc, struct mrsas_mfi_cmd *cmd)
4557 {
4558 	/*
4559 	 * Don't signal app if it is just an aborted previously registered
4560 	 * aen
4561 	 */
4562 	if ((!cmd->abort_aen) && (sc->remove_in_progress == 0)) {
4563 		sc->mrsas_aen_triggered = 1;
4564 		mtx_lock(&sc->aen_lock);
4565 		if (sc->mrsas_poll_waiting) {
4566 			sc->mrsas_poll_waiting = 0;
4567 			selwakeup(&sc->mrsas_select);
4568 		}
4569 		mtx_unlock(&sc->aen_lock);
4570 	} else
4571 		cmd->abort_aen = 0;
4572 
4573 	sc->aen_cmd = NULL;
4574 	mrsas_release_mfi_cmd(cmd);
4575 
4576 	taskqueue_enqueue(sc->ev_tq, &sc->ev_task);
4577 
4578 	return;
4579 }
4580 
4581 static device_method_t mrsas_methods[] = {
4582 	DEVMETHOD(device_probe, mrsas_probe),
4583 	DEVMETHOD(device_attach, mrsas_attach),
4584 	DEVMETHOD(device_detach, mrsas_detach),
4585 	DEVMETHOD(device_suspend, mrsas_suspend),
4586 	DEVMETHOD(device_resume, mrsas_resume),
4587 	DEVMETHOD(bus_print_child, bus_generic_print_child),
4588 	DEVMETHOD(bus_driver_added, bus_generic_driver_added),
4589 	{0, 0}
4590 };
4591 
4592 static driver_t mrsas_driver = {
4593 	"mrsas",
4594 	mrsas_methods,
4595 	sizeof(struct mrsas_softc)
4596 };
4597 
4598 static devclass_t mrsas_devclass;
4599 
4600 DRIVER_MODULE(mrsas, pci, mrsas_driver, mrsas_devclass, 0, 0);
4601 MODULE_DEPEND(mrsas, cam, 1, 1, 1);
4602