Subject: Re: CVS commit: src/sys/dev/pcmcia
To: Jason Thorpe <thorpej@shagadelic.org>
From: Christos Zoulas <christos@zoulas.com>
List: source-changes
Date: 01/11/2006 13:21:11
On Jan 11,  9:26am, thorpej@shagadelic.org (Jason Thorpe) wrote:
-- Subject: Re: CVS commit: src/sys/dev/pcmcia

| There should be a way to set max # of drives per channel, and I  
| suggest you use that... the phantom drive is pretty annoying.

looking in wdc.c, not only ch_ndrive is hard-coded to 2, but there
are multiple XXX comments about ch_ndrive, and there are even 2 loops
that do:

    for (drive = 0; drive < 2; drive++) {
    }

Yes, it can all be fixed, but I will let the wdc experts do it. Here's
a patch:

Index: wdc.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/wdc.c,v
retrieving revision 1.231
diff -u -u -r1.231 wdc.c
--- wdc.c	16 Nov 2005 23:39:08 -0000	1.231
+++ wdc.c	11 Jan 2006 18:20:11 -0000
@@ -223,7 +223,7 @@
 	struct wdc_softc *wdc = CHAN_TO_WDC(chp);
 	struct wdc_regs *wdr = &wdc->regs[chp->ch_channel];
 	u_int8_t st0 = 0, st1 = 0;
-	int i, error, s;
+	int i, j, error, s;
 
 	if (wdcprobe1(chp, 0) == 0) {
 		/* No drives, abort the attach here. */
@@ -275,7 +275,7 @@
 	/* Wait a bit, some devices are weird just after a reset. */
 	delay(5000);
 
-	for (i = 0; i < 2; i++) {
+	for (i = 0; i < chp->ch_ndrive; i++) {
 		/* XXX This should be done by other code. */
 		chp->ch_drive[i].chnl_softc = chp;
 		chp->ch_drive[i].drive = i;
@@ -321,9 +321,8 @@
 		if (error == CMD_OK) {
 			/* If IDENTIFY succeeded, this is not an OLD ctrl */
 			s = splbio();
-			/* XXXJRT ch_ndrive */
-			chp->ch_drive[0].drive_flags &= ~DRIVE_OLD;
-			chp->ch_drive[1].drive_flags &= ~DRIVE_OLD;
+			for (j = 0; j < chp->ch_ndrive; j++)
+				chp->ch_drive[j].drive_flags &= ~DRIVE_OLD;
 			splx(s);
 		} else {
 			s = splbio();
@@ -383,11 +382,9 @@
 				splx(s);
 			} else {
 				s = splbio();
-				/* XXXJRT ch_ndrive */
-				chp->ch_drive[0].drive_flags &=
-				    ~(DRIVE_ATA | DRIVE_ATAPI);
-				chp->ch_drive[1].drive_flags &=
-				    ~(DRIVE_ATA | DRIVE_ATAPI);
+				for (j = 0; j < chp->ch_ndrive; j++)
+					chp->ch_drive[j].drive_flags &=
+					    ~(DRIVE_ATA | DRIVE_ATAPI);
 				splx(s);
 			}
 		}
@@ -638,7 +635,7 @@
 	 * be something here assume it's ATA or OLD.  Ghost will be killed
 	 * later in attach routine.
 	 */
-	for (drive = 0; drive < 2; drive++) {
+	for (drive = 0; drive < chp->ch_ndrive; drive++) {
 		if ((ret_value & (0x01 << drive)) == 0)
 			continue;
 		if (wdc->select)
@@ -684,10 +681,12 @@
 	struct wdc_softc *wdc = CHAN_TO_WDC(chp);
 
 	/*
-	 * Start out assuming 2 drives.  This may change as we probe
-	 * drives.
+	 * XXX: Compatibility
+	 * If the driver did not specify how many drives, default to 2.
 	 */
-	chp->ch_ndrive = 2;
+	if (chp->ch_ndrive == 0)
+		chp->ch_ndrive = 2;
+	KASSERT(chp->ch_ndrive < 3);
 
 	/* default data transfer methods */
 	if (wdc->datain_pio == NULL)

christos