linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Subhash Jadavani <subhashj@codeaurora.org>
To: vinholikatti@gmail.com
Cc: james.bottomley@hansenpartnership.com,
	linux-scsi@vger.kernel.org, santoshsy@gmail.com
Subject: Re: [PATCH V5 1/4] [SCSI] drivers/scsi/ufs: Seggregate PCI Specific Code
Date: Thu, 27 Dec 2012 19:59:46 +0530	[thread overview]
Message-ID: <50DC5B5A.9060403@codeaurora.org> (raw)
In-Reply-To: <50db5b09.644e420a.0ead.ffffbba7@mx.google.com>


Few comments inline:

On 12/27/2012 1:45 AM, vinholikatti@gmail.com wrote:
> From: Vinayak Holikatti <vinholikatti@gmail.com>
>
> This patch seggregates the PCI specific code in ufshcd.c to make it
> ready for splitting into core ufs driver and PCI glue driver. Also
> copyright header modification to remove extra warranty disclaim.
>
> Reviewed-by: Arnd Bergmann <arnd@arndb.de>
> Reviewed-by: Namjae Jeon <linkinjeon@gmail.com>
> Signed-off-by: Vinayak Holikatti <vinholikatti@gmail.com>
> Signed-off-by: Santosh Yaraganavi <santoshsy@gmail.com>
> ---
>   drivers/scsi/ufs/Kconfig  |   50 +++----
>   drivers/scsi/ufs/ufs.h    |   42 ++----
>   drivers/scsi/ufs/ufshcd.c |  339 +++++++++++++++++++++++++++------------------
>   drivers/scsi/ufs/ufshci.h |   42 ++----
>   4 files changed, 255 insertions(+), 218 deletions(-)
>
> diff --git a/drivers/scsi/ufs/Kconfig b/drivers/scsi/ufs/Kconfig
> index 8f27f9d..9c84569 100644
> --- a/drivers/scsi/ufs/Kconfig
> +++ b/drivers/scsi/ufs/Kconfig
> @@ -2,45 +2,35 @@
>   # Kernel configuration file for the UFS Host Controller
>   #
>   # This code is based on drivers/scsi/ufs/Kconfig
> -# Copyright (C) 2011  Samsung Samsung India Software Operations
> +# Copyright (C) 2011-2012 Samsung India Software Operations
> +#
> +# Authors:
> +#	Santosh Yaraganavi <santosh.sy@samsung.com>
> +#	Vinayak Holikatti <h.vinayak@samsung.com>
>   #
> -# Santosh Yaraganavi <santosh.sy@samsung.com>
> -# Vinayak Holikatti <h.vinayak@samsung.com>
> -
>   # This program is free software; you can redistribute it and/or
>   # modify it under the terms of the GNU General Public License
>   # as published by the Free Software Foundation; either version 2
>   # of the License, or (at your option) any later version.
> -
> +# See the COPYING file in the top-level directory or visit
> +# <http://www.gnu.org/licenses/gpl-2.0.html>
> +#
>   # This program is distributed in the hope that it will be useful,
>   # but WITHOUT ANY WARRANTY; without even the implied warranty of
>   # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>   # GNU General Public License for more details.
> -
> -# NO WARRANTY
> -# THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
> -# CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
> -# LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
> -# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
> -# solely responsible for determining the appropriateness of using and
> -# distributing the Program and assumes all risks associated with its
> -# exercise of rights under this Agreement, including but not limited to
> -# the risks and costs of program errors, damage to or loss of data,
> -# programs or equipment, and unavailability or interruption of operations.
> -
> -# DISCLAIMER OF LIABILITY
> -# NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
> -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> -# DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
> -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> -# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
> -# USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
> -# HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
> -
> -# You should have received a copy of the GNU General Public License
> -# along with this program; if not, write to the Free Software
> -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
> -# USA.
> +#
> +# This program is provided "AS IS" and "WITH ALL FAULTS" and
> +# without warranty of any kind. You are solely responsible for
> +# determining the appropriateness of using and distributing
> +# the program and assume all risks associated with your exercise
> +# of rights with respect to the program, including but not limited
> +# to infringement of third party rights, the risks and costs of
> +# program errors, damage to or loss of data, programs or equipment,
> +# and unavailability or interruption of operations. Under no
> +# circumstances will the contributor of this Program be liable for
> +# any damages of any kind arising from your use or distribution of
> +# this program.
>   
>   config SCSI_UFSHCD
>   	tristate "Universal Flash Storage host controller driver"
> diff --git a/drivers/scsi/ufs/ufs.h b/drivers/scsi/ufs/ufs.h
> index b207529..4b3d611 100644
> --- a/drivers/scsi/ufs/ufs.h
> +++ b/drivers/scsi/ufs/ufs.h
> @@ -4,43 +4,33 @@
>    * This code is based on drivers/scsi/ufs/ufs.h
>    * Copyright (C) 2011-2012 Samsung India Software Operations
>    *
> - * Santosh Yaraganavi <santosh.sy@samsung.com>
> - * Vinayak Holikatti <h.vinayak@samsung.com>
> + * Authors:
> + *	Santosh Yaraganavi <santosh.sy@samsung.com>
> + *	Vinayak Holikatti <h.vinayak@samsung.com>
>    *
>    * This program is free software; you can redistribute it and/or
>    * modify it under the terms of the GNU General Public License
>    * as published by the Free Software Foundation; either version 2
>    * of the License, or (at your option) any later version.
> + * See the COPYING file in the top-level directory or visit
> + * <http://www.gnu.org/licenses/gpl-2.0.html>
>    *
>    * This program is distributed in the hope that it will be useful,
>    * but WITHOUT ANY WARRANTY; without even the implied warranty of
>    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>    * GNU General Public License for more details.
>    *
> - * NO WARRANTY
> - * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
> - * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
> - * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
> - * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
> - * solely responsible for determining the appropriateness of using and
> - * distributing the Program and assumes all risks associated with its
> - * exercise of rights under this Agreement, including but not limited to
> - * the risks and costs of program errors, damage to or loss of data,
> - * programs or equipment, and unavailability or interruption of operations.
> -
> - * DISCLAIMER OF LIABILITY
> - * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
> - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
> - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> - * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
> - * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
> - * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
> -
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
> - * USA.
> + * This program is provided "AS IS" and "WITH ALL FAULTS" and
> + * without warranty of any kind. You are solely responsible for
> + * determining the appropriateness of using and distributing
> + * the program and assume all risks associated with your exercise
> + * of rights with respect to the program, including but not limited
> + * to infringement of third party rights, the risks and costs of
> + * program errors, damage to or loss of data, programs or equipment,
> + * and unavailability or interruption of operations. Under no
> + * circumstances will the contributor of this Program be liable for
> + * any damages of any kind arising from your use or distribution of
> + * this program.
>    */
>   
>   #ifndef _UFS_H
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index 58f4ba6..86b5b49 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -4,43 +4,33 @@
>    * This code is based on drivers/scsi/ufs/ufshcd.c
>    * Copyright (C) 2011-2012 Samsung India Software Operations
>    *
> - * Santosh Yaraganavi <santosh.sy@samsung.com>
> - * Vinayak Holikatti <h.vinayak@samsung.com>
> + * Authors:
> + *	Santosh Yaraganavi <santosh.sy@samsung.com>
> + *	Vinayak Holikatti <h.vinayak@samsung.com>
>    *
>    * This program is free software; you can redistribute it and/or
>    * modify it under the terms of the GNU General Public License
>    * as published by the Free Software Foundation; either version 2
>    * of the License, or (at your option) any later version.
> + * See the COPYING file in the top-level directory or visit
> + * <http://www.gnu.org/licenses/gpl-2.0.html>
>    *
>    * This program is distributed in the hope that it will be useful,
>    * but WITHOUT ANY WARRANTY; without even the implied warranty of
>    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>    * GNU General Public License for more details.
>    *
> - * NO WARRANTY
> - * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
> - * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
> - * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
> - * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
> - * solely responsible for determining the appropriateness of using and
> - * distributing the Program and assumes all risks associated with its
> - * exercise of rights under this Agreement, including but not limited to
> - * the risks and costs of program errors, damage to or loss of data,
> - * programs or equipment, and unavailability or interruption of operations.
> -
> - * DISCLAIMER OF LIABILITY
> - * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
> - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
> - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> - * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
> - * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
> - * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
> -
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
> - * USA.
> + * This program is provided "AS IS" and "WITH ALL FAULTS" and
> + * without warranty of any kind. You are solely responsible for
> + * determining the appropriateness of using and distributing
> + * the program and assume all risks associated with your exercise
> + * of rights with respect to the program, including but not limited
> + * to infringement of third party rights, the risks and costs of
> + * program errors, damage to or loss of data, programs or equipment,
> + * and unavailability or interruption of operations. Under no
> + * circumstances will the contributor of this Program be liable for
> + * any damages of any kind arising from your use or distribution of
> + * this program.
>    */
>   
>   #include <linux/module.h>
> @@ -129,7 +119,7 @@ struct uic_command {
>    * @utrdl_dma_addr: UTRDL DMA address
>    * @utmrdl_dma_addr: UTMRDL DMA address
>    * @host: Scsi_Host instance of the driver
> - * @pdev: PCI device handle
> + * @dev: device handle
>    * @lrb: local reference block
>    * @outstanding_tasks: Bits representing outstanding task requests
>    * @outstanding_reqs: Bits representing outstanding transfer requests
> @@ -159,7 +149,7 @@ struct ufs_hba {
>   	dma_addr_t utmrdl_dma_addr;
>   
>   	struct Scsi_Host *host;
> -	struct pci_dev *pdev;
> +	struct device *dev;
>   
>   	struct ufshcd_lrb *lrb;
>   
> @@ -335,21 +325,21 @@ static inline void ufshcd_free_hba_memory(struct ufs_hba *hba)
>   
>   	if (hba->utmrdl_base_addr) {
>   		utmrdl_size = sizeof(struct utp_task_req_desc) * hba->nutmrs;
> -		dma_free_coherent(&hba->pdev->dev, utmrdl_size,
> +		dma_free_coherent(hba->dev, utmrdl_size,
>   				  hba->utmrdl_base_addr, hba->utmrdl_dma_addr);
>   	}
>   
>   	if (hba->utrdl_base_addr) {
>   		utrdl_size =
>   		(sizeof(struct utp_transfer_req_desc) * hba->nutrs);
> -		dma_free_coherent(&hba->pdev->dev, utrdl_size,
> +		dma_free_coherent(hba->dev, utrdl_size,
>   				  hba->utrdl_base_addr, hba->utrdl_dma_addr);
>   	}
>   
>   	if (hba->ucdl_base_addr) {
>   		ucdl_size =
>   		(sizeof(struct utp_transfer_cmd_desc) * hba->nutrs);
> -		dma_free_coherent(&hba->pdev->dev, ucdl_size,
> +		dma_free_coherent(hba->dev, ucdl_size,
>   				  hba->ucdl_base_addr, hba->ucdl_dma_addr);
>   	}
>   }
> @@ -724,7 +714,7 @@ static int ufshcd_memory_alloc(struct ufs_hba *hba)
>   
>   	/* Allocate memory for UTP command descriptors */
>   	ucdl_size = (sizeof(struct utp_transfer_cmd_desc) * hba->nutrs);
> -	hba->ucdl_base_addr = dma_alloc_coherent(&hba->pdev->dev,
> +	hba->ucdl_base_addr = dma_alloc_coherent(hba->dev,
>   						 ucdl_size,
>   						 &hba->ucdl_dma_addr,
>   						 GFP_KERNEL);
> @@ -737,7 +727,7 @@ static int ufshcd_memory_alloc(struct ufs_hba *hba)
>   	 */
>   	if (!hba->ucdl_base_addr ||
>   	    WARN_ON(hba->ucdl_dma_addr & (PAGE_SIZE - 1))) {
> -		dev_err(&hba->pdev->dev,
> +		dev_err(hba->dev,
>   			"Command Descriptor Memory allocation failed\n");
>   		goto out;
>   	}
> @@ -747,13 +737,13 @@ static int ufshcd_memory_alloc(struct ufs_hba *hba)
>   	 * UFSHCI requires 1024 byte alignment of UTRD
>   	 */
>   	utrdl_size = (sizeof(struct utp_transfer_req_desc) * hba->nutrs);
> -	hba->utrdl_base_addr = dma_alloc_coherent(&hba->pdev->dev,
> +	hba->utrdl_base_addr = dma_alloc_coherent(hba->dev,
>   						  utrdl_size,
>   						  &hba->utrdl_dma_addr,
>   						  GFP_KERNEL);
>   	if (!hba->utrdl_base_addr ||
>   	    WARN_ON(hba->utrdl_dma_addr & (PAGE_SIZE - 1))) {
> -		dev_err(&hba->pdev->dev,
> +		dev_err(hba->dev,
>   			"Transfer Descriptor Memory allocation failed\n");
>   		goto out;
>   	}
> @@ -763,13 +753,13 @@ static int ufshcd_memory_alloc(struct ufs_hba *hba)
>   	 * UFSHCI requires 1024 byte alignment of UTMRD
>   	 */
>   	utmrdl_size = sizeof(struct utp_task_req_desc) * hba->nutmrs;
> -	hba->utmrdl_base_addr = dma_alloc_coherent(&hba->pdev->dev,
> +	hba->utmrdl_base_addr = dma_alloc_coherent(hba->dev,
>   						   utmrdl_size,
>   						   &hba->utmrdl_dma_addr,
>   						   GFP_KERNEL);
>   	if (!hba->utmrdl_base_addr ||
>   	    WARN_ON(hba->utmrdl_dma_addr & (PAGE_SIZE - 1))) {
> -		dev_err(&hba->pdev->dev,
> +		dev_err(hba->dev,
>   		"Task Management Descriptor Memory allocation failed\n");
>   		goto out;
>   	}
> @@ -777,7 +767,7 @@ static int ufshcd_memory_alloc(struct ufs_hba *hba)
>   	/* Allocate memory for local reference block */
>   	hba->lrb = kcalloc(hba->nutrs, sizeof(struct ufshcd_lrb), GFP_KERNEL);
>   	if (!hba->lrb) {
> -		dev_err(&hba->pdev->dev, "LRB Memory allocation failed\n");
> +		dev_err(hba->dev, "LRB Memory allocation failed\n");
>   		goto out;
>   	}
>   	return 0;
> @@ -867,7 +857,7 @@ static int ufshcd_dme_link_startup(struct ufs_hba *hba)
>   	/* check if controller is ready to accept UIC commands */
>   	if (((readl(hba->mmio_base + REG_CONTROLLER_STATUS)) &
>   	    UIC_COMMAND_READY) == 0x0) {
> -		dev_err(&hba->pdev->dev,
> +		dev_err(hba->dev,
>   			"Controller not ready"
>   			" to accept UIC commands\n");
>   		return -EIO;
> @@ -912,7 +902,7 @@ static int ufshcd_make_hba_operational(struct ufs_hba *hba)
>   	/* check if device present */
>   	reg = readl((hba->mmio_base + REG_CONTROLLER_STATUS));
>   	if (!ufshcd_is_device_present(reg)) {
> -		dev_err(&hba->pdev->dev, "cc: Device not present\n");
> +		dev_err(hba->dev, "cc: Device not present\n");
>   		err = -ENXIO;
>   		goto out;
>   	}
> @@ -924,7 +914,7 @@ static int ufshcd_make_hba_operational(struct ufs_hba *hba)
>   	if (!(ufshcd_get_lists_status(reg))) {
>   		ufshcd_enable_run_stop_reg(hba);
>   	} else {
> -		dev_err(&hba->pdev->dev,
> +		dev_err(hba->dev,
>   			"Host controller not ready to process requests");
>   		err = -EIO;
>   		goto out;
> @@ -1005,7 +995,7 @@ static int ufshcd_hba_enable(struct ufs_hba *hba)
>   		if (retry) {
>   			retry--;
>   		} else {
> -			dev_err(&hba->pdev->dev,
> +			dev_err(hba->dev,
>   				"Controller enable failed\n");
>   			return -EIO;
>   		}
> @@ -1084,7 +1074,7 @@ static int ufshcd_do_reset(struct ufs_hba *hba)
>   
>   	/* start the initialization process */
>   	if (ufshcd_initialize_hba(hba)) {
> -		dev_err(&hba->pdev->dev,
> +		dev_err(hba->dev,
>   			"Reset: Controller initialization failed\n");
>   		return FAILED;
>   	}
> @@ -1167,7 +1157,7 @@ static int ufshcd_task_req_compl(struct ufs_hba *hba, u32 index)
>   			task_result = SUCCESS;
>   	} else {
>   		task_result = FAILED;
> -		dev_err(&hba->pdev->dev,
> +		dev_err(hba->dev,
>   			"trc: Invalid ocs = %x\n", ocs_value);
>   	}
>   	spin_unlock_irqrestore(hba->host->host_lock, flags);
> @@ -1281,7 +1271,7 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
>   		/* check if the returned transfer response is valid */
>   		result = ufshcd_is_valid_req_rsp(lrbp->ucd_rsp_ptr);
>   		if (result) {
> -			dev_err(&hba->pdev->dev,
> +			dev_err(hba->dev,
>   				"Invalid response = %x\n", result);
>   			break;
>   		}
> @@ -1310,7 +1300,7 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
>   	case OCS_FATAL_ERROR:
>   	default:
>   		result |= DID_ERROR << 16;
> -		dev_err(&hba->pdev->dev,
> +		dev_err(hba->dev,
>   		"OCS error from controller = %x\n", ocs);
>   		break;
>   	} /* end of switch */
> @@ -1374,7 +1364,7 @@ static void ufshcd_uic_cc_handler (struct work_struct *work)
>   	    !(ufshcd_get_uic_cmd_result(hba))) {
>   
>   		if (ufshcd_make_hba_operational(hba))
> -			dev_err(&hba->pdev->dev,
> +			dev_err(hba->dev,
>   				"cc: hba not operational state\n");
>   		return;
>   	}
> @@ -1509,7 +1499,7 @@ ufshcd_issue_tm_cmd(struct ufs_hba *hba,
>   	free_slot = ufshcd_get_tm_free_slot(hba);
>   	if (free_slot >= hba->nutmrs) {
>   		spin_unlock_irqrestore(host->host_lock, flags);
> -		dev_err(&hba->pdev->dev, "Task management queue full\n");
> +		dev_err(hba->dev, "Task management queue full\n");
>   		err = FAILED;
>   		goto out;
>   	}
> @@ -1552,7 +1542,7 @@ ufshcd_issue_tm_cmd(struct ufs_hba *hba,
>   					 &hba->tm_condition) != 0),
>   					 60 * HZ);
>   	if (!err) {
> -		dev_err(&hba->pdev->dev,
> +		dev_err(hba->dev,
>   			"Task management command timed-out\n");
>   		err = FAILED;
>   		goto out;
> @@ -1688,23 +1678,22 @@ static struct scsi_host_template ufshcd_driver_template = {
>   };
>   
>   /**
> - * ufshcd_shutdown - main function to put the controller in reset state
> + * ufshcd_pci_shutdown - main function to put the controller in reset state
>    * @pdev: pointer to PCI device handle
>    */
> -static void ufshcd_shutdown(struct pci_dev *pdev)
> +static void ufshcd_pci_shutdown(struct pci_dev *pdev)
>   {
>   	ufshcd_hba_stop((struct ufs_hba *)pci_get_drvdata(pdev));
>   }
>   
> -#ifdef CONFIG_PM
>   /**
>    * ufshcd_suspend - suspend power management function
> - * @pdev: pointer to PCI device handle
> + * @hba: per adapter instance
>    * @state: power state
>    *
>    * Returns -ENOSYS
>    */
> -static int ufshcd_suspend(struct pci_dev *pdev, pm_message_t state)
> +int ufshcd_suspend(struct ufs_hba *hba, pm_message_t state)
>   {
>   	/*
>   	 * TODO:
> @@ -1717,14 +1706,15 @@ static int ufshcd_suspend(struct pci_dev *pdev, pm_message_t state)
>   
>   	return -ENOSYS;
>   }
> +EXPORT_SYMBOL_GPL(ufshcd_suspend);
>   
>   /**
>    * ufshcd_resume - resume power management function
> - * @pdev: pointer to PCI device handle
> + * @hba: per adapter instance
>    *
>    * Returns -ENOSYS
>    */
> -static int ufshcd_resume(struct pci_dev *pdev)
> +int ufshcd_resume(struct ufs_hba *hba)
>   {
>   	/*
>   	 * TODO:
> @@ -1737,6 +1727,43 @@ static int ufshcd_resume(struct pci_dev *pdev)
>   
>   	return -ENOSYS;
>   }
> +EXPORT_SYMBOL_GPL(ufshcd_resume);
> +
> +#ifdef CONFIG_PM
> +/**
> + * ufshcd_pci_suspend - suspend power management function
> + * @pdev: pointer to PCI device handle
> + * @state: power state
> + *
> + * Returns -ENOSYS
> + */
> +static int ufshcd_pci_suspend(struct pci_dev *pdev, pm_message_t state)
> +{
> +	/*
> +	 * TODO:
> +	 * 1. Call ufshcd_suspend
> +	 * 2. Do bus specific power management
> +	 */
> +
> +	return -ENOSYS;
> +}
> +
> +/**
> + * ufshcd_pci_resume - resume power management function
> + * @pdev: pointer to PCI device handle
> + *
> + * Returns -ENOSYS
> + */
> +static int ufshcd_pci_resume(struct pci_dev *pdev)
> +{
> +	/*
> +	 * TODO:
> +	 * 1. Call ufshcd_resume.
Full stop can be removed to be consistant with other comments in this file.
> +	 * 2. Do bus specific wake up
> +	 */
> +
> +	return -ENOSYS;
> +}
>   #endif /* CONFIG_PM */
>   
>   /**
> @@ -1748,27 +1775,38 @@ static void ufshcd_hba_free(struct ufs_hba *hba)
>   {
>   	iounmap(hba->mmio_base);
>   	ufshcd_free_hba_memory(hba);
> -	pci_release_regions(hba->pdev);
>   }
>   
>   /**
> - * ufshcd_remove - de-allocate PCI/SCSI host and host memory space
> + * ufshcd_remove - de-allocate SCSI host and host memory space
>    *		data structure memory
> - * @pdev - pointer to PCI handle
> + * @hba - per adapter instance
>    */
> -static void ufshcd_remove(struct pci_dev *pdev)
> +void ufshcd_remove(struct ufs_hba *hba)
>   {
> -	struct ufs_hba *hba = pci_get_drvdata(pdev);
> -
>   	/* disable interrupts */
>   	ufshcd_int_config(hba, UFSHCD_INT_DISABLE);
> -	free_irq(pdev->irq, hba);
>   
>   	ufshcd_hba_stop(hba);
>   	ufshcd_hba_free(hba);
>   
>   	scsi_remove_host(hba->host);
>   	scsi_host_put(hba->host);
> +}
> +EXPORT_SYMBOL_GPL(ufshcd_remove);
> +
> +/**
> + * ufshcd_pci_remove - de-allocate PCI/SCSI host and host memory space
> + *		data structure memory
> + * @pdev - pointer to PCI handle
> + */
> +static void ufshcd_pci_remove(struct pci_dev *pdev)
> +{
> +	struct ufs_hba *hba = pci_get_drvdata(pdev);
> +
> +	free_irq(pdev->irq, hba);
> +	ufshcd_remove(hba);
> +	pci_release_regions(pdev);
>   	pci_set_drvdata(pdev, NULL);
>   	pci_clear_master(pdev);
>   	pci_disable_device(pdev);
> @@ -1781,75 +1819,52 @@ static void ufshcd_remove(struct pci_dev *pdev)
>    *
>    * Returns 0 for success, non-zero for failure
>    */
> -static int ufshcd_set_dma_mask(struct ufs_hba *hba)
> +static int ufshcd_set_dma_mask(struct pci_dev *pdev)
>   {
>   	int err;
> -	u64 dma_mask;
> -
> -	/*
> -	 * If controller supports 64 bit addressing mode, then set the DMA
> -	 * mask to 64-bit, else set the DMA mask to 32-bit
> -	 */
> -	if (hba->capabilities & MASK_64_ADDRESSING_SUPPORT)
> -		dma_mask = DMA_BIT_MASK(64);
> -	else
> -		dma_mask = DMA_BIT_MASK(32);
> -
> -	err = pci_set_dma_mask(hba->pdev, dma_mask);
> -	if (err)
> -		return err;
> -
> -	err = pci_set_consistent_dma_mask(hba->pdev, dma_mask);
>   
> +	if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))
> +		&& !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))
> +		return 0;
> +	err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
> +	if (!err)
> +		err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
>   	return err;
>   }
>   
>   /**
> - * ufshcd_probe - probe routine of the driver
> - * @pdev: pointer to PCI device handle
> - * @id: PCI device id
> - *
> + * ufshcd_init - Driver initialization routine
> + * @dev: pointer to device handle
> + * @hba_handle: driver private handle
> + * @mmio_base: base register address
> + * @irq_line: Interrupt line of device
>    * Returns 0 on success, non-zero value on failure
>    */
> -static int __devinit
> -ufshcd_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> +int ufshcd_init(struct device *dev, struct ufs_hba **hba_handle,
> +		 void __iomem *mmio_base, unsigned int irq_line)
Just irq should be enough: s/irq_line/irq
>   {
>   	struct Scsi_Host *host;
>   	struct ufs_hba *hba;
>   	int err;
>   
> -	err = pci_enable_device(pdev);
> -	if (err) {
> -		dev_err(&pdev->dev, "pci_enable_device failed\n");
> +	if (!dev && !mmio_base) {
> +		dev_err(dev,
> +		"Invalid memory reference for dev or mmio_base NULL\n");
Better to have "!dev" and "!mmio_base" seperate to print out exact error.

> +		err = -ENODEV;
>   		goto out_error;
>   	}
>   
> -	pci_set_master(pdev);
> -
>   	host = scsi_host_alloc(&ufshcd_driver_template,
>   				sizeof(struct ufs_hba));
>   	if (!host) {
> -		dev_err(&pdev->dev, "scsi_host_alloc failed\n");
> +		dev_err(dev, "scsi_host_alloc failed\n");
>   		err = -ENOMEM;
> -		goto out_disable;
> +		goto out_error;
>   	}
>   	hba = shost_priv(host);
> -
> -	err = pci_request_regions(pdev, UFSHCD);
> -	if (err < 0) {
> -		dev_err(&pdev->dev, "request regions failed\n");
> -		goto out_host_put;
> -	}
> -
> -	hba->mmio_base = pci_ioremap_bar(pdev, 0);
> -	if (!hba->mmio_base) {
> -		dev_err(&pdev->dev, "memory map failed\n");
> -		err = -ENOMEM;
> -		goto out_release_regions;
> -	}
> -
>   	hba->host = host;
> -	hba->pdev = pdev;
> +	hba->dev = dev;
> +	hba->mmio_base = mmio_base;
>   
>   	/* Read capabilities registers */
>   	ufshcd_hba_capabilities(hba);
> @@ -1857,17 +1872,11 @@ ufshcd_probe(struct pci_dev *pdev, const struct pci_device_id *id)
>   	/* Get UFS version supported by the controller */
>   	hba->ufs_version = ufshcd_get_ufs_version(hba);
>   
> -	err = ufshcd_set_dma_mask(hba);
> -	if (err) {
> -		dev_err(&pdev->dev, "set dma mask failed\n");
> -		goto out_iounmap;
> -	}
> -
>   	/* Allocate memory for host memory space */
>   	err = ufshcd_memory_alloc(hba);
>   	if (err) {
> -		dev_err(&pdev->dev, "Memory allocation failed\n");
> -		goto out_iounmap;
> +		dev_err(hba->dev, "Memory allocation failed\n");
> +		goto out_disable;
>   	}
>   
>   	/* Configure LRB */
> @@ -1889,46 +1898,104 @@ ufshcd_probe(struct pci_dev *pdev, const struct pci_device_id *id)
>   	INIT_WORK(&hba->feh_workq, ufshcd_fatal_err_handler);
>   
>   	/* IRQ registration */
> -	err = request_irq(pdev->irq, ufshcd_intr, IRQF_SHARED, UFSHCD, hba);
> +	err = request_irq(irq_line, ufshcd_intr, IRQF_SHARED, UFSHCD, hba);
irq flags is set to IRQF_SHARED. Not sure why? Is there any specific 
reason? I don't see any shared interrupt handler for same irq line here?

Here irq name is "UFSHCD" but say if we more than 1 instances of the UFS 
controllers on same chipset then it would have seperate irq numbers as 
well so to differnentiate them uniquely (when we do "cat 
/proc/interrupts"), it's better to name the irq uniquely for each 
instances of UFS controllers.

>   	if (err) {
> -		dev_err(&pdev->dev, "request irq failed\n");
> +		dev_err(hba->dev, "request irq failed\n");
>   		goto out_lrb_free;
>   	}
>   
>   	/* Enable SCSI tag mapping */
>   	err = scsi_init_shared_tag_map(host, host->can_queue);
>   	if (err) {
> -		dev_err(&pdev->dev, "init shared queue failed\n");
> +		dev_err(hba->dev, "init shared queue failed\n");
>   		goto out_free_irq;
>   	}
>   
> -	pci_set_drvdata(pdev, hba);
> -
> -	err = scsi_add_host(host, &pdev->dev);
> +	err = scsi_add_host(host, hba->dev);
>   	if (err) {
> -		dev_err(&pdev->dev, "scsi_add_host failed\n");
> +		dev_err(hba->dev, "scsi_add_host failed\n");
>   		goto out_free_irq;
>   	}
>   
>   	/* Initialization routine */
>   	err = ufshcd_initialize_hba(hba);
>   	if (err) {
> -		dev_err(&pdev->dev, "Initialization failed\n");
> -		goto out_free_irq;
> +		dev_err(hba->dev, "Initialization failed\n");
> +		goto out_remove_scsi_host;
>   	}
> +	*hba_handle = hba;
>   
>   	return 0;
>   
> +out_remove_scsi_host:
> +	scsi_remove_host(hba->host);
>   out_free_irq:
> -	free_irq(pdev->irq, hba);
> +	free_irq(irq_line, hba);
>   out_lrb_free:
>   	ufshcd_free_hba_memory(hba);
> +out_disable:
> +	scsi_host_put(host);
> +out_error:
> +	return err;
> +}
> +EXPORT_SYMBOL_GPL(ufshcd_init);
> +
> +/**
> + * ufshcd_pci_probe - probe routine of the driver
> + * @pdev: pointer to PCI device handle
> + * @id: PCI device id
> + *
> + * Returns 0 on success, non-zero value on failure
> + */
> +static int __devinit
> +ufshcd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> +{
> +	struct ufs_hba *hba;
> +	void __iomem *mmio_base;
> +	int err;
> +
> +	err = pci_enable_device(pdev);
> +	if (err) {
> +		dev_err(&pdev->dev, "pci_enable_device failed\n");
> +		goto out_error;
> +	}
> +
> +	pci_set_master(pdev);
> +
> +	err = pci_request_regions(pdev, UFSHCD);
> +	if (err < 0) {
> +		dev_err(&pdev->dev, "request regions failed\n");
> +		goto out_disable;
> +	}
> +
> +	mmio_base = pci_ioremap_bar(pdev, 0);
> +	if (!mmio_base) {
> +		dev_err(&pdev->dev, "memory map failed\n");
> +		err = -ENOMEM;
> +		goto out_release_regions;
> +	}
> +
> +	err = ufshcd_set_dma_mask(pdev);
> +	if (err) {
> +		dev_err(&pdev->dev, "set dma mask failed\n");
> +		goto out_iounmap;
> +	}
> +
> +	err = ufshcd_init(&pdev->dev, &hba, mmio_base, pdev->irq);
> +	if (err) {
> +		dev_err(&pdev->dev, "%s:%d %sInitialization failed\n",
> +				__FILE__, __LINE__, __func__);
> +		goto out_iounmap;
> +	}
> +
> +	pci_set_drvdata(pdev, hba);
> +
> +	return 0;
> +
>   out_iounmap:
> -	iounmap(hba->mmio_base);
> +	iounmap(mmio_base);
>   out_release_regions:
>   	pci_release_regions(pdev);
> -out_host_put:
> -	scsi_host_put(host);
>   out_disable:
>   	pci_clear_master(pdev);
>   	pci_disable_device(pdev);
> @@ -1946,19 +2013,19 @@ MODULE_DEVICE_TABLE(pci, ufshcd_pci_tbl);
>   static struct pci_driver ufshcd_pci_driver = {
>   	.name = UFSHCD,
>   	.id_table = ufshcd_pci_tbl,
> -	.probe = ufshcd_probe,
> -	.remove = __devexit_p(ufshcd_remove),
> -	.shutdown = ufshcd_shutdown,
> +	.probe = ufshcd_pci_probe,
> +	.remove = __devexit_p(ufshcd_pci_remove),
> +	.shutdown = ufshcd_pci_shutdown,
>   #ifdef CONFIG_PM
> -	.suspend = ufshcd_suspend,
> -	.resume = ufshcd_resume,
> +	.suspend = ufshcd_pci_suspend,
> +	.resume = ufshcd_pci_resume,
>   #endif
>   };
>   
>   module_pci_driver(ufshcd_pci_driver);
>   
> -MODULE_AUTHOR("Santosh Yaragnavi <santosh.sy@samsung.com>, "
> -	      "Vinayak Holikatti <h.vinayak@samsung.com>");
> +MODULE_AUTHOR("Santosh Yaragnavi <santosh.sy@samsung.com>");
> +MODULE_AUTHOR("Vinayak Holikatti <h.vinayak@samsung.com>");
>   MODULE_DESCRIPTION("Generic UFS host controller driver");
>   MODULE_LICENSE("GPL");
>   MODULE_VERSION(UFSHCD_DRIVER_VERSION);
> diff --git a/drivers/scsi/ufs/ufshci.h b/drivers/scsi/ufs/ufshci.h
> index 6e3510f..1cc1e00 100644
> --- a/drivers/scsi/ufs/ufshci.h
> +++ b/drivers/scsi/ufs/ufshci.h
> @@ -4,43 +4,33 @@
>    * This code is based on drivers/scsi/ufs/ufshci.h
>    * Copyright (C) 2011-2012 Samsung India Software Operations
>    *
> - * Santosh Yaraganavi <santosh.sy@samsung.com>
> - * Vinayak Holikatti <h.vinayak@samsung.com>
> + * Authors:
> + *	Santosh Yaraganavi <santosh.sy@samsung.com>
> + *	Vinayak Holikatti <h.vinayak@samsung.com>
>    *
>    * This program is free software; you can redistribute it and/or
>    * modify it under the terms of the GNU General Public License
>    * as published by the Free Software Foundation; either version 2
>    * of the License, or (at your option) any later version.
> + * See the COPYING file in the top-level directory or visit
> + * <http://www.gnu.org/licenses/gpl-2.0.html>
>    *
>    * This program is distributed in the hope that it will be useful,
>    * but WITHOUT ANY WARRANTY; without even the implied warranty of
>    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>    * GNU General Public License for more details.
>    *
> - * NO WARRANTY
> - * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
> - * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
> - * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
> - * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
> - * solely responsible for determining the appropriateness of using and
> - * distributing the Program and assumes all risks associated with its
> - * exercise of rights under this Agreement, including but not limited to
> - * the risks and costs of program errors, damage to or loss of data,
> - * programs or equipment, and unavailability or interruption of operations.
> -
> - * DISCLAIMER OF LIABILITY
> - * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
> - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
> - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> - * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
> - * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
> - * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
> -
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
> - * USA.
> + * This program is provided "AS IS" and "WITH ALL FAULTS" and
> + * without warranty of any kind. You are solely responsible for
> + * determining the appropriateness of using and distributing
> + * the program and assume all risks associated with your exercise
> + * of rights with respect to the program, including but not limited
> + * to infringement of third party rights, the risks and costs of
> + * program errors, damage to or loss of data, programs or equipment,
> + * and unavailability or interruption of operations. Under no
> + * circumstances will the contributor of this Program be liable for
> + * any damages of any kind arising from your use or distribution of
> + * this program.
>    */
>   
>   #ifndef _UFSHCI_H


  reply	other threads:[~2012-12-27 14:29 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1356552955-18027-1-git-send-email-y>
2012-12-26 20:15 ` [PATCH V5 1/4] [SCSI] drivers/scsi/ufs: Seggregate PCI Specific Code vinholikatti
2012-12-27 14:29   ` Subhash Jadavani [this message]
2013-01-04  7:00     ` vinayak holikatti
2013-01-06 17:32       ` Subhash Jadavani
2012-12-26 20:15 ` [PATCH V5 2/4] [SCSI] drivers/scsi/ufs: Separate PCI code into glue driver vinholikatti
2012-12-27 15:05   ` Subhash Jadavani
2012-12-26 20:15 ` [PATCH V5 3/4] [SCSI] ufs: Add Platform glue driver for ufshcd vinholikatti
2012-12-27 14:58   ` Subhash Jadavani
2013-01-04  7:37     ` vinayak holikatti
2013-01-06 17:36       ` Subhash Jadavani
2013-01-07  7:41         ` Sujit Reddy Thumma
2013-01-09 12:11           ` vinayak holikatti
2013-01-11 10:41             ` Sujit Reddy Thumma
2013-01-11 12:30               ` Subhash Jadavani
2013-01-16 15:54                 ` vinayak holikatti
2012-12-26 20:15 ` [PATCH V5 4/4] [SCSI] ufs: Correct the expected data transfer size vinholikatti

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=50DC5B5A.9060403@codeaurora.org \
    --to=subhashj@codeaurora.org \
    --cc=james.bottomley@hansenpartnership.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=santoshsy@gmail.com \
    --cc=vinholikatti@gmail.com \
    /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).