]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
scsi: arcmsr: Add ACB_F_MSG_GET_CONFIG to acb->acb_flags
authorChing Huang <ching2048@areca.com.tw>
Tue, 5 Dec 2017 01:57:23 +0000 (09:57 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 7 Dec 2017 00:32:41 +0000 (19:32 -0500)
Add ACB_F_MSG_GET_CONFIG to acb->acb_flags for for message interrupt
checking before schedule work for get device map.

Signed-off-by: Ching Huang <ching2048@areca.com.tw>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/arcmsr/arcmsr.h
drivers/scsi/arcmsr/arcmsr_hba.c

index 5b0b645afa41a9aae79e3474d880b12afc106b85..1cde98f0c52b3470b9e5f8e3473173a97fe72e9b 100644 (file)
@@ -782,6 +782,7 @@ struct AdapterControlBlock
        /* iop init */
        #define ACB_F_ABORT                             0x0200
        #define ACB_F_FIRMWARE_TRAP                     0x0400
+       #define ACB_F_MSG_GET_CONFIG            0x1000
        struct CommandControlBlock *                    pccb_pool[ARCMSR_MAX_FREECCB_NUM];
        /* used for memory free */
        struct list_head                ccb_free_list;
index 82fa2990a2247c24d594c34484b24902c3e6c12c..750d1e9af0c6d34d6278e0015f0b330473da9625 100644 (file)
@@ -743,6 +743,7 @@ static void arcmsr_message_isr_bh_fn(struct work_struct *work)
        struct scsi_device *psdev;
        char diff, temp;
 
+       acb->acb_flags &= ~ACB_F_MSG_GET_CONFIG;
        switch (acb->adapter_type) {
        case ACB_ADAPTER_TYPE_A: {
                struct MessageUnit_A __iomem *reg  = acb->pmuA;
@@ -2328,7 +2329,8 @@ static void arcmsr_hbaA_message_isr(struct AdapterControlBlock *acb)
        struct MessageUnit_A __iomem *reg  = acb->pmuA;
        /*clear interrupt and message state*/
        writel(ARCMSR_MU_OUTBOUND_MESSAGE0_INT, &reg->outbound_intstatus);
-       schedule_work(&acb->arcmsr_do_message_isr_bh);
+       if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+               schedule_work(&acb->arcmsr_do_message_isr_bh);
 }
 static void arcmsr_hbaB_message_isr(struct AdapterControlBlock *acb)
 {
@@ -2336,7 +2338,8 @@ static void arcmsr_hbaB_message_isr(struct AdapterControlBlock *acb)
 
        /*clear interrupt and message state*/
        writel(ARCMSR_MESSAGE_INT_CLEAR_PATTERN, reg->iop2drv_doorbell);
-       schedule_work(&acb->arcmsr_do_message_isr_bh);
+       if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+               schedule_work(&acb->arcmsr_do_message_isr_bh);
 }
 /*
 **********************************************************************************
@@ -2352,7 +2355,8 @@ static void arcmsr_hbaC_message_isr(struct AdapterControlBlock *acb)
        struct MessageUnit_C __iomem *reg  = acb->pmuC;
        /*clear interrupt and message state*/
        writel(ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR, &reg->outbound_doorbell_clear);
-       schedule_work(&acb->arcmsr_do_message_isr_bh);
+       if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+               schedule_work(&acb->arcmsr_do_message_isr_bh);
 }
 
 static void arcmsr_hbaD_message_isr(struct AdapterControlBlock *acb)
@@ -2361,7 +2365,8 @@ static void arcmsr_hbaD_message_isr(struct AdapterControlBlock *acb)
 
        writel(ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE, reg->outbound_doorbell);
        readl(reg->outbound_doorbell);
-       schedule_work(&acb->arcmsr_do_message_isr_bh);
+       if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+               schedule_work(&acb->arcmsr_do_message_isr_bh);
 }
 
 static void arcmsr_hbaE_message_isr(struct AdapterControlBlock *acb)
@@ -2369,7 +2374,8 @@ static void arcmsr_hbaE_message_isr(struct AdapterControlBlock *acb)
        struct MessageUnit_E __iomem *reg  = acb->pmuE;
 
        writel(0, &reg->host_int_status);
-       schedule_work(&acb->arcmsr_do_message_isr_bh);
+       if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+               schedule_work(&acb->arcmsr_do_message_isr_bh);
 }
 
 static int arcmsr_hbaA_handle_isr(struct AdapterControlBlock *acb)
@@ -3826,6 +3832,7 @@ static void arcmsr_hbaA_request_device_map(struct AdapterControlBlock *acb)
                        return;
                }
                writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
+               acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
                mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ));
        }
        return;
@@ -3848,6 +3855,7 @@ static void arcmsr_hbaB_request_device_map(struct AdapterControlBlock *acb)
                        return;
                }
                writel(ARCMSR_MESSAGE_GET_CONFIG, reg->drv2iop_doorbell);
+               acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
                mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ));
        }
        return;
@@ -3871,6 +3879,7 @@ static void arcmsr_hbaC_request_device_map(struct AdapterControlBlock *acb)
                }
                writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
                writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, &reg->inbound_doorbell);
+               acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
                mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ));
        }
        return;
@@ -3900,6 +3909,7 @@ static void arcmsr_hbaD_request_device_map(struct AdapterControlBlock *acb)
                }
                writel(ARCMSR_INBOUND_MESG0_GET_CONFIG,
                        reg->inbound_msgaddr0);
+               acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
                mod_timer(&acb->eternal_timer, jiffies +
                        msecs_to_jiffies(6 * HZ));
        }
@@ -3930,6 +3940,7 @@ static void arcmsr_hbaE_request_device_map(struct AdapterControlBlock *acb)
                writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
                acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
                writel(acb->out_doorbell, &reg->iobound_doorbell);
+               acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
                mod_timer(&acb->eternal_timer, jiffies +
                        msecs_to_jiffies(6 * HZ));
        }