From 23558356ecf8868cf72b2130fa934d81f59c4fcb Mon Sep 17 00:00:00 2001 From: Martin Pieuchot Date: Tue, 20 Aug 2013 09:14:35 +0000 Subject: tedu netnatm and ueagle(4). ok mikeb@, sthen@, tedu@ (implied), doc bits ok jmc@ --- sys/dev/usb/files.usb | 8 +- sys/dev/usb/ueagle.c | 1466 ----------------------------------------------- sys/dev/usb/ueaglereg.h | 124 ---- sys/dev/usb/ueaglevar.h | 189 ------ 4 files changed, 1 insertion(+), 1786 deletions(-) delete mode 100644 sys/dev/usb/ueagle.c delete mode 100644 sys/dev/usb/ueaglereg.h delete mode 100644 sys/dev/usb/ueaglevar.h (limited to 'sys/dev') diff --git a/sys/dev/usb/files.usb b/sys/dev/usb/files.usb index 72363b4978e..e210db08fd6 100644 --- a/sys/dev/usb/files.usb +++ b/sys/dev/usb/files.usb @@ -1,4 +1,4 @@ -# $OpenBSD: files.usb,v 1.106 2013/08/15 15:01:48 edd Exp $ +# $OpenBSD: files.usb,v 1.107 2013/08/20 09:14:17 mpi Exp $ # $NetBSD: files.usb,v 1.16 2000/02/14 20:29:54 augustss Exp $ # # Config file and device description for machine-independent USB code. @@ -384,12 +384,6 @@ device otus: ether, ifnet, ifmedia, wlan, firmload attach otus at uhub file dev/usb/if_otus.c otus -# Analog Devices Eagle driver -device ueagle: atm, ifnet, ezload, firmload -attach ueagle at uhub -file dev/usb/ueagle.c ueagle - - # USB logical device device usbf {} attach usbf at usbdev diff --git a/sys/dev/usb/ueagle.c b/sys/dev/usb/ueagle.c deleted file mode 100644 index d12fe974811..00000000000 --- a/sys/dev/usb/ueagle.c +++ /dev/null @@ -1,1466 +0,0 @@ -/* $OpenBSD: ueagle.c,v 1.38 2013/04/15 09:23:02 mglocker Exp $ */ - -/*- - * Copyright (c) 2003-2006 - * Damien Bergamini - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/*- - * Driver for Analog Devices Eagle chipset. - * http://www.analog.com/ - */ - -#include "bpfilter.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#ifdef INET -#include -#include -#include -#endif - -#include -#include -#include -#include -#include - -#include -#include - -#ifdef USB_DEBUG -#define DPRINTF(x) do { if (ueagledebug > 0) printf x; } while (0) -#define DPRINTFN(n, x) do { if (ueagledebug >= (n)) printf x; } while (0) -int ueagledebug = 0; -#else -#define DPRINTF(x) -#define DPRINTFN(n, x) -#endif - -/* various supported device vendors/products */ -static const struct ueagle_type { - struct usb_devno dev; - const char *fw; -} ueagle_devs[] = { - { { USB_VENDOR_ANALOG, USB_PRODUCT_ANALOG_EAGLEI }, NULL }, - { { USB_VENDOR_ANALOG, USB_PRODUCT_ANALOG_EAGLEI_NF }, "ueagleI" }, - { { USB_VENDOR_ANALOG, USB_PRODUCT_ANALOG_EAGLEII }, NULL }, - { { USB_VENDOR_ANALOG, USB_PRODUCT_ANALOG_EAGLEII_NF }, "ueagleII" }, - { { USB_VENDOR_ANALOG, USB_PRODUCT_ANALOG_EAGLEIIC }, NULL }, - { { USB_VENDOR_ANALOG, USB_PRODUCT_ANALOG_EAGLEIIC_NF }, "ueagleII" }, - { { USB_VENDOR_ANALOG, USB_PRODUCT_ANALOG_EAGLEIII }, NULL }, - { { USB_VENDOR_ANALOG, USB_PRODUCT_ANALOG_EAGLEIII_NF }, "ueagleIII" }, - { { USB_VENDOR_USR, USB_PRODUCT_USR_HEINEKEN_A }, NULL }, - { { USB_VENDOR_USR, USB_PRODUCT_USR_HEINEKEN_A_NF }, "ueagleI" }, - { { USB_VENDOR_USR, USB_PRODUCT_USR_HEINEKEN_B }, NULL }, - { { USB_VENDOR_USR, USB_PRODUCT_USR_HEINEKEN_B_NF }, "ueagleI" }, - { { USB_VENDOR_USR, USB_PRODUCT_USR_MILLER_A }, NULL }, - { { USB_VENDOR_USR, USB_PRODUCT_USR_MILLER_A_NF }, "ueagleI" }, - { { USB_VENDOR_USR, USB_PRODUCT_USR_MILLER_B }, NULL }, - { { USB_VENDOR_USR, USB_PRODUCT_USR_MILLER_B_NF }, "ueagleI" } -}; -#define ueagle_lookup(v, p) \ - ((struct ueagle_type *)usb_lookup(ueagle_devs, v, p)) - -void ueagle_attachhook(void *); -int ueagle_getesi(struct ueagle_softc *, uint8_t *); -void ueagle_loadpage(void *); -void ueagle_request(struct ueagle_softc *, uint16_t, uint16_t, - void *, int); -#ifdef USB_DEBUG -void ueagle_dump_cmv(struct ueagle_softc *, struct ueagle_cmv *); -#endif -int ueagle_cr(struct ueagle_softc *, uint32_t, uint16_t, - uint32_t *); -int ueagle_cw(struct ueagle_softc *, uint32_t, uint16_t, uint32_t); -int ueagle_stat(struct ueagle_softc *); -void ueagle_stat_thread(void *); -int ueagle_boot(struct ueagle_softc *); -void ueagle_swap_intr(struct ueagle_softc *, struct ueagle_swap *); -void ueagle_cmv_intr(struct ueagle_softc *, struct ueagle_cmv *); -void ueagle_intr(struct usbd_xfer *, void *, usbd_status); -uint32_t ueagle_crc_update(uint32_t, uint8_t *, int); -void ueagle_push_cell(struct ueagle_softc *, uint8_t *); -void ueagle_rxeof(struct usbd_xfer *, void *, usbd_status); -void ueagle_txeof(struct usbd_xfer *, void *, usbd_status); -int ueagle_encap(struct ueagle_softc *, struct mbuf *); -void ueagle_start(struct ifnet *); -int ueagle_open_vcc(struct ueagle_softc *, - struct atm_pseudoioctl *); -int ueagle_close_vcc(struct ueagle_softc *, - struct atm_pseudoioctl *); -int ueagle_ioctl(struct ifnet *, u_long, caddr_t); -int ueagle_open_pipes(struct ueagle_softc *); -void ueagle_close_pipes(struct ueagle_softc *); -int ueagle_init(struct ifnet *); -void ueagle_stop(struct ifnet *, int); - -int ueagle_match(struct device *, void *, void *); -void ueagle_attach(struct device *, struct device *, void *); -int ueagle_detach(struct device *, int); -int ueagle_activate(struct device *, int); - -struct cfdriver ueagle_cd = { - NULL, "ueagle", DV_DULL -}; - -const struct cfattach ueagle_ca = { - sizeof(struct ueagle_softc), - ueagle_match, - ueagle_attach, - ueagle_detach, - ueagle_activate, -}; - -int -ueagle_match(struct device *parent, void *match, void *aux) -{ - struct usb_attach_arg *uaa = aux; - - if (uaa->iface != NULL) - return UMATCH_NONE; - - return (ueagle_lookup(uaa->vendor, uaa->product) != NULL) ? - UMATCH_VENDOR_PRODUCT : UMATCH_NONE; -} - -void -ueagle_attachhook(void *xsc) -{ - char *firmwares[2]; - struct ueagle_softc *sc = xsc; - - firmwares[0] = (char *)sc->fw; - firmwares[1] = NULL; - - if (ezload_downloads_and_reset(sc->sc_udev, firmwares) != 0) { - printf("%s: could not download firmware\n", - sc->sc_dev.dv_xname); - return; - } -} - -void -ueagle_attach(struct device *parent, struct device *self, void *aux) -{ - struct ueagle_softc *sc = (struct ueagle_softc *)self; - struct usb_attach_arg *uaa = aux; - struct ifnet *ifp = &sc->sc_if; - uint8_t addr[ETHER_ADDR_LEN]; - - sc->sc_udev = uaa->device; - - /* - * Pre-firmware modems must be flashed and reset first. They will - * automatically detach themselves from the bus and reattach later - * with a new product Id. - */ - sc->fw = ueagle_lookup(uaa->vendor, uaa->product)->fw; - if (sc->fw != NULL) { - if (rootvp == NULL) - mountroothook_establish(ueagle_attachhook, sc); - else - ueagle_attachhook(sc); - - /* processing of pre-firmware modems ends here */ - return; - } - - if (usbd_set_config_no(sc->sc_udev, UEAGLE_CONFIG_NO, 0) != 0) { - printf("%s: could not set configuration no\n", - sc->sc_dev.dv_xname); - return; - } - - if (ueagle_getesi(sc, addr) != 0) { - printf("%s: could not read end system identifier\n", - sc->sc_dev.dv_xname); - return; - } - - printf("%s: address: %02x:%02x:%02x:%02x:%02x:%02x\n", - sc->sc_dev.dv_xname, addr[0], addr[1], addr[2], addr[3], - addr[4], addr[5]); - - usb_init_task(&sc->sc_swap_task, ueagle_loadpage, sc, - USB_TASK_TYPE_GENERIC); - - ifp->if_softc = sc; - ifp->if_flags = IFF_SIMPLEX; - ifp->if_ioctl = ueagle_ioctl; - ifp->if_start = ueagle_start; - IFQ_SET_READY(&ifp->if_snd); - memcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ); - - if_attach(ifp); - atm_ifattach(ifp); - - /* override default MTU value (9180 is too large for us) */ - ifp->if_mtu = UEAGLE_IFMTU; - -#if NBPFILTER > 0 - bpfattach(&ifp->if_bpf, ifp, DLT_RAW, 0); -#endif -} - -int -ueagle_detach(struct device *self, int flags) -{ - struct ueagle_softc *sc = (struct ueagle_softc *)self; - struct ifnet *ifp = &sc->sc_if; - - if (sc->fw != NULL) - return 0; /* shortcut for pre-firmware devices */ - - ueagle_stop(ifp, 1); - - /* wait for stat thread to exit properly */ - if (sc->stat_thread != NULL) { - DPRINTFN(3, ("%s: waiting for stat thread to exit\n", - sc->sc_dev.dv_xname)); - - tsleep(sc->stat_thread, PZERO, "ueaglestat", 0); - - DPRINTFN(3, ("%s: stat thread exited properly\n", - sc->sc_dev.dv_xname)); - } - - if (ifp->if_softc != NULL) - if_detach(ifp); - - return 0; -} - -/* - * Retrieve the device End System Identifier (MAC address). - */ -int -ueagle_getesi(struct ueagle_softc *sc, uint8_t *addr) -{ - usb_string_descriptor_t us; - usbd_status error; - uint16_t c; - int i, len; - - error = usbd_get_string_desc(sc->sc_udev, UEAGLE_ESISTR, 0, &us, &len); - if (error != 0) - return error; - - if (us.bLength < (6 + 1) * 2) - return 1; - - for (i = 0; i < 6 * 2; i++) { - if ((c = UGETW(us.bString[i])) & 0xff00) - return 1; /* not 8-bit clean */ - - if (i & 1) - addr[i / 2] <<= 4; - else - addr[i / 2] = 0; - - if (c >= '0' && c <= '9') - addr[i / 2] |= c - '0'; - else if (c >= 'a' && c <= 'f') - addr[i / 2] |= c - 'a' + 10; - else if (c >= 'A' && c <= 'F') - addr[i / 2] |= c - 'A' + 10; - else - return 1; - } - - return 0; -} - -void -ueagle_loadpage(void *xsc) -{ - struct ueagle_softc *sc = xsc; - struct usbd_xfer *xfer; - struct ueagle_block_info bi; - uint16_t pageno = sc->pageno; - uint16_t ovl = sc->ovl; - uint8_t pagecount, blockcount; - uint16_t blockaddr, blocksize; - uint32_t pageoffset; - uint8_t *p; - int i; - - if (usbd_is_dying(sc->sc_udev)) - return; - - p = sc->dsp; - pagecount = *p++; - - if (pageno >= pagecount) { - printf("%s: invalid page number %u requested\n", - sc->sc_dev.dv_xname, pageno); - return; - } - - p += 4 * pageno; - pageoffset = UGETDW(p); - if (pageoffset == 0) - return; - - p = sc->dsp + pageoffset; - blockcount = *p++; - - DPRINTF(("%s: sending %u blocks for fw page %u\n", - sc->sc_dev.dv_xname, blockcount, pageno)); - - if ((xfer = usbd_alloc_xfer(sc->sc_udev)) == NULL) { - printf("%s: could not allocate xfer\n", - sc->sc_dev.dv_xname); - return; - } - - USETW(bi.wHdr, UEAGLE_BLOCK_INFO_HDR); - USETW(bi.wOvl, ovl); - USETW(bi.wOvlOffset, ovl | 0x8000); - - for (i = 0; i < blockcount; i++) { - blockaddr = UGETW(p); p += 2; - blocksize = UGETW(p); p += 2; - - USETW(bi.wSize, blocksize); - USETW(bi.wAddress, blockaddr); - USETW(bi.wLast, (i == blockcount - 1) ? 1 : 0); - - /* send block info through the IDMA pipe */ - usbd_setup_xfer(xfer, sc->pipeh_idma, sc, &bi, sizeof bi, - USBD_SYNCHRONOUS, UEAGLE_IDMA_TIMEOUT, NULL); - if (usbd_transfer(xfer) != 0) { - printf("%s: could not transfer block info\n", - sc->sc_dev.dv_xname); - break; - } - - /* send block data through the IDMA pipe */ - usbd_setup_xfer(xfer, sc->pipeh_idma, sc, p, blocksize, - USBD_SYNCHRONOUS, UEAGLE_IDMA_TIMEOUT, NULL); - if (usbd_transfer(xfer) != 0) { - printf("%s: could not transfer block data\n", - sc->sc_dev.dv_xname); - break; - } - - p += blocksize; - } - - usbd_free_xfer(xfer); -} - -void -ueagle_request(struct ueagle_softc *sc, uint16_t val, uint16_t index, - void *data, int len) -{ - usb_device_request_t req; - usbd_status error; - - req.bmRequestType = UT_WRITE_VENDOR_DEVICE; - req.bRequest = UEAGLE_REQUEST; - USETW(req.wValue, val); - USETW(req.wIndex, index); - USETW(req.wLength, len); - - error = usbd_do_request_async(sc->sc_udev, &req, data); - if (error != USBD_NORMAL_COMPLETION && error != USBD_IN_PROGRESS) - printf("%s: could not send request\n", sc->sc_dev.dv_xname); -} - -#ifdef USB_DEBUG -void -ueagle_dump_cmv(struct ueagle_softc *sc, struct ueagle_cmv *cmv) -{ - printf(" Preamble: 0x%04x\n", UGETW(cmv->wPreamble)); - printf(" Destination: %s (0x%02x)\n", - (cmv->bDst == UEAGLE_HOST) ? "Host" : "Modem", cmv->bDst); - printf(" Type: %u\n", cmv->bFunction >> 4); - printf(" Subtype: %u\n", cmv->bFunction & 0xf); - printf(" Index: %u\n", UGETW(cmv->wIndex)); - printf(" Address: %c%c%c%c.%u\n", - cmv->dwSymbolicAddress[1], cmv->dwSymbolicAddress[0], - cmv->dwSymbolicAddress[3], cmv->dwSymbolicAddress[2], - UGETW(cmv->wOffsetAddress)); - printf(" Data: 0x%08x\n", UGETDATA(cmv->dwData)); -} -#endif - -int -ueagle_cr(struct ueagle_softc *sc, uint32_t address, uint16_t offset, - uint32_t *data) -{ - struct ueagle_cmv cmv; - usbd_status error; - int s; - - USETW(cmv.wPreamble, UEAGLE_CMV_PREAMBLE); - cmv.bDst = UEAGLE_MODEM; - cmv.bFunction = UEAGLE_CR; - USETW(cmv.wIndex, sc->index); - USETW(cmv.wOffsetAddress, offset); - USETDW(cmv.dwSymbolicAddress, address); - USETDATA(cmv.dwData, 0); - -#ifdef USB_DEBUG - if (ueagledebug >= 15) { - printf("%s: reading CMV\n", sc->sc_dev.dv_xname); - ueagle_dump_cmv(sc, &cmv); - } -#endif - - s = splusb(); - - ueagle_request(sc, UEAGLE_SETBLOCK, UEAGLE_MPTXSTART, &cmv, sizeof cmv); - - /* wait at most 2 seconds for an answer */ - error = tsleep(UEAGLE_COND_CMV(sc), PZERO, "cmv", 2 * hz); - if (error != 0) { - printf("%s: timeout waiting for CMV ack\n", - sc->sc_dev.dv_xname); - splx(s); - return error; - } - - *data = sc->data; - splx(s); - - return 0; -} - -int -ueagle_cw(struct ueagle_softc *sc, uint32_t address, uint16_t offset, - uint32_t data) -{ - struct ueagle_cmv cmv; - usbd_status error; - int s; - - USETW(cmv.wPreamble, UEAGLE_CMV_PREAMBLE); - cmv.bDst = UEAGLE_MODEM; - cmv.bFunction = UEAGLE_CW; - USETW(cmv.wIndex, sc->index); - USETW(cmv.wOffsetAddress, offset); - USETDW(cmv.dwSymbolicAddress, address); - USETDATA(cmv.dwData, data); - -#ifdef USB_DEBUG - if (ueagledebug >= 15) { - printf("%s: writing CMV\n", sc->sc_dev.dv_xname); - ueagle_dump_cmv(sc, &cmv); - } -#endif - - s = splusb(); - - ueagle_request(sc, UEAGLE_SETBLOCK, UEAGLE_MPTXSTART, &cmv, sizeof cmv); - - /* wait at most 2 seconds for an answer */ - error = tsleep(UEAGLE_COND_CMV(sc), PZERO, "cmv", 2 * hz); - if (error != 0) { - printf("%s: timeout waiting for CMV ack\n", - sc->sc_dev.dv_xname); - splx(s); - return error; - } - - splx(s); - - return 0; -} - -int -ueagle_stat(struct ueagle_softc *sc) -{ - struct ifnet *ifp = &sc->sc_if; - uint32_t data; - usbd_status error; -#define CR(sc, address, offset, data) do { \ - if ((error = ueagle_cr(sc, address, offset, data)) != 0) \ - return error; \ -} while (0) - - CR(sc, UEAGLE_CMV_STAT, 0, &sc->stats.phy.status); - switch ((sc->stats.phy.status >> 8) & 0xf) { - case 0: /* idle */ - DPRINTFN(3, ("%s: waiting for synchronization\n", - sc->sc_dev.dv_xname)); - return ueagle_cw(sc, UEAGLE_CMV_CNTL, 0, 2); - - case 1: /* initialization */ - DPRINTFN(3, ("%s: initializing\n", sc->sc_dev.dv_xname)); - return ueagle_cw(sc, UEAGLE_CMV_CNTL, 0, 2); - - case 2: /* operational */ - DPRINTFN(4, ("%s: operational\n", sc->sc_dev.dv_xname)); - break; - - default: /* fail ... */ - DPRINTFN(3, ("%s: synchronization failed\n", - sc->sc_dev.dv_xname)); - ueagle_init(ifp); - return 1; - } - - CR(sc, UEAGLE_CMV_DIAG, 1, &sc->stats.phy.flags); - if (sc->stats.phy.flags & 0x10) { - DPRINTF(("%s: delineation LOSS\n", sc->sc_dev.dv_xname)); - sc->stats.phy.status = 0; - ueagle_init(ifp); - return 1; - } - - CR(sc, UEAGLE_CMV_RATE, 0, &data); - sc->stats.phy.dsrate = ((data >> 16) & 0x1ff) * 32; - sc->stats.phy.usrate = (data & 0xff) * 32; - - CR(sc, UEAGLE_CMV_DIAG, 23, &data); - sc->stats.phy.attenuation = (data & 0xff) / 2; - - CR(sc, UEAGLE_CMV_DIAG, 3, &sc->stats.atm.cells_crc_errors); - CR(sc, UEAGLE_CMV_DIAG, 22, &sc->stats.phy.dserror); - CR(sc, UEAGLE_CMV_DIAG, 25, &sc->stats.phy.dsmargin); - CR(sc, UEAGLE_CMV_DIAG, 46, &sc->stats.phy.userror); - CR(sc, UEAGLE_CMV_DIAG, 49, &sc->stats.phy.usmargin); - CR(sc, UEAGLE_CMV_DIAG, 51, &sc->stats.phy.rxflow); - CR(sc, UEAGLE_CMV_DIAG, 52, &sc->stats.phy.txflow); - CR(sc, UEAGLE_CMV_DIAG, 54, &sc->stats.phy.dsunc); - CR(sc, UEAGLE_CMV_DIAG, 58, &sc->stats.phy.usunc); - CR(sc, UEAGLE_CMV_INFO, 8, &sc->stats.phy.vidco); - CR(sc, UEAGLE_CMV_INFO, 14, &sc->stats.phy.vidcpe); - - if (sc->pipeh_tx != NULL) - return 0; - - return ueagle_open_pipes(sc); -#undef CR -} - -void -ueagle_stat_thread(void *arg) -{ - struct ueagle_softc *sc = arg; - - for (;;) { - if (ueagle_stat(sc) != 0) - break; - - usbd_delay_ms(sc->sc_udev, 5000); - if (usbd_is_dying(sc->sc_udev)) - break; - } - - wakeup(sc->stat_thread); - - kthread_exit(0); -} - -int -ueagle_boot(struct ueagle_softc *sc) -{ - uint16_t zero = 0; /* ;-) */ - usbd_status error; -#define CW(sc, address, offset, data) do { \ - if ((error = ueagle_cw(sc, address, offset, data)) != 0) \ - return error; \ -} while (0) - - ueagle_request(sc, UEAGLE_SETMODE, UEAGLE_BOOTIDMA, NULL, 0); - ueagle_request(sc, UEAGLE_SETMODE, UEAGLE_STARTRESET, NULL, 0); - - usbd_delay_ms(sc->sc_udev, 200); - - ueagle_request(sc, UEAGLE_SETMODE, UEAGLE_ENDRESET, NULL, 0); - ueagle_request(sc, UEAGLE_SET2183DATA, UEAGLE_MPTXMAILBOX, &zero, 2); - ueagle_request(sc, UEAGLE_SET2183DATA, UEAGLE_MPRXMAILBOX, &zero, 2); - ueagle_request(sc, UEAGLE_SET2183DATA, UEAGLE_SWAPMAILBOX, &zero, 2); - - usbd_delay_ms(sc->sc_udev, 1000); - - sc->pageno = 0; - sc->ovl = 0; - ueagle_loadpage(sc); - - /* wait until modem reaches operational state */ - error = tsleep(UEAGLE_COND_READY(sc), PZERO | PCATCH, "boot", 10 * hz); - if (error != 0) { - printf("%s: timeout waiting for operational state\n", - sc->sc_dev.dv_xname); - return error; - } - - CW(sc, UEAGLE_CMV_CNTL, 0, 1); - - /* send configuration options */ - CW(sc, UEAGLE_CMV_OPTN, 0, UEAGLE_OPTN0); - CW(sc, UEAGLE_CMV_OPTN, 2, UEAGLE_OPTN2); - CW(sc, UEAGLE_CMV_OPTN, 7, UEAGLE_OPTN7); - - /* continue with synchronization */ - CW(sc, UEAGLE_CMV_CNTL, 0, 2); - - return kthread_create(ueagle_stat_thread, sc, &sc->stat_thread, - sc->sc_dev.dv_xname); -#undef CW -} - -void -ueagle_swap_intr(struct ueagle_softc *sc, struct ueagle_swap *swap) -{ -#define rotbr(v, n) ((v) >> (n) | (v) << (8 - (n))) - sc->pageno = swap->bPageNo; - sc->ovl = rotbr(swap->bOvl, 4); - - usb_add_task(sc->sc_udev, &sc->sc_swap_task); -#undef rotbr -} - -/* - * This function handles spontaneous CMVs and CMV acknowledgements sent by the - * modem on the interrupt pipe. - */ -void -ueagle_cmv_intr(struct ueagle_softc *sc, struct ueagle_cmv *cmv) -{ -#ifdef USB_DEBUG - if (ueagledebug >= 15) { - printf("%s: receiving CMV\n", sc->sc_dev.dv_xname); - ueagle_dump_cmv(sc, cmv); - } -#endif - - if (UGETW(cmv->wPreamble) != UEAGLE_CMV_PREAMBLE) { - printf("%s: received CMV with invalid preamble\n", - sc->sc_dev.dv_xname); - return; - } - - if (cmv->bDst != UEAGLE_HOST) { - printf("%s: received CMV with bad direction\n", - sc->sc_dev.dv_xname); - return; - } - - /* synchronize our current CMV index with the modem */ - sc->index = UGETW(cmv->wIndex) + 1; - - switch (cmv->bFunction) { - case UEAGLE_MODEMREADY: - wakeup(UEAGLE_COND_READY(sc)); - break; - - case UEAGLE_CR_ACK: - sc->data = UGETDATA(cmv->dwData); - /* FALLTHROUGH */ - case UEAGLE_CW_ACK: - wakeup(UEAGLE_COND_CMV(sc)); - break; - } -} - -void -ueagle_intr(struct usbd_xfer *xfer, void *priv, usbd_status status) -{ - struct ueagle_softc *sc = priv; - struct ueagle_intr *intr; - - if (status != USBD_NORMAL_COMPLETION) { - if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) - return; - - DPRINTF(("%s: abnormal interrupt status: %s\n", - sc->sc_dev.dv_xname, usbd_errstr(status))); - - usbd_clear_endpoint_stall_async(sc->pipeh_intr); - return; - } - - intr = (struct ueagle_intr *)sc->ibuf; - switch (UGETW(intr->wInterrupt)) { - case UEAGLE_INTR_SWAP: - ueagle_swap_intr(sc, (struct ueagle_swap *)(intr + 1)); - break; - - case UEAGLE_INTR_CMV: - ueagle_cmv_intr(sc, (struct ueagle_cmv *)(intr + 1)); - break; - - default: - printf("%s: caught unknown interrupt\n", - sc->sc_dev.dv_xname); - } -} - -static const uint32_t ueagle_crc32_table[256] = { - 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, - 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, - 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, - 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, - 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, - 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, - 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, - 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, - 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, - 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, - 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, - 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, - 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, - 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, - 0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, - 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, - 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, - 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, - 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, - 0x40d816ba, 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, - 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, - 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, - 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, - 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, - 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, - 0xd1799b34, 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, - 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, - 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, - 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, - 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, - 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, - 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, - 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, - 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, - 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, - 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, - 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, - 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, - 0x81b02d74, 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, - 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, - 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, - 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, - 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, - 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, - 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, - 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, - 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, - 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, - 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, - 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, - 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, - 0xb1f740b4 -}; - -uint32_t -ueagle_crc_update(uint32_t crc, uint8_t *buf, int len) -{ - for (; len != 0; len--, buf++) - crc = ueagle_crc32_table[(crc >> 24) ^ *buf] ^ (crc << 8); - - return crc; -} - -/* - * Reassembly part of the software ATM AAL5 SAR. - */ -void -ueagle_push_cell(struct ueagle_softc *sc, uint8_t *cell) -{ - struct ueagle_vcc *vcc = &sc->vcc; - struct ifnet *ifp; - struct mbuf *m; - uint32_t crc; - uint16_t pdulen, totlen; - int s; - - sc->stats.atm.cells_received++; - - if (!(vcc->flags & UEAGLE_VCC_ACTIVE) || - ATM_CH_GETVPI(cell) != vcc->vpi || - ATM_CH_GETVCI(cell) != vcc->vci) { - sc->stats.atm.vcc_no_conn++; - return; - } - - if (vcc->flags & UEAGLE_VCC_DROP) { - if (ATM_CH_ISLASTCELL(cell)) { - vcc->flags &= ~UEAGLE_VCC_DROP; - sc->stats.atm.cspdus_dropped++; - } - - sc->stats.atm.cells_dropped++; - return; - } - - if (vcc->m == NULL) { - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (m == NULL) { - vcc->flags |= UEAGLE_VCC_DROP; - return; - } - - MCLGET(m, M_DONTWAIT); - if (!(m->m_flags & M_EXT)) { - vcc->flags |= UEAGLE_VCC_DROP; - m_freem(m); - return; - } - - vcc->m = m; - vcc->dst = mtod(m, uint8_t *); - vcc->limit = vcc->dst + MCLBYTES - ATM_CELL_PAYLOAD_SIZE; - } - - if (vcc->dst > vcc->limit) { - vcc->flags |= UEAGLE_VCC_DROP; - sc->stats.atm.cells_dropped++; - goto fail; - } - - memcpy(vcc->dst, cell + ATM_CELL_HEADER_SIZE, ATM_CELL_PAYLOAD_SIZE); - vcc->dst += ATM_CELL_PAYLOAD_SIZE; - - if (!ATM_CH_ISLASTCELL(cell)) - return; - - /* - * Handle the last cell of the AAL5 CPCS-PDU. - */ - m = vcc->m; - - totlen = vcc->dst - mtod(m, uint8_t *); - pdulen = AAL5_TR_GETPDULEN(cell); - - if (totlen < pdulen + AAL5_TRAILER_SIZE) { - sc->stats.atm.cspdus_dropped++; - goto fail; - } - - if (totlen >= pdulen + ATM_CELL_PAYLOAD_SIZE + AAL5_TRAILER_SIZE) { - sc->stats.atm.cspdus_dropped++; - goto fail; - } - - crc = ueagle_crc_update(CRC_INITIAL, mtod(m, uint8_t *), totlen); - if (crc != CRC_MAGIC) { - sc->stats.atm.cspdus_crc_errors++; - goto fail; - } - - /* finalize mbuf */ - ifp = &sc->sc_if; - m->m_pkthdr.rcvif = ifp; - m->m_pkthdr.len = m->m_len = pdulen; - - sc->stats.atm.cspdus_received++; - - s = splnet(); - -#if NBPFILTER > 0 - if (ifp->if_bpf != NULL) - bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN); -#endif - - /* send the AAL5 CPCS-PDU to the ATM layer */ - ifp->if_ipackets++; - atm_input(ifp, &vcc->aph, m, vcc->rxhand); - vcc->m = NULL; - - splx(s); - - return; - -fail: m_freem(vcc->m); - vcc->m = NULL; -} - -void -ueagle_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status) -{ - struct ueagle_isoreq *req = priv; - struct ueagle_softc *sc = req->sc; - uint32_t count; - uint8_t *p; - int i; - - if (status == USBD_CANCELLED) - return; - - for (i = 0; i < UEAGLE_NISOFRMS; i++) { - count = req->frlengths[i]; - p = req->offsets[i]; - - while (count >= ATM_CELL_SIZE) { - ueagle_push_cell(sc, p); - p += ATM_CELL_SIZE; - count -= ATM_CELL_SIZE; - } -#ifdef DIAGNOSTIC - if (count > 0) { - printf("%s: truncated cell (%u bytes)\n", - sc->sc_dev.dv_xname, count); - } -#endif - req->frlengths[i] = sc->isize; - } - - usbd_setup_isoc_xfer(req->xfer, sc->pipeh_rx, req, req->frlengths, - UEAGLE_NISOFRMS, USBD_NO_COPY, ueagle_rxeof); - usbd_transfer(xfer); -} - -void -ueagle_txeof(struct usbd_xfer *xfer, void *priv, usbd_status status) -{ - struct ueagle_txreq *req = priv; - struct ueagle_softc *sc = req->sc; - struct ifnet *ifp = &sc->sc_if; - int s; - - if (status != USBD_NORMAL_COMPLETION) { - if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) - return; - - printf("%s: could not transmit buffer: %s\n", - sc->sc_dev.dv_xname, usbd_errstr(status)); - - if (status == USBD_STALLED) - usbd_clear_endpoint_stall_async(sc->pipeh_tx); - - ifp->if_oerrors++; - return; - } - - s = splnet(); - - ifp->if_opackets++; - ifp->if_flags &= ~IFF_OACTIVE; - ueagle_start(ifp); - - splx(s); -} - -/* - * Segmentation part of the software ATM AAL5 SAR. - */ -int -ueagle_encap(struct ueagle_softc *sc, struct mbuf *m0) -{ - struct ueagle_vcc *vcc = &sc->vcc; - struct ueagle_txreq *req; - struct mbuf *m; - uint8_t *src, *dst; - uint32_t crc; - int n, cellleft, mleft; - usbd_status error; - - req = &sc->txreqs[0]; - - m_adj(m0, sizeof (struct atm_pseudohdr)); - - dst = req->buf; - cellleft = 0; - crc = CRC_INITIAL; - - for (m = m0; m != NULL; m = m->m_next) { - src = mtod(m, uint8_t *); - mleft = m->m_len; - - crc = ueagle_crc_update(crc, src, mleft); - - if (cellleft != 0) { - n = min(mleft, cellleft); - - memcpy(dst, src, n); - dst += n; - src += n; - cellleft -= n; - mleft -= n; - } - - while (mleft >= ATM_CELL_PAYLOAD_SIZE) { - memcpy(dst, vcc->ch, ATM_CELL_HEADER_SIZE); - dst += ATM_CELL_HEADER_SIZE; - memcpy(dst, src, ATM_CELL_PAYLOAD_SIZE); - dst += ATM_CELL_PAYLOAD_SIZE; - src += ATM_CELL_PAYLOAD_SIZE; - mleft -= ATM_CELL_PAYLOAD_SIZE; - sc->stats.atm.cells_transmitted++; - } - - if (mleft != 0) { - memcpy(dst, vcc->ch, ATM_CELL_HEADER_SIZE); - dst += ATM_CELL_HEADER_SIZE; - memcpy(dst, src, mleft); - dst += mleft; - cellleft = ATM_CELL_PAYLOAD_SIZE - mleft; - sc->stats.atm.cells_transmitted++; - } - } - - /* - * If there is not enough space to put the AAL5 trailer into this cell, - * pad the content of this cell with zeros and create a new cell which - * will contain no data except the AAL5 trailer itself. - */ - if (cellleft < AAL5_TRAILER_SIZE) { - memset(dst, 0, cellleft); - crc = ueagle_crc_update(crc, dst, cellleft); - dst += cellleft; - - memcpy(dst, vcc->ch, ATM_CELL_HEADER_SIZE); - dst += ATM_CELL_HEADER_SIZE; - cellleft = ATM_CELL_PAYLOAD_SIZE; - sc->stats.atm.cells_transmitted++; - } - - /* - * Fill the AAL5 CPCS-PDU trailer. - */ - memset(dst, 0, cellleft - AAL5_TRAILER_SIZE); - - /* src now points to the beginning of the last cell */ - src = dst + cellleft - ATM_CELL_SIZE; - ATM_CH_SETPTFLAGS(src, 1); - - AAL5_TR_SETCPSUU(src, 0); - AAL5_TR_SETCPI(src, 0); - AAL5_TR_SETPDULEN(src, m0->m_pkthdr.len); - - crc = ~ueagle_crc_update(crc, dst, cellleft - 4); - AAL5_TR_SETCRC(src, crc); - - usbd_setup_xfer(req->xfer, sc->pipeh_tx, req, req->buf, - dst + cellleft - req->buf, USBD_FORCE_SHORT_XFER | USBD_NO_COPY, - UEAGLE_TX_TIMEOUT, ueagle_txeof); - - error = usbd_transfer(req->xfer); - if (error != USBD_NORMAL_COMPLETION && error != USBD_IN_PROGRESS) - return error; - - sc->stats.atm.cspdus_transmitted++; - - return 0; -} - -void -ueagle_start(struct ifnet *ifp) -{ - struct ueagle_softc *sc = ifp->if_softc; - struct mbuf *m0; - - /* nothing goes out until modem is synchronized and VCC is opened */ - if (!(sc->vcc.flags & UEAGLE_VCC_ACTIVE)) - return; - - if (sc->pipeh_tx == NULL) - return; - - IFQ_POLL(&ifp->if_snd, m0); - if (m0 == NULL) - return; - IFQ_DEQUEUE(&ifp->if_snd, m0); - - if (ueagle_encap(sc, m0) != 0) { - m_freem(m0); - return; - } - -#if NBPFILTER > 0 - if (ifp->if_bpf != NULL) - bpf_mtap(ifp->if_bpf, m0, BPF_DIRECTION_OUT); -#endif - - m_freem(m0); - - ifp->if_flags |= IFF_OACTIVE; -} - -int -ueagle_open_vcc(struct ueagle_softc *sc, struct atm_pseudoioctl *api) -{ - struct ueagle_vcc *vcc = &sc->vcc; - - DPRINTF(("%s: opening ATM VCC\n", sc->sc_dev.dv_xname)); - - vcc->vpi = ATM_PH_VPI(&api->aph); - vcc->vci = ATM_PH_VCI(&api->aph); - vcc->rxhand = api->rxhand; - vcc->m = NULL; - vcc->aph = api->aph; - vcc->flags = UEAGLE_VCC_ACTIVE; - - /* pre-calculate cell headers (HEC field is set by hardware) */ - ATM_CH_FILL(vcc->ch, 0, vcc->vpi, vcc->vci, 0, 0, 0); - - return 0; -} - -int -ueagle_close_vcc(struct ueagle_softc *sc, struct atm_pseudoioctl *api) -{ - DPRINTF(("%s: closing ATM VCC\n", sc->sc_dev.dv_xname)); - - sc->vcc.flags &= ~UEAGLE_VCC_ACTIVE; - - return 0; -} - -int -ueagle_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) -{ - struct ueagle_softc *sc = ifp->if_softc; - struct atm_pseudoioctl *api; - struct ifaddr *ifa; - struct ifreq *ifr; - int s, error = 0; - - s = splnet(); - - switch (cmd) { - case SIOCSIFADDR: - ifa = (struct ifaddr *)data; - ifp->if_flags |= IFF_UP; - - ueagle_init(ifp); -#ifdef INET - ifa->ifa_rtrequest = atm_rtrequest; -#endif - break; - - case SIOCSIFFLAGS: - if (ifp->if_flags & IFF_UP) { - if (!(ifp->if_flags & IFF_RUNNING)) - ueagle_init(ifp); - } else { - if (ifp->if_flags & IFF_RUNNING) - ueagle_stop(ifp, 1); - } - break; - - case SIOCSIFMTU: - ifr = (struct ifreq *)data; - - if (ifr->ifr_mtu > UEAGLE_IFMTU) - error = EINVAL; - else - ifp->if_mtu = ifr->ifr_mtu; - break; - - case SIOCATMENA: - api = (struct atm_pseudoioctl *)data; - error = ueagle_open_vcc(sc, api); - break; - - case SIOCATMDIS: - api = (struct atm_pseudoioctl *)data; - error = ueagle_close_vcc(sc, api); - break; - - default: - error = EINVAL; - } - - splx(s); - - return error; -} - -int -ueagle_open_pipes(struct ueagle_softc *sc) -{ - usb_endpoint_descriptor_t *edesc; - struct usbd_interface *iface; - struct ueagle_txreq *txreq; - struct ueagle_isoreq *isoreq; - usbd_status error; - uint8_t *buf; - int i, j; - - error = usbd_device2interface_handle(sc->sc_udev, UEAGLE_US_IFACE_NO, - &iface); - if (error != 0) { - printf("%s: could not get tx interface handle\n", - sc->sc_dev.dv_xname); - goto fail; - } - - error = usbd_open_pipe(iface, UEAGLE_TX_PIPE, USBD_EXCLUSIVE_USE, - &sc->pipeh_tx); - if (error != 0) { - printf("%s: could not open tx pipe\n", sc->sc_dev.dv_xname); - goto fail; - } - - for (i = 0; i < UEAGLE_TX_LIST_CNT; i++) { - txreq = &sc->txreqs[i]; - - txreq->sc = sc; - - txreq->xfer = usbd_alloc_xfer(sc->sc_udev); - if (txreq->xfer == NULL) { - printf("%s: could not allocate tx xfer\n", - sc->sc_dev.dv_xname); - error = ENOMEM; - goto fail; - } - - txreq->buf = usbd_alloc_buffer(txreq->xfer, UEAGLE_TXBUFLEN); - if (txreq->buf == NULL) { - printf("%s: could not allocate tx buffer\n", - sc->sc_dev.dv_xname); - error = ENOMEM; - goto fail; - } - } - - error = usbd_device2interface_handle(sc->sc_udev, UEAGLE_DS_IFACE_NO, - &iface); - if (error != 0) { - printf("%s: could not get rx interface handle\n", - sc->sc_dev.dv_xname); - goto fail; - } - - /* XXX: alternative interface number sould depend on downrate */ - error = usbd_set_interface(iface, 8); - if (error != 0) { - printf("%s: could not set rx alternative interface\n", - sc->sc_dev.dv_xname); - goto fail; - } - - edesc = usbd_get_endpoint_descriptor(iface, UEAGLE_RX_PIPE); - if (edesc == NULL) { - printf("%s: could not get rx endpoint descriptor\n", - sc->sc_dev.dv_xname); - error = EIO; - goto fail; - } - - sc->isize = UGETW(edesc->wMaxPacketSize); - - error = usbd_open_pipe(iface, UEAGLE_RX_PIPE, USBD_EXCLUSIVE_USE, - &sc->pipeh_rx); - if (error != 0) { - printf("%s: could not open rx pipe\n", sc->sc_dev.dv_xname); - goto fail; - } - - for (i = 0; i < UEAGLE_NISOREQS; i++) { - isoreq = &sc->isoreqs[i]; - - isoreq->sc = sc; - - isoreq->xfer = usbd_alloc_xfer(sc->sc_udev); - if (isoreq->xfer == NULL) { - printf("%s: could not allocate rx xfer\n", - sc->sc_dev.dv_xname); - error = ENOMEM; - goto fail; - } - - buf = usbd_alloc_buffer(isoreq->xfer, - sc->isize * UEAGLE_NISOFRMS); - if (buf == NULL) { - printf("%s: could not allocate rx buffer\n", - sc->sc_dev.dv_xname); - error = ENOMEM; - goto fail; - } - - for (j = 0; j < UEAGLE_NISOFRMS; j++) { - isoreq->frlengths[j] = sc->isize; - isoreq->offsets[j] = buf + j * sc->isize; - } - - usbd_setup_isoc_xfer(isoreq->xfer, sc->pipeh_rx, isoreq, - isoreq->frlengths, UEAGLE_NISOFRMS, USBD_NO_COPY, - ueagle_rxeof); - usbd_transfer(isoreq->xfer); - } - - ueagle_request(sc, UEAGLE_SETMODE, UEAGLE_LOOPBACKOFF, NULL, 0); - - return 0; - -fail: ueagle_close_pipes(sc); - return error; -} - -void -ueagle_close_pipes(struct ueagle_softc *sc) -{ - int i; - - ueagle_request(sc, UEAGLE_SETMODE, UEAGLE_LOOPBACKON, NULL, 0); - - /* free Tx resources */ - if (sc->pipeh_tx != NULL) { - usbd_abort_pipe(sc->pipeh_tx); - usbd_close_pipe(sc->pipeh_tx); - sc->pipeh_tx = NULL; - } - - for (i = 0; i < UEAGLE_TX_LIST_CNT; i++) { - if (sc->txreqs[i].xfer != NULL) { - usbd_free_xfer(sc->txreqs[i].xfer); - sc->txreqs[i].xfer = NULL; - } - } - - /* free Rx resources */ - if (sc->pipeh_rx != NULL) { - usbd_abort_pipe(sc->pipeh_rx); - usbd_close_pipe(sc->pipeh_rx); - sc->pipeh_rx = NULL; - } - - for (i = 0; i < UEAGLE_NISOREQS; i++) { - if (sc->isoreqs[i].xfer != NULL) { - usbd_free_xfer(sc->isoreqs[i].xfer); - sc->isoreqs[i].xfer = NULL; - } - } -} - -int -ueagle_init(struct ifnet *ifp) -{ - struct ueagle_softc *sc = ifp->if_softc; - struct usbd_interface *iface; - usbd_status error; - size_t len; - - ueagle_stop(ifp, 0); - - error = usbd_device2interface_handle(sc->sc_udev, UEAGLE_US_IFACE_NO, - &iface); - if (error != 0) { - printf("%s: could not get idma interface handle\n", - sc->sc_dev.dv_xname); - goto fail; - } - - error = usbd_open_pipe(iface, UEAGLE_IDMA_PIPE, USBD_EXCLUSIVE_USE, - &sc->pipeh_idma); - if (error != 0) { - printf("%s: could not open idma pipe\n", - sc->sc_dev.dv_xname); - goto fail; - } - - error = usbd_device2interface_handle(sc->sc_udev, UEAGLE_INTR_IFACE_NO, - &iface); - if (error != 0) { - printf("%s: could not get interrupt interface handle\n", - sc->sc_dev.dv_xname); - goto fail; - } - - error = loadfirmware("ueagle-dsp", &sc->dsp, &len); - if (error != 0) { - printf("%s: could not load firmware\n", sc->sc_dev.dv_xname); - goto fail; - } - - error = usbd_open_pipe_intr(iface, UEAGLE_INTR_PIPE, USBD_SHORT_XFER_OK, - &sc->pipeh_intr, sc, sc->ibuf, UEAGLE_INTR_MAXSIZE, ueagle_intr, - UEAGLE_INTR_INTERVAL); - if (error != 0) { - printf("%s: could not open interrupt pipe\n", - sc->sc_dev.dv_xname); - goto fail; - } - - error = ueagle_boot(sc); - if (error != 0) { - printf("%s: could not boot modem\n", sc->sc_dev.dv_xname); - goto fail; - } - - /* - * Opening of tx and rx pipes if deferred after synchronization is - * established. - */ - - ifp->if_flags |= IFF_RUNNING; - ifp->if_flags &= ~IFF_OACTIVE; - - return 0; - -fail: ueagle_stop(ifp, 1); - return error; -} - -void -ueagle_stop(struct ifnet *ifp, int disable) -{ - struct ueagle_softc *sc = ifp->if_softc; - - /* stop any pending task */ - usb_rem_task(sc->sc_udev, &sc->sc_swap_task); - - /* free Tx and Rx resources */ - ueagle_close_pipes(sc); - - /* free firmware */ - if (sc->dsp != NULL) { - free(sc->dsp, M_DEVBUF); - sc->dsp = NULL; - } - - /* free interrupt resources */ - if (sc->pipeh_intr != NULL) { - usbd_abort_pipe(sc->pipeh_intr); - usbd_close_pipe(sc->pipeh_intr); - sc->pipeh_intr = NULL; - } - - /* free IDMA resources */ - if (sc->pipeh_idma != NULL) { - usbd_abort_pipe(sc->pipeh_idma); - usbd_close_pipe(sc->pipeh_idma); - sc->pipeh_idma = NULL; - } - - /* reset statistics */ - memset(&sc->stats, 0, sizeof (struct ueagle_stats)); - - ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); -} - -int -ueagle_activate(struct device *self, int act) -{ - struct ueagle_softc *sc = (struct ueagle_softc *)self; - - switch (act) { - case DVACT_DEACTIVATE: - usbd_deactivate(sc->sc_udev); - break; - } - - return 0; -} diff --git a/sys/dev/usb/ueaglereg.h b/sys/dev/usb/ueaglereg.h deleted file mode 100644 index 8b3efbc153a..00000000000 --- a/sys/dev/usb/ueaglereg.h +++ /dev/null @@ -1,124 +0,0 @@ -/* $OpenBSD: ueaglereg.h,v 1.3 2007/06/09 11:06:53 mbalmer Exp $ */ - -/*- - * Copyright (c) 2003-2005 - * Damien Bergamini - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* OPTN: default values from analog devices */ -#ifndef UEAGLE_OPTN0 -#define UEAGLE_OPTN0 0x80020066 -#endif -#ifndef UEAGLE_OPTN2 -#define UEAGLE_OPTN2 0x23700000 -#endif -#ifndef UEAGLE_OPTN7 -#define UEAGLE_OPTN7 0x02cd8044 -#endif - -#define UEAGLE_CONFIG_NO 1 - -#define UEAGLE_INTR_IFACE_NO 0 -#define UEAGLE_US_IFACE_NO 1 -#define UEAGLE_DS_IFACE_NO 2 - -#define UEAGLE_ESISTR 4 - -#define UEAGLE_TX_PIPE 0x02 -#define UEAGLE_IDMA_PIPE 0x04 -#define UEAGLE_INTR_PIPE 0x84 -#define UEAGLE_RX_PIPE 0x88 - -#define UEAGLE_REQUEST 0 - -#define UEAGLE_SETBLOCK 0x0001 -#define UEAGLE_SETMODE 0x0003 -#define UEAGLE_SET2183DATA 0x0004 - -#define UEAGLE_LOOPBACKOFF 0x0002 -#define UEAGLE_LOOPBACKON 0x0003 -#define UEAGLE_BOOTIDMA 0x0006 -#define UEAGLE_STARTRESET 0x0007 -#define UEAGLE_ENDRESET 0x0008 -#define UEAGLE_SWAPMAILBOX 0x7fcd -#define UEAGLE_MPTXSTART 0x7fce -#define UEAGLE_MPTXMAILBOX 0x7fd6 -#define UEAGLE_MPRXMAILBOX 0x7fdf - -/* block within a firmware page */ -struct ueagle_block_info { - uWord wHdr; -#define UEAGLE_BLOCK_INFO_HDR 0xabcd - - uWord wAddress; - uWord wSize; - uWord wOvlOffset; - uWord wOvl; /* overlay */ - uWord wLast; -} __packed; - -/* CMV (Configuration and Management Variable) */ -struct ueagle_cmv { - uWord wPreamble; -#define UEAGLE_CMV_PREAMBLE 0x535c - - uByte bDst; -#define UEAGLE_HOST 0x01 -#define UEAGLE_MODEM 0x10 - - uByte bFunction; -#define UEAGLE_CR 0x10 -#define UEAGLE_CW 0x11 -#define UEAGLE_CR_ACK 0x12 -#define UEAGLE_CW_ACK 0x13 -#define UEAGLE_MODEMREADY 0x71 - - uWord wIndex; - uDWord dwSymbolicAddress; -#define UEAGLE_MAKESA(a, b, c, d) ((c) << 24 | (d) << 16 | (a) << 8 | (b)) -#define UEAGLE_CMV_CNTL UEAGLE_MAKESA('C', 'N', 'T', 'L') -#define UEAGLE_CMV_DIAG UEAGLE_MAKESA('D', 'I', 'A', 'G') -#define UEAGLE_CMV_INFO UEAGLE_MAKESA('I', 'N', 'F', 'O') -#define UEAGLE_CMV_OPTN UEAGLE_MAKESA('O', 'P', 'T', 'N') -#define UEAGLE_CMV_RATE UEAGLE_MAKESA('R', 'A', 'T', 'E') -#define UEAGLE_CMV_STAT UEAGLE_MAKESA('S', 'T', 'A', 'T') - - uWord wOffsetAddress; - uDWord dwData; -#define UGETDATA(w) ((w)[2] | (w)[3] << 8 | (w)[0] << 16 | (w)[1] << 24) -#define USETDATA(w, v) \ - ((w)[2] = (uint8_t)(v), \ - (w)[3] = (uint8_t)((v) >> 8), \ - (w)[0] = (uint8_t)((v) >> 16), \ - (w)[1] = (uint8_t)((v) >> 24)) -} __packed; - -struct ueagle_swap { - uByte bPageNo; - uByte bOvl; /* overlay */ -} __packed; - -struct ueagle_intr { - uByte bType; - uByte bNotification; - uWord wValue; - uWord wIndex; - uWord wLength; - uWord wInterrupt; -#define UEAGLE_INTR_SWAP 1 -#define UEAGLE_INTR_CMV 2 -} __packed; - -#define UEAGLE_INTR_MAXSIZE 28 diff --git a/sys/dev/usb/ueaglevar.h b/sys/dev/usb/ueaglevar.h deleted file mode 100644 index 73ec0d7270b..00000000000 --- a/sys/dev/usb/ueaglevar.h +++ /dev/null @@ -1,189 +0,0 @@ -/* $OpenBSD: ueaglevar.h,v 1.4 2013/04/15 09:23:02 mglocker Exp $ */ - -/*- - * Copyright (c) 2003-2005 - * Damien Bergamini - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#define UEAGLE_NISOREQS 6 -#define UEAGLE_NISOFRMS 4 - -#ifndef UEAGLE_INTR_INTERVAL -#define UEAGLE_INTR_INTERVAL 10 /* ms */ -#endif - -#define UEAGLE_TX_LIST_CNT 1 - -#define UEAGLE_IDMA_TIMEOUT 1000 -#define UEAGLE_TX_TIMEOUT 10000 - -#define CRC_INITIAL 0xffffffff -#define CRC_MAGIC 0xc704dd7b - -#define ATM_CELL_SIZE 53 -#define ATM_CELL_HEADER_SIZE 5 -#define ATM_CELL_PAYLOAD_SIZE (ATM_CELL_SIZE - ATM_CELL_HEADER_SIZE) - -#define AAL5_TRAILER_SIZE 8 - -/*- - * ATM cell header: - * - * 0 4 8 - * +-----------------+-----------------+ - * | GFC | VPI | - * +-----------------+-----------------+ - * | VPI | VCI | - * +-----------------+-----------------+ - * | VCI | - * +-----------------+-----------+-----+ - * | VCI | PT (3) | CLP | - * +-----------------+-----------+-----+ - * | HEC | - * +-----------------------------------+ - */ -#define ATM_CH_FILL(x, gfc, vpi, vci, pt, clp, hec) do { \ - (x)[0] = ((gfc) & 0xf) << 4 | ((vpi) & 0xf0) >> 4; \ - (x)[1] = ((vpi) & 0xf) << 4 | ((vci) & 0xf000) >> 12; \ - (x)[2] = ((vci) & 0xff0) >> 4; \ - (x)[3] = ((vci) & 0xf) << 4 | ((pt) & 0x7) << 1 | ((clp) & 0x1);\ - (x)[4] = (uint8_t)(hec); \ -} while (/* CONSTCOND */0) - -#define ATM_CH_SETPTFLAGS(x, v) ((x)[3] |= ((v) & 0x7) << 1) -#define ATM_CH_GETPTFLAGS(x) (((x)[3] >> 1) & 0x7) -#define ATM_CH_GETVPI(x) ((x)[0] << 4 | (x)[1] >> 4) -#define ATM_CH_GETVCI(x) \ - (((x)[1] & 0xf) << 12 | (x)[2] << 4 | ((x)[3] & 0xf0) >> 4) - -/* optimized shortcut for (ATM_CH_GETPTFLAGS(x) & 1) */ -#define ATM_CH_ISLASTCELL(x) ((x)[3] & 0x2) - -#define AAL5_TR_SETCPSUU(x, v) ((x)[45] = (uint8_t)(v)) -#define AAL5_TR_SETCPI(x, v) ((x)[46] = (uint8_t)(v)) -#define AAL5_TR_SETPDULEN(x, v) do { \ - (x)[47] = (uint8_t)((v) >> 8); \ - (x)[48] = (uint8_t)(v); \ -} while (/* CONSTCOND */0) - -#define AAL5_TR_GETPDULEN(x) (uint16_t)((x)[47] << 8 | (x)[48]) -#define AAL5_TR_SETCRC(x, v) do { \ - (x)[49] = (uint8_t)((v) >> 24); \ - (x)[50] = (uint8_t)((v) >> 16); \ - (x)[51] = (uint8_t)((v) >> 8); \ - (x)[52] = (uint8_t)(v); \ -} while (/* CONSTCOND */0) - -#define UEAGLE_IFMTU 1500 -#define UEAGLE_TXBUFLEN \ - (((UEAGLE_IFMTU / ATM_CELL_PAYLOAD_SIZE) + 2) * ATM_CELL_SIZE) - -struct ueagle_vcc { - uint16_t vci; - uint8_t vpi; - uint8_t ch[ATM_CELL_HEADER_SIZE]; - void *rxhand; - struct mbuf *m; - uint8_t *dst; - uint8_t *limit; - struct atm_pseudohdr aph; - int flags; -#define UEAGLE_VCC_ACTIVE (1 << 0) -#define UEAGLE_VCC_DROP (1 << 1) -}; - -struct ueagle_softc; - -struct ueagle_isoreq { - struct ueagle_softc *sc; - struct usbd_xfer *xfer; - uint16_t frlengths[UEAGLE_NISOFRMS]; - uint8_t *offsets[UEAGLE_NISOFRMS]; -}; - -struct ueagle_txreq { - struct ueagle_softc *sc; - struct usbd_xfer *xfer; - uint8_t *buf; -}; - -struct ueagle_stats { - struct { - uint32_t status; - uint32_t flags; - uint32_t vidcpe; - uint32_t vidco; - uint32_t dsrate; - uint32_t usrate; - uint32_t dserror; - uint32_t userror; - uint32_t dsunc; - uint32_t usunc; - uint32_t txflow; - uint32_t rxflow; - uint32_t attenuation; - uint32_t dsmargin; - uint32_t usmargin; - } phy; - - struct { - uint32_t cells_transmitted; - uint32_t cells_received; - uint32_t cells_crc_errors; - uint32_t cells_dropped; - uint32_t vcc_no_conn; - uint32_t cspdus_transmitted; - uint32_t cspdus_received; - uint32_t cspdus_crc_errors; - uint32_t cspdus_dropped; - } atm; -}; - -#define UEAGLE_COND_CMV(sc) ((char *)(sc) + 1) -#define UEAGLE_COND_READY(sc) ((char *)(sc) + 2) -#define UEAGLE_COND_SYNC(sc) ((char *)(sc) + 3) - -struct ueagle_softc { - struct device sc_dev; - struct ifnet sc_if; - - struct usbd_device *sc_udev; - - struct proc *stat_thread; - struct usb_task sc_swap_task; - uint16_t pageno; - uint16_t ovl; - - const char *fw; - uint8_t *dsp; - - struct usb_task sc_init_task; - - struct usbd_pipe *pipeh_tx; - struct usbd_pipe *pipeh_rx; - struct usbd_pipe *pipeh_idma; - struct usbd_pipe *pipeh_intr; - - struct ueagle_isoreq isoreqs[UEAGLE_NISOREQS]; - struct ueagle_txreq txreqs[UEAGLE_TX_LIST_CNT]; - struct ueagle_vcc vcc; - struct ueagle_stats stats; - - uint16_t isize; - char ibuf[32]; - - uint16_t index; - uint32_t data; -}; -- cgit v1.2.3