39#include <sys/socket.h>
41#include <sys/sockio.h>
42#include <sys/kernel.h>
44#include <sys/module.h>
48#include <sys/malloc.h>
51#include <net/if_var.h>
52#include <net/if_types.h>
53#include <net/netisr.h>
56#include <netinet/in.h>
57#include <netinet/in_systm.h>
58#include <netinet/in_var.h>
59#include <netinet/ip.h>
60#include <netinet/if_ether.h>
69#define PCF_MASTER_ADDRESS 0xaa
71#define ICHDRLEN sizeof(u_int32_t)
93#define IC_SENDING 0x0001
94#define IC_OBUF_BUSY 0x0002
95#define IC_IFBUF_BUSY 0x0004
96#define IC_BUFFERS_BUSY (IC_OBUF_BUSY | IC_IFBUF_BUSY)
97#define IC_BUFFER_WAITER 0x0004
104static int icioctl(
struct ifnet *, u_long, caddr_t);
105static int icoutput(
struct ifnet *,
struct mbuf *,
const struct sockaddr *,
108static int icintr(device_t,
int,
char *);
112 DEVMETHOD(device_probe,
icprobe),
132 obuf = malloc(mtu +
ICHDRLEN, M_DEVBUF, M_WAITOK);
133 ifbuf = malloc(mtu +
ICHDRLEN, M_DEVBUF, M_WAITOK);
138 mtx_sleep(sc, &sc->
ic_lock, 0,
"icalloc", 0);
156 return (BUS_PROBE_NOWILDCARD);
168 ifp = sc->
ic_ifp = if_alloc(IFT_PARA);
172 mtx_init(&sc->
ic_lock, device_get_nameunit(
dev), MTX_NETWORK_LOCK,
178 if_initname(ifp, device_get_name(
dev), device_get_unit(
dev));
179 ifp->if_flags = IFF_SIMPLEX | IFF_POINTOPOINT | IFF_MULTICAST;
184 ifp->if_snd.ifq_maxlen = ifqmaxlen;
201 struct ic_softc *sc = ifp->if_softc;
202 device_t icdev = sc->
ic_dev;
203 device_t parent = device_get_parent(icdev);
204 struct ifaddr *ifa = (
struct ifaddr *)
data;
205 struct ifreq *ifr = (
struct ifreq *)
data;
212 if (ifa->ifa_addr->sa_family != AF_INET)
213 return (EAFNOSUPPORT);
215 ifp->if_flags |= IFF_UP;
220 if ((!(ifp->if_flags & IFF_UP)) &&
221 (ifp->if_drv_flags & IFF_DRV_RUNNING)) {
224 ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
231 if (((ifp->if_flags & IFF_UP)) &&
232 (!(ifp->if_drv_flags & IFF_DRV_RUNNING))) {
239 ifp->if_drv_flags |= IFF_DRV_RUNNING;
250 ifr->ifr_mtu = sc->
ic_ifp->if_mtu;
257 return (EAFNOSUPPORT);
258 switch (ifr->ifr_addr.sa_family) {
262 return (EAFNOSUPPORT);
307 if_inc_counter(sc->
ic_ifp, IFCOUNTER_IPACKETS, 1);
308 if_inc_counter(sc->
ic_ifp, IFCOUNTER_IBYTES,
len);
312 struct epoch_tracker et;
315 M_SETFIB(top, sc->
ic_ifp->if_fib);
317 netisr_dispatch(NETISR_IP, top);
325 if_inc_counter(sc->
ic_ifp, IFCOUNTER_IERRORS, 1);
349 panic(
"%s: unknown event (%d)!", __func__,
event);
360icoutput(
struct ifnet *ifp,
struct mbuf *m,
const struct sockaddr *dst,
363 struct ic_softc *sc = ifp->if_softc;
364 device_t icdev = sc->
ic_dev;
365 device_t parent = device_get_parent(icdev);
372 if (dst->sa_family == AF_UNSPEC)
373 bcopy(dst->sa_data, &hdr,
sizeof(hdr));
375 hdr = RO_GET_FAMILY(ro, dst);
378 ifp->if_drv_flags |= IFF_DRV_RUNNING;
382 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
393 if (
len + mm->m_len > sc->
ic_ifp->if_mtu) {
395 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
399 bcopy(mtod(mm,
char *), cp, mm->m_len);
403 }
while ((mm = mm->m_next));
405 BPF_MTAP2(ifp, &hdr,
sizeof(hdr), m);
416 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
418 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
419 if_inc_counter(ifp, IFCOUNTER_OBYTES,
len);
static int icintr(device_t, int, char *)
static int icioctl(struct ifnet *, u_long, caddr_t)
static device_method_t ic_methods[]
static driver_t ic_driver
static void ic_alloc_buffers(struct ic_softc *sc, int mtu)
static int icprobe(device_t)
MODULE_DEPEND(ic, iicbus, IICBUS_MINVER, IICBUS_PREFVER, IICBUS_MAXVER)
static int icoutput(struct ifnet *, struct mbuf *, const struct sockaddr *, struct route *)
static devclass_t ic_devclass
DRIVER_MODULE(ic, iicbus, ic_driver, ic_devclass, 0, 0)
static int icattach(device_t)
#define PCF_MASTER_ADDRESS
int iicbus_request_bus(device_t bus, device_t dev, int how)
void iicbus_intr(device_t bus, int event, char *buf)
int iicbus_release_bus(device_t bus, device_t dev)
int iicbus_block_write(device_t bus, u_char slave, char *buf, int len, int *sent)
#define iicbus_reset(bus, speed, addr, oldaddr)