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: Ching Huang <ching2048@areca.com.tw> Reviewed-by: Tomas Henzl <thenzl@redhat.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
8b7c994298
commit
12aad94792
|
@ -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*) (®->message_rwbuffer[0]);
|
||||
char __iomem *devicemap = (char __iomem*) (®->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;
|
||||
}
|
||||
|
||||
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*)(®->message_rwbuffer[0]);
|
||||
char __iomem *devicemap = (char __iomem*)(®->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 *)(®->message_rwbuffer[0]);
|
||||
devicemap = (char __iomem *)(®->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 *)(®->msgcode_rwbuffer[0]);
|
||||
char __iomem *devicemap = (char __iomem *)(®->msgcode_rwbuffer[21]);
|
||||
int target, lun;
|
||||
struct scsi_device *psdev;
|
||||
char diff;
|
||||
}
|
||||
case ACB_ADAPTER_TYPE_B: {
|
||||
struct MessageUnit_B *reg = acb->pmuB;
|
||||
|
||||
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;
|
||||
}
|
||||
signature = (uint32_t __iomem *)(®->message_rwbuffer[0]);
|
||||
devicemap = (char __iomem *)(®->message_rwbuffer[21]);
|
||||
break;
|
||||
}
|
||||
case ACB_ADAPTER_TYPE_C: {
|
||||
struct MessageUnit_C __iomem *reg = acb->pmuC;
|
||||
|
||||
signature = (uint32_t __iomem *)(®->msgcode_rwbuffer[0]);
|
||||
devicemap = (char __iomem *)(®->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++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue