Re: [PATCH 2.6.20-rc3] sata_promise: ATAPI support

2007-01-08 Thread Mikael Pettersson
On Sun, 07 Jan 2007 20:50:48 -0500, Jeff Garzik wrote:
> > With this patch ATAPI will work on SATA ports on second-generation
> > chips, and on the first-generation PATA-only 20619. ATAPI on the
> > 2057x' PATA port will work automatically when #promise-sata-pata
> > is updated. ATAPI on the 2037x' PATA port is enabled by a followup
> > patch for the #promise-sata-pata branch.
> > 
> > Signed-off-by: Mikael Pettersson <[EMAIL PROTECTED]>
> 
> No objections, minor revision requests follow.
> 
> * general comment:  please combine the 'make first gen SATAPI work' 
> patch with this one.

Will do.

> > +static unsigned int pdc_wait_for_drq(struct ata_port *ap)
> > +{ 
> > +   void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr;
> > +   unsigned int i;
> > +   unsigned int status;
> > +
> > +   /* Following pdc-ultra's WaitForDrq() we loop here until BSY
> > +* is clear and DRQ is set in altstatus. We could possibly call
> > +* ata_busy_wait() and loop until DRQ is set, but since we don't
> > +* know how much time a call to ata_busy_wait() took, we don't
> > +* know when to time out the outer loop.
> > +*/
> > +   for(i = 0; i < 1000; ++i) {
> > +   status = readb(port_mmio + 0x38); /* altstatus */
> > +   if (status == 0xFF)
> > +   break;
> > +   if (status & ATA_BUSY)
> > +   ;
> > +   else if (status & (ATA_DRQ | ATA_ERR))
> > +   break;
> > +   mdelay(1);
> > +   }
> 
> This really hurts to do this with spinlocks held.  Long term, ponder 
> ways to move this to a kernel thread that can sleep [if it takes too long?]

On the TODO list for a later update.

> > +static void pdc_issue_atapi_pkt_cmd(struct ata_queued_cmd *qc)
> > +{
> > +   struct ata_port *ap = qc->ap;
> > +   void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr;
> > +   void __iomem *host_mmio = ap->host->mmio_base;
> > +   unsigned int nbytes;
> > +   unsigned int tmp;
> > +
> > +   /* disable INTA here, it will be re-enable when CAM use SEQ 0 for 
> > packets */
> 
> cut-n-pasted comment?  This is not CAM :)

Indeed :-) Will fix.

> > +   writeb(0x00, port_mmio + PDC_CTLSTAT); /* that the drive INT pass to 
> > SEQ 0*/
> > +   writeb(0x20, host_mmio + 0); /* but mask SEQ 0 INT */
> 
> please create named constants for these magic numbers

Will do (for this and the other places you pointed out).

/Mikael
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2.6.20-rc3] sata_promise: ATAPI support

2007-01-08 Thread Mikael Pettersson
On Sun, 07 Jan 2007 20:50:48 -0500, Jeff Garzik wrote:
  With this patch ATAPI will work on SATA ports on second-generation
  chips, and on the first-generation PATA-only 20619. ATAPI on the
  2057x' PATA port will work automatically when #promise-sata-pata
  is updated. ATAPI on the 2037x' PATA port is enabled by a followup
  patch for the #promise-sata-pata branch.
  
  Signed-off-by: Mikael Pettersson [EMAIL PROTECTED]
 
 No objections, minor revision requests follow.
 
 * general comment:  please combine the 'make first gen SATAPI work' 
 patch with this one.

