linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sergei Shtylyov <sshtylyov@ru.mvista.com>
To: Shane McDonald <mcdonald.shane@gmail.com>
Cc: bzolnier@gmail.com, linux-ide@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Resurrect IT8172 IDE controller driver
Date: Mon, 24 Nov 2008 13:33:42 +0300	[thread overview]
Message-ID: <492A8306.9000400@ru.mvista.com> (raw)
In-Reply-To: <E1L4UpB-0007ro-1g@localhost>

Hello.

Shane McDonald wrote:

> diff -uprN a/drivers/ide/it8172.c b/drivers/ide/it8172.c
> --- a/drivers/ide/it8172.c	1969-12-31 18:00:00.000000000 -0600
> +++ b/drivers/ide/it8172.c	2008-11-23 01:06:01.000000000 -0600
> @@ -0,0 +1,205 @@
> +/*
> + *
> + * BRIEF MODULE DESCRIPTION
> + *      IT8172 IDE controller support
> + *
> + * Copyright 2000 MontaVista Software Inc.
> + * Author: MontaVista Software, Inc.
> + *              stevel@mvista.com or source@mvista.com
>   

   You can remove the former address, Steve Longerbeam is no longer with 
MV (quit long ago). And I think you may add your own copyright now.

> +/*
> + * Prototypes
> + */
>   

   I see no prototypes here...

