Commit 1e9c8108 authored by Ching Huang's avatar Ching Huang Committed by Martin K. Petersen

scsi: arcmsr: simplify all arcmsr_hbaX_get_config routine by call a new get_adapter_config function

Simplify all arcmsr_hbaX_get_config routine by call a new
get_adapter_config function.
Signed-off-by: default avatarChing Huang <ching2048@areca.com.tw>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 22c4ae5b
...@@ -2956,75 +2956,66 @@ static int arcmsr_queue_command_lck(struct scsi_cmnd *cmd, ...@@ -2956,75 +2956,66 @@ static int arcmsr_queue_command_lck(struct scsi_cmnd *cmd,
static DEF_SCSI_QCMD(arcmsr_queue_command) static DEF_SCSI_QCMD(arcmsr_queue_command)
static bool arcmsr_hbaA_get_config(struct AdapterControlBlock *acb) static void arcmsr_get_adapter_config(struct AdapterControlBlock *pACB, uint32_t *rwbuffer)
{ {
struct MessageUnit_A __iomem *reg = acb->pmuA;
char *acb_firm_model = acb->firm_model;
char *acb_firm_version = acb->firm_version;
char *acb_device_map = acb->device_map;
char __iomem *iop_firm_model = (char __iomem *)(&reg->message_rwbuffer[15]);
char __iomem *iop_firm_version = (char __iomem *)(&reg->message_rwbuffer[17]);
char __iomem *iop_device_map = (char __iomem *)(&reg->message_rwbuffer[21]);
int count; int count;
arcmsr_wait_firmware_ready(acb); uint32_t *acb_firm_model = (uint32_t *)pACB->firm_model;
writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0); uint32_t *acb_firm_version = (uint32_t *)pACB->firm_version;
if (!arcmsr_hbaA_wait_msgint_ready(acb)) { uint32_t *acb_device_map = (uint32_t *)pACB->device_map;
printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \ uint32_t *firm_model = &rwbuffer[15];
miscellaneous data' timeout \n", acb->host->host_no); uint32_t *firm_version = &rwbuffer[17];
return false; uint32_t *device_map = &rwbuffer[21];
}
count = 8; count = 2;
while (count){ while (count) {
*acb_firm_model = readb(iop_firm_model); *acb_firm_model = readl(firm_model);
acb_firm_model++; acb_firm_model++;
iop_firm_model++; firm_model++;
count--; count--;
} }
count = 4;
count = 16; while (count) {
while (count){ *acb_firm_version = readl(firm_version);
*acb_firm_version = readb(iop_firm_version);
acb_firm_version++; acb_firm_version++;
iop_firm_version++; firm_version++;
count--; count--;
} }
count = 4;
count=16; while (count) {
while(count){ *acb_device_map = readl(device_map);
*acb_device_map = readb(iop_device_map);
acb_device_map++; acb_device_map++;
iop_device_map++; device_map++;
count--; count--;
} }
pACB->signature = readl(&rwbuffer[0]);
pACB->firm_request_len = readl(&rwbuffer[1]);
pACB->firm_numbers_queue = readl(&rwbuffer[2]);
pACB->firm_sdram_size = readl(&rwbuffer[3]);
pACB->firm_hd_channels = readl(&rwbuffer[4]);
pACB->firm_cfg_version = readl(&rwbuffer[25]);
pr_notice("Areca RAID Controller%d: Model %s, F/W %s\n", pr_notice("Areca RAID Controller%d: Model %s, F/W %s\n",
acb->host->host_no, pACB->host->host_no,
acb->firm_model, pACB->firm_model,
acb->firm_version); pACB->firm_version);
acb->signature = readl(&reg->message_rwbuffer[0]); }
acb->firm_request_len = readl(&reg->message_rwbuffer[1]);
acb->firm_numbers_queue = readl(&reg->message_rwbuffer[2]); static bool arcmsr_hbaA_get_config(struct AdapterControlBlock *acb)
acb->firm_sdram_size = readl(&reg->message_rwbuffer[3]); {
acb->firm_hd_channels = readl(&reg->message_rwbuffer[4]); struct MessageUnit_A __iomem *reg = acb->pmuA;
acb->firm_cfg_version = readl(&reg->message_rwbuffer[25]); /*firm_cfg_version,25,100-103*/
arcmsr_wait_firmware_ready(acb);
writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
if (!arcmsr_hbaA_wait_msgint_ready(acb)) {
printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
miscellaneous data' timeout \n", acb->host->host_no);
return false;
}
arcmsr_get_adapter_config(acb, reg->message_rwbuffer);
return true; return true;
} }
static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb) static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb)
{ {
struct MessageUnit_B *reg = acb->pmuB; struct MessageUnit_B *reg = acb->pmuB;
char *acb_firm_model = acb->firm_model;
char *acb_firm_version = acb->firm_version;
char *acb_device_map = acb->device_map;
char __iomem *iop_firm_model;
/*firm_model,15,60-67*/
char __iomem *iop_firm_version;
/*firm_version,17,68-83*/
char __iomem *iop_device_map;
/*firm_version,21,84-99*/
int count;
iop_firm_model = (char __iomem *)(&reg->message_rwbuffer[15]); /*firm_model,15,60-67*/
iop_firm_version = (char __iomem *)(&reg->message_rwbuffer[17]); /*firm_version,17,68-83*/
iop_device_map = (char __iomem *)(&reg->message_rwbuffer[21]); /*firm_version,21,84-99*/
arcmsr_wait_firmware_ready(acb); arcmsr_wait_firmware_ready(acb);
writel(ARCMSR_MESSAGE_START_DRIVER_MODE, reg->drv2iop_doorbell); writel(ARCMSR_MESSAGE_START_DRIVER_MODE, reg->drv2iop_doorbell);
...@@ -3038,46 +3029,7 @@ static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb) ...@@ -3038,46 +3029,7 @@ static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb)
miscellaneous data' timeout \n", acb->host->host_no); miscellaneous data' timeout \n", acb->host->host_no);
return false; return false;
} }
count = 8; arcmsr_get_adapter_config(acb, reg->message_rwbuffer);
while (count){
*acb_firm_model = readb(iop_firm_model);
acb_firm_model++;
iop_firm_model++;
count--;
}
count = 16;
while (count){
*acb_firm_version = readb(iop_firm_version);
acb_firm_version++;
iop_firm_version++;
count--;
}
count = 16;
while(count){
*acb_device_map = readb(iop_device_map);
acb_device_map++;
iop_device_map++;
count--;
}
pr_notice("Areca RAID Controller%d: Model %s, F/W %s\n",
acb->host->host_no,
acb->firm_model,
acb->firm_version);
acb->signature = readl(&reg->message_rwbuffer[0]);
/*firm_signature,1,00-03*/
acb->firm_request_len = readl(&reg->message_rwbuffer[1]);
/*firm_request_len,1,04-07*/
acb->firm_numbers_queue = readl(&reg->message_rwbuffer[2]);
/*firm_numbers_queue,2,08-11*/
acb->firm_sdram_size = readl(&reg->message_rwbuffer[3]);
/*firm_sdram_size,3,12-15*/
acb->firm_hd_channels = readl(&reg->message_rwbuffer[4]);
/*firm_ide_channels,4,16-19*/
acb->firm_cfg_version = readl(&reg->message_rwbuffer[25]); /*firm_cfg_version,25,100-103*/
/*firm_ide_channels,4,16-19*/
return true; return true;
} }
...@@ -3085,11 +3037,7 @@ static bool arcmsr_hbaC_get_config(struct AdapterControlBlock *pACB) ...@@ -3085,11 +3037,7 @@ static bool arcmsr_hbaC_get_config(struct AdapterControlBlock *pACB)
{ {
uint32_t intmask_org; uint32_t intmask_org;
struct MessageUnit_C __iomem *reg = pACB->pmuC; struct MessageUnit_C __iomem *reg = pACB->pmuC;
char *acb_firm_model = pACB->firm_model;
char *acb_firm_version = pACB->firm_version;
char __iomem *iop_firm_model = (char __iomem *)(&reg->msgcode_rwbuffer[15]); /*firm_model,15,60-67*/
char __iomem *iop_firm_version = (char __iomem *)(&reg->msgcode_rwbuffer[17]); /*firm_version,17,68-83*/
int count;
/* disable all outbound interrupt */ /* disable all outbound interrupt */
intmask_org = readl(&reg->host_int_mask); /* disable outbound message0 int */ intmask_org = readl(&reg->host_int_mask); /* disable outbound message0 int */
writel(intmask_org|ARCMSR_HBCMU_ALL_INTMASKENABLE, &reg->host_int_mask); writel(intmask_org|ARCMSR_HBCMU_ALL_INTMASKENABLE, &reg->host_int_mask);
...@@ -3104,47 +3052,14 @@ static bool arcmsr_hbaC_get_config(struct AdapterControlBlock *pACB) ...@@ -3104,47 +3052,14 @@ static bool arcmsr_hbaC_get_config(struct AdapterControlBlock *pACB)
miscellaneous data' timeout \n", pACB->host->host_no); miscellaneous data' timeout \n", pACB->host->host_no);
return false; return false;
} }
count = 8; arcmsr_get_adapter_config(pACB, reg->msgcode_rwbuffer);
while (count) {
*acb_firm_model = readb(iop_firm_model);
acb_firm_model++;
iop_firm_model++;
count--;
}
count = 16;
while (count) {
*acb_firm_version = readb(iop_firm_version);
acb_firm_version++;
iop_firm_version++;
count--;
}
pr_notice("Areca RAID Controller%d: Model %s, F/W %s\n",
pACB->host->host_no,
pACB->firm_model,
pACB->firm_version);
pACB->firm_request_len = readl(&reg->msgcode_rwbuffer[1]); /*firm_request_len,1,04-07*/
pACB->firm_numbers_queue = readl(&reg->msgcode_rwbuffer[2]); /*firm_numbers_queue,2,08-11*/
pACB->firm_sdram_size = readl(&reg->msgcode_rwbuffer[3]); /*firm_sdram_size,3,12-15*/
pACB->firm_hd_channels = readl(&reg->msgcode_rwbuffer[4]); /*firm_ide_channels,4,16-19*/
pACB->firm_cfg_version = readl(&reg->msgcode_rwbuffer[25]); /*firm_cfg_version,25,100-103*/
/*all interrupt service will be enable at arcmsr_iop_init*/
return true; return true;
} }
static bool arcmsr_hbaD_get_config(struct AdapterControlBlock *acb) static bool arcmsr_hbaD_get_config(struct AdapterControlBlock *acb)
{ {
char *acb_firm_model = acb->firm_model;
char *acb_firm_version = acb->firm_version;
char *acb_device_map = acb->device_map;
char __iomem *iop_firm_model;
char __iomem *iop_firm_version;
char __iomem *iop_device_map;
u32 count;
struct MessageUnit_D *reg = acb->pmuD; struct MessageUnit_D *reg = acb->pmuD;
iop_firm_model = (char __iomem *)(&reg->msgcode_rwbuffer[15]);
iop_firm_version = (char __iomem *)(&reg->msgcode_rwbuffer[17]);
iop_device_map = (char __iomem *)(&reg->msgcode_rwbuffer[21]);
if (readl(acb->pmuD->outbound_doorbell) & if (readl(acb->pmuD->outbound_doorbell) &
ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE) { ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE) {
writel(ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE, writel(ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE,
...@@ -3159,54 +3074,14 @@ static bool arcmsr_hbaD_get_config(struct AdapterControlBlock *acb) ...@@ -3159,54 +3074,14 @@ static bool arcmsr_hbaD_get_config(struct AdapterControlBlock *acb)
"miscellaneous data timeout\n", acb->host->host_no); "miscellaneous data timeout\n", acb->host->host_no);
return false; return false;
} }
count = 8; arcmsr_get_adapter_config(acb, reg->msgcode_rwbuffer);
while (count) {
*acb_firm_model = readb(iop_firm_model);
acb_firm_model++;
iop_firm_model++;
count--;
}
count = 16;
while (count) {
*acb_firm_version = readb(iop_firm_version);
acb_firm_version++;
iop_firm_version++;
count--;
}
count = 16;
while (count) {
*acb_device_map = readb(iop_device_map);
acb_device_map++;
iop_device_map++;
count--;
}
acb->signature = readl(&reg->msgcode_rwbuffer[0]);
/*firm_signature,1,00-03*/
acb->firm_request_len = readl(&reg->msgcode_rwbuffer[1]);
/*firm_request_len,1,04-07*/
acb->firm_numbers_queue = readl(&reg->msgcode_rwbuffer[2]);
/*firm_numbers_queue,2,08-11*/
acb->firm_sdram_size = readl(&reg->msgcode_rwbuffer[3]);
/*firm_sdram_size,3,12-15*/
acb->firm_hd_channels = readl(&reg->msgcode_rwbuffer[4]);
/*firm_hd_channels,4,16-19*/
acb->firm_cfg_version = readl(&reg->msgcode_rwbuffer[25]);
pr_notice("Areca RAID Controller%d: Model %s, F/W %s\n",
acb->host->host_no,
acb->firm_model,
acb->firm_version);
return true; return true;
} }
static bool arcmsr_hbaE_get_config(struct AdapterControlBlock *pACB) static bool arcmsr_hbaE_get_config(struct AdapterControlBlock *pACB)
{ {
char *acb_firm_model = pACB->firm_model;
char *acb_firm_version = pACB->firm_version;
struct MessageUnit_E __iomem *reg = pACB->pmuE; struct MessageUnit_E __iomem *reg = pACB->pmuE;
char __iomem *iop_firm_model = (char __iomem *)(&reg->msgcode_rwbuffer[15]);
char __iomem *iop_firm_version = (char __iomem *)(&reg->msgcode_rwbuffer[17]);
uint32_t intmask_org; uint32_t intmask_org;
int count;
/* disable all outbound interrupt */ /* disable all outbound interrupt */
intmask_org = readl(&reg->host_int_mask); /* disable outbound message0 int */ intmask_org = readl(&reg->host_int_mask); /* disable outbound message0 int */
...@@ -3225,29 +3100,7 @@ static bool arcmsr_hbaE_get_config(struct AdapterControlBlock *pACB) ...@@ -3225,29 +3100,7 @@ static bool arcmsr_hbaE_get_config(struct AdapterControlBlock *pACB)
"miscellaneous data timeout\n", pACB->host->host_no); "miscellaneous data timeout\n", pACB->host->host_no);
return false; return false;
} }
count = 8; arcmsr_get_adapter_config(pACB, reg->msgcode_rwbuffer);
while (count) {
*acb_firm_model = readb(iop_firm_model);
acb_firm_model++;
iop_firm_model++;
count--;
}
count = 16;
while (count) {
*acb_firm_version = readb(iop_firm_version);
acb_firm_version++;
iop_firm_version++;
count--;
}
pACB->firm_request_len = readl(&reg->msgcode_rwbuffer[1]);
pACB->firm_numbers_queue = readl(&reg->msgcode_rwbuffer[2]);
pACB->firm_sdram_size = readl(&reg->msgcode_rwbuffer[3]);
pACB->firm_hd_channels = readl(&reg->msgcode_rwbuffer[4]);
pACB->firm_cfg_version = readl(&reg->msgcode_rwbuffer[25]);
pr_notice("Areca RAID Controller%d: Model %s, F/W %s\n",
pACB->host->host_no,
pACB->firm_model,
pACB->firm_version);
return true; return true;
} }
......
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