tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: ep driver



On Mon, 28 Jun 2021 16:32:48 +0900, Masanobu SAITOH wrote:

> Hi.
> 
> On 2021/06/27 20:49, Rin Okuyama wrote:
>> Hi,
>> 
>> On 2021/06/27 19:44, T wrote:
>>> Hi,
>>> I have recently upgraded a NetBSD/prep machine from 8.1 to 9.2 and the
>>> ep NIC no longer seems to work after the upgrade, it worked in
>>> previous 7 and 8 versions. The NIC is a 3Com 3c515-TX (ISA 10/100).
>>> Here are a few dmesg segments from different kernel versions for this
>>> card:
>>>
>>> For 7.1.1_PATCH:
>>> isapnp0: read port 0x203 ep0 at isapnp0 port 0x280/32 irq 5 drq 3 ep0:
>>> 3Com Fast EtherLink ISA ep0: address xx:xx:xx:xx:xx:xx, 64KB word-wide
>>> FIFO, 1:1 Rx:Tx split ukphy1 at ep0 phy 24: OUI 0x1000e8, model
>>> 0x0000, rev. 1 ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX,
>>> auto vmmask 73000000 schedmask 73000000 highmask 7f000000
>>>
>>>
>>> For 8.1:
>>> isapnp0: read port 0x203 ...
>>> ep0 at isapnp0 port 0x280/32 irq 11 drq 3 3Com Fast EtherLink ISA ep0:
>>> address xx:xx:xx:xx:xx:xx, 64KB word-wide FIFO, 1:1 Rx:Tx split nsphy0
>>> at ep0 phy 24: DP83840 10/100 media interface, rev. 1 nsphy0: 10baseT,
>>> 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto vmmask 71400000 schedmask
>>> 71c00000 highmask 7fc00000
>>>
>>>
>>> For 9.2:
>>>
>>> [     1.000000] isapnp0: read port 0x203 [     1.000000] ep0 at
>>> isapnp0 port 0x280/32 irq 5 drq 3 [     1.000000] 3Com Fast EtherLink
>>> ISA [     1.000000] ep0: autoconfiguration error: wrote 0x7ff to
>>> TX_AVAIL_THRESH, read back 0x0. Interface disabled [     1.000000]
>>> vmmask 73000000 schedmask 73000000 highmask 7f000000
>>>
>>> The error message originates from line 382 in this file:
>>> http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/ic/elink3.c?
>>> annotate=1.152&only_with_tag=MAIN
>>>
>>> and figure something happened between these two revisions:
>>> --- src/sys/dev/ic/elink3.c    2018/07/26 23:55:29    1.140.8.1
>>> netbsd-8-1-RELEASE +++ src/sys/dev/ic/elink3.c    2019/05/29
>>> 06:17:28    1.149 netbsd-9-2-
>>> RELEASE
>>>
>>> Does anyone have any idea what's going on here?
>>>
>>>
>> A variant of ep(4) for PCMCIA works just fine for amiga:
>> 
>> ---
>> NetBSD 9.99.85 (A1200_WSCONS) #14: Wed Jun 16 07:44:49 JST 2021
>>         rin@latipes:/sys/arch/amiga/compile/A1200_WSCONS
>> ...
>> pcmcia0 at pccard0 ep0 at pcmcia0 function 0: <3Com, Megahertz 589E,
>> TP/BNC LAN PC Card, 005>
>> ep0: address 00:50:04:cc:ee:7e, 8KB byte-wide FIFO, 5:3 Rx:Tx split
>> ep0: 10baseT, 10base5, 10base2 (default 10baseT)
>> ---
>> 
>> This model does not have MII, and it seems that differences b/w
>> netbsd-8 and -9 are mostly in MII part.
>> 
>> Saitoh-san, do you have any idea?
>> 
>> Thanks,
>> rin
> 
> isapnp/if_ep_isapnp.c
> 	both 8.1 and 9.2 have rev. 1.35
> ic/elink3reg.h
> 	both 8.1 and 9.2 have rev. 1.31
> ic/elink3var.h
> 	both 8.1 and 9.2 have rev. 1.39
> 
> In isapnp/if_ep_isapnp.c: -------------------------------------------
> void ep_isapnp_attach(device_t parent, device_t self, void *aux)
> {
> 	struct ep_softc *sc = device_private(self);
> 	struct isapnp_attach_args *ipa = aux;
> 	int chipset;
> 
> 	aprint_naive("\n");
> 	aprint_normal("\n");
> 
> 	sc->sc_dev = self;
> 	if (isapnp_config(ipa->ipa_iot, ipa->ipa_memt, ipa)) {
> 		aprint_error_dev(sc->sc_dev, "error in region 
allocation\n");
> 		return;
> 	}
> 
> 	aprint_normal("%s %s\n", ipa->ipa_devident, ipa->ipa_devclass);
> 
> 	sc->sc_iot = ipa->ipa_iot;
> 	sc->sc_ioh = ipa->ipa_io[0].h;
> 	sc->bustype = ELINK_BUS_ISA;
> 
> 	sc->sc_ih = isa_intr_establish(ipa->ipa_ic, ipa->ipa_irq[0].num,
> 	    ipa->ipa_irq[0].type, IPL_NET, epintr, sc);
> 
> 	sc->enable = NULL;
> 	sc->disable = NULL;
> 	sc->enabled = 1;
> 
> 	if (strcmp(ipa->ipa_devlogic, "TCM5051") == 0) {
> 		/* 3c515 */
> 		chipset = ELINK_CHIPSET_CORKSCREW;
> 	} else {
> 		/* 3c509 */
> 		chipset = ELINK_CHIPSET_3C509;
> 	}
> 
> 	epconfig(sc, chipset, NULL);
> }
> -------------------------------------------
>  Nothing special.
> 
> epconfig() in elink3.c is: -------------------------------------------
> /*
>  * Back-end attach and configure.
>  */
> int epconfig(struct ep_softc *sc, u_short chipset, u_int8_t *enaddr)
> {
> 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
> 	bus_space_tag_t iot = sc->sc_iot;
> 	bus_space_handle_t ioh = sc->sc_ioh;
> 	struct mii_data *mii = &sc->sc_mii;
> 	u_int16_t i;
> 	u_int8_t myla[ETHER_ADDR_LEN];
> 
> 	callout_init(&sc->sc_mii_callout, 0);
> 	callout_setfunc(&sc->sc_mii_callout, ep_tick, sc);
> 
> 	callout_init(&sc->sc_mbuf_callout, 0);
> 	callout_setfunc(&sc->sc_mbuf_callout, epmbuffill, sc);
> 
> 	sc->ep_chipset = chipset;
> 
> 	/*
> 	 * We could have been groveling around in other register * 
windows in
> 	 the front-end; make sure we're in window 0 * to read the EEPROM.
> 	 */
> 	GO_WINDOW(0);
> 
> 	if (enaddr == NULL) {
> 		/*
> 		 * Read the station address from the eeprom.
> 		 */
> 		for (i = 0; i < ETHER_ADDR_LEN / 2; i++) {
> 			u_int16_t x = ep_read_eeprom(sc, i);
> 			myla[(i << 1)] = x >> 8;
> 			myla[(i << 1) + 1] = x;
> 		}
> 		enaddr = myla;
> 	}
> 
> 	/*
> 	 * Vortex-based (3c59x pci,eisa) and Boomerang (3c900) cards * 
allow
> 	 FDDI-sized (4500) byte packets.  Commands only take an * 11-bit
> 	 parameter, and  11 bits isn't enough to hold a full-size * packet
> 	 length.
> 	 * Commands to these cards implicitly upshift a packet size * or
> 	 threshold by 2 bits.
> 	 * To detect  cards with large-packet support, we probe by 
setting *
> 	 the transmit threshold register, then change windows and * read 
back
> 	 the threshold register directly, and see if the * threshold 
value was
> 	 shifted or not.
> 	 */
> 	bus_space_write_2(iot, ioh, ELINK_COMMAND,
> 	    SET_TX_AVAIL_THRESH | ELINK_LARGEWIN_PROBE);
> 	GO_WINDOW(5);
> 	i = bus_space_read_2(iot, ioh, ELINK_W5_TX_AVAIL_THRESH); 
GO_WINDOW(1);
> 	switch (i) {
> 	case ELINK_LARGEWIN_PROBE:
> 	case (ELINK_LARGEWIN_PROBE & ELINK_LARGEWIN_MASK):
> 		sc->ep_pktlenshift = 0;
> 		break;
> 
> 	case (ELINK_LARGEWIN_PROBE << 2):
> 		sc->ep_pktlenshift = 2;
> 		break;
> 
> 	default:
> 		aprint_error_dev(sc->sc_dev,
> 		    "wrote 0x%x to TX_AVAIL_THRESH, read back 0x%x. "
> 		    "Interface disabled\n",
> 		    ELINK_LARGEWIN_PROBE, (int) i);
> 		return (1);
> 	}
> -------------------------------------------
> 
>  0) GO_WINDOW(0)
>  1) read mac address 2) write ELINK_COMMAND 3) GO_WINDOW(5)
>  4) read ELINK_W5_TX_AVAIL_THRESH (***)
>  5) GO_WINDOW(1)
> 
> and a read value of ELINK_W5_TX_AVAIL_THRESH in "4)" was incorrect.
> Has the bus_space_read*() problem in isapnp(4)?
> 
>  I think it would worth to see if the read value
> of the MAC address correct. Could you try it?

Hello,
I applied the following patch to the file and recompiled. It did indeed read,
and print, the same MAC address as in dmesg from prior released versions.
--------------------------------------------------------------------------------
--- /usr/src/sys/dev/ic/elink3.c.orig   2020-03-19 16:35:52.000000000 -0600
+++ /usr/src/sys/dev/ic/elink3.c        2021-06-28 15:46:39.069734750 -0600
@@ -345,6 +345,12 @@
                        myla[(i << 1) + 1] = x;
                }
                enaddr = myla;
+               printf("eeprom enaddr: ");
+               for (i = 0; i < ETHER_ADDR_LEN; i++)
+                       if (i < ETHER_ADDR_LEN - 1)
+                               printf("%x:", myla[i]);
+                       else
+                               printf("%x\n", myla[i]);
        }

        /*
--------------------------------------------------------------------------------

One thing to note, I originally tried using the INSTALL_SMALL kernel (with
mkbootimage), and loaded using netbooting over tftp, but the ep device gave this
error: ignoring resource conflict
https://nxr.netbsd.org/xref/src/sys/dev/isapnp/isapnp.c#983
It could be an unrelated issue, it did not occur when booting the GENERIC
(secondary) kernel from boot().

The relevant output with 'options DEBUG_ISAPNP' for GENERIC kernel:

[     1.000000] isapnp0 at isa0 port 0x279
[     1.000000] attimer0: attached to pcppi0
[     1.000000] isapnp0: Trying port 203isapnp0: read port 0x203
[     1.000000] PnP version 1.0, Vendor version 1.0
[     1.000000] ANSI Ident: 3Com Fast EtherLink ISA
[     1.000000] Logical device id TCM5051
[     1.000000] IRQ's supported: 3 5 7 9 10 11 12 15 E+
[     1.000000] DRQ's supported: 3 5 6 7 Width: 16-bit Speed: compat Attributes:
 bus master
[     1.000000] 32 IO Ports: 10 address bits, alignment 32 min 0x280, max 0x3e0
[     1.000000] Selecting attachments
[     1.000000] Found <3Com Fast EtherLink ISA, TCM5051, , > config: acceptable
[     1.000000] 32 IO Ports: 10 address bits, alignment 32 min 0x280, max 0x3e0
[     1.000000] IRQ's supported: 3 5 7 9 10 11 12 15 E+
[     1.000000] DRQ's supported: 3 5 6 7 Width: 16-bit Speed: compat Attributes:
 bus master
[     1.000000] Register configuration:
[     1.000000] io[0]: 0x280/0
[     1.000000] irq[0]: 5
[     1.000000] drq[0]: 3
[     1.000000] isapnp0: configuring <3Com Fast EtherLink ISA, TCM5051, , >
[     1.000000] ep0 at isapnp0 port 0x280/32 irq 5 drq 3
[     1.000000] Found <3Com Fast EtherLink ISA, TCM5051, , > config: acceptable
[     1.000000] 32 IO Ports: 10 address bits, alignment 32 min 0x280, max 0x3e0
[     1.000000] IRQ's supported: 3 5 7 9 10 11 12 15 E+
[     1.000000] DRQ's supported: 3 5 6 7 Width: 16-bit Speed: compat Attributes:
 bus master
[     1.000000] 3Com Fast EtherLink ISA
[     1.000000] eeprom enaddr: 0:10:4b:28:76:c8
[     1.000000] ep0: autoconfiguration error: wrote 0x7ff to TX_AVAIL_THRESH, 
read back 0x0. Interface disabled
[     1.000000] vmmask 73000000 schedmask 73000000 highmask 7f000000




Home | Main Index | Thread Index | Old Index