Unix Technical Forum

ohci at cardbus

This is a discussion on ohci at cardbus within the mailing.openbsd.tech forums, part of the OpenBSD category; --> This adds support for ohci cardbus adapters. It is based on code from NetBSD with minor tweaks. I probably ...


Go Back   Unix Technical Forum > Unix Operating Systems > OpenBSD > mailing.openbsd.tech

FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 02-18-2008, 08:22 AM
David Gwynne
 
Posts: n/a
Default ohci at cardbus

This adds support for ohci cardbus adapters. It is based on code from
NetBSD with minor tweaks. I probably could have passed ohci_pci.c through
sed and got the same result.

As well as this patch you need to add a line to your kernel config, eg

ohci* at cardbus?

I've only been able to test this on macppc where it works fine. I see no
reason why it shouldn't work on any other arch with cardbus support.

ehci at cardbus will follow on from this shortly.

DG

Index: dev/cardbus/files.cardbus
================================================== =================
RCS file: /cvs/openbsd/src/sys/dev/cardbus/files.cardbus,v
retrieving revision 1.7
diff -u -p -r1.7 files.cardbus
--- dev/cardbus/files.cardbus 22 Jun 2004 23:55:23 -0000 1.7
+++ dev/cardbus/files.cardbus 27 Oct 2004 13:03:51 -0000
@@ -69,8 +69,8 @@ file dev/cardbus/if_atw_cardbus.c atw_c
#
# OHCI USB controller
#
-#attach ohci at cardbus with ohci_cardbus
-#file dev/cardbus/ohci_cardbus.c ohci_cardbus
+attach ohci at cardbus with ohci_cardbus
+file dev/cardbus/ohci_cardbus.c ohci_cardbus

#
# Adaptec ADP-1480 SCSI controller
Index: dev/cardbus/ohci_cardbus.c
================================================== =================
RCS file: dev/cardbus/ohci_cardbus.c
diff -N dev/cardbus/ohci_cardbus.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ dev/cardbus/ohci_cardbus.c 27 Oct 2004 13:03:51 -0000
@@ -0,0 +1,249 @@
+/* $OpenBSD$ */
+/* $NetBSD: ohci_cardbus.c,v 1.19 2004/08/02 19:14:28 mycroft Exp $ */
+
+/*
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Lennart Augustsson (lennart@augustsson.net) at
+ * Carlstedt Research & Technology.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * USB Open Host Controller driver.
+ *
+ * OHCI spec: http://www.intel.com/design/usb/ohci11d.pdf
+ * USB spec: http://www.teleport.com/cgi-bin/mail...sb/cgiform.tpl
+ */
+
+#include <sys/cdefs.h>
+#ifdef __NetBSD__
+__KERNEL_RCSID(0, "$NetBSD: ohci_cardbus.c,v 1.19 2004/08/02 19:14:28 mycroft Exp $");
+#endif
+
+#if NEHCI_CARDBUS > 0
+#include "ehci_cardbus.h"
+#endif
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/device.h>
+#include <sys/proc.h>
+
+#include <machine/bus.h>
+
+#include <dev/cardbus/cardbusvar.h>
+#include <dev/pci/pcidevs.h>
+
+#if NEHCI_CARDBUS > 0
+#include <dev/cardbus/usb_cardbus.h>
+#endif
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usbdivar.h>
+#include <dev/usb/usb_mem.h>
+
+#include <dev/usb/ohcireg.h>
+#include <dev/usb/ohcivar.h>
+
+#ifdef __NetBSD__
+int ohci_cardbus_match(struct device *, struct cfdata *, void *);
+#else
+int ohci_cardbus_match(struct device *, void *, void *);
+#endif
+void ohci_cardbus_attach(struct device *, struct device *, void *);
+#ifdef __NetBSD__
+int ohci_cardbus_detach(device_ptr_t, int);
+#else
+int ohci_cardbus_detach(struct device *, int);
+#endif
+
+struct ohci_cardbus_softc {
+ ohci_softc_t sc;
+#if NEHCI_CARDBUS > 0
+ struct usb_cardbus sc_cardbus;
+#endif
+ cardbus_chipset_tag_t sc_cc;
+ cardbus_function_tag_t sc_cf;
+ cardbus_devfunc_t sc_ct;
+ void *sc_ih; /* interrupt vectoring */
+};
+
+#ifdef __NetBSD__
+CFATTACH_DECL(ohci_cardbus, sizeof(struct ohci_cardbus_softc),
+ ohci_cardbus_match, ohci_cardbus_attach, ohci_cardbus_detach, ohci_activate);
+#else
+struct cfattach ohci_cardbus_ca = {
+ sizeof(struct ohci_cardbus_softc), ohci_cardbus_match,
+ ohci_cardbus_attach, ohci_cardbus_detach, ohci_activate
+};
+#endif
+
+#define CARDBUS_INTERFACE_OHCI PCI_INTERFACE_OHCI
+#define CARDBUS_CBMEM PCI_CBMEM
+#define cardbus_findvendor pci_findvendor
+#define cardbus_devinfo pci_devinfo
+
+int
+#ifdef __NetBSD__
+ohci_cardbus_match(struct device *parent, struct cfdata *match, void *aux)
+#else
+ohci_cardbus_match(struct device *parent, void *match, void *aux)
+#endif
+{
+ struct cardbus_attach_args *ca = (struct cardbus_attach_args *)aux;
+
+ if (CARDBUS_CLASS(ca->ca_class) == CARDBUS_CLASS_SERIALBUS &&
+ CARDBUS_SUBCLASS(ca->ca_class) == CARDBUS_SUBCLASS_SERIALBUS_USB &&
+ CARDBUS_INTERFACE(ca->ca_class) == CARDBUS_INTERFACE_OHCI)
+ return (1);
+
+ return (0);
+}
+
+void
+ohci_cardbus_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct ohci_cardbus_softc *sc = (struct ohci_cardbus_softc *)self;
+ struct cardbus_attach_args *ca = aux;
+ cardbus_devfunc_t ct = ca->ca_ct;
+ cardbus_chipset_tag_t cc = ct->ct_cc;
+ cardbus_function_tag_t cf = ct->ct_cf;
+ cardbusreg_t csr;
+ usbd_status r;
+ const char *vendor;
+ const char *devname = sc->sc.sc_bus.bdev.dv_xname;
+
+#if defined(__NetBSD__)
+ char devinfo[256];
+ cardbus_devinfo(ca->ca_id, ca->ca_class, 0, devinfo, sizeof(devinfo));
+ printf(": %s (rev. 0x%02x)\n", devinfo,
+ CARDBUS_REVISION(ca->ca_class));
+#endif
+
+ /* Map I/O registers */
+ if (Cardbus_mapreg_map(ct, CARDBUS_CBMEM, CARDBUS_MAPREG_TYPE_MEM, 0,
+ &sc->sc.iot, &sc->sc.ioh, NULL, &sc->sc.sc_size)) {
+ printf("%s: can't map mem space\n", devname);
+ return;
+ }
+
+ /* Disable interrupts, so we don't get any spurious ones. */
+ bus_space_write_4(sc->sc.iot, sc->sc.ioh, OHCI_INTERRUPT_DISABLE,
+ OHCI_MIE);
+
+ sc->sc_cc = cc;
+ sc->sc_cf = cf;
+ sc->sc_ct = ct;
+ sc->sc.sc_bus.dmatag = ca->ca_dmat;
+
+#if rbus
+#else
+XXX (ct->ct_cf->cardbus_mem_open)(cc, 0, iob, iob + 0x40);
+#endif
+ (ct->ct_cf->cardbus_ctrl)(cc, CARDBUS_MEM_ENABLE);
+ (ct->ct_cf->cardbus_ctrl)(cc, CARDBUS_BM_ENABLE);
+
+ /* Enable the device. */
+ csr = cardbus_conf_read(cc, cf, ca->ca_tag,
+ CARDBUS_COMMAND_STATUS_REG);
+ cardbus_conf_write(cc, cf, ca->ca_tag, CARDBUS_COMMAND_STATUS_REG,
+ csr | CARDBUS_COMMAND_MASTER_ENABLE
+ | CARDBUS_COMMAND_MEM_ENABLE);
+
+ sc->sc_ih = cardbus_intr_establish(cc, cf, ca->ca_intrline,
+ IPL_USB, ohci_intr, sc);
+ if (sc->sc_ih == NULL) {
+ printf("%s: couldn't establish interrupt\n", devname);
+ return;
+ }
+ printf(": irq %d", ca->ca_intrline);
+
+ /* Figure out vendor for root hub descriptor. */
+ vendor = cardbus_findvendor(ca->ca_id);
+ sc->sc.sc_id_vendor = CARDBUS_VENDOR(ca->ca_id);
+ if (vendor)
+ strlcpy(sc->sc.sc_vendor, vendor, sizeof(sc->sc.sc_vendor));
+ else
+ snprintf(sc->sc.sc_vendor, sizeof(sc->sc.sc_vendor),
+ "vendor 0x%04x", CARDBUS_VENDOR(ca->ca_id));
+
+ r = ohci_init(&sc->sc);
+ if (r != USBD_NORMAL_COMPLETION) {
+ printf("%s: init failed, error=%d\n", devname, r);
+
+ /* Avoid spurious interrupts. */
+ cardbus_intr_disestablish(sc->sc_cc, sc->sc_cf, sc->sc_ih);
+ sc->sc_ih = 0;
+
+ return;
+ }
+
+#if NEHCI_CARDBUS > 0
+ usb_cardbus_add(&sc->sc_cardbus, ca, &sc->sc.sc_bus);
+#endif
+
+ /* Attach usb device. */
+ sc->sc.sc_child = config_found((void *)sc, &sc->sc.sc_bus,
+ usbctlprint);
+}
+
+int
+#ifdef __NetBSD__
+ohci_cardbus_detach(device_ptr_t self, int flags)
+#else
+ohci_cardbus_detach(struct device *self, int flags)
+#endif
+{
+ struct ohci_cardbus_softc *sc = (struct ohci_cardbus_softc *)self;
+ struct cardbus_devfunc *ct = sc->sc_ct;
+ int rv;
+
+ rv = ohci_detach(&sc->sc, flags);
+ if (rv)
+ return (rv);
+ if (sc->sc_ih != NULL) {
+ cardbus_intr_disestablish(sc->sc_cc, sc->sc_cf, sc->sc_ih);
+ sc->sc_ih = NULL;
+ }
+ if (sc->sc.sc_size) {
+ Cardbus_mapreg_unmap(ct, CARDBUS_CBMEM, sc->sc.iot,
+ sc->sc.ioh, sc->sc.sc_size);
+ sc->sc.sc_size = 0;
+ }
+#if NEHCI_CARDBUS > 0
+ usb_cardbus_rem(&sc->sc_cardbus);
+#endif
+ return (0);
+}
Index: dev/usb/usb.c
================================================== =================
RCS file: /cvs/openbsd/src/sys/dev/usb/usb.c,v
retrieving revision 1.29
diff -u -p -r1.29 usb.c
--- dev/usb/usb.c 8 Jul 2004 22:18:44 -0000 1.29
+++ dev/usb/usb.c 27 Oct 2004 13:03:52 -0000
@@ -234,7 +234,10 @@ USB_ATTACH(usb)
sc->sc_bus->use_polling--;

config_pending_incr();
- usb_kthread_create(usb_create_event_thread, sc);
+ if (cold)
+ usb_kthread_create(usb_create_event_thread, sc);
+ else
+ usb_create_event_thread(sc);

USB_ATTACH_SUCCESS_RETURN;
}

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump


All times are GMT. The time now is 06:18 PM.


Powered by vBulletin® Version 3.6.5
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.2.0
www.UnixAdminTalk.com