From patchwork Mon Apr 18 20:50:02 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Bottomley X-Patchwork-Id: 716571 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p3IKjZ4n031116 for ; Mon, 18 Apr 2011 20:50:07 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751862Ab1DRUuG (ORCPT ); Mon, 18 Apr 2011 16:50:06 -0400 Received: from bedivere.hansenpartnership.com ([66.63.167.143]:51059 "EHLO bedivere.hansenpartnership.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751290Ab1DRUuF (ORCPT ); Mon, 18 Apr 2011 16:50:05 -0400 Received: from localhost (localhost [127.0.0.1]) by bedivere.hansenpartnership.com (Postfix) with ESMTP id D86488EE0A4; Mon, 18 Apr 2011 13:50:04 -0700 (PDT) Received: from bedivere.hansenpartnership.com ([127.0.0.1]) by localhost (bedivere.hansenpartnership.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id QoLJZ56OBDKD; Mon, 18 Apr 2011 13:50:04 -0700 (PDT) Received: from [192.168.2.10] (dagonet.hansenpartnership.com [76.243.235.53]) by bedivere.hansenpartnership.com (Postfix) with ESMTPSA id 0E77E8EE01D; Mon, 18 Apr 2011 13:50:03 -0700 (PDT) Subject: Re: [PATCH 0/2] fix libata-sff and pata_cmd64x to not crash on boot on parisc From: James Bottomley To: Alan Cox Cc: linux-ide , Parisc List In-Reply-To: <20110418205203.56bbdb14@lxorguk.ukuu.org.uk> References: <1303152147.7167.12.camel@mulgrave.site> <20110418205203.56bbdb14@lxorguk.ukuu.org.uk> Date: Mon, 18 Apr 2011 15:50:02 -0500 Message-ID: <1303159802.7167.30.camel@mulgrave.site> Mime-Version: 1.0 X-Mailer: Evolution 2.32.1 Sender: linux-parisc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-parisc@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Mon, 18 Apr 2011 20:50:07 +0000 (UTC) On Mon, 2011-04-18 at 20:52 +0100, Alan Cox wrote: > You shouldn't need to touch a single line of the core libata code, > although it might be the best way of doing it. So how about this, using the dummy port info mechanism. I get a spurious ata2: DUMMY message, but I suppose libata people are used to that. I still have to fix libata to prevent spurious irq information, but that's cosmetic. James --- -- To unsubscribe from this list: send the line "unsubscribe linux-parisc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index f8380ce..b1b926c 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c @@ -2447,13 +2447,18 @@ int ata_pci_sff_activate_host(struct ata_host *host, return -ENOMEM; if (!legacy_mode && pdev->irq) { + int i; + rc = devm_request_irq(dev, pdev->irq, irq_handler, IRQF_SHARED, drv_name, host); if (rc) goto out; - ata_port_desc(host->ports[0], "irq %d", pdev->irq); - ata_port_desc(host->ports[1], "irq %d", pdev->irq); + for (i = 0; i < 2; i++) { + if (ata_port_is_dummy(host->ports[i])) + continue; + ata_port_desc(host->ports[i], "irq %d", pdev->irq); + } } else if (legacy_mode) { if (!ata_port_is_dummy(host->ports[0])) { rc = devm_request_irq(dev, ATA_PRIMARY_IRQ(pdev), diff --git a/drivers/ata/pata_cmd64x.c b/drivers/ata/pata_cmd64x.c index 905ff76..10dabe9 100644 --- a/drivers/ata/pata_cmd64x.c +++ b/drivers/ata/pata_cmd64x.c @@ -41,6 +41,9 @@ enum { CFR = 0x50, CFR_INTR_CH0 = 0x04, + ENPORT = 0x51, + ENPORT_PRIMARY = 0x04, + ENPORT_SECONDARY = 0x08, CMDTIM = 0x52, ARTTIM0 = 0x53, DRWTIM0 = 0x54, @@ -328,8 +331,12 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id) .port_ops = &cmd648_port_ops } }; - const struct ata_port_info *ppi[] = { &cmd_info[id->driver_data], NULL }; - u8 mrdmode; + const struct ata_port_info *ppi[] = { + &cmd_info[id->driver_data], + &cmd_info[id->driver_data], + NULL + }; + u8 mrdmode, reg; int rc; rc = pcim_enable_device(pdev); @@ -354,6 +361,19 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id) mrdmode |= 0x02; /* Memory read line enable */ pci_write_config_byte(pdev, MRDMODE, mrdmode); + /* check for enabled ports */ + pci_read_config_byte(pdev, ENPORT, ®); + /* the cm643 primary port is always enabled */ + if (id->driver_data != 0 && !(reg & ENPORT_PRIMARY)) { + dev_printk(KERN_ERR, &pdev->dev, "Primary port is disabled; detaching\n"); + ppi[0] = &ata_dummy_port_info; + + } + if (!(reg & ENPORT_SECONDARY)) { + dev_printk(KERN_NOTICE, &pdev->dev, "Secondary port is disabled\n"); + ppi[1] = &ata_dummy_port_info; + } + /* Force PIO 0 here.. */ /* PPC specific fixup copied from old driver */