From owner-freebsd-mobile Fri Jul 23 8:29:23 1999 Delivered-To: freebsd-mobile@freebsd.org Received: from afs.ntc.mita.keio.ac.jp (afs.ntc.mita.keio.ac.jp [131.113.212.3]) by hub.freebsd.org (Postfix) with ESMTP id C9CED1504D for ; Fri, 23 Jul 1999 08:22:01 -0700 (PDT) (envelope-from hosokawa@ntc.keio.ac.jp) Received: (from hosokawa@localhost) by afs.ntc.mita.keio.ac.jp (8.8.8+2.7Wbeta7/3.6Wbeta6-ntc_mailserver1.03) id AAA02396; Sat, 24 Jul 1999 00:21:52 +0900 (JST) Date: Sat, 24 Jul 1999 00:21:52 +0900 (JST) Message-Id: <199907231521.AAA02396@afs.ntc.mita.keio.ac.jp> To: mihara@prd.fc.nec.co.jp Cc: mobile@freebsd.org, hosokawa@itc.keio.ac.jp Subject: 3C574TX for -current (Re: 3COM Megahertz 10/100 LAN+56K Modem (3CCFEM556BI)) In-Reply-To: Your message of "Mon, 19 Jul 1999 10:58:07 JST". <14226.34351.40295.87915G@mosra.prd.fc.nec.co.jp> From: hosokawa@itc.keio.ac.jp (HOSOKAWA Tatsumi) X-Mailer: mnews [version 1.21] 1997-12/23(Tue) Sender: owner-freebsd-mobile@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org In article <14226.34351.40295.87915G@mosra.prd.fc.nec.co.jp> mihara@prd.fc.nec.co.jp writes: >> I have tried to make 3COM Megahertz 10/100 LAN+56K Modem (3CCFEM556BI) >> (LAN side) work with FreeBSD 3.2 with PAO3, and succeed in it. Here >> I attach a patch for ep driver and an entry for /etc/pccard.conf. You >> need to add an pccard.conf entry, apply this patch in /sys/i386/isa, >> rebuild kernel and reboot the system. Of course, you need PAO3 system >> prior to make this patch. I merged it into if_ep driver and it worked on 3C574TX (I think my patch does not break anything for other ep cards), but it did not work when I added offset 0x10 to the I/O address when accessing window 1 like your code does. I used only 2bit address shift in accessing EEPROM and it worked on 3C574TX. Perhaps there can be difference between 574 and 556. If you can, please test following patch on -current. I'm using this patch with following pccard.conf entry. # 3Com Fast Etherlink 3C574TX card "3Com" "3C574-TX Fast EtherLink PC Ca" config 0x1 "ep0" ? 0x1 insert echo 3Com Etherlink III inserted insert /etc/pccard_ether ep0 remove echo 3Com Etherlink III removed remove /sbin/ifconfig ep0 delete Please note that this entry only works on -current pccardd with the bug-fixes I committed today. Please get the latest -current before testing this code. I want to merge it to -current soon! Okay, the patch follows: Index: if_ep.c =================================================================== RCS file: /home/ncvs/src/sys/i386/isa/if_ep.c,v retrieving revision 1.80 diff -u -r1.80 if_ep.c --- if_ep.c 1999/07/06 19:22:46 1.80 +++ if_ep.c 1999/07/23 15:08:43 @@ -193,13 +193,21 @@ /* get_e() requires these. */ sc->ep_io_addr = is->id_iobase; sc->unit = is->id_unit; + epb->cmd_off = 0; + if (is->id_flags & EP_FLAGS_100TX) + epb->cmd_off = 2; epb->epb_addr = is->id_iobase; epb->epb_used = 1; epb->prod_id = get_e(sc, EEPROM_PROD_ID); - /* 3C589's product id? */ - if (epb->prod_id != 0x9058) { + /* product id */ + switch (epb->prod_id) { + case 0x6055: /* 3C556 */ + case 0x4057: /* 3C574 */ + case 0x9058: /* 3C589 */ + break; + default: printf("ep%d: failed to come ready.\n", is->id_unit); return (ENXIO); } @@ -232,7 +240,7 @@ sc->ep_connectors |= UTP; } if (!(sc->ep_connectors & 7)) - printf("no connectors!"); + printf("ep%d: No connectors or MII.\n", is->id_unit); sc->ep_connector = inw(BASE + EP_W0_ADDRESS_CFG) >> ACF_CONNECTOR_BITS; /* ROM size = 0, ROM base = 0 */ @@ -244,6 +252,19 @@ outw(BASE + EP_W0_PRODUCT_ID, sc->epb->prod_id); + /* + * turn on the MII tranceiver + */ + GO_WINDOW(3); + outw(BASE + EP_W3_OPTIONS, 0x8040); + DELAY(1000); + outw(BASE + EP_W3_OPTIONS, 0xc040); + outw(BASE + EP_COMMAND, RX_RESET); + outw(BASE + EP_COMMAND, TX_RESET); + while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + DELAY(1000); + outw(BASE + EP_W3_OPTIONS, 0x8040); + ep_attach(sc); return 1; @@ -417,7 +438,7 @@ { if (!eeprom_rdy(sc)) return (0xffff); - outw(BASE + EP_W0_EEPROM_COMMAND, EEPROM_CMD_RD | offset); + outw(BASE + EP_W0_EEPROM_COMMAND, (EEPROM_CMD_RD << sc->epb->cmd_off) | offset); if (!eeprom_rdy(sc)) return (0xffff); return (inw(BASE + EP_W0_EEPROM_DATA)); Index: if_epreg.h =================================================================== RCS file: /home/ncvs/src/sys/i386/isa/if_epreg.h,v retrieving revision 1.23 diff -u -r1.23 if_epreg.h --- if_epreg.h 1998/04/17 22:36:35 1.23 +++ if_epreg.h 1999/07/23 15:08:44 @@ -86,6 +86,7 @@ /* data from EEPROM for later use */ u_short eth_addr[3]; /* Ethernet address */ u_short prod_id; /* product ID */ + int cmd_off; /* command offset (bit shift) */ u_short res_cfg; /* resource configuration */ }; @@ -221,6 +222,7 @@ /* Read */ #define EP_W3_FREE_TX 0x0c #define EP_W3_FREE_RX 0x0a +#define EP_W3_OPTIONS 0x08 /* * Window 4 registers. Diagnostics. @@ -461,3 +463,8 @@ extern int ep_attach __P((struct ep_softc *sc)); extern u_int16_t get_e __P((struct ep_softc *sc, int offset)); + +/* + * Config flags + */ +#define EP_FLAGS_100TX 0x1 -- HOSOKAWA, Tatsumi Assistant Manager Information Technology Center, Keio University To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-mobile" in the body of the message