diff options
author | Stefan Sperling <stsp@cvs.openbsd.org> | 2013-01-04 23:19:41 +0000 |
---|---|---|
committer | Stefan Sperling <stsp@cvs.openbsd.org> | 2013-01-04 23:19:41 +0000 |
commit | 59f1342291f7d15a9b502c5bb75f30adff942aa4 (patch) | |
tree | 3902f7883f5f6e06e7428d867883a7318a7b377b | |
parent | 244cb54e30b6c10df2d1875c89288c77e2e96d90 (diff) |
Attach rtsx(4) only to devices using the 'undefined' PCI class, and do
not ever attach sdhc(4) to devices matching the rtsx(4) vendor/product ID.
Fixes an issue reported by Dave Anderson where on his hardware both drivers
attached to apparently the same device which then failed to work reliably.
ok deraadt
-rw-r--r-- | sys/dev/pci/rtsx_pci.c | 10 | ||||
-rw-r--r-- | sys/dev/pci/sdhc_pci.c | 13 |
2 files changed, 20 insertions, 3 deletions
diff --git a/sys/dev/pci/rtsx_pci.c b/sys/dev/pci/rtsx_pci.c index 127f43f341a..5dfa3f3fcd9 100644 --- a/sys/dev/pci/rtsx_pci.c +++ b/sys/dev/pci/rtsx_pci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtsx_pci.c,v 1.1 2012/11/29 23:36:34 stsp Exp $ */ +/* $OpenBSD: rtsx_pci.c,v 1.2 2013/01/04 23:19:40 stsp Exp $ */ /* * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org> @@ -48,8 +48,14 @@ rtsx_pci_match(struct device *parent, void *match, void *aux) { struct pci_attach_args *pa = aux; + /* + * Explicitly match the UNDEFINED device class only. Some RTS5902 + * devices advertise a SYSTEM/SDHC class in addition to the UNDEFINED + * device class. Let sdhc(4) handle the SYSTEM/SDHC ones. + */ if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_REALTEK && - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_REALTEK_RTS5209) + PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_REALTEK_RTS5209 && + PCI_CLASS(pa->pa_class) == PCI_CLASS_UNDEFINED) return 1; return 0; diff --git a/sys/dev/pci/sdhc_pci.c b/sys/dev/pci/sdhc_pci.c index 5abe511d84e..77dc54d1627 100644 --- a/sys/dev/pci/sdhc_pci.c +++ b/sys/dev/pci/sdhc_pci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sdhc_pci.c,v 1.13 2012/10/08 21:47:50 deraadt Exp $ */ +/* $OpenBSD: sdhc_pci.c,v 1.14 2013/01/04 23:19:40 stsp Exp $ */ /* * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org> @@ -66,6 +66,17 @@ sdhc_pci_match(struct device *parent, void *match, void *aux) { struct pci_attach_args *pa = aux; + /* + * The Realtek RTS5209 is supported by rtsx(4). Usually the device + * class for these is UNDEFINED but there are RTS5209 devices which + * are advertising an SYSTEM/SDHC device class in addition to a + * separate device advertising the UNDEFINED class. Such devices are + * not compatible with sdhc(4), so ignore them. + */ + if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_REALTEK && + PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_REALTEK_RTS5209) + return 0; + if (PCI_CLASS(pa->pa_class) == PCI_CLASS_SYSTEM && PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_SYSTEM_SDHC) return 1; |