summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorken <ken@FreeBSD.org>1998-10-12 21:54:13 +0000
committerken <ken@FreeBSD.org>1998-10-12 21:54:13 +0000
commit9cc9919f6877497f1ddce140c2cf5a96c5759591 (patch)
treea78bd059751ece9bdda46f9b977c5cbd4ab3fd59
parente3811b3baef7b2a5f5d2e006655b12a7fbe4bb77 (diff)
downloadFreeBSD-src-9cc9919f6877497f1ddce140c2cf5a96c5759591.zip
FreeBSD-src-9cc9919f6877497f1ddce140c2cf5a96c5759591.tar.gz
Add a "dummy light" (actually two dummy lights) to catch people who don't
have the passthrough device configured in their kernel. This will hopefully reduce the number of people complaining that they can't get {camcontrol, xmcd, tosha, cdrecord, etc.} to work. Reviewed by: gibbs
-rw-r--r--lib/libcam/camlib.c31
-rw-r--r--sys/cam/cam_xpt.c19
2 files changed, 45 insertions, 5 deletions
diff --git a/lib/libcam/camlib.c b/lib/libcam/camlib.c
index af62266..d4ba57e 100644
--- a/lib/libcam/camlib.c
+++ b/lib/libcam/camlib.c
@@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id$
+ * $Id: camlib.c,v 1.1 1998/09/15 06:16:46 gibbs Exp $
*/
#include <sys/types.h>
@@ -491,11 +491,29 @@ cam_lookup_pass(const char *dev_name, int unit, int flags,
/*
* Attempt to get the passthrough device. This ioctl will fail if
- * the device name is null, or if the device doesn't exist.
+ * the device name is null, if the device doesn't exist, or if the
+ * passthrough driver isn't in the kernel.
*/
if (ioctl(fd, CAMGETPASSTHRU, &ccb) == -1) {
- sprintf(cam_errbuf, "%s: CAMGETPASSTHRU ioctl failed\n"
- "%s: %s", func_name, func_name, strerror(errno));
+ char tmpstr[256];
+
+ /*
+ * If we get ENOENT from the transport layer version of
+ * the CAMGETPASSTHRU ioctl, it means one of two things:
+ * either the device name/unit number passed in doesn't
+ * exist, or the passthrough driver isn't in the kernel.
+ */
+ if (errno == ENOENT) {
+ snprintf(tmpstr, sizeof(tmpstr),
+ "\n%s: either the pass driver isn't in "
+ "your kernel\n%s: or %s%d doesn't exist",
+ func_name, func_name, dev_name, unit);
+ }
+ snprintf(cam_errbuf, sizeof(cam_errbuf),
+ "%s: CAMGETPASSTHRU ioctl failed\n"
+ "%s: %s%s", func_name, func_name, strerror(errno),
+ (errno == ENOENT) ? tmpstr : "");
+
return(NULL);
}
@@ -589,6 +607,11 @@ cam_real_open_device(const char *path, int flags, struct cam_device *device,
* parameter: the passthrough driver unit number.
*/
if (ioctl(fd, CAMGETPASSTHRU, &ccb) == -1) {
+ /*
+ * At this point we know the passthrough device must exist
+ * because we just opened it above. The only way this
+ * ioctl can fail is if the ccb size is wrong.
+ */
sprintf(cam_errbuf, "%s: CAMGETPASSTHRU ioctl failed\n"
"%s: %s", func_name, func_name, strerror(errno));
goto crod_bailout;
diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c
index 8c438bd..6a42588 100644
--- a/sys/cam/cam_xpt.c
+++ b/sys/cam/cam_xpt.c
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: cam_xpt.c,v 1.17 1998/10/07 03:25:21 gibbs Exp $
+ * $Id: cam_xpt.c,v 1.18 1998/10/10 21:10:36 gibbs Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
@@ -941,6 +941,7 @@ xptioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
char *name;
int unit;
int cur_generation;
+ int base_periph_found;
int splbreaknum;
int s;
int i;
@@ -959,6 +960,8 @@ xptioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
ccb = (union ccb *)addr;
+ base_periph_found = 0;
+
/*
* Sanity check -- make sure we don't get a null peripheral
* driver name.
@@ -1018,6 +1021,7 @@ ptstartover:
struct cam_ed *device;
int i;
+ base_periph_found = 1;
device = periph->path->device;
for (i = 0, periph = device->periphs.slh_first;
periph != NULL;
@@ -1077,6 +1081,19 @@ ptstartover:
*ccb->cgdl.periph_name = '\0';
ccb->cgdl.unit_number = 0;
error = ENOENT;
+ /*
+ * It is unfortunate that this is even necessary,
+ * but there are many, many clueless users out there.
+ * If this is true, the user is looking for the
+ * passthrough driver, but doesn't have one in his
+ * kernel.
+ */
+ if (base_periph_found == 1) {
+ printf("xptioctl: pass driver is not in the "
+ "kernel\n");
+ printf("xptioctl: put \"device pass0\" in "
+ "your kernel config file\n");
+ }
}
splx(s);
break;
OpenPOWER on IntegriCloud