From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755010AbcA2LWz (ORCPT ); Fri, 29 Jan 2016 06:22:55 -0500 Received: from mail-pf0-f194.google.com ([209.85.192.194]:32989 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750914AbcA2LWx (ORCPT ); Fri, 29 Jan 2016 06:22:53 -0500 Message-ID: <56AB4B89.6070309@gmail.com> Date: Fri, 29 Jan 2016 19:22:49 +0800 From: Charles Chiou User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Johannes Thumshirn CC: Christoph Hellwig , JBottomley@parallels.com, Oliver Neukum , grace.chang@tw.promise.com, linus.chen@tw.promise.com, victor.p@promise.com, linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [v2 PATCH 2/3] scsi:stex.c Add hotplug support References: <55E83DB3.5050209@gmail.com> In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi all, Ping? Does this patch has others issues need to fix? Thank you. Charles On 09/03/2015 10:01 PM, Johannes Thumshirn wrote: > Charles Chiou writes: > >> From 60e14c245c18cbe0300cfa244334e2850a52a381 Mon Sep 17 00:00:00 2001 >> From: Charles >> Date: Wed, 2 Sep 2015 20:48:55 +0800 >> Subject: [PATCH 2/3] scsi:stex.c Add hotplug support >> >> 1. Add hotplug support. Pegasus support surprise removal. To this end, I >> use return_abnormal_state function to return DID_NO_CONNECT for all >> commands which sent to driver. >> >> 2. Remove stex_hba_stop in stex_remove because we cannot send command to >> device after hotplug. >> >> 3. Add new device status: MU_STATE_STOP, MU_STATE_NOCONNECT, >> MU_STATE_STOP. MU_STATE_STOP is currently not referenced. >> MU_STATE_NOCONNECT represent that device is plugged out from the host. >> >> 4. Use return_abnormal_function() to substitute part of code in stex_do_reset. >> >> V2: N/A >> >> Signed-off-by: Charles Chiou >> --- >> drivers/scsi/stex.c | 53 ++++++++++++++++++++++++++++++++++------------------- >> 1 file changed, 34 insertions(+), 19 deletions(-) >> >> diff --git a/drivers/scsi/stex.c b/drivers/scsi/stex.c >> index 0c93f1f..4ef0c80 100644 >> --- a/drivers/scsi/stex.c >> +++ b/drivers/scsi/stex.c >> @@ -83,6 +83,8 @@ enum { >> MU_STATE_STARTED = 2, >> MU_STATE_RESETTING = 3, >> MU_STATE_FAILED = 4, >> + MU_STATE_STOP = 5, >> + MU_STATE_NOCONNECT = 6, >> >> MU_MAX_DELAY = 120, >> MU_HANDSHAKE_SIGNATURE = 0x55aaaa55, >> @@ -544,6 +546,27 @@ stex_ss_send_cmd(struct st_hba *hba, struct req_msg *req, >> u16 tag) >> readl(hba->mmio_base + YH2I_REQ); /* flush */ >> } >> >> +static void return_abnormal_state(struct st_hba *hba, int status) >> +{ >> + struct st_ccb *ccb; >> + unsigned long flags; >> + u16 tag; >> + >> + spin_lock_irqsave(hba->host->host_lock, flags); >> + for (tag = 0; tag < hba->host->can_queue; tag++) { >> + ccb = &hba->ccb[tag]; >> + if (ccb->req == NULL) >> + continue; >> + ccb->req = NULL; >> + if (ccb->cmd) { >> + scsi_dma_unmap(ccb->cmd); >> + ccb->cmd->result = status << 16; >> + ccb->cmd->scsi_done(ccb->cmd); >> + ccb->cmd = NULL; >> + } >> + } >> + spin_unlock_irqrestore(hba->host->host_lock, flags); >> +} >> static int >> stex_slave_config(struct scsi_device *sdev) >> { >> @@ -567,8 +590,12 @@ stex_queuecommand_lck(struct scsi_cmnd *cmd, void >> (*done)(struct scsi_cmnd *)) >> id = cmd->device->id; >> lun = cmd->device->lun; >> hba = (struct st_hba *) &host->hostdata[0]; >> - >> - if (unlikely(hba->mu_status == MU_STATE_RESETTING)) >> + if (hba->mu_status == MU_STATE_NOCONNECT) { >> + cmd->result = DID_NO_CONNECT; >> + done(cmd); >> + return 0; >> + } >> + if (unlikely(hba->mu_status != MU_STATE_STARTED)) >> return SCSI_MLQUEUE_HOST_BUSY; >> >> switch (cmd->cmnd[0]) { >> @@ -1267,10 +1294,8 @@ static void stex_ss_reset(struct st_hba *hba) >> >> static int stex_do_reset(struct st_hba *hba) >> { >> - struct st_ccb *ccb; >> unsigned long flags; >> unsigned int mu_status = MU_STATE_RESETTING; >> - u16 tag; >> >> spin_lock_irqsave(hba->host->host_lock, flags); >> if (hba->mu_status == MU_STATE_STARTING) { >> @@ -1304,20 +1329,8 @@ static int stex_do_reset(struct st_hba *hba) >> else if (hba->cardtype == st_yel) >> stex_ss_reset(hba); >> >> - spin_lock_irqsave(hba->host->host_lock, flags); >> - for (tag = 0; tag < hba->host->can_queue; tag++) { >> - ccb = &hba->ccb[tag]; >> - if (ccb->req == NULL) >> - continue; >> - ccb->req = NULL; >> - if (ccb->cmd) { >> - scsi_dma_unmap(ccb->cmd); >> - ccb->cmd->result = DID_RESET << 16; >> - ccb->cmd->scsi_done(ccb->cmd); >> - ccb->cmd = NULL; >> - } >> - } >> - spin_unlock_irqrestore(hba->host->host_lock, flags); >> + >> + return_abnormal_state(hba, DID_RESET); >> >> if (stex_handshake(hba) == 0) >> return 0; >> @@ -1786,9 +1799,11 @@ static void stex_remove(struct pci_dev *pdev) >> { >> struct st_hba *hba = pci_get_drvdata(pdev); >> >> + hba->mu_status = MU_STATE_NOCONNECT; >> + return_abnormal_state(hba, DID_NO_CONNECT); >> scsi_remove_host(hba->host); >> >> - stex_hba_stop(hba); >> + scsi_block_requests(hba->host); >> >> stex_hba_free(hba); > > Looks OK to me, so > Reviewed-by: Johannes Thumshirn >