From: Jeff Garzik <jgarzik@pobox.com>
To: Tejun Heo <htejun@gmail.com>
Cc: alan@lxorguk.ukuu.org.uk, axboe@suse.de, albertcc@tw.ibm.com,
forrest.zhao@intel.com, efalk@google.com,
linux-ide@vger.kernel.org
Subject: Re: [PATCH 08/11] sata_sil: convert to new EH
Date: Sat, 13 May 2006 18:26:28 -0400 [thread overview]
Message-ID: <44665D14.9030404@pobox.com> (raw)
In-Reply-To: <11473536881889-git-send-email-htejun@gmail.com>
Tejun Heo wrote:
> Convert sata_sil to new EH. As these controllers have hardware
> interrupt mask and are known to have screaming interrupts issues, use
> hardware IRQ masking for freezing. sil_freeze() masks interrupts for
> the port and sil_thaw() unmasks them. As ports are automatically
> frozen before probing reset, there is no need to initialize interrupt
> masks sil_init_onde(). Remove related code.
>
> Other than freezing, sata_sil uses stock BMDMA EH routines.
>
> Signed-off-by: Tejun Heo <htejun@gmail.com>
>
> ---
>
> drivers/scsi/sata_sil.c | 49 +++++++++++++++++++++++++++++++++--------------
> 1 files changed, 34 insertions(+), 15 deletions(-)
>
> 0eb051e052c5472c8e2abb0ab5caa267f6f72437
> diff --git a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c
> index bfcece1..3e998b7 100644
> --- a/drivers/scsi/sata_sil.c
> +++ b/drivers/scsi/sata_sil.c
> @@ -96,6 +96,8 @@ static void sil_dev_config(struct ata_po
> static u32 sil_scr_read (struct ata_port *ap, unsigned int sc_reg);
> static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
> static void sil_post_set_mode (struct ata_port *ap);
> +static void sil_freeze(struct ata_port *ap);
> +static void sil_thaw(struct ata_port *ap);
>
>
> static const struct pci_device_id sil_pci_tbl[] = {
> @@ -174,7 +176,10 @@ static const struct ata_port_operations
> .bmdma_status = ata_bmdma_status,
> .qc_prep = ata_qc_prep,
> .qc_issue = ata_qc_issue_prot,
> - .eng_timeout = ata_eng_timeout,
> + .freeze = sil_freeze,
> + .thaw = sil_thaw,
> + .error_handler = ata_bmdma_error_handler,
> + .post_internal_cmd = ata_bmdma_post_internal_cmd,
> .irq_handler = ata_interrupt,
> .irq_clear = ata_bmdma_irq_clear,
> .scr_read = sil_scr_read,
> @@ -314,6 +319,33 @@ static void sil_scr_write (struct ata_po
> writel(val, mmio);
> }
>
> +static void sil_freeze(struct ata_port *ap)
> +{
> + void __iomem *mmio_base = ap->host_set->mmio_base;
> + u32 tmp;
> +
> + /* plug IRQ */
> + tmp = readl(mmio_base + SIL_SYSCFG);
> + tmp |= SIL_MASK_IDE0_INT << ap->port_no;
> + writel(tmp, mmio_base + SIL_SYSCFG);
> + readl(mmio_base + SIL_SYSCFG); /* flush */
> +}
> +
> +static void sil_thaw(struct ata_port *ap)
> +{
> + void __iomem *mmio_base = ap->host_set->mmio_base;
> + u32 tmp;
> +
> + /* clear IRQ */
> + ata_chk_status(ap);
> + ap->ops->irq_clear(ap);
General policy: An LLDD should directly call a function it implements,
rather than a pointer found via one or more pointer de-refs. Eliminates
the pointer derefs, and gives more information to the compiler (and/or
debugger).
> + /* turn on IRQ */
> + tmp = readl(mmio_base + SIL_SYSCFG);
> + tmp &= ~(SIL_MASK_IDE0_INT << ap->port_no);
> + writel(tmp, mmio_base + SIL_SYSCFG);
> +}
> +
> /**
> * sil_dev_config - Apply device/host-specific errata fixups
> * @ap: Port containing device to be examined
> @@ -384,7 +416,7 @@ static int sil_init_one (struct pci_dev
> int rc;
> unsigned int i;
> int pci_dev_busy = 0;
> - u32 tmp, irq_mask;
> + u32 tmp;
> u8 cls;
>
> if (!printed_version++)
> @@ -474,24 +506,11 @@ static int sil_init_one (struct pci_dev
> }
>
> if (ent->driver_data == sil_3114) {
> - irq_mask = SIL_MASK_4PORT;
> -
> /* flip the magic "make 4 ports work" bit */
> tmp = readl(mmio_base + sil_port[2].bmdma);
> if ((tmp & SIL_INTR_STEERING) == 0)
> writel(tmp | SIL_INTR_STEERING,
> mmio_base + sil_port[2].bmdma);
> -
> - } else {
> - irq_mask = SIL_MASK_2PORT;
> - }
> -
> - /* make sure IDE0/1/2/3 interrupts are not masked */
> - tmp = readl(mmio_base + SIL_SYSCFG);
> - if (tmp & irq_mask) {
> - tmp &= ~irq_mask;
> - writel(tmp, mmio_base + SIL_SYSCFG);
> - readl(mmio_base + SIL_SYSCFG); /* flush */
> }
>
> /* mask all SATA phy-related interrupts */
next prev parent reply other threads:[~2006-05-13 22:26 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-05-11 13:21 [PATCHSET 03/11] new EH implementation, take 3 Tejun Heo
2006-05-11 13:21 ` [PATCH 03/11] libata-eh: add per-dev ata_ering Tejun Heo
2006-05-11 13:21 ` [PATCH 02/11] libata-eh: implement ata_ering Tejun Heo
2006-05-13 22:16 ` Jeff Garzik
2006-05-13 23:36 ` Tejun Heo
2006-05-14 1:05 ` Jeff Garzik
2006-05-14 1:20 ` Tejun Heo
2006-05-14 1:32 ` Jeff Garzik
2006-05-14 1:38 ` Tejun Heo
2006-05-15 13:36 ` Alan Cox
2006-05-15 14:00 ` Tejun Heo
2006-05-15 14:25 ` Tejun Heo
2006-05-15 14:50 ` Alan Cox
2006-05-15 14:57 ` Tejun Heo
2006-05-15 15:19 ` Alan Cox
2006-05-15 15:19 ` Tejun Heo
2006-05-15 18:22 ` Jeff Garzik
2006-05-11 13:21 ` [PATCH 01/11] libata-eh: add ATA and libata flags for new EH Tejun Heo
2006-05-13 22:15 ` Jeff Garzik
2006-05-11 13:21 ` [PATCH 05/11] libata-eh: implement " Tejun Heo
2006-05-13 22:19 ` Jeff Garzik
2006-05-11 13:21 ` [PATCH 04/11] libata-eh: implement ata_eh_info and ata_eh_context Tejun Heo
2006-05-11 13:21 ` [PATCH 06/11] libata-eh: implement BMDMA EH Tejun Heo
2006-05-13 22:21 ` Jeff Garzik
2006-05-13 23:41 ` Tejun Heo
2006-05-15 13:38 ` Alan Cox
2006-05-15 13:59 ` Tejun Heo
2006-05-15 14:43 ` Alan Cox
2006-05-11 13:21 ` [PATCH 08/11] sata_sil: convert to new EH Tejun Heo
2006-05-11 14:22 ` Alan Cox
2006-05-11 14:39 ` Tejun Heo
2006-05-11 15:46 ` Alan Cox
2006-05-11 15:45 ` Tejun Heo
2006-05-11 16:12 ` Alan Cox
2006-05-11 16:10 ` Tejun Heo
2006-05-11 17:16 ` Alan Cox
2006-05-13 22:26 ` Jeff Garzik [this message]
2006-05-13 23:43 ` Tejun Heo
2006-05-11 13:21 ` [PATCH 07/11] ata_piix: " Tejun Heo
2006-05-13 22:23 ` Jeff Garzik
2006-05-11 13:21 ` [PATCH 10/11] ahci: add PIOS interim interrupt handling Tejun Heo
2006-05-11 13:21 ` [PATCH 11/11] sata_sil24: convert to new EH Tejun Heo
2006-05-11 13:21 ` [PATCH 09/11] ahci: " Tejun Heo
2006-05-13 10:53 ` Tejun Heo
2006-05-13 22:30 ` Jeff Garzik
2006-05-13 23:49 ` Tejun Heo
2006-05-13 22:34 ` [PATCHSET 03/11] new EH implementation, take 3 Jeff Garzik
2006-05-13 23:58 ` Tejun Heo
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=44665D14.9030404@pobox.com \
--to=jgarzik@pobox.com \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=albertcc@tw.ibm.com \
--cc=axboe@suse.de \
--cc=efalk@google.com \
--cc=forrest.zhao@intel.com \
--cc=htejun@gmail.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).