aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author黃清隆 <ching2048@areca.com.tw>2023-04-01 05:43:43 +0000
committerXin LI <delphij@FreeBSD.org>2023-04-15 06:47:33 +0000
commit134e7beec0e29a6f571d81edfe9a315a93e70c0f (patch)
treee615a504178c36b708715766c91c749b00edc55f
parent7ae95c1e22605176f7448b150a3c70ce72d436b9 (diff)
downloadsrc-134e7beec0e29a6f571d81edfe9a315a93e70c0f.tar.gz
src-134e7beec0e29a6f571d81edfe9a315a93e70c0f.zip
arcmsr(4): Fix reading buffer empty length error.
(cherry picked from commit 285d85f4f96bf3b5aecccad865a8855724241c32)
-rw-r--r--sys/dev/arcmsr/arcmsr.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/sys/dev/arcmsr/arcmsr.c b/sys/dev/arcmsr/arcmsr.c
index 6a21a91fda58..987e9ecd9047 100644
--- a/sys/dev/arcmsr/arcmsr.c
+++ b/sys/dev/arcmsr/arcmsr.c
@@ -87,6 +87,7 @@
** scatter-gather count large than some number
** 1.50.00.03 05/04/2021 Ching Huang Fixed doorbell status arrived late on ARC-1886
** 1.50.00.04 12/08/2021 Ching Huang Fixed boot up hung under ARC-1886 with no volume created
+** 1.50.00.05 03/23/2023 Ching Huang Fixed reading buffer empty length error
******************************************************************************************
*/
@@ -144,7 +145,7 @@ __FBSDID("$FreeBSD$");
#define arcmsr_callout_init(a) callout_init(a, /*mpsafe*/1);
-#define ARCMSR_DRIVER_VERSION "arcmsr version 1.50.00.04 2021-12-08"
+#define ARCMSR_DRIVER_VERSION "arcmsr version 1.50.00.05 2023-03-23"
#include <dev/arcmsr/arcmsr.h>
/*
**************************************************************************
@@ -1561,8 +1562,10 @@ static void arcmsr_iop2drv_data_wrote_handle(struct AdapterControlBlock *acb)
/*check this iop data if overflow my rqbuffer*/
ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
prbuffer = arcmsr_get_iop_rqbuffer(acb);
- my_empty_len = (acb->rqbuf_lastindex - acb->rqbuf_firstindex - 1) &
- (ARCMSR_MAX_QBUFFER-1);
+ if (acb->rqbuf_lastindex >= acb->rqbuf_firstindex)
+ my_empty_len = (ARCMSR_MAX_QBUFFER - 1) - (acb->rqbuf_lastindex - acb->rqbuf_firstindex);
+ else
+ my_empty_len = acb->rqbuf_firstindex - acb->rqbuf_lastindex - 1;
if(my_empty_len >= prbuffer->data_len) {
if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;