> +
> +static void it8172_set_pio_mode(ide_drive_t *drive, const u8 pio)
> +{
> +	ide_hwif_t *hwif	= HWIF(drive);
> +	struct pci_dev *dev	= to_pci_dev(hwif->dev);
> +	int is_slave		= (&hwif->drives[1] == drive);
>   

    Use simpler "drive->dn & 1" (and drop the useless parens please) -- 
& can be dropped though as the controller has only a single channel...

> +	spin_lock_irqsave(&ide_lock, flags);
>   

   Don't use ide_lock here please. Moreover, since the controller has 
only one channel, you don't need any spinlock here.

> +	pci_read_config_word(dev, 0x40, &drive_enables);
> +	pci_read_config_dword(dev, 0x44, &drive_timing);
> +
> +	/*
> +	 * FIX! The DIOR/DIOW pulse width and recovery times in port 0x44
>   

   It's usually FIXME. :-)

> +	 * are being left at the default values of 8 PCI clocks (242 nsec
> +	 * for a 33 MHz clock).

   It's 240, not 242 ns as 33 is actually 33.333.

>  These can be safely shortened at higher
> +	 * PIO modes. The DIOR/DIOW pulse width and recovery times only
> +	 * apply to PIO modes, not to the DMA modes.
> +	 */
>   

   Not true. They do apply to SW/MW DMA modes -- and if you look at your 
own code you'll see that.

> +
> +	/*
> +	 * Enable port 0x44. The IT8172 spec is confused; it calls
> +	 * this register the "Slave IDE Timing Register", but in fact,
> +	 * it controls timing for both master and slave drives.
> +	 */
> +	drive_enables |= 0x4000;
>   

   This is strange because this IDE controller seems to be a clone of 
the one in the Intel PIIX chip. However, the spec. I have tellm it's not 
an exact clone.
I suggest that you take a close look at drivers/ide/piix.c...

> +
> +	if (is_slave) {
> +		drive_enables &= 0xc006;
> +		if (pio > 1)
> +			/* enable prefetch and IORDY sample-point */
> +			drive_enables |= 0x0060;
>   

   IORDY sampling shouldn't be enabled for PIO mode 2 always, only if 
the drive supports it.
   Prefetch should only be enabled for ATA disks, not the ATAPI devices

> +static void it8172_set_dma_mode(ide_drive_t *drive, const u8 speed)
> +{
> +	ide_hwif_t *hwif	= HWIF(drive);
> +	struct pci_dev *dev	= to_pci_dev(hwif->dev);
> +	int a_speed		= 3 << (drive->dn * 4);
> +	int u_flag		= 1 << drive->dn;
> +	int u_speed		= 0;
> +	u8 reg48, reg4a;
> +
> +	const u8 mwdma_to_pio[] = { 0, 3, 4 };
> +	u8 pio;
> +
> +	pci_read_config_byte(dev, 0x48, &reg48);
> +	pci_read_config_byte(dev, 0x4a, &reg4a);
> +
> +	if (speed >= XFER_UDMA_0) {
> +
> +		/* Setting the DMA cycle time to 2 or 3 PCI clocks
> +		 * (60 and 91 nsec at 33 MHz PCI clock) seems to cause
> +		 * BadCRC errors during DMA transfers on some drives,
>   

   Sigh, such drives should have been blacklisted...

> +		 * even though both numbers meet the minimum ATAPI-4 spec
> +		 * of 73 and 54 nsec for UDMA 1 and 2 respectively.
> +		 * So the faster times are not implemented here.
> +		 * The good news is that the slower cycle time has
> +		 * very little affect on transfer performance.
>   

   This should only affect the write performance, reads.

> +		 */
> +
> +		u_speed = 0 << (drive->dn * 4);
>   

   I think you're actually setting UltraDMA mode 2 timing regardless of 
the mode selected.

   The below code only applies to non-UltraDMA modes.

> +
> +	if (speed >= XFER_MW_DMA_0)
> +		pio = mwdma_to_pio[speed - XFER_MW_DMA_0];
> +	else
> +		pio = 2;
> +
> +	it8172_set_pio_mode(drive, pio);
>   

   Moreover, I'd suggest to reimplement it as the timing register layout 
is different from the original PIIX and additional DMA modes can be 
supported: MWDMA0 and SWDMA1.

> +static unsigned int __devinit init_chipset_it8172(struct pci_dev *dev)
> +{
> +	unsigned char progif;
> +
> +	/*
> +	 * Place both IDE interfaces into PCI "native" mode
> +	 */
> +	pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
> +	pci_write_config_byte(dev, PCI_CLASS_PROG, progif | 0x05);
> +
> +	return dev->irq;
> +}
>   

   As Alan have said, you can't do that here.

> +static const struct ide_port_info it8172_chipset __devinitdata = {
> +	.name		= DRV_NAME,
> +	.init_chipset	= init_chipset_it8172,
> +	.port_ops	= &it8172_port_ops,
> +	.enablebits	= {{0x00, 0x00, 0x00}, {0x40, 0x00, 0x01} },
>   

   Wrong, should be:

	.enablebits	= {{0x41, 0x80, 0x80}, {0x00, 0x00, 0x00}},

  If that doesn't work (firmware doesn't enable the channel), you can leave it all 0s...

> 	.host_flags	= IDE_HFLAG_SINGLE,
> +	.pio_mask	= ATA_PIO4,
> +	.swdma_mask	= ATA_SWDMA2_ONLY,
> +	.mwdma_mask	= ATA_MWDMA12_ONLY,
>   

   More modes are supportable...

> +static const struct ide_port_info it8172_chipset __devinitdata = {

    Please rename this variable to it8172_port_info.

> +};
> +
> +static int __devinit it8172_init_one(struct pci_dev *dev,
> +					const struct pci_device_id *id)
> +{
> +	if ((!(PCI_FUNC(dev->devfn) & 1) ||
> +		(!((dev->class >> 8) == PCI_CLASS_STORAGE_IDE))))
>   

     Please, don't abuse parens, it should be just:

	if (!(PCI_FUNC(dev->devfn) & 1) ||
	     (dev->class >> 8) != PCI_CLASS_STORAGE_IDE)


> +		return -ENODEV; /* IT8172 is more than an IDE controller */
>   

   And I don't get it: why the first check is needed? Is there another 
IDE controller on function 1 that you want to ignore? I doubt it.

> +MODULE_AUTHOR("SteveL@mvista.com");
>   

   I wonder why Steve didn't specify his full name... :-)

MBR, Sergei

  parent reply	other threads:[~2008-11-24 10:33 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-11-24  6:21 [PATCH] Resurrect IT8172 IDE controller driver Shane McDonald
2008-11-24  9:55 ` Alan Cox
2008-11-24 10:02   ` Sergei Shtylyov
2008-11-24 10:33 ` Sergei Shtylyov [this message]
2008-11-24 12:12   ` Sergei Shtylyov
2008-11-24 12:32     ` Alan Cox
2008-11-24 13:38       ` Sergei Shtylyov
2008-12-04  3:08         ` Shane McDonald
2008-12-04 16:10           ` Sergei Shtylyov
2008-12-04  2:39   ` Shane McDonald
2008-12-04 10:07     ` Alan Cox
2008-12-04 14:01       ` Shane McDonald
2008-12-04 14:07         ` Alan Cox
2008-12-04 19:37           ` Bartlomiej Zolnierkiewicz
2008-12-04 16:17       ` Sergei Shtylyov
2008-12-08 12:02     ` Sergei Shtylyov
2008-12-22  7:50       ` Shane McDonald

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=492A8306.9000400@ru.mvista.com \
    --to=sshtylyov@ru.mvista.com \
    --cc=bzolnier@gmail.com \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mcdonald.shane@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).