linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mark Lord <liml@rtr.ca>
To: Jeff Garzik <jgarzik@pobox.com>
Cc: IDE/ATA development list <linux-ide@vger.kernel.org>
Subject: Re: [PATCH 05/14] sata_mv Fix EDMA configuration
Date: Sat, 26 Jan 2008 10:12:39 -0500	[thread overview]
Message-ID: <479B4DE7.8010302@rtr.ca> (raw)
In-Reply-To: <479AB445.6060505@pobox.com>

Jeff Garzik wrote:
> Mark Lord wrote:
>> sata_mv Fix EDMA configuration.
>>
>> Simplify and fix EDMA configuration setup to match Marvell 
>> specificiations.
>> The chip documentation gives a specific (re)init sequence, which we 
>> now follow.
>>
>> Signed-off-by: Mark Lord <mlord@pobox.com>
>>
>> --- old/drivers/ata/sata_mv.c    2008-01-24 12:06:25.000000000 -0500
>> +++ new/drivers/ata/sata_mv.c    2008-01-24 12:12:37.000000000 -0500
>> @@ -210,6 +210,7 @@
>>     /* SATA registers */
>>     SATA_STATUS_OFS        = 0x300,  /* ctrl, err regs follow status */
>>     SATA_ACTIVE_OFS        = 0x350,
>> +    SATA_FIS_IRQ_CAUSE_OFS    = 0x364,
>>     PHY_MODE3        = 0x310,
>>     PHY_MODE4        = 0x314,
>>     PHY_MODE2        = 0x330,
>> @@ -222,11 +223,11 @@
>>
>>     /* Port registers */
>>     EDMA_CFG_OFS        = 0,
>> -    EDMA_CFG_Q_DEPTH    = 0,            /* queueing disabled */
>> -    EDMA_CFG_NCQ        = (1 << 5),
>> -    EDMA_CFG_NCQ_GO_ON_ERR    = (1 << 14),        /* continue on 
>> error */
>> -    EDMA_CFG_RD_BRST_EXT    = (1 << 11),        /* read burst 512B */
>> -    EDMA_CFG_WR_BUFF_LEN    = (1 << 13),        /* write buffer 512B */
>> +    EDMA_CFG_Q_DEPTH    = 0x1f,        /* max device queue depth */
>> +    EDMA_CFG_NCQ        = (1 << 5),    /* for R/W FPDMA queued */
>> +    EDMA_CFG_NCQ_GO_ON_ERR    = (1 << 14),    /* continue on error */
>> +    EDMA_CFG_RD_BRST_EXT    = (1 << 11),    /* read burst 512B */
>> +    EDMA_CFG_WR_BUFF_LEN    = (1 << 13),    /* write buffer 512B */
>>
>>     EDMA_ERR_IRQ_CAUSE_OFS    = 0x8,
>>     EDMA_ERR_IRQ_MASK_OFS    = 0xc,
>> @@ -470,6 +471,8 @@
>> static void mv_reset_pci_bus(struct pci_dev *pdev, void __iomem *mmio);
>> static void mv_channel_reset(struct mv_host_priv *hpriv, void __iomem 
>> *mmio,
>>                  unsigned int port_no);
>> +static void mv_edma_cfg(struct ata_port *ap, struct mv_host_priv *hpriv,
>> +            void __iomem *port_mmio);
>>
>> static struct scsi_host_template mv5_sht = {
>>     .module            = THIS_MODULE,
>> @@ -834,13 +837,33 @@
>>  *      LOCKING:
>>  *      Inherited from caller.
>>  */
>> -static void mv_start_dma(void __iomem *port_mmio, struct mv_host_priv 
>> *hpriv,
>> +static void mv_start_dma(struct ata_port *ap, void __iomem *port_mmio,
>>              struct mv_port_priv *pp)
>> {
>>     if (!(pp->pp_flags & MV_PP_FLAG_EDMA_EN)) {
>> +        struct mv_host_priv *hpriv = ap->host->private_data;
>> +        int hard_port = mv_hardport_from_port(ap->port_no);
>> +        void __iomem *hc_mmio = mv_hc_base_from_port(
>> +                ap->host->iomap[MV_PRIMARY_BAR], hard_port);
>> +        u32 hc_irq_cause, ipending;
>> +
>>         /* clear EDMA event indicators, if any */
>>         writelfl(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
>>
>> +        /* clear EDMA interrupt indicator, if any */
>> +        hc_irq_cause = readl(hc_mmio + HC_IRQ_CAUSE_OFS);
>> +        ipending = (DEV_IRQ << hard_port) |
>> +                (CRPB_DMA_DONE << hard_port);
>> +        if (hc_irq_cause & ipending) {
>> +            writelfl(hc_irq_cause & ~ipending,
>> +                 hc_mmio + HC_IRQ_CAUSE_OFS);
>> +        }
>> +
>> +        mv_edma_cfg(ap, hpriv, port_mmio);
>> +
>> +        /* clear FIS IRQ Cause */
>> +        writelfl(0, port_mmio + SATA_FIS_IRQ_CAUSE_OFS);
>> +
>>         mv_set_edma_ptrs(port_mmio, hpriv, pp);
>>
>>         writelfl(EDMA_EN, port_mmio + EDMA_CMD_OFS);
>> @@ -1025,30 +1048,22 @@
>> static void mv_edma_cfg(struct ata_port *ap, struct mv_host_priv *hpriv,
>>             void __iomem *port_mmio)
>> {
>> -    u32 cfg = readl(port_mmio + EDMA_CFG_OFS);
>> +    u32 cfg;
>>
>>     /* set up non-NCQ EDMA configuration */
>> -    cfg &= ~(1 << 9);    /* disable eQue */
>> +    cfg = EDMA_CFG_Q_DEPTH;        /* always 0x1f for *all* chips */
>>
>> -    if (IS_GEN_I(hpriv)) {
>> -        cfg &= ~0x1f;        /* clear queue depth */
>> +    if (IS_GEN_I(hpriv))
>>         cfg |= (1 << 8);    /* enab config burst size mask */
> 
> You no longer clear bit 9 for Gen-I, which looks wrong.
..

Sure it does.  It clears the *whole* register by default,
and then turns on only the bits we want.

Cheers

  reply	other threads:[~2008-01-26 15:12 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-24 20:56 [PATCH 00/12] sata_mv NCQ support Mark Lord
2008-01-24 20:57 ` [PATCH 01/14] sata_mv EH fixes Mark Lord
2008-01-26  4:09   ` Jeff Garzik
2008-01-24 20:57 ` [PATCH 02/14] sata_mv Mask transient IRQs Mark Lord
2008-01-26  4:10   ` Jeff Garzik
2008-01-26 15:11     ` Mark Lord
2008-01-24 20:58 ` [PATCH 03/14] sata_mv Clear queue indexes on chip restart Mark Lord
2008-01-24 20:59 ` [PATCH 04/14] sata_mv rename base to port_mmio Mark Lord
2008-01-26  4:11   ` Jeff Garzik
2008-01-24 20:59 ` [PATCH 05/14] sata_mv Fix EDMA configuration Mark Lord
2008-01-26  4:17   ` Jeff Garzik
2008-01-26 15:12     ` Mark Lord [this message]
2008-01-24 21:00 ` [PATCH 06/14] sata_mv Add want_ncq parameter for " Mark Lord
2008-01-26  4:18   ` Jeff Garzik
2008-01-24 21:00 ` [PATCH 07/14] sata_mv Use hqtag instead of ioid Mark Lord
2008-01-26  4:19   ` Jeff Garzik
2008-01-26 15:14     ` Mark Lord
2008-01-24 21:01 ` [PATCH 08/14] sata_mv Ignore response status LSB on NCQ Mark Lord
2008-01-24 21:01 ` [PATCH 09/14] sata_mv Restrict max_sectors to 8-bits on GenII NCQ Mark Lord
2008-01-26  4:21   ` Jeff Garzik
2008-01-24 21:02 ` [PATCH 10/14] sata_mv Use DMA memory pools for hardware memory tables Mark Lord
2008-01-26  4:25   ` Jeff Garzik
2008-01-26 15:18     ` Mark Lord
2008-01-26 15:30       ` Mark Lord
2008-01-26 15:45         ` Jeff Garzik
2008-01-26 18:27           ` Mark Lord
2008-01-26 15:20     ` Mark Lord
2008-01-24 21:02 ` [PATCH 11/12] sata_mv Introduce per-tag SG tables Mark Lord
2008-01-26  4:26   ` Jeff Garzik
2008-01-24 21:03 ` [PATCH 12/14] sata_mv Enable NCQ operation Mark Lord
2008-01-26  4:26   ` Jeff Garzik
2008-01-24 21:03 ` [PATCH 13/14] sata_mv No soft resets Mark Lord
2008-01-26  4:28   ` Jeff Garzik
2008-01-26 15:21     ` Mark Lord
2008-01-24 21:04 ` [PATCH 14/14] sata_mv Comments and version bump Mark Lord
2008-01-25 19:38   ` [PATCH 14/14] sata_mv Comments and version bump (v.2) Mark Lord
2008-01-24 21:06 ` [PATCH 00/12] sata_mv NCQ support Mark Lord
2008-01-25  0:04 ` [PATCH 15/14] " Mark Lord
2008-01-25  0:08   ` Tejun Heo
2008-01-26  4:28   ` Jeff Garzik
2008-01-26  4:14 ` [PATCH 00/12] " 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=479B4DE7.8010302@rtr.ca \
    --to=liml@rtr.ca \
    --cc=jgarzik@pobox.com \
    --cc=linux-ide@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).