linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Rafal Prylowski <prylowski@metasoft.pl>
To: Arnd Bergmann <arnd@arndb.de>
Cc: linux-arm-kernel@lists.infradead.org, linux-ide@vger.kernel.org,
	bzolnier@gmail.com, hsweeten@visionengravers.com,
	"rmallon@gmail.com" <rmallon@gmail.com>,
	Sergei Shtylyov <sshtylyov@mvista.com>,
	joao.ramos@inov.pt
Subject: Re: [PATCH 1/3] PATA host controller driver for ep93xx
Date: Mon, 02 Apr 2012 09:52:49 +0200	[thread overview]
Message-ID: <4F795AD1.4070101@metasoft.pl> (raw)
In-Reply-To: <201203302018.43681.arnd@arndb.de>

On 2012-03-30 22:18, Arnd Bergmann wrote:
>> +static u16 ep93xx_pata_read(struct ep93xx_pata_data *drv_data,
>> +			    void *addr_io,
>> +			    const struct ata_timing *t)
>> +{
>> +	unsigned long addr = (unsigned long) addr_io & 0x1f;
>> +	void __iomem *base = drv_data->ide_base;
>> +	u16 ret;
>> +
>> +	writel(IDECtrl_DIOWn | IDECtrl_DIORn | addr, base + IDECtrl);
>> +	ndelay(t->setup);
>> +	writel(IDECtrl_DIOWn | addr, base + IDECtrl);
> 
> The pointer arithmetic that you do here on addr_io looks really evil.
> Basically your registers are indirect and cannot be accessed through
> pointer dereference. Maybe you should not be trying to do that then
> and not use the ata_port->ioaddr structure.

Yes, I already prepared a version of the driver in which IDE register
addresses are coded as enums instead of using ata_port->ioaddr structure. 
I will post updated version, when I get feedback from Ryan if enums
or defines are preferred.

>> +	ndelay(t->act8b);
> 
> I'm not too familar with ata drivers, but I don't think you're supposed
> to have delays in the code for the timings, rather than programming
> the timings into the controller registers. Are you sure this is the
> right thing here?

EP93xx IDE controller is quite unusual - in PIO mode it's a GPIO like pin
interface.

>> +	if (drv_data->iordy) {
>> +		/* min. 1s timeout (at cpu cycle = 5ns) */
>> +		unsigned int timeout = 200000;
>> +		while (!ep93xx_pata_check_iordy(base) && --timeout)
>> +			cpu_relax();
>> +	}
> 
> This is not a reliable way to implement a timeout. Instead, you should
> use time_before() to check if hte timeout has expired.

Fixed.

>> +static void ep93xx_pata_setup_port(struct ata_ioports *ioaddr)
>> +{
>> +	/*
>> +	 * the device IDE register to be accessed is selected through
>> +	 * IDECTRL register's specific bitfields 'DA', 'CS1n' and 'CS0n':
>> +	 *   b4   b3   b2    b1     b0
>> +	 *   A2   A1   A0   CS1n   CS0n
>> +	 * the values filled in this structure allows the value to be directly
>> +	 * ORed to the IDECTRL register, hence giving directly the A[2:0] and
>> +	 * CS1n/CS0n values for each IDE register.
>> +	 * The values correspond to the transformation:
>> +	 *   ((real IDE address) << 2) | CS1n value << 1 | CS0n value
>> +	 */
>> +	ioaddr->cmd_addr	= (void __iomem *) 0 + 2; /* CS1 */
>> +
>> +	ioaddr->data_addr	= (void __iomem *) (ATA_REG_DATA << 2) + 2;
>> +	ioaddr->error_addr	= (void __iomem *) (ATA_REG_ERR << 2) + 2;
>> +	ioaddr->feature_addr	= (void __iomem *) (ATA_REG_FEATURE << 2) + 2;
>> +	ioaddr->nsect_addr	= (void __iomem *) (ATA_REG_NSECT << 2) + 2;
>> +	ioaddr->lbal_addr	= (void __iomem *) (ATA_REG_LBAL << 2) + 2;
>> +	ioaddr->lbam_addr	= (void __iomem *) (ATA_REG_LBAM << 2) + 2;
>> +	ioaddr->lbah_addr	= (void __iomem *) (ATA_REG_LBAH << 2) + 2;
>> +	ioaddr->device_addr	= (void __iomem *) (ATA_REG_DEVICE << 2) + 2;
>> +	ioaddr->status_addr	= (void __iomem *) (ATA_REG_STATUS << 2) + 2;
>> +	ioaddr->command_addr	= (void __iomem *) (ATA_REG_CMD << 2) + 2;
>> +
>> +	ioaddr->altstatus_addr	= (void __iomem *) (0x06 << 2) + 1; /* CS0 */
>> +	ioaddr->ctl_addr	= (void __iomem *) (0x06 << 2) + 1; /* CS0 */
>> +}
> 
> As mentioned above, this seems to make no sense.

Removed.

>> ===================================================================
>> --- linux-2.6.orig/drivers/ata/Kconfig
>> +++ linux-2.6/drivers/ata/Kconfig
>> @@ -416,6 +416,15 @@ config PATA_EFAR
>>  
>>  	  If unsure, say N.
>>  
>> +config PATA_EP93XX
>> +	tristate "Cirrus Logic EP93xx PATA support"
>> +	depends on ARCH_EP93XX
>> +	help
>> +	  This option enables support for the PATA controller in
>> +	  the Cirrus Logic EP9312 and EP9315 ARM CPU.
>> +
>> +	  If unsure, say N.
>> +
>>  config PATA_HPT366
>>  	tristate "HPT 366/368 PATA support"
>>  	depends on PCI
> 
> And I think this should be consequently be sorted below nonstandard ports, instead of the SFF list.
> 
> 	Arnd

I selected "PATA SFF controllers with BMDMA" list because the driver
inherits .ata_bmdma_port_ops (this is in libata-sff.c, which is compiled
only if ATA_SFF is set).

Thanks for comments.
RP

  reply	other threads:[~2012-04-02  7:52 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-29  8:10 [PATCH 0/3] Add PATA host controller support for Cirrus Logic EP93xx CPU Rafal Prylowski
2012-03-29  8:17 ` [PATCH 1/3] PATA host controller driver for ep93xx Rafal Prylowski
2012-03-29 17:25   ` H Hartley Sweeten
2012-03-30  8:13     ` Rafal Prylowski
2012-03-29 22:21   ` Ryan Mallon
2012-03-30 10:13     ` Rafal Prylowski
2012-03-29 22:24   ` Ryan Mallon
2012-03-30  8:19     ` Rafal Prylowski
2012-03-30 20:18   ` Arnd Bergmann
2012-04-02  7:52     ` Rafal Prylowski [this message]
2012-04-02  8:08       ` Arnd Bergmann
2012-04-02  9:28         ` Rafal Prylowski
2012-04-02 10:24           ` Arnd Bergmann
2012-04-03  1:50       ` Ryan Mallon
2012-04-03  7:41         ` Arnd Bergmann
2012-03-29  8:19 ` [PATCH 2/3] ep93xx: IDE driver platform support code Rafal Prylowski
2012-03-29 16:26   ` H Hartley Sweeten
2012-03-30  8:29     ` Rafal Prylowski
2012-03-29  8:20 ` [PATCH 3/3] ep93xx: Add IDE support to edb93xx boards Rafal Prylowski
2012-03-29 16:32   ` H Hartley Sweeten
2012-03-30  8:32     ` Rafal Prylowski

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=4F795AD1.4070101@metasoft.pl \
    --to=prylowski@metasoft.pl \
    --cc=arnd@arndb.de \
    --cc=bzolnier@gmail.com \
    --cc=hsweeten@visionengravers.com \
    --cc=joao.ramos@inov.pt \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-ide@vger.kernel.org \
    --cc=rmallon@gmail.com \
    --cc=sshtylyov@mvista.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).