diff options
author | jhb <jhb@FreeBSD.org> | 2008-11-12 22:14:05 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2008-11-12 22:14:05 +0000 |
commit | 8a2e5505edb61903e9ed697c4bc6e3479b9b0147 (patch) | |
tree | 59f8031dd3bcaba141bfed13efb03f5969c08dd7 /sys/dev | |
parent | cadce78d9004faaa59cfb30955b12ca18d41af98 (diff) | |
download | FreeBSD-src-8a2e5505edb61903e9ed697c4bc6e3479b9b0147.zip FreeBSD-src-8a2e5505edb61903e9ed697c4bc6e3479b9b0147.tar.gz |
Various style and whitespace fixes. Previously parts of this file used
8 space indent, parts used 4 space indent, and other parts used a weird
mixture (8 spaces for first indent, 4 spaces for the rest).
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/ppbus/if_plip.c | 734 |
1 files changed, 371 insertions, 363 deletions
diff --git a/sys/dev/ppbus/if_plip.c b/sys/dev/ppbus/if_plip.c index fd17ed9..bdd31e3 100644 --- a/sys/dev/ppbus/if_plip.c +++ b/sys/dev/ppbus/if_plip.c @@ -78,7 +78,7 @@ __FBSDID("$FreeBSD$"); /* * Update for ppbus, PLIP support only - Nicolas Souchu - */ + */ #include "opt_plip.h" @@ -110,7 +110,7 @@ __FBSDID("$FreeBSD$"); #include <dev/ppbus/ppbio.h> #ifndef LPMTU /* MTU for the lp# interfaces */ -#define LPMTU 1500 +#define LPMTU 1500 #endif #ifndef LPMAXSPIN1 /* DELAY factor for the lp# interfaces */ @@ -156,14 +156,14 @@ struct lp_data { /* Tables for the lp# interface */ static u_char *txmith; -#define txmitl (txmith+(1*LPIPTBLSIZE)) -#define trecvh (txmith+(2*LPIPTBLSIZE)) -#define trecvl (txmith+(3*LPIPTBLSIZE)) +#define txmitl (txmith + (1 * LPIPTBLSIZE)) +#define trecvh (txmith + (2 * LPIPTBLSIZE)) +#define trecvl (txmith + (3 * LPIPTBLSIZE)) static u_char *ctxmith; -#define ctxmitl (ctxmith+(1*LPIPTBLSIZE)) -#define ctrecvh (ctxmith+(2*LPIPTBLSIZE)) -#define ctrecvl (ctxmith+(3*LPIPTBLSIZE)) +#define ctxmitl (ctxmith + (1 * LPIPTBLSIZE)) +#define ctrecvh (ctxmith + (2 * LPIPTBLSIZE)) +#define ctrecvl (ctxmith + (3 * LPIPTBLSIZE)) /* Functions for the lp# interface */ static int lpinittables(void); @@ -186,9 +186,7 @@ lp_identify(driver_t *driver, device_t parent) if (!dev) BUS_ADD_CHILD(parent, 0, "plip", -1); } -/* - * lpprobe() - */ + static int lp_probe(device_t dev) { @@ -199,7 +197,7 @@ lp_probe(device_t dev) } static int -lp_attach (device_t dev) +lp_attach(device_t dev) { struct lp_data *lp = DEVTOSOFTC(dev); struct ifnet *ifp; @@ -211,7 +209,7 @@ lp_attach (device_t dev) * Reserve the interrupt resource. If we don't have one, the * attach fails. */ - lp->res_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + lp->res_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_SHAREABLE); if (lp->res_irq == 0) { device_printf(dev, "cannot reserve interrupt, failed.\n"); @@ -245,190 +243,191 @@ lp_attach (device_t dev) * precalculate them when we initialize. */ static int -lpinittables (void) +lpinittables(void) { - int i; + int i; - if (!txmith) - txmith = malloc(4*LPIPTBLSIZE, M_DEVBUF, M_NOWAIT); + if (txmith == NULL) + txmith = malloc(4 * LPIPTBLSIZE, M_DEVBUF, M_NOWAIT); - if (!txmith) - return 1; + if (txmith == NULL) + return (1); - if (!ctxmith) + if (ctxmith == NULL) ctxmith = malloc(4*LPIPTBLSIZE, M_DEVBUF, M_NOWAIT); - if (!ctxmith) - return 1; + if (ctxmith == NULL) + return (1); - for (i=0; i < LPIPTBLSIZE; i++) { - ctxmith[i] = (i & 0xF0) >> 4; - ctxmitl[i] = 0x10 | (i & 0x0F); - ctrecvh[i] = (i & 0x78) << 1; - ctrecvl[i] = (i & 0x78) >> 3; - } + for (i = 0; i < LPIPTBLSIZE; i++) { + ctxmith[i] = (i & 0xF0) >> 4; + ctxmitl[i] = 0x10 | (i & 0x0F); + ctrecvh[i] = (i & 0x78) << 1; + ctrecvl[i] = (i & 0x78) >> 3; + } - for (i=0; i < LPIPTBLSIZE; i++) { - txmith[i] = ((i & 0x80) >> 3) | ((i & 0x70) >> 4) | 0x08; - txmitl[i] = ((i & 0x08) << 1) | (i & 0x07); - trecvh[i] = ((~i) & 0x80) | ((i & 0x38) << 1); - trecvl[i] = (((~i) & 0x80) >> 4) | ((i & 0x38) >> 3); - } + for (i = 0; i < LPIPTBLSIZE; i++) { + txmith[i] = ((i & 0x80) >> 3) | ((i & 0x70) >> 4) | 0x08; + txmitl[i] = ((i & 0x08) << 1) | (i & 0x07); + trecvh[i] = ((~i) & 0x80) | ((i & 0x38) << 1); + trecvl[i] = (((~i) & 0x80) >> 4) | ((i & 0x38) >> 3); + } - return 0; + return (0); } /* * Process an ioctl request. */ - static int -lpioctl (struct ifnet *ifp, u_long cmd, caddr_t data) +lpioctl(struct ifnet *ifp, u_long cmd, caddr_t data) { - struct lp_data *sc = ifp->if_softc; - device_t dev = sc->sc_dev; - device_t ppbus = device_get_parent(dev); - struct ifaddr *ifa = (struct ifaddr *)data; - struct ifreq *ifr = (struct ifreq *)data; - u_char *ptr; - void *ih; - int error; - - switch (cmd) { - - case SIOCSIFDSTADDR: - case SIOCAIFADDR: - case SIOCSIFADDR: - if (ifa->ifa_addr->sa_family != AF_INET) - return EAFNOSUPPORT; - - ifp->if_flags |= IFF_UP; - /* FALLTHROUGH */ - case SIOCSIFFLAGS: - if ((!(ifp->if_flags & IFF_UP)) && - (ifp->if_drv_flags & IFF_DRV_RUNNING)) { - - ppb_wctr(ppbus, 0x00); - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - - /* IFF_UP is not set, try to release the bus anyway */ - ppb_release_bus(ppbus, dev); - break; - } - if (((ifp->if_flags & IFF_UP)) && - (!(ifp->if_drv_flags & IFF_DRV_RUNNING))) { - - /* XXX - * Should the request be interruptible? - */ - if ((error = ppb_request_bus(ppbus, dev, PPB_WAIT|PPB_INTR))) - return (error); - - /* Now IFF_UP means that we own the bus */ - - ppb_set_mode(ppbus, PPB_COMPATIBLE); - - if (lpinittables()) { - ppb_release_bus(ppbus, dev); - return ENOBUFS; - } - - sc->sc_ifbuf = malloc(sc->sc_ifp->if_mtu + MLPIPHDRLEN, - M_DEVBUF, M_WAITOK); - if (!sc->sc_ifbuf) { - ppb_release_bus(ppbus, dev); - return ENOBUFS; - } - - /* attach our interrupt handler, later detached when the bus is released */ - if ((error = bus_setup_intr(dev, sc->res_irq, - INTR_TYPE_NET, NULL, lp_intr, dev, &ih))) { - ppb_release_bus(ppbus, dev); - return (error); - } - - ppb_wctr(ppbus, IRQENABLE); - ifp->if_drv_flags |= IFF_DRV_RUNNING; - } - break; - - case SIOCSIFMTU: - ptr = sc->sc_ifbuf; - sc->sc_ifbuf = malloc(ifr->ifr_mtu+MLPIPHDRLEN, M_DEVBUF, M_NOWAIT); - if (!sc->sc_ifbuf) { - sc->sc_ifbuf = ptr; - return ENOBUFS; - } - if (ptr) - free(ptr,M_DEVBUF); - sc->sc_ifp->if_mtu = ifr->ifr_mtu; - break; - - case SIOCGIFMTU: - ifr->ifr_mtu = sc->sc_ifp->if_mtu; - break; - - case SIOCADDMULTI: - case SIOCDELMULTI: - if (ifr == 0) { - return EAFNOSUPPORT; /* XXX */ - } - switch (ifr->ifr_addr.sa_family) { + struct lp_data *sc = ifp->if_softc; + device_t dev = sc->sc_dev; + device_t ppbus = device_get_parent(dev); + struct ifaddr *ifa = (struct ifaddr *)data; + struct ifreq *ifr = (struct ifreq *)data; + u_char *ptr; + void *ih; + int error; + + switch (cmd) { + case SIOCSIFDSTADDR: + case SIOCAIFADDR: + case SIOCSIFADDR: + if (ifa->ifa_addr->sa_family != AF_INET) + return (EAFNOSUPPORT); + + ifp->if_flags |= IFF_UP; + /* FALLTHROUGH */ + case SIOCSIFFLAGS: + if ((!(ifp->if_flags & IFF_UP)) && + (ifp->if_drv_flags & IFF_DRV_RUNNING)) { + + ppb_wctr(ppbus, 0x00); + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + + /* IFF_UP is not set, try to release the bus anyway */ + ppb_release_bus(ppbus, dev); + break; + } + if (((ifp->if_flags & IFF_UP)) && + (!(ifp->if_drv_flags & IFF_DRV_RUNNING))) { + + /* XXX + * Should the request be interruptible? + */ + if ((error = ppb_request_bus(ppbus, dev, PPB_WAIT | + PPB_INTR))) + return (error); + + /* Now IFF_UP means that we own the bus */ + ppb_set_mode(ppbus, PPB_COMPATIBLE); + + if (lpinittables()) { + ppb_release_bus(ppbus, dev); + return (ENOBUFS); + } + + sc->sc_ifbuf = malloc(sc->sc_ifp->if_mtu + MLPIPHDRLEN, + M_DEVBUF, M_WAITOK); + if (sc->sc_ifbuf == NULL) { + ppb_release_bus(ppbus, dev); + return (ENOBUFS); + } + + /* + * Attach our interrupt handler. It is + * detached later when the bus is released. + */ + if ((error = bus_setup_intr(dev, sc->res_irq, + INTR_TYPE_NET, NULL, lp_intr, dev, &ih))) { + ppb_release_bus(ppbus, dev); + return (error); + } + + ppb_wctr(ppbus, IRQENABLE); + ifp->if_drv_flags |= IFF_DRV_RUNNING; + } + break; + + case SIOCSIFMTU: + ptr = sc->sc_ifbuf; + sc->sc_ifbuf = malloc(ifr->ifr_mtu + MLPIPHDRLEN, M_DEVBUF, + M_NOWAIT); + if (sc->sc_ifbuf == NULL) { + sc->sc_ifbuf = ptr; + return (ENOBUFS); + } + if (ptr) + free(ptr, M_DEVBUF); + sc->sc_ifp->if_mtu = ifr->ifr_mtu; + break; + + case SIOCGIFMTU: + ifr->ifr_mtu = sc->sc_ifp->if_mtu; + break; + + case SIOCADDMULTI: + case SIOCDELMULTI: + if (ifr == 0) { + return (EAFNOSUPPORT); /* XXX */ + } + switch (ifr->ifr_addr.sa_family) { + case AF_INET: + break; + default: + return (EAFNOSUPPORT); + } + break; - case AF_INET: - break; + case SIOCGIFMEDIA: + /* + * No ifmedia support at this stage; maybe use it + * in future for eg. protocol selection. + */ + return (EINVAL); default: - return EAFNOSUPPORT; + lprintf("LP:ioctl(0x%lx)\n", cmd); + return (EINVAL); } - break; - - case SIOCGIFMEDIA: - /* - * No ifmedia support at this stage; maybe use it - * in future for eg. protocol selection. - */ - return EINVAL; - - default: - lprintf("LP:ioctl(0x%lx)\n", cmd); - return EINVAL; - } - return 0; + return (0); } static __inline int -clpoutbyte (u_char byte, int spin, device_t ppbus) +clpoutbyte(u_char byte, int spin, device_t ppbus) { + ppb_wdtr(ppbus, ctxmitl[byte]); while (ppb_rstr(ppbus) & CLPIP_SHAKE) if (--spin == 0) { - return 1; + return (1); } ppb_wdtr(ppbus, ctxmith[byte]); while (!(ppb_rstr(ppbus) & CLPIP_SHAKE)) if (--spin == 0) { - return 1; + return (1); } - return 0; + return (0); } static __inline int -clpinbyte (int spin, device_t ppbus) +clpinbyte(int spin, device_t ppbus) { u_char c, cl; while((ppb_rstr(ppbus) & CLPIP_SHAKE)) - if(!--spin) { - return -1; - } + if (!--spin) { + return (-1); + } cl = ppb_rstr(ppbus); ppb_wdtr(ppbus, 0x10); while(!(ppb_rstr(ppbus) & CLPIP_SHAKE)) - if(!--spin) { - return -1; - } + if (!--spin) { + return (-1); + } c = ppb_rstr(ppbus); ppb_wdtr(ppbus, 0x00); @@ -439,11 +438,12 @@ static void lptap(struct ifnet *ifp, struct mbuf *m) { u_int32_t af = AF_INET; + bpf_mtap2(ifp->if_bpf, &af, sizeof(af), m); } static void -lp_intr (void *arg) +lp_intr(void *arg) { device_t dev = (device_t)arg; device_t ppbus = device_get_parent(dev); @@ -457,96 +457,105 @@ lp_intr (void *arg) if (sc->sc_ifp->if_flags & IFF_LINK0) { - /* Ack. the request */ - ppb_wdtr(ppbus, 0x01); - - /* Get the packet length */ - j = clpinbyte(LPMAXSPIN2, ppbus); - if (j == -1) - goto err; - len = j; - j = clpinbyte(LPMAXSPIN2, ppbus); - if (j == -1) - goto err; - len = len + (j << 8); - if (len > sc->sc_ifp->if_mtu + MLPIPHDRLEN) - goto err; - - bp = sc->sc_ifbuf; - - while (len--) { - j = clpinbyte(LPMAXSPIN2, ppbus); - if (j == -1) { - goto err; - } - *bp++ = j; - } - /* Get and ignore checksum */ - j = clpinbyte(LPMAXSPIN2, ppbus); - if (j == -1) { - goto err; - } - - len = bp - sc->sc_ifbuf; - if (len <= CLPIPHDRLEN) - goto err; - - sc->sc_iferrs = 0; - - len -= CLPIPHDRLEN; - sc->sc_ifp->if_ipackets++; - sc->sc_ifp->if_ibytes += len; - top = m_devget(sc->sc_ifbuf + CLPIPHDRLEN, len, 0, sc->sc_ifp, 0); - if (top) { - if (bpf_peers_present(sc->sc_ifp->if_bpf)) - lptap(sc->sc_ifp, top); - netisr_queue(NETISR_IP, top); /* mbuf is free'd on failure. */ - } - goto done; + /* Ack. the request */ + ppb_wdtr(ppbus, 0x01); + + /* Get the packet length */ + j = clpinbyte(LPMAXSPIN2, ppbus); + if (j == -1) + goto err; + len = j; + j = clpinbyte(LPMAXSPIN2, ppbus); + if (j == -1) + goto err; + len = len + (j << 8); + if (len > sc->sc_ifp->if_mtu + MLPIPHDRLEN) + goto err; + + bp = sc->sc_ifbuf; + + while (len--) { + j = clpinbyte(LPMAXSPIN2, ppbus); + if (j == -1) { + goto err; + } + *bp++ = j; + } + + /* Get and ignore checksum */ + j = clpinbyte(LPMAXSPIN2, ppbus); + if (j == -1) { + goto err; + } + + len = bp - sc->sc_ifbuf; + if (len <= CLPIPHDRLEN) + goto err; + + sc->sc_iferrs = 0; + + len -= CLPIPHDRLEN; + sc->sc_ifp->if_ipackets++; + sc->sc_ifp->if_ibytes += len; + top = m_devget(sc->sc_ifbuf + CLPIPHDRLEN, len, 0, sc->sc_ifp, + 0); + if (top) { + if (bpf_peers_present(sc->sc_ifp->if_bpf)) + lptap(sc->sc_ifp, top); + + /* mbuf is free'd on failure. */ + netisr_queue(NETISR_IP, top); + } + goto done; } while ((ppb_rstr(ppbus) & LPIP_SHAKE)) { - len = sc->sc_ifp->if_mtu + LPIPHDRLEN; - bp = sc->sc_ifbuf; - while (len--) { + len = sc->sc_ifp->if_mtu + LPIPHDRLEN; + bp = sc->sc_ifbuf; + while (len--) { - cl = ppb_rstr(ppbus); - ppb_wdtr(ppbus, 8); + cl = ppb_rstr(ppbus); + ppb_wdtr(ppbus, 8); - j = LPMAXSPIN2; - while((ppb_rstr(ppbus) & LPIP_SHAKE)) - if(!--j) goto err; + j = LPMAXSPIN2; + while((ppb_rstr(ppbus) & LPIP_SHAKE)) + if (!--j) + goto err; - c = ppb_rstr(ppbus); - ppb_wdtr(ppbus, 0); + c = ppb_rstr(ppbus); + ppb_wdtr(ppbus, 0); - *bp++= trecvh[cl] | trecvl[c]; + *bp++= trecvh[cl] | trecvl[c]; - j = LPMAXSPIN2; - while (!((cl=ppb_rstr(ppbus)) & LPIP_SHAKE)) { - if (cl != c && - (((cl = ppb_rstr(ppbus)) ^ 0xb8) & 0xf8) == - (c & 0xf8)) - goto end; - if (!--j) goto err; + j = LPMAXSPIN2; + while (!((cl = ppb_rstr(ppbus)) & LPIP_SHAKE)) { + if (cl != c && + (((cl = ppb_rstr(ppbus)) ^ 0xb8) & 0xf8) == + (c & 0xf8)) + goto end; + if (!--j) + goto err; + } } - } end: - len = bp - sc->sc_ifbuf; - if (len <= LPIPHDRLEN) - goto err; - - sc->sc_iferrs = 0; - - len -= LPIPHDRLEN; - sc->sc_ifp->if_ipackets++; - sc->sc_ifp->if_ibytes += len; - top = m_devget(sc->sc_ifbuf + LPIPHDRLEN, len, 0, sc->sc_ifp, 0); - if (top) { - if (bpf_peers_present(sc->sc_ifp->if_bpf)) - lptap(sc->sc_ifp, top); - netisr_queue(NETISR_IP, top); /* mbuf is free'd on failure. */ - } + len = bp - sc->sc_ifbuf; + if (len <= LPIPHDRLEN) + goto err; + + sc->sc_iferrs = 0; + + len -= LPIPHDRLEN; + sc->sc_ifp->if_ipackets++; + sc->sc_ifp->if_ibytes += len; + top = m_devget(sc->sc_ifbuf + LPIPHDRLEN, len, 0, sc->sc_ifp, + 0); + if (top) { + if (bpf_peers_present(sc->sc_ifp->if_bpf)) + lptap(sc->sc_ifp, top); + + /* mbuf is free'd on failure. */ + netisr_queue(NETISR_IP, top); + } } goto done; @@ -561,182 +570,181 @@ lp_intr (void *arg) * so stop wasting our time */ if (sc->sc_iferrs > LPMAXERRS) { - if_printf(sc->sc_ifp, "Too many errors, Going off-line.\n"); - ppb_wctr(ppbus, 0x00); - sc->sc_ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - sc->sc_iferrs=0; + if_printf(sc->sc_ifp, "Too many errors, Going off-line.\n"); + ppb_wctr(ppbus, 0x00); + sc->sc_ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + sc->sc_iferrs = 0; } done: splx(s); - return; } static __inline int lpoutbyte (u_char byte, int spin, device_t ppbus) { - ppb_wdtr(ppbus, txmith[byte]); - while (!(ppb_rstr(ppbus) & LPIP_SHAKE)) - if (--spin == 0) - return 1; - ppb_wdtr(ppbus, txmitl[byte]); - while (ppb_rstr(ppbus) & LPIP_SHAKE) - if (--spin == 0) - return 1; - return 0; + + ppb_wdtr(ppbus, txmith[byte]); + while (!(ppb_rstr(ppbus) & LPIP_SHAKE)) + if (--spin == 0) + return (1); + ppb_wdtr(ppbus, txmitl[byte]); + while (ppb_rstr(ppbus) & LPIP_SHAKE) + if (--spin == 0) + return (1); + return (0); } static int -lpoutput (struct ifnet *ifp, struct mbuf *m, - struct sockaddr *dst, struct rtentry *rt) +lpoutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, + struct rtentry *rt) { - struct lp_data *sc = ifp->if_softc; - device_t dev = sc->sc_dev; - device_t ppbus = device_get_parent(dev); - int s, err; - struct mbuf *mm; - u_char *cp = "\0\0"; - u_char chksum = 0; - int count = 0; - int i, len, spin; + struct lp_data *sc = ifp->if_softc; + device_t dev = sc->sc_dev; + device_t ppbus = device_get_parent(dev); + int s, err; + struct mbuf *mm; + u_char *cp = "\0\0"; + u_char chksum = 0; + int count = 0; + int i, len, spin; + + /* We need a sensible value if we abort */ + cp++; + ifp->if_drv_flags |= IFF_DRV_RUNNING; + + err = 1; /* assume we're aborting because of an error */ - /* We need a sensible value if we abort */ - cp++; - ifp->if_drv_flags |= IFF_DRV_RUNNING; + s = splhigh(); - err = 1; /* assume we're aborting because of an error */ + /* Suspend (on laptops) or receive-errors might have taken us offline */ + ppb_wctr(ppbus, IRQENABLE); - s = splhigh(); + if (ifp->if_flags & IFF_LINK0) { + if (!(ppb_rstr(ppbus) & CLPIP_SHAKE)) { + lprintf("&"); + lp_intr(dev); + } - /* Suspend (on laptops) or receive-errors might have taken us offline */ - ppb_wctr(ppbus, IRQENABLE); + /* Alert other end to pending packet */ + spin = LPMAXSPIN1; + ppb_wdtr(ppbus, 0x08); + while ((ppb_rstr(ppbus) & 0x08) == 0) + if (--spin == 0) { + goto nend; + } - if (ifp->if_flags & IFF_LINK0) { + /* Calculate length of packet, then send that */ - if (!(ppb_rstr(ppbus) & CLPIP_SHAKE)) { - lprintf("&"); - lp_intr(dev); - } + count += 14; /* Ethernet header len */ - /* Alert other end to pending packet */ - spin = LPMAXSPIN1; - ppb_wdtr(ppbus, 0x08); - while ((ppb_rstr(ppbus) & 0x08) == 0) - if (--spin == 0) { + mm = m; + for (mm = m; mm; mm = mm->m_next) { + count += mm->m_len; + } + if (clpoutbyte(count & 0xFF, LPMAXSPIN1, ppbus)) + goto nend; + if (clpoutbyte((count >> 8) & 0xFF, LPMAXSPIN1, ppbus)) goto nend; + + /* Send dummy ethernet header */ + for (i = 0; i < 12; i++) { + if (clpoutbyte(i, LPMAXSPIN1, ppbus)) + goto nend; + chksum += i; } - /* Calculate length of packet, then send that */ + if (clpoutbyte(0x08, LPMAXSPIN1, ppbus)) + goto nend; + if (clpoutbyte(0x00, LPMAXSPIN1, ppbus)) + goto nend; + chksum += 0x08 + 0x00; /* Add into checksum */ + + mm = m; + do { + cp = mtod(mm, u_char *); + len = mm->m_len; + while (len--) { + chksum += *cp; + if (clpoutbyte(*cp++, LPMAXSPIN2, ppbus)) + goto nend; + } + } while ((mm = mm->m_next)); + + /* Send checksum */ + if (clpoutbyte(chksum, LPMAXSPIN2, ppbus)) + goto nend; - count += 14; /* Ethernet header len */ + /* Go quiescent */ + ppb_wdtr(ppbus, 0); - mm = m; - for (mm = m; mm; mm = mm->m_next) { - count += mm->m_len; + err = 0; /* No errors */ + + nend: + if (err) { /* if we didn't timeout... */ + ifp->if_oerrors++; + lprintf("X"); + } else { + ifp->if_opackets++; + ifp->if_obytes += m->m_pkthdr.len; + if (bpf_peers_present(ifp->if_bpf)) + lptap(ifp, m); + } + + m_freem(m); + + if (!(ppb_rstr(ppbus) & CLPIP_SHAKE)) { + lprintf("^"); + lp_intr(dev); + } + (void) splx(s); + return (0); } - if (clpoutbyte(count & 0xFF, LPMAXSPIN1, ppbus)) - goto nend; - if (clpoutbyte((count >> 8) & 0xFF, LPMAXSPIN1, ppbus)) - goto nend; - - /* Send dummy ethernet header */ - for (i = 0; i < 12; i++) { - if (clpoutbyte(i, LPMAXSPIN1, ppbus)) - goto nend; - chksum += i; + + if (ppb_rstr(ppbus) & LPIP_SHAKE) { + lprintf("&"); + lp_intr(dev); } - if (clpoutbyte(0x08, LPMAXSPIN1, ppbus)) - goto nend; - if (clpoutbyte(0x00, LPMAXSPIN1, ppbus)) - goto nend; - chksum += 0x08 + 0x00; /* Add into checksum */ + if (lpoutbyte(0x08, LPMAXSPIN1, ppbus)) + goto end; + if (lpoutbyte(0x00, LPMAXSPIN2, ppbus)) + goto end; mm = m; do { cp = mtod(mm, u_char *); len = mm->m_len; - while (len--) { - chksum += *cp; - if (clpoutbyte(*cp++, LPMAXSPIN2, ppbus)) - goto nend; - } + while (len--) + if (lpoutbyte(*cp++, LPMAXSPIN2, ppbus)) + goto end; } while ((mm = mm->m_next)); - /* Send checksum */ - if (clpoutbyte(chksum, LPMAXSPIN2, ppbus)) - goto nend; + err = 0; /* no errors were encountered */ - /* Go quiescent */ - ppb_wdtr(ppbus, 0); +end: + --cp; + ppb_wdtr(ppbus, txmitl[*cp] ^ 0x17); - err = 0; /* No errors */ - - nend: - if (err) { /* if we didn't timeout... */ + if (err) { /* if we didn't timeout... */ ifp->if_oerrors++; lprintf("X"); } else { ifp->if_opackets++; ifp->if_obytes += m->m_pkthdr.len; if (bpf_peers_present(ifp->if_bpf)) - lptap(ifp, m); + lptap(ifp, m); } m_freem(m); - if (!(ppb_rstr(ppbus) & CLPIP_SHAKE)) { + if (ppb_rstr(ppbus) & LPIP_SHAKE) { lprintf("^"); lp_intr(dev); } + (void) splx(s); - return 0; - } - - if (ppb_rstr(ppbus) & LPIP_SHAKE) { - lprintf("&"); - lp_intr(dev); - } - - if (lpoutbyte(0x08, LPMAXSPIN1, ppbus)) - goto end; - if (lpoutbyte(0x00, LPMAXSPIN2, ppbus)) - goto end; - - mm = m; - do { - cp = mtod(mm,u_char *); - len = mm->m_len; - while (len--) - if (lpoutbyte(*cp++, LPMAXSPIN2, ppbus)) - goto end; - } while ((mm = mm->m_next)); - - err = 0; /* no errors were encountered */ - - end: - --cp; - ppb_wdtr(ppbus, txmitl[*cp] ^ 0x17); - - if (err) { /* if we didn't timeout... */ - ifp->if_oerrors++; - lprintf("X"); - } else { - ifp->if_opackets++; - ifp->if_obytes += m->m_pkthdr.len; - if (bpf_peers_present(ifp->if_bpf)) - lptap(ifp, m); - } - - m_freem(m); - - if (ppb_rstr(ppbus) & LPIP_SHAKE) { - lprintf("^"); - lp_intr(dev); - } - - (void) splx(s); - return 0; + return (0); } static device_method_t lp_methods[] = { @@ -749,9 +757,9 @@ static device_method_t lp_methods[] = { }; static driver_t lp_driver = { - "plip", - lp_methods, - sizeof(struct lp_data), + "plip", + lp_methods, + sizeof(struct lp_data), }; DRIVER_MODULE(plip, ppbus, lp_driver, lp_devclass, 0, 0); |