Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Jan 2003 11:31:57 -0800 (PST)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        Nate Lawson <nate@root.org>
Cc:        Kenneth Culver <culverk@yumyumyum.org>, Trish Lynch <trish@bsdunix.net>, freebsd-current@FreeBSD.ORG
Subject:   Re: FreeBSD panic with umass
Message-ID:  <200301201931.h0KJVvWM070129@apollo.backplane.com>
References:   <Pine.BSF.4.21.0301201115030.62414-100000@root.org>

next in thread | previous in thread | raw e-mail | index | archive | help
:Backtrace would be useful since you shouldn't be getting a panic.  At the
:worst, your usb reader just wouldn't work.
:
:-Nate

    At worse the system will crash.  The problem is that USB devices
    sometimes return total garbage for the READ CAPACITY command.  This
    isn't CAM's fault, it is a major issue with the way the USB code works
    as well as a major issue with the way certain USB devices respond
    to commands (or request lengths) that they do not understand.  Sometimes
    the USB layer does not get an error or returns the wrong sense code.
    The USB code can also somtimes get out of sync with the device between
    commands, causing all sorts of havoc.

    When I was tracking down the Sony DiskKey problem I hit this problem.
    The Sony often returned complete garbage for READ CAPACITY until I put
    the proper quirk entries in.  Since the CAM/SCSI layer does not bzero()
    the scsi_read_capacity_data structure, the result was random capacities
    and system crashes (e.g. when a certain value would wind up 0 the CAM
    layer would crash with a divide by 0).

    I added some debugging to try to catch the problem and it still happens
    to be in my tree so I can give you guys the diff.  This is *NOT* for
    commit.  It's just junk debugging code.  Note that I added the M_ZERO
    option to the malloc.

						-Matt

Index: scsi_da.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/scsi/scsi_da.c,v
retrieving revision 1.42.2.30
diff -u -r1.42.2.30 scsi_da.c
--- scsi_da.c	20 Dec 2002 15:20:25 -0000	1.42.2.30
+++ scsi_da.c	30 Dec 2002 23:22:22 -0000
@@ -546,8 +556,10 @@
 
 		rcap = (struct scsi_read_capacity_data *)malloc(sizeof(*rcap),
 								M_TEMP,
-								M_WAITOK);
-		
+								M_WAITOK|M_ZERO);
+		scsi_ulto4b(3133333, (void *)&rcap->length);
+		scsi_ulto4b(512, (void *)&rcap->addr);
+
 		ccb = cam_periph_getccb(periph, /*priority*/1);
 		scsi_read_capacity(&ccb->csio,
 				   /*retries*/1,
@@ -1187,6 +1199,7 @@
 		softc->minimum_cmd_size = 10;
 	else
 		softc->minimum_cmd_size = 6;
+	printf("QUIRKS %04x MCS %d MATCH %p\n", softc->quirks, softc->minimum_cmd_size, match);
 
 	/*
 	 * Block our timeout handler while we
@@ -1748,6 +1761,8 @@
 	dp = &softc->params;
 	dp->secsize = scsi_4btoul(rdcap->length);
 	dp->sectors = scsi_4btoul(rdcap->addr) + 1;
+	printf("RDCAP SECSIZE %d\n", (int)dp->secsize);
+	printf("RDCAP SECTORS %d\n", (int)dp->sectors);
 	/*
 	 * Have the controller provide us with a geometry
 	 * for this disk.  The only time the geometry
@@ -1767,6 +1782,7 @@
 	dp->heads = ccg.heads;
 	dp->secs_per_track = ccg.secs_per_track;
 	dp->cylinders = ccg.cylinders;
+	printf("RDCAP HEADS %d SPT %d CYL %d\n", (int)ccg.heads, (int)ccg.secs_per_track, (int)ccg.cylinders);
 }
 
 static void

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200301201931.h0KJVvWM070129>