[PATCH v5 2/2] arcmsr: simplify of updating doneq_index and postq_index

2014-09-15 Thread Ching Huang
From: Ching Huang ching2...@areca.com.tw

This patch is to modify previous patch 16/17 and it is relative to
http://git.infradead.org/users/hch/scsi-queue.git/tree/arcmsr-for-3.18:/drivers/scsi/arcmsr

change since v4:
1. add spin_lock in arcmsr_done4abort_postqueue for protect doneq_index.
2. fix spinlock area in arcmsr_hbaD_polling_ccbdone.

Signed-off-by: Ching Huang ching2...@areca.com.tw
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2014-09-12 12:43:16.956653000 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2014-09-15 18:53:44.483743000 +0800
@@ -1121,7 +1121,7 @@ static void arcmsr_drain_donequeue(struc
 static void arcmsr_done4abort_postqueue(struct AdapterControlBlock *acb)
 {
int i = 0;
-   uint32_t flag_ccb;
+   uint32_t flag_ccb, ccb_cdb_phy;
struct ARCMSR_CDB *pARCMSR_CDB;
bool error;
struct CommandControlBlock *pCCB;
@@ -1165,10 +1165,6 @@ static void arcmsr_done4abort_postqueue(
break;
case ACB_ADAPTER_TYPE_C: {
struct MessageUnit_C __iomem *reg = acb-pmuC;
-   struct  ARCMSR_CDB *pARCMSR_CDB;
-   uint32_t flag_ccb, ccb_cdb_phy;
-   bool error;
-   struct CommandControlBlock *pCCB;
while ((readl(reg-host_int_status)  
ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR)  (i++  ARCMSR_MAX_OUTSTANDING_CMD)) {
/*need to do*/
flag_ccb = readl(reg-outbound_queueport_low);
@@ -1182,35 +1178,25 @@ static void arcmsr_done4abort_postqueue(
break;
case ACB_ADAPTER_TYPE_D: {
struct MessageUnit_D  *pmu = acb-pmuD;
-   uint32_t ccb_cdb_phy, outbound_write_pointer;
-   uint32_t doneq_index, index_stripped, addressLow, residual;
-   bool error;
-   struct CommandControlBlock *pCCB;
+   uint32_t outbound_write_pointer;
+   uint32_t doneq_index, index_stripped, addressLow, residual, 
toggle;
+   unsigned long flags;
 
-   outbound_write_pointer = pmu-done_qbuffer[0].addressLow + 1;
-   doneq_index = pmu-doneq_index;
residual = atomic_read(acb-ccboutstandingcount);
for (i = 0; i  residual; i++) {
-   while ((doneq_index  0xFFF) !=
+   spin_lock_irqsave(acb-doneq_lock, flags);
+   outbound_write_pointer =
+   pmu-done_qbuffer[0].addressLow + 1;
+   doneq_index = pmu-doneq_index;
+   if ((doneq_index  0xFFF) !=
(outbound_write_pointer  0xFFF)) {
-   if (doneq_index  0x4000) {
-   index_stripped = doneq_index  0xFFF;
-   index_stripped += 1;
-   index_stripped %=
-   ARCMSR_MAX_ARC1214_DONEQUEUE;
-   pmu-doneq_index = index_stripped ?
-   (index_stripped | 0x4000) :
-   (index_stripped + 1);
-   } else {
-   index_stripped = doneq_index;
-   index_stripped += 1;
-   index_stripped %=
-   ARCMSR_MAX_ARC1214_DONEQUEUE;
-   pmu-doneq_index = index_stripped ?
-   index_stripped :
-   ((index_stripped | 0x4000) + 1);
-   }
+   toggle = doneq_index  0x4000;
+   index_stripped = (doneq_index  0xFFF) + 1;
+   index_stripped %= ARCMSR_MAX_ARC1214_DONEQUEUE;
+   pmu-doneq_index = index_stripped ? 
(index_stripped | toggle) :
+   ((toggle ^ 0x4000) + 1);
doneq_index = pmu-doneq_index;
+   spin_unlock_irqrestore(acb-doneq_lock, flags);
addressLow = pmu-done_qbuffer[doneq_index 
0xFFF].addressLow;
ccb_cdb_phy = (addressLow  0xFFF0);
@@ -1224,11 +1210,10 @@ static void arcmsr_done4abort_postqueue(
arcmsr_drain_donequeue(acb, pCCB, error);
writel(doneq_index,
pmu-outboundlist_read_pointer);
+   } else {
+   spin_unlock_irqrestore(acb-doneq_lock, flags);
+  

Re: [PATCH v5 2/2] arcmsr: simplify of updating doneq_index and postq_index

2014-09-15 Thread Tomas Henzl
On 09/15/2014 01:05 PM, Ching Huang wrote:
 From: Ching Huang ching2...@areca.com.tw

 This patch is to modify previous patch 16/17 and it is relative to
 http://git.infradead.org/users/hch/scsi-queue.git/tree/arcmsr-for-3.18:/drivers/scsi/arcmsr

 change since v4:
 1. add spin_lock in arcmsr_done4abort_postqueue for protect doneq_index.
 2. fix spinlock area in arcmsr_hbaD_polling_ccbdone.

You might have kept the previous change log here too,
it's probably better when merged with the 16/17.

I have no more concerns, so

Reviewed-by: Tomas Henzl the...@redhat.com

--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html