From: Tomas Henzl <thenzl@redhat.com>
To: NickCheng <nick.cheng@areca.com.tw>
Cc: linux-scsi@vger.kernel.org
Subject: Re: [PATCH 1/2] arcmsr: code cleanup and some corrections
Date: Thu, 24 Feb 2011 15:09:30 +0100 [thread overview]
Message-ID: <4D66669A.8070900@redhat.com> (raw)
In-Reply-To: <BCCC229986F640DEABB603D7E9A21DBA@arecaaebe11fae>
On 02/24/2011 03:02 AM, NickCheng wrote:
> Hi Tomas,
> The test on my site is so far so good.
>
Thanks Nick,
if this means you accept this patch please
add an 'Acked-by: ...' line so it is clear what you mean.
> -----Original Message-----
> From: NickCheng [mailto:nick.cheng@areca.com.tw]
> Sent: Friday, February 18, 2011 9:26 AM
> To: 'Tomas Henzl'; 'linux-scsi@vger.kernel.org'
> Subject: RE: [PATCH 1/2] arcmsr: code cleanup and some corrections
>
> Hi Tomas,
> I have not yet tested this code.
> Do you try that?
>
> -----Original Message-----
> From: Tomas Henzl [mailto:thenzl@redhat.com]
> Sent: Thursday, February 17, 2011 11:08 PM
> To: 'linux-scsi@vger.kernel.org'
> Cc: nick.cheng@areca.com.tw
> Subject: Re: [PATCH 1/2] arcmsr: code cleanup and some corrections
>
> Hi Nick,
>
> any comments here?
>
> tomash
>
>
>
>> I removed outer loops in ...wait_msgint_ready
>> the sleeptime and retrycount are in fact never changed so I changed them
>> into defines. In arcmsr_flush_hba_cache is a loop removed, which
>> printed the same printk 100 times, one line in log is enough I think.
>> The arcmsr_sleep_for_bus_reset has lost a functionality with the latest
>>
> patches,
>
>> The only thing the function does is a long sleep, so it's replaced with a
>>
> ssleep.
>
>> Signed-off-by: Tomas henzl <thenzl@redhat.com>
>>
>> diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c
>>
> b/drivers/scsi/arcmsr/arcmsr_hba.c
>
>> index 984bd52..4cd522b 100644
>> --- a/drivers/scsi/arcmsr/arcmsr_hba.c
>> +++ b/drivers/scsi/arcmsr/arcmsr_hba.c
>> @@ -75,8 +75,10 @@ MODULE_AUTHOR("Nick Cheng <support@areca.com.tw>");
>> MODULE_DESCRIPTION("ARECA (ARC11xx/12xx/16xx/1880) SATA/SAS RAID Host Bus
>>
> Adapter");
>
>> MODULE_LICENSE("Dual BSD/GPL");
>> MODULE_VERSION(ARCMSR_DRIVER_VERSION);
>> -static int sleeptime = 10;
>> -static int retrycount = 12;
>> +
>> +#define ARCMSR_SLEEPTIME 10
>> +#define ARCMSR_RETRYCOUNT 12
>> +
>> wait_queue_head_t wait_q;
>> static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb,
>> struct scsi_cmnd *cmd);
>> @@ -171,24 +173,6 @@ static struct pci_driver arcmsr_pci_driver = {
>>
>>
> ****************************************************************************
>
>>
> ****************************************************************************
>
>> */
>> -int arcmsr_sleep_for_bus_reset(struct scsi_cmnd *cmd)
>> -{
>> - struct Scsi_Host *shost = NULL;
>> - int i, isleep;
>> - shost = cmd->device->host;
>> - isleep = sleeptime / 10;
>> - if (isleep > 0) {
>> - for (i = 0; i < isleep; i++) {
>> - msleep(10000);
>> - }
>> - }
>> -
>> - isleep = sleeptime % 10;
>> - if (isleep > 0) {
>> - msleep(isleep*1000);
>> - }
>> - return 0;
>> -}
>>
>> static void arcmsr_free_hbb_mu(struct AdapterControlBlock *acb)
>> {
>> @@ -323,66 +307,64 @@ static void arcmsr_define_adapter_type(struct
>>
> AdapterControlBlock *acb)
>
>>
>> default: acb->adapter_type = ACB_ADAPTER_TYPE_A;
>> }
>> -}
>> +}
>>
>> static uint8_t arcmsr_hba_wait_msgint_ready(struct AdapterControlBlock
>>
> *acb)
>
>> {
>> struct MessageUnit_A __iomem *reg = acb->pmuA;
>> - uint32_t Index;
>> - uint8_t Retries = 0x00;
>> - do {
>> - for (Index = 0; Index < 100; Index++) {
>> - if (readl(®->outbound_intstatus) &
>> - ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
>> - writel(ARCMSR_MU_OUTBOUND_MESSAGE0_INT,
>> - ®->outbound_intstatus);
>> - return true;
>> - }
>> - msleep(10);
>> - }/*max 1 seconds*/
>> + int i;
>> +
>> + for (i = 0; i < 2000; i++) {
>> + if (readl(®->outbound_intstatus) &
>> + ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
>> + writel(ARCMSR_MU_OUTBOUND_MESSAGE0_INT,
>> + ®->outbound_intstatus);
>> + return true;
>> + }
>> + msleep(10);
>> + }/* max 20 seconds */
>>
>> - } while (Retries++ < 20);/*max 20 sec*/
>> return false;
>> }
>>
>> static uint8_t arcmsr_hbb_wait_msgint_ready(struct AdapterControlBlock
>>
> *acb)
>
>> {
>> struct MessageUnit_B *reg = acb->pmuB;
>> - uint32_t Index;
>> - uint8_t Retries = 0x00;
>> - do {
>> - for (Index = 0; Index < 100; Index++) {
>> - if (readl(reg->iop2drv_doorbell)
>> - & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
>> - writel(ARCMSR_MESSAGE_INT_CLEAR_PATTERN
>> - , reg->iop2drv_doorbell);
>> - writel(ARCMSR_DRV2IOP_END_OF_INTERRUPT,
>>
> reg->drv2iop_doorbell);
>
>> - return true;
>> - }
>> - msleep(10);
>> - }/*max 1 seconds*/
>> + int i;
>> +
>> + for (i = 0; i < 2000; i++) {
>> + if (readl(reg->iop2drv_doorbell)
>> + & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
>> + writel(ARCMSR_MESSAGE_INT_CLEAR_PATTERN,
>> + reg->iop2drv_doorbell);
>> + writel(ARCMSR_DRV2IOP_END_OF_INTERRUPT,
>> + reg->drv2iop_doorbell);
>> + return true;
>> + }
>> + msleep(10);
>> + }/* max 20 seconds */
>>
>> - } while (Retries++ < 20);/*max 20 sec*/
>> return false;
>> }
>>
>> static uint8_t arcmsr_hbc_wait_msgint_ready(struct AdapterControlBlock
>>
> *pACB)
>
>> {
>> struct MessageUnit_C *phbcmu = (struct MessageUnit_C *)pACB->pmuC;
>> - unsigned char Retries = 0x00;
>> - uint32_t Index;
>> - do {
>> - for (Index = 0; Index < 100; Index++) {
>> - if (readl(&phbcmu->outbound_doorbell) &
>>
> ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
>
>> -
>>
> writel(ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR,
> &phbcmu->outbound_doorbell_clear);/*clear interrupt*/
>
>> - return true;
>> - }
>> - /* one us delay */
>> - msleep(10);
>> - } /*max 1 seconds*/
>> - } while (Retries++ < 20); /*max 20 sec*/
>> + int i;
>> +
>> + for (i = 0; i < 2000; i++) {
>> + if (readl(&phbcmu->outbound_doorbell)
>> + & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
>> +
>>
> writel(ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR,
>
>> + &phbcmu->outbound_doorbell_clear); /*clear
>>
> interrupt*/
>
>> + return true;
>> + }
>> + msleep(10);
>> + } /* max 20 seconds */
>> +
>> return false;
>> }
>> +
>> static void arcmsr_flush_hba_cache(struct AdapterControlBlock *acb)
>> {
>> struct MessageUnit_A __iomem *reg = acb->pmuA;
>> @@ -2602,12 +2584,8 @@ static int arcmsr_iop_confirm(struct
>>
> AdapterControlBlock *acb)
>
>> if (cdb_phyaddr_hi32 != 0) {
>> struct MessageUnit_C *reg = (struct MessageUnit_C
>>
> *)acb->pmuC;
>
>>
>> - if (cdb_phyaddr_hi32 != 0) {
>> - unsigned char Retries = 0x00;
>> - do {
>> - printk(KERN_NOTICE "arcmsr%d:
>>
> cdb_phyaddr_hi32=0x%x \n", acb->adapter_index, cdb_phyaddr_hi32);
>
>> - } while (Retries++ < 100);
>> - }
>> + printk(KERN_NOTICE "arcmsr%d: cdb_phyaddr_hi32=0x%x
>>
> \n",
>
>> + acb->adapter_index,
>>
> cdb_phyaddr_hi32);
>
>> writel(ARCMSR_SIGNATURE_SET_CONFIG,
>>
> ®->msgcode_rwbuffer[0]);
>
>> writel(cdb_phyaddr_hi32, ®->msgcode_rwbuffer[1]);
>> writel(ARCMSR_INBOUND_MESG0_SET_CONFIG,
>>
> ®->inbound_msgaddr0);
>
>> @@ -2955,10 +2933,10 @@ static int arcmsr_bus_reset(struct scsi_cmnd *cmd)
>> arcmsr_hardware_reset(acb);
>> acb->acb_flags &= ~ACB_F_IOP_INITED;
>> sleep_again:
>> - arcmsr_sleep_for_bus_reset(cmd);
>> + ssleep(ARCMSR_SLEEPTIME);
>> if ((readl(®->outbound_msgaddr1) &
>>
> ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0) {
>
>> printk(KERN_ERR "arcmsr%d: waiting
>>
> for hw bus reset return, retry=%d \n", acb->host->host_no, retry_count);
>
>> - if (retry_count > retrycount) {
>> + if (retry_count > ARCMSR_RETRYCOUNT)
>>
> {
>
>> acb->fw_flag = FW_DEADLOCK;
>> printk(KERN_ERR "arcmsr%d:
>>
> waiting for hw bus reset return, RETRY TERMINATED!! \n",
> acb->host->host_no);
>
>> return FAILED;
>> @@ -3025,10 +3003,10 @@ sleep_again:
>> arcmsr_hardware_reset(acb);
>> acb->acb_flags &= ~ACB_F_IOP_INITED;
>> sleep:
>> - arcmsr_sleep_for_bus_reset(cmd);
>> + ssleep(ARCMSR_SLEEPTIME);
>> if ((readl(®->host_diagnostic) & 0x04) !=
>>
> 0) {
>
>> printk(KERN_ERR "arcmsr%d: waiting
>>
> for hw bus reset return, retry=%d \n", acb->host->host_no, retry_count);
>
>> - if (retry_count > retrycount) {
>> + if (retry_count > ARCMSR_RETRYCOUNT)
>>
> {
>
>> acb->fw_flag = FW_DEADLOCK;
>> printk(KERN_ERR "arcmsr%d:
>>
> waiting for hw bus reset return, RETRY TERMINATED!! \n",
> acb->host->host_no);
>
>> return FAILED;
>>
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2011-02-24 14:09 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-10 14:22 [PATCH 1/2] arcmsr: code cleanup and some corrections Tomas Henzl
2011-02-10 14:36 ` [PATCH 2/2] " Tomas Henzl
2011-02-11 1:44 ` NickCheng
2011-02-17 15:05 ` Tomas Henzl
2011-02-18 1:04 ` FUJITA Tomonori
2011-02-18 10:59 ` Tomas Henzl
2011-02-24 14:14 ` Tomas Henzl
2011-02-25 1:30 ` NickCheng
2011-02-17 15:07 ` [PATCH 1/2] " Tomas Henzl
2011-02-18 1:26 ` NickCheng
2011-02-18 11:04 ` Tomas Henzl
2011-02-18 11:36 ` NickCheng
2011-02-24 2:02 ` NickCheng
2011-02-24 14:09 ` Tomas Henzl [this message]
2011-02-25 1:30 ` NickCheng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4D66669A.8070900@redhat.com \
--to=thenzl@redhat.com \
--cc=linux-scsi@vger.kernel.org \
--cc=nick.cheng@areca.com.tw \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).