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
1 changed files with 54 additions and 106 deletions
|
@ -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 *)(®->message_rwbuffer[0]);
|
||||||
char *acb_dev_map = (char *)acb->device_map;
|
devicemap = (char __iomem *)(®->message_rwbuffer[21]);
|
||||||
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++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case ACB_ADAPTER_TYPE_C: {
|
}
|
||||||
struct MessageUnit_C *reg = acb->pmuC;
|
case ACB_ADAPTER_TYPE_B: {
|
||||||
char *acb_dev_map = (char *)acb->device_map;
|
struct MessageUnit_B *reg = acb->pmuB;
|
||||||
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;
|
|
||||||
|
|
||||||
atomic_inc(&acb->rq_map_token);
|
signature = (uint32_t __iomem *)(®->message_rwbuffer[0]);
|
||||||
if (readl(signature) == ARCMSR_SIGNATURE_GET_CONFIG) {
|
devicemap = (char __iomem *)(®->message_rwbuffer[21]);
|
||||||
for (target = 0; target < ARCMSR_MAX_TARGETID - 1; target++) {
|
break;
|
||||||
diff = (*acb_dev_map)^readb(devicemap);
|
}
|
||||||
if (diff != 0) {
|
case ACB_ADAPTER_TYPE_C: {
|
||||||
char temp;
|
struct MessageUnit_C __iomem *reg = acb->pmuC;
|
||||||
*acb_dev_map = readb(devicemap);
|
|
||||||
temp = *acb_dev_map;
|
signature = (uint32_t __iomem *)(®->msgcode_rwbuffer[0]);
|
||||||
for (lun = 0; lun < ARCMSR_MAX_TARGETLUN; lun++) {
|
devicemap = (char __iomem *)(®->msgcode_rwbuffer[21]);
|
||||||
if ((temp & 0x01) == 1 && (diff & 0x01) == 1) {
|
break;
|
||||||
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);
|
atomic_inc(&acb->rq_map_token);
|
||||||
if (psdev != NULL) {
|
if (readl(signature) != ARCMSR_SIGNATURE_GET_CONFIG)
|
||||||
scsi_remove_device(psdev);
|
return;
|
||||||
scsi_device_put(psdev);
|
for (target = 0; target < ARCMSR_MAX_TARGETID - 1;
|
||||||
}
|
target++) {
|
||||||
}
|
temp = readb(devicemap);
|
||||||
temp >>= 1;
|
diff = (*acb_dev_map) ^ temp;
|
||||||
diff >>= 1;
|
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…
Add table
Reference in a new issue