From pirzyk@pirzyk.org Wed Oct 9 22:39:40 2002 Return-Path: Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 21BAA37B401 for ; Wed, 9 Oct 2002 22:39:40 -0700 (PDT) Received: from pirzyk.org (dsl-65-184-181-29.telocity.com [65.184.181.29]) by mx1.FreeBSD.org (Postfix) with ESMTP id 3849343E75 for ; Wed, 9 Oct 2002 22:39:38 -0700 (PDT) (envelope-from pirzyk@pirzyk.org) Received: from zephyr.pirzyk.org (localhost [127.0.0.1]) by pirzyk.org (8.12.3/8.12.3) with ESMTP id g9A5b9Fb000476 for ; Wed, 9 Oct 2002 22:37:10 -0700 (PDT) (envelope-from pirzyk@zephyr.pirzyk.org) Received: (from pirzyk@localhost) by zephyr.pirzyk.org (8.12.3/8.12.3/Submit) id g9A5b94U000475; Wed, 9 Oct 2002 22:37:09 -0700 (PDT) Message-Id: <200210100537.g9A5b94U000475@zephyr.pirzyk.org> Date: Wed, 9 Oct 2002 22:37:09 -0700 (PDT) From: Jim Pirzyk Reply-To: Jim Pirzyk To: FreeBSD-gnats-submit@freebsd.org Cc: Subject: USB CDROM does not work with vmware 2.x X-Send-Pr-Version: 3.113 X-GNATS-Notify: >Number: 43885 >Category: kern >Synopsis: [patch] USB CDROM does not work with vmware 2.x >Confidential: no >Severity: serious >Priority: medium >Responsible: ken >State: closed >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Oct 09 22:40:00 PDT 2002 >Closed-Date: Tue Jan 04 07:09:38 GMT 2005 >Last-Modified: Tue Jan 04 07:09:38 GMT 2005 >Originator: Jim Pirzyk >Release: FreeBSD 4.6.2-RELEASE i386 >Organization: >Environment: System: FreeBSD zephyr.pirzyk.org 4.6.2-RELEASE FreeBSD 4.6.2-RELEASE #0: Fri Aug 16 09:46:23 PDT 2002 root@zephyr.pirzyk.org:/usr/src/sys/compile/ZEPHYR_KERNEL i386 >Description: when using a USB CDROM drive, vmware cannot query the drive for sense mode information. The scsi_cd.c call uses 10 byte read/write commands but uses a 6 byte mode sense command. This confuses the IDE CDROM drive that is behind a USB interface. >How-To-Repeat: install vmware, try to use it with the USB CDROM drive. >Fix: Convert the cdgetmode to use the 10 byte mode_sense command instead. *** sys/cam/scsi/scsi_cd.c.orig Wed Oct 2 23:14:41 2002 --- sys/cam/scsi/scsi_cd.c Thu Oct 3 21:47:41 2002 *************** *** 2768,2774 **** static int cdgetmode(struct cam_periph *periph, struct cd_mode_data *data, u_int32_t page) { ! struct scsi_mode_sense_6 *scsi_cmd; struct ccb_scsiio *csio; union ccb *ccb; int error; --- 2768,2774 ---- static int cdgetmode(struct cam_periph *periph, struct cd_mode_data *data, u_int32_t page) { ! struct scsi_mode_sense_10 *scsi_cmd; struct ccb_scsiio *csio; union ccb *ccb; int error; *************** *** 2786,2800 **** /* data_ptr */ (u_int8_t *)data, /* dxfer_len */ sizeof(*data), /* sense_len */ SSD_FULL_SIZE, ! sizeof(struct scsi_mode_sense_6), /* timeout */ 50000); ! scsi_cmd = (struct scsi_mode_sense_6 *)&csio->cdb_io.cdb_bytes; bzero (scsi_cmd, sizeof(*scsi_cmd)); scsi_cmd->page = page; ! scsi_cmd->length = sizeof(*data) & 0xff; ! scsi_cmd->opcode = MODE_SENSE; error = cdrunccb(ccb, cderror, /*cam_flags*/0, /*sense_flags*/SF_RETRY_UA|SF_RETRY_SELTO); --- 2786,2801 ---- /* data_ptr */ (u_int8_t *)data, /* dxfer_len */ sizeof(*data), /* sense_len */ SSD_FULL_SIZE, ! sizeof(struct scsi_mode_sense_10), /* timeout */ 50000); ! scsi_cmd = (struct scsi_mode_sense_10 *)&csio->cdb_io.cdb_bytes; bzero (scsi_cmd, sizeof(*scsi_cmd)); scsi_cmd->page = page; ! scsi_cmd->length[0] = (sizeof(*data)) >> 8; ! scsi_cmd->length[1] = (sizeof(*data)) & 0xff; ! scsi_cmd->opcode = MODE_SENSE_10; error = cdrunccb(ccb, cderror, /*cam_flags*/0, /*sense_flags*/SF_RETRY_UA|SF_RETRY_SELTO); *************** *** 2807,2813 **** static int cdsetmode(struct cam_periph *periph, struct cd_mode_data *data) { ! struct scsi_mode_select_6 *scsi_cmd; struct ccb_scsiio *csio; union ccb *ccb; int error; --- 2808,2814 ---- static int cdsetmode(struct cam_periph *periph, struct cd_mode_data *data) { ! struct scsi_mode_select_10 *scsi_cmd; struct ccb_scsiio *csio; union ccb *ccb; int error; *************** *** 2826,2840 **** /* data_ptr */ (u_int8_t *)data, /* dxfer_len */ sizeof(*data), /* sense_len */ SSD_FULL_SIZE, ! sizeof(struct scsi_mode_select_6), /* timeout */ 50000); ! scsi_cmd = (struct scsi_mode_select_6 *)&csio->cdb_io.cdb_bytes; bzero(scsi_cmd, sizeof(*scsi_cmd)); scsi_cmd->opcode = MODE_SELECT; scsi_cmd->byte2 |= SMS_PF; ! scsi_cmd->length = sizeof(*data) & 0xff; data->header.data_length = 0; /* * SONY drives do not allow a mode select with a medium_type --- 2827,2842 ---- /* data_ptr */ (u_int8_t *)data, /* dxfer_len */ sizeof(*data), /* sense_len */ SSD_FULL_SIZE, ! sizeof(struct scsi_mode_select_10), /* timeout */ 50000); ! scsi_cmd = (struct scsi_mode_select_10 *)&csio->cdb_io.cdb_bytes; bzero(scsi_cmd, sizeof(*scsi_cmd)); scsi_cmd->opcode = MODE_SELECT; scsi_cmd->byte2 |= SMS_PF; ! scsi_cmd->length[0] = (sizeof(*data)) >> 8; ! scsi_cmd->length[1] = (sizeof(*data)) & 0xff; data->header.data_length = 0; /* * SONY drives do not allow a mode select with a medium_type >Release-Note: >Audit-Trail: Responsible-Changed-From-To: freebsd-bugs->pirzyk Responsible-Changed-By: pirzyk Responsible-Changed-When: Fri Oct 11 07:29:29 PDT 2002 Responsible-Changed-Why: Picked up yet another of my bug reports http://www.freebsd.org/cgi/query-pr.cgi?pr=43885 State-Changed-From-To: open->analyzed State-Changed-By: ken State-Changed-When: Tue Apr 29 09:25:03 PDT 2003 State-Changed-Why: This is fixed in -current, but hasn't been MFCed yet. Put this in the analyzed state to remind me to MFC it. Responsible-Changed-From-To: pirzyk->ken Responsible-Changed-By: ken Responsible-Changed-When: Tue Apr 29 09:25:03 PDT 2003 Responsible-Changed-Why: My fix, I'll take the PR. http://www.freebsd.org/cgi/query-pr.cgi?pr=43885 State-Changed-From-To: analyzed->closed State-Changed-By: julian State-Changed-When: Tue Jan 4 07:09:10 GMT 2005 State-Changed-Why: Ken tells me it's merged in http://www.freebsd.org/cgi/query-pr.cgi?pr=43885 >Unformatted: