* Re: [PATCH] pata_rdc: driver for RDC ATA devices
2009-06-24 17:10 Alan Cox
@ 2009-06-24 16:38 ` Joe Perches
2009-06-24 16:42 ` Alan Cox
0 siblings, 1 reply; 14+ messages in thread
From: Joe Perches @ 2009-06-24 16:38 UTC (permalink / raw)
To: Alan Cox; +Cc: linux-kernel, kevin.huang, greg
On Wed, 2009-06-24 at 18:10 +0100, Alan Cox wrote:
> From: Alan Cox <alan@linux.intel.com>
> diff --git a/drivers/ata/pata_rdc.c b/drivers/ata/pata_rdc.c
> new file mode 100644
> index 0000000..0f40cab
> --- /dev/null
> +++ b/drivers/ata/pata_rdc.c
[]
> +static void rdc_set_piomode(struct ata_port *ap, struct ata_device *adev)
> +{
[]
> + static const /* ISP RTC */
> + u8 timings[][2] = { { 0, 0 },
> + { 0, 0 },
> + { 1, 0 },
> + { 2, 1 },
> + { 2, 3 }, };
[]
> +static void do_rdc_set_dmamode(struct ata_port *ap, struct ata_device *adev)
> +{
> + static const /* ISP RTC */
> + u8 timings[][2] = { { 0, 0 },
> + { 0, 0 },
> + { 1, 0 },
> + { 2, 1 },
> + { 2, 3 }, };
Maybe consolidate?
The code seems to have many magic constants that might
be better #define'd and or'd.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] pata_rdc: driver for RDC ATA devices
2009-06-24 16:38 ` Joe Perches
@ 2009-06-24 16:42 ` Alan Cox
0 siblings, 0 replies; 14+ messages in thread
From: Alan Cox @ 2009-06-24 16:42 UTC (permalink / raw)
To: Joe Perches; +Cc: linux-kernel, kevin.huang, greg
> Maybe consolidate?
>
> The code seems to have many magic constants that might
> be better #define'd and or'd.
If you've got the spec it doesn't go around trying to award hundreds of
bits obscure names so naming them would be silly. If you've not got the
spec then whether its WOMBAT_DERANDOMISE or 0x04 doesn't really make any
difference to your understanding ;)
(And the spec is public)
It's simply a cut down from ata_piix. If you want to clean up ata_piix a
bit then go for it - send patches to Jeff.
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH] pata_rdc: driver for RDC ATA devices
@ 2009-06-24 17:10 Alan Cox
2009-06-24 16:38 ` Joe Perches
0 siblings, 1 reply; 14+ messages in thread
From: Alan Cox @ 2009-06-24 17:10 UTC (permalink / raw)
To: linux-kernel, kevin.huang, greg
From: Alan Cox <alan@linux.intel.com>
Give this a spin.. it ought to be fairly close to what is needed and is just
a cut down from the piix driver (upon which that spec is based)
Signed-off-by: Alan Cox <alan@linux.intel.com>
---
drivers/ata/Kconfig | 10 +
drivers/ata/Makefile | 1
drivers/ata/pata_rdc.c | 400 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 411 insertions(+), 0 deletions(-)
create mode 100644 drivers/ata/pata_rdc.c
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
index b17c57f..1074365 100644
--- a/drivers/ata/Kconfig
+++ b/drivers/ata/Kconfig
@@ -586,6 +586,16 @@ config PATA_RB532
If unsure, say N.
+config PATA_RDC
+ tristate "RDC PATA support"
+ depends on PCI
+ help
+ This option enables basic support for the later RDC PATA controllers
+ controllers via the new ATA layer. For the RDC 1010, you need to
+ enable the IT821X driver instead.
+
+ If unsure, say N.
+
config PATA_RZ1000
tristate "PC Tech RZ1000 PATA support"
depends on PCI
diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile
index 38906f9..463eb52 100644
--- a/drivers/ata/Makefile
+++ b/drivers/ata/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_PATA_PDC_OLD) += pata_pdc202xx_old.o
obj-$(CONFIG_PATA_QDI) += pata_qdi.o
obj-$(CONFIG_PATA_RADISYS) += pata_radisys.o
obj-$(CONFIG_PATA_RB532) += pata_rb532_cf.o
+obj-$(CONFIG_PATA_RDC) += pata_rdc.o
obj-$(CONFIG_PATA_RZ1000) += pata_rz1000.o
obj-$(CONFIG_PATA_SC1200) += pata_sc1200.o
obj-$(CONFIG_PATA_SERVERWORKS) += pata_serverworks.o
diff --git a/drivers/ata/pata_rdc.c b/drivers/ata/pata_rdc.c
new file mode 100644
index 0000000..0f40cab
--- /dev/null
+++ b/drivers/ata/pata_rdc.c
@@ -0,0 +1,400 @@
+/*
+ * pata_rdc - Driver for later RDC PATA controllers
+ *
+ * This is actually a driver for hardware meeting
+ * INCITS 370-2004 (1510D): ATA Host Adapter Standards
+ *
+ * Based on ata_piix.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/blkdev.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <scsi/scsi_host.h>
+#include <linux/libata.h>
+#include <linux/dmi.h>
+
+#define DRV_NAME "pata_rdc"
+#define DRV_VERSION "0.01"
+
+struct rdc_host_priv {
+ u32 saved_iocfg;
+};
+
+/**
+ * ich_pata_cable_detect - Probe host controller cable detect info
+ * @ap: Port for which cable detect info is desired
+ *
+ * Read 80c cable indicator from ATA PCI device's PCI config
+ * register. This register is normally set by firmware (BIOS).
+ *
+ * LOCKING:
+ * None (inherited from caller).
+ */
+
+static int ich_pata_cable_detect(struct ata_port *ap)
+{
+ struct pci_dev *pdev = to_pci_dev(ap->host->dev);
+ struct rdc_host_priv *hpriv = ap->host->private_data;
+ u8 mask;
+
+ /* check BIOS cable detect results */
+ mask = 0x30 << (2 * ap->port_no);
+ if ((hpriv->saved_iocfg & mask) == 0)
+ return ATA_CBL_PATA40;
+ return ATA_CBL_PATA80;
+}
+
+/**
+ * rdc_pata_prereset - prereset for PATA host controller
+ * @link: Target link
+ * @deadline: deadline jiffies for the operation
+ *
+ * LOCKING:
+ * None (inherited from caller).
+ */
+static int rdc_pata_prereset(struct ata_link *link, unsigned long deadline)
+{
+ struct ata_port *ap = link->ap;
+ struct pci_dev *pdev = to_pci_dev(ap->host->dev);
+
+ static const struct pci_bits rdc_enable_bits[] = {
+ { 0x41U, 1U, 0x80UL, 0x80UL }, /* port 0 */
+ { 0x43U, 1U, 0x80UL, 0x80UL }, /* port 1 */
+ };
+
+ if (!pci_test_config_bits(pdev, &rdc_enable_bits[ap->port_no]))
+ return -ENOENT;
+ return ata_sff_prereset(link, deadline);
+}
+
+/**
+ * rdc_set_piomode - Initialize host controller PATA PIO timings
+ * @ap: Port whose timings we are configuring
+ * @adev: um
+ *
+ * Set PIO mode for device, in host controller PCI config space.
+ *
+ * LOCKING:
+ * None (inherited from caller).
+ */
+
+static void rdc_set_piomode(struct ata_port *ap, struct ata_device *adev)
+{
+ unsigned int pio = adev->pio_mode - XFER_PIO_0;
+ struct pci_dev *dev = to_pci_dev(ap->host->dev);
+ unsigned int is_slave = (adev->devno != 0);
+ unsigned int master_port= ap->port_no ? 0x42 : 0x40;
+ unsigned int slave_port = 0x44;
+ u16 master_data;
+ u8 slave_data;
+ u8 udma_enable;
+ int control = 0;
+
+ static const /* ISP RTC */
+ u8 timings[][2] = { { 0, 0 },
+ { 0, 0 },
+ { 1, 0 },
+ { 2, 1 },
+ { 2, 3 }, };
+
+ if (pio >= 2)
+ control |= 1; /* TIME1 enable */
+ if (ata_pio_need_iordy(adev))
+ control |= 2; /* IE enable */
+
+ if (adev->class == ATA_DEV_ATA)
+ control |= 4; /* PPE enable */
+
+ /* PIO configuration clears DTE unconditionally. It will be
+ * programmed in set_dmamode which is guaranteed to be called
+ * after set_piomode if any DMA mode is available.
+ */
+ pci_read_config_word(dev, master_port, &master_data);
+ if (is_slave) {
+ /* clear TIME1|IE1|PPE1|DTE1 */
+ master_data &= 0xff0f;
+ /* Enable SITRE (separate slave timing register) */
+ master_data |= 0x4000;
+ /* enable PPE1, IE1 and TIME1 as needed */
+ master_data |= (control << 4);
+ pci_read_config_byte(dev, slave_port, &slave_data);
+ slave_data &= (ap->port_no ? 0x0f : 0xf0);
+ /* Load the timing nibble for this slave */
+ slave_data |= ((timings[pio][0] << 2) | timings[pio][1])
+ << (ap->port_no ? 4 : 0);
+ } else {
+ /* clear ISP|RCT|TIME0|IE0|PPE0|DTE0 */
+ master_data &= 0xccf0;
+ /* Enable PPE, IE and TIME as appropriate */
+ master_data |= control;
+ /* load ISP and RCT */
+ master_data |=
+ (timings[pio][0] << 12) |
+ (timings[pio][1] << 8);
+ }
+ pci_write_config_word(dev, master_port, master_data);
+ if (is_slave)
+ pci_write_config_byte(dev, slave_port, slave_data);
+
+ /* Ensure the UDMA bit is off - it will be turned back on if
+ UDMA is selected */
+
+ pci_read_config_byte(dev, 0x48, &udma_enable);
+ udma_enable &= ~(1 << (2 * ap->port_no + adev->devno));
+ pci_write_config_byte(dev, 0x48, udma_enable);
+}
+
+/**
+ * rdc_set_dmamode - Initialize host controller PATA PIO timings
+ * @ap: Port whose timings we are configuring
+ * @adev: Drive in question
+ *
+ * Set UDMA mode for device, in host controller PCI config space.
+ *
+ * LOCKING:
+ * None (inherited from caller).
+ */
+
+static void do_rdc_set_dmamode(struct ata_port *ap, struct ata_device *adev)
+{
+ struct pci_dev *dev = to_pci_dev(ap->host->dev);
+ u8 master_port = ap->port_no ? 0x42 : 0x40;
+ u16 master_data;
+ u8 speed = adev->dma_mode;
+ int devid = adev->devno + 2 * ap->port_no;
+ u8 udma_enable = 0;
+
+ static const /* ISP RTC */
+ u8 timings[][2] = { { 0, 0 },
+ { 0, 0 },
+ { 1, 0 },
+ { 2, 1 },
+ { 2, 3 }, };
+
+ pci_read_config_word(dev, master_port, &master_data);
+ pci_read_config_byte(dev, 0x48, &udma_enable);
+
+ if (speed >= XFER_UDMA_0) {
+ unsigned int udma = adev->dma_mode - XFER_UDMA_0;
+ u16 udma_timing;
+ u16 ideconf;
+ int u_clock, u_speed;
+
+ /*
+ * UDMA is handled by a combination of clock switching and
+ * selection of dividers
+ *
+ * Handy rule: Odd modes are UDMATIMx 01, even are 02
+ * except UDMA0 which is 00
+ */
+ u_speed = min(2 - (udma & 1), udma);
+ if (udma == 5)
+ u_clock = 0x1000; /* 100Mhz */
+ else if (udma > 2)
+ u_clock = 1; /* 66Mhz */
+ else
+ u_clock = 0; /* 33Mhz */
+
+ udma_enable |= (1 << devid);
+
+ /* Load the CT/RP selection */
+ pci_read_config_word(dev, 0x4A, &udma_timing);
+ udma_timing &= ~(3 << (4 * devid));
+ udma_timing |= u_speed << (4 * devid);
+ pci_write_config_word(dev, 0x4A, udma_timing);
+
+ /* Select a 33/66/100Mhz clock */
+ pci_read_config_word(dev, 0x54, &ideconf);
+ ideconf &= ~(0x1001 << devid);
+ ideconf |= u_clock << devid;
+ pci_write_config_word(dev, 0x54, ideconf);
+ } else {
+ /*
+ * MWDMA is driven by the PIO timings. We must also enable
+ * IORDY unconditionally along with TIME1. PPE has already
+ * been set when the PIO timing was set.
+ */
+ unsigned int mwdma = adev->dma_mode - XFER_MW_DMA_0;
+ unsigned int control;
+ u8 slave_data;
+ const unsigned int needed_pio[3] = {
+ XFER_PIO_0, XFER_PIO_3, XFER_PIO_4
+ };
+ int pio = needed_pio[mwdma] - XFER_PIO_0;
+
+ control = 3; /* IORDY|TIME1 */
+
+ /* If the drive MWDMA is faster than it can do PIO then
+ we must force PIO into PIO0 */
+
+ if (adev->pio_mode < needed_pio[mwdma])
+ /* Enable DMA timing only */
+ control |= 8; /* PIO cycles in PIO0 */
+
+ if (adev->devno) { /* Slave */
+ master_data &= 0xFF4F; /* Mask out IORDY|TIME1|DMAONLY */
+ master_data |= control << 4;
+ pci_read_config_byte(dev, 0x44, &slave_data);
+ slave_data &= (ap->port_no ? 0x0f : 0xf0);
+ /* Load the matching timing */
+ slave_data |= ((timings[pio][0] << 2) | timings[pio][1]) << (ap->port_no ? 4 : 0);
+ pci_write_config_byte(dev, 0x44, slave_data);
+ } else { /* Master */
+ master_data &= 0xCCF4; /* Mask out IORDY|TIME1|DMAONLY
+ and master timing bits */
+ master_data |= control;
+ master_data |=
+ (timings[pio][0] << 12) |
+ (timings[pio][1] << 8);
+ }
+
+ udma_enable &= ~(1 << devid);
+ pci_write_config_word(dev, master_port, master_data);
+ }
+ pci_write_config_byte(dev, 0x48, udma_enable);
+}
+
+static struct ata_port_operations rdc_pata_ops = {
+ .inherits = &ata_bmdma32_port_ops,
+ .cable_detect = ich_pata_cable_detect,
+ .set_piomode = rdc_set_piomode,
+ .set_dmamode = ich_set_dmamode,
+ .prereset = rdc_pata_prereset,
+};
+
+static struct ata_port_info rdc_port_info = {
+
+ .flags = ATA_FLAG_SLAVE_POSS,
+ .pio_mask = ATA_PIO4,
+ .mwdma_mask = ATA_MWDMA2,
+ .udma_mask = ATA_UDMA5,
+ .port_ops = &rdc_pata_ops,
+};
+
+static const struct pci_device_id rdc_pci_tbl[] = {
+ { PCI_DEVICE(0x17F3, 0x1011), },
+ { PCI_DEVICE(0x17F3, 0x1012), },
+ { } /* terminate list */
+};
+
+static struct pci_driver rdc_pci_driver = {
+ .name = DRV_NAME,
+ .id_table = rdc_pci_tbl,
+ .probe = rdc_init_one,
+ .remove = rdc_remove_one,
+};
+
+static struct scsi_host_template rdc_sht = {
+ ATA_BMDMA_SHT(DRV_NAME),
+};
+
+/**
+ * rdc_init_one - Register PIIX ATA PCI device with kernel services
+ * @pdev: PCI device to register
+ * @ent: Entry in rdc_pci_tbl matching with @pdev
+ *
+ * Called from kernel PCI layer. We probe for combined mode (sigh),
+ * and then hand over control to libata, for it to do the rest.
+ *
+ * LOCKING:
+ * Inherited from PCI layer (may sleep).
+ *
+ * RETURNS:
+ * Zero on success, or -ERRNO value.
+ */
+
+static int __devinit rdc_init_one(struct pci_dev *pdev,
+ const struct pci_device_id *ent)
+{
+ static int printed_version;
+ struct device *dev = &pdev->dev;
+ struct ata_port_info port_info[2];
+ const struct ata_port_info *ppi[] = { &port_info[0], &port_info[1] };
+ unsigned long port_flags;
+ struct ata_host *host;
+ struct rdc_host_priv *hpriv;
+ int rc;
+
+ if (!printed_version++)
+ dev_printk(KERN_DEBUG, &pdev->dev,
+ "version " DRV_VERSION "\n");
+
+ port_info[0] = &rdc_port_info;
+ port_info[1] = &rdc_port_info;
+
+ port_flags = port_info[0].flags;
+
+ /* enable device and prepare host */
+ rc = pcim_enable_device(pdev);
+ if (rc)
+ return rc;
+
+ hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
+ if (!hpriv)
+ return -ENOMEM;
+
+ /* Save IOCFG, this will be used for cable detection, quirk
+ * detection and restoration on detach.
+ */
+ pci_read_config_dword(pdev, 0x54, &hpriv->saved_iocfg);
+
+ rc = ata_pci_sff_prepare_host(pdev, ppi, &host);
+ if (rc)
+ return rc;
+ host->private_data = hpriv;
+
+ pci_intx(pdev, 1);
+
+ host->flags |= ATA_HOST_PARALLEL_SCAN;
+
+ pci_set_master(pdev);
+ return ata_pci_sff_activate_host(host, ata_sff_interrupt, &rdc_sht);
+}
+
+static void rdc_remove_one(struct pci_dev *pdev)
+{
+ struct ata_host *host = dev_get_drvdata(&pdev->dev);
+ struct rdc_host_priv *hpriv = host->private_data;
+
+ pci_write_config_dword(pdev, 0x54, hpriv->saved_iocfg);
+
+ ata_pci_remove_one(pdev);
+}
+
+static int __init rdc_init(void)
+{
+ return pci_register_driver(&rdc_pci_driver);
+}
+
+static void __exit rdc_exit(void)
+{
+ pci_unregister_driver(&rdc_pci_driver);
+}
+
+module_init(rdc_init);
+module_exit(rdc_exit);
+
+MODULE_AUTHOR("Alan Cox (based on ata_piix)");
+MODULE_DESCRIPTION("SCSI low-level driver for RDC PATA controllers");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(pci, rdc_pci_tbl);
+MODULE_VERSION(DRV_VERSION);
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH] pata_rdc: driver for RDC ATA devices
@ 2009-06-24 17:29 Alan Cox
2009-06-24 19:35 ` Jeff Garzik
2009-07-29 1:16 ` Jeff Garzik
0 siblings, 2 replies; 14+ messages in thread
From: Alan Cox @ 2009-06-24 17:29 UTC (permalink / raw)
To: linux-kernel, kevin.huang, greg
Try this version instead - forgot to refresh the patch before sending
From: Alan Cox <alan@linux.intel.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
---
drivers/ata/Kconfig | 10 +
drivers/ata/Makefile | 1
drivers/ata/pata_rdc.c | 400 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 411 insertions(+), 0 deletions(-)
create mode 100644 drivers/ata/pata_rdc.c
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
index b17c57f..1074365 100644
--- a/drivers/ata/Kconfig
+++ b/drivers/ata/Kconfig
@@ -586,6 +586,16 @@ config PATA_RB532
If unsure, say N.
+config PATA_RDC
+ tristate "RDC PATA support"
+ depends on PCI
+ help
+ This option enables basic support for the later RDC PATA controllers
+ controllers via the new ATA layer. For the RDC 1010, you need to
+ enable the IT821X driver instead.
+
+ If unsure, say N.
+
config PATA_RZ1000
tristate "PC Tech RZ1000 PATA support"
depends on PCI
diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile
index 38906f9..463eb52 100644
--- a/drivers/ata/Makefile
+++ b/drivers/ata/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_PATA_PDC_OLD) += pata_pdc202xx_old.o
obj-$(CONFIG_PATA_QDI) += pata_qdi.o
obj-$(CONFIG_PATA_RADISYS) += pata_radisys.o
obj-$(CONFIG_PATA_RB532) += pata_rb532_cf.o
+obj-$(CONFIG_PATA_RDC) += pata_rdc.o
obj-$(CONFIG_PATA_RZ1000) += pata_rz1000.o
obj-$(CONFIG_PATA_SC1200) += pata_sc1200.o
obj-$(CONFIG_PATA_SERVERWORKS) += pata_serverworks.o
diff --git a/drivers/ata/pata_rdc.c b/drivers/ata/pata_rdc.c
new file mode 100644
index 0000000..c843a1e
--- /dev/null
+++ b/drivers/ata/pata_rdc.c
@@ -0,0 +1,400 @@
+/*
+ * pata_rdc - Driver for later RDC PATA controllers
+ *
+ * This is actually a driver for hardware meeting
+ * INCITS 370-2004 (1510D): ATA Host Adapter Standards
+ *
+ * Based on ata_piix.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/blkdev.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <scsi/scsi_host.h>
+#include <linux/libata.h>
+#include <linux/dmi.h>
+
+#define DRV_NAME "pata_rdc"
+#define DRV_VERSION "0.01"
+
+struct rdc_host_priv {
+ u32 saved_iocfg;
+};
+
+/**
+ * rdc_pata_cable_detect - Probe host controller cable detect info
+ * @ap: Port for which cable detect info is desired
+ *
+ * Read 80c cable indicator from ATA PCI device's PCI config
+ * register. This register is normally set by firmware (BIOS).
+ *
+ * LOCKING:
+ * None (inherited from caller).
+ */
+
+static int rdc_pata_cable_detect(struct ata_port *ap)
+{
+ struct rdc_host_priv *hpriv = ap->host->private_data;
+ u8 mask;
+
+ /* check BIOS cable detect results */
+ mask = 0x30 << (2 * ap->port_no);
+ if ((hpriv->saved_iocfg & mask) == 0)
+ return ATA_CBL_PATA40;
+ return ATA_CBL_PATA80;
+}
+
+/**
+ * rdc_pata_prereset - prereset for PATA host controller
+ * @link: Target link
+ * @deadline: deadline jiffies for the operation
+ *
+ * LOCKING:
+ * None (inherited from caller).
+ */
+static int rdc_pata_prereset(struct ata_link *link, unsigned long deadline)
+{
+ struct ata_port *ap = link->ap;
+ struct pci_dev *pdev = to_pci_dev(ap->host->dev);
+
+ static const struct pci_bits rdc_enable_bits[] = {
+ { 0x41U, 1U, 0x80UL, 0x80UL }, /* port 0 */
+ { 0x43U, 1U, 0x80UL, 0x80UL }, /* port 1 */
+ };
+
+ if (!pci_test_config_bits(pdev, &rdc_enable_bits[ap->port_no]))
+ return -ENOENT;
+ return ata_sff_prereset(link, deadline);
+}
+
+/**
+ * rdc_set_piomode - Initialize host controller PATA PIO timings
+ * @ap: Port whose timings we are configuring
+ * @adev: um
+ *
+ * Set PIO mode for device, in host controller PCI config space.
+ *
+ * LOCKING:
+ * None (inherited from caller).
+ */
+
+static void rdc_set_piomode(struct ata_port *ap, struct ata_device *adev)
+{
+ unsigned int pio = adev->pio_mode - XFER_PIO_0;
+ struct pci_dev *dev = to_pci_dev(ap->host->dev);
+ unsigned int is_slave = (adev->devno != 0);
+ unsigned int master_port= ap->port_no ? 0x42 : 0x40;
+ unsigned int slave_port = 0x44;
+ u16 master_data;
+ u8 slave_data;
+ u8 udma_enable;
+ int control = 0;
+
+ static const /* ISP RTC */
+ u8 timings[][2] = { { 0, 0 },
+ { 0, 0 },
+ { 1, 0 },
+ { 2, 1 },
+ { 2, 3 }, };
+
+ if (pio >= 2)
+ control |= 1; /* TIME1 enable */
+ if (ata_pio_need_iordy(adev))
+ control |= 2; /* IE enable */
+
+ if (adev->class == ATA_DEV_ATA)
+ control |= 4; /* PPE enable */
+
+ /* PIO configuration clears DTE unconditionally. It will be
+ * programmed in set_dmamode which is guaranteed to be called
+ * after set_piomode if any DMA mode is available.
+ */
+ pci_read_config_word(dev, master_port, &master_data);
+ if (is_slave) {
+ /* clear TIME1|IE1|PPE1|DTE1 */
+ master_data &= 0xff0f;
+ /* Enable SITRE (separate slave timing register) */
+ master_data |= 0x4000;
+ /* enable PPE1, IE1 and TIME1 as needed */
+ master_data |= (control << 4);
+ pci_read_config_byte(dev, slave_port, &slave_data);
+ slave_data &= (ap->port_no ? 0x0f : 0xf0);
+ /* Load the timing nibble for this slave */
+ slave_data |= ((timings[pio][0] << 2) | timings[pio][1])
+ << (ap->port_no ? 4 : 0);
+ } else {
+ /* clear ISP|RCT|TIME0|IE0|PPE0|DTE0 */
+ master_data &= 0xccf0;
+ /* Enable PPE, IE and TIME as appropriate */
+ master_data |= control;
+ /* load ISP and RCT */
+ master_data |=
+ (timings[pio][0] << 12) |
+ (timings[pio][1] << 8);
+ }
+ pci_write_config_word(dev, master_port, master_data);
+ if (is_slave)
+ pci_write_config_byte(dev, slave_port, slave_data);
+
+ /* Ensure the UDMA bit is off - it will be turned back on if
+ UDMA is selected */
+
+ pci_read_config_byte(dev, 0x48, &udma_enable);
+ udma_enable &= ~(1 << (2 * ap->port_no + adev->devno));
+ pci_write_config_byte(dev, 0x48, udma_enable);
+}
+
+/**
+ * rdc_set_dmamode - Initialize host controller PATA PIO timings
+ * @ap: Port whose timings we are configuring
+ * @adev: Drive in question
+ *
+ * Set UDMA mode for device, in host controller PCI config space.
+ *
+ * LOCKING:
+ * None (inherited from caller).
+ */
+
+static void rdc_set_dmamode(struct ata_port *ap, struct ata_device *adev)
+{
+ struct pci_dev *dev = to_pci_dev(ap->host->dev);
+ u8 master_port = ap->port_no ? 0x42 : 0x40;
+ u16 master_data;
+ u8 speed = adev->dma_mode;
+ int devid = adev->devno + 2 * ap->port_no;
+ u8 udma_enable = 0;
+
+ static const /* ISP RTC */
+ u8 timings[][2] = { { 0, 0 },
+ { 0, 0 },
+ { 1, 0 },
+ { 2, 1 },
+ { 2, 3 }, };
+
+ pci_read_config_word(dev, master_port, &master_data);
+ pci_read_config_byte(dev, 0x48, &udma_enable);
+
+ if (speed >= XFER_UDMA_0) {
+ unsigned int udma = adev->dma_mode - XFER_UDMA_0;
+ u16 udma_timing;
+ u16 ideconf;
+ int u_clock, u_speed;
+
+ /*
+ * UDMA is handled by a combination of clock switching and
+ * selection of dividers
+ *
+ * Handy rule: Odd modes are UDMATIMx 01, even are 02
+ * except UDMA0 which is 00
+ */
+ u_speed = min(2 - (udma & 1), udma);
+ if (udma == 5)
+ u_clock = 0x1000; /* 100Mhz */
+ else if (udma > 2)
+ u_clock = 1; /* 66Mhz */
+ else
+ u_clock = 0; /* 33Mhz */
+
+ udma_enable |= (1 << devid);
+
+ /* Load the CT/RP selection */
+ pci_read_config_word(dev, 0x4A, &udma_timing);
+ udma_timing &= ~(3 << (4 * devid));
+ udma_timing |= u_speed << (4 * devid);
+ pci_write_config_word(dev, 0x4A, udma_timing);
+
+ /* Select a 33/66/100Mhz clock */
+ pci_read_config_word(dev, 0x54, &ideconf);
+ ideconf &= ~(0x1001 << devid);
+ ideconf |= u_clock << devid;
+ pci_write_config_word(dev, 0x54, ideconf);
+ } else {
+ /*
+ * MWDMA is driven by the PIO timings. We must also enable
+ * IORDY unconditionally along with TIME1. PPE has already
+ * been set when the PIO timing was set.
+ */
+ unsigned int mwdma = adev->dma_mode - XFER_MW_DMA_0;
+ unsigned int control;
+ u8 slave_data;
+ const unsigned int needed_pio[3] = {
+ XFER_PIO_0, XFER_PIO_3, XFER_PIO_4
+ };
+ int pio = needed_pio[mwdma] - XFER_PIO_0;
+
+ control = 3; /* IORDY|TIME1 */
+
+ /* If the drive MWDMA is faster than it can do PIO then
+ we must force PIO into PIO0 */
+
+ if (adev->pio_mode < needed_pio[mwdma])
+ /* Enable DMA timing only */
+ control |= 8; /* PIO cycles in PIO0 */
+
+ if (adev->devno) { /* Slave */
+ master_data &= 0xFF4F; /* Mask out IORDY|TIME1|DMAONLY */
+ master_data |= control << 4;
+ pci_read_config_byte(dev, 0x44, &slave_data);
+ slave_data &= (ap->port_no ? 0x0f : 0xf0);
+ /* Load the matching timing */
+ slave_data |= ((timings[pio][0] << 2) | timings[pio][1]) << (ap->port_no ? 4 : 0);
+ pci_write_config_byte(dev, 0x44, slave_data);
+ } else { /* Master */
+ master_data &= 0xCCF4; /* Mask out IORDY|TIME1|DMAONLY
+ and master timing bits */
+ master_data |= control;
+ master_data |=
+ (timings[pio][0] << 12) |
+ (timings[pio][1] << 8);
+ }
+
+ udma_enable &= ~(1 << devid);
+ pci_write_config_word(dev, master_port, master_data);
+ }
+ pci_write_config_byte(dev, 0x48, udma_enable);
+}
+
+static struct ata_port_operations rdc_pata_ops = {
+ .inherits = &ata_bmdma32_port_ops,
+ .cable_detect = rdc_pata_cable_detect,
+ .set_piomode = rdc_set_piomode,
+ .set_dmamode = rdc_set_dmamode,
+ .prereset = rdc_pata_prereset,
+};
+
+static struct ata_port_info rdc_port_info = {
+
+ .flags = ATA_FLAG_SLAVE_POSS,
+ .pio_mask = ATA_PIO4,
+ .mwdma_mask = ATA_MWDMA2,
+ .udma_mask = ATA_UDMA5,
+ .port_ops = &rdc_pata_ops,
+};
+
+static struct scsi_host_template rdc_sht = {
+ ATA_BMDMA_SHT(DRV_NAME),
+};
+
+/**
+ * rdc_init_one - Register PIIX ATA PCI device with kernel services
+ * @pdev: PCI device to register
+ * @ent: Entry in rdc_pci_tbl matching with @pdev
+ *
+ * Called from kernel PCI layer. We probe for combined mode (sigh),
+ * and then hand over control to libata, for it to do the rest.
+ *
+ * LOCKING:
+ * Inherited from PCI layer (may sleep).
+ *
+ * RETURNS:
+ * Zero on success, or -ERRNO value.
+ */
+
+static int __devinit rdc_init_one(struct pci_dev *pdev,
+ const struct pci_device_id *ent)
+{
+ static int printed_version;
+ struct device *dev = &pdev->dev;
+ struct ata_port_info port_info[2];
+ const struct ata_port_info *ppi[] = { &port_info[0], &port_info[1] };
+ unsigned long port_flags;
+ struct ata_host *host;
+ struct rdc_host_priv *hpriv;
+ int rc;
+
+ if (!printed_version++)
+ dev_printk(KERN_DEBUG, &pdev->dev,
+ "version " DRV_VERSION "\n");
+
+ port_info[0] = rdc_port_info;
+ port_info[1] = rdc_port_info;
+
+ port_flags = port_info[0].flags;
+
+ /* enable device and prepare host */
+ rc = pcim_enable_device(pdev);
+ if (rc)
+ return rc;
+
+ hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
+ if (!hpriv)
+ return -ENOMEM;
+
+ /* Save IOCFG, this will be used for cable detection, quirk
+ * detection and restoration on detach.
+ */
+ pci_read_config_dword(pdev, 0x54, &hpriv->saved_iocfg);
+
+ rc = ata_pci_sff_prepare_host(pdev, ppi, &host);
+ if (rc)
+ return rc;
+ host->private_data = hpriv;
+
+ pci_intx(pdev, 1);
+
+ host->flags |= ATA_HOST_PARALLEL_SCAN;
+
+ pci_set_master(pdev);
+ return ata_pci_sff_activate_host(host, ata_sff_interrupt, &rdc_sht);
+}
+
+static void rdc_remove_one(struct pci_dev *pdev)
+{
+ struct ata_host *host = dev_get_drvdata(&pdev->dev);
+ struct rdc_host_priv *hpriv = host->private_data;
+
+ pci_write_config_dword(pdev, 0x54, hpriv->saved_iocfg);
+
+ ata_pci_remove_one(pdev);
+}
+
+static const struct pci_device_id rdc_pci_tbl[] = {
+ { PCI_DEVICE(0x17F3, 0x1011), },
+ { PCI_DEVICE(0x17F3, 0x1012), },
+ { } /* terminate list */
+};
+
+static struct pci_driver rdc_pci_driver = {
+ .name = DRV_NAME,
+ .id_table = rdc_pci_tbl,
+ .probe = rdc_init_one,
+ .remove = rdc_remove_one,
+};
+
+
+static int __init rdc_init(void)
+{
+ return pci_register_driver(&rdc_pci_driver);
+}
+
+static void __exit rdc_exit(void)
+{
+ pci_unregister_driver(&rdc_pci_driver);
+}
+
+module_init(rdc_init);
+module_exit(rdc_exit);
+
+MODULE_AUTHOR("Alan Cox (based on ata_piix)");
+MODULE_DESCRIPTION("SCSI low-level driver for RDC PATA controllers");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(pci, rdc_pci_tbl);
+MODULE_VERSION(DRV_VERSION);
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH] pata_rdc: driver for RDC ATA devices
2009-06-24 17:29 [PATCH] pata_rdc: driver for RDC ATA devices Alan Cox
@ 2009-06-24 19:35 ` Jeff Garzik
2009-06-24 22:55 ` Alan Cox
2009-07-29 1:16 ` Jeff Garzik
1 sibling, 1 reply; 14+ messages in thread
From: Jeff Garzik @ 2009-06-24 19:35 UTC (permalink / raw)
To: Alan Cox; +Cc: linux-kernel, kevin.huang, greg, Linux IDE mailing list
Alan Cox wrote:
> Try this version instead - forgot to refresh the patch before sending
>
> From: Alan Cox <alan@linux.intel.com>
>
> Signed-off-by: Alan Cox <alan@linux.intel.com>
> ---
>
> drivers/ata/Kconfig | 10 +
> drivers/ata/Makefile | 1
> drivers/ata/pata_rdc.c | 400 ++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 411 insertions(+), 0 deletions(-)
> create mode 100644 drivers/ata/pata_rdc.c
Requesting that linux-ide be CC'd in the future, for this driver...
Seems fine and fairly straightforward to me. My lone comment -- go
through and replace magic numbers with named constants, for e.g. the PCI
config registers that program timings...
Jeff
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] pata_rdc: driver for RDC ATA devices
2009-06-24 19:35 ` Jeff Garzik
@ 2009-06-24 22:55 ` Alan Cox
2009-06-24 23:33 ` Joe Perches
2009-06-25 4:27 ` Kevin Huang (黃凱文)
0 siblings, 2 replies; 14+ messages in thread
From: Alan Cox @ 2009-06-24 22:55 UTC (permalink / raw)
To: Jeff Garzik; +Cc: linux-kernel, kevin.huang, greg, Linux IDE mailing list
> Seems fine and fairly straightforward to me. My lone comment -- go
> through and replace magic numbers with named constants, for e.g. the PCI
> config registers that program timings...
Its based on your ata_piix driver. Feel free to update that and I'll pull
names and things across to match.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] pata_rdc: driver for RDC ATA devices
2009-06-24 22:55 ` Alan Cox
@ 2009-06-24 23:33 ` Joe Perches
2009-06-24 23:38 ` Jeff Garzik
2009-06-25 4:27 ` Kevin Huang (黃凱文)
1 sibling, 1 reply; 14+ messages in thread
From: Joe Perches @ 2009-06-24 23:33 UTC (permalink / raw)
To: Alan Cox
Cc: Jeff Garzik, linux-kernel, kevin.huang, greg,
Linux IDE mailing list
On Wed, 2009-06-24 at 23:55 +0100, Alan Cox wrote:
> > Seems fine and fairly straightforward to me. My lone comment -- go
> > through and replace magic numbers with named constants, for e.g. the PCI
> > config registers that program timings...
>
> Its based on your ata_piix driver. Feel free to update that and I'll pull
> names and things across to match.
I sent a few patches to Jeff privately to do just that.
I'm waiting for Jeff to see if he wants me to post
them publicly or not.
btw:
Jeff, your email address in MAINTAINERS is jgarzik@pobox.com.
Should it be changed to redhat.com or garzik.org or left as is.
$ git log --since=1-year-ago | grep -i "by:.*garzik" | \
cut -f2- -d":" | sort | uniq -c | sort -rn
865 Jeff Garzik <jgarzik@redhat.com>
13 Jeff Garzik <jgarzik@pobox.com>
13 Jeff Garzik <jeff@garzik.org>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] pata_rdc: driver for RDC ATA devices
2009-06-24 23:33 ` Joe Perches
@ 2009-06-24 23:38 ` Jeff Garzik
0 siblings, 0 replies; 14+ messages in thread
From: Jeff Garzik @ 2009-06-24 23:38 UTC (permalink / raw)
To: Joe Perches
Cc: Alan Cox, linux-kernel, kevin.huang, greg, Linux IDE mailing list
Joe Perches wrote:
> On Wed, 2009-06-24 at 23:55 +0100, Alan Cox wrote:
>>> Seems fine and fairly straightforward to me. My lone comment -- go
>>> through and replace magic numbers with named constants, for e.g. the PCI
>>> config registers that program timings...
>> Its based on your ata_piix driver. Feel free to update that and I'll pull
>> names and things across to match.
>
> I sent a few patches to Jeff privately to do just that.
>
> I'm waiting for Jeff to see if he wants me to post
> them publicly or not.
Always post patches publicly... private mail is easily lost, left
undiscussed and unarchived, etc.
> Jeff, your email address in MAINTAINERS is jgarzik@pobox.com.
> Should it be changed to redhat.com or garzik.org or left as is.
MAINTAINERS is accurate :)
Jeff
^ permalink raw reply [flat|nested] 14+ messages in thread
* RE: [PATCH] pata_rdc: driver for RDC ATA devices
2009-06-24 22:55 ` Alan Cox
2009-06-24 23:33 ` Joe Perches
@ 2009-06-25 4:27 ` Kevin Huang (黃凱文)
1 sibling, 0 replies; 14+ messages in thread
From: Kevin Huang (黃凱文) @ 2009-06-25 4:27 UTC (permalink / raw)
To: Alan Cox, Jeff Garzik; +Cc: linux-kernel, greg, Linux IDE mailing list
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="big5", Size: 1649 bytes --]
At first I studied ata_piix driver for our driver, because we need to testing our controller. Then I found it is hard to me.I needed to clearify the unreadable code of hardware setting and configuration.So I just modify and clean up original code. And make it simple for beginner or maintainer. I keep original framework and design for future controllers and updates.
This is my first experience of linux driver . Just for share.
-----Original Message----->> Seems fine and fairly straightforward to me. My lone comment -- go >> through and replace magic numbers with named constants, for e.g. the PCI >> config registers that program timings...
>Its based on your ata_piix driver. Feel free to update that and I'll pull>names and things across to match.---------------------------------------------------------------------------------- [E-mail Confidentiality Notice]The information in this e-mail is confidential and may be legally privileged otherwise protected from disclosure. It is intended solely for the addressee. Access to this e-mail by anyone else is unauthorized .If youare not the intended recipient, any disclosure, copying, distribution or any action taken or omitted to be taken in reliance on it, is prohibited and maybe unlawful. Please delete the message and any attachments from your computer system; and destroy all hard copies.
ALL Intellectual Property Rights of RDC Reserved.---------------------------------------------------------------------------------- ÿôèº{.nÇ+·®+%Ëÿ±éݶ\x17¥wÿº{.nÇ+·¥{±þG«éÿ{ayº\x1dÊÚë,j\a¢f£¢·hïêÿêçz_è®\x03(éÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?¨èÚ&£ø§~á¶iOæ¬z·vØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?I¥
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] pata_rdc: driver for RDC ATA devices
2009-06-24 17:29 [PATCH] pata_rdc: driver for RDC ATA devices Alan Cox
2009-06-24 19:35 ` Jeff Garzik
@ 2009-07-29 1:16 ` Jeff Garzik
2009-07-29 2:53 ` Greg KH
1 sibling, 1 reply; 14+ messages in thread
From: Jeff Garzik @ 2009-07-29 1:16 UTC (permalink / raw)
To: Alan Cox; +Cc: linux-kernel, kevin.huang, greg
Alan Cox wrote:
> Try this version instead - forgot to refresh the patch before sending
>
> From: Alan Cox <alan@linux.intel.com>
>
> Signed-off-by: Alan Cox <alan@linux.intel.com>
> ---
>
> drivers/ata/Kconfig | 10 +
> drivers/ata/Makefile | 1
> drivers/ata/pata_rdc.c | 400 ++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 411 insertions(+), 0 deletions(-)
> create mode 100644 drivers/ata/pata_rdc.c
applied... and ata_piix+pata_rdc cleanups queued on todo list
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] pata_rdc: driver for RDC ATA devices
2009-07-29 1:16 ` Jeff Garzik
@ 2009-07-29 2:53 ` Greg KH
2009-07-29 3:05 ` Jeff Garzik
0 siblings, 1 reply; 14+ messages in thread
From: Greg KH @ 2009-07-29 2:53 UTC (permalink / raw)
To: Jeff Garzik; +Cc: Alan Cox, linux-kernel, kevin.huang
On Tue, Jul 28, 2009 at 09:16:52PM -0400, Jeff Garzik wrote:
> Alan Cox wrote:
> > Try this version instead - forgot to refresh the patch before sending
> >
> > From: Alan Cox <alan@linux.intel.com>
> >
> > Signed-off-by: Alan Cox <alan@linux.intel.com>
> > ---
> >
> > drivers/ata/Kconfig | 10 +
> > drivers/ata/Makefile | 1
> > drivers/ata/pata_rdc.c | 400 ++++++++++++++++++++++++++++++++++++++++++++++++
> > 3 files changed, 411 insertions(+), 0 deletions(-)
> > create mode 100644 drivers/ata/pata_rdc.c
>
> applied... and ata_piix+pata_rdc cleanups queued on todo list
Great! Let me know when this goes to Linus so I delete the one in the
staging tree.
thanks,
greg k-h
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] pata_rdc: driver for RDC ATA devices
2009-07-29 2:53 ` Greg KH
@ 2009-07-29 3:05 ` Jeff Garzik
2009-07-29 3:37 ` Stephen Rothwell
0 siblings, 1 reply; 14+ messages in thread
From: Jeff Garzik @ 2009-07-29 3:05 UTC (permalink / raw)
To: Greg KH; +Cc: Alan Cox, linux-kernel, kevin.huang, Stephen Rothwell
Greg KH wrote:
> On Tue, Jul 28, 2009 at 09:16:52PM -0400, Jeff Garzik wrote:
>> Alan Cox wrote:
>>> Try this version instead - forgot to refresh the patch before sending
>>>
>>> From: Alan Cox <alan@linux.intel.com>
>>>
>>> Signed-off-by: Alan Cox <alan@linux.intel.com>
>>> ---
>>>
>>> drivers/ata/Kconfig | 10 +
>>> drivers/ata/Makefile | 1
>>> drivers/ata/pata_rdc.c | 400 ++++++++++++++++++++++++++++++++++++++++++++++++
>>> 3 files changed, 411 insertions(+), 0 deletions(-)
>>> create mode 100644 drivers/ata/pata_rdc.c
>> applied... and ata_piix+pata_rdc cleanups queued on todo list
>
> Great! Let me know when this goes to Linus so I delete the one in the
> staging tree.
FWIW, it's in libata-dev.git#upstream and libata-dev.git#NEXT, so
linux-next should pick it up automatically.
Jeff
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] pata_rdc: driver for RDC ATA devices
2009-07-29 3:05 ` Jeff Garzik
@ 2009-07-29 3:37 ` Stephen Rothwell
2009-07-29 13:56 ` Greg KH
0 siblings, 1 reply; 14+ messages in thread
From: Stephen Rothwell @ 2009-07-29 3:37 UTC (permalink / raw)
To: Jeff Garzik; +Cc: Greg KH, Alan Cox, linux-kernel, kevin.huang
[-- Attachment #1: Type: text/plain, Size: 408 bytes --]
Hi all,
On Tue, 28 Jul 2009 23:05:19 -0400 Jeff Garzik <jeff@garzik.org> wrote:
>
> FWIW, it's in libata-dev.git#upstream and libata-dev.git#NEXT, so
> linux-next should pick it up automatically.
It will be in tomorrow's tree (unless it is important enough for me to
grab it for today).
--
Cheers,
Stephen Rothwell sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/
[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] pata_rdc: driver for RDC ATA devices
2009-07-29 3:37 ` Stephen Rothwell
@ 2009-07-29 13:56 ` Greg KH
0 siblings, 0 replies; 14+ messages in thread
From: Greg KH @ 2009-07-29 13:56 UTC (permalink / raw)
To: Stephen Rothwell; +Cc: Jeff Garzik, Alan Cox, linux-kernel, kevin.huang
On Wed, Jul 29, 2009 at 01:37:28PM +1000, Stephen Rothwell wrote:
> Hi all,
>
> On Tue, 28 Jul 2009 23:05:19 -0400 Jeff Garzik <jeff@garzik.org> wrote:
> >
> > FWIW, it's in libata-dev.git#upstream and libata-dev.git#NEXT, so
> > linux-next should pick it up automatically.
>
> It will be in tomorrow's tree (unless it is important enough for me to
> grab it for today).
No, no rush here.
I've now removed the driver from the staging tree, so everything should
be good.
thanks,
greg k-h
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2009-07-29 13:58 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-24 17:29 [PATCH] pata_rdc: driver for RDC ATA devices Alan Cox
2009-06-24 19:35 ` Jeff Garzik
2009-06-24 22:55 ` Alan Cox
2009-06-24 23:33 ` Joe Perches
2009-06-24 23:38 ` Jeff Garzik
2009-06-25 4:27 ` Kevin Huang (黃凱文)
2009-07-29 1:16 ` Jeff Garzik
2009-07-29 2:53 ` Greg KH
2009-07-29 3:05 ` Jeff Garzik
2009-07-29 3:37 ` Stephen Rothwell
2009-07-29 13:56 ` Greg KH
-- strict thread matches above, loose matches on Subject: below --
2009-06-24 17:10 Alan Cox
2009-06-24 16:38 ` Joe Perches
2009-06-24 16:42 ` Alan Cox
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox