diff -Nrup linux-2.6.20.3/drivers/ata/libata-scsi.c linux-2.6.20.3-mod/drivers/ata/libata-scsi.c --- linux-2.6.20.3/drivers/ata/libata-scsi.c 2007-03-14 02:27:08.000000000 +0800 +++ linux-2.6.20.3-mod/drivers/ata/libata-scsi.c 2007-03-27 17:26:58.000000000 +0800 @@ -2384,6 +2384,21 @@ static void atapi_qc_complete(struct ata qc->scsidone(cmd); ata_qc_free(qc); } + +static inline void ata_scsi_dump_cdb2(struct ata_port *ap, + struct scsi_cmnd *cmd) +{ + struct scsi_device *scsidev = cmd->device; + u8 *scsicmd = cmd->cmnd; + + printk(KERN_ERR "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]); +} + /** * atapi_xlat - Initialize PACKET taskfile * @qc: command structure to be initialized @@ -2400,6 +2415,27 @@ static unsigned int atapi_xlat(struct at struct ata_device *dev = qc->dev; int using_pio = (dev->flags & ATA_DFLAG_PIO); int nodata = (scmd->sc_data_direction == DMA_NONE); + struct ata_port *ap = qc->ap; + + if (ap->id == 2 || ap->id == 4) { + u8 *scsicmd = scmd->cmnd; + + switch (scsicmd[0]) { + case 0x12: /* INQUIRY */ + ata_scsi_dump_cdb2(ap, scmd); + + /* filter out INQUIRY with EVPD */ + if (scsicmd[1] & 0x01) + goto invalid_fld; + break; + case 0x46: /* GET_CONFIGURATION */ + case 0x51: /* READ_DISC_INFO */ + case 0x5a: /* MODE_SENSE_10 */ + + ata_scsi_dump_cdb2(ap, scmd); + //goto invalid_fld; + } + } if (!using_pio) /* Check whether ATAPI DMA is safe */ @@ -2442,6 +2478,11 @@ static unsigned int atapi_xlat(struct at qc->nbytes = scmd->request_bufflen; return 0; + +invalid_fld: + ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0); + /* "Invalid field in cbd" */ + return 1; } static struct ata_device * ata_find_dev(struct ata_port *ap, int id)