Print this page
5719 Add support for LSI Fury adapters

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/mr_sas/mr_sas_tbolt.c
          +++ new/usr/src/uts/common/io/mr_sas/mr_sas_tbolt.c
↓ open down ↓ 9 lines elided ↑ open up ↑
  10   10   * Author:
  11   11   *              Swaminathan K S
  12   12   *              Arun Chandrashekhar
  13   13   *              Manju R
  14   14   *              Rasheed
  15   15   *              Shakeel Bukhari
  16   16   */
  17   17  
  18   18  /*
  19   19   * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
       20 + * Copyright 2015 Garrett D'Amore <garrett@damore.org>
  20   21   */
  21   22  
  22   23  
  23   24  #include <sys/types.h>
  24   25  #include <sys/file.h>
  25   26  #include <sys/atomic.h>
  26   27  #include <sys/scsi/scsi.h>
  27   28  #include <sys/byteorder.h>
  28   29  #include "ld_pd_map.h"
  29   30  #include "mr_sas.h"
↓ open down ↓ 1194 lines elided ↑ open up ↑
1224 1225      uint32_t *datalen)
1225 1226  {
1226 1227          uint32_t                MaxSGEs;
1227 1228          int                     sg_to_process;
1228 1229          uint32_t                i, j;
1229 1230          uint32_t                numElements, endElement;
1230 1231          Mpi25IeeeSgeChain64_t   *ieeeChainElement = NULL;
1231 1232          Mpi25IeeeSgeChain64_t   *scsi_raid_io_sgl_ieee = NULL;
1232 1233          ddi_acc_handle_t acc_handle =
1233 1234              instance->mpi2_frame_pool_dma_obj.acc_handle;
     1235 +        uint16_t                devid = instance->device_id;
1234 1236  
1235 1237          con_log(CL_ANN1, (CE_NOTE,
1236 1238              "chkpnt: Building Chained SGL :%d", __LINE__));
1237 1239  
1238 1240          /* Calulate SGE size in number of Words(32bit) */
1239 1241          /* Clear the datalen before updating it. */
1240 1242          *datalen = 0;
1241 1243  
1242 1244          MaxSGEs = instance->max_sge_in_main_msg;
1243 1245  
↓ open down ↓ 23 lines elided ↑ open up ↑
1267 1269          ddi_put8(acc_handle, &scsi_raid_io->RaidContext.numSGE,
1268 1270              (uint8_t)numElements);
1269 1271  
1270 1272          /* set end element in main message frame */
1271 1273          endElement = (numElements <= MaxSGEs) ? numElements : (MaxSGEs - 1);
1272 1274  
1273 1275          /* prepare the scatter-gather list for the firmware */
1274 1276          scsi_raid_io_sgl_ieee =
1275 1277              (Mpi25IeeeSgeChain64_t *)&scsi_raid_io->SGL.IeeeChain;
1276 1278  
1277      -        if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) {
     1279 +        if ((devid == PCI_DEVICE_ID_LSI_INVADER) ||
     1280 +            (devid == PCI_DEVICE_ID_LSI_FURY)) {
1278 1281                  Mpi25IeeeSgeChain64_t *sgl_ptr_end = scsi_raid_io_sgl_ieee;
1279 1282                  sgl_ptr_end += instance->max_sge_in_main_msg - 1;
1280 1283  
1281 1284                  ddi_put8(acc_handle, &sgl_ptr_end->Flags, 0);
1282 1285          }
1283 1286  
1284 1287          for (i = 0; i < endElement; i++, scsi_raid_io_sgl_ieee++) {
1285 1288                  ddi_put64(acc_handle, &scsi_raid_io_sgl_ieee->Address,
1286 1289                      acmd->cmd_dmacookies[i].dmac_laddress);
1287 1290  
1288 1291                  ddi_put32(acc_handle, &scsi_raid_io_sgl_ieee->Length,
1289 1292                      acmd->cmd_dmacookies[i].dmac_size);
1290 1293  
1291 1294                  ddi_put8(acc_handle, &scsi_raid_io_sgl_ieee->Flags, 0);
1292 1295  
1293      -                if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) {
     1296 +                if ((devid == PCI_DEVICE_ID_LSI_INVADER) ||
     1297 +                    (devid == PCI_DEVICE_ID_LSI_FURY)) {
1294 1298                          if (i == (numElements - 1)) {
1295 1299                                  ddi_put8(acc_handle,
1296 1300                                      &scsi_raid_io_sgl_ieee->Flags,
1297 1301                                      IEEE_SGE_FLAGS_END_OF_LIST);
1298 1302                          }
1299 1303                  }
1300 1304  
1301 1305                  *datalen += acmd->cmd_dmacookies[i].dmac_size;
1302 1306  
1303 1307  #ifdef DEBUG
↓ open down ↓ 7 lines elided ↑ open up ↑
1311 1315  
1312 1316          }
1313 1317  
1314 1318          ddi_put8(acc_handle, &scsi_raid_io->ChainOffset, 0);
1315 1319  
1316 1320          /* check if chained SGL required */
1317 1321          if (i < numElements) {
1318 1322  
1319 1323                  con_log(CL_ANN1, (CE_NOTE, "[Chain Element index]:%x", i));
1320 1324  
1321      -                if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) {
     1325 +                if ((devid == PCI_DEVICE_ID_LSI_INVADER) ||
     1326 +                    (devid == PCI_DEVICE_ID_LSI_FURY)) {
1322 1327                          uint16_t ioFlags =
1323 1328                              ddi_get16(acc_handle, &scsi_raid_io->IoFlags);
1324 1329  
1325 1330                          if ((ioFlags &
1326 1331                              MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) !=
1327 1332                              MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) {
1328 1333                                  ddi_put8(acc_handle, &scsi_raid_io->ChainOffset,
1329 1334                                      (U8)instance->chain_offset_io_req);
1330 1335                          } else {
1331 1336                                  ddi_put8(acc_handle,
↓ open down ↓ 2 lines elided ↑ open up ↑
1334 1339                  } else {
1335 1340                          ddi_put8(acc_handle, &scsi_raid_io->ChainOffset,
1336 1341                              (U8)instance->chain_offset_io_req);
1337 1342                  }
1338 1343  
1339 1344                  /* prepare physical chain element */
1340 1345                  ieeeChainElement = scsi_raid_io_sgl_ieee;
1341 1346  
1342 1347                  ddi_put8(acc_handle, &ieeeChainElement->NextChainOffset, 0);
1343 1348  
1344      -                if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) {
     1349 +                if ((devid == PCI_DEVICE_ID_LSI_INVADER) ||
     1350 +                    (devid == PCI_DEVICE_ID_LSI_FURY)) {
1345 1351                          ddi_put8(acc_handle, &ieeeChainElement->Flags,
1346 1352                              IEEE_SGE_FLAGS_CHAIN_ELEMENT);
1347 1353                  } else {
1348 1354                          ddi_put8(acc_handle, &ieeeChainElement->Flags,
1349 1355                              (IEEE_SGE_FLAGS_CHAIN_ELEMENT |
1350 1356                              MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR));
1351 1357                  }
1352 1358  
1353 1359                  ddi_put32(acc_handle, &ieeeChainElement->Length,
1354 1360                      (sizeof (MPI2_SGE_IO_UNION) * (numElements - i)));
↓ open down ↓ 14 lines elided ↑ open up ↑
1369 1375                          con_log(CL_DLEVEL3, (CE_NOTE, "[remaining SGL]:%x", i));
1370 1376  
1371 1377                          ddi_put64(acc_handle, &scsi_raid_io_sgl_ieee->Address,
1372 1378                              acmd->cmd_dmacookies[i].dmac_laddress);
1373 1379  
1374 1380                          ddi_put32(acc_handle, &scsi_raid_io_sgl_ieee->Length,
1375 1381                              acmd->cmd_dmacookies[i].dmac_size);
1376 1382  
1377 1383                          ddi_put8(acc_handle, &scsi_raid_io_sgl_ieee->Flags, 0);
1378 1384  
1379      -                        if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) {
     1385 +                        if ((devid == PCI_DEVICE_ID_LSI_INVADER) ||
     1386 +                            (devid == PCI_DEVICE_ID_LSI_FURY)) {
1380 1387                                  if (i == (numElements - 1)) {
1381 1388                                          ddi_put8(acc_handle,
1382 1389                                              &scsi_raid_io_sgl_ieee->Flags,
1383 1390                                              IEEE_SGE_FLAGS_END_OF_LIST);
1384 1391                                  }
1385 1392                          }
1386 1393  
1387 1394                          *datalen += acmd->cmd_dmacookies[i].dmac_size;
1388 1395  
1389 1396  #if DEBUG
↓ open down ↓ 19 lines elided ↑ open up ↑
1409 1416   */
1410 1417  static struct mrsas_cmd *
1411 1418  mrsas_tbolt_build_cmd(struct mrsas_instance *instance, struct scsi_address *ap,
1412 1419      struct scsi_pkt *pkt, uchar_t *cmd_done)
1413 1420  {
1414 1421          uint8_t         fp_possible = 0;
1415 1422          uint32_t        index;
1416 1423          uint32_t        lba_count = 0;
1417 1424          uint32_t        start_lba_hi = 0;
1418 1425          uint32_t        start_lba_lo = 0;
     1426 +        uint16_t        devid = instance->device_id;
1419 1427          ddi_acc_handle_t acc_handle =
1420 1428              instance->mpi2_frame_pool_dma_obj.acc_handle;
1421 1429          struct mrsas_cmd                *cmd = NULL;
1422 1430          struct scsa_cmd                 *acmd = PKT2CMD(pkt);
1423 1431          MRSAS_REQUEST_DESCRIPTOR_UNION  *ReqDescUnion;
1424 1432          Mpi2RaidSCSIIORequest_t         *scsi_raid_io;
1425 1433          uint32_t                        datalen;
1426 1434          struct IO_REQUEST_INFO io_info;
1427 1435          MR_FW_RAID_MAP_ALL *local_map_ptr;
1428 1436          uint16_t pd_cmd_cdblen;
↓ open down ↓ 205 lines elided ↑ open up ↑
1634 1642                                      &scsi_raid_io->IoFlags, pd_cmd_cdblen);
1635 1643                          }
1636 1644  
1637 1645                          ddi_put8(acc_handle, &scsi_raid_io->Function,
1638 1646                              MPI2_FUNCTION_SCSI_IO_REQUEST);
1639 1647  
1640 1648                          ReqDescUnion->SCSIIO.RequestFlags =
1641 1649                              (MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY <<
1642 1650                              MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
1643 1651  
1644      -                        if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) {
     1652 +                        if ((devid == PCI_DEVICE_ID_LSI_INVADER) ||
     1653 +                            (devid == PCI_DEVICE_ID_LSI_FURY)) {
1645 1654                                  uint8_t regLockFlags = ddi_get8(acc_handle,
1646 1655                                      &scsi_raid_io->RaidContext.regLockFlags);
1647 1656                                  uint16_t IoFlags = ddi_get16(acc_handle,
1648 1657                                      &scsi_raid_io->IoFlags);
1649 1658  
1650 1659                                  if (regLockFlags == REGION_TYPE_UNUSED)
1651 1660                                          ReqDescUnion->SCSIIO.RequestFlags =
1652 1661                                              (MPI2_REQ_DESCRIPT_FLAGS_NO_LOCK <<
1653 1662                                              MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
1654 1663  
↓ open down ↓ 42 lines elided ↑ open up ↑
1697 1706                              &scsi_raid_io->DevHandle, acmd->device_id);
1698 1707  
1699 1708                          ReqDescUnion->SCSIIO.RequestFlags =
1700 1709                              (MPI2_REQ_DESCRIPT_FLAGS_LD_IO <<
1701 1710                              MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
1702 1711  
1703 1712                          ddi_put16(acc_handle,
1704 1713                              &scsi_raid_io->RaidContext.timeoutValue,
1705 1714                              local_map_ptr->raidMap.fpPdIoTimeoutSec);
1706 1715  
1707      -                        if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) {
     1716 +                        if ((devid == PCI_DEVICE_ID_LSI_INVADER) ||
     1717 +                            (devid == PCI_DEVICE_ID_LSI_FURY)) {
1708 1718                                  uint8_t regLockFlags = ddi_get8(acc_handle,
1709 1719                                      &scsi_raid_io->RaidContext.regLockFlags);
1710 1720  
1711 1721                                  if (regLockFlags == REGION_TYPE_UNUSED) {
1712 1722                                          ReqDescUnion->SCSIIO.RequestFlags =
1713 1723                                              (MPI2_REQ_DESCRIPT_FLAGS_NO_LOCK <<
1714 1724                                              MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
1715 1725                                  }
1716 1726  
1717 1727                                  regLockFlags |=
↓ open down ↓ 530 lines elided ↑ open up ↑
2248 2258              (MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO <<
2249 2259              MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
2250 2260  
2251 2261          ReqDescUnion->SCSIIO.SMID = cmd->SMID;
2252 2262  
2253 2263          cmd->request_desc = ReqDescUnion;
2254 2264  
2255 2265          /* get raid message frame pointer */
2256 2266          scsi_raid_io = (Mpi2RaidSCSIIORequest_t *)cmd->scsi_io_request;
2257 2267  
2258      -        if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) {
     2268 +        if ((instance->device_id == PCI_DEVICE_ID_LSI_INVADER) ||
     2269 +            (instance->device_id == PCI_DEVICE_ID_LSI_FURY)) {
2259 2270                  Mpi25IeeeSgeChain64_t *sgl_ptr_end = (Mpi25IeeeSgeChain64_t *)
2260 2271                      &scsi_raid_io->SGL.IeeeChain;
2261 2272                  sgl_ptr_end += instance->max_sge_in_main_msg - 1;
2262 2273                  ddi_put8(acc_handle, &sgl_ptr_end->Flags, 0);
2263 2274          }
2264 2275  
2265 2276          ddi_put8(acc_handle, &scsi_raid_io->Function,
2266 2277              MPI2_FUNCTION_PASSTHRU_IO_REQUEST);
2267 2278  
2268 2279          ddi_put8(acc_handle, &scsi_raid_io->SGLOffset0,
↓ open down ↓ 1435 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX