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