USB umass blues

Miguel Mendez flynn at energyhq.es.eu.org
Sun Feb 1 08:40:20 PST 2004


Hi,

I've been trying to figure out a problem I've been experiencing with my 
mp3 player on DFly.

Scenario:

All SCSI system, no ide devices. First usb port is attached to my laser 
printer, second is free (most of the time a usb joypad is there), which 
is the one I use to connect my AudioKey2 USB mp3 player. Attach goes 
fine, device is detected and I can mount the filesystem ok. But, when I 
detach it, it takes away the entire "da" driver. Trying something like 
'ls' causes an instant panic with a "Page not present" fault, since it 
tries to jump to 0x8:0. Of course I can't get a kernel crashdump either.

Now, there's something strange at boot time:

WARNING: "da" is usurping "da"'s cdevsw[]

Given my little umass and cam-fu, I've managed to track the panic 
problem down to /sys/bus/cam/scsi/scsi_da.c. I've written a 
super-hackish bandaid patch that lets me keep the system alive, read: 
not have to reboot every time I need to access my usb mp3 player. I 
suspect that the main problem lies elsewhere in the da allocation code, 
which I still haven't studied, but I intend to.

Anyone else finding him/herself in this situation can give my patch a 
try. Spare me the comments about the quality of the patch, I know the 
code is not correct and pretty much sucks, but it does the job until I 
can come up with a proper solution :)

Cheers,
--
	Miguel Mendez <flynn at xxxxxxxxxxxxxxxxxx>
	http://www.energyhq.es.eu.org
	PGP Key: 0xDC8514F1
Index: scsi_da.c
===================================================================
RCS file: /home/dcvs/src/sys/bus/cam/scsi/scsi_da.c,v
retrieving revision 1.12
diff -u -u -r1.12 scsi_da.c
--- scsi_da.c	29 Dec 2003 06:42:10 -0000	1.12
+++ scsi_da.c	1 Feb 2004 16:25:30 -0000
@@ -1051,22 +1051,35 @@
 
 	softc = (struct da_softc *)periph->softc;
 
-	devstat_remove_entry(&softc->device_stats);
-	cam_extend_release(daperiphs, periph->unit_number);
-	xpt_print_path(periph->path);
-	printf("removing device entry\n");
-	/*
-	 * If we can't free the sysctl tree, oh well...
-	 */
-	if ((softc->flags & DA_FLAG_SCTX_INIT) != 0
-	    && sysctl_ctx_free(&softc->sysctl_ctx) != 0) {
+	if(1) {
+		printf("Attempted to remove %s (%d)\n",
+		periph->periph_name,
+		periph->unit_number);
+
+		if ((softc->flags & DA_FLAG_SCTX_INIT) != 0
+		    && sysctl_ctx_free(&softc->sysctl_ctx) != 0) {
+		  xpt_print_path(periph->path);
+		  printf("can't remove sysctl context\n");
+		}
+
+	} else {
+
+		devstat_remove_entry(&softc->device_stats);
+		cam_extend_release(daperiphs, periph->unit_number);
 		xpt_print_path(periph->path);
-		printf("can't remove sysctl context\n");
-	}
-	if (softc->disk.d_dev) {
-		disk_destroy(&softc->disk);
+		printf("removing device entry\n");
+	  
+		if ((softc->flags & DA_FLAG_SCTX_INIT) != 0
+		    && sysctl_ctx_free(&softc->sysctl_ctx) != 0) {
+		  xpt_print_path(periph->path);
+		  printf("can't remove sysctl context\n");
+		}
+		if (softc->disk.d_dev) {
+		  disk_destroy(&softc->disk);
+		}
+		free(softc, M_DEVBUF);
 	}
-	free(softc, M_DEVBUF);
+
 }
 
 static void




More information about the Kernel mailing list