diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c index a599a7b51a921cfcabca6e9c6c1141ea051ec086..dab1d7933ea102b6f5c85bd33c5e15e012f936a5 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c @@ -1457,6 +1457,7 @@ static void process_ioaccel2_completion(struct ctlr_info *h, "%s: Error 0x%02x, Retrying on standard path.\n", "HP SSD Smart Path", c2->error_data.status); dev->offload_enabled = 0; + h->drv_req_rescan = 1; /* schedule controller for a rescan */ cmd->result = DID_SOFT_ERROR << 16; cmd_free(h, c); cmd->scsi_done(cmd); @@ -6138,6 +6139,9 @@ static int hpsa_kickoff_rescan(struct ctlr_info *h) int i; char *event_type; + /* Clear the driver-requested rescan flag */ + h->drv_req_rescan = 0; + /* Ask the controller to clear the events we're handling. */ if ((h->transMethod & (CFGTBL_Trans_io_accel1 | CFGTBL_Trans_io_accel2)) && @@ -6185,7 +6189,9 @@ static int hpsa_kickoff_rescan(struct ctlr_info *h) /* Check a register on the controller to see if there are configuration * changes (added/changed/removed logical drives, etc.) which mean that - * we should rescan the controller for devices. If so, add the controller + * we should rescan the controller for devices. + * Also check flag for driver-initiated rescan. + * If either flag or controller event indicate rescan, add the controller * to the list of controllers needing to be rescanned, and gets a * reference to the associated scsi_host. */ @@ -6195,7 +6201,7 @@ static void hpsa_ctlr_needs_rescan(struct ctlr_info *h) return; h->events = readl(&(h->cfgtable->event_notify)); - if (!h->events) + if (!h->events && !h->drv_req_rescan) return; /* @@ -6369,6 +6375,8 @@ static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) /* Enable Accelerated IO path at driver layer */ h->acciopath_status = 1; + h->drv_req_rescan = 0; + /* Turn the interrupts on so we can service requests */ h->access.set_intr_mask(h, HPSA_INTR_ON); diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h index 1d3340dbe31081f5c41e1efbcabf4377a041375c..2e7521fdc344aaa734467e71a454c0cde65b22e8 100644 --- a/drivers/scsi/hpsa.h +++ b/drivers/scsi/hpsa.h @@ -182,6 +182,7 @@ struct ctlr_info { #define HPSATMF_LOG_QRY_ASYNC (1 << 25) u32 events; int acciopath_status; + int drv_req_rescan; /* flag for driver to request rescan event */ }; #define HPSA_ABORT_MSG 0 #define HPSA_DEVICE_RESET_MSG 1