Subject: kern/24015: kernel crash with satalink
To: None <gnats-bugs@gnats.NetBSD.org>
From: Arne H. Juul <arnej@pvv.ntnu.no>
List: netbsd-bugs
Date: 01/07/2004 22:40:39
>Number:         24015
>Category:       kern
>Synopsis:       kernel crash with satalink
>Confidential:   no
>Severity:       critical
>Priority:       low
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Jan 07 21:41:00 UTC 2004
>Closed-Date:
>Last-Modified:
>Originator:     Arne H Juul
>Release:        NetBSD 1.6ZG
>Organization:
	none
>Environment:
System: NetBSD blackbox 1.6ZG NetBSD 1.6ZG (BLACKBOX) #0: Tue Jan 6 11:48:45 CET 2004 arnej@blackbox:/sys/arch/i386/compile/BLACKBOX i386
Architecture: i386
Machine: i386
>Description:
	when attaching a WD disk on a SATALink 3112 I get
	a kernel page fault in wdc_exec_command+0x19, line 1458:

 wdc_exec_command(struct ata_drive_datas *drvp, struct wdc_command *wdc_c)
 {
        struct wdc_channel *chp = drvp->chnl_softc;
 -->    struct wdc_softc *wdc = chp->ch_wdc;

	The reason being that chnl_softc is never initialized.
	This normally happens in wdc_drvprobe but the satalink
	device driver sets up so its own sii3112_drv_probe is
	used instead.

	(It's strange nobody else have noticed this, so maybe
	there's some stupid mistake I've done?)

	Adding a line to set chnl_softc makes this driver work
	for me at least, yielding this dmesg snippet:

satalink0 at pci1 dev 13 function 0
satalink0: Silicon Image SATALink 3112 (rev. 0x02)
satalink0: SATALink BA5 register space disabled
satalink0: bus-master DMA support present
satalink0: primary channel wired to native-PCI mode
satalink0: using irq 11 for native-PCI interrupt
atabus0 at satalink0 channel 0
satalink0: secondary channel wired to native-PCI mode
atabus1 at satalink0 channel 1
satalink0: port 0: device present, speed: 1.5Gb/s
wd0 at atabus0 drive 0: <Maxtor 6Y120M0>
wd0: drive supports 16-sector PIO transfers, LBA addressing
wd0: 114 GB, 238216 cyl, 16 head, 63 sec, 512 bytes/sect x 240121728 sectors
wd0: 32-bit data port
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 6 (Ultra/133)
wd0(satalink0:0:0): using PIO mode 4, Ultra-DMA mode 6 (Ultra/133) (using DMA data transfers)

>How-To-Repeat:
	try to boot -current on a system with a WD attached
	via satalink.
>Fix:

Index: satalink.c
===================================================================
RCS file: /usr/cvs/src/sys/dev/pci/satalink.c,v
retrieving revision 1.11
diff -u -r1.11 satalink.c
--- satalink.c	3 Jan 2004 22:56:53 -0000	1.11
+++ satalink.c	6 Jan 2004 00:41:28 -0000
@@ -823,6 +823,7 @@
 		else
 			chp->ch_drive[0].drive_flags |= DRIVE_ATA;

+		chp->ch_drive[0].chnl_softc = chp;
 		aprint_normal("%s: port %d: device present, speed: %s\n",
 		    sc->sc_wdcdev.sc_dev.dv_xname, chp->ch_channel,
 		    sata_speed[(sstatus & SStatus_SPD_mask) >>
>Release-Note:
>Audit-Trail:
>Unformatted:
 	current as of 2004-01-06