Will do.

  +static unsigned int pdc_wait_for_drq(struct ata_port *ap)
  +{ 
  +   void __iomem *port_mmio = (void __iomem *) ap-ioaddr.cmd_addr;
  +   unsigned int i;
  +   unsigned int status;
  +
  +   /* Following pdc-ultra's WaitForDrq() we loop here until BSY
  +* is clear and DRQ is set in altstatus. We could possibly call
  +* ata_busy_wait() and loop until DRQ is set, but since we don't
  +* know how much time a call to ata_busy_wait() took, we don't
  +* know when to time out the outer loop.
  +*/
  +   for(i = 0; i  1000; ++i) {
  +   status = readb(port_mmio + 0x38); /* altstatus */
  +   if (status == 0xFF)
  +   break;
  +   if (status  ATA_BUSY)
  +   ;
  +   else if (status  (ATA_DRQ | ATA_ERR))
  +   break;
  +   mdelay(1);
  +   }
 
 This really hurts to do this with spinlocks held.  Long term, ponder 
 ways to move this to a kernel thread that can sleep [if it takes too long?]

On the TODO list for a later update.

  +static void pdc_issue_atapi_pkt_cmd(struct ata_queued_cmd *qc)
  +{
  +   struct ata_port *ap = qc-ap;
  +   void __iomem *port_mmio = (void __iomem *) ap-ioaddr.cmd_addr;
  +   void __iomem *host_mmio = ap-host-mmio_base;
  +   unsigned int nbytes;
  +   unsigned int tmp;
  +
  +   /* disable INTA here, it will be re-enable when CAM use SEQ 0 for 
  packets */
 
 cut-n-pasted comment?  This is not CAM :)

Indeed :-) Will fix.

  +   writeb(0x00, port_mmio + PDC_CTLSTAT); /* that the drive INT pass to 
  SEQ 0*/
  +   writeb(0x20, host_mmio + 0); /* but mask SEQ 0 INT */
 
 please create named constants for these magic numbers

Will do (for this and the other places you pointed out).

/Mikael
-
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2.6.20-rc3] sata_promise: ATAPI support

2007-01-07 Thread Jeff Garzik

Mikael Pettersson wrote:

This patch adds ATAPI support to the sata_promise driver.
This has been tested on both first- and second-generation
chips (20378 and 20575), and with both SATAPI and PATAPI
devices. CD-writing works, and bulk data transfers use DMA.

SATAPI works on second-generation chips, but not on
first-generation chips due to HW limitations.
PATAPI works on both first- and second-generation chips,
but requires the PATA support patch as well (which needs
an update due to a conflict in the board_2037x definition).

The functional changes to the driver are:
- remove ATA_FLAG_NO_ATAPI from PDC_COMMON_FLAGS, and add it
  back to the boards that cannot support SATAPI (20319, 2037x)
- add ->check_atapi() operation to enable DMA for bulk data
  transfers but force PIO for other ATAPI commands; this filter
  is taken from Promise's driver and pata_pdc207x.c
- add handling of ATAPI protocols to pdc_qc_prep(), pdc_host_intr(),
  and pdc_qc_issue_prot(): ATAPI_DMA is handled by the driver
  while non-DMA protocols are handed over to libata generic code
- add pdc_issue_atapi_pkt_cmd() to handle the initial steps in
  issuing ATAPI DMA commands before sending the actual CDB;
  this procedure was ported from Promise's driver

With this patch ATAPI will work on SATA ports on second-generation
chips, and on the first-generation PATA-only 20619. ATAPI on the
2057x' PATA port will work automatically when #promise-sata-pata
is updated. ATAPI on the 2037x' PATA port is enabled by a followup
patch for the #promise-sata-pata branch.

Signed-off-by: Mikael Pettersson <[EMAIL PROTECTED]>


No objections, minor revision requests follow.

* general comment:  please combine the 'make first gen SATAPI work' 
patch with this one.




