Commit 12aad947 authored by Ching Huang's avatar Ching Huang Committed by Christoph Hellwig

arcmsr: revise message_isr_bh_fn to remove duplicate code

Revise message_isr_bh_fn to remove the duplicate code for each adapter type.
Signed-off-by: default avatarChing Huang <ching2048@areca.com.tw>
Reviewed-by: default avatarTomas Henzl <thenzl@redhat.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 8b7c9942
...@@ -493,120 +493,68 @@ static int arcmsr_alloc_ccb_pool(struct AdapterControlBlock *acb) ...@@ -493,120 +493,68 @@ static int arcmsr_alloc_ccb_pool(struct AdapterControlBlock *acb)
static void arcmsr_message_isr_bh_fn(struct work_struct *work) 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) { 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; signature = (uint32_t __iomem *)(&reg->message_rwbuffer[0]);
char *acb_dev_map = (char *)acb->device_map; devicemap = (char __iomem *)(&reg->message_rwbuffer[21]);
uint32_t __iomem *signature = (uint32_t __iomem*) (&reg->message_rwbuffer[0]); break;
char __iomem *devicemap = (char __iomem*) (&reg->message_rwbuffer[21]); }
int target, lun; case ACB_ADAPTER_TYPE_B: {
struct scsi_device *psdev; struct MessageUnit_B *reg = acb->pmuB;
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;
}
case ACB_ADAPTER_TYPE_B: { signature = (uint32_t __iomem *)(&reg->message_rwbuffer[0]);
struct MessageUnit_B *reg = acb->pmuB; devicemap = (char __iomem *)(&reg->message_rwbuffer[21]);
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; break;
case ACB_ADAPTER_TYPE_C: { }
struct MessageUnit_C *reg = acb->pmuC; case ACB_ADAPTER_TYPE_C: {
char *acb_dev_map = (char *)acb->device_map; struct MessageUnit_C __iomem *reg = acb->pmuC;
uint32_t __iomem *signature = (uint32_t __iomem *)(&reg->msgcode_rwbuffer[0]);
char __iomem *devicemap = (char __iomem *)(&reg->msgcode_rwbuffer[21]); signature = (uint32_t __iomem *)(&reg->msgcode_rwbuffer[0]);
int target, lun; devicemap = (char __iomem *)(&reg->msgcode_rwbuffer[21]);
struct scsi_device *psdev; break;
char diff; }
}
atomic_inc(&acb->rq_map_token); atomic_inc(&acb->rq_map_token);
if (readl(signature) == ARCMSR_SIGNATURE_GET_CONFIG) { if (readl(signature) != ARCMSR_SIGNATURE_GET_CONFIG)
for (target = 0; target < ARCMSR_MAX_TARGETID - 1; target++) { return;
diff = (*acb_dev_map)^readb(devicemap); for (target = 0; target < ARCMSR_MAX_TARGETID - 1;
if (diff != 0) { target++) {
char temp; temp = readb(devicemap);
*acb_dev_map = readb(devicemap); diff = (*acb_dev_map) ^ temp;
temp = *acb_dev_map; if (diff != 0) {
for (lun = 0; lun < ARCMSR_MAX_TARGETLUN; lun++) { *acb_dev_map = temp;
if ((temp & 0x01) == 1 && (diff & 0x01) == 1) { for (lun = 0; lun < ARCMSR_MAX_TARGETLUN;
scsi_add_device(acb->host, 0, target, lun); lun++) {
} else if ((temp & 0x01) == 0 && (diff & 0x01) == 1) { if ((diff & 0x01) == 1 &&
psdev = scsi_device_lookup(acb->host, 0, target, lun); (temp & 0x01) == 1) {
if (psdev != NULL) { scsi_add_device(acb->host,
scsi_remove_device(psdev); 0, target, lun);
scsi_device_put(psdev); } else if ((diff & 0x01) == 1
} && (temp & 0x01) == 0) {
} psdev = scsi_device_lookup(acb->host,
temp >>= 1; 0, target, lun);
diff >>= 1; if (psdev != NULL) {
} scsi_remove_device(psdev);
scsi_device_put(psdev);
} }
devicemap++;
acb_dev_map++;
} }
temp >>= 1;
diff >>= 1;
} }
} }
devicemap++;
acb_dev_map++;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment