This page will help to configure your FreeBSD to support if_media which is required to use the latest version of the "de" driver.
if_media was first proposed/designed by BSDI for BSD/OS 3.0. It allows you display the available media choices and allows to select among them. It also allows to change operation modes such as operating in full or half duplex. With a nearly dozen media options available by boards supported by the de driver, the IFF_* hack that it previously used was just no longer supportable.
It's available from the NetBSD ftp server.
You need two files: if_media.c and if_media.h. These go in /sys/net on your system. Note that you might need to modify the #ifdef in if_media.h. These files require modifications to sys/net/if.h, sys/sys/sockio.h, and sys/conf/files.
To sys/net/if.h, you will to modify the ifreq structure and add a ifr_media member. You also need to add a ifmediareq struct. These diffs are for a 2.1.0 system:
--- if.h.orig Tue May 30 08:07:59 1995
+++ if.h Fri Mar 21 16:45:14 1997
@@ -305,6 +305,7 @@
int ifru_metric;
int ifru_mtu;
int ifru_phys;
+ int ifru_media;
caddr_t ifru_data;
} ifr_ifru;
#define ifr_addr ifr_ifru.ifru_addr /* address */
@@ -314,6 +315,7 @@
#define ifr_metric ifr_ifru.ifru_metric /* metric */
#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */
#define ifr_phys ifr_ifru.ifru_phys /* physical wire */
+#define ifr_media ifr_ifru.ifru_media /* network media */
#define ifr_data ifr_ifru.ifru_data /* for use by interface */
};
@@ -322,6 +324,17 @@
struct sockaddr ifra_addr;
struct sockaddr ifra_broadaddr;
struct sockaddr ifra_mask;
+};
+
+struct ifmediareq {
+ char ifm_name[IFNAMSIZ]; /* if name, e.g. "en0" */
+ int ifm_current; /* current media options */
+ int ifm_mask; /* don't care mask */
+ int ifm_status; /* media status */
+ int ifm_active; /* active options */
+ int ifm_count; /* # entries in ifm_ulist
+ array */
+ int *ifm_ulist; /* media words */
};
/*
To sys/sys/sockio.h, you need to add the two ioctls used by if_media (if the numbers are in use, pick the next available ones):
#define SIOCSIFMEDIA _IOWR('i', 55, struct ifreq) /* set net media */
#define SIOCGIFMEDIA _IOWR('i', 56, struct ifmediareq) /* get net media */
Finally you need to add one file to sys/conf/files (add it right after the line for net/if.c):
net/if_media.c standard
That should be able all the changes needed to compile a kernel with if_media support. You might want to rebuild a kernel at this point to see everything compiles. (If you get a problem compiling if_media.c, you probably need to change the #ifdef in if_media.h)
which is composed of three files: if_de.c , if_devar.h , and dc21040reg.h . All these files go in /sys/pci.You will need to rename dc21040reg.h to dc21040.h.
Now you will need to build yourself the NetBSD version of ifconfig so you can modify the if_media settings. It's available in ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/sbin/ifconfig/ and should compile under FreeBSD. You make have to make "CC=cc -I/sys" since your /sys and /usr/include/sys headers are now out of sync).