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 2/4] [SCSI] drivers/scsi/ufs: Separate PCI code into glue driver
Date: Thu, 27 Dec 2012 20:35:52 +0530	[thread overview]
Message-ID: <50DC63D0.4060203@codeaurora.org> (raw)
In-Reply-To: <50db5b0e.644e420a.0ead.ffffbba9@mx.google.com>

On 12/27/2012 1:45 AM, vinholikatti@gmail.com wrote:
> From: Vinayak Holikatti <vinholikatti@gmail.com>
>
> This patch separates PCI code from ufshcd.c and makes it as a
> core driver module and adds a new file ufshcd-pci.c as PCI glue
> driver.
>
> 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      |   26 +++-
>   drivers/scsi/ufs/Makefile     |    1 +
>   drivers/scsi/ufs/ufshcd-pci.c |  211 +++++++++++++++++++++++++++
>   drivers/scsi/ufs/ufshcd.c     |  323 +----------------------------------------
>   drivers/scsi/ufs/ufshcd.h     |  200 +++++++++++++++++++++++++
>   5 files changed, 437 insertions(+), 324 deletions(-)
>   create mode 100644 drivers/scsi/ufs/ufshcd-pci.c
>   create mode 100644 drivers/scsi/ufs/ufshcd.h
>
> diff --git a/drivers/scsi/ufs/Kconfig b/drivers/scsi/ufs/Kconfig
> index 9c84569..d77ae97 100644
> --- a/drivers/scsi/ufs/Kconfig
> +++ b/drivers/scsi/ufs/Kconfig
> @@ -33,7 +33,27 @@
>   # this program.
>   
>   config SCSI_UFSHCD
> -	tristate "Universal Flash Storage host controller driver"
> -	depends on PCI && SCSI
> +	tristate "Universal Flash Storage Controller Driver Core"
> +	depends on SCSI
>   	---help---
> -	This is a generic driver which supports PCIe UFS Host controllers.
> +	This selects the support for UFS devices in Linux, say Y and make
> +	  sure that you know the name of your UFS host adapter (the card
> +	  inside your computer that "speaks" the UFS protocol, also
> +	  called UFS Host Controller), because you will be asked for it.
> +	  The module will be called ufshcd.
> +
> +	  To compile this driver as a module, choose M here and read
> +	  <file:Documentation/scsi/ufs.txt>.
> +	  However, do not compile this as a module if your root file system
> +	  (the one containing the directory /) is located on a UFS device.
> +
> +config SCSI_UFSHCD_PCI
> +	tristate "PCI bus based UFS Controller support"
> +	depends on SCSI_UFSHCD && PCI
> +	---help---
> +	This selects the PCI UFS Host Controller Interface.
> +	  Most controllers found today are PCI devices.
It would be better to remove this line "Most controllers found today are 
PCI devices" from here.
> +
> +	  If you have a controller with this interface, say Y or M here.
> +
> +	  If unsure, say N.
> diff --git a/drivers/scsi/ufs/Makefile b/drivers/scsi/ufs/Makefile
> index adf7895..9eda0df 100644
> --- a/drivers/scsi/ufs/Makefile
> +++ b/drivers/scsi/ufs/Makefile
> @@ -1,2 +1,3 @@
>   # UFSHCD makefile
>   obj-$(CONFIG_SCSI_UFSHCD) += ufshcd.o
> +obj-$(CONFIG_SCSI_UFSHCD_PCI) += ufshcd-pci.o
> diff --git a/drivers/scsi/ufs/ufshcd-pci.c b/drivers/scsi/ufs/ufshcd-pci.c
> new file mode 100644
> index 0000000..ba86b5e
> --- /dev/null
> +++ b/drivers/scsi/ufs/ufshcd-pci.c
> @@ -0,0 +1,211 @@
> +/*
> + * Universal Flash Storage Host controller driver
You may want to specify PCI somewhere in above comment line.
> + *
> + * This code is based on drivers/scsi/ufs/ufshcd-pci.c
> + * Copyright (C) 2011-2012 Samsung India Software Operations
> + *
> + * 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.
> + *
> + * 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 "ufshcd.h"
> +#include <linux/pci.h>
> +
> +#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.
> +	 * 2. Do bus specific wake up
> +	 */
> +
> +	return -ENOSYS;
> +}
> +#endif /* CONFIG_PM */
> +
> +/**
> + * ufshcd_pci_shutdown - main function to put the controller in reset state
> + * @pdev: pointer to PCI device handle
> + */
> +static void ufshcd_pci_shutdown(struct pci_dev *pdev)
> +{
> +	ufshcd_hba_stop((struct ufs_hba *)pci_get_drvdata(pdev));
> +}
> +
> +/**
> + * 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);
> +}
> +
> +/**
> + * ufshcd_set_dma_mask - Set dma mask based on the controller
> + *			 addressing capability
> + * @pdev: PCI device structure
> + *
> + * Returns 0 for success, non-zero for failure
> + */
> +static int ufshcd_set_dma_mask(struct pci_dev *pdev)
> +{
> +	int err;
> +
> +	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_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(mmio_base);
> +out_release_regions:
> +	pci_release_regions(pdev);
> +out_disable:
> +	pci_clear_master(pdev);
> +	pci_disable_device(pdev);
> +out_error:
> +	return err;
> +}
> +
> +static DEFINE_PCI_DEVICE_TABLE(ufshcd_pci_tbl) = {
> +	{ PCI_VENDOR_ID_SAMSUNG, 0xC00C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
> +	{ }	/* terminate list */
> +};
> +
> +MODULE_DEVICE_TABLE(pci, ufshcd_pci_tbl);
> +
> +static struct pci_driver ufshcd_pci_driver = {
> +	.name = UFSHCD,
> +	.id_table = ufshcd_pci_tbl,
> +	.probe = ufshcd_pci_probe,
> +	.remove = __devexit_p(ufshcd_pci_remove),
> +	.shutdown = ufshcd_pci_shutdown,
> +#ifdef CONFIG_PM
> +	.suspend = ufshcd_pci_suspend,
> +	.resume = ufshcd_pci_resume,
> +#endif
> +};
> +
> +module_pci_driver(ufshcd_pci_driver);
> +
> +MODULE_AUTHOR("Santosh Yaragnavi <santosh.sy@samsung.com>");
> +MODULE_AUTHOR("Vinayak Holikatti <h.vinayak@samsung.com>");
> +MODULE_DESCRIPTION("PCI based UFS host controller driver");
> +MODULE_LICENSE("GPL");
> +MODULE_VERSION(UFSHCD_DRIVER_VERSION);
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index 86b5b49..5d2d9e6 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -33,35 +33,7 @@
>    * this program.
>    */
>   
> -#include <linux/module.h>
> -#include <linux/kernel.h>
> -#include <linux/init.h>
> -#include <linux/pci.h>
> -#include <linux/interrupt.h>
> -#include <linux/io.h>
> -#include <linux/delay.h>
> -#include <linux/slab.h>
> -#include <linux/spinlock.h>
> -#include <linux/workqueue.h>
> -#include <linux/errno.h>
> -#include <linux/types.h>
> -#include <linux/wait.h>
> -#include <linux/bitops.h>
> -
> -#include <asm/irq.h>
> -#include <asm/byteorder.h>
> -#include <scsi/scsi.h>
> -#include <scsi/scsi_cmnd.h>
> -#include <scsi/scsi_host.h>
> -#include <scsi/scsi_tcq.h>
> -#include <scsi/scsi_dbg.h>
> -#include <scsi/scsi_eh.h>
> -
> -#include "ufs.h"
> -#include "ufshci.h"
> -
> -#define UFSHCD "ufshcd"
> -#define UFSHCD_DRIVER_VERSION "0.1"
> +#include "ufshcd.h"
>   
>   enum {
>   	UFSHCD_MAX_CHANNEL	= 0,
> @@ -92,121 +64,6 @@ enum {
>   };
>   
>   /**
> - * struct uic_command - UIC command structure
> - * @command: UIC command
> - * @argument1: UIC command argument 1
> - * @argument2: UIC command argument 2
> - * @argument3: UIC command argument 3
> - * @cmd_active: Indicate if UIC command is outstanding
> - * @result: UIC command result
> - */
> -struct uic_command {
> -	u32 command;
> -	u32 argument1;
> -	u32 argument2;
> -	u32 argument3;
> -	int cmd_active;
> -	int result;
> -};
> -
> -/**
> - * struct ufs_hba - per adapter private structure
> - * @mmio_base: UFSHCI base register address
> - * @ucdl_base_addr: UFS Command Descriptor base address
> - * @utrdl_base_addr: UTP Transfer Request Descriptor base address
> - * @utmrdl_base_addr: UTP Task Management Descriptor base address
> - * @ucdl_dma_addr: UFS Command Descriptor DMA address
> - * @utrdl_dma_addr: UTRDL DMA address
> - * @utmrdl_dma_addr: UTMRDL DMA address
> - * @host: Scsi_Host instance of the driver
> - * @dev: device handle
> - * @lrb: local reference block
> - * @outstanding_tasks: Bits representing outstanding task requests
> - * @outstanding_reqs: Bits representing outstanding transfer requests
> - * @capabilities: UFS Controller Capabilities
> - * @nutrs: Transfer Request Queue depth supported by controller
> - * @nutmrs: Task Management Queue depth supported by controller
> - * @active_uic_cmd: handle of active UIC command
> - * @ufshcd_tm_wait_queue: wait queue for task management
> - * @tm_condition: condition variable for task management
> - * @ufshcd_state: UFSHCD states
> - * @int_enable_mask: Interrupt Mask Bits
> - * @uic_workq: Work queue for UIC completion handling
> - * @feh_workq: Work queue for fatal controller error handling
> - * @errors: HBA errors
> - */
> -struct ufs_hba {
> -	void __iomem *mmio_base;
> -
> -	/* Virtual memory reference */
> -	struct utp_transfer_cmd_desc *ucdl_base_addr;
> -	struct utp_transfer_req_desc *utrdl_base_addr;
> -	struct utp_task_req_desc *utmrdl_base_addr;
> -
> -	/* DMA memory reference */
> -	dma_addr_t ucdl_dma_addr;
> -	dma_addr_t utrdl_dma_addr;
> -	dma_addr_t utmrdl_dma_addr;
> -
> -	struct Scsi_Host *host;
> -	struct device *dev;
> -
> -	struct ufshcd_lrb *lrb;
> -
> -	unsigned long outstanding_tasks;
> -	unsigned long outstanding_reqs;
> -
> -	u32 capabilities;
> -	int nutrs;
> -	int nutmrs;
> -	u32 ufs_version;
> -
> -	struct uic_command active_uic_cmd;
> -	wait_queue_head_t ufshcd_tm_wait_queue;
> -	unsigned long tm_condition;
> -
> -	u32 ufshcd_state;
> -	u32 int_enable_mask;
> -
> -	/* Work Queues */
> -	struct work_struct uic_workq;
> -	struct work_struct feh_workq;
> -
> -	/* HBA Errors */
> -	u32 errors;
> -};
> -
> -/**
> - * struct ufshcd_lrb - local reference block
> - * @utr_descriptor_ptr: UTRD address of the command
> - * @ucd_cmd_ptr: UCD address of the command
> - * @ucd_rsp_ptr: Response UPIU address for this command
> - * @ucd_prdt_ptr: PRDT address of the command
> - * @cmd: pointer to SCSI command
> - * @sense_buffer: pointer to sense buffer address of the SCSI command
> - * @sense_bufflen: Length of the sense buffer
> - * @scsi_status: SCSI status of the command
> - * @command_type: SCSI, UFS, Query.
> - * @task_tag: Task tag of the command
> - * @lun: LUN of the command
> - */
> -struct ufshcd_lrb {
> -	struct utp_transfer_req_desc *utr_descriptor_ptr;
> -	struct utp_upiu_cmd *ucd_cmd_ptr;
> -	struct utp_upiu_rsp *ucd_rsp_ptr;
> -	struct ufshcd_sg_entry *ucd_prdt_ptr;
> -
> -	struct scsi_cmnd *cmd;
> -	u8 *sense_buffer;
> -	unsigned int sense_bufflen;
> -	int scsi_status;
> -
> -	int command_type;
> -	int task_tag;
> -	unsigned int lun;
> -};
> -
> -/**
>    * ufshcd_get_ufs_version - Get the UFS version supported by the HBA
>    * @hba - Pointer to adapter instance
>    *
> @@ -419,15 +276,6 @@ static void ufshcd_enable_run_stop_reg(struct ufs_hba *hba)
>   }
>   
>   /**
> - * ufshcd_hba_stop - Send controller to reset state
> - * @hba: per adapter instance
> - */
> -static inline void ufshcd_hba_stop(struct ufs_hba *hba)
> -{
> -	writel(CONTROLLER_DISABLE, (hba->mmio_base + REG_CONTROLLER_ENABLE));
> -}
> -
> -/**
>    * ufshcd_hba_start - Start controller initialization sequence
>    * @hba: per adapter instance
>    */
> @@ -1678,15 +1526,6 @@ static struct scsi_host_template ufshcd_driver_template = {
>   };
>   
>   /**
> - * ufshcd_pci_shutdown - main function to put the controller in reset state
> - * @pdev: pointer to PCI device handle
> - */
> -static void ufshcd_pci_shutdown(struct pci_dev *pdev)
> -{
> -	ufshcd_hba_stop((struct ufs_hba *)pci_get_drvdata(pdev));
> -}
> -
> -/**
>    * ufshcd_suspend - suspend power management function
>    * @hba: per adapter instance
>    * @state: power state
> @@ -1729,43 +1568,6 @@ int ufshcd_resume(struct ufs_hba *hba)
>   }
>   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.
> -	 * 2. Do bus specific wake up
> -	 */
> -
> -	return -ENOSYS;
> -}
> -#endif /* CONFIG_PM */
> -
>   /**
>    * ufshcd_hba_free - free allocated memory for
>    *			host memory space data structures
> @@ -1796,43 +1598,6 @@ void ufshcd_remove(struct ufs_hba *hba)
>   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);
> -}
> -
> -/**
> - * ufshcd_set_dma_mask - Set dma mask based on the controller
> - *			 addressing capability
> - * @pdev: PCI device structure
> - *
> - * Returns 0 for success, non-zero for failure
> - */
> -static int ufshcd_set_dma_mask(struct pci_dev *pdev)
> -{
> -	int err;
> -
> -	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_init - Driver initialization routine
>    * @dev: pointer to device handle
>    * @hba_handle: driver private handle
> @@ -1940,92 +1705,8 @@ out_error:
>   }
>   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(mmio_base);
> -out_release_regions:
> -	pci_release_regions(pdev);
> -out_disable:
> -	pci_clear_master(pdev);
> -	pci_disable_device(pdev);
> -out_error:
> -	return err;
> -}
> -
> -static DEFINE_PCI_DEVICE_TABLE(ufshcd_pci_tbl) = {
> -	{ PCI_VENDOR_ID_SAMSUNG, 0xC00C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
> -	{ }	/* terminate list */
> -};
> -
> -MODULE_DEVICE_TABLE(pci, ufshcd_pci_tbl);
> -
> -static struct pci_driver ufshcd_pci_driver = {
> -	.name = UFSHCD,
> -	.id_table = ufshcd_pci_tbl,
> -	.probe = ufshcd_pci_probe,
> -	.remove = __devexit_p(ufshcd_pci_remove),
> -	.shutdown = ufshcd_pci_shutdown,
> -#ifdef CONFIG_PM
> -	.suspend = ufshcd_pci_suspend,
> -	.resume = ufshcd_pci_resume,
> -#endif
> -};
> -
> -module_pci_driver(ufshcd_pci_driver);
> -
>   MODULE_AUTHOR("Santosh Yaragnavi <santosh.sy@samsung.com>");
>   MODULE_AUTHOR("Vinayak Holikatti <h.vinayak@samsung.com>");
> -MODULE_DESCRIPTION("Generic UFS host controller driver");
> +MODULE_DESCRIPTION("Generic Core UFS host controller driver");
>   MODULE_LICENSE("GPL");
>   MODULE_VERSION(UFSHCD_DRIVER_VERSION);
> diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
> new file mode 100644
> index 0000000..1829e93
> --- /dev/null
> +++ b/drivers/scsi/ufs/ufshcd.h
> @@ -0,0 +1,200 @@
> +/*
> + * Universal Flash Storage Host controller driver
Shouldn't it be Universal Flash Storage Controller Driver Core ??
> + *
> + * This code is based on drivers/scsi/ufs/ufshcd.h
> + * Copyright (C) 2011-2012 Samsung India Software Operations
> + *
> + * 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.
> + *
> + * 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 _UFSHCD_H
> +#define _UFSHCD_H
> +
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/init.h>
> +#include <linux/interrupt.h>
> +#include <linux/io.h>
> +#include <linux/delay.h>
> +#include <linux/slab.h>
> +#include <linux/spinlock.h>
> +#include <linux/workqueue.h>
> +#include <linux/errno.h>
> +#include <linux/types.h>
> +#include <linux/wait.h>
> +#include <linux/bitops.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/clk.h>
> +
> +#include <asm/irq.h>
> +#include <asm/byteorder.h>
> +#include <scsi/scsi.h>
> +#include <scsi/scsi_cmnd.h>
> +#include <scsi/scsi_host.h>
> +#include <scsi/scsi_tcq.h>
> +#include <scsi/scsi_dbg.h>
> +#include <scsi/scsi_eh.h>
> +
> +#include "ufs.h"
> +#include "ufshci.h"
> +
> +#define UFSHCD "ufshcd"
> +#define UFSHCD_DRIVER_VERSION "0.2"
> +
> +/**
> + * struct uic_command - UIC command structure
> + * @command: UIC command
> + * @argument1: UIC command argument 1
> + * @argument2: UIC command argument 2
> + * @argument3: UIC command argument 3
> + * @cmd_active: Indicate if UIC command is outstanding
> + * @result: UIC command result
> + */
> +struct uic_command {
> +	u32 command;
> +	u32 argument1;
> +	u32 argument2;
> +	u32 argument3;
> +	int cmd_active;
> +	int result;
> +};
> +
> +/**
> + * struct ufshcd_lrb - local reference block
> + * @utr_descriptor_ptr: UTRD address of the command
> + * @ucd_cmd_ptr: UCD address of the command
> + * @ucd_rsp_ptr: Response UPIU address for this command
> + * @ucd_prdt_ptr: PRDT address of the command
> + * @cmd: pointer to SCSI command
> + * @sense_buffer: pointer to sense buffer address of the SCSI command
> + * @sense_bufflen: Length of the sense buffer
> + * @scsi_status: SCSI status of the command
> + * @command_type: SCSI, UFS, Query.
> + * @task_tag: Task tag of the command
> + * @lun: LUN of the command
> + */
> +struct ufshcd_lrb {
> +	struct utp_transfer_req_desc *utr_descriptor_ptr;
> +	struct utp_upiu_cmd *ucd_cmd_ptr;
> +	struct utp_upiu_rsp *ucd_rsp_ptr;
> +	struct ufshcd_sg_entry *ucd_prdt_ptr;
> +
> +	struct scsi_cmnd *cmd;
> +	u8 *sense_buffer;
> +	unsigned int sense_bufflen;
> +	int scsi_status;
> +
> +	int command_type;
> +	int task_tag;
> +	unsigned int lun;
> +};
> +
> +
> +/**
> + * struct ufs_hba - per adapter private structure
> + * @mmio_base: UFSHCI base register address
> + * @ucdl_base_addr: UFS Command Descriptor base address
> + * @utrdl_base_addr: UTP Transfer Request Descriptor base address
> + * @utmrdl_base_addr: UTP Task Management Descriptor base address
> + * @ucdl_dma_addr: UFS Command Descriptor DMA address
> + * @utrdl_dma_addr: UTRDL DMA address
> + * @utmrdl_dma_addr: UTMRDL DMA address
> + * @host: Scsi_Host instance of the driver
> + * @dev: device handle
> + * @lrb: local reference block
> + * @outstanding_tasks: Bits representing outstanding task requests
> + * @outstanding_reqs: Bits representing outstanding transfer requests
> + * @capabilities: UFS Controller Capabilities
> + * @nutrs: Transfer Request Queue depth supported by controller
> + * @nutmrs: Task Management Queue depth supported by controller
> + * @active_uic_cmd: handle of active UIC command
> + * @ufshcd_tm_wait_queue: wait queue for task management
> + * @tm_condition: condition variable for task management
> + * @ufshcd_state: UFSHCD states
> + * @int_enable_mask: Interrupt Mask Bits
> + * @uic_workq: Work queue for UIC completion handling
> + * @feh_workq: Work queue for fatal controller error handling
> + * @errors: HBA errors
> + */
> +struct ufs_hba {
> +	void __iomem *mmio_base;
> +
> +	/* Virtual memory reference */
> +	struct utp_transfer_cmd_desc *ucdl_base_addr;
> +	struct utp_transfer_req_desc *utrdl_base_addr;
> +	struct utp_task_req_desc *utmrdl_base_addr;
> +
> +	/* DMA memory reference */
> +	dma_addr_t ucdl_dma_addr;
> +	dma_addr_t utrdl_dma_addr;
> +	dma_addr_t utmrdl_dma_addr;
> +
> +	struct Scsi_Host *host;
> +	struct device *dev;
> +
> +	struct ufshcd_lrb *lrb;
> +
> +	unsigned long outstanding_tasks;
> +	unsigned long outstanding_reqs;
> +
> +	u32 capabilities;
> +	int nutrs;
> +	int nutmrs;
> +	unsigned int irq;
> +	u32 ufs_version;
> +
> +	struct uic_command active_uic_cmd;
> +	wait_queue_head_t ufshcd_tm_wait_queue;
> +	unsigned long tm_condition;
> +
> +	u32 ufshcd_state;
> +	u32 int_enable_mask;
> +
> +	/* Work Queues */
> +	struct work_struct uic_workq;
> +	struct work_struct feh_workq;
> +
> +	/* HBA Errors */
> +	u32 errors;
> +};
> +
> +int ufshcd_init(struct device *, struct ufs_hba ** , void __iomem * ,
> +			unsigned int);
> +void ufshcd_remove(struct ufs_hba *);
> +
> +/**
> + * ufshcd_hba_stop - Send controller to reset state
> + * @hba: per adapter instance
> + */
> +static inline void ufshcd_hba_stop(struct ufs_hba *hba)
> +{
> +	writel(CONTROLLER_DISABLE, (hba->mmio_base + REG_CONTROLLER_ENABLE));
> +}
> +
> +#endif /* End of Header */


  reply	other threads:[~2012-12-27 15:05 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
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 [this message]
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=50DC63D0.4060203@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).