Date: Tue, 10 Dec 1996 12:03:59 +1030 (CST) From: Michael Smith <msmith@atrad.adelaide.edu.au> To: pst@shockwave.com (Paul Traina) Cc: msmith@atrad.adelaide.edu.au, Andrew.Gordon@net-tel.co.uk, nate@freebsd.org, mobile@freebsd.org, hackers@freebsd.org, pst@jnx.com Subject: Re: need help with a PC CARD NE2000 clone... Message-ID: <199612100134.MAA11963@genesis.atrad.adelaide.edu.au> In-Reply-To: <199612091804.KAA01333@precipice.shockwave.com> from Paul Traina at "Dec 9, 96 10:04:26 am"
next in thread | previous in thread | raw e-mail | index | archive | help
(It made it OK Paul, I just had to go to sleep at some point 8)
> > Note that if this really is an NE2000 clone, it doesn't need any
> > memory address space (the on-card RAM is driven by i/o) - unlike some
> > of the other cards supported by the ed driver.
>
> Yeah, I agree. Why does it have two blocks of memory?
Not entirely sure. It looks like the card might have a boot ROM on it;
I can't find any other justification for this, which is a write-protected
32K region :
> Tuple #1, code = 0x1 (Common memory descriptor), length = 3
> 000: dc 03 ff
> Common memory device information:
> Device number 1, type Function specific, WPS = ON
> Speed = 100nS, Memory block size = 32Kb, 1 units
I can only assume that pccardd is trying to DTRT and map this in somewhere.
> # cat /etc/pccard.conf
...
> # Generally available IO ports
> io 0x240-0x360
> # Generally available IRQs (Built-in sound-card owners remove 5)
> irq 3 5 10 11 13 15
Does your notebook really have all these resources available? (Lots have
onboard peripherals scattered around. I'd have expected the PCIC to be
given IRQ 3...)
> # Available memory slots
> memory 0xd0000 96k (I've tried this at d4000)
Should be plenty of space anyway.
> PC-Card Intel 82365 (5 mem & 2 I/O windows)
> pcic: controller irq 3
As I thought, the PCIC is getting IRQ 3. You will want to remove this
from the list of available IRQs (no, I know this isn't your problem).
> Code 240 not found
> Code 240 not found
> code Unknown ignored
There's a tuple in the card with an unknown (0xf0) code; no idea what it's
supposed to be.
> Breakpoint 1, assign_io (sp=0x19100) at cardd.c:464
> 464 cis = sp->cis;
> (gdb) n
> 465 defconf = cis->def_config;
> (gdb) print *cis
> $1 = {tlist = 0x18160, manuf = "PMX ", '\000' <repeats 13 times>,
> vers = "PE-200", '\000' <repeats 13 times>,
> add_info1 = "ETHERNET", '\000' <repeats 11 times>,
> add_info2 = "R01", '\000' <repeats 16 times>, maj_v = 4 '\004',
> min_v = 1 '\001', last_config = 1 '\001', ccrs = 1 '\001', reg_addr = 256,
> attr_mem = {valid = 1 '\001', type = 5 '\005', speed = 3 '\003',
> wps = 0 '\000', addr = 0 '\000', units = 1 '\001'}, common_mem = {
> valid = 1 '\001', type = 13 '\r', speed = 4 '\004', wps = 1 '\001',
> addr = 0 '\000', units = 3 '\003'}, def_config = 0x1d080, conf = 0x1d080}
> (gdb) n
> 466 for (cisconf = cis->conf; cisconf; cisconf = cisconf->next)
> (gdb) n
> 467 if (cisconf->id == sp->config->index)
> (gdb) print *cisconf
> $2 = {next = 0x0, pwr = 0, timing = 0, iospace = 1, irq = 1, memspace = 1,
> misc_valid = 0, id = 1 '\001', io_blks = 2 '\002', io_addr = 10 '\n',
> io_bus = 2 '\002', io = 0x1a1c0, irqlevel = 0 '\000', irq_flags = 48 '0',
> irq_mask = 48892, memwins = 2 '\002', mem = 0x1a1e0, misc = 0 '\000'}
> (gdb) print *sp
> $3 = {next = 0x19080, fd = 8, mask = 0, slot = 1, name = 0x1a0d0 "/dev/card1",
> state = filled, cis = 0x19180, card = 0x180a0, config = 0x180c0,
> card_config = 0x0, devname = '\000' <repeats 15 times>,
> eaddr = "\000\000\000\000\000", io = {next = 0x0, addr = 0, size = 0,
> flags = 0, cardaddr = 0}, mem = {next = 0x0, addr = 0, size = 0,
> flags = 0, cardaddr = 0}, irq = 0}
> (gdb) print *sp->config
> $4 = {next = 0x0, index = 1 '\001', driver = 0x180e0, irq = 11, flags = 0,
> inuse = 1 '\001'}
> (gdb) n
> 469 if (cisconf == 0)
> (gdb) n
> 471 sp->card_config = cisconf;
> (gdb) n
> 477 if (cisconf->memspace || (defconf && defconf->memspace)) {
> (gdb) n
> 480 mp = cisconf->mem;
> (gdb) print cisconf->memspace
> $5 = 1
> (gdb) print defconf
> $6 = (struct cis_config *) 0x1d080
> (gdb) print defconf->memspace
> $7 = 1
> (gdb) print cisconf
> $8 = (struct cis_config *) 0x1d080
>
> NOTE: cisconf and defconf are the same???
Some cards have more than one Configuration Entry tuple; one can be
nominated as the 'default' in the card, but this can be overridden with
an explicit index entry in the /etc/pccard.conf file.
> (gdb) n
> 481 if (!cisconf->memspace)
> (gdb) n
> 483 sp->mem.size = mp->length;
> (gdb) n
> 484 sp->mem.cardaddr = mp->address;
> (gdb) n
> 487 sp->mem.addr = sp->config->driver->mem;
> (gdb) n
> 492 if (sp->mem.size && sp->mem.addr == 0) {
> (gdb) print *sp
> $9 = {next = 0x19080, fd = 8, mask = 0, slot = 1, name = 0x1a0d0 "/dev/card1",
> state = filled, cis = 0x19180, card = 0x180a0, config = 0x180c0,
> card_config = 0x1d080, devname = '\000' <repeats 15 times>,
> eaddr = "\000\000\000\000\000", io = {next = 0x0, addr = 0, size = 0,
> flags = 0, cardaddr = 0}, mem = {next = 0x0, addr = 0, size = 1024,
> flags = 0, cardaddr = 0}, irq = 0}
>
> NOTE: why is sp->mem.size == 1024? <----------------------------
It's trying to allocate a mapping for the EEPROM (tuple #2, aka
memory region 1).
> (gdb) n
> 493 sp->mem.addr = alloc_memory(mp->length);
> (gdb) s
> alloc_memory (size=-272639028) at util.c:125
> 125 i = bit_fns(mem_avail, MEMBLKS, size / MEMUNIT);
>
> (gdb) print *mem_avail @200 (oops, should have just printed 12 bytes)
>
> $10 = {"\000\000\000\000\000\000\000\000\000
Ok. Looks like you have some memory there.
> (gdb) s
> bit_fns (nm=0x1a030 "", nbits=96, count=0) at util.c:106
And there's your problem; alloc_memory should be rounding 'size' up
to MEMUNIT, as bit_fns can't handle a request for an allocation of 0.
unsigned long
alloc_memory(int size)
{
int i;
/* Add Me */
if (size < MEMUNIT)
size = MEMUNIT;
i = bit_fns(mem_avail, MEMBLKS, size / MEMUNIT);
if (i < 0)
return (0);
bit_nclear(mem_avail, i, size / MEMUNIT);
return (BIT2MEM(i));
}
(commentary on your CIS follows)
> Configuration data for card in slot 1
> Tuple #1, code = 0x1 (Common memory descriptor), length = 3
> 000: dc 03 ff
> Common memory device information:
> Device number 1, type Function specific, WPS = ON
> Speed = 100nS, Memory block size = 32Kb, 1 units
> Tuple #2, code = 0x17 (Attribute memory descriptor), length = 3
> 000: 53 01 ff
> Attribute memory device information:
> Device number 1, type FLASH EEPROM, WPS = OFF
> Speed = 150nS, Memory block size = 2Kb, 1 units
> Tuple #3, code = 0x21 (Functional ID), length = 2
> 000: 06 03
> Network/LAN adapter - POST initialize - Card has ROM
> Tuple #4, code = 0x15 (Version 1 info), length = 30
> 000: 04 01 50 4d 58 20 20 20 00 50 45 2d 32 30 30 00
> 010: 45 54 48 45 52 4e 45 54 00 52 30 31 00 ff
> Version = 4.1, Manuf = [PMX ],card vers = [PE-200]
> Addit. info = [ETHERNET],[R01]
> Tuple #5, code = 0x1a (Configuration map), length = 5
> 000: 01 01 00 01 01
> Reg len = 2, config register addr = 0x100, last config = 0x1
> Registers: X-------
> Tuple #6, code = 0x1b (Configuration entry), length = 25
> 000: c1 81 78 ca 61 00 03 0f 10 03 0f 30 fc be c9 04
> 010: 00 00 40 0d 40 40 00 40 0d
> Config index = 0x1(default)
> Interface byte = 0x81 (I/O) wait signal supported
> Card decodes 10 address lines, limited 8/16 Bit I/O
> I/O address # 1: block start = 0x300 block length = 0x10
> I/O address # 2: block start = 0x310 block length = 0x10
> IRQ modes: Level
> IRQs: 4 5 10 11 12 13 14 15
> -> why? what could this be for? It's 1k long?
> -> Memory descriptor 1
> -> blk length = 0x400 card addr = 0x000 host addr = 0xd4000
Not entirely sure. This may match tuple #2, the flash EEPROM.
> Memory descriptor 2
> blk length = 0x4000 card addr = 0x4000 host addr = 0xd4000
This almost certainly matches tuple #1. It's interesting to note that
the sizes of both of these mismatch; it appears that the spec doesn't
provide for 1K or 16K as legitimate values for memory regions.
--
]] Mike Smith, Software Engineer msmith@gsoft.com.au [[
]] Genesis Software genesis@gsoft.com.au [[
]] High-speed data acquisition and (GSM mobile) 0411-222-496 [[
]] realtime instrument control. (ph) +61-8-8267-3493 [[
]] Unix hardware collector. "Where are your PEZ?" The Tick [[
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199612100134.MAA11963>
