static int iavc_receive_init(iavc_softc_t *sc, u_int8_t *dmabuf) { u_int32_t Length; u_int8_t *p; u_int8_t *cardtype, *serial, *profile, *version, *caps, *prot; if (sc->sc_dma) { p = amcc_get_word(dmabuf, &Length); } else { Length = iavc_get_slice(sc, sc->sc_recvbuf); p = sc->sc_recvbuf; } #if 0 { int len = 0; printf("iavc%d: rx_init: ", sc->sc_unit); while (len < Length) { printf(" %02x", p[len]); if (len && (len % 16) == 0) printf("\n"); len++; } if (len % 16) printf("\n"); } #endif version = (p + 1); p += (*p + 1); /* driver version */ cardtype = (p + 1); p += (*p + 1); /* card type */ p += (*p + 1); /* hardware ID */ serial = (p + 1); p += (*p + 1); /* serial number */ caps = (p + 1); p += (*p + 1); /* supported options */ prot = (p + 1); p += (*p + 1); /* supported protocols */ profile = (p + 1); if (cardtype && serial && profile) { int nbch = ((profile[3]<<8) | profile[2]); printf("iavc%d: AVM %s, s/n %s, %d chans, f/w rev %s, prot %s\n", sc->sc_unit, cardtype, serial, nbch, version, prot); if(bootverbose) printf("iavc%d: %s\n", sc->sc_unit, caps); capi_ll_control(&sc->sc_capi, CAPI_CTRL_PROFILE, (int) profile); } else { printf("iavc%d: no profile data in info response?\n", sc->sc_unit); } sc->sc_blocked = TRUE; /* controller will send START when ready */ return 0; }
static int iavc_receive_debugmsg(iavc_softc_t *sc, u_int8_t *dmabuf) { u_int32_t Length; u_int8_t *p; printf("%s: receive_debugmsg\n", device_xname(&sc->sc_dev)); if (sc->sc_dma) { p = amcc_get_word(dmabuf, &Length); } else { Length = iavc_get_slice(sc, sc->sc_recvbuf); p = sc->sc_recvbuf; } /* XXX could show the message if trace enabled? XXX */ return 0; }
static int iavc_receive_task_ready(iavc_softc_t *sc, u_int8_t *dmabuf) { u_int32_t TaskId, Length; u_int8_t *p; printf("iavc%d: receive_task_ready\n", sc->sc_unit); if (sc->sc_dma) { p = amcc_get_word(dmabuf, &TaskId); p = amcc_get_word(p, &Length); } else { TaskId = iavc_get_word(sc); Length = iavc_get_slice(sc, sc->sc_recvbuf); p = sc->sc_recvbuf; } /* XXX could show the message if trace enabled? XXX */ return 0; }
static int iavc_receive(iavc_softc_t *sc, u_int8_t *dmabuf, int b3data) { struct mbuf *m; u_int32_t ApplId, Length; /* * byte 0x21 = RECEIVE_MESSAGE * dword ApplId * dword length * ... CAPI msg * * --or-- * * byte 0x22 = RECEIVE_DATA_B3_IND * dword ApplId * dword length * ... CAPI msg * dword datalen * ... B3 data */ if (sc->sc_dma) { dmabuf = amcc_get_word(dmabuf, &ApplId); dmabuf = amcc_get_word(dmabuf, &Length); } else { ApplId = iavc_get_word(sc); Length = iavc_get_slice(sc, sc->sc_recvbuf); dmabuf = sc->sc_recvbuf; } m = i4b_Dgetmbuf(Length); if (!m) { aprint_error_dev(&sc->sc_dev, "can't get memory for receive\n"); return (ENOMEM); } memcpy(mtod(m, u_int8_t*), dmabuf, Length); #if 0 { u_int8_t *p = mtod(m, u_int8_t*); int len = 0; printf("%s: applid=%d, len=%d\n", device_xname(&sc->sc_dev), ApplId, Length); while (len < m->m_len) { printf(" %02x", p[len]); if (len && (len % 16) == 0) printf("\n"); len++; } if (len % 16) printf("\n"); } #endif if (b3data) { if (sc->sc_dma) { dmabuf = amcc_get_word(dmabuf + Length, &Length); } else { Length = iavc_get_slice(sc, sc->sc_recvbuf); dmabuf = sc->sc_recvbuf; } m->m_next = i4b_Bgetmbuf(Length); if (!m->m_next) { aprint_error_dev(&sc->sc_dev, "can't get memory for receive\n"); i4b_Dfreembuf(m); return (ENOMEM); } memcpy(mtod(m->m_next, u_int8_t*), dmabuf, Length); } capi_ll_receive(&sc->sc_capi, m); return 0; }