--- linux-2.6.20-rc3/drivers/ata/sata_promise.c.~1~ 2007-01-01 
13:32:35.0 +0100
+++ linux-2.6.20-rc3/drivers/ata/sata_promise.c 2007-01-06 15:36:43.0 
+0100
@@ -39,6 +39,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -77,7 +78,7 @@ enum {
PDC_RESET   = (1 << 11), /* HDMA reset */
 
 	PDC_COMMON_FLAGS	= ATA_FLAG_NO_LEGACY |

- ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI |
+ ATA_FLAG_MMIO |
  ATA_FLAG_PIO_POLLING,
 
 	/* hp->flags bits */

@@ -105,6 +106,7 @@ static void pdc_pata_phy_reset(struct at
 static void pdc_qc_prep(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile 
*tf);
 static void pdc_exec_command_mmio(struct ata_port *ap, const struct 
ata_taskfile *tf);
+static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
 static void pdc_irq_clear(struct ata_port *ap);
 static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc);
 static void pdc_host_stop(struct ata_host *host);
@@ -139,6 +141,7 @@ static const struct ata_port_operations 
 	.check_status		= ata_check_status,

.exec_command   = pdc_exec_command_mmio,
.dev_select = ata_std_dev_select,
+   .check_atapi_dma= pdc_check_atapi_dma,
 
 	.qc_prep		= pdc_qc_prep,

.qc_issue   = pdc_qc_issue_prot,
@@ -164,6 +167,7 @@ static const struct ata_port_operations 
 	.check_status		= ata_check_status,

.exec_command   = pdc_exec_command_mmio,
.dev_select = ata_std_dev_select,
+   .check_atapi_dma= pdc_check_atapi_dma,
 
 	.phy_reset		= pdc_pata_phy_reset,
 
@@ -183,7 +187,7 @@ static const struct ata_port_info pdc_po

/* board_2037x */
{
.sht= _ata_sht,
-   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_NO_ATAPI | 
ATA_FLAG_SATA,
.pio_mask   = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask  = 0x7f, /* udma0-6 ; FIXME */
@@ -193,7 +197,7 @@ static const struct ata_port_info pdc_po
/* board_20319 */
{
.sht= _ata_sht,
-   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_NO_ATAPI | 
ATA_FLAG_SATA,
.pio_mask   = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask  = 0x7f, /* udma0-6 ; FIXME */
@@ -391,6 +395,30 @@ static void pdc_sata_scr_write (struct a
writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4));
 }
 
+static void pdc_atapi_dma_pkt(struct ata_taskfile *tf,

+ dma_addr_t sg_table,
+ unsigned int cdb_len, u8 *cdb,
+ u8 *buf)
+{
+   u32 *buf32 = (u32 *) buf;
+
+   /* set control bits (byte 0), zero delay seq id (byte 3),
+* and seq id (byte 2)
+*/
+   if (!(tf->flags & 

Re: [PATCH 2.6.20-rc3] sata_promise: ATAPI support

2007-01-07 Thread Jeff Garzik

Mikael Pettersson wrote:

This patch adds ATAPI support to the sata_promise driver.
This has been tested on both first- and second-generation
chips (20378 and 20575), and with both SATAPI and PATAPI
devices. CD-writing works, and bulk data transfers use DMA.

SATAPI works on second-generation chips, but not on
first-generation chips due to HW limitations.
PATAPI works on both first- and second-generation chips,
but requires the PATA support patch as well (which needs
an update due to a conflict in the board_2037x definition).

The functional changes to the driver are:
- remove ATA_FLAG_NO_ATAPI from PDC_COMMON_FLAGS, and add it
  back to the boards that cannot support SATAPI (20319, 2037x)
- add -check_atapi() operation to enable DMA for bulk data
  transfers but force PIO for other ATAPI commands; this filter
  is taken from Promise's driver and pata_pdc207x.c
- add handling of ATAPI protocols to pdc_qc_prep(), pdc_host_intr(),
  and pdc_qc_issue_prot(): ATAPI_DMA is handled by the driver
  while non-DMA protocols are handed over to libata generic code
- add pdc_issue_atapi_pkt_cmd() to handle the initial steps in
  issuing ATAPI DMA commands before sending the actual CDB;
  this procedure was ported from Promise's driver

With this patch ATAPI will work on SATA ports on second-generation
chips, and on the first-generation PATA-only 20619. ATAPI on the
2057x' PATA port will work automatically when #promise-sata-pata
is updated. ATAPI on the 2037x' PATA port is enabled by a followup
patch for the #promise-sata-pata branch.

Signed-off-by: Mikael Pettersson [EMAIL PROTECTED]


No objections, minor revision requests follow.

* general comment:  please combine the 'make first gen SATAPI work' 
patch with this one.




--- linux-2.6.20-rc3/drivers/ata/sata_promise.c.~1~ 2007-01-01 
13:32:35.0 +0100
+++ linux-2.6.20-rc3/drivers/ata/sata_promise.c 2007-01-06 15:36:43.0 
+0100
@@ -39,6 +39,7 @@
 #include linux/interrupt.h
 #include linux/sched.h
 #include linux/device.h
+#include scsi/scsi.h
 #include scsi/scsi_host.h
 #include scsi/scsi_cmnd.h
 #include linux/libata.h
@@ -77,7 +78,7 @@ enum {
PDC_RESET   = (1  11), /* HDMA reset */
 
 	PDC_COMMON_FLAGS	= ATA_FLAG_NO_LEGACY |

- ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI |
+ ATA_FLAG_MMIO |
  ATA_FLAG_PIO_POLLING,
 
 	/* hp-flags bits */

@@ -105,6 +106,7 @@ static void pdc_pata_phy_reset(struct at
 static void pdc_qc_prep(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile 
*tf);
 static void pdc_exec_command_mmio(struct ata_port *ap, const struct 
ata_taskfile *tf);
+static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
 static void pdc_irq_clear(struct ata_port *ap);
 static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc);
 static void pdc_host_stop(struct ata_host *host);
@@ -139,6 +141,7 @@ static const struct ata_port_operations 
 	.check_status		= ata_check_status,

.exec_command   = pdc_exec_command_mmio,
.dev_select = ata_std_dev_select,
+   .check_atapi_dma= pdc_check_atapi_dma,
 
 	.qc_prep		= pdc_qc_prep,

.qc_issue   = pdc_qc_issue_prot,
@@ -164,6 +167,7 @@ static const struct ata_port_operations 
 	.check_status		= ata_check_status,

.exec_command   = pdc_exec_command_mmio,
.dev_select = ata_std_dev_select,
+   .check_atapi_dma= pdc_check_atapi_dma,
 
 	.phy_reset		= pdc_pata_phy_reset,
 
@@ -183,7 +187,7 @@ static const struct ata_port_info pdc_po

/* board_2037x */
{
.sht= pdc_ata_sht,
-   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_NO_ATAPI | 
ATA_FLAG_SATA,
.pio_mask   = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask  = 0x7f, /* udma0-6 ; FIXME */
@@ -193,7 +197,7 @@ static const struct ata_port_info pdc_po
/* board_20319 */
{
.sht= pdc_ata_sht,
-   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_NO_ATAPI | 
ATA_FLAG_SATA,
.pio_mask   = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask  = 0x7f, /* udma0-6 ; FIXME */
@@ -391,6 +395,30 @@ static void pdc_sata_scr_write (struct a
writel(val, (void __iomem *) ap-ioaddr.scr_addr + (sc_reg * 4));
 }
 
+static void pdc_atapi_dma_pkt(struct ata_taskfile *tf,

+ dma_addr_t sg_table,
+ unsigned int cdb_len, u8 *cdb,
+ u8 *buf)
+{
+   u32 *buf32 = (u32 *) buf;
+
+   /* set control bits (byte 0), zero delay 

[PATCH 2.6.20-rc3] sata_promise: ATAPI support

2007-01-06 Thread Mikael Pettersson
This patch adds ATAPI support to the sata_promise driver.
This has been tested on both first- and second-generation
chips (20378 and 20575), and with both SATAPI and PATAPI
devices. CD-writing works, and bulk data transfers use DMA.

SATAPI works on second-generation chips, but not on
first-generation chips due to HW limitations.
PATAPI works on both first- and second-generation chips,
but requires the PATA support patch as well (which needs
an update due to a conflict in the board_2037x definition).

The functional changes to the driver are:
- remove ATA_FLAG_NO_ATAPI from PDC_COMMON_FLAGS, and add it
  back to the boards that cannot support SATAPI (20319, 2037x)
- add ->check_atapi() operation to enable DMA for bulk data
  transfers but force PIO for other ATAPI commands; this filter
  is taken from Promise's driver and pata_pdc207x.c
- add handling of ATAPI protocols to pdc_qc_prep(), pdc_host_intr(),
  and pdc_qc_issue_prot(): ATAPI_DMA is handled by the driver
  while non-DMA protocols are handed over to libata generic code
- add pdc_issue_atapi_pkt_cmd() to handle the initial steps in
  issuing ATAPI DMA commands before sending the actual CDB;
  this procedure was ported from Promise's driver

With this patch ATAPI will work on SATA ports on second-generation
chips, and on the first-generation PATA-only 20619. ATAPI on the
2057x' PATA port will work automatically when #promise-sata-pata
is updated. ATAPI on the 2037x' PATA port is enabled by a followup
patch for the #promise-sata-pata branch.

Signed-off-by: Mikael Pettersson <[EMAIL PROTECTED]>

--- linux-2.6.20-rc3/drivers/ata/sata_promise.c.~1~ 2007-01-01 
13:32:35.0 +0100
+++ linux-2.6.20-rc3/drivers/ata/sata_promise.c 2007-01-06 15:36:43.0 
+0100
@@ -39,6 +39,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -77,7 +78,7 @@ enum {
PDC_RESET   = (1 << 11), /* HDMA reset */
 
PDC_COMMON_FLAGS= ATA_FLAG_NO_LEGACY |
- ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI |
+ ATA_FLAG_MMIO |
  ATA_FLAG_PIO_POLLING,
 
/* hp->flags bits */
@@ -105,6 +106,7 @@ static void pdc_pata_phy_reset(struct at
 static void pdc_qc_prep(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile 
*tf);
 static void pdc_exec_command_mmio(struct ata_port *ap, const struct 
ata_taskfile *tf);
+static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
 static void pdc_irq_clear(struct ata_port *ap);
 static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc);
 static void pdc_host_stop(struct ata_host *host);
@@ -139,6 +141,7 @@ static const struct ata_port_operations 
.check_status   = ata_check_status,
.exec_command   = pdc_exec_command_mmio,
.dev_select = ata_std_dev_select,
+   .check_atapi_dma= pdc_check_atapi_dma,
 
.qc_prep= pdc_qc_prep,
.qc_issue   = pdc_qc_issue_prot,
@@ -164,6 +167,7 @@ static const struct ata_port_operations 
.check_status   = ata_check_status,
.exec_command   = pdc_exec_command_mmio,
.dev_select = ata_std_dev_select,
+   .check_atapi_dma= pdc_check_atapi_dma,
 
.phy_reset  = pdc_pata_phy_reset,
 
@@ -183,7 +187,7 @@ static const struct ata_port_info pdc_po
/* board_2037x */
{
.sht= _ata_sht,
-   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_NO_ATAPI | 
ATA_FLAG_SATA,
.pio_mask   = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask  = 0x7f, /* udma0-6 ; FIXME */
@@ -193,7 +197,7 @@ static const struct ata_port_info pdc_po
/* board_20319 */
{
.sht= _ata_sht,
-   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_NO_ATAPI | 
ATA_FLAG_SATA,
.pio_mask   = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask  = 0x7f, /* udma0-6 ; FIXME */
@@ -391,6 +395,30 @@ static void pdc_sata_scr_write (struct a
writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4));
 }
 
+static void pdc_atapi_dma_pkt(struct ata_taskfile *tf,
+ dma_addr_t sg_table,
+ unsigned int cdb_len, u8 *cdb,
+ u8 *buf)
+{
+   u32 *buf32 = (u32 *) buf;
+
+   /* set control bits (byte 0), zero delay seq id (byte 3),
+* and seq id (byte 2)
+*/
+   if (!(tf->flags & ATA_TFLAG_WRITE))
+   buf32[0] = cpu_to_le32(PDC_PKT_READ);
+   else
+   

[PATCH 2.6.20-rc3] sata_promise: ATAPI support

2007-01-06 Thread Mikael Pettersson
This patch adds ATAPI support to the sata_promise driver.
This has been tested on both first- and second-generation
chips (20378 and 20575), and with both SATAPI and PATAPI
devices. CD-writing works, and bulk data transfers use DMA.

SATAPI works on second-generation chips, but not on
first-generation chips due to HW limitations.
PATAPI works on both first- and second-generation chips,
but requires the PATA support patch as well (which needs
an update due to a conflict in the board_2037x definition).

The functional changes to the driver are:
- remove ATA_FLAG_NO_ATAPI from PDC_COMMON_FLAGS, and add it
  back to the boards that cannot support SATAPI (20319, 2037x)
- add -check_atapi() operation to enable DMA for bulk data
  transfers but force PIO for other ATAPI commands; this filter
  is taken from Promise's driver and pata_pdc207x.c
- add handling of ATAPI protocols to pdc_qc_prep(), pdc_host_intr(),
  and pdc_qc_issue_prot(): ATAPI_DMA is handled by the driver
  while non-DMA protocols are handed over to libata generic code
- add pdc_issue_atapi_pkt_cmd() to handle the initial steps in
  issuing ATAPI DMA commands before sending the actual CDB;
  this procedure was ported from Promise's driver

With this patch ATAPI will work on SATA ports on second-generation
chips, and on the first-generation PATA-only 20619. ATAPI on the
2057x' PATA port will work automatically when #promise-sata-pata
is updated. ATAPI on the 2037x' PATA port is enabled by a followup
patch for the #promise-sata-pata branch.

Signed-off-by: Mikael Pettersson [EMAIL PROTECTED]

--- linux-2.6.20-rc3/drivers/ata/sata_promise.c.~1~ 2007-01-01 
13:32:35.0 +0100
+++ linux-2.6.20-rc3/drivers/ata/sata_promise.c 2007-01-06 15:36:43.0 
+0100
@@ -39,6 +39,7 @@
 #include linux/interrupt.h
 #include linux/sched.h
 #include linux/device.h
+#include scsi/scsi.h
 #include scsi/scsi_host.h
 #include scsi/scsi_cmnd.h
 #include linux/libata.h
@@ -77,7 +78,7 @@ enum {
PDC_RESET   = (1  11), /* HDMA reset */
 
PDC_COMMON_FLAGS= ATA_FLAG_NO_LEGACY |
- ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI |
+ ATA_FLAG_MMIO |
  ATA_FLAG_PIO_POLLING,
 
/* hp-flags bits */
@@ -105,6 +106,7 @@ static void pdc_pata_phy_reset(struct at
 static void pdc_qc_prep(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile 
*tf);
 static void pdc_exec_command_mmio(struct ata_port *ap, const struct 
ata_taskfile *tf);
+static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
 static void pdc_irq_clear(struct ata_port *ap);
 static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc);
 static void pdc_host_stop(struct ata_host *host);
@@ -139,6 +141,7 @@ static const struct ata_port_operations 
.check_status   = ata_check_status,
.exec_command   = pdc_exec_command_mmio,
.dev_select = ata_std_dev_select,
+   .check_atapi_dma= pdc_check_atapi_dma,
 
.qc_prep= pdc_qc_prep,
.qc_issue   = pdc_qc_issue_prot,
@@ -164,6 +167,7 @@ static const struct ata_port_operations 
.check_status   = ata_check_status,
.exec_command   = pdc_exec_command_mmio,
.dev_select = ata_std_dev_select,
+   .check_atapi_dma= pdc_check_atapi_dma,
 
.phy_reset  = pdc_pata_phy_reset,
 
@@ -183,7 +187,7 @@ static const struct ata_port_info pdc_po
/* board_2037x */
{
.sht= pdc_ata_sht,
-   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_NO_ATAPI | 
ATA_FLAG_SATA,
.pio_mask   = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask  = 0x7f, /* udma0-6 ; FIXME */
@@ -193,7 +197,7 @@ static const struct ata_port_info pdc_po
/* board_20319 */
{
.sht= pdc_ata_sht,
-   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+   .flags  = PDC_COMMON_FLAGS | ATA_FLAG_NO_ATAPI | 
ATA_FLAG_SATA,
.pio_mask   = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask  = 0x7f, /* udma0-6 ; FIXME */
@@ -391,6 +395,30 @@ static void pdc_sata_scr_write (struct a
writel(val, (void __iomem *) ap-ioaddr.scr_addr + (sc_reg * 4));
 }
 
+static void pdc_atapi_dma_pkt(struct ata_taskfile *tf,
+ dma_addr_t sg_table,
+ unsigned int cdb_len, u8 *cdb,
+ u8 *buf)
+{
+   u32 *buf32 = (u32 *) buf;
+
+   /* set control bits (byte 0), zero delay seq id (byte 3),
+* and seq id (byte 2)
+*/
+   if (!(tf-flags