Lines Matching refs:sc

255 cdce_ncm_init(struct cdce_softc *sc)
265 ufd = usbd_find_descriptor(sc->sc_ue.ue_udev, NULL,
266 sc->sc_ifaces_index[1], UDESC_CS_INTERFACE, 0xFF,
280 req.wIndex[0] = sc->sc_ifaces_index[1];
284 err = usbd_do_request_flags(sc->sc_ue.ue_udev, NULL, &req,
293 if (usbd_get_mode(sc->sc_ue.ue_udev) == USB_MODE_HOST) {
294 sc->sc_ncm.rx_max = UGETDW(temp.dwNtbInMaxSize);
295 sc->sc_ncm.tx_max = UGETDW(temp.dwNtbOutMaxSize);
296 sc->sc_ncm.tx_remainder = UGETW(temp.wNdpOutPayloadRemainder);
297 sc->sc_ncm.tx_modulus = UGETW(temp.wNdpOutDivisor);
298 sc->sc_ncm.tx_struct_align = UGETW(temp.wNdpOutAlignment);
299 sc->sc_ncm.tx_nframe = UGETW(temp.wNtbOutMaxDatagrams);
301 sc->sc_ncm.rx_max = UGETDW(temp.dwNtbOutMaxSize);
302 sc->sc_ncm.tx_max = UGETDW(temp.dwNtbInMaxSize);
303 sc->sc_ncm.tx_remainder = UGETW(temp.wNdpInPayloadRemainder);
304 sc->sc_ncm.tx_modulus = UGETW(temp.wNdpInDivisor);
305 sc->sc_ncm.tx_struct_align = UGETW(temp.wNdpInAlignment);
306 sc->sc_ncm.tx_nframe = UGETW(temp.wNtbOutMaxDatagrams);
311 if ((sc->sc_ncm.rx_max < 32) ||
312 (sc->sc_ncm.rx_max > CDCE_NCM_RX_MAXLEN)) {
314 sc->sc_ncm.rx_max = CDCE_NCM_RX_MAXLEN;
319 if ((sc->sc_ncm.tx_max < 32) ||
320 (sc->sc_ncm.tx_max > CDCE_NCM_TX_MAXLEN)) {
322 sc->sc_ncm.tx_max = CDCE_NCM_TX_MAXLEN;
331 if ((sc->sc_ncm.tx_struct_align < 4) ||
332 (sc->sc_ncm.tx_struct_align !=
333 ((-sc->sc_ncm.tx_struct_align) & sc->sc_ncm.tx_struct_align)) ||
334 (sc->sc_ncm.tx_struct_align >= sc->sc_ncm.tx_max)) {
336 sc->sc_ncm.tx_struct_align = 4;
345 if ((sc->sc_ncm.tx_modulus < 4) ||
346 (sc->sc_ncm.tx_modulus !=
347 ((-sc->sc_ncm.tx_modulus) & sc->sc_ncm.tx_modulus)) ||
348 (sc->sc_ncm.tx_modulus >= sc->sc_ncm.tx_max)) {
350 sc->sc_ncm.tx_modulus = 4;
355 if ((sc->sc_ncm.tx_remainder >= sc->sc_ncm.tx_modulus)) {
357 sc->sc_ncm.tx_remainder = 0;
365 sc->sc_ncm.tx_remainder =
366 (sc->sc_ncm.tx_remainder - ETHER_HDR_LEN) &
367 (sc->sc_ncm.tx_modulus - 1);
371 if (sc->sc_ncm.tx_nframe == 0 ||
372 sc->sc_ncm.tx_nframe > (CDCE_NCM_SUBFRAMES_MAX - 1)) {
376 sc->sc_ncm.tx_nframe = (CDCE_NCM_SUBFRAMES_MAX - 1);
384 req.wIndex[0] = sc->sc_ifaces_index[1];
390 USETDW(value, sc->sc_ncm.rx_max);
395 USETDW(value, sc->sc_ncm.rx_max);
398 err = usbd_do_request_flags(sc->sc_ue.ue_udev, NULL, &req,
402 "to %u failed.\n", sc->sc_ncm.rx_max);
408 req.wIndex[0] = sc->sc_ifaces_index[1];
412 err = usbd_do_request_flags(sc->sc_ue.ue_udev, NULL, &req,
421 req.wIndex[0] = sc->sc_ifaces_index[1];
425 err = usbd_do_request_flags(sc->sc_ue.ue_udev, NULL, &req,
460 struct cdce_softc *sc = (struct cdce_softc *)device_get_softc(dev);
461 struct usb_ether *ue = &sc->sc_ue;
476 sc->sc_flags = USB_GET_DRIVER_INFO(uaa);
477 sc->sc_ue.ue_udev = uaa->device;
481 mtx_init(&sc->sc_mtx, device_get_nameunit(dev), NULL, MTX_DEF);
488 (sc->sc_flags & CDCE_FLAG_NO_UNION)) {
490 sc->sc_ifaces_index[0] = uaa->info.bIfaceIndex;
491 sc->sc_ifaces_index[1] = uaa->info.bIfaceIndex;
504 sc->sc_ifaces_index[0] = i;
505 sc->sc_ifaces_index[1] = uaa->info.bIfaceIndex;
545 sc->sc_ifaces_index[0], i);
551 if ((i == 0) && (cdce_ncm_init(sc) == 0))
555 sc->sc_ifaces_index, sc->sc_xfer,
556 pcfg, CDCE_N_TRANSFER, sc, &sc->sc_mtx);
585 (void)memcpy_s(&sc->sc_ue.ue_eaddr[1], (NETIF_MAX_HWADDR_LEN - 2), &seed, sizeof(uint32_t));
586 sc->sc_ue.ue_eaddr[0] = 0x2a;
587 sc->sc_ue.ue_eaddr[5] = device_get_unit(dev);
590 (void)memset_s(sc->sc_ue.ue_eaddr, sizeof(sc->sc_ue.ue_eaddr), 0, sizeof(sc->sc_ue.ue_eaddr));
606 sc->sc_ue.ue_eaddr[i / 2] |= c;
613 sc->sc_ue.ue_eaddr[5] ^= 0xFF;
617 ue->ue_sc = sc;
620 ue->ue_mtx = &sc->sc_mtx;
638 struct cdce_softc *sc = (struct cdce_softc *)device_get_softc(dev);
639 struct usb_ether *ue = &sc->sc_ue;
642 usbd_transfer_unsetup(sc->sc_xfer, CDCE_N_TRANSFER);
644 mtx_destroy(&sc->sc_mtx);
652 struct cdce_softc *sc = (struct cdce_softc *)uether_getsc(ue);
658 usbd_transfer_start(sc->sc_xfer[CDCE_BULK_TX]);
659 usbd_transfer_start(sc->sc_xfer[CDCE_BULK_RX]);
689 struct cdce_softc *sc = (struct cdce_softc *)usbd_xfer_softc(xfer);
690 struct usb_ether *ue = &sc->sc_ue;
705 cdce_free_queue(sc->sc_tx_buf, CDCE_FRAMES_MAX);
717 if (sc->sc_flags & CDCE_FLAG_ZAURUS) {
732 sc->sc_tx_buf[x] = m;
751 cdce_free_queue(sc->sc_tx_buf, CDCE_FRAMES_MAX);
774 struct cdce_softc *sc = (struct cdce_softc *)uether_getsc(ue);
780 CDCE_LOCK_ASSERT(sc, MA_OWNED);
785 usbd_transfer_start(sc->sc_xfer[CDCE_INTR_RX]);
786 usbd_transfer_start(sc->sc_xfer[CDCE_INTR_TX]);
794 if (usbd_get_mode(sc->sc_ue.ue_udev) == USB_MODE_HOST)
795 usbd_xfer_set_stall(sc->sc_xfer[CDCE_BULK_TX]);
804 struct cdce_softc *sc = (struct cdce_softc *)uether_getsc(ue);
810 CDCE_LOCK_ASSERT(sc, MA_OWNED);
817 usbd_transfer_stop(sc->sc_xfer[CDCE_BULK_RX]);
818 usbd_transfer_stop(sc->sc_xfer[CDCE_BULK_TX]);
819 usbd_transfer_stop(sc->sc_xfer[CDCE_INTR_RX]);
820 usbd_transfer_stop(sc->sc_xfer[CDCE_INTR_TX]);
854 struct cdce_softc *sc = (struct cdce_softc *)usbd_xfer_softc(xfer);
870 m = sc->sc_rx_buf[x];
871 sc->sc_rx_buf[x] = NULL;
875 if ((sc->sc_flags & CDCE_FLAG_ZAURUS) && len >= 14)
883 (void)uether_rxmbuf(&sc->sc_ue, m, len);
893 if (sc->sc_rx_buf[x] == NULL) {
897 sc->sc_rx_buf[x] = m;
899 m = sc->sc_rx_buf[x];
909 uether_rxflush(&sc->sc_ue);
925 cdce_free_queue(sc->sc_rx_buf, CDCE_FRAMES_MAX);
966 struct cdce_softc *sc = usbd_xfer_softc(xfer);
981 switch (sc->sc_notify_state) {
983 sc->sc_notify_state = CDCE_NOTIFY_SPEED_CHANGE;
986 sc->sc_notify_state = CDCE_NOTIFY_DONE;
999 if (sc->sc_notify_state == CDCE_NOTIFY_NETWORK_CONNECTION) {
1002 req.wIndex[0] = sc->sc_ifaces_index[1];
1012 } else if (sc->sc_notify_state == CDCE_NOTIFY_SPEED_CHANGE) {
1015 req.wIndex[0] = sc->sc_ifaces_index[1];
1021 if (usbd_get_speed(sc->sc_ue.ue_udev) != USB_SPEED_FULL)
1052 struct cdce_softc *sc = device_get_softc(dev);
1063 mtx_lock(&sc->sc_mtx);
1064 sc->sc_notify_state = CDCE_NOTIFY_SPEED_CHANGE;
1065 usbd_transfer_start(sc->sc_xfer[CDCE_INTR_TX]);
1066 mtx_unlock(&sc->sc_mtx);
1093 struct cdce_softc *sc = usbd_xfer_softc(xfer);
1094 struct usb_ether *ue = &sc->sc_ue;
1107 offset = sizeof(sc->sc_ncm.hdr) +
1108 sizeof(sc->sc_ncm.dpt) + sizeof(sc->sc_ncm.dp);
1114 offset = CDCE_NCM_ALIGN(sc->sc_ncm.tx_remainder,
1115 offset, sc->sc_ncm.tx_modulus);
1123 for (n = 0; n != sc->sc_ncm.tx_nframe; n++) {
1126 if (offset >= sc->sc_ncm.tx_max)
1131 rem = sc->sc_ncm.tx_max - offset;
1155 USETW(sc->sc_ncm.dp[n].wFrameLength, m->len);
1156 USETW(sc->sc_ncm.dp[n].wFrameIndex, offset);
1165 offset = CDCE_NCM_ALIGN(sc->sc_ncm.tx_remainder,
1166 offset, sc->sc_ncm.tx_modulus);
1178 rem = (sizeof(sc->sc_ncm.dpt) + (4 * n) + 4);
1180 USETW(sc->sc_ncm.dpt.wLength, rem);
1184 USETW(sc->sc_ncm.dp[n].wFrameLength, 0);
1185 USETW(sc->sc_ncm.dp[n].wFrameIndex, 0);
1194 if (offset >= sc->sc_ncm.tx_max)
1195 offset = sc->sc_ncm.tx_max;
1206 sc->sc_ncm.hdr.dwSignature[0] = 'N';
1207 sc->sc_ncm.hdr.dwSignature[1] = 'C';
1208 sc->sc_ncm.hdr.dwSignature[2] = 'M';
1209 sc->sc_ncm.hdr.dwSignature[3] = 'H';
1210 USETW(sc->sc_ncm.hdr.wHeaderLength, sizeof(sc->sc_ncm.hdr));
1211 USETW(sc->sc_ncm.hdr.wBlockLength, offset);
1212 USETW(sc->sc_ncm.hdr.wSequence, sc->sc_ncm.tx_seq);
1213 USETW(sc->sc_ncm.hdr.wDptIndex, sizeof(sc->sc_ncm.hdr));
1215 sc->sc_ncm.tx_seq++;
1218 sc->sc_ncm.dpt.dwSignature[0] = 'N';
1219 sc->sc_ncm.dpt.dwSignature[1] = 'C';
1220 sc->sc_ncm.dpt.dwSignature[2] = 'M';
1221 sc->sc_ncm.dpt.dwSignature[3] = '0';
1222 USETW(sc->sc_ncm.dpt.wNextNdpIndex, 0); /* reserved */
1224 usbd_copy_in(pc, 0, &(sc->sc_ncm.hdr), sizeof(sc->sc_ncm.hdr));
1225 usbd_copy_in(pc, sizeof(sc->sc_ncm.hdr), &(sc->sc_ncm.dpt),
1226 sizeof(sc->sc_ncm.dpt));
1227 usbd_copy_in(pc, sizeof(sc->sc_ncm.hdr) + sizeof(sc->sc_ncm.dpt),
1228 &(sc->sc_ncm.dp), sizeof(sc->sc_ncm.dp));
1287 struct cdce_softc *sc = usbd_xfer_softc(xfer);
1309 if (actlen < (int)(sizeof(sc->sc_ncm.hdr) +
1310 sizeof(sc->sc_ncm.dpt))) {
1314 usbd_copy_out(pc, 0, &(sc->sc_ncm.hdr),
1315 sizeof(sc->sc_ncm.hdr));
1317 if ((sc->sc_ncm.hdr.dwSignature[0] != 'N') ||
1318 (sc->sc_ncm.hdr.dwSignature[1] != 'C') ||
1319 (sc->sc_ncm.hdr.dwSignature[2] != 'M') ||
1320 (sc->sc_ncm.hdr.dwSignature[3] != 'H')) {
1323 sc->sc_ncm.hdr.dwSignature[0],
1324 sc->sc_ncm.hdr.dwSignature[1],
1325 sc->sc_ncm.hdr.dwSignature[2],
1326 sc->sc_ncm.hdr.dwSignature[3]);
1329 temp = UGETW(sc->sc_ncm.hdr.wBlockLength);
1335 temp = UGETW(sc->sc_ncm.hdr.wDptIndex);
1336 if ((int)(temp + sizeof(sc->sc_ncm.dpt)) > actlen) {
1340 usbd_copy_out(pc, temp, &(sc->sc_ncm.dpt),
1341 sizeof(sc->sc_ncm.dpt));
1343 if ((sc->sc_ncm.dpt.dwSignature[0] != 'N') ||
1344 (sc->sc_ncm.dpt.dwSignature[1] != 'C') ||
1345 (sc->sc_ncm.dpt.dwSignature[2] != 'M') ||
1346 (sc->sc_ncm.dpt.dwSignature[3] != '0')) {
1349 sc->sc_ncm.dpt.dwSignature[0],
1350 sc->sc_ncm.dpt.dwSignature[1],
1351 sc->sc_ncm.dpt.dwSignature[2],
1352 sc->sc_ncm.dpt.dwSignature[3]);
1355 nframes = UGETW(sc->sc_ncm.dpt.wLength) / 4;
1365 temp += sizeof(sc->sc_ncm.dpt);
1375 usbd_copy_out(pc, temp, &(sc->sc_ncm.dp), (4 * nframes));
1381 offset = UGETW(sc->sc_ncm.dp[x].wFrameIndex);
1382 temp = UGETW(sc->sc_ncm.dp[x].wFrameLength);
1418 uether_rxmbuf(&sc->sc_ue, m, temp);
1428 usbd_xfer_set_frame_len(xfer, 0, sc->sc_ncm.rx_max);
1431 uether_rxflush(&sc->sc_ue); /* must be last */