2.0.35(or 36) ではなぜか PD が常に read only で認識されるという問題が あります。これを回避するためには、kernel source の drivers/scsi/ide-scsi.c の 150-200 行目のあたりを 2.0.33 と同じにする ことが必要なようです。この方法ではもしかしたらなにか問題があるの かもしれませんが、少くともうちでは安定動作しています。 以下は、2.0.35 (or 36) で ATAPI-PD を使う patch です。fj.os.linux で高 垣さんというかたが、2.0.34 用の patch を公開されてた [1] のですが、 なぜかうまくあてられなかったので、それを参考にして作りました。
以下を切り取って、ide-scsi.c.diff とでも名付けて保存して、 drivers/scsi/ で、
$ patch < ide-scsi.c.diff |
などとしてあててください。あとは 1 章に従って make するだけです。
--------- ここから ----------- *** linux/drivers/scsi/ide-scsi.c.35.org Mon Nov 16 21:45:00 1998 --- linux/drivers/scsi/ide-scsi.c Tue Nov 17 05:07:21 1998 *************** *** 156,162 **** static inline void idescsi_transform_pc1 (ide_drive_t *drive, idescsi_pc_t *pc) { idescsi_scsi_t *scsi = drive->scsi; ! u8 *c = pc->c; if (scsi->media == TYPE_ROM) { if (c[0] == READ_6 || c[0] == WRITE_6) { --- 156,163 ---- static inline void idescsi_transform_pc1 (ide_drive_t *drive, idescsi_pc_t *pc) { idescsi_scsi_t *scsi = drive->scsi; ! u8 *c = pc->c, *buf = pc->buffer, *sc = pc->scsi_cmd->cmnd; ! int i; if (scsi->media == TYPE_ROM) { if (c[0] == READ_6 || c[0] == WRITE_6) { *************** *** 164,169 **** --- 165,178 ---- c[3] = c[1] & 0x1f; c[2] = 0; c[1] &= 0xe0; c[0] += (READ_10 - READ_6); } + if (c[0] == MODE_SENSE || (c[0] == MODE_SELECT && buf[3] == 8)) { + pc->request_transfer -= 4; + memset (c, 0, 12); + c[0] = sc[0] | 0x40;c[2] = sc[2];c[8] = sc[4] - 4; + if (c[0] == MODE_SENSE_10) return; + for (i = 0; i <= 7; i++) buf[i] = 0; + for (i = 8; i < pc->buffer_size - 4; i++) buf[i] = buf[i + 4]; + } } } *************** *** 171,181 **** { idescsi_scsi_t *scsi = drive->scsi; u8 *buf = pc->buffer; if (scsi->media == TYPE_ROM) { ! if (pc->c[0] == INQUIRY) ! buf[2] |= 2; ! } } static inline void idescsi_free_bh (struct buffer_head *bh) --- 180,198 ---- { idescsi_scsi_t *scsi = drive->scsi; u8 *buf = pc->buffer; + int i; if (scsi->media == TYPE_ROM) { ! if (pc->c[0] == MODE_SENSE_10 && pc->scsi_cmd->cmnd[0] == MODE_SENSE) { ! buf[0] = buf[1];buf[1] = buf[2]; ! buf[2] = 0;buf[3] = 8; ! for (i = pc->buffer_size - 1; i >= 12; i--) ! buf[i] = buf[i - 4]; ! for (i = 11; i >= 4; i--) buf[i] = 0; ! } ! if (pc->c[0] == INQUIRY) ! buf[2] |= 2; ! } } static inline void idescsi_free_bh (struct buffer_head *bh) --------- ここまで ----------- |
[1] | fj.os.linux |