From: Jeff Garzik <jgarzik@pobox.com>
To: Peer.Chen@uli.com.tw
Cc: linux-kernel@vger.kernel.org, linux-ide@vger.kernel.org,
andrebalsa@mailingaddress.org, Clear.Zhang@uli.com.tw,
Emily.Jiang@uli.com.tw, Eric.Lo@uli.com.tw
Subject: Re: [patch] scsi/ahci: Add support for ULi M5287
Date: Sat, 05 Feb 2005 23:49:41 -0500 [thread overview]
Message-ID: <4205A1E5.9090808@pobox.com> (raw)
In-Reply-To: <OFFB59EB4E.1CCBBD25-ON48256F70.003999B0@uli.com.tw>
Peer.Chen@uli.com.tw wrote:
> Hi,Jeff
>
> We add the support for ULi's AHCI controller M5287 in drivers/scsi/ahci.c,
> This patch is applied to kernel 2.6.10-rc3. Please apply to new kernels.
Ideally I would like to eliminate vendor-specific code, where possible.
Does the AHCI driver work at all, with simply the addition of the PCI ID?
Detailed comments below.
> --- linux-2.6.10-rc3/drivers/scsi/ahci.c.orig 2004-12-11
> 03:14:17.170955840 +0800
> +++ linux-2.6.10-rc3/drivers/scsi/ahci.c 2004-12-11 03:31:40.979272856
> +0800
> @@ -241,6 +241,8 @@ static struct pci_device_id ahci_pci_tbl
> board_ahci },
> { PCI_VENDOR_ID_INTEL, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> board_ahci },
> + { PCI_VENDOR_ID_AL, 0x5287, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + board_ahci },
> { } /* terminate list */
> };
OK
> @@ -555,7 +557,6 @@ static void ahci_intr_error(struct ata_p
> writel(0x300, port_mmio + PORT_SCR_CTL);
> readl(port_mmio + PORT_SCR_CTL); /* flush */
> }
> -
> /* re-start DMA */
> tmp = readl(port_mmio + PORT_CMD);
> tmp |= PORT_CMD_START | PORT_CMD_FIS_RX;
> @@ -711,12 +712,29 @@ static int ahci_host_init(struct ata_pro
> unsigned int i, j, using_dac;
> int rc;
> void __iomem *port_mmio;
> + u8 rev_id; //peer add for m5287 rev 02h
>
> + pci_read_config_byte(pdev, PCI_REVISION_ID, &rev_id);
> cap_save = readl(mmio + HOST_CAP);
> cap_save &= ( (1<<28) | (1<<17) );
> cap_save |= (1 << 27);
>
> /* global controller reset */
> +//peer add for m5287 rev 02h
> + if(pdev->vendor==PCI_VENDOR_ID_AL && pdev->device==0x5287 && rev_id
> ==0x02)
> + {
> + tmp = readl(mmio + HOST_CTL);
> + writel(tmp & ~HOST_RESET, mmio + HOST_CTL);
> + readl(mmio + HOST_CTL); /* flush */
> + writel(tmp | HOST_RESET, mmio + HOST_CTL);
> + readl(mmio + HOST_CTL); /* flush */
> + writel(tmp & ~HOST_RESET, mmio + HOST_CTL);
> + readl(mmio + HOST_CTL); /* flush */
> +
> + }
> +//peer add end
> + else
> + {
> tmp = readl(mmio + HOST_CTL);
> if ((tmp & HOST_RESET) == 0) {
> writel(tmp | HOST_RESET, mmio + HOST_CTL);
> @@ -735,6 +753,7 @@ static int ahci_host_init(struct ata_pro
> return -EIO;
> }
>
> + }
> writel(HOST_AHCI_EN, mmio + HOST_CTL);
> (void) readl(mmio + HOST_CTL); /* flush */
> writel(cap_save, mmio + HOST_CAP);
My conclusion from this change is that you are simply impatient with the
1-second delay for host reset ;-)
That is a fair criticism. I confess that the reason for the 1-second
delay is pure laziness. However, my suggestion would be:
1) eliminate the ULi-specific code
2) rewrite the host reset code so that it
a) performs the host reset as you (ULi) have written
b) polls host reset register for completion, as described
in AHCI specification
This will perform a very rapid reset, and eliminate the annoying delay.
> @@ -796,6 +815,18 @@ static int ahci_host_init(struct ata_pro
> /* make sure port is not active */
> tmp = readl(port_mmio + PORT_CMD);
> VPRINTK("PORT_CMD 0x%x\n", tmp);
> +//peer add for m5287 rev 02h
> + if(pdev->vendor==PCI_VENDOR_ID_AL && pdev->device==0x5287 &&
> rev_id==0x02)
> + {
> + //set start bit then issue comreset when initialize
> + writel((tmp|PORT_CMD_START), port_mmio + PORT_CMD);
> + writel(0x01, port_mmio + PORT_SCR_CTL);
> + readl(port_mmio + PORT_SCR_CTL); /* flush */
> + msleep(1);
> + writel(0x0, port_mmio + PORT_SCR_CTL);
> + readl(port_mmio + PORT_SCR_CTL); /* flush */
> + }
> +//peer add end
3) should we do this for all AHCI controllers?
4) performing host reset should perform COMRESET, until staggered spinup
is select. So the COMRESET portion of your code appears incorrect
W.R.T. the AHCI specification.
Please comment.
Thanks and regards,
Jeff
next prev parent reply other threads:[~2005-02-06 4:49 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-12-20 10:37 [patch] scsi/ahci: Add support for ULi M5287 Peer.Chen
2005-02-06 4:49 ` Jeff Garzik [this message]
[not found] <OF3919B280.9034BA70-ON48256FA0.002238C1@uli.com.tw>
2005-02-06 6:55 ` Jeff Garzik
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=4205A1E5.9090808@pobox.com \
--to=jgarzik@pobox.com \
--cc=Clear.Zhang@uli.com.tw \
--cc=Emily.Jiang@uli.com.tw \
--cc=Eric.Lo@uli.com.tw \
--cc=Peer.Chen@uli.com.tw \
--cc=andrebalsa@mailingaddress.org \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/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).