Deleted Added
full compact
if_fe.c (13638) if_fe.c (13937)
1/*
2 * All Rights Reserved, Copyright (C) Fujitsu Limited 1995
3 *
4 * This software may be used, modified, copied, distributed, and sold, in
5 * both source and binary form provided that the above copyright, these
6 * terms and the following disclaimer are retained. The name of the author
7 * and/or the contributor may not be used to endorse or promote products
8 * derived from this software without specific prior written permission.

--- 200 unchanged lines hidden (view full) ---

209 u_char proto_dlcr5; /* DLCR5 prototype. */
210 u_char proto_dlcr6; /* DLCR6 prototype. */
211 u_char proto_dlcr7; /* DLCR7 prototype. */
212
213 /* Vendor specific hooks. */
214 void ( * init )( struct fe_softc * ); /* Just before fe_init(). */
215 void ( * stop )( struct fe_softc * ); /* Just after fe_stop(). */
216
1/*
2 * All Rights Reserved, Copyright (C) Fujitsu Limited 1995
3 *
4 * This software may be used, modified, copied, distributed, and sold, in
5 * both source and binary form provided that the above copyright, these
6 * terms and the following disclaimer are retained. The name of the author
7 * and/or the contributor may not be used to endorse or promote products
8 * derived from this software without specific prior written permission.

--- 200 unchanged lines hidden (view full) ---

209 u_char proto_dlcr5; /* DLCR5 prototype. */
210 u_char proto_dlcr6; /* DLCR6 prototype. */
211 u_char proto_dlcr7; /* DLCR7 prototype. */
212
213 /* Vendor specific hooks. */
214 void ( * init )( struct fe_softc * ); /* Just before fe_init(). */
215 void ( * stop )( struct fe_softc * ); /* Just after fe_stop(). */
216
217 /* For BPF. */
218 caddr_t bpf; /* BPF "magic cookie" */
219
220 /* Transmission buffer management. */
221 u_short txb_free; /* free bytes in TX buffer */
222 u_char txb_count; /* number of packets in TX buffer */
223 u_char txb_sched; /* number of scheduled packets */
224 u_char txb_padding; /* number of delayed padding bytes */
225
226 /* Multicast address filter management. */
227 u_char filter_change; /* MARs must be changed ASAP. */
228 struct fe_filter filter;/* new filter value. */
229
230} fe_softc[NFE];
231
232/* Frequently accessed members in arpcom and kdc. */
233#define sc_if arpcom.ac_if
234#define sc_unit arpcom.ac_if.if_unit
235#define sc_enaddr arpcom.ac_enaddr
236#define sc_dcstate kdc.kdc_state
237#define sc_description kdc.kdc_description
238
217 /* Transmission buffer management. */
218 u_short txb_free; /* free bytes in TX buffer */
219 u_char txb_count; /* number of packets in TX buffer */
220 u_char txb_sched; /* number of scheduled packets */
221 u_char txb_padding; /* number of delayed padding bytes */
222
223 /* Multicast address filter management. */
224 u_char filter_change; /* MARs must be changed ASAP. */
225 struct fe_filter filter;/* new filter value. */
226
227} fe_softc[NFE];
228
229/* Frequently accessed members in arpcom and kdc. */
230#define sc_if arpcom.ac_if
231#define sc_unit arpcom.ac_if.if_unit
232#define sc_enaddr arpcom.ac_enaddr
233#define sc_dcstate kdc.kdc_state
234#define sc_description kdc.kdc_description
235
239/*
240 * Some entry functions receive a "struct ifnet *" typed pointer as an
241 * argument. It points to arpcom.ac_if of our softc. Remember arpcom.ac_if
242 * is located at very first of the fe_softc struct. So, there is no
243 * difference between "struct fe_softc *" and "struct ifnet *" at the machine
244 * language level. We just cast to turn a "struct ifnet *" value into "struct
245 * fe_softc * value". If this were C++, we would need no such cast at all.
246 */
247#define IFNET2SOFTC(P) ( ( struct fe_softc * )(P) )
236#define IFNET2SOFTC(P) (P)->if_softc
248
249/* Standard driver entry points. These can be static. */
250static int fe_probe ( struct isa_device * );
251static int fe_attach ( struct isa_device * );
252static void fe_init ( int );
253static int fe_ioctl ( struct ifnet *, int, caddr_t );
254static void fe_start ( struct ifnet * );
255static void fe_reset ( int );

--- 10 unchanged lines hidden (view full) ---

266static void fe_rint ( struct fe_softc *, u_char );
267static void fe_xmit ( struct fe_softc * );
268static void fe_write_mbufs ( struct fe_softc *, struct mbuf * );
269static struct fe_filter
270 fe_mcaf ( struct fe_softc * );
271static int fe_hash ( u_char * );
272static void fe_setmode ( struct fe_softc * );
273static void fe_loadmar ( struct fe_softc * );
237
238/* Standard driver entry points. These can be static. */
239static int fe_probe ( struct isa_device * );
240static int fe_attach ( struct isa_device * );
241static void fe_init ( int );
242static int fe_ioctl ( struct ifnet *, int, caddr_t );
243static void fe_start ( struct ifnet * );
244static void fe_reset ( int );

--- 10 unchanged lines hidden (view full) ---

255static void fe_rint ( struct fe_softc *, u_char );
256static void fe_xmit ( struct fe_softc * );
257static void fe_write_mbufs ( struct fe_softc *, struct mbuf * );
258static struct fe_filter
259 fe_mcaf ( struct fe_softc * );
260static int fe_hash ( u_char * );
261static void fe_setmode ( struct fe_softc * );
262static void fe_loadmar ( struct fe_softc * );
274static void fe_setlinkaddr ( struct fe_softc * );
275#if FE_DEBUG >= 1
276static void fe_dump ( int, struct fe_softc *, char * );
277#endif
278
279/* Ethernet constants. To be defined in if_ehter.h? FIXME. */
280#define ETHER_MIN_LEN 60 /* with header, without CRC. */
281#define ETHER_MAX_LEN 1514 /* with header, without CRC. */
282#define ETHER_ADDR_LEN 6 /* number of bytes in an address. */

--- 773 unchanged lines hidden (view full) ---

1056static int
1057fe_attach ( struct isa_device *isa_dev )
1058{
1059 struct fe_softc *sc = &fe_softc[isa_dev->id_unit];
1060
1061 /*
1062 * Initialize ifnet structure
1063 */
263#if FE_DEBUG >= 1
264static void fe_dump ( int, struct fe_softc *, char * );
265#endif
266
267/* Ethernet constants. To be defined in if_ehter.h? FIXME. */
268#define ETHER_MIN_LEN 60 /* with header, without CRC. */
269#define ETHER_MAX_LEN 1514 /* with header, without CRC. */
270#define ETHER_ADDR_LEN 6 /* number of bytes in an address. */

--- 773 unchanged lines hidden (view full) ---

1044static int
1045fe_attach ( struct isa_device *isa_dev )
1046{
1047 struct fe_softc *sc = &fe_softc[isa_dev->id_unit];
1048
1049 /*
1050 * Initialize ifnet structure
1051 */
1052 sc->sc_if.if_softc = sc;
1064 sc->sc_if.if_unit = sc->sc_unit;
1065 sc->sc_if.if_name = "fe";
1066 sc->sc_if.if_output = ether_output;
1067 sc->sc_if.if_start = fe_start;
1068 sc->sc_if.if_ioctl = fe_ioctl;
1069 sc->sc_if.if_watchdog = fe_watchdog;
1070
1071 /*

--- 45 unchanged lines hidden (view full) ---

1117 sc->proto_dlcr6 |= FE_D6_TXBSIZ_2x2KB;
1118 sc->txb_size = 2048;
1119 break;
1120 }
1121
1122 /* Attach and stop the interface. */
1123 if_attach( &sc->sc_if );
1124 fe_stop( sc->sc_unit ); /* This changes the state to IDLE. */
1053 sc->sc_if.if_unit = sc->sc_unit;
1054 sc->sc_if.if_name = "fe";
1055 sc->sc_if.if_output = ether_output;
1056 sc->sc_if.if_start = fe_start;
1057 sc->sc_if.if_ioctl = fe_ioctl;
1058 sc->sc_if.if_watchdog = fe_watchdog;
1059
1060 /*

--- 45 unchanged lines hidden (view full) ---

1106 sc->proto_dlcr6 |= FE_D6_TXBSIZ_2x2KB;
1107 sc->txb_size = 2048;
1108 break;
1109 }
1110
1111 /* Attach and stop the interface. */
1112 if_attach( &sc->sc_if );
1113 fe_stop( sc->sc_unit ); /* This changes the state to IDLE. */
1125 fe_setlinkaddr( sc );
1114 ether_ifattach(&sc->sc_if);
1126
1127 /* Print additional info when attached. */
1128 printf( "fe%d: address %6D, type %s\n", sc->sc_unit,
1129 sc->sc_enaddr, ":" , sc->typestr );
1130#if FE_DEBUG >= 3
1131 {
1132 int buf, txb, bbw, sbw, ram;
1133

--- 23 unchanged lines hidden (view full) ---

1157 }
1158 printf( "fe%d: SRAM %dKB %dbit %dns, TXB %dKBx2, %dbit I/O\n",
1159 sc->sc_unit, buf, bbw, ram, txb, sbw );
1160 }
1161#endif
1162
1163#if NBPFILTER > 0
1164 /* If BPF is in the kernel, call the attach for it. */
1115
1116 /* Print additional info when attached. */
1117 printf( "fe%d: address %6D, type %s\n", sc->sc_unit,
1118 sc->sc_enaddr, ":" , sc->typestr );
1119#if FE_DEBUG >= 3
1120 {
1121 int buf, txb, bbw, sbw, ram;
1122

--- 23 unchanged lines hidden (view full) ---

1146 }
1147 printf( "fe%d: SRAM %dKB %dbit %dns, TXB %dKBx2, %dbit I/O\n",
1148 sc->sc_unit, buf, bbw, ram, txb, sbw );
1149 }
1150#endif
1151
1152#if NBPFILTER > 0
1153 /* If BPF is in the kernel, call the attach for it. */
1165 bpfattach(&sc->bpf, &sc->sc_if, DLT_EN10MB,
1166 sizeof(struct ether_header));
1154 bpfattach(&sc->sc_if, DLT_EN10MB, sizeof(struct ether_header));
1167#endif
1168 return 1;
1169}
1170
1171/*
1172 * Reset interface.
1173 */
1174static void

--- 920 unchanged lines hidden (view full) ---

2095 struct ifreq * ifr = ( struct ifreq * )data;
2096
2097 bcopy((caddr_t)sc->sc_enaddr,
2098 (caddr_t)&ifr->ifr_data, ETHER_ADDR_LEN);
2099 break;
2100 }
2101#endif
2102
1155#endif
1156 return 1;
1157}
1158
1159/*
1160 * Reset interface.
1161 */
1162static void

--- 920 unchanged lines hidden (view full) ---

2083 struct ifreq * ifr = ( struct ifreq * )data;
2084
2085 bcopy((caddr_t)sc->sc_enaddr,
2086 (caddr_t)&ifr->ifr_data, ETHER_ADDR_LEN);
2087 break;
2088 }
2089#endif
2090
2091#ifdef notdef
2103#ifdef SIOCSIFPHYSADDR
2104 case SIOCSIFPHYSADDR:
2105 {
2106 /*
2107 * Set the physical (Ehternet) address of the interface.
2108 * When and by whom is this command used? FIXME.
2109 */
2110 struct ifreq * ifr = ( struct ifreq * )data;
2111
2112 bcopy((caddr_t)&ifr->ifr_data,
2113 (caddr_t)sc->sc_enaddr, ETHER_ADDR_LEN);
2114 fe_setlinkaddr( sc );
2115 break;
2116 }
2117#endif
2092#ifdef SIOCSIFPHYSADDR
2093 case SIOCSIFPHYSADDR:
2094 {
2095 /*
2096 * Set the physical (Ehternet) address of the interface.
2097 * When and by whom is this command used? FIXME.
2098 */
2099 struct ifreq * ifr = ( struct ifreq * )data;
2100
2101 bcopy((caddr_t)&ifr->ifr_data,
2102 (caddr_t)sc->sc_enaddr, ETHER_ADDR_LEN);
2103 fe_setlinkaddr( sc );
2104 break;
2105 }
2106#endif
2107#endif /* notdef */
2118
2119#ifdef SIOCSIFFLAGS
2120 case SIOCSIFFLAGS:
2121 {
2122 /*
2123 * Switch interface state between "running" and
2124 * "stopped", reflecting the UP flag.
2125 */

--- 147 unchanged lines hidden (view full) ---

2273
2274#define ETHER_ADDR_IS_MULTICAST(A) (*(char *)(A) & 1)
2275
2276#if NBPFILTER > 0
2277 /*
2278 * Check if there's a BPF listener on this interface.
2279 * If it is, hand off the raw packet to bpf.
2280 */
2108
2109#ifdef SIOCSIFFLAGS
2110 case SIOCSIFFLAGS:
2111 {
2112 /*
2113 * Switch interface state between "running" and
2114 * "stopped", reflecting the UP flag.
2115 */

--- 147 unchanged lines hidden (view full) ---

2263
2264#define ETHER_ADDR_IS_MULTICAST(A) (*(char *)(A) & 1)
2265
2266#if NBPFILTER > 0
2267 /*
2268 * Check if there's a BPF listener on this interface.
2269 * If it is, hand off the raw packet to bpf.
2270 */
2281 if ( sc->bpf ) {
2282 bpf_mtap( sc->bpf, m );
2271 if ( sc->sc_if.if_bpf ) {
2272 bpf_mtap( &sc->sc_if, m );
2283 }
2284#endif
2285
2286 /*
2287 * Make sure this packet is (or may be) directed to us.
2288 * That is, the packet is either unicasted to our address,
2289 * or broad/multi-casted. If any other packets are
2290 * received, it is an indication of an error -- probably

--- 384 unchanged lines hidden (view full) ---

2675 /* We have just updated the filter. */
2676 sc->filter_change = 0;
2677
2678#if FE_DEBUG >= 3
2679 log( LOG_INFO, "fe%d: address filter changed\n", sc->sc_unit );
2680#endif
2681}
2682
2273 }
2274#endif
2275
2276 /*
2277 * Make sure this packet is (or may be) directed to us.
2278 * That is, the packet is either unicasted to our address,
2279 * or broad/multi-casted. If any other packets are
2280 * received, it is an indication of an error -- probably

--- 384 unchanged lines hidden (view full) ---

2665 /* We have just updated the filter. */
2666 sc->filter_change = 0;
2667
2668#if FE_DEBUG >= 3
2669 log( LOG_INFO, "fe%d: address filter changed\n", sc->sc_unit );
2670#endif
2671}
2672
2683/*
2684 * Copy the physical (Ethernet) address into the "data link" address
2685 * entry of the address list for an interface.
2686 * This is (said to be) useful for netstat(1) to keep track of which
2687 * interface is which.
2688 *
2689 * What I'm not sure on this function is, why this is a driver's function.
2690 * Probably this should be moved to somewhere independent to a specific
2691 * hardware, such as if_ehtersubr.c. FIXME.
2692 */
2693static void
2694fe_setlinkaddr ( struct fe_softc * sc )
2695{
2696 struct ifaddr *ifa;
2697 struct sockaddr_dl * sdl;
2698
2699 /*
2700 * Search down the ifa address list looking for the AF_LINK type entry.
2701 */
2702 for ( ifa = sc->sc_if.if_addrlist; ifa != NULL; ifa = ifa->ifa_next ) {
2703 if ( ifa->ifa_addr != NULL
2704 && ifa->ifa_addr->sa_family == AF_LINK ) {
2705
2706 /*
2707 * We have found an AF_LINK type entry.
2708 * Fill in the link-level address for this interface
2709 */
2710 sdl = (struct sockaddr_dl *) ifa->ifa_addr;
2711 sdl->sdl_type = IFT_ETHER;
2712 sdl->sdl_alen = ETHER_ADDR_LEN;
2713 sdl->sdl_slen = 0;
2714 bcopy(sc->sc_enaddr, LLADDR(sdl), ETHER_ADDR_LEN);
2715#if FE_DEBUG >= 3
2716 log( LOG_INFO, "fe%d: link address set\n",
2717 sc->sc_unit );
2718#endif
2719 return;
2720 }
2721 }
2722}
2723
2724#if FE_DEBUG >= 1
2725static void
2726fe_dump ( int level, struct fe_softc * sc, char * message )
2727{
2728 log( level, "fe%d: %s,"
2729 " DLCR = %02x %02x %02x %02x %02x %02x %02x %02x,"
2730 " BMPR = xx xx %02x %02x %02x %02x %02x %02x,"
2731 " asic = %02x %02x %02x %02x %02x %02x %02x %02x"

--- 19 unchanged lines hidden ---
2673#if FE_DEBUG >= 1
2674static void
2675fe_dump ( int level, struct fe_softc * sc, char * message )
2676{
2677 log( level, "fe%d: %s,"
2678 " DLCR = %02x %02x %02x %02x %02x %02x %02x %02x,"
2679 " BMPR = xx xx %02x %02x %02x %02x %02x %02x,"
2680 " asic = %02x %02x %02x %02x %02x %02x %02x %02x"

--- 19 unchanged lines hidden ---