diff options
-rw-r--r-- | drivers/scsi/megaraid/megaraid_sas.c | 112 |
1 files changed, 17 insertions, 95 deletions
diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index e2cf12ef3688..b7f2e613c903 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c | |||
@@ -433,34 +433,15 @@ megasas_make_sgl32(struct megasas_instance *instance, struct scsi_cmnd *scp, | |||
433 | int sge_count; | 433 | int sge_count; |
434 | struct scatterlist *os_sgl; | 434 | struct scatterlist *os_sgl; |
435 | 435 | ||
436 | /* | 436 | sge_count = scsi_dma_map(scp); |
437 | * Return 0 if there is no data transfer | 437 | BUG_ON(sge_count < 0); |
438 | */ | ||
439 | if (!scp->request_buffer || !scp->request_bufflen) | ||
440 | return 0; | ||
441 | 438 | ||
442 | if (!scp->use_sg) { | 439 | if (sge_count) { |
443 | mfi_sgl->sge32[0].phys_addr = pci_map_single(instance->pdev, | 440 | scsi_for_each_sg(scp, os_sgl, sge_count, i) { |
444 | scp-> | 441 | mfi_sgl->sge32[i].length = sg_dma_len(os_sgl); |
445 | request_buffer, | 442 | mfi_sgl->sge32[i].phys_addr = sg_dma_address(os_sgl); |
446 | scp-> | 443 | } |
447 | request_bufflen, | ||
448 | scp-> | ||
449 | sc_data_direction); | ||
450 | mfi_sgl->sge32[0].length = scp->request_bufflen; | ||
451 | |||
452 | return 1; | ||
453 | } | ||
454 | |||
455 | os_sgl = (struct scatterlist *)scp->request_buffer; | ||
456 | sge_count = pci_map_sg(instance->pdev, os_sgl, scp->use_sg, | ||
457 | scp->sc_data_direction); | ||
458 | |||
459 | for (i = 0; i < sge_count; i++, os_sgl++) { | ||
460 | mfi_sgl->sge32[i].length = sg_dma_len(os_sgl); | ||
461 | mfi_sgl->sge32[i].phys_addr = sg_dma_address(os_sgl); | ||
462 | } | 444 | } |
463 | |||
464 | return sge_count; | 445 | return sge_count; |
465 | } | 446 | } |
466 | 447 | ||
@@ -481,35 +462,15 @@ megasas_make_sgl64(struct megasas_instance *instance, struct scsi_cmnd *scp, | |||
481 | int sge_count; | 462 | int sge_count; |
482 | struct scatterlist *os_sgl; | 463 | struct scatterlist *os_sgl; |
483 | 464 | ||
484 | /* | 465 | sge_count = scsi_dma_map(scp); |
485 | * Return 0 if there is no data transfer | 466 | BUG_ON(sge_count < 0); |
486 | */ | ||
487 | if (!scp->request_buffer || !scp->request_bufflen) | ||
488 | return 0; | ||
489 | |||
490 | if (!scp->use_sg) { | ||
491 | mfi_sgl->sge64[0].phys_addr = pci_map_single(instance->pdev, | ||
492 | scp-> | ||
493 | request_buffer, | ||
494 | scp-> | ||
495 | request_bufflen, | ||
496 | scp-> | ||
497 | sc_data_direction); | ||
498 | |||
499 | mfi_sgl->sge64[0].length = scp->request_bufflen; | ||
500 | |||
501 | return 1; | ||
502 | } | ||
503 | |||
504 | os_sgl = (struct scatterlist *)scp->request_buffer; | ||
505 | sge_count = pci_map_sg(instance->pdev, os_sgl, scp->use_sg, | ||
506 | scp->sc_data_direction); | ||
507 | 467 | ||
508 | for (i = 0; i < sge_count; i++, os_sgl++) { | 468 | if (sge_count) { |
509 | mfi_sgl->sge64[i].length = sg_dma_len(os_sgl); | 469 | scsi_for_each_sg(scp, os_sgl, sge_count, i) { |
510 | mfi_sgl->sge64[i].phys_addr = sg_dma_address(os_sgl); | 470 | mfi_sgl->sge64[i].length = sg_dma_len(os_sgl); |
471 | mfi_sgl->sge64[i].phys_addr = sg_dma_address(os_sgl); | ||
472 | } | ||
511 | } | 473 | } |
512 | |||
513 | return sge_count; | 474 | return sge_count; |
514 | } | 475 | } |
515 | 476 | ||
@@ -593,7 +554,7 @@ megasas_build_dcdb(struct megasas_instance *instance, struct scsi_cmnd *scp, | |||
593 | pthru->cdb_len = scp->cmd_len; | 554 | pthru->cdb_len = scp->cmd_len; |
594 | pthru->timeout = 0; | 555 | pthru->timeout = 0; |
595 | pthru->flags = flags; | 556 | pthru->flags = flags; |
596 | pthru->data_xfer_len = scp->request_bufflen; | 557 | pthru->data_xfer_len = scsi_bufflen(scp); |
597 | 558 | ||
598 | memcpy(pthru->cdb, scp->cmnd, scp->cmd_len); | 559 | memcpy(pthru->cdb, scp->cmnd, scp->cmd_len); |
599 | 560 | ||
@@ -1195,45 +1156,6 @@ megasas_complete_abort(struct megasas_instance *instance, | |||
1195 | } | 1156 | } |
1196 | 1157 | ||
1197 | /** | 1158 | /** |
1198 | * megasas_unmap_sgbuf - Unmap SG buffers | ||
1199 | * @instance: Adapter soft state | ||
1200 | * @cmd: Completed command | ||
1201 | */ | ||
1202 | static void | ||
1203 | megasas_unmap_sgbuf(struct megasas_instance *instance, struct megasas_cmd *cmd) | ||
1204 | { | ||
1205 | dma_addr_t buf_h; | ||
1206 | u8 opcode; | ||
1207 | |||
1208 | if (cmd->scmd->use_sg) { | ||
1209 | pci_unmap_sg(instance->pdev, cmd->scmd->request_buffer, | ||
1210 | cmd->scmd->use_sg, cmd->scmd->sc_data_direction); | ||
1211 | return; | ||
1212 | } | ||
1213 | |||
1214 | if (!cmd->scmd->request_bufflen) | ||
1215 | return; | ||
1216 | |||
1217 | opcode = cmd->frame->hdr.cmd; | ||
1218 | |||
1219 | if ((opcode == MFI_CMD_LD_READ) || (opcode == MFI_CMD_LD_WRITE)) { | ||
1220 | if (IS_DMA64) | ||
1221 | buf_h = cmd->frame->io.sgl.sge64[0].phys_addr; | ||
1222 | else | ||
1223 | buf_h = cmd->frame->io.sgl.sge32[0].phys_addr; | ||
1224 | } else { | ||
1225 | if (IS_DMA64) | ||
1226 | buf_h = cmd->frame->pthru.sgl.sge64[0].phys_addr; | ||
1227 | else | ||
1228 | buf_h = cmd->frame->pthru.sgl.sge32[0].phys_addr; | ||
1229 | } | ||
1230 | |||
1231 | pci_unmap_single(instance->pdev, buf_h, cmd->scmd->request_bufflen, | ||
1232 | cmd->scmd->sc_data_direction); | ||
1233 | return; | ||
1234 | } | ||
1235 | |||
1236 | /** | ||
1237 | * megasas_complete_cmd - Completes a command | 1159 | * megasas_complete_cmd - Completes a command |
1238 | * @instance: Adapter soft state | 1160 | * @instance: Adapter soft state |
1239 | * @cmd: Command to be completed | 1161 | * @cmd: Command to be completed |
@@ -1281,7 +1203,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, | |||
1281 | 1203 | ||
1282 | atomic_dec(&instance->fw_outstanding); | 1204 | atomic_dec(&instance->fw_outstanding); |
1283 | 1205 | ||
1284 | megasas_unmap_sgbuf(instance, cmd); | 1206 | scsi_dma_unmap(cmd->scmd); |
1285 | cmd->scmd->scsi_done(cmd->scmd); | 1207 | cmd->scmd->scsi_done(cmd->scmd); |
1286 | megasas_return_cmd(instance, cmd); | 1208 | megasas_return_cmd(instance, cmd); |
1287 | 1209 | ||
@@ -1329,7 +1251,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, | |||
1329 | 1251 | ||
1330 | atomic_dec(&instance->fw_outstanding); | 1252 | atomic_dec(&instance->fw_outstanding); |
1331 | 1253 | ||
1332 | megasas_unmap_sgbuf(instance, cmd); | 1254 | scsi_dma_unmap(cmd->scmd); |
1333 | cmd->scmd->scsi_done(cmd->scmd); | 1255 | cmd->scmd->scsi_done(cmd->scmd); |
1334 | megasas_return_cmd(instance, cmd); | 1256 | megasas_return_cmd(instance, cmd); |
1335 | 1257 | ||