arcmsr: revise message_isr_bh_fn to remove duplicate code
authorChing Huang <ching2048@areca.com.tw>
Tue, 19 Aug 2014 06:59:00 +0000 (14:59 +0800)
committerChristoph Hellwig <hch@lst.de>
Tue, 16 Sep 2014 16:39:42 +0000 (09:39 -0700)
Revise message_isr_bh_fn to remove the duplicate code for each adapter type.

Signed-off-by: Ching Huang <ching2048@areca.com.tw>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/arcmsr/arcmsr_hba.c

index 30b378cd80a83bdc124a835d1c88d5457080f047..bfe2ac460e01ca37e764e47840db0be99c65dc72 100644 (file)
@@ -493,120 +493,68 @@ static int arcmsr_alloc_ccb_pool(struct AdapterControlBlock *acb)
 
 static void arcmsr_message_isr_bh_fn(struct work_struct *work) 
 {
-       struct AdapterControlBlock *acb = container_of(work,struct AdapterControlBlock, arcmsr_do_message_isr_bh);
+       struct AdapterControlBlock *acb = container_of(work,
+               struct AdapterControlBlock, arcmsr_do_message_isr_bh);
+       char *acb_dev_map = (char *)acb->device_map;
+       uint32_t __iomem *signature = NULL;
+       char __iomem *devicemap = NULL;
+       int target, lun;
+       struct scsi_device *psdev;
+       char diff, temp;
+
        switch (acb->adapter_type) {
-               case ACB_ADAPTER_TYPE_A: {
+       case ACB_ADAPTER_TYPE_A: {
+               struct MessageUnit_A __iomem *reg  = acb->pmuA;
 
-                       struct MessageUnit_A __iomem *reg  = acb->pmuA;
-                       char *acb_dev_map = (char *)acb->device_map;
-                       uint32_t __iomem *signature = (uint32_t __iomem*) (&reg->message_rwbuffer[0]);
-                       char __iomem *devicemap = (char __iomem*) (&reg->message_rwbuffer[21]);
-                       int target, lun;
-                       struct scsi_device *psdev;
-                       char diff;
-
-                       atomic_inc(&acb->rq_map_token);
-                       if (readl(signature) == ARCMSR_SIGNATURE_GET_CONFIG) {
-                               for(target = 0; target < ARCMSR_MAX_TARGETID -1; target++) {
-                                       diff = (*acb_dev_map)^readb(devicemap);
-                                       if (diff != 0) {
-                                               char temp;
-                                               *acb_dev_map = readb(devicemap);
-                                               temp =*acb_dev_map;
-                                               for(lun = 0; lun < ARCMSR_MAX_TARGETLUN; lun++) {
-                                                       if((temp & 0x01)==1 && (diff & 0x01) == 1) {    
-                                                               scsi_add_device(acb->host, 0, target, lun);
-                                                       }else if((temp & 0x01) == 0 && (diff & 0x01) == 1) {
-                                                               psdev = scsi_device_lookup(acb->host, 0, target, lun);
-                                                               if (psdev != NULL ) {
-                                                                       scsi_remove_device(psdev);
-                                                                       scsi_device_put(psdev);
-                                                               }
-                                                       }
-                                                       temp >>= 1;
-                                                       diff >>= 1;
-                                               }
-                                       }
-                                       devicemap++;
-                                       acb_dev_map++;
-                               }
-                       }
-                       break;
-               }
+               signature = (uint32_t __iomem *)(&reg->message_rwbuffer[0]);
+               devicemap = (char __iomem *)(&reg->message_rwbuffer[21]);
+               break;
+       }
+       case ACB_ADAPTER_TYPE_B: {
+               struct MessageUnit_B *reg  = acb->pmuB;
 
-               case ACB_ADAPTER_TYPE_B: {
-                       struct MessageUnit_B *reg  = acb->pmuB;
-                       char *acb_dev_map = (char *)acb->device_map;
-                       uint32_t __iomem *signature = (uint32_t __iomem*)(&reg->message_rwbuffer[0]);
-                       char __iomem *devicemap = (char __iomem*)(&reg->message_rwbuffer[21]);
-                       int target, lun;
-                       struct scsi_device *psdev;
-                       char diff;
-
-                       atomic_inc(&acb->rq_map_token);
-                       if (readl(signature) == ARCMSR_SIGNATURE_GET_CONFIG) {
-                               for(target = 0; target < ARCMSR_MAX_TARGETID -1; target++) {
-                                       diff = (*acb_dev_map)^readb(devicemap);
-                                       if (diff != 0) {
-                                               char temp;
-                                               *acb_dev_map = readb(devicemap);
-                                               temp =*acb_dev_map;
-                                               for(lun = 0; lun < ARCMSR_MAX_TARGETLUN; lun++) {
-                                                       if((temp & 0x01)==1 && (diff & 0x01) == 1) {    
-                                                               scsi_add_device(acb->host, 0, target, lun);
-                                                       }else if((temp & 0x01) == 0 && (diff & 0x01) == 1) {
-                                                               psdev = scsi_device_lookup(acb->host, 0, target, lun);
-                                                               if (psdev != NULL ) {
-                                                                       scsi_remove_device(psdev);
-                                                                       scsi_device_put(psdev);
-                                                               }
-                                                       }
-                                                       temp >>= 1;
-                                                       diff >>= 1;
-                                               }
-                                       }
-                                       devicemap++;
-                                       acb_dev_map++;
-                               }
-                       }
-               }
+               signature = (uint32_t __iomem *)(&reg->message_rwbuffer[0]);
+               devicemap = (char __iomem *)(&reg->message_rwbuffer[21]);
                break;
-               case ACB_ADAPTER_TYPE_C: {
-                       struct MessageUnit_C *reg  = acb->pmuC;
-                       char *acb_dev_map = (char *)acb->device_map;
-                       uint32_t __iomem *signature = (uint32_t __iomem *)(&reg->msgcode_rwbuffer[0]);
-                       char __iomem *devicemap = (char __iomem *)(&reg->msgcode_rwbuffer[21]);
-                       int target, lun;
-                       struct scsi_device *psdev;
-                       char diff;
-
-                       atomic_inc(&acb->rq_map_token);
-                       if (readl(signature) == ARCMSR_SIGNATURE_GET_CONFIG) {
-                               for (target = 0; target < ARCMSR_MAX_TARGETID - 1; target++) {
-                                       diff = (*acb_dev_map)^readb(devicemap);
-                                       if (diff != 0) {
-                                               char temp;
-                                               *acb_dev_map = readb(devicemap);
-                                               temp = *acb_dev_map;
-                                               for (lun = 0; lun < ARCMSR_MAX_TARGETLUN; lun++) {
-                                                       if ((temp & 0x01) == 1 && (diff & 0x01) == 1) {
-                                                               scsi_add_device(acb->host, 0, target, lun);
-                                                       } else if ((temp & 0x01) == 0 && (diff & 0x01) == 1) {
-                                                               psdev = scsi_device_lookup(acb->host, 0, target, lun);
-                                                               if (psdev != NULL) {
-                                                                       scsi_remove_device(psdev);
-                                                                       scsi_device_put(psdev);
-                                                               }
-                                                       }
-                                                       temp >>= 1;
-                                                       diff >>= 1;
-                                               }
+       }
+       case ACB_ADAPTER_TYPE_C: {
+               struct MessageUnit_C __iomem *reg  = acb->pmuC;
+
+               signature = (uint32_t __iomem *)(&reg->msgcode_rwbuffer[0]);
+               devicemap = (char __iomem *)(&reg->msgcode_rwbuffer[21]);
+               break;
+       }
+       }
+       atomic_inc(&acb->rq_map_token);
+       if (readl(signature) != ARCMSR_SIGNATURE_GET_CONFIG)
+               return;
+       for (target = 0; target < ARCMSR_MAX_TARGETID - 1;
+               target++) {
+               temp = readb(devicemap);
+               diff = (*acb_dev_map) ^ temp;
+               if (diff != 0) {
+                       *acb_dev_map = temp;
+                       for (lun = 0; lun < ARCMSR_MAX_TARGETLUN;
+                               lun++) {
+                               if ((diff & 0x01) == 1 &&
+                                       (temp & 0x01) == 1) {
+                                       scsi_add_device(acb->host,
+                                               0, target, lun);
+                               } else if ((diff & 0x01) == 1
+                                       && (temp & 0x01) == 0) {
+                                       psdev = scsi_device_lookup(acb->host,
+                                               0, target, lun);
+                                       if (psdev != NULL) {
+                                               scsi_remove_device(psdev);
+                                               scsi_device_put(psdev);
                                        }
-                                       devicemap++;
-                                       acb_dev_map++;
                                }
+                               temp >>= 1;
+                               diff >>= 1;
                        }
                }
+               devicemap++;
+               acb_dev_map++;
        }
 }