1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-10-20 20:09:11 +00:00

Add CAM support to xmcd. This patch makes xmcd autodetect a CAM system,

and use the appropriate SCSI interface code.

This patch has been sitting around for 3 weeks, and no one committed it, so
I thought I'd commit it before the ports freeze tomorrow.

xmcd-2.3pl1 will have native CAM support, but since it looks unlikely it'll
be out before tomorrow, we'll have to go with the "unofficial" CAM patch.

PR:		ports/7957
Submitted by:	maintainer ("Daniel M. Eischen" <eischen@vigrid.com>)
This commit is contained in:
Kenneth D. Merry 1998-10-09 23:59:18 +00:00
parent f1cd6e32b1
commit 0ce4ba886f
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=13799

433
audio/xmcd/files/patch-ad Normal file
View File

@ -0,0 +1,433 @@
diff -Nrc ../xmcd-2.3.orig/cda_d/Imakefile ./cda_d/Imakefile
*** ../xmcd-2.3.orig/cda_d/Imakefile Sat May 23 00:31:57 1998
--- ./cda_d/Imakefile Sun Jun 28 19:38:31 1998
***************
*** 93,98 ****
--- 93,104 ----
#else
#if defined(FreeBSDArchitecture)
LOCAL_LIBRARIES=-lncurses -lmytinfo
+ /*
+ * Check for a CAM system.
+ */
+ .if exists(/usr/include/camlib.h)
+ LOCAL_LIBRARIES+= -lcam
+ .endif
#else
#if defined(NetBSDArchitecture) || defined(__bsdi__)
LOCAL_LIBRARIES=
diff -Nrc ../xmcd-2.3.orig/libdi_d/Imakefile ./libdi_d/Imakefile
*** ../xmcd-2.3.orig/libdi_d/Imakefile Sat May 23 00:31:44 1998
--- ./libdi_d/Imakefile Sun Jun 28 18:50:28 1998
***************
*** 69,74 ****
--- 69,80 ----
DEFINES=
#endif
+ #if defined(FreeBSDArchitecture)
+ .if exists(/usr/include/camlib.h)
+ DEFINES+= -DFREEBSD_CAM
+ .endif
+ #endif
+
/*
* Add local include path
*/
***************
*** 88,93 ****
--- 94,100 ----
os_bsdi.c \
os_dec.c \
os_dgux.c \
+ os_fbcam.c \
os_fnbsd.c \
os_hpux.c \
os_irix.c \
***************
*** 121,126 ****
--- 128,134 ----
os_bsdi.o \
os_dec.o \
os_dgux.o \
+ os_fbcam.o \
os_fnbsd.o \
os_hpux.o \
os_irix.o \
diff -Nrc ../xmcd-2.3.orig/libdi_d/os_fbcam.c ./libdi_d/os_fbcam.c
*** ../xmcd-2.3.orig/libdi_d/os_fbcam.c Wed Dec 31 17:00:00 1969
--- ./libdi_d/os_fbcam.c Wed Sep 16 18:31:47 1998
***************
*** 0 ****
--- 1,202 ----
+ /*
+ * libdi - scsipt SCSI Device Interface Library
+ *
+ * Copyright (C) 1993-1998 Ti Kan
+ * E-mail: ti@amb.org
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+ /*
+ * FreeBSD CAM support.
+ *
+ * Author: Kenneth D. Merry
+ * E-Mail: ken@kdm.org
+ *
+ * This code provides an interface to the SCSI passthrough driver in
+ * FreeBSD's CAM implementation.
+ */
+ #ifndef LINT
+ static char *_os_fbcam_c_ident_ = "@(#)";
+ #endif
+
+ #include "common_d/appenv.h"
+ #include "common_d/util.h"
+ #include "libdi_d/libdi.h"
+ #include "libdi_d/scsipt.h"
+
+ #if defined(__FreeBSD__) && defined(FREEBSD_CAM)
+
+ extern appdata_t app_data;
+ extern bool_t scsipt_notrom_error;
+ extern FILE *errfp;
+ extern di_client_t *di_clinfo;
+
+ struct cam_device *cam_dev;
+
+ /*
+ * pthru_send
+ * Send SCSI command to the device.
+ *
+ * Args:
+ * fd - Device file descriptor
+ * cmdpt - Pointer to the SCSI command CDB
+ * cmdlen - SCSI command size (6, 10 or 12 bytes)
+ * datapt - Pointer to the data buffer
+ * datalen - Data transfer size (bytes)
+ * rw - Data transfer direction flag (OP_NODATA, OP_DATAIN or OP_DATAOUT)
+ * tmout - Command timeout interval (seconds)
+ * prnerr - Whether an error message should be displayed
+ * when a command fails
+ *
+ * Return:
+ * TRUE - command completed successfully
+ * FALSE - command failed
+ */
+ bool_t
+ pthru_send(
+ int fd,
+ byte_t *cmdpt,
+ int cmdlen,
+ byte_t *datapt,
+ int datalen,
+ byte_t rw,
+ int tmout,
+ bool_t prnerr
+ )
+ {
+ union ccb ccb;
+ char *path,
+ title[FILE_PATH_SZ + 20];
+
+ if (fd < 0 || scsipt_notrom_error)
+ return FALSE;
+
+ path = di_devgetpath(fd);
+
+ (void)memset(&ccb, 0, sizeof(ccb));
+
+ cam_fill_csio(&ccb.csio,
+ /* retries */ 0,
+ /* cbfcnp */ NULL,
+ /* flags */ (rw == OP_DATAIN) ? CAM_DIR_IN :
+ (rw == OP_DATAOUT) ? CAM_DIR_OUT :
+ CAM_DIR_NONE,
+ /* tag_action */ MSG_SIMPLE_Q_TAG,
+ /* data_ptr */ (u_int8_t *)datapt,
+ /* dxfer_len */ datalen,
+ /* sense_len */ SSD_FULL_SIZE,
+ /* cdb_len */ cmdlen,
+ /* timeout */ (tmout ? tmout : DFLT_CMD_TIMEOUT) * 1000);
+
+ /* Disable freezing the device queue */
+ ccb.ccb_h.flags |= CAM_DEV_QFRZDIS;
+
+ (void)memcpy(ccb.csio.cdb_io.cdb_bytes, cmdpt, cmdlen);
+
+ if (app_data.debug) {
+ (void) sprintf(title, "SCSI CDB bytes (dev=%s rw=%d to=%d)",
+ path, rw, tmout);
+ util_dbgdump(title, cmdpt, cmdlen);
+ }
+
+ /* Send the command down via the passthrough driver */
+ if (cam_send_ccb(cam_dev, &ccb) < 0) {
+ if (app_data.scsierr_msg && prnerr)
+ perror("CAMIOCOMMAND ioctl failed");
+ return FALSE;
+ }
+
+ if ((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
+ if (((ccb.ccb_h.status & CAM_STATUS_MASK) ==
+ CAM_SCSI_STATUS_ERROR)
+ && (app_data.scsierr_msg)
+ && prnerr) {
+ char tmpstr[4096];
+ scsi_sense_string(cam_dev, &ccb.csio, tmpstr,
+ sizeof(tmpstr));
+ (void)fprintf(errfp, "%s: %s\n", APPNAME, tmpstr);
+ } else if (app_data.scsierr_msg && prnerr) {
+ (void)fprintf(errfp, "%s: error %d returned from"
+ " SCSI command\n", APPNAME,
+ ccb.ccb_h.status);
+ }
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+
+ /*
+ * pthru_open
+ * Open SCSI pass-through device
+ *
+ * Args:
+ * path - device path name string
+ *
+ * Return:
+ * Device file descriptor, or -1 on failure.
+ */
+ int
+ pthru_open(char *path)
+ {
+
+ if ((cam_dev = cam_open_device(path, O_RDWR)) == NULL) {
+ DBGPRN(errfp, "%s", cam_errbuf);
+ return(-1);
+ }
+
+ (void) di_devreg(cam_dev->fd, path);
+ return (cam_dev->fd);
+ }
+
+
+ /*
+ * pthru_close
+ * Close SCSI pass-through device
+ *
+ * Args:
+ * fd - Device file descriptor
+ *
+ * Return:
+ * Nothing.
+ */
+ void
+ pthru_close(int fd)
+ {
+ di_devunreg(fd);
+ cam_close_device(cam_dev);
+ }
+
+
+ /*
+ * pthru_vers
+ * Return OS Interface Module version string
+ *
+ * Args:
+ * Nothing.
+ *
+ * Return:
+ * Module version text string.
+ */
+ char *
+ pthru_vers(void)
+ {
+ return ("OS Interface module for FreeBSD/CAM\n");
+ }
+
+ #endif /* __FreeBSD__ FREEBSD_CAM */
+
diff -Nrc ../xmcd-2.3.orig/libdi_d/os_fbcam.h ./libdi_d/os_fbcam.h
*** ../xmcd-2.3.orig/libdi_d/os_fbcam.h Wed Dec 31 17:00:00 1969
--- ./libdi_d/os_fbcam.h Sun Jun 28 18:49:17 1998
***************
*** 0 ****
--- 1,60 ----
+ /*
+ * libdi - scsipt SCSI Device Interface Library
+ *
+ * Copyright (C) 1993-1998 Ti Kan
+ * E-mail: ti@amb.org
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+ /*
+ * FreeBSD CAM support
+ *
+ * Author: Kenneth D. Merry
+ * E-Mail: ken@kdm.org
+ *
+ * This code provides an interface to the SCSI passthrough driver in
+ * FreeBSD's CAM implementation.
+ */
+ #ifndef __OS_FBCAM_H__
+ #define __OS_FBCAM_H__
+
+ #if defined(__FreeBSD__) && defined(FREEBSD_CAM)
+
+ #ifndef LINT
+ static char *_os_fnbsd_h_ident_ = "@(#)os_fnbsd.h 6.14 98/01/02";
+ #endif
+
+ #include <cam/cam.h>
+ #include <cam/cam_ccb.h>
+ #include <cam/scsi/scsi_message.h>
+ #include <camlib.h>
+
+
+ #define OS_MODULE /* Indicate that this is compiled on a supported OS */
+ #define SETUID_ROOT /* Setuid root privilege is required */
+
+
+ /* Public function prototypes */
+ extern bool_t pthru_send(int, byte_t *, int, byte_t *, int, byte_t,
+ int, bool_t);
+ extern int pthru_open(char *);
+ extern void pthru_close(int);
+ extern char *pthru_vers(void);
+
+ #endif /* __FreeBSD__ FREEBSD_CAM*/
+
+ #endif /* __OS_BCAM_H__ */
+
diff -Nrc ../xmcd-2.3.orig/libdi_d/os_fnbsd.c ./libdi_d/os_fnbsd.c
*** ../xmcd-2.3.orig/libdi_d/os_fnbsd.c Sat May 23 00:31:45 1998
--- ./libdi_d/os_fnbsd.c Sun Jun 28 18:21:53 1998
***************
*** 44,50 ****
#include "libdi_d/scsipt.h"
#if (defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) && \
! defined(DI_SCSIPT) && !defined(DEMO_ONLY)
extern appdata_t app_data;
extern bool_t scsipt_notrom_error;
--- 44,50 ----
#include "libdi_d/scsipt.h"
#if (defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) && \
! defined(DI_SCSIPT) && !defined(DEMO_ONLY) && !defined(FREEBSD_CAM)
extern appdata_t app_data;
extern bool_t scsipt_notrom_error;
***************
*** 232,236 ****
#endif /* __FreeBSD__ */
}
! #endif /* __FreeBSD__ __NetBSD__ __OpenBSD__ DI_SCSIPT DEMO_ONLY */
--- 232,236 ----
#endif /* __FreeBSD__ */
}
! #endif /* __FreeBSD__ __NetBSD__ __OpenBSD__ DI_SCSIPT DEMO_ONLY FREEBSD_CAM*/
diff -Nrc ../xmcd-2.3.orig/libdi_d/os_fnbsd.h ./libdi_d/os_fnbsd.h
*** ../xmcd-2.3.orig/libdi_d/os_fnbsd.h Sat May 23 00:31:45 1998
--- ./libdi_d/os_fnbsd.h Sun Jun 28 18:45:40 1998
***************
*** 34,40 ****
#define __OS_FNBSD_H__
#if (defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) && \
! defined(DI_SCSIPT) && !defined(DEMO_ONLY)
#ifndef LINT
static char *_os_fnbsd_h_ident_ = "@(#)os_fnbsd.h 6.14 98/01/02";
--- 34,40 ----
#define __OS_FNBSD_H__
#if (defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) && \
! defined(DI_SCSIPT) && !defined(DEMO_ONLY) && !defined(FREEBSD_CAM)
#ifndef LINT
static char *_os_fnbsd_h_ident_ = "@(#)os_fnbsd.h 6.14 98/01/02";
***************
*** 54,60 ****
extern void pthru_close(int);
extern char *pthru_vers(void);
! #endif /* __FreeBSD__ __NetBSD__ __OpenBSD__ DI_SCSIPT DEMO_ONLY */
#endif /* __OS_FNBSD_H__ */
--- 54,60 ----
extern void pthru_close(int);
extern char *pthru_vers(void);
! #endif /* __FreeBSD__ __NetBSD__ __OpenBSD__ DI_SCSIPT DEMO_ONLY FREEBSD_CAM*/
#endif /* __OS_FNBSD_H__ */
diff -Nrc ../xmcd-2.3.orig/libdi_d/scsipt.h ./libdi_d/scsipt.h
*** ../xmcd-2.3.orig/libdi_d/scsipt.h Sat May 23 00:31:44 1998
--- ./libdi_d/scsipt.h Sun Jun 28 18:45:08 1998
***************
*** 587,592 ****
--- 587,593 ----
#include "libdi_d/os_bsdi.h" /* BSDI BSD/OS */
#include "libdi_d/os_dec.h" /* Digital OSF/1 & Ultrix */
#include "libdi_d/os_dgux.h" /* Data General DG/UX */
+ #include "libdi_d/os_fbcam.h" /* FreeBSD CAM */
#include "libdi_d/os_fnbsd.h" /* FreeBSD/NetBSD */
#include "libdi_d/os_hpux.h" /* HP-UX */
#include "libdi_d/os_irix.h" /* SGI IRIX */
diff -Nrc ../xmcd-2.3.orig/xmcd_d/Imakefile ./xmcd_d/Imakefile
*** ../xmcd-2.3.orig/xmcd_d/Imakefile Sat May 23 00:31:49 1998
--- ./xmcd_d/Imakefile Sun Jun 28 19:39:51 1998
***************
*** 68,73 ****
--- 68,81 ----
DEFINES=
#endif
+ /*
+ * Check for a FreeBSD/CAM system.
+ */
+ #if defined(FreeBSDArchitecture)
+ .if exists(/usr/include/camlib.h)
+ LOCAL_LIBRARIES+= -lcam
+ .endif
+ #endif
/*
* Add local include path