public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Enable reads on Plextor 712-SA on 2.6.11.5
@ 2005-05-19  0:29 Andy Stewart
  0 siblings, 0 replies; only message in thread
From: Andy Stewart @ 2005-05-19  0:29 UTC (permalink / raw)
  To: linux-kernel

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


This patch enables mount, umount, and read operations on the Plextor
712SA SATA DVD burner  Write operations still do not work for me.  Apply
this patch to linux-2.6.11.5.  I hope it works for you, too.  At least
you'll be able to read stuff.

To make this work, be sure that the "deprecated" SATA code is disabled
and that libata is enabled.

I certify that this is my original work and that I am pefectly OK with
this code being covered under the GPL if included into the Linux kernel.

If this code stinks, please tell me why so I can do better next time.
:-)  This is my first patch submission.


**************************************************************************
- --- linux-2.6.11.5/include/linux/libata.h       2005-03-19
01:34:50.000000000 -0500
+++ linux-2.6.11.5/include/linux/libata.h       2005-04-02
14:49:45.000000000 -0500
@@ -37,7 +37,7 @@
 #undef ATA_VERBOSE_DEBUG       /* yet more debugging output */
 #undef ATA_IRQ_TRAP            /* define to ack screaming irqs */
 #undef ATA_NDEBUG              /* define to disable quick runtime checks */
- -#undef ATA_ENABLE_ATAPI                /* define to enable ATAPI
support */
+#define ATA_ENABLE_ATAPI       /* define to enable ATAPI support */
 #undef ATA_ENABLE_PATA         /* define to enable PATA support in some
                                 * low-level drivers */
 #undef ATAPI_ENABLE_DMADIR     /* enables ATAPI DMADIR bridge support */

- --- linux-2.6.11.5/drivers/scsi/libata-scsi.c   2005-03-19
01:34:55.000000000 -0500
+++ linux-2.6.11.5/drivers/scsi/libata-scsi.c   2005-04-17
00:54:29.000000000 -0400
@@ -798,6 +802,66 @@
 }

 /**
+ *     atapi_scsiop_inq_std - Simulate INQUIRY command
+ *     @args: device IDENTIFY data / SCSI command of interest.
+ *     @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
+ *     @buflen: Response buffer length.
+ *
+ *     Returns standard device identification data associated
+ *     with non-EVPD INQUIRY command output.
+ *
+ *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
+ */
+
+unsigned int atapi_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf,
+                                 unsigned int buflen)
+{
+/*        printk(KERN_INFO "AMS_HACK_ALERT - got to
atapi_scsiop_inq_std()\n"); */
+
+       u8 hdr[] = {
+         TYPE_ROM, /* CD-ROM device */
+         0,        /* removeable media - set later... */
+         0x5,      /* claim SPC-3 version compatibility */
+         2,        /* response data format */
+         95 - 4
+       };
+
+       /* set scsi removeable (RMB) bit per ata bit */
+       if (ata_id_removeable(args->id))
+               hdr[1] |= (1 << 7);
+
+       VPRINTK("ENTER\n");
+
+       memcpy(rbuf, hdr, sizeof(hdr));
+
+       if (buflen > 35) {
+               memcpy(&rbuf[8], "ATAPI   ", 8);
+               ata_dev_id_string(args->id, &rbuf[16], ATA_ID_PROD_OFS, 16);
+               ata_dev_id_string(args->id, &rbuf[32],
ATA_ID_FW_REV_OFS, 4);
+               if (rbuf[32] == 0 || rbuf[32] == ' ')
+                       memcpy(&rbuf[32], "n/a ", 4);
+       }
+
+       if (buflen > 63) {
+               const u8 versions[] = {
+                       0x60,   /* SAM-3 (no version claimed) */
+
+                       0x03,
+                       0x20,   /* SBC-2 (no version claimed) */
+
+                       0x02,
+                       0x60    /* SPC-3 (no version claimed) */
+               };
+
+               memcpy(rbuf + 59, versions, sizeof(versions));
+       }
+
+/*        printk(KERN_INFO "AMS_HACK_ALERT - leaving
atapi_scsiop_inq_std()\n"); */
+       return 0;
+}
+
+/**
  *     ata_scsiop_inq_std - Simulate INQUIRY command
  *     @args: device IDENTIFY data / SCSI command of interest.
  *     @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
@@ -1473,6 +1544,7 @@
        struct ata_port *ap;
        struct ata_device *dev;
        struct scsi_device *scsidev = cmd->device;
+       struct ata_scsi_args args;

        ap = (struct ata_port *) &scsidev->host->hostdata[0];

@@ -1493,8 +1565,41 @@
                        ata_scsi_translate(ap, dev, cmd, done, xlat_func);
                else
                        ata_scsi_simulate(dev->id, cmd, done);
- -       } else
- -               ata_scsi_translate(ap, dev, cmd, done, atapi_xlat);
+       } else {
+/*             printk(KERN_INFO "AMS_HACK_ALERT - ata_scsi_queuecmd(),
for non-ATA_DEV_ATA class\n"); */
+               u8 *scsicmd = cmd->cmnd;
+/*                printk(KERN_INFO "AMS_HACK_ALERT - CDB (%u:%d,%d,%d)
%02x %02x %02x %02x %02x %02x %02x %02x %02x\n", */
+/*                    ap->id, */
+/*                    scsidev->channel, scsidev->id, scsidev->lun, */
+/*                    scsicmd[0], scsicmd[1], scsicmd[2], scsicmd[3], */
+/*                    scsicmd[4], scsicmd[5], scsicmd[6], scsicmd[7], */
+/*                    scsicmd[8]); */
+               /* begin AMS HACK */
+               if (scsicmd[0] == INQUIRY) {
+/*               printk(KERN_INFO "AMS_HACK_ALERT - got to new_andy
hack for ATAPI devices - its a SCSI INQUIRY\n"); */
+                 args.id = dev->id;
+                 args.cmd = cmd;
+                 args.done = done;
+
+                 if (scsicmd[1] & 2)              /* is CmdDt set?  */
+                   ata_bad_cdb(cmd, done);
+                 else if ((scsicmd[1] & 1) == 0)    /* is EVPD clear? */
+                   ata_scsi_rbuf_fill(&args, atapi_scsiop_inq_std);
+/*               else if (scsicmd[2] == 0x00) */
+/*                 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_00); */
+/*               else if (scsicmd[2] == 0x80) */
+/*                 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_80); */
+/*               else if (scsicmd[2] == 0x83) */
+/*                 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_83); */
+                 else
+                   ata_bad_cdb(cmd, done);
+               }
+               else {
+/*               printk(KERN_INFO "AMS_HACK_ALERT - got to new_andy
hack for ATAPI devices - calling ata_scsi_translate\n"); */
+                 ata_scsi_translate(ap, dev, cmd, done, atapi_xlat);
+               }
+               /* end AMS HACK */
+       }

 out_unlock:
        return 0;


- --
Andy Stewart, Founder
Worcester Linux Users' Group
Worcester, MA, USA
http://www.wlug.org

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFCi93qHl0iXDssISsRAsUDAJ4zX1nzAfyg+G14vSR78fB0NOYNOQCeNJDs
oHhW9E225T+IaXWtCw6uGfo=
=yrjD
-----END PGP SIGNATURE-----

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2005-05-19  0:30 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-05-19  0:29 [PATCH] Enable reads on Plextor 712-SA on 2.6.11.5 Andy Stewart

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox