=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/cdio/mmc.c,v retrieving revision 1.7 retrieving revision 1.8 diff -c -r1.7 -r1.8 *** src/usr.bin/cdio/mmc.c 2006/06/01 07:53:01 1.7 --- src/usr.bin/cdio/mmc.c 2006/06/06 20:48:07 1.8 *************** *** 1,4 **** ! /* $OpenBSD: mmc.c,v 1.7 2006/06/01 07:53:01 deraadt Exp $ */ /* * Copyright (c) 2006 Michael Coulter --- 1,4 ---- ! /* $OpenBSD: mmc.c,v 1.8 2006/06/06 20:48:07 mjc Exp $ */ /* * Copyright (c) 2006 Michael Coulter *************** *** 19,24 **** --- 19,27 ---- #include #include #include + #include + #include + #include #include #include #include *************** *** 33,45 **** int blank(void) { scsireq_t scr; int r; bzero(&scr, sizeof(scr)); ! scr.cmd[0] = 0xa1; ! scr.cmd[1] = 0x01; ! scr.cmdlen = 12; scr.datalen = 0; scr.timeout = 120000; scr.flags = SCCMD_ESCAPE; --- 36,50 ---- int blank(void) { + struct scsi_blank *scb; scsireq_t scr; int r; bzero(&scr, sizeof(scr)); ! scb = (struct scsi_blank *)scr.cmd; ! scb->opcode = BLANK; ! scb->byte2 |= BLANK_MINIMAL; ! scr.cmdlen = sizeof(*scb); scr.datalen = 0; scr.timeout = 120000; scr.flags = SCCMD_ESCAPE; *************** *** 59,70 **** int unit_ready(void) { scsireq_t scr; int r; bzero(&scr, sizeof(scr)); ! scr.cmd[0] = 0x00; ! scr.cmdlen = 6; scr.datalen = 0; scr.timeout = 120000; scr.flags = SCCMD_ESCAPE; --- 64,77 ---- int unit_ready(void) { + struct scsi_test_unit_ready *scb; scsireq_t scr; int r; bzero(&scr, sizeof(scr)); ! scb = (struct scsi_test_unit_ready *)scr.cmd; ! scb->opcode = TEST_UNIT_READY; ! scr.cmdlen = sizeof(*scb); scr.datalen = 0; scr.timeout = 120000; scr.flags = SCCMD_ESCAPE; *************** *** 77,88 **** int synchronize_cache(void) { scsireq_t scr; int r; bzero(&scr, sizeof(scr)); ! scr.cmd[0] = 0x35; ! scr.cmdlen = 10; scr.datalen = 0; scr.timeout = 120000; scr.flags = SCCMD_ESCAPE; --- 84,97 ---- int synchronize_cache(void) { + struct scsi_synchronize_cache *scb; scsireq_t scr; int r; bzero(&scr, sizeof(scr)); ! scb = (struct scsi_synchronize_cache *)scr.cmd; ! scb->opcode = SYNCHRONIZE_CACHE; ! scr.cmdlen = sizeof(*scb); scr.datalen = 0; scr.timeout = 120000; scr.flags = SCCMD_ESCAPE; *************** *** 95,108 **** int close_session(void) { scsireq_t scr; int r; bzero(&scr, sizeof(scr)); ! scr.cmd[0] = 0x5b; ! scr.cmd[2] = 0x02; /* close session */ ! scr.cmd[5] = 0x00; /* track number */ ! scr.cmdlen = 10; scr.datalen = 0; scr.timeout = 120000; scr.flags = SCCMD_ESCAPE; --- 104,118 ---- int close_session(void) { + struct scsi_close_track *scb; scsireq_t scr; int r; bzero(&scr, sizeof(scr)); ! scb = (struct scsi_close_track *)scr.cmd; ! scb->opcode = CLOSE_TRACK; ! scb->closefunc = CT_CLOSE_SESS; ! scr.cmdlen = sizeof(*scb); scr.datalen = 0; scr.timeout = 120000; scr.flags = SCCMD_ESCAPE; *************** *** 233,250 **** int mode_sense_write(unsigned char buf[]) { scsireq_t scr; int r; bzero(&scr, sizeof(scr)); scr.timeout = 4000; scr.senselen = SENSEBUFLEN; - scr.cmd[0] = 0x5a; - scr.cmd[1] = 0x00; - scr.cmd[2] = 0x05; /* Write parameters mode page */ - scr.cmd[7] = 0x00; - scr.cmd[8] = 0x46; /* 16 for the header + size from pg. 89 mmc-r10a.pdf */ - scr.cmdlen = 10; scr.datalen= 0x46; scr.flags = SCCMD_ESCAPE|SCCMD_READ; scr.databuf = (caddr_t)buf; --- 243,261 ---- int mode_sense_write(unsigned char buf[]) { + struct scsi_mode_sense_big *scb; scsireq_t scr; int r; bzero(&scr, sizeof(scr)); + scb = (struct scsi_mode_sense_big *)scr.cmd; + scb->opcode = MODE_SENSE_BIG; + /* XXX: need to set disable block descriptors and check SCSI drive */ + scb->page = WRITE_PARAM_PAGE; + scb->length[1] = 0x46; /* 16 for the header + size from pg. 89 mmc-r10a.pdf */ + scr.cmdlen = sizeof(*scb); scr.timeout = 4000; scr.senselen = SENSEBUFLEN; scr.datalen= 0x46; scr.flags = SCCMD_ESCAPE|SCCMD_READ; scr.databuf = (caddr_t)buf; *************** *** 256,273 **** int mode_select_write(unsigned char buf[]) { scsireq_t scr; int r; bzero(&scr, sizeof(scr)); scr.timeout = 4000; scr.senselen = SENSEBUFLEN; ! scr.cmd[0] = 0x55; ! scr.cmd[1] = 0x10; /* pages aren't vendor specific */ ! scr.cmd[2] = 0x00; ! scr.cmd[7] = 0x00; ! scr.cmd[8] = 2 + buf[1] + 256 * buf[0]; ! scr.cmdlen = 10; scr.datalen = 2 + buf[1] + 256 * buf[0]; scr.flags = SCCMD_ESCAPE|SCCMD_WRITE; scr.databuf = (caddr_t)buf; --- 267,289 ---- int mode_select_write(unsigned char buf[]) { + struct scsi_mode_select_big *scb; scsireq_t scr; int r; bzero(&scr, sizeof(scr)); + scb = (struct scsi_mode_select_big *)scr.cmd; + scb->opcode = MODE_SELECT_BIG; + /* + * INF-8020 says bit 4 in byte 2 is '1' + * INF-8090 refers to it as 'PF(1)' then doesn't + * describe it. + */ + scb->byte2 = 0x10; + scb->length[1] = 2 + buf[1] + 256 * buf[0]; scr.timeout = 4000; scr.senselen = SENSEBUFLEN; ! scr.cmdlen = sizeof(*scb); scr.datalen = 2 + buf[1] + 256 * buf[0]; scr.flags = SCCMD_ESCAPE|SCCMD_WRITE; scr.databuf = (caddr_t)buf; *************** *** 280,297 **** get_disc_size(off_t *availblk) { u_char databuf[28]; scsireq_t scr; int r,tmp; bzero(&scr, sizeof(scr)); scr.timeout = 4000; scr.senselen = SENSEBUFLEN; ! scr.cmd[0] = 0x52; /* READ TRACK INFO */ ! scr.cmd[1] = 0x01; ! scr.cmd[5] = 0x01; /* Track 01 */ ! scr.cmd[7] = 0x00; ! scr.cmd[8] = 0x1c; ! scr.cmdlen = 10; scr.datalen= 0x1c; scr.flags = SCCMD_ESCAPE|SCCMD_READ; scr.databuf = (caddr_t)databuf; --- 296,314 ---- get_disc_size(off_t *availblk) { u_char databuf[28]; + struct scsi_read_track_info *scb; scsireq_t scr; int r,tmp; bzero(&scr, sizeof(scr)); + scb = (struct scsi_read_track_info *)scr.cmd; scr.timeout = 4000; scr.senselen = SENSEBUFLEN; ! scb->opcode = READ_TRACK_INFO; ! scb->addrtype = RTI_TRACK; ! scb->addr[1] = 1; ! scb->data_len[3] = 0x1c; ! scr.cmdlen = sizeof(*scb); scr.datalen= 0x1c; scr.flags = SCCMD_ESCAPE|SCCMD_READ; scr.databuf = (caddr_t)databuf;