Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Jan 2006 21:09:47 +0100 (CET)
From:      Helge Oldach <freebsdpcic@oldach.net>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   i386/91919: pccbb does not supply appropriate voltage
Message-ID:  <200601172009.k0HK9lUR010462@sep.oldach.net>
Resent-Message-ID: <200601172020.k0HKK7AU027946@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         91919
>Category:       i386
>Synopsis:       pccbb does not supply appropriate voltage
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    freebsd-i386
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jan 17 20:20:06 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Helge Oldach
>Release:        FreeBSD 5.4-STABLE i386
>Organization:
>Environment:

System: FreeBSD localhost 5.4-STABLE FreeBSD 5.4-STABLE #598: Tue Jan 17 16:07:22 CET 2006 toor@localhost:/usr/obj/usr/src/sys/HMO i386

>Description:

I own an LG Electronics LW1100P wireless LAN PCI board, consisting of
a Texas Instruments TI-1211 PCI-CardBus bridge and a wi(4)-compatible
PCCARD.

This card is recognized with an OLDCARD kernel but not with a(n almost)
GENERIC kernel.

Debugging the GENERIC kernel delivered the following output:

cbb0: <TI1211 PCI-CardBus Bridge> at device 15.0 on pci0
cbb0: Lazy allocation of 0x1000 bytes rid 0x10 type 3 at 0x80000000
cbb0: Found memory at 80000000
cbb0: Secondary bus is 0
cbb0: Secondary bus set to 2 subbus 3
cardbus0: <CardBus bus> on cbb0
pccard0: <16-bit PCCard bus> on cbb0
cbb0: [MPSAFE]
cbb0: PCI Configuration space:
  0x00: 0xac1e104c 0x02100007 0x06070000 0x00024208 
  0x10: 0x80000000 0x020000a0 0x20030200 0xfffff000 
  0x20: 0x00000000 0xfffff000 0x00000000 0xfffffffc 
  0x30: 0x00000000 0xfffffffc 0x00000000 0x0740010b 
  0x40: 0x00000000 0x00000001 0x00000000 0x00000000 
  0x50: 0x00000000 0x00000000 0x00000000 0x00000000 
  0x60: 0x00000000 0x00000000 0x00000000 0x00000000 
  0x70: 0x00000000 0x00000000 0x00000000 0x00000000 
  0x80: 0x0044b060 0x00000000 0x00000000 0x00000022 
  0x90: 0x616600c0 0x00000000 0x00000000 0x00000000 
  0xa0: 0x7e210001 0x00c00000 0x0000000b 0x0000001f 
  0xb0: 0x09000000 0x00000000 0x00000000 0x00000000 
  0xc0: 0x00000000 0x00000000 0x00000000 0x00000000 
  0xd0: 0x00000000 0x00000000 0x00000000 0x00000000 
  0xe0: 0x00000000 0x00000000 0x00000000 0x00000000 
  0xf0: 0x00000000 0x00000000 0x00000000 0x00000000 
Status is 0x30001851
cbb0: card inserted: event=0x00000000, state=30001851
pccard0: chip_socket_enable
cbb_pcic_socket_enable:
cbb0: cbb_power: 2V
pccard0: read_cis
cis mem map 0xd31ad000 (resource: 0x88000000)
pccard0: CIS tuple chain:
CISTPL_END
 ff
cis mem map d31ad000
CISTPL_LINKTARGET expected, code ff observed
pccard0: check_cis_quirks
pccard0: Card has no functions!
cbb0: PC Card card activation failed

The interesting line is

cbb0: cbb_power: 2V

which is rather odd as this is a PCI board. There should be no reason
to activate this PCCARD at 2V only. It should either be a 5V or a 3.3V
PCCARD.

Even stranger, this PCCARD announces itself as

cbb0: card inserted: event=0x00000000, state=30001851

where the state basically says it supports 3.3V (0x0800) *and* 2V
(0x1000). This seems broken. I don't quite understand whether it's this
specific card, or a general issue with the bridge chip.

A quick code comparison revealed that the OLDCARD code is activating the
slots starting with the highest voltage (5V) first, while pccbb starts
at the lowest voltage (YV) first. For that reason this specific card was
configured at 2V and just didn't work.

For testing I changed the statement ordering around line 841 in pccbb.c
(according to the patch below), and voilá:

cbb0: <TI1211 PCI-CardBus Bridge> at device 15.0 on pci0
cbb0: Found memory at 80000000
cbb0: Secondary bus is 0
cbb0: Secondary bus set to 2 subbus 3
cardbus0: <CardBus bus> on cbb0
pccard0: <16-bit PCCard bus> on cbb0
Status is 0x30001851
cbb0: card inserted: event=0x00000000, state=30001851
pccard0: chip_socket_enable
cbb_pcic_socket_enable:
cbb0: cbb_power: 3V
pccard0: read_cis
cis mem map 0xd31ad000 (resource: 0x88000000)
pccard0: CIS tuple chain:
CISTPL_DEVICE type=null speed=null
 01 03 00 00 ff
CISTPL_DEVICE_A type=sram speed=ext
 17 04 67 5a 08 ff
[...]

I suspect that this issue might be the cause for lots of NEWCARD problem
reports that I've spotted through Google. There are tons of reports
basically saying that it "does work with 4.x but fails with 5.x" (or
6.x).

Note that 6-STABLE's pccbb.c does it the same way as 5.x.

So the question is:

- Is this a quirk of this specific card, or

- should the voltage activation code in pccbb.c reverted to the pcic.c
situation?

Alternatively, a sysctl might help.

>How-To-Repeat:

>Fix:

--- sys/dev/pccbb/pccbb.c.ctm	Thu Feb  3 07:44:38 2005
+++ sys/dev/pccbb/pccbb.c	Thu Jan 12 16:27:58 2006
@@ -842,14 +842,14 @@
 	/* Prefer lowest voltage supported */
 	voltage = cbb_detect_voltage(brdev);
 	cbb_power(brdev, CARD_OFF);
-	if (voltage & CARD_YV_CARD)
-		cbb_power(brdev, CARD_VCC(YV));
-	else if (voltage & CARD_XV_CARD)
-		cbb_power(brdev, CARD_VCC(XV));
+	if (voltage & CARD_5V_CARD)
+		cbb_power(brdev, CARD_VCC(5));
 	else if (voltage & CARD_3V_CARD)
 		cbb_power(brdev, CARD_VCC(3));
-	else if (voltage & CARD_5V_CARD)
-		cbb_power(brdev, CARD_VCC(5));
+	else if (voltage & CARD_XV_CARD)
+		cbb_power(brdev, CARD_VCC(XV));
+	else if (voltage & CARD_YV_CARD)
+		cbb_power(brdev, CARD_VCC(YV));
 	else {
 		device_printf(brdev, "Unknown card voltage\n");
 		return (ENXIO);
>Release-Note:
>Audit-Trail:
>Unformatted:



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