summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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