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: --- 17 unchanged lines hidden (view full) --- 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 */ 32 33#include <sys/cdefs.h> |
34__FBSDID("$FreeBSD: head/sys/dev/mrsas/mrsas_cam.c 299670 2016-05-13 12:18:12Z kadesai $"); |
35 36#include "dev/mrsas/mrsas.h" 37 38#include <cam/cam.h> 39#include <cam/cam_ccb.h> 40#include <cam/cam_sim.h> 41#include <cam/cam_xpt_sim.h> 42#include <cam/cam_debug.h> --- 824 unchanged lines hidden (view full) --- 867 868 if (fp_possible) { 869 mrsas_set_pd_lba(io_request, csio->cdb_len, &io_info, ccb, map_ptr, 870 start_lba_lo, ld_block_size); 871 io_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST; 872 cmd->request_desc->SCSIIO.RequestFlags = 873 (MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY << 874 MRSAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); |
875 if ((sc->device_id == MRSAS_INVADER) || 876 (sc->device_id == MRSAS_FURY) || 877 (sc->device_id == MRSAS_INTRUDER) || 878 (sc->device_id == MRSAS_INTRUDER_24)) { |
879 if (io_request->RaidContext.regLockFlags == REGION_TYPE_UNUSED) 880 cmd->request_desc->SCSIIO.RequestFlags = 881 (MRSAS_REQ_DESCRIPT_FLAGS_NO_LOCK << 882 MRSAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); 883 io_request->RaidContext.Type = MPI2_TYPE_CUDA; 884 io_request->RaidContext.nseg = 0x1; 885 io_request->IoFlags |= MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH; 886 io_request->RaidContext.regLockFlags |= --- 12 unchanged lines hidden (view full) --- 899 cmd->request_desc->SCSIIO.DevHandle = io_info.devHandle; 900 io_request->DevHandle = io_info.devHandle; 901 } else { 902 /* Not FP IO */ 903 io_request->RaidContext.timeoutValue = map_ptr->raidMap.fpPdIoTimeoutSec; 904 cmd->request_desc->SCSIIO.RequestFlags = 905 (MRSAS_REQ_DESCRIPT_FLAGS_LD_IO << 906 MRSAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); |
907 if ((sc->device_id == MRSAS_INVADER) || 908 (sc->device_id == MRSAS_FURY) || 909 (sc->device_id == MRSAS_INTRUDER) || 910 (sc->device_id == MRSAS_INTRUDER_24)) { |
911 if (io_request->RaidContext.regLockFlags == REGION_TYPE_UNUSED) 912 cmd->request_desc->SCSIIO.RequestFlags = 913 (MRSAS_REQ_DESCRIPT_FLAGS_NO_LOCK << 914 MRSAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); 915 io_request->RaidContext.Type = MPI2_TYPE_CUDA; 916 io_request->RaidContext.regLockFlags |= 917 (MR_RL_FLAGS_GRANT_DESTINATION_CPU0 | 918 MR_RL_FLAGS_SEQ_NUM_ENABLE); --- 259 unchanged lines hidden (view full) --- 1178 BUS_DMASYNC_PREWRITE); 1179 if (nseg > sc->max_num_sge) { 1180 device_printf(sc->mrsas_dev, "SGE count is too large or 0.\n"); 1181 return; 1182 } 1183 io_request = cmd->io_request; 1184 sgl_ptr = (pMpi25IeeeSgeChain64_t)&io_request->SGL; 1185 |
1186 if ((sc->device_id == MRSAS_INVADER) || 1187 (sc->device_id == MRSAS_FURY) || 1188 (sc->device_id == MRSAS_INTRUDER) || 1189 (sc->device_id == MRSAS_INTRUDER_24)) { |
1190 pMpi25IeeeSgeChain64_t sgl_ptr_end = sgl_ptr; 1191 1192 sgl_ptr_end += sc->max_sge_in_main_msg - 1; 1193 sgl_ptr_end->Flags = 0; 1194 } 1195 if (nseg != 0) { 1196 for (i = 0; i < nseg; i++) { 1197 sgl_ptr->Address = segs[i].ds_addr; 1198 sgl_ptr->Length = segs[i].ds_len; 1199 sgl_ptr->Flags = 0; |
1200 if ((sc->device_id == MRSAS_INVADER) || 1201 (sc->device_id == MRSAS_FURY) || 1202 (sc->device_id == MRSAS_INTRUDER) || 1203 (sc->device_id == MRSAS_INTRUDER_24)) { |
1204 if (i == nseg - 1) 1205 sgl_ptr->Flags = IEEE_SGE_FLAGS_END_OF_LIST; 1206 } 1207 sgl_ptr++; 1208 sg_processed = i + 1; 1209 if ((sg_processed == (sc->max_sge_in_main_msg - 1)) && 1210 (nseg > sc->max_sge_in_main_msg)) { 1211 pMpi25IeeeSgeChain64_t sg_chain; 1212 |
1213 if ((sc->device_id == MRSAS_INVADER) || 1214 (sc->device_id == MRSAS_FURY) || 1215 (sc->device_id == MRSAS_INTRUDER) || 1216 (sc->device_id == MRSAS_INTRUDER_24)) { |
1217 if ((cmd->io_request->IoFlags & MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) 1218 != MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) 1219 cmd->io_request->ChainOffset = sc->chain_offset_io_request; 1220 else 1221 cmd->io_request->ChainOffset = 0; 1222 } else 1223 cmd->io_request->ChainOffset = sc->chain_offset_io_request; 1224 sg_chain = sgl_ptr; |
1225 if ((sc->device_id == MRSAS_INVADER) || 1226 (sc->device_id == MRSAS_FURY) || 1227 (sc->device_id == MRSAS_INTRUDER) || 1228 (sc->device_id == MRSAS_INTRUDER_24)) |
1229 sg_chain->Flags = IEEE_SGE_FLAGS_CHAIN_ELEMENT; 1230 else 1231 sg_chain->Flags = (IEEE_SGE_FLAGS_CHAIN_ELEMENT | MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR); 1232 sg_chain->Length = (sizeof(MPI2_SGE_IO_UNION) * (nseg - sg_processed)); 1233 sg_chain->Address = cmd->chain_frame_phys_addr; 1234 sgl_ptr = (pMpi25IeeeSgeChain64_t)cmd->chain_frame; 1235 } 1236 } --- 137 unchanged lines hidden --- |