Subject: Re: Sun Quad Ethernet card on PC
To: Martin Husemann <martin@duskware.de>
From: Peter Eisch <peter@boku.net>
List: port-i386
Date: 04/15/2005 09:28:09
On 4/15/05 1:46 AM, "Martin Husemann" <martin@duskware.de> wrote:
...
> Second, please look at the #if HME_USE_LOCAL_MAC_ADDRESS code in
> sys/dev/pci/if_hme_pci.c that digs out VPD from the hme - maybe the qfe
> needs this code slightly different? Maybe you can add printfs there to
> see where it fails for your card.
> 

With Julian's coaching I've modified my if_hme_pci.c to look like:

--------------------------------------------------------------------------
...
#define PCI_EBUS2_BOOTROM       0x10
        if (PCI_CLASS(ebus_cl) == PCI_CLASS_BRIDGE &&
            PCI_PRODUCT(ebus_id) == PCI_PRODUCT_SUN_EBUS &&
            pci_mapreg_map(&ebus_pa, PCI_EBUS2_BOOTROM, PCI_MAPREG_TYPE_MEM,
                BUS_SPACE_MAP_CACHEABLE | BUS_SPACE_MAP_PREFETCHABLE,
                &romt, &romh, 0, &romsize) == 0) {
printf("in the big if\n");
                /* read PCI Expansion PROM Header */
                bus_space_read_region_1(romt, romh, 0, buf, sizeof buf);
                if (memcmp(buf, promhdr, sizeof promhdr) == 0 &&
                    (dataoff = (buf[PROMHDR_PTR_DATA] |
                        (buf[PROMHDR_PTR_DATA + 1] << 8))) >= 0x1c) {
printf("in the read PCI Expansion PROM Header\n");
                        /* read PCI Expansion PROM Data */
                        bus_space_read_region_1(romt, romh, dataoff,
                            buf, sizeof buf);
hmehexprint("buf     ", buf, 32);
hmehexprint("promdat ", &promdat, sizeof promdat);
hmehexprint("bufprom2", buf+PROMDATA_DATA2, sizeof promdat2);
hmehexprint("promdat2", &promdat2, sizeof promdat2);
printf("buf[PROMDATA_PTR_VPD]: 0x%0x\n", buf[PROMDATA_PTR_VPD]);
printf("buf[PROMDATA_PTR_VPD + 1] << 8: 0x%0x\n", (buf[PROMDATA_PTR_VPD + 1]
<< 8));
printf("vpdoff: 0x%0x\n", (buf[PROMDATA_PTR_VPD] |
                                (buf[PROMDATA_PTR_VPD + 1] << 8)));
                        if (memcmp(buf, promdat, sizeof promdat) == 0 &&
                            memcmp(buf + PROMDATA_DATA2, promdat2,
                                sizeof promdat2) == 0 &&
                            (vpdoff = (buf[PROMDATA_PTR_VPD] |
                                (buf[PROMDATA_PTR_VPD + 1] << 8))) >= 0x1c)
{
printf("in the read PCI Expansion PROM Data\n");
                                /*
                                 * The VPD of hme is not in PCI 2.2 standard
                                 * format.  The length in the resource
header
                                 * is in big endian, and resources are not
                                 * properly terminated (only one resource
                                 * and no end tag).
                                 */
                                /* read PCI VPD */
...
--------------------------------------------------------------------------

The last 3 octets for the HME's on this card are:

00:29:32
00:29:33
00:29:34
00:29:35


If I don't comment out these lines, we don't get make it in to pull MAC:

//                          memcmp(buf + PROMDATA_DATA2, promdat2,
//                              sizeof promdat2) == 0 &&

If I do comment them out, my dmesg becomes:

Sun Microsystems PCIO Ebus2 (miscellaneous bridge, revision 0x01) at pci2
dev 0 function 0 not configured
hme0 at pci2 dev 0 function 1: Sun Happy Meal Ethernet, rev. 1
in the big if
in the read PCI Expansion PROM Header
buf     : len=000032
0x50434952ffffff8e1001105000180000ffffff8000022600000001ffffff800000fffffff1
08ffffff96ffffff8a00004b08
promdat : len=000008 0x50434952ffffff8e100110
bufprom2: len=000006 0x180000ffffff800002
promdat2: len=000006 0x180000000002
buf[PROMDATA_PTR_VPD]: 0x50
buf[PROMDATA_PTR_VPD + 1] << 8: 0x0
vpdoff: 0x50
in the read PCI Expansion PROM Data
VPD parsing matched: len=000004 0x00ffffffa0ffffff8000
hme0: interrupting at irq 9
hme0: Ethernet address 00:a0:80:00:29:32
qsphy0 at hme0 phy 1: QS6612 10/100 media interface, rev. 1
qsphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
Sun Microsystems PCIO Ebus2 (miscellaneous bridge, revision 0x01) at pci2
dev 1 function 0 not configured
hme1 at pci2 dev 1 function 1: Sun Happy Meal Ethernet, rev. 1
in the big if
in the read PCI Expansion PROM Header
buf     : len=000032
0x50434952ffffff8e1001105000180000ffffff8000022600000001ffffff800000fffffff1
08ffffff96ffffff8a00004b08
promdat : len=000008 0x50434952ffffff8e100110
bufprom2: len=000006 0x180000ffffff800002
promdat2: len=000006 0x180000000002
buf[PROMDATA_PTR_VPD]: 0x50
buf[PROMDATA_PTR_VPD + 1] << 8: 0x0
vpdoff: 0x50
in the read PCI Expansion PROM Data
VPD parsing matched: len=000004 0x00ffffffa0ffffff8000
hme1: interrupting at irq 5
hme1: Ethernet address 00:a0:80:00:29:32
qsphy1 at hme1 phy 1: QS6612 10/100 media interface, rev. 1
qsphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
Sun Microsystems PCIO Ebus2 (miscellaneous bridge, revision 0x01) at pci2
dev 2 function 0 not configured
hme2 at pci2 dev 2 function 1: Sun Happy Meal Ethernet, rev. 1
in the big if
in the read PCI Expansion PROM Header
buf     : len=000032
0x50434952ffffff8e1001105000180000ffffff8000022600000001ffffff800000fffffff1
08ffffff96ffffff8a00004b08
promdat : len=000008 0x50434952ffffff8e100110
bufprom2: len=000006 0x180000ffffff800002
promdat2: len=000006 0x180000000002
buf[PROMDATA_PTR_VPD]: 0x50
buf[PROMDATA_PTR_VPD + 1] << 8: 0x0
vpdoff: 0x50
in the read PCI Expansion PROM Data
VPD parsing matched: len=000004 0x00ffffffa0ffffff8000
hme2: interrupting at irq 11
hme2: Ethernet address 00:a0:80:00:29:32
qsphy2 at hme2 phy 1: QS6612 10/100 media interface, rev. 1
qsphy2: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
Sun Microsystems PCIO Ebus2 (miscellaneous bridge, revision 0x01) at pci2
dev 3 function 0 not configured
hme3 at pci2 dev 3 function 1: Sun Happy Meal Ethernet, rev. 1
in the big if
in the read PCI Expansion PROM Header
buf     : len=000032
0x50434952ffffff8e1001105000180000ffffff8000022600000001ffffff800000fffffff1
08ffffff96ffffff8a00004b08
promdat : len=000008 0x50434952ffffff8e100110
bufprom2: len=000006 0x180000ffffff800002
promdat2: len=000006 0x180000000002
buf[PROMDATA_PTR_VPD]: 0x50
buf[PROMDATA_PTR_VPD + 1] << 8: 0x0
vpdoff: 0x50
in the read PCI Expansion PROM Data
VPD parsing matched: len=000004 0x00ffffffa0ffffff8000
hme3: interrupting at irq 10
hme3: Ethernet address 00:a0:80:00:29:32
qsphy3 at hme3 phy 1: QS6612 10/100 media interface, rev. 1
qsphy3: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto


While one MAC addr is better than no mac addr, I'll bet that something else
is missing -- unless this is all the code looks for is just one MAC addr.
With ttcp I've found the card is able to transmit (picked hme2) just fine:
  67108864 bytes in 55.01 real seconds = 1191.41 KB/sec
Conversely, it CAN'T receive off the network much faster than a modem:
  16777216 bytes in 882.63 real seconds = 18.56 KB/sec
I can make my sandbox system available or I can try different things if
there are suggestions.

peter