Use SCSI/ATAPI common definition for MODE_{SELECT,SENSE}{,_BIG}. Define
functions to send theses commands in scsipi_base.c and use them instead of ad-hoc commands setups.
This commit is contained in:
parent
26882092f4
commit
bc980d7eba
|
@ -1,69 +0,0 @@
|
||||||
/* $NetBSD: atapi_all.h,v 1.3 1998/02/13 08:28:16 enami Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1996 Manuel Bouyer. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. All advertising materials mentioning features or use of this software
|
|
||||||
* must display the following acknowledgement:
|
|
||||||
* This product includes software developed by Manuel Bouyer.
|
|
||||||
* 4. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define ATAPI_MODE_SELECT 0x55
|
|
||||||
struct atapi_mode_select {
|
|
||||||
u_int8_t opcode;
|
|
||||||
u_int8_t byte2;
|
|
||||||
#define AMS_SP 0x01 /* save pages */
|
|
||||||
#define AMS_PF 0x10 /* must be set in byte2 */
|
|
||||||
u_int8_t reserved1[5];
|
|
||||||
u_int8_t length[2];
|
|
||||||
u_int8_t reserved2[3];
|
|
||||||
};
|
|
||||||
|
|
||||||
#define ATAPI_MODE_SENSE 0x5a
|
|
||||||
struct atapi_mode_sense {
|
|
||||||
u_int8_t opcode;
|
|
||||||
u_int8_t byte2;
|
|
||||||
u_int8_t page;
|
|
||||||
u_int8_t reserved1[4];
|
|
||||||
u_int8_t length[2];
|
|
||||||
u_int8_t reserved2[3];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct atapi_mode_header {
|
|
||||||
u_int8_t length[2];
|
|
||||||
u_int8_t medium;
|
|
||||||
#define MDT_UNKNOWN 0x00
|
|
||||||
#define MDT_DATA_120 0x01
|
|
||||||
#define MDT_AUDIO_120 0x02
|
|
||||||
#define MDT_COMB_120 0x03
|
|
||||||
#define MDT_PHOTO_120 0x04
|
|
||||||
#define MDT_DATA_80 0x05
|
|
||||||
#define MDT_AUDIO_80 0x06
|
|
||||||
#define MDT_COMB_80 0x07
|
|
||||||
#define MDT_PHOTO_80 0x08
|
|
||||||
#define MDT_NO_DISC 0x70
|
|
||||||
#define MDT_DOOR_OPEN 0x71
|
|
||||||
#define MDT_FMT_ERROR 0x72
|
|
||||||
u_int8_t reserved[5];
|
|
||||||
};
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: atapi_base.c,v 1.15 2001/04/25 17:53:38 bouyer Exp $ */
|
/* $NetBSD: atapi_base.c,v 1.16 2001/05/14 20:35:27 bouyer Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998, 1999 The NetBSD Foundation, Inc.
|
* Copyright (c) 1998, 1999 The NetBSD Foundation, Inc.
|
||||||
|
@ -49,7 +49,6 @@
|
||||||
#include <sys/proc.h>
|
#include <sys/proc.h>
|
||||||
|
|
||||||
#include <dev/scsipi/scsipi_all.h>
|
#include <dev/scsipi/scsipi_all.h>
|
||||||
#include <dev/scsipi/atapi_all.h>
|
|
||||||
#include <dev/scsipi/scsipiconf.h>
|
#include <dev/scsipi/scsipiconf.h>
|
||||||
#include <dev/scsipi/atapiconf.h>
|
#include <dev/scsipi/atapiconf.h>
|
||||||
#include <dev/scsipi/scsipi_base.h>
|
#include <dev/scsipi/scsipi_base.h>
|
||||||
|
@ -246,48 +245,3 @@ atapi_scsipi_cmd(periph, scsipi_cmd, cmdlen, data, datalen,
|
||||||
return (0);
|
return (0);
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
atapi_mode_select(periph, data, len, flags, retries, timeout)
|
|
||||||
struct scsipi_periph *periph;
|
|
||||||
struct atapi_mode_header *data;
|
|
||||||
int len, flags, retries, timeout;
|
|
||||||
{
|
|
||||||
struct atapi_mode_select scsipi_cmd;
|
|
||||||
int error;
|
|
||||||
|
|
||||||
bzero(&scsipi_cmd, sizeof(scsipi_cmd));
|
|
||||||
scsipi_cmd.opcode = ATAPI_MODE_SELECT;
|
|
||||||
scsipi_cmd.byte2 = AMS_PF;
|
|
||||||
_lto2b(len, scsipi_cmd.length);
|
|
||||||
|
|
||||||
/* length is reserved when doing mode select; zero it */
|
|
||||||
_lto2l(0, data->length);
|
|
||||||
|
|
||||||
error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
|
|
||||||
sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
|
|
||||||
flags | XS_CTL_DATA_OUT);
|
|
||||||
SC_DEBUG(periph, SCSIPI_DB2, ("atapi_mode_select: error=%d\n", error));
|
|
||||||
return (error);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
atapi_mode_sense(periph, page, data, len, flags, retries, timeout)
|
|
||||||
struct scsipi_periph *periph;
|
|
||||||
int page, len, flags, retries, timeout;
|
|
||||||
struct atapi_mode_header *data;
|
|
||||||
{
|
|
||||||
struct atapi_mode_sense scsipi_cmd;
|
|
||||||
int error;
|
|
||||||
|
|
||||||
bzero(&scsipi_cmd, sizeof(scsipi_cmd));
|
|
||||||
scsipi_cmd.opcode = ATAPI_MODE_SENSE;
|
|
||||||
scsipi_cmd.page = page;
|
|
||||||
_lto2b(len, scsipi_cmd.length);
|
|
||||||
|
|
||||||
error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
|
|
||||||
sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
|
|
||||||
flags | XS_CTL_DATA_IN);
|
|
||||||
SC_DEBUG(periph, SCSIPI_DB2, ("atapi_mode_sense: error=%d\n", error));
|
|
||||||
return (error);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: atapi_cd.h,v 1.9 1998/07/13 16:50:56 thorpej Exp $ */
|
/* $NetBSD: atapi_cd.h,v 1.10 2001/05/14 20:35:27 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1996 Manuel Bouyer. All rights reserved.
|
* Copyright (c) 1996 Manuel Bouyer. All rights reserved.
|
||||||
|
@ -109,13 +109,28 @@ union atapi_cd_pages {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct atapi_cd_mode_data {
|
struct atapi_cd_mode_data {
|
||||||
struct atapi_mode_header header;
|
struct scsipi_mode_header_big header;
|
||||||
union atapi_cd_pages pages;
|
union atapi_cd_pages pages;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* medium type in scsipi_mode_header_big */
|
||||||
|
#define MDT_UNKNOWN 0x00
|
||||||
|
#define MDT_DATA_120 0x01
|
||||||
|
#define MDT_AUDIO_120 0x02
|
||||||
|
#define MDT_COMB_120 0x03
|
||||||
|
#define MDT_PHOTO_120 0x04
|
||||||
|
#define MDT_DATA_80 0x05
|
||||||
|
#define MDT_AUDIO_80 0x06
|
||||||
|
#define MDT_COMB_80 0x07
|
||||||
|
#define MDT_PHOTO_80 0x08
|
||||||
|
#define MDT_NO_DISC 0x70
|
||||||
|
#define MDT_DOOR_OPEN 0x71
|
||||||
|
#define MDT_FMT_ERROR 0x72
|
||||||
|
|
||||||
|
|
||||||
#define AUDIOPAGESIZE \
|
#define AUDIOPAGESIZE \
|
||||||
(sizeof(struct atapi_mode_header) + sizeof(struct cd_audio_page))
|
(sizeof(struct scsipi_mode_header_big) + sizeof(struct cd_audio_page))
|
||||||
#define CDROMPAGESIZE \
|
#define CDROMPAGESIZE \
|
||||||
(sizeof(struct atapi_mode_header) + sizeof(struct atapi_cdrom_page))
|
(sizeof(struct scsipi_mode_header_big) + sizeof(struct atapi_cdrom_page))
|
||||||
#define CAPPAGESIZE \
|
#define CAPPAGESIZE \
|
||||||
(sizeof(struct atapi_mode_header) + sizeof(struct atapi_cap_page))
|
(sizeof(struct scsipi_mode_header_big) + sizeof(struct atapi_cap_page))
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: atapi_disk.h,v 1.3 1998/02/13 08:28:21 enami Exp $ */
|
/* $NetBSD: atapi_disk.h,v 1.4 2001/05/14 20:35:27 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 1998
|
* Copyright 1998
|
||||||
|
@ -92,9 +92,9 @@ union atapi_sd_pages {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct atapi_sd_mode_data {
|
struct atapi_sd_mode_data {
|
||||||
struct atapi_mode_header header;
|
struct scsipi_mode_header_big header;
|
||||||
union atapi_sd_pages pages;
|
union atapi_sd_pages pages;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FLEXGEOMETRYPAGESIZE \
|
#define FLEXGEOMETRYPAGESIZE \
|
||||||
(sizeof(struct atapi_mode_header) + sizeof(struct atapi_flex_geometry_page))
|
(sizeof(struct scsipi_mode_header_big) + sizeof(struct atapi_flex_geometry_page))
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: atapiconf.c,v 1.39 2001/04/25 17:53:38 bouyer Exp $ */
|
/* $NetBSD: atapiconf.c,v 1.40 2001/05/14 20:35:27 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1996 Manuel Bouyer. All rights reserved.
|
* Copyright (c) 1996 Manuel Bouyer. All rights reserved.
|
||||||
|
@ -40,7 +40,6 @@
|
||||||
|
|
||||||
#include <dev/ata/atavar.h>
|
#include <dev/ata/atavar.h>
|
||||||
#include <dev/scsipi/scsipi_all.h>
|
#include <dev/scsipi/scsipi_all.h>
|
||||||
#include <dev/scsipi/atapi_all.h>
|
|
||||||
#include <dev/scsipi/scsipiconf.h>
|
#include <dev/scsipi/scsipiconf.h>
|
||||||
#include <dev/scsipi/atapiconf.h>
|
#include <dev/scsipi/atapiconf.h>
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: atapiconf.h,v 1.11 2001/04/25 17:53:38 bouyer Exp $ */
|
/* $NetBSD: atapiconf.h,v 1.12 2001/05/14 20:35:28 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1996 Manuel Bouyer. All rights reserved.
|
* Copyright (c) 1996 Manuel Bouyer. All rights reserved.
|
||||||
|
@ -31,8 +31,6 @@
|
||||||
|
|
||||||
#include <dev/scsipi/scsipiconf.h>
|
#include <dev/scsipi/scsipiconf.h>
|
||||||
|
|
||||||
struct atapi_mode_header;
|
|
||||||
|
|
||||||
struct atapibus_softc {
|
struct atapibus_softc {
|
||||||
struct device sc_dev;
|
struct device sc_dev;
|
||||||
struct scsipi_channel *sc_channel; /* our scsipi_channel */
|
struct scsipi_channel *sc_channel; /* our scsipi_channel */
|
||||||
|
@ -59,8 +57,4 @@ void atapi_print_addr __P((struct scsipi_periph *));
|
||||||
int atapi_interpret_sense __P((struct scsipi_xfer *));
|
int atapi_interpret_sense __P((struct scsipi_xfer *));
|
||||||
int atapi_scsipi_cmd __P((struct scsipi_periph *, struct scsipi_generic *,
|
int atapi_scsipi_cmd __P((struct scsipi_periph *, struct scsipi_generic *,
|
||||||
int, void *, size_t, int, int, struct buf *, int));
|
int, void *, size_t, int, int, struct buf *, int));
|
||||||
int atapi_mode_select __P((struct scsipi_periph *,
|
|
||||||
struct atapi_mode_header *, int, int, int, int));
|
|
||||||
int atapi_mode_sense __P((struct scsipi_periph *, int,
|
|
||||||
struct atapi_mode_header *, int, int, int, int));
|
|
||||||
void atapi_kill_pending __P((struct scsipi_periph *));
|
void atapi_kill_pending __P((struct scsipi_periph *));
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: cd_atapi.c,v 1.14 2001/04/25 17:53:38 bouyer Exp $ */
|
/* $NetBSD: cd_atapi.c,v 1.15 2001/05/14 20:35:28 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997 Manuel Bouyer. All rights reserved.
|
* Copyright (c) 1997 Manuel Bouyer. All rights reserved.
|
||||||
|
@ -64,7 +64,6 @@
|
||||||
|
|
||||||
#include <dev/scsipi/scsipi_all.h>
|
#include <dev/scsipi/scsipi_all.h>
|
||||||
#include <dev/scsipi/scsipi_cd.h>
|
#include <dev/scsipi/scsipi_cd.h>
|
||||||
#include <dev/scsipi/atapi_all.h>
|
|
||||||
#include <dev/scsipi/atapi_cd.h>
|
#include <dev/scsipi/atapi_cd.h>
|
||||||
#include <dev/scsipi/atapiconf.h>
|
#include <dev/scsipi/atapiconf.h>
|
||||||
#include <dev/scsipi/cdvar.h>
|
#include <dev/scsipi/cdvar.h>
|
||||||
|
@ -150,16 +149,16 @@ cd_atapibus_setchan(cd, p0, p1, p2, p3, flags)
|
||||||
struct atapi_cd_mode_data data;
|
struct atapi_cd_mode_data data;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if ((error = atapi_mode_sense(cd->sc_periph, ATAPI_AUDIO_PAGE,
|
if ((error = scsipi_mode_sense_big(cd->sc_periph, 0, ATAPI_AUDIO_PAGE,
|
||||||
(struct atapi_mode_header *)&data, AUDIOPAGESIZE,
|
&data.header, AUDIOPAGESIZE,
|
||||||
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000)) != 0)
|
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000)) != 0)
|
||||||
return (error);
|
return (error);
|
||||||
data.pages.audio.port[LEFT_PORT].channels = p0;
|
data.pages.audio.port[LEFT_PORT].channels = p0;
|
||||||
data.pages.audio.port[RIGHT_PORT].channels = p1;
|
data.pages.audio.port[RIGHT_PORT].channels = p1;
|
||||||
data.pages.audio.port[2].channels = p2;
|
data.pages.audio.port[2].channels = p2;
|
||||||
data.pages.audio.port[3].channels = p3;
|
data.pages.audio.port[3].channels = p3;
|
||||||
return (atapi_mode_select(cd->sc_periph,
|
return (scsipi_mode_select_big(cd->sc_periph, SMS_PF,
|
||||||
(struct atapi_mode_header *)&data, AUDIOPAGESIZE,
|
&data.header, AUDIOPAGESIZE,
|
||||||
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000));
|
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,8 +171,8 @@ cd_atapibus_getvol(cd, arg, flags)
|
||||||
struct atapi_cd_mode_data data;
|
struct atapi_cd_mode_data data;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if ((error = atapi_mode_sense(cd->sc_periph, ATAPI_AUDIO_PAGE,
|
if ((error = scsipi_mode_sense_big(cd->sc_periph, 0, ATAPI_AUDIO_PAGE,
|
||||||
(struct atapi_mode_header *)&data, AUDIOPAGESIZE,
|
&data.header, AUDIOPAGESIZE,
|
||||||
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000)) != 0)
|
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000)) != 0)
|
||||||
return (error);
|
return (error);
|
||||||
arg->vol[0] = data.pages.audio.port[0].volume;
|
arg->vol[0] = data.pages.audio.port[0].volume;
|
||||||
|
@ -192,12 +191,12 @@ cd_atapibus_setvol(cd, arg, flags)
|
||||||
struct atapi_cd_mode_data data, mask;
|
struct atapi_cd_mode_data data, mask;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if ((error = atapi_mode_sense(cd->sc_periph, ATAPI_AUDIO_PAGE,
|
if ((error = scsipi_mode_sense_big(cd->sc_periph, 0, ATAPI_AUDIO_PAGE,
|
||||||
(struct atapi_mode_header *)&data, AUDIOPAGESIZE,
|
&data.header, AUDIOPAGESIZE,
|
||||||
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000)) != 0)
|
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000)) != 0)
|
||||||
return (error);
|
return (error);
|
||||||
if ((error = atapi_mode_sense(cd->sc_periph, ATAPI_AUDIO_PAGE_MASK,
|
if ((error = scsipi_mode_sense_big(cd->sc_periph, 0,
|
||||||
(struct atapi_mode_header *)&mask, AUDIOPAGESIZE,
|
ATAPI_AUDIO_PAGE_MASK, &mask.header, AUDIOPAGESIZE,
|
||||||
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000)) != 0)
|
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000)) != 0)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
|
@ -210,8 +209,8 @@ cd_atapibus_setvol(cd, arg, flags)
|
||||||
data.pages.audio.port[3].volume = arg->vol[3] &
|
data.pages.audio.port[3].volume = arg->vol[3] &
|
||||||
mask.pages.audio.port[3].volume;
|
mask.pages.audio.port[3].volume;
|
||||||
|
|
||||||
return (atapi_mode_select(cd->sc_periph,
|
return (scsipi_mode_select_big(cd->sc_periph, SMS_PF,
|
||||||
(struct atapi_mode_header *)&data, AUDIOPAGESIZE,
|
&data.header, AUDIOPAGESIZE,
|
||||||
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000));
|
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: cd_scsi.c,v 1.19 2001/04/25 17:53:38 bouyer Exp $ */
|
/* $NetBSD: cd_scsi.c,v 1.20 2001/05/14 20:35:28 bouyer Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
||||||
|
@ -78,10 +78,6 @@
|
||||||
|
|
||||||
int cd_scsibus_match __P((struct device *, struct cfdata *, void *));
|
int cd_scsibus_match __P((struct device *, struct cfdata *, void *));
|
||||||
void cd_scsibus_attach __P((struct device *, struct device *, void *));
|
void cd_scsibus_attach __P((struct device *, struct device *, void *));
|
||||||
int cd_scsibus_get_mode __P((struct cd_softc *,
|
|
||||||
struct scsi_cd_mode_data *, int, int, int));
|
|
||||||
int cd_scsibus_set_mode __P((struct cd_softc *,
|
|
||||||
struct scsi_cd_mode_data *, int, int));
|
|
||||||
|
|
||||||
struct cfattach cd_scsibus_ca = {
|
struct cfattach cd_scsibus_ca = {
|
||||||
sizeof(struct cd_softc), cd_scsibus_match, cd_scsibus_attach,
|
sizeof(struct cd_softc), cd_scsibus_match, cd_scsibus_attach,
|
||||||
|
@ -162,50 +158,6 @@ cd_scsibus_attach(parent, self, aux)
|
||||||
/* should I get the SCSI_CAP_PAGE here ? */
|
/* should I get the SCSI_CAP_PAGE here ? */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the requested page into the buffer given
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
cd_scsibus_get_mode(cd, data, page, len, flags)
|
|
||||||
struct cd_softc *cd;
|
|
||||||
struct scsi_cd_mode_data *data;
|
|
||||||
int page, len, flags;
|
|
||||||
{
|
|
||||||
struct scsi_mode_sense scsipi_cmd;
|
|
||||||
|
|
||||||
bzero(&scsipi_cmd, sizeof(scsipi_cmd));
|
|
||||||
bzero(data, sizeof(*data));
|
|
||||||
scsipi_cmd.opcode = SCSI_MODE_SENSE;
|
|
||||||
scsipi_cmd.page = page;
|
|
||||||
scsipi_cmd.length = len & 0xff;
|
|
||||||
return (scsipi_command(cd->sc_periph,
|
|
||||||
(struct scsipi_generic *)&scsipi_cmd, sizeof(scsipi_cmd),
|
|
||||||
(u_char *)data, sizeof(*data), CDRETRIES, 20000, NULL,
|
|
||||||
XS_CTL_DATA_IN));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the requested page into the buffer given
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
cd_scsibus_set_mode(cd, data, len, flags)
|
|
||||||
struct cd_softc *cd;
|
|
||||||
struct scsi_cd_mode_data *data;
|
|
||||||
int len, flags;
|
|
||||||
{
|
|
||||||
struct scsi_mode_select scsipi_cmd;
|
|
||||||
|
|
||||||
bzero(&scsipi_cmd, sizeof(scsipi_cmd));
|
|
||||||
scsipi_cmd.opcode = SCSI_MODE_SELECT;
|
|
||||||
scsipi_cmd.byte2 |= SMS_PF;
|
|
||||||
scsipi_cmd.length = len & 0xff;
|
|
||||||
data->header.data_length = 0;
|
|
||||||
return (scsipi_command(cd->sc_periph,
|
|
||||||
(struct scsipi_generic *)&scsipi_cmd, sizeof(scsipi_cmd),
|
|
||||||
(u_char *)data, sizeof(*data), CDRETRIES, 20000, NULL,
|
|
||||||
XS_CTL_DATA_OUT));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cd_scsibus_set_pa_immed(cd, flags)
|
cd_scsibus_set_pa_immed(cd, flags)
|
||||||
struct cd_softc *cd;
|
struct cd_softc *cd;
|
||||||
|
@ -214,13 +166,15 @@ cd_scsibus_set_pa_immed(cd, flags)
|
||||||
struct scsi_cd_mode_data data;
|
struct scsi_cd_mode_data data;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if ((error = cd_scsibus_get_mode(cd, &data, SCSI_AUDIO_PAGE,
|
if ((error = scsipi_mode_sense(cd->sc_periph, 0, SCSI_AUDIO_PAGE,
|
||||||
AUDIOPAGESIZE, flags | XS_CTL_DATA_ONSTACK)) != 0)
|
&data.header, AUDIOPAGESIZE, flags | XS_CTL_DATA_ONSTACK,
|
||||||
|
CDRETRIES, 20000)) != 0)
|
||||||
return (error);
|
return (error);
|
||||||
data.page.audio.flags &= ~CD_PA_SOTC;
|
data.page.audio.flags &= ~CD_PA_SOTC;
|
||||||
data.page.audio.flags |= CD_PA_IMMED;
|
data.page.audio.flags |= CD_PA_IMMED;
|
||||||
return (cd_scsibus_set_mode(cd, &data, AUDIOPAGESIZE,
|
return (scsipi_mode_select(cd->sc_periph, SMS_PF,
|
||||||
flags | XS_CTL_DATA_ONSTACK));
|
&data.header, AUDIOPAGESIZE,
|
||||||
|
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000));
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -232,15 +186,17 @@ cd_scsibus_setchan(cd, p0, p1, p2, p3, flags)
|
||||||
struct scsi_cd_mode_data data;
|
struct scsi_cd_mode_data data;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if ((error = cd_scsibus_get_mode(cd, &data, SCSI_AUDIO_PAGE,
|
if ((error = scsipi_mode_sense(cd->sc_periph, 0, SCSI_AUDIO_PAGE,
|
||||||
AUDIOPAGESIZE, flags | XS_CTL_DATA_ONSTACK)) != 0)
|
&data.header, AUDIOPAGESIZE, flags | XS_CTL_DATA_ONSTACK,
|
||||||
|
CDRETRIES, 20000)) != 0)
|
||||||
return (error);
|
return (error);
|
||||||
data.page.audio.port[LEFT_PORT].channels = p0;
|
data.page.audio.port[LEFT_PORT].channels = p0;
|
||||||
data.page.audio.port[RIGHT_PORT].channels = p1;
|
data.page.audio.port[RIGHT_PORT].channels = p1;
|
||||||
data.page.audio.port[2].channels = p2;
|
data.page.audio.port[2].channels = p2;
|
||||||
data.page.audio.port[3].channels = p3;
|
data.page.audio.port[3].channels = p3;
|
||||||
return (cd_scsibus_set_mode(cd, &data, AUDIOPAGESIZE,
|
return (scsipi_mode_select(cd->sc_periph, SMS_PF,
|
||||||
flags | XS_CTL_DATA_ONSTACK));
|
&data.header, AUDIOPAGESIZE,
|
||||||
|
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000));
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -253,8 +209,9 @@ cd_scsibus_getvol(cd, arg, flags)
|
||||||
struct scsi_cd_mode_data data;
|
struct scsi_cd_mode_data data;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if ((error = cd_scsibus_get_mode(cd, &data, SCSI_AUDIO_PAGE,
|
if ((error = scsipi_mode_sense(cd->sc_periph, 0, SCSI_AUDIO_PAGE,
|
||||||
AUDIOPAGESIZE, flags | XS_CTL_DATA_ONSTACK)) != 0)
|
&data.header, AUDIOPAGESIZE,
|
||||||
|
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000)) != 0)
|
||||||
return (error);
|
return (error);
|
||||||
arg->vol[LEFT_PORT] = data.page.audio.port[LEFT_PORT].volume;
|
arg->vol[LEFT_PORT] = data.page.audio.port[LEFT_PORT].volume;
|
||||||
arg->vol[RIGHT_PORT] = data.page.audio.port[RIGHT_PORT].volume;
|
arg->vol[RIGHT_PORT] = data.page.audio.port[RIGHT_PORT].volume;
|
||||||
|
@ -272,8 +229,9 @@ cd_scsibus_setvol(cd, arg, flags)
|
||||||
struct scsi_cd_mode_data data;
|
struct scsi_cd_mode_data data;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if ((error = cd_scsibus_get_mode(cd, &data, SCSI_AUDIO_PAGE,
|
if ((error = scsipi_mode_sense(cd->sc_periph, 0, SCSI_AUDIO_PAGE,
|
||||||
AUDIOPAGESIZE, flags | XS_CTL_DATA_ONSTACK)) != 0)
|
&data.header, AUDIOPAGESIZE,
|
||||||
|
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000)) != 0)
|
||||||
return (error);
|
return (error);
|
||||||
data.page.audio.port[LEFT_PORT].channels = CHANNEL_0;
|
data.page.audio.port[LEFT_PORT].channels = CHANNEL_0;
|
||||||
data.page.audio.port[LEFT_PORT].volume = arg->vol[LEFT_PORT];
|
data.page.audio.port[LEFT_PORT].volume = arg->vol[LEFT_PORT];
|
||||||
|
@ -281,8 +239,9 @@ cd_scsibus_setvol(cd, arg, flags)
|
||||||
data.page.audio.port[RIGHT_PORT].volume = arg->vol[RIGHT_PORT];
|
data.page.audio.port[RIGHT_PORT].volume = arg->vol[RIGHT_PORT];
|
||||||
data.page.audio.port[2].volume = arg->vol[2];
|
data.page.audio.port[2].volume = arg->vol[2];
|
||||||
data.page.audio.port[3].volume = arg->vol[3];
|
data.page.audio.port[3].volume = arg->vol[3];
|
||||||
return (cd_scsibus_set_mode(cd, &data, AUDIOPAGESIZE,
|
return (scsipi_mode_select(cd->sc_periph, SMS_PF,
|
||||||
flags | XS_CTL_DATA_ONSTACK));
|
&data.header, AUDIOPAGESIZE,
|
||||||
|
flags | XS_CTL_DATA_ONSTACK, CDRETRIES, 20000));
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: ch.c,v 1.44 2001/04/25 17:53:39 bouyer Exp $ */
|
/* $NetBSD: ch.c,v 1.45 2001/05/14 20:35:28 bouyer Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1996, 1997, 1998, 1999 The NetBSD Foundation, Inc.
|
* Copyright (c) 1996, 1997, 1998, 1999 The NetBSD Foundation, Inc.
|
||||||
|
@ -1140,9 +1140,8 @@ ch_get_params(sc, scsiflags)
|
||||||
struct ch_softc *sc;
|
struct ch_softc *sc;
|
||||||
int scsiflags;
|
int scsiflags;
|
||||||
{
|
{
|
||||||
struct scsi_mode_sense cmd;
|
|
||||||
struct scsi_mode_sense_data {
|
struct scsi_mode_sense_data {
|
||||||
struct scsi_mode_header header;
|
struct scsipi_mode_header header;
|
||||||
union {
|
union {
|
||||||
struct page_element_address_assignment ea;
|
struct page_element_address_assignment ea;
|
||||||
struct page_transport_geometry_parameters tg;
|
struct page_transport_geometry_parameters tg;
|
||||||
|
@ -1155,16 +1154,10 @@ ch_get_params(sc, scsiflags)
|
||||||
/*
|
/*
|
||||||
* Grab info from the element address assignment page.
|
* Grab info from the element address assignment page.
|
||||||
*/
|
*/
|
||||||
bzero(&cmd, sizeof(cmd));
|
|
||||||
bzero(&sense_data, sizeof(sense_data));
|
bzero(&sense_data, sizeof(sense_data));
|
||||||
cmd.opcode = SCSI_MODE_SENSE;
|
error = scsipi_mode_sense(sc->sc_periph, SMS_DBD, 0x1d,
|
||||||
cmd.byte2 |= 0x08; /* disable block descriptors */
|
&sense_data.header, sizeof(sense_data),
|
||||||
cmd.page = 0x1d;
|
scsiflags | XS_CTL_DATA_ONSTACK, CHRETRIES, 6000);
|
||||||
cmd.length = (sizeof(sense_data) & 0xff);
|
|
||||||
error = scsipi_command(sc->sc_periph,
|
|
||||||
(struct scsipi_generic *)&cmd, sizeof(cmd), (u_char *)&sense_data,
|
|
||||||
sizeof(sense_data), CHRETRIES, 6000, NULL,
|
|
||||||
scsiflags | XS_CTL_DATA_IN | XS_CTL_DATA_ONSTACK);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
printf("%s: could not sense element address page\n",
|
printf("%s: could not sense element address page\n",
|
||||||
sc->sc_dev.dv_xname);
|
sc->sc_dev.dv_xname);
|
||||||
|
@ -1185,19 +1178,13 @@ ch_get_params(sc, scsiflags)
|
||||||
/*
|
/*
|
||||||
* Grab info from the capabilities page.
|
* Grab info from the capabilities page.
|
||||||
*/
|
*/
|
||||||
bzero(&cmd, sizeof(cmd));
|
|
||||||
bzero(&sense_data, sizeof(sense_data));
|
bzero(&sense_data, sizeof(sense_data));
|
||||||
cmd.opcode = SCSI_MODE_SENSE;
|
|
||||||
/*
|
/*
|
||||||
* XXX: Note: not all changers can deal with disabled block descriptors
|
* XXX: Note: not all changers can deal with disabled block descriptors
|
||||||
*/
|
*/
|
||||||
cmd.byte2 = 0x08; /* disable block descriptors */
|
error = scsipi_mode_sense(sc->sc_periph, SMS_DBD, 0x1f,
|
||||||
cmd.page = 0x1f;
|
&sense_data.header, sizeof(sense_data),
|
||||||
cmd.length = (sizeof(sense_data) & 0xff);
|
scsiflags | XS_CTL_DATA_ONSTACK, CHRETRIES, 6000);
|
||||||
error = scsipi_command(sc->sc_periph,
|
|
||||||
(struct scsipi_generic *)&cmd, sizeof(cmd), (u_char *)&sense_data,
|
|
||||||
sizeof(sense_data), CHRETRIES, 6000, NULL,
|
|
||||||
scsiflags | XS_CTL_DATA_IN | XS_CTL_DATA_ONSTACK);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
printf("%s: could not sense capabilities page\n",
|
printf("%s: could not sense capabilities page\n",
|
||||||
sc->sc_dev.dv_xname);
|
sc->sc_dev.dv_xname);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: scsi_all.h,v 1.17 2001/04/19 10:16:25 augustss Exp $ */
|
/* $NetBSD: scsi_all.h,v 1.18 2001/05/14 20:35:28 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SCSI-specific interface description.
|
* SCSI-specific interface description.
|
||||||
|
@ -64,53 +64,6 @@ struct scsi_send_diag {
|
||||||
u_int8_t control;
|
u_int8_t control;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SCSI_MODE_SENSE 0x1a
|
|
||||||
struct scsi_mode_sense {
|
|
||||||
u_int8_t opcode;
|
|
||||||
u_int8_t byte2;
|
|
||||||
#define SMS_DBD 0x08
|
|
||||||
u_int8_t page;
|
|
||||||
#define SMS_PAGE_CODE 0x3F
|
|
||||||
#define SMS_PAGE_CTRL 0xC0
|
|
||||||
#define SMS_PAGE_CTRL_CURRENT 0x00
|
|
||||||
#define SMS_PAGE_CTRL_CHANGEABLE 0x40
|
|
||||||
#define SMS_PAGE_CTRL_DEFAULT 0x80
|
|
||||||
#define SMS_PAGE_CTRL_SAVED 0xC0
|
|
||||||
u_int8_t unused;
|
|
||||||
u_int8_t length;
|
|
||||||
u_int8_t control;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define SCSI_MODE_SENSE_BIG 0x5A
|
|
||||||
struct scsi_mode_sense_big {
|
|
||||||
u_int8_t opcode;
|
|
||||||
u_int8_t byte2; /* same bits as small version */
|
|
||||||
u_int8_t page; /* same bits as small version */
|
|
||||||
u_int8_t unused[4];
|
|
||||||
u_int8_t length[2];
|
|
||||||
u_int8_t control;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define SCSI_MODE_SELECT 0x15
|
|
||||||
struct scsi_mode_select {
|
|
||||||
u_int8_t opcode;
|
|
||||||
u_int8_t byte2;
|
|
||||||
#define SMS_SP 0x01
|
|
||||||
#define SMS_PF 0x10
|
|
||||||
u_int8_t unused[2];
|
|
||||||
u_int8_t length;
|
|
||||||
u_int8_t control;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define SCSI_MODE_SELECT_BIG 0x55
|
|
||||||
struct scsi_mode_select_big {
|
|
||||||
u_int8_t opcode;
|
|
||||||
u_int8_t byte2; /* same bits as small version */
|
|
||||||
u_int8_t unused[5];
|
|
||||||
u_int8_t length[2];
|
|
||||||
u_int8_t control;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define SCSI_RESERVE 0x16
|
#define SCSI_RESERVE 0x16
|
||||||
struct scsi_reserve {
|
struct scsi_reserve {
|
||||||
u_int8_t opcode;
|
u_int8_t opcode;
|
||||||
|
@ -142,6 +95,7 @@ struct scsi_changedef {
|
||||||
#define SC_SCSI_1 0x01
|
#define SC_SCSI_1 0x01
|
||||||
#define SC_SCSI_2 0x03
|
#define SC_SCSI_2 0x03
|
||||||
|
|
||||||
|
/* block descriptor, for mode sense/mode select */
|
||||||
struct scsi_blk_desc {
|
struct scsi_blk_desc {
|
||||||
u_int8_t density;
|
u_int8_t density;
|
||||||
u_int8_t nblocks[3];
|
u_int8_t nblocks[3];
|
||||||
|
@ -149,22 +103,6 @@ struct scsi_blk_desc {
|
||||||
u_int8_t blklen[3];
|
u_int8_t blklen[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct scsi_mode_header {
|
|
||||||
u_int8_t data_length; /* Sense data length */
|
|
||||||
u_int8_t medium_type;
|
|
||||||
u_int8_t dev_spec;
|
|
||||||
u_int8_t blk_desc_len;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct scsi_mode_header_big {
|
|
||||||
u_int8_t data_length[2]; /* Sense data length */
|
|
||||||
u_int8_t medium_type;
|
|
||||||
u_int8_t dev_spec;
|
|
||||||
u_int8_t unused[2];
|
|
||||||
u_int8_t blk_desc_len[2];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Status Byte
|
* Status Byte
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: scsi_cd.h,v 1.12 1998/02/13 08:28:30 enami Exp $ */
|
/* $NetBSD: scsi_cd.h,v 1.13 2001/05/14 20:35:28 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Written by Julian Elischer (julian@tfs.com)
|
* Written by Julian Elischer (julian@tfs.com)
|
||||||
|
@ -77,11 +77,11 @@ union scsi_cd_pages {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct scsi_cd_mode_data {
|
struct scsi_cd_mode_data {
|
||||||
struct scsi_mode_header header;
|
struct scsipi_mode_header header;
|
||||||
struct scsi_blk_desc blk_desc;
|
struct scsi_blk_desc blk_desc;
|
||||||
union scsi_cd_pages page;
|
union scsi_cd_pages page;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AUDIOPAGESIZE \
|
#define AUDIOPAGESIZE \
|
||||||
(sizeof(struct scsi_mode_header) + sizeof(struct scsi_blk_desc) \
|
(sizeof(struct scsipi_mode_header) + sizeof(struct scsi_blk_desc) \
|
||||||
+ sizeof(struct cd_audio_page))
|
+ sizeof(struct cd_audio_page))
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: scsipi_all.h,v 1.16 2001/04/25 17:53:39 bouyer Exp $ */
|
/* $NetBSD: scsipi_all.h,v 1.17 2001/05/14 20:35:28 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SCSI and SCSI-like general interface description
|
* SCSI and SCSI-like general interface description
|
||||||
|
@ -71,6 +71,68 @@ struct scsipi_sense {
|
||||||
u_int8_t control;
|
u_int8_t control;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MODE_SENSE 0x1a
|
||||||
|
struct scsipi_mode_sense {
|
||||||
|
u_int8_t opcode;
|
||||||
|
u_int8_t byte2;
|
||||||
|
#define SMS_DBD 0x08 /* disable block descriptors */
|
||||||
|
u_int8_t page;
|
||||||
|
#define SMS_PAGE_CODE 0x3F
|
||||||
|
#define SMS_PAGE_CTRL 0xC0
|
||||||
|
#define SMS_PAGE_CTRL_CURRENT 0x00
|
||||||
|
#define SMS_PAGE_CTRL_CHANGEABLE 0x40
|
||||||
|
#define SMS_PAGE_CTRL_DEFAULT 0x80
|
||||||
|
#define SMS_PAGE_CTRL_SAVED 0xC0
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
u_int8_t unused;
|
||||||
|
u_int8_t length;
|
||||||
|
} scsi;
|
||||||
|
struct {
|
||||||
|
u_int8_t length[2];
|
||||||
|
} atapi;
|
||||||
|
} u_len;
|
||||||
|
u_int8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MODE_SENSE_BIG 0x5A
|
||||||
|
struct scsipi_mode_sense_big {
|
||||||
|
u_int8_t opcode;
|
||||||
|
u_int8_t byte2; /* same bits as small version */
|
||||||
|
u_int8_t page; /* same bits as small version */
|
||||||
|
u_int8_t unused[4];
|
||||||
|
u_int8_t length[2];
|
||||||
|
u_int8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MODE_SELECT 0x15
|
||||||
|
struct scsipi_mode_select {
|
||||||
|
u_int8_t opcode;
|
||||||
|
u_int8_t byte2;
|
||||||
|
#define SMS_SP 0x01 /* save page */
|
||||||
|
#define SMS_PF 0x10
|
||||||
|
u_int8_t unused[2];
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
u_int8_t unused;
|
||||||
|
u_int8_t length;
|
||||||
|
} scsi;
|
||||||
|
struct {
|
||||||
|
u_int8_t length[2];
|
||||||
|
} atapi;
|
||||||
|
} u_len;
|
||||||
|
u_int8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MODE_SELECT_BIG 0x55
|
||||||
|
struct scsipi_mode_select_big {
|
||||||
|
u_int8_t opcode;
|
||||||
|
u_int8_t byte2; /* same bits as small version */
|
||||||
|
u_int8_t unused[5];
|
||||||
|
u_int8_t length[2];
|
||||||
|
u_int8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
#define INQUIRY 0x12
|
#define INQUIRY 0x12
|
||||||
struct scsipi_inquiry {
|
struct scsipi_inquiry {
|
||||||
u_int8_t opcode;
|
u_int8_t opcode;
|
||||||
|
@ -233,4 +295,21 @@ struct scsipi_inquiry_data {
|
||||||
/*59*/ char version_descriptor[8][2];
|
/*59*/ char version_descriptor[8][2];
|
||||||
}; /* 74 Bytes */
|
}; /* 74 Bytes */
|
||||||
|
|
||||||
|
/* Data structures for mode select/mode sense */
|
||||||
|
struct scsipi_mode_header {
|
||||||
|
u_int8_t data_length; /* Sense data length */
|
||||||
|
u_int8_t medium_type;
|
||||||
|
u_int8_t dev_spec;
|
||||||
|
u_int8_t blk_desc_len; /* unused on ATAPI */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct scsipi_mode_header_big {
|
||||||
|
u_int8_t data_length[2]; /* Sense data length */
|
||||||
|
u_int8_t medium_type;
|
||||||
|
u_int8_t dev_spec;
|
||||||
|
u_int8_t unused[2]; /* unused on ATAPI */
|
||||||
|
u_int8_t blk_desc_len[2]; /* unused on ATAPI */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* _DEV_SCSIPI_SCSIPI_ALL_H_ */
|
#endif /* _DEV_SCSIPI_SCSIPI_ALL_H_ */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: scsipi_base.c,v 1.40 2001/04/27 21:36:58 bouyer Exp $ */
|
/* $NetBSD: scsipi_base.c,v 1.41 2001/05/14 20:35:28 bouyer Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
|
* Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
|
||||||
|
@ -1062,6 +1062,103 @@ scsipi_start(periph, type, flags)
|
||||||
NULL, flags));
|
NULL, flags));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* scsipi_mode_sense, scsipi_mode_sense_big:
|
||||||
|
* get a sense page from a device
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
scsipi_mode_sense(periph, byte2, page, data, len, flags, retries, timeout)
|
||||||
|
struct scsipi_periph *periph;
|
||||||
|
int byte2, page, len, flags, retries, timeout;
|
||||||
|
struct scsipi_mode_header *data;
|
||||||
|
{
|
||||||
|
struct scsipi_mode_sense scsipi_cmd;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
bzero(&scsipi_cmd, sizeof(scsipi_cmd));
|
||||||
|
scsipi_cmd.opcode = MODE_SENSE;
|
||||||
|
scsipi_cmd.byte2 = byte2;
|
||||||
|
scsipi_cmd.page = page;
|
||||||
|
if (scsipi_periph_bustype(periph) == SCSIPI_BUSTYPE_ATAPI)
|
||||||
|
_lto2b(len, scsipi_cmd.u_len.atapi.length);
|
||||||
|
else
|
||||||
|
scsipi_cmd.u_len.scsi.length = len & 0xff;
|
||||||
|
error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
|
||||||
|
sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
|
||||||
|
flags | XS_CTL_DATA_IN);
|
||||||
|
SC_DEBUG(periph, SCSIPI_DB2,
|
||||||
|
("scsipi_mode_sense: error=%d\n", error));
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
scsipi_mode_sense_big(periph, byte2, page, data, len, flags, retries, timeout)
|
||||||
|
struct scsipi_periph *periph;
|
||||||
|
int byte2, page, len, flags, retries, timeout;
|
||||||
|
struct scsipi_mode_header_big *data;
|
||||||
|
{
|
||||||
|
struct scsipi_mode_sense_big scsipi_cmd;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
bzero(&scsipi_cmd, sizeof(scsipi_cmd));
|
||||||
|
scsipi_cmd.opcode = MODE_SENSE_BIG;
|
||||||
|
scsipi_cmd.byte2 = byte2;
|
||||||
|
scsipi_cmd.page = page;
|
||||||
|
_lto2b(len, scsipi_cmd.length);
|
||||||
|
error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
|
||||||
|
sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
|
||||||
|
flags | XS_CTL_DATA_IN);
|
||||||
|
SC_DEBUG(periph, SCSIPI_DB2,
|
||||||
|
("scsipi_mode_sense_big: error=%d\n", error));
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
scsipi_mode_select(periph, byte2, data, len, flags, retries, timeout)
|
||||||
|
struct scsipi_periph *periph;
|
||||||
|
int byte2, len, flags, retries, timeout;
|
||||||
|
struct scsipi_mode_header *data;
|
||||||
|
{
|
||||||
|
struct scsipi_mode_select scsipi_cmd;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
bzero(&scsipi_cmd, sizeof(scsipi_cmd));
|
||||||
|
scsipi_cmd.opcode = MODE_SELECT;
|
||||||
|
scsipi_cmd.byte2 = byte2;
|
||||||
|
if (scsipi_periph_bustype(periph) == SCSIPI_BUSTYPE_ATAPI)
|
||||||
|
_lto2b(len, scsipi_cmd.u_len.atapi.length);
|
||||||
|
else
|
||||||
|
scsipi_cmd.u_len.scsi.length = len & 0xff;
|
||||||
|
error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
|
||||||
|
sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
|
||||||
|
flags | XS_CTL_DATA_OUT);
|
||||||
|
SC_DEBUG(periph, SCSIPI_DB2,
|
||||||
|
("scsipi_mode_select: error=%d\n", error));
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
scsipi_mode_select_big(periph, byte2, data, len, flags, retries, timeout)
|
||||||
|
struct scsipi_periph *periph;
|
||||||
|
int byte2, len, flags, retries, timeout;
|
||||||
|
struct scsipi_mode_header_big *data;
|
||||||
|
{
|
||||||
|
struct scsipi_mode_select_big scsipi_cmd;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
bzero(&scsipi_cmd, sizeof(scsipi_cmd));
|
||||||
|
scsipi_cmd.opcode = MODE_SELECT_BIG;
|
||||||
|
scsipi_cmd.byte2 = byte2;
|
||||||
|
_lto2b(len, scsipi_cmd.length);
|
||||||
|
error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
|
||||||
|
sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
|
||||||
|
flags | XS_CTL_DATA_OUT);
|
||||||
|
SC_DEBUG(periph, SCSIPI_DB2,
|
||||||
|
("scsipi_mode_select: error=%d\n", error));
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* scsipi_done:
|
* scsipi_done:
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: scsipiconf.h,v 1.50 2001/05/02 09:47:45 bouyer Exp $ */
|
/* $NetBSD: scsipiconf.h,v 1.51 2001/05/14 20:35:28 bouyer Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
|
* Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
|
||||||
|
@ -605,6 +605,14 @@ int scsipi_test_unit_ready __P((struct scsipi_periph *, int));
|
||||||
int scsipi_prevent __P((struct scsipi_periph *, int, int));
|
int scsipi_prevent __P((struct scsipi_periph *, int, int));
|
||||||
int scsipi_inquire __P((struct scsipi_periph *,
|
int scsipi_inquire __P((struct scsipi_periph *,
|
||||||
struct scsipi_inquiry_data *, int));
|
struct scsipi_inquiry_data *, int));
|
||||||
|
int scsipi_mode_select __P((struct scsipi_periph *, int,
|
||||||
|
struct scsipi_mode_header *, int, int, int, int));
|
||||||
|
int scsipi_mode_select_big __P((struct scsipi_periph *, int,
|
||||||
|
struct scsipi_mode_header_big *, int, int, int, int));
|
||||||
|
int scsipi_mode_sense __P((struct scsipi_periph *, int, int,
|
||||||
|
struct scsipi_mode_header *, int, int, int, int));
|
||||||
|
int scsipi_mode_sense_big __P((struct scsipi_periph *, int, int,
|
||||||
|
struct scsipi_mode_header_big *, int, int, int, int));
|
||||||
int scsipi_start __P((struct scsipi_periph *, int, int));
|
int scsipi_start __P((struct scsipi_periph *, int, int));
|
||||||
void scsipi_done __P((struct scsipi_xfer *));
|
void scsipi_done __P((struct scsipi_xfer *));
|
||||||
void scsipi_user_done __P((struct scsipi_xfer *));
|
void scsipi_user_done __P((struct scsipi_xfer *));
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: sd_atapi.c,v 1.9 2001/04/25 17:53:41 bouyer Exp $ */
|
/* $NetBSD: sd_atapi.c,v 1.10 2001/05/14 20:35:29 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 1998
|
* Copyright 1998
|
||||||
|
@ -52,7 +52,6 @@
|
||||||
|
|
||||||
#include <dev/scsipi/scsipi_all.h>
|
#include <dev/scsipi/scsipi_all.h>
|
||||||
#include <dev/scsipi/scsipi_disk.h>
|
#include <dev/scsipi/scsipi_disk.h>
|
||||||
#include <dev/scsipi/atapi_all.h>
|
|
||||||
#include <dev/scsipi/atapi_disk.h>
|
#include <dev/scsipi/atapi_disk.h>
|
||||||
#include <dev/scsipi/atapiconf.h>
|
#include <dev/scsipi/atapiconf.h>
|
||||||
#include <dev/scsipi/sdvar.h>
|
#include <dev/scsipi/sdvar.h>
|
||||||
|
@ -192,8 +191,8 @@ sd_atapibus_get_parms(sd, dp, flags)
|
||||||
*/
|
*/
|
||||||
if (sd->sc_periph->periph_quirks & PQUIRK_NO_FLEX_PAGE)
|
if (sd->sc_periph->periph_quirks & PQUIRK_NO_FLEX_PAGE)
|
||||||
return (SDGP_RESULT_OK);
|
return (SDGP_RESULT_OK);
|
||||||
error = atapi_mode_sense(sd->sc_periph, ATAPI_FLEX_GEOMETRY_PAGE,
|
error = scsipi_mode_sense_big(sd->sc_periph, 0,
|
||||||
(struct atapi_mode_header *)&sense_data, FLEXGEOMETRYPAGESIZE,
|
ATAPI_FLEX_GEOMETRY_PAGE, &sense_data.header, FLEXGEOMETRYPAGESIZE,
|
||||||
flags | XS_CTL_DATA_ONSTACK, SDRETRIES, 20000);
|
flags | XS_CTL_DATA_ONSTACK, SDRETRIES, 20000);
|
||||||
SC_DEBUG(sd->sc_periph, SCSIPI_DB2,
|
SC_DEBUG(sd->sc_periph, SCSIPI_DB2,
|
||||||
("sd_atapibus_get_parms: mode sense (flex) error=%d\n", error));
|
("sd_atapibus_get_parms: mode sense (flex) error=%d\n", error));
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: sd_scsi.c,v 1.16 2001/04/25 17:53:41 bouyer Exp $ */
|
/* $NetBSD: sd_scsi.c,v 1.17 2001/05/14 20:35:29 bouyer Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
||||||
|
@ -90,7 +90,7 @@ struct scsipi_inquiry_pattern sd_scsibus_patterns[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sd_scsibus_mode_sense_data {
|
struct sd_scsibus_mode_sense_data {
|
||||||
struct scsi_mode_header header;
|
struct scsipi_mode_header header;
|
||||||
struct scsi_blk_desc blk_desc;
|
struct scsi_blk_desc blk_desc;
|
||||||
union scsi_disk_pages pages;
|
union scsi_disk_pages pages;
|
||||||
};
|
};
|
||||||
|
@ -160,11 +160,6 @@ sd_scsibus_mode_sense(sd, scsipi_sense, page, flags)
|
||||||
struct sd_scsibus_mode_sense_data *scsipi_sense;
|
struct sd_scsibus_mode_sense_data *scsipi_sense;
|
||||||
int page, flags;
|
int page, flags;
|
||||||
{
|
{
|
||||||
struct scsi_mode_sense sense_cmd;
|
|
||||||
struct scsi_mode_sense_big sensebig_cmd;
|
|
||||||
struct scsipi_generic *cmd;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure the sense buffer is clean before we do
|
* Make sure the sense buffer is clean before we do
|
||||||
* the mode sense, so that checks for bogus values of
|
* the mode sense, so that checks for bogus values of
|
||||||
|
@ -173,29 +168,18 @@ sd_scsibus_mode_sense(sd, scsipi_sense, page, flags)
|
||||||
bzero(scsipi_sense, sizeof(*scsipi_sense));
|
bzero(scsipi_sense, sizeof(*scsipi_sense));
|
||||||
|
|
||||||
if (sd->sc_periph->periph_quirks & PQUIRK_ONLYBIG) {
|
if (sd->sc_periph->periph_quirks & PQUIRK_ONLYBIG) {
|
||||||
memset(&sensebig_cmd, 0, sizeof(sensebig_cmd));
|
return scsipi_mode_sense_big(sd->sc_periph, 0, page,
|
||||||
sensebig_cmd.opcode = SCSI_MODE_SENSE_BIG;
|
(struct scsipi_mode_header_big*)&scsipi_sense->header,
|
||||||
sensebig_cmd.page = page;
|
sizeof(*scsipi_sense),
|
||||||
_lto2b(0x20, sensebig_cmd.length);
|
flags | XS_CTL_SILENT | XS_CTL_DATA_ONSTACK,
|
||||||
cmd = (struct scsipi_generic *)&sensebig_cmd;
|
SDRETRIES, 6000);
|
||||||
len = sizeof(sensebig_cmd);
|
|
||||||
} else {
|
} else {
|
||||||
memset(&sense_cmd, 0, sizeof(sense_cmd));
|
return scsipi_mode_sense(sd->sc_periph, 0, page,
|
||||||
sense_cmd.opcode = SCSI_MODE_SENSE;
|
&scsipi_sense->header, sizeof(*scsipi_sense),
|
||||||
sense_cmd.page = page;
|
flags | XS_CTL_SILENT | XS_CTL_DATA_ONSTACK,
|
||||||
sense_cmd.length = 0x20;
|
SDRETRIES, 6000);
|
||||||
cmd = (struct scsipi_generic *)&sense_cmd;
|
|
||||||
len = sizeof(sense_cmd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* If the command worked, use the results to fill out
|
|
||||||
* the parameter structure
|
|
||||||
*/
|
|
||||||
return (scsipi_command(sd->sc_periph,
|
|
||||||
cmd, len, (u_char *)scsipi_sense, sizeof(*scsipi_sense),
|
|
||||||
SDRETRIES, 6000, NULL,
|
|
||||||
flags | XS_CTL_DATA_IN | XS_CTL_SILENT | XS_CTL_DATA_ONSTACK));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -204,7 +188,6 @@ sd_scsibus_get_optparms(sd, dp, flags)
|
||||||
struct disk_parms *dp;
|
struct disk_parms *dp;
|
||||||
int flags;
|
int flags;
|
||||||
{
|
{
|
||||||
struct scsi_mode_sense scsipi_cmd;
|
|
||||||
struct sd_scsibus_mode_sense_data scsipi_sense;
|
struct sd_scsibus_mode_sense_data scsipi_sense;
|
||||||
u_long sectors;
|
u_long sectors;
|
||||||
int error;
|
int error;
|
||||||
|
@ -219,16 +202,11 @@ sd_scsibus_get_optparms(sd, dp, flags)
|
||||||
* However, there are stupid optical devices which does NOT
|
* However, there are stupid optical devices which does NOT
|
||||||
* support the page 6. Ghaa....
|
* support the page 6. Ghaa....
|
||||||
*/
|
*/
|
||||||
bzero(&scsipi_cmd, sizeof(scsipi_cmd));
|
error = scsipi_mode_sense(sd->sc_periph, 0, 0x3f, &scsipi_sense.header,
|
||||||
scsipi_cmd.opcode = SCSI_MODE_SENSE;
|
sizeof(struct scsipi_mode_header) + sizeof(struct scsi_blk_desc),
|
||||||
scsipi_cmd.page = 0x3f; /* all pages */
|
flags | XS_CTL_DATA_ONSTACK, SDRETRIES, 6000);
|
||||||
scsipi_cmd.length = sizeof(struct scsi_mode_header) +
|
|
||||||
sizeof(struct scsi_blk_desc);
|
|
||||||
|
|
||||||
if ((error = scsipi_command(sd->sc_periph,
|
if (error != 0)
|
||||||
(struct scsipi_generic *)&scsipi_cmd, sizeof(scsipi_cmd),
|
|
||||||
(u_char *)&scsipi_sense, sizeof(scsipi_sense), SDRETRIES,
|
|
||||||
6000, NULL, flags | XS_CTL_DATA_IN | XS_CTL_DATA_ONSTACK)) != 0)
|
|
||||||
return (SDGP_RESULT_OFFLINE); /* XXX? */
|
return (SDGP_RESULT_OFFLINE); /* XXX? */
|
||||||
|
|
||||||
dp->blksize = _3btol(scsipi_sense.blk_desc.blklen);
|
dp->blksize = _3btol(scsipi_sense.blk_desc.blklen);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: st.c,v 1.137 2001/05/06 11:31:08 hannken Exp $ */
|
/* $NetBSD: st.c,v 1.138 2001/05/14 20:35:29 bouyer Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
||||||
|
@ -1596,9 +1596,8 @@ st_mode_sense(st, flags)
|
||||||
{
|
{
|
||||||
u_int scsipi_sense_len;
|
u_int scsipi_sense_len;
|
||||||
int error;
|
int error;
|
||||||
struct scsi_mode_sense cmd;
|
|
||||||
struct scsipi_sense {
|
struct scsipi_sense {
|
||||||
struct scsi_mode_header header;
|
struct scsipi_mode_header header;
|
||||||
struct scsi_blk_desc blk_desc;
|
struct scsi_blk_desc blk_desc;
|
||||||
u_char sense_data[MAX_PAGE_0_SIZE];
|
u_char sense_data[MAX_PAGE_0_SIZE];
|
||||||
} scsipi_sense;
|
} scsipi_sense;
|
||||||
|
@ -1608,21 +1607,14 @@ st_mode_sense(st, flags)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up a mode sense
|
* Set up a mode sense
|
||||||
|
* We don't need the results. Just print them for our interest's sake,
|
||||||
|
* if asked, or if we need it as a template for the mode select store
|
||||||
|
* it away.
|
||||||
*/
|
*/
|
||||||
bzero(&cmd, sizeof(cmd));
|
error = scsipi_mode_sense(st->sc_periph, 0, SMS_PAGE_CTRL_CURRENT,
|
||||||
cmd.opcode = SCSI_MODE_SENSE;
|
&scsipi_sense.header, scsipi_sense_len, flags | XS_CTL_DATA_ONSTACK,
|
||||||
cmd.length = scsipi_sense_len;
|
ST_RETRIES, ST_CTL_TIME);
|
||||||
|
|
||||||
/*
|
|
||||||
* do the command, but we don't need the results
|
|
||||||
* just print them for our interest's sake, if asked,
|
|
||||||
* or if we need it as a template for the mode select
|
|
||||||
* store it away.
|
|
||||||
*/
|
|
||||||
error = scsipi_command(periph, (struct scsipi_generic *)&cmd,
|
|
||||||
sizeof(cmd), (u_char *)&scsipi_sense, scsipi_sense_len,
|
|
||||||
ST_RETRIES, ST_CTL_TIME, NULL,
|
|
||||||
flags | XS_CTL_DATA_IN | XS_CTL_DATA_ONSTACK);
|
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
|
@ -1657,9 +1649,8 @@ st_mode_select(st, flags)
|
||||||
int flags;
|
int flags;
|
||||||
{
|
{
|
||||||
u_int scsi_select_len;
|
u_int scsi_select_len;
|
||||||
struct scsi_mode_select cmd;
|
|
||||||
struct scsi_select {
|
struct scsi_select {
|
||||||
struct scsi_mode_header header;
|
struct scsipi_mode_header header;
|
||||||
struct scsi_blk_desc blk_desc;
|
struct scsi_blk_desc blk_desc;
|
||||||
u_char sense_data[MAX_PAGE_0_SIZE];
|
u_char sense_data[MAX_PAGE_0_SIZE];
|
||||||
} scsi_select;
|
} scsi_select;
|
||||||
|
@ -1682,10 +1673,6 @@ st_mode_select(st, flags)
|
||||||
/*
|
/*
|
||||||
* Set up for a mode select
|
* Set up for a mode select
|
||||||
*/
|
*/
|
||||||
bzero(&cmd, sizeof(cmd));
|
|
||||||
cmd.opcode = SCSI_MODE_SELECT;
|
|
||||||
cmd.length = scsi_select_len;
|
|
||||||
|
|
||||||
bzero(&scsi_select, scsi_select_len);
|
bzero(&scsi_select, scsi_select_len);
|
||||||
scsi_select.header.blk_desc_len = sizeof(struct scsi_blk_desc);
|
scsi_select.header.blk_desc_len = sizeof(struct scsi_blk_desc);
|
||||||
scsi_select.header.dev_spec &= ~SMH_DSP_BUFF_MODE;
|
scsi_select.header.dev_spec &= ~SMH_DSP_BUFF_MODE;
|
||||||
|
@ -1702,10 +1689,9 @@ st_mode_select(st, flags)
|
||||||
/*
|
/*
|
||||||
* do the command
|
* do the command
|
||||||
*/
|
*/
|
||||||
return (scsipi_command(periph, (struct scsipi_generic *)&cmd,
|
return scsipi_mode_select(periph, 0, &scsi_select.header,
|
||||||
sizeof(cmd), (u_char *)&scsi_select, scsi_select_len,
|
scsi_select_len, flags | XS_CTL_DATA_ONSTACK,
|
||||||
ST_RETRIES, ST_CTL_TIME, NULL,
|
ST_RETRIES, ST_CTL_TIME);
|
||||||
flags | XS_CTL_DATA_OUT | XS_CTL_DATA_ONSTACK));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -1714,10 +1700,9 @@ st_cmprss(st, onoff)
|
||||||
int onoff;
|
int onoff;
|
||||||
{
|
{
|
||||||
u_int scsi_dlen;
|
u_int scsi_dlen;
|
||||||
struct scsi_mode_select mcmd;
|
int byte2, page;
|
||||||
struct scsi_mode_sense scmd;
|
|
||||||
struct scsi_select {
|
struct scsi_select {
|
||||||
struct scsi_mode_header header;
|
struct scsipi_mode_header header;
|
||||||
struct scsi_blk_desc blk_desc;
|
struct scsi_blk_desc blk_desc;
|
||||||
u_char pdata[max(sizeof(struct scsi_tape_dev_conf_page),
|
u_char pdata[max(sizeof(struct scsi_tape_dev_conf_page),
|
||||||
sizeof(struct scsi_tape_dev_compression_page))];
|
sizeof(struct scsi_tape_dev_compression_page))];
|
||||||
|
@ -1728,41 +1713,33 @@ st_cmprss(st, onoff)
|
||||||
int error, ison, flags;
|
int error, ison, flags;
|
||||||
|
|
||||||
scsi_dlen = sizeof(scsi_pdata);
|
scsi_dlen = sizeof(scsi_pdata);
|
||||||
bzero(&scsi_pdata, scsi_dlen);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up for a mode sense.
|
|
||||||
* Do DATA COMPRESSION page first.
|
* Do DATA COMPRESSION page first.
|
||||||
*/
|
*/
|
||||||
bzero(&scmd, sizeof(scmd));
|
page = SMS_PAGE_CTRL_CURRENT | 0xf;
|
||||||
scmd.opcode = SCSI_MODE_SENSE;
|
byte2 = 0;
|
||||||
scmd.page = SMS_PAGE_CTRL_CURRENT | 0xf;
|
|
||||||
scmd.length = scsi_dlen;
|
|
||||||
|
|
||||||
flags = XS_CTL_SILENT;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do the MODE SENSE command...
|
* Do the MODE SENSE command...
|
||||||
*/
|
*/
|
||||||
again:
|
again:
|
||||||
bzero(&scsi_pdata, scsi_dlen);
|
bzero(&scsi_pdata, scsi_dlen);
|
||||||
error = scsipi_command(periph,
|
error = scsipi_mode_sense(periph, byte2, page,
|
||||||
(struct scsipi_generic *)&scmd, sizeof(scmd),
|
&scsi_pdata.header, scsi_dlen, flags | XS_CTL_DATA_ONSTACK,
|
||||||
(u_char *)&scsi_pdata, scsi_dlen,
|
ST_RETRIES, ST_CTL_TIME);
|
||||||
ST_RETRIES, ST_CTL_TIME, NULL,
|
|
||||||
flags | XS_CTL_DATA_IN | XS_CTL_DATA_ONSTACK);
|
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
if (scmd.byte2 != SMS_DBD) {
|
if (byte2 != SMS_DBD) {
|
||||||
scmd.byte2 = SMS_DBD;
|
byte2 = SMS_DBD;
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Try a different page?
|
* Try a different page?
|
||||||
*/
|
*/
|
||||||
if (scmd.page == (SMS_PAGE_CTRL_CURRENT | 0xf)) {
|
if (page == (SMS_PAGE_CTRL_CURRENT | 0xf)) {
|
||||||
scmd.page = SMS_PAGE_CTRL_CURRENT | 0x10;
|
page = SMS_PAGE_CTRL_CURRENT | 0x10;
|
||||||
scmd.byte2 = 0;
|
byte2 = 0;
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
return (error);
|
return (error);
|
||||||
|
@ -1773,7 +1750,7 @@ again:
|
||||||
else
|
else
|
||||||
ptr = (struct scsi_tape_dev_conf_page *) &scsi_pdata.blk_desc;
|
ptr = (struct scsi_tape_dev_conf_page *) &scsi_pdata.blk_desc;
|
||||||
|
|
||||||
if ((scmd.page & SMS_PAGE_CODE) == 0xf) {
|
if ((page & SMS_PAGE_CODE) == 0xf) {
|
||||||
cptr = (struct scsi_tape_dev_compression_page *) ptr;
|
cptr = (struct scsi_tape_dev_compression_page *) ptr;
|
||||||
ison = (cptr->dce_dcc & DCP_DCE) != 0;
|
ison = (cptr->dce_dcc & DCP_DCE) != 0;
|
||||||
if (onoff)
|
if (onoff)
|
||||||
|
@ -1819,10 +1796,6 @@ again:
|
||||||
else
|
else
|
||||||
scsi_pdata.header.dev_spec = 0;
|
scsi_pdata.header.dev_spec = 0;
|
||||||
|
|
||||||
bzero(&mcmd, sizeof(mcmd));
|
|
||||||
mcmd.opcode = SCSI_MODE_SELECT;
|
|
||||||
mcmd.byte2 = SMS_PF;
|
|
||||||
mcmd.length = scsi_dlen;
|
|
||||||
if (scsi_pdata.header.blk_desc_len) {
|
if (scsi_pdata.header.blk_desc_len) {
|
||||||
scsi_pdata.blk_desc.density = 0;
|
scsi_pdata.blk_desc.density = 0;
|
||||||
scsi_pdata.blk_desc.nblocks[0] = 0;
|
scsi_pdata.blk_desc.nblocks[0] = 0;
|
||||||
|
@ -1833,17 +1806,14 @@ again:
|
||||||
/*
|
/*
|
||||||
* Do the command
|
* Do the command
|
||||||
*/
|
*/
|
||||||
error = scsipi_command(periph,
|
error = scsipi_mode_select(periph, SMS_PF, &scsi_pdata.header,
|
||||||
(struct scsipi_generic *)&mcmd, sizeof(mcmd),
|
scsi_dlen, flags | XS_CTL_DATA_ONSTACK, ST_RETRIES, ST_CTL_TIME);
|
||||||
(u_char *)&scsi_pdata, scsi_dlen,
|
|
||||||
ST_RETRIES, ST_CTL_TIME, NULL,
|
|
||||||
flags | XS_CTL_DATA_OUT | XS_CTL_DATA_ONSTACK);
|
|
||||||
|
|
||||||
if (error && (scmd.page & SMS_PAGE_CODE) == 0xf) {
|
if (error && (page & SMS_PAGE_CODE) == 0xf) {
|
||||||
/*
|
/*
|
||||||
* Try DEVICE CONFIGURATION page.
|
* Try DEVICE CONFIGURATION page.
|
||||||
*/
|
*/
|
||||||
scmd.page = SMS_PAGE_CTRL_CURRENT | 0x10;
|
page = SMS_PAGE_CTRL_CURRENT | 0x10;
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
return (error);
|
return (error);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: umassbus.h,v 1.2 2001/04/25 17:53:43 bouyer Exp $ */
|
/* $NetBSD: umassbus.h,v 1.3 2001/05/14 20:35:29 bouyer Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001 The NetBSD Foundation, Inc.
|
* Copyright (c) 2001 The NetBSD Foundation, Inc.
|
||||||
|
@ -42,7 +42,6 @@
|
||||||
#include <dev/scsipi/scsipi_all.h>
|
#include <dev/scsipi/scsipi_all.h>
|
||||||
#include <dev/scsipi/scsiconf.h>
|
#include <dev/scsipi/scsiconf.h>
|
||||||
|
|
||||||
#include <dev/scsipi/atapi_all.h>
|
|
||||||
#include <dev/scsipi/atapiconf.h>
|
#include <dev/scsipi/atapiconf.h>
|
||||||
|
|
||||||
#include <dev/scsipi/scsipi_disk.h>
|
#include <dev/scsipi/scsipi_disk.h>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* $OpenBSD: usb_port.h,v 1.18 2000/09/06 22:42:10 rahnds Exp $ */
|
/* $OpenBSD: usb_port.h,v 1.18 2000/09/06 22:42:10 rahnds Exp $ */
|
||||||
/* $NetBSD: usb_port.h,v 1.43 2001/04/12 01:39:04 thorpej Exp $ */
|
/* $NetBSD: usb_port.h,v 1.44 2001/05/14 20:35:29 bouyer Exp $ */
|
||||||
/* $FreeBSD: src/sys/dev/usb/usb_port.h,v 1.21 1999/11/17 22:33:47 n_hibma Exp $ */
|
/* $FreeBSD: src/sys/dev/usb/usb_port.h,v 1.21 1999/11/17 22:33:47 n_hibma Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -84,6 +84,8 @@
|
||||||
#define Static static
|
#define Static static
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define SCSI_MODE_SENSE MODE_SENSE
|
||||||
|
|
||||||
typedef struct device *device_ptr_t;
|
typedef struct device *device_ptr_t;
|
||||||
#define USBBASEDEVICE struct device
|
#define USBBASEDEVICE struct device
|
||||||
#define USBDEV(bdev) (&(bdev))
|
#define USBDEV(bdev) (&(bdev))
|
||||||
|
|
Loading…
Reference in New Issue