Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Mar 2000 00:41:14 -0700
From:      Warner Losh <imp@village.org>
To:        John Hay <jhay@mikom.csir.co.za>, freebsd-mobile@FreeBSD.ORG
Subject:   Re: No PC-CARD Slots; Device Not Configured 
Message-ID:  <200003150741.AAA81106@harmony.village.org>
In-Reply-To: Your message of "Tue, 14 Mar 2000 23:25:20 MST." <200003150625.XAA50080@harmony.village.org> 
References:  <200003150625.XAA50080@harmony.village.org>  <200003150623.IAA64088@zibbi.mikom.csir.co.za> 

next in thread | previous in thread | raw e-mail | index | archive | help
In message <200003150625.XAA50080@harmony.village.org> Warner Losh writes:
: In message <200003150623.IAA64088@zibbi.mikom.csir.co.za> John Hay writes:
: : If you can find it, I volunteer to try it out. :-)
: 
: I can find and/or rewrite it.

Wound up being impatient, and rewrote it.  Turns out I didn't have the
cardbus pci card in the unit I sent to be repaired.  This is lightly
tested.  Looks a lot like the pd6832 version, but is different in a
few subtle ways.  I suspect that we always want to do most, if not
all, of what I'm doing here.  Will save us some grief no doubt.  Maybe
even have a suspend/resume code to do something similar to help
some newer laptops a little before we get acpi.

Hmmm, now where did I put that paper copy of the standard that I
have.  I'll have to verify this against yenta at some point.  But not
tonight.  Tonight I sleep.

I got my card to work in polling mode, but didn't have a spare IRQ on
my server and didn't want to try too configure one either since the
cardbus card is in the system only for a short while...  Well, also
when I did specify an IRQ it was wrong and it didn't work :-)

If you have a laptop that exhibits the no slots found problem, and
have a TI 12xx chipset, please give this a spin and let me know if it
fixes it.  If you don't have the no slots found problem, but do have a
TI 12xx chipset, try it and let me know if I've broken something for
you :-)

Also, don't believe the comments in the header of the
ti12xx_legacy_init code too much.  The TI doc is good in some places
about calling out differences from the standard, and lousy in other
places.  That's why I need to go over this when I have my pcmcia
standard paper copy in front of me and enough brain cells to ponder it
more fully.

If I was really massocistic, I'd try to talk to the cardbus bridge in
non-legacy mode and implement a newbus attachment.  But I'm going to
do that anyway for NEWCARD :-)

Warner

Index: pcic_p.c
===================================================================
RCS file: /home/imp/FreeBSD/CVS/src/sys/pci/pcic_p.c,v
retrieving revision 1.20
diff -u -r1.20 pcic_p.c
--- pcic_p.c	2000/02/02 16:49:21	1.20
+++ pcic_p.c	2000/03/15 07:30:23
@@ -112,6 +112,59 @@
 }
 
 /*
+ * According to the docs for the TI chipset, this will work with any YENTA
+ * conforming card bus bridge.
+ */
+static void
+ti12xx_legacy_init(device_t self)
+{
+	u_long bcr; 		/* to set interrupts */
+	u_short io_port;	/* the io_port to map this slot on */
+
+	/* 
+	 * First, just to be "safe", we muck with the power registers
+	 * to put the chip into D0 power state.  But read the power
+	 * management capabilities register first and only do it for
+	 * version 1 cards.
+	 */
+	if ((pci_read_config(self, 0xa2, 2) & 0x7) == 0x1) {
+		pci_write_config(self, 0xa4, 
+		    pci_read_config(self, 0xa4, 2) & ~0x3, 2);
+	}
+	
+	/*
+	 * Only set legecay mode on first card.  This will have
+	 * functions 0 and 1 and will probe as units 0 and 1.
+	 */
+	if (device_get_unit(self) > 1)
+		return;
+
+	/*
+	 * Set legacy I/O address to 0x3e0.  Only need to do this
+	 * for first function/unit.
+	 */
+	if (device_get_unit(self) != 0) {
+		io_port = PCIC_INDEX_0;
+		pci_write_config(self, CLPD6832_LEGACY_16BIT_IOADDR, 
+		    io_port & ~PCI_MAP_IO, 4);
+	}
+
+	/*
+	 * Set default operating mode (I/O port space, Parity error enable
+	 * and busmaster).
+	 */
+	pci_write_config(self, PCI_COMMAND_STATUS_REG,
+	    pci_read_config(self, PCI_COMMAND_STATUS_REG, 2) | 0x47, 2);
+
+	/*
+	 * Enable isa-style IRQ interrupts.
+	 */
+	bcr = pci_read_config(self, 0x3e, 2);
+	bcr |= 0x84;
+	pci_write_config(self, 0x3e, bcr, 2);
+}
+
+/*
  * Return the ID string for the controller if the vendor/product id
  * matches, NULL otherwise.
  */
@@ -215,6 +268,13 @@
 	u_int32_t device_id = pci_get_devid(self);
 
 	switch (device_id) {
+	case PCI_DEVICE_ID_PCIC_TI1220:
+	case PCI_DEVICE_ID_PCIC_TI1221:
+	case PCI_DEVICE_ID_PCIC_TI1250:
+	case PCI_DEVICE_ID_PCIC_TI1251:
+	case PCI_DEVICE_ID_PCIC_TI1251B:
+	case PCI_DEVICE_ID_PCIC_TI1225:
+		ti12xx_legacy_init(self);
 	case PCI_DEVICE_ID_PCIC_CLPD6832:
 		pd6832_legacy_init(self);
 		break;
Index: pcic_p.h
===================================================================
RCS file: /home/imp/FreeBSD/CVS/src/sys/pci/pcic_p.h,v
retrieving revision 1.10
diff -u -r1.10 pcic_p.h
--- pcic_p.h	1999/12/31 07:22:24	1.10
+++ pcic_p.h	2000/02/07 05:47:36
@@ -52,6 +52,8 @@
 #define	PCI_DEVICE_ID_RICOH_RL5C475	0x04751180ul
 #define	PCI_DEVICE_ID_RICOH_RL5C476	0x04761180ul
 #define	PCI_DEVICE_ID_RICOH_RL5C478	0x04781180ul
+
+#define PCI_DEVICE_ID_COMPAQ_CARDBUS_READER 0x010013f6ul
   
 /* CL-PD6832 CardBus defines */
 #define	CLPD6832_IO_BASE0		0x002c


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-mobile" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200003150741.AAA81106>