aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin LI <delphij@FreeBSD.org>2021-04-21 08:03:54 +0000
committerXin LI <delphij@FreeBSD.org>2021-05-05 05:17:31 +0000
commit32ba69e6a320eabfb0b6afe80911481470c36dc5 (patch)
tree4ce364662e017c4e685e12f2f135c43c54084323
parent8e64d97d94f7a1ad186c1168e905f18eb2fe5f8b (diff)
downloadsrc-32ba69e6a320eabfb0b6afe80911481470c36dc5.tar.gz
src-32ba69e6a320eabfb0b6afe80911481470c36dc5.zip
arcmsr(4): Fix SCSI command timeout on ARC-1886.
Many thanks to Areca for continuing to support FreeBSD. Submitted by: 黃清隆 <ching2048 areca com tw> (cherry picked from commit 438b5532070f7c52e88f514380ee8662de1f600b)
-rw-r--r--sys/dev/arcmsr/arcmsr.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/dev/arcmsr/arcmsr.c b/sys/dev/arcmsr/arcmsr.c
index c2027eb8e987..bc9ddffe4960 100644
--- a/sys/dev/arcmsr/arcmsr.c
+++ b/sys/dev/arcmsr/arcmsr.c
@@ -81,6 +81,8 @@
** 1.40.00.01 10/30/2017 Ching Huang Fixed release memory resource
** 1.50.00.00 09/30/2020 Ching Huang Added support ARC-1886, NVMe/SAS/SATA controller
** 1.50.00.01 02/26/2021 Ching Huang Fixed no action of hot plugging device on type_F adapter
+** 1.50.00.02 04/16/2021 Ching Huang Fixed scsi command timeout on ARC-1886 when
+** scatter-gather count large than some number
******************************************************************************************
*/
@@ -138,7 +140,7 @@ __FBSDID("$FreeBSD$");
#define arcmsr_callout_init(a) callout_init(a, /*mpsafe*/1);
-#define ARCMSR_DRIVER_VERSION "arcmsr version 1.50.00.01 2021-02-26"
+#define ARCMSR_DRIVER_VERSION "arcmsr version 1.50.00.02 2021-04-16"
#include <dev/arcmsr/arcmsr.h>
/*
**************************************************************************
@@ -1181,8 +1183,12 @@ static void arcmsr_post_srb(struct AdapterControlBlock *acb, struct CommandContr
if (srb->arc_cdb_size <= 0x300)
arc_cdb_size = (srb->arc_cdb_size - 1) >> 6 | 1;
- else
- arc_cdb_size = (((srb->arc_cdb_size + 0xff) >> 8) + 2) << 1 | 1;
+ else {
+ arc_cdb_size = ((srb->arc_cdb_size + 0xff) >> 8) + 2;
+ if (arc_cdb_size > 0xF)
+ arc_cdb_size = 0xF;
+ arc_cdb_size = (arc_cdb_size << 1) | 1;
+ }
ccb_post_stamp = (srb->smid | arc_cdb_size);
CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_queueport_high, 0);
CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_queueport_low, ccb_post_stamp);