diff options
-rw-r--r-- | lib/libcam/camlib.c | 31 | ||||
-rw-r--r-- | sys/cam/cam_xpt.c | 19 |
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; |