Attaching any CDROM/DVDRIVE causes this error message
when mouting a disk.

cd0(pciide0:0:1): timeout
type: atapi
c_bcount : 2048
c_skip : 0

The machine then freezes and a hard reboot is necessary.

This issue has been reported by 2 users in the past:
http://archives.neohapsis.com/archives/openbsd/2005-11/0782.html
``
> > cd0(pciide0:0:0): timeout
> > type: atapi
> > c_bcount: 0
> > c_skip: 0
> > cd0(pciide0:0:0): timeout
> > type: atapi
> > c_bcount: 32

A workaround was to disable pciide:
UKC> disable pciide*
59 pciide* disabled
UKC> quit
Continuing... 

Looking closely, these problems occur with this variant of the SiS 5513
EIDE chipset:
pciide0 at pci0 dev 2 function 5 "SiS 5513 EIDE" rev 0x01: 5597/5598: DMA, chann
el 0 wired to compatibility, channel 1 wired to compatibility
atapiscsi0 at pciide0 channel 0 drive 1
scsibus0 at atapiscsi0: 2 targets
cd0 at scsibus0 targ 0 lun 0: <ATAPI, CD-ROM 52X, 172A> ATAPI 5/cdrom removable
cd0(pciide0:0:1): using PIO mode 4, DMA mode 2

By disabling dma, the issue goes away.

Looking at pciide.c shows that there are 2 variants of the 5597/5598:
The one with rev 0xd0 which support UDMA and the previous versions
with no support for UltraDMA. To be more precise UDMA exists but it's
buggy.

It appears that rev 0x01 has a buggy DMA support. Falling back to PIO
works fine. The diff disables DMA silently but not enabling DMA capabilities
on rev 0x01 of 5597/5598.

new dmesg:
pciide0 at pci0 dev 2 function 5 "SiS 5513 EIDE" rev 0x01: 5597/5598: DMA, 
channel 0 wired to compatibility, channel 1 wired to compatibility
atapiscsi0 at pciide0 channel 0 drive 1
scsibus0 at atapiscsi0: 2 targets
cd0 at scsibus0 targ 0 lun 0: <ATAPI, CD-ROM 52X, 172A> ATAPI 5/cdrom removable
cd0(pciide0:0:1): using PIO mode 4
pciide0: channel 1 ignored (disabled)

Diff:
Index: sys/dev/pci/pciide.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/pciide.c,v
retrieving revision 1.335
diff -u -p -r1.335 pciide.c
--- sys/dev/pci/pciide.c        12 Nov 2011 18:39:23 -0000      1.335
+++ sys/dev/pci/pciide.c        2 Jan 2012 20:47:37 -0000
@@ -4908,13 +4908,14 @@ static struct sis_hostbr_type {
        u_int8_t udma_mode;
        char *name;
        u_int8_t type;
-#define SIS_TYPE_NOUDMA        0
-#define SIS_TYPE_66    1
-#define SIS_TYPE_100OLD        2
-#define SIS_TYPE_100NEW 3
-#define SIS_TYPE_133OLD 4
-#define SIS_TYPE_133NEW 5
-#define SIS_TYPE_SOUTH 6
+#define SIS_TYPE_NODMA 0
+#define SIS_TYPE_NOUDMA        1
+#define SIS_TYPE_66    2
+#define SIS_TYPE_100OLD        3
+#define SIS_TYPE_100NEW 4
+#define SIS_TYPE_133OLD 5
+#define SIS_TYPE_133NEW 6
+#define SIS_TYPE_SOUTH  7
 } sis_hostbr_type[] = {
        /* Most infos here are from [email protected] */
        {PCI_PRODUCT_SIS_530, 0x00, 4, "530", SIS_TYPE_66},
@@ -5043,7 +5044,12 @@ sis_chip_map(struct pciide_softc *sc, st
                        sis->sis_type = SIS_TYPE_66;
                } else {
                        sc->sc_wdcdev.UDMA_cap = 0;
-                       sis->sis_type = SIS_TYPE_NOUDMA;
+                       if (rev == 0x01) {
+                               sc->sc_wdcdev.DMA_cap = 0;
+                               sis->sis_type = SIS_TYPE_NODMA;
+                       }
+                       else
+                               sis->sis_type = SIS_TYPE_NOUDMA;
                }
        }
 
@@ -5052,19 +5058,22 @@ sis_chip_map(struct pciide_softc *sc, st
 
        sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
            WDC_CAPABILITY_MODE;
+       sc->sc_wdcdev.PIO_cap = 4;
        if (sc->sc_dma_ok) {
-               sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
-               sc->sc_wdcdev.irqack = pciide_irqack;
-               if (sis->sis_type >= SIS_TYPE_66)
-                       sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
+               if (sis->sis_type > SIS_TYPE_NODMA) {
+                       sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA |
+                           WDC_CAPABILITY_IRQACK;
+                       sc->sc_wdcdev.irqack = pciide_irqack;
+                       sc->sc_wdcdev.DMA_cap = 2;
+                       if (sis->sis_type >= SIS_TYPE_66)
+                               sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
+               }
        }
 
-       sc->sc_wdcdev.PIO_cap = 4;
-       sc->sc_wdcdev.DMA_cap = 2;
-
        sc->sc_wdcdev.channels = sc->wdc_chanarray;
        sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
        switch (sis->sis_type) {
+       case SIS_TYPE_NODMA:
        case SIS_TYPE_NOUDMA:
        case SIS_TYPE_66:
        case SIS_TYPE_100OLD:
@@ -5264,6 +5273,7 @@ sis_setup_channel(struct channel_softc *
                }
                idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
 pio:           switch (sis->sis_type) {
+               case SIS_TYPE_NODMA:
                case SIS_TYPE_NOUDMA:
                case SIS_TYPE_66:
                case SIS_TYPE_100OLD:

Reply via email to