Date: Mon, 20 Jan 2003 14:53:47 -0500 (EST) From: Kenneth Culver <culverk@yumyumyum.org> To: Matthew Dillon <dillon@apollo.backplane.com> Cc: Nate Lawson <nate@root.org>, Trish Lynch <trish@bsdunix.net>, <freebsd-current@FreeBSD.ORG> Subject: Re: FreeBSD panic with umass Message-ID: <20030120145222.E14910-100000@alpha.yumyumyum.org> In-Reply-To: <200301201931.h0KJVvWM070129@apollo.backplane.com>
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
Hmm, good stuff, but shouldn't something be committed anyway? I mean if it
causes a panic just by plugging in the device that's totally unacceptable.
I'll provide a backtrace of the crash on my computer tomorrow I suppose (I
won't be home until then) and let people know if that's what's causing my
crash.
Ken
>
> 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?20030120145222.E14910-100000>
