From owner-freebsd-mobile Thu Jan 20 9:54:50 2000 Delivered-To: freebsd-mobile@freebsd.org Received: from afs.itc.keio.ac.jp (afs.itc.keio.ac.jp [131.113.212.3]) by hub.freebsd.org (Postfix) with SMTP id 3A4BF15239 for ; Thu, 20 Jan 2000 09:54:45 -0800 (PST) (envelope-from hosokawa@itc.keio.ac.jp) Received: (qmail 19937 invoked from network); 20 Jan 2000 17:54:42 -0000 Received: from ppp131.dialup.st.keio.ac.jp (HELO ringo.FromTo.Cc) (131.113.27.131) by afs.itc.keio.ac.jp with SMTP; 20 Jan 2000 17:54:42 -0000 Date: Fri, 21 Jan 2000 02:54:40 +0900 Message-ID: <863drs1vdr.wl@ringo.FromTo.Cc> From: Tatsumi Hosokawa To: imp@village.org Cc: mobile@FreeBSD.ORG Subject: if_sn now works on -current (Re: One more serious problem with -current PCCARD support ) In-Reply-To: In your message of "Fri, 21 Jan 2000 00:56:51 +0900" <864sc820u4.wl@ringo.FromTo.Cc> References: <86r9fisfe2.wl@ringo.FromTo.Cc> <86u2kesizg.wl@ringo.FromTo.Cc> <200001180742.AAA15379@harmony.village.org> <864sc820u4.wl@ringo.FromTo.Cc> User-Agent: Wanderlust/2.2.13 (Keep The Faith) SEMI/1.13.7 (Awazu) FLIM/1.13.2 (Kasanui) MULE XEmacs/21.1 (patch 8) (Bryce Canyon) (i386--freebsd) MIME-Version: 1.0 (generated by SEMI 1.13.7 - "Awazu") Content-Type: text/plain; charset=US-ASCII Sender: owner-freebsd-mobile@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org Megahertz X-Jack Ethernet now works on current. This patch requires the MAC address patch in <864sc820u4.wl@ringo.FromTo.Cc> with following pccard.conf entry card "Megahertz" "CC10BT/2" config 0x1 "sn0" ? ether attr2 insert logger -s Megahertz X-Jack Ethernet inserted insert /etc/pccard_ether $device remove logger -s Megahertz X-Jack Ethernet removed remove /etc/pccard_ether_remove $device This patch adds "attr2" keyword to /etc/pccard.conf and I'm afraid that it can break feature freeze. If it's not acceptable, I'll commit it later. Comments? Index: sys/dev/sn/if_sn_pccard.c =================================================================== RCS file: /home/ncvs/src/sys/dev/sn/if_sn_pccard.c,v retrieving revision 1.1 diff -u -r1.1 if_sn_pccard.c --- sys/dev/sn/if_sn_pccard.c 1999/12/22 08:44:13 1.1 +++ sys/dev/sn/if_sn_pccard.c 2000/01/20 17:47:00 @@ -44,6 +44,7 @@ #include #include +#include #include #include #include @@ -52,6 +53,7 @@ #include #include +#include /* * Initialize the device - called from Slot manager. @@ -65,6 +67,17 @@ static int sn_pccard_attach(device_t dev) { + struct sn_softc *sc = device_get_softc(dev); + int i; + u_char sum; + u_char ether_addr[ETHER_ADDR_LEN]; + + pccard_get_ether(dev, ether_addr); + for (i = 0, sum = 0; i < ETHER_ADDR_LEN; i++) + sum |= ether_addr[i]; + if (sum) + bcopy(ether_addr, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN); + return (sn_attach(dev)); } Index: usr.sbin/pccard/pccardd/cardd.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pccard/pccardd/cardd.c,v retrieving revision 1.43 diff -u -r1.43 cardd.c --- usr.sbin/pccard/pccardd/cardd.c 2000/01/16 06:44:48 1.43 +++ usr.sbin/pccard/pccardd/cardd.c 2000/01/20 17:47:02 @@ -35,6 +35,7 @@ #include #include #include +#include #include #include "cardd.h" @@ -45,6 +46,7 @@ static void card_removed(struct slot *); static void pr_cmd(struct cmd *); static void read_ether(struct slot *); +static void read_ether_attr2(struct slot *sp); /* * Dump configuration file data. @@ -228,8 +230,18 @@ sp->cis->manuf, sp->cis->vers); return; } - if (cp->ether) - read_ether(sp); + if (cp->ether) { + struct ether *e = 0; + e = cp->ether; + switch (e->type) { + case ETHTYPE_ATTR2: + read_ether_attr2(sp); + break; + default: + read_ether(sp); + break; + } + } if ((sp->config = assign_driver(cp)) == NULL) return; if (assign_io(sp)) { @@ -259,7 +271,7 @@ { unsigned char net_addr[12]; - lseek(sp->fd, (off_t)sp->card->ether, SEEK_SET); + lseek(sp->fd, (off_t)sp->card->ether->value, SEEK_SET); if (read(sp->fd, net_addr, sizeof(net_addr)) != sizeof(net_addr)) { logerr("read err on net addr"); return; @@ -274,6 +286,44 @@ sp->eaddr[0], sp->eaddr[1], sp->eaddr[2], sp->eaddr[3], sp->eaddr[4], sp->eaddr[5]); } + +/* + * Megahertz X-Jack Ethernet uses unique way to get/set MAC + * address of the card. + */ +static void +read_ether_attr2(struct slot *sp) +{ + int i; + char *hexaddr; + + hexaddr = sp->cis->add_info2; + for (i = 0; i < 6; i++) + sp->eaddr[i] = 0; + if (!hexaddr) + return; + if (strlen(hexaddr) != 12) + return; + for (i = 0; i < 12; i++) + if (!isxdigit(hexaddr[i])) + return; + for (i = 0; i < 6; i++) { + u_int d; + char s[3]; + s[0] = hexaddr[i * 2]; + s[1] = hexaddr[i * 2 + 1]; + s[2] = '\0'; + if (!sscanf(s, "%x", &d)) { + int j; + for (j = 0; j < 6; j++) + sp->eaddr[j] = 0; + return; + } + sp->eaddr[i] = (u_char)d; + } + sp->flags |= EADDR_CONFIGED; +} + /* * assign_driver - Assign driver to card. Index: usr.sbin/pccard/pccardd/cardd.h =================================================================== RCS file: /home/ncvs/src/usr.sbin/pccard/pccardd/cardd.h,v retrieving revision 1.16 diff -u -r1.16 cardd.h --- usr.sbin/pccard/pccardd/cardd.h 1999/08/28 01:17:36 1.16 +++ usr.sbin/pccard/pccardd/cardd.h 2000/01/20 17:47:03 @@ -53,11 +53,20 @@ char inuse; }; +struct ether { + struct ether *next; + int type; + int value; +}; + +#define ETHTYPE_GENERIC 0 +#define ETHTYPE_ATTR2 1 + struct card { struct card *next; char *manuf; char *version; - int ether; /* For net cards, ether at offset */ + struct ether *ether; /* For net cards, ether at offset */ int reset_time; /* Reset time */ int iosize; /* I/O window size (ignore location) */ struct card_config *config; /* List of configs */ Index: usr.sbin/pccard/pccardd/file.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pccard/pccardd/file.c,v retrieving revision 1.22 diff -u -r1.22 file.c --- usr.sbin/pccard/pccardd/file.c 1999/08/28 01:17:36 1.22 +++ usr.sbin/pccard/pccardd/file.c 2000/01/20 17:47:04 @@ -213,10 +213,11 @@ static void parse_card(void) { - char *man, *vers; + char *man, *vers, *tmp; struct card *cp; int i, iosize; struct card_config *confp, *lastp; + struct ether *ether; confp = 0; man = newstr(next_tok()); @@ -277,11 +278,22 @@ break; case KWD_ETHER: /* ether */ - cp->ether = num_tok(); - if (cp->ether == -1) { - error("illegal ether address offset"); - cp->ether = 0; + ether = xmalloc(sizeof(*ether)); + ether->type = ETHTYPE_GENERIC; + tmp = next_tok(); + if (strcmp("attr2", tmp) == 0) + ether->type = ETHTYPE_ATTR2; + else { + pusht = 1; + ether->value = num_tok(); + if (ether->value == -1) { + error("illegal ether address offset"); + free(ether); + break; + } } + ether->next = cp->ether; + cp->ether = ether; break; case KWD_INSERT: /* insert */ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-mobile" in the body of the message