2006-08-04 13:36:01

by Romano Giannetti

[permalink] [raw]
Subject: [SOLUTION/HACK/PUZZLED] pcmcia modem only works with cardmgr in recent 2.6.15 kernel.

SHORT: if your modem on a double function pcmcia card stop working with
newer kernels, get rid of *.cis file, start (deprecated) cardmgr modem,
and the card will work again.

LONG: Hi, this is a sort-of "solution" (although hack is a better word)
to my problem reported here:

http://lists.infradead.org/pipermail/linux-pcmcia/2006-July/003772.html

and maybe to

http://lists.infradead.org/pipermail/linux-pcmcia/2006-July/003776.html

Moreover, I have a bug open on:

https://launchpad.net/distros/ubuntu/+source/pcmciautils/+bug/52510


Now, the thing is a bit complex, so let me explain. The problem is that
just the first function of my pcmcia ethernet/modem card is detected. My
system is an uptodate Ubuntu dapper.

If I copy the correct (for what it's worth) CIS file in /lib/firmware,
and then use pccardctl to load it:

root@rukbat:/lib/firmware# pccardctl insert 1

SYS: Aug 4 15:21:42 localhost kernel: [ 3098.044000] pccard: PCMCIA
card inserted into slot 1
SYS: Aug 4 15:21:42 localhost kernel: [ 3098.044000] pcmcia:
registering new device pcmcia1.0
SYS: Aug 4 15:21:42 localhost kernel: [ 3098.104000] eth1: 3Com 3c589,
io 0x300, irq 3, hw_addr 00:00:86:1A:4E:A8
SYS: Aug 4 15:21:42 localhost kernel: [ 3098.108000] 8K FIFO split
5:3 Rx:Tx, auto xcvr

just the first function (ethernet is detected).

If I eject it and use the cardmgr daemon (should have been obsoleted,
no?) I have this:

root@rukbat:/lib/firmware# cardmgr
cardmgr[8613]: could not adjust resource: IO ports 0xc00-0xcff: Function
not implemented
cardmgr[8613]: could not adjust resource: IO ports 0x100-0x4ff: Function
not implemented
cardmgr[8613]: could not adjust resource: memory 0xc0000-0xfffff:
Function not implemented
cardmgr[8613]: could not adjust resource: memory 0x60000000-0x60ffffff:
Function not implemented
cardmgr[8613]: could not adjust resource: memory 0xa0000000-0xa0ffffff:
Function not implemented
cardmgr[8613]: could not adjust resource: IO ports 0xa00-0xaff: Function
not implemented

root@rukbat:/lib/firmware# cardctl insert 1

SYS: Aug 4 15:23:37 localhost kernel: [ 3212.900000] pcmcia:
registering new device pcmcia1.0
SYS: Aug 4 15:23:37 localhost kernel: [ 3212.952000] eth1: 3Com 3c589,
io 0x300, irq 3, hw_addr 00:00:86:1A:4E:A8
SYS: Aug 4 15:23:37 localhost kernel: [ 3212.952000] 8K FIFO split
5:3 Rx:Tx, auto xcvr
SYS: Aug 4 15:23:37 localhost cardmgr[8614]: socket 1: Anonymous Memory
SYS: Aug 4 15:23:37 localhost cardmgr[8614]: executing: 'modprobe
memory_cs 2>&1'
SYS: Aug 4 15:23:37 localhost cardmgr[8614]: + FATAL: Module memory_cs
not found.
SYS: Aug 4 15:23:37 localhost cardmgr[8614]: modprobe exited with
status 1
SYS: Aug 4 15:23:37 localhost cardmgr[8614]:
module /lib/modules/2.6.15-26-386/pcmcia/memory_cs.o not available
SYS: Aug 4 15:23:37 localhost cardmgr[8614]: bind 'memory_cs' to socket
1 failed: Invalid argument

Ok, no joy. But if I rename away the cis file:

root@rukbat:/lib/firmware# cardctl eject 1
root@rukbat:/lib/firmware# cardctl insert 1

YS: Aug 4 15:26:04 localhost kernel: [ 3360.212000] pccard: PCMCIA card
inserted into slot 1
SYS: Aug 4 15:26:04 localhost kernel: [ 3360.212000] pcmcia:
registering new device pcmcia1.0
SYS: Aug 4 15:26:04 localhost firmware_helper[8741]: main: error
loading '/lib/firmware/3CXEM556.cis' for device '/class/firmware/1.0'
with driver '(unknown)'
SYS: Aug 4 15:26:04 localhost cardmgr[8614]: socket 1: 3Com/Megahertz
3CXEM556 Ethernet/Modem
SYS: Aug 4 15:26:04 localhost kernel: [ 3360.504000] eth1: 3Com 3c589,
io 0x300, irq 3, hw_addr 00:00:86:1A:4E:A8
SYS: Aug 4 15:26:04 localhost kernel: [ 3360.504000] 8K FIFO split
5:3 Rx:Tx, auto xcvr
SYS: Aug 4 15:26:04 localhost kernel: [ 3360.504000] pcmcia:
registering new device pcmcia1.1
SYS: Aug 4 15:26:04 localhost kernel: [ 3360.552000] 1.1: ttyS1 at I/O
0x2f8 (irq = 3) is a 16550A
SYS: Aug 4 15:26:04 localhost firmware_helper[8747]: main: error
loading '/lib/firmware/3CXEM556.cis' for device '/class/firmware/1.0'
with driver '(unknown)'
SYS: Aug 4 15:26:05 localhost cardmgr[8614]: executing: './network
start eth1 2>&1'
SYS: Aug 4 15:26:05 localhost cardmgr[8614]: +
cat: /var/lib/misc/pcmcia-scheme: No such file or directory
SYS: Aug 4 15:26:05 localhost cardmgr[8614]: executing: './serial start
ttyS1 2>&1'

and voila, MY MODEM WORKS.

So, maybe the CIS file is busted. I tried
root@rukbat:/lib/firmware# dump_cis
[...]
Socket 1:
dev_info
NULL 0ns, 512b
vers_1 5.0, "3Com", "Megahertz 3CXEM556", "LAN + 56k Modem", ""
manfid 0x0101, 0x0035
funcid multi_function
mfc {
funcid network_adapter
config base 0x0800 mask 0x0063 last_index 0x07
cftable_entry 0x07
Vcc Vnom 5V
io 0x0000-0x000f [lines=4] [8bit] [16bit]
irq mask 0xffff [level]
}, {
funcid serial_port
config base 0x0900 mask 0x0063 last_index 0x27
cftable_entry 0x27
Vcc Vnom 5V
io 0x0000-0x0007 [lines=3] [8bit]
irq mask 0xffff [level]
}

and if I try the file:

root@rukbat:/lib/firmware# dump_cis -i 3CXEM556.cis.orig
dev_info
NULL 0ns, 512b
vers_1 5.0, "3Com", "Megahertz 3CXEM556", "LAN + 56k Modem", ""
manfid 0x0101, 0x0035
funcid multi_function
mfc {
}

ok, something is wrong.

But if I try to feed the dump_cis to pack_cis, I have exactly the same
file as before. No go without cardmgr.

So... my modem works and I'm happy. But I think something is really
busted here.

Hope this helps someone,

Romano