Lines Matching +full:comp +full:- +full:config
1 /*-
2 * Copyright (c) 2009-2012,2016-2017 Microsoft Corp.
3 * Copyright (c) 2010-2012 Citrix Inc.
101 rid = atomic_fetchadd_int(&sc->hn_rndis_rid, 1); in hn_rndis_rid()
105 /* Use upper 16 bits for non-compat RNDIS messages. */ in hn_rndis_rid()
112 const struct rndis_comp_hdr *comp; in hn_rndis_rx_ctrl() local
118 switch (hdr->rm_type) { in hn_rndis_rx_ctrl()
123 if (dlen < sizeof(*comp)) { in hn_rndis_rx_ctrl()
124 if_printf(sc->hn_ifp, "invalid RNDIS cmplt\n"); in hn_rndis_rx_ctrl()
127 comp = data; in hn_rndis_rx_ctrl()
129 KASSERT(comp->rm_rid > HN_RNDIS_RID_COMPAT_MAX, in hn_rndis_rx_ctrl()
130 ("invalid RNDIS rid 0x%08x\n", comp->rm_rid)); in hn_rndis_rx_ctrl()
131 vmbus_xact_ctx_wakeup(sc->hn_xact, comp, dlen); in hn_rndis_rx_ctrl()
142 if_printf(sc->hn_ifp, "RESET cmplt received\n"); in hn_rndis_rx_ctrl()
146 if_printf(sc->hn_ifp, "unknown RNDIS msg 0x%x\n", in hn_rndis_rx_ctrl()
147 hdr->rm_type); in hn_rndis_rx_ctrl()
164 if_printf(sc->hn_ifp, "invalid eaddr len %zu\n", eaddr_len); in hn_rndis_get_eaddr()
182 if_printf(sc->hn_ifp, "invalid link status len %zu\n", size); in hn_rndis_get_linkstatus()
200 if_printf(sc->hn_ifp, "invalid mtu len %zu\n", size); in hn_rndis_get_mtu()
235 reqlen -= len; in hn_rndis_xact_exec1()
244 error = hn_nvs_send_rndis_ctrl(sc->hn_prichan, sndc, gpa, gpa_cnt); in hn_rndis_xact_exec1()
247 if_printf(sc->hn_ifp, "RNDIS ctrl send failed: %d\n", error); in hn_rndis_xact_exec1()
250 return (vmbus_chan_xact_wait(sc->hn_prichan, xact, comp_len, in hn_rndis_xact_exec1()
258 const struct rndis_comp_hdr *comp; in hn_rndis_xact_execute() local
262 KASSERT(min_complen >= sizeof(*comp), in hn_rndis_xact_execute()
268 comp = hn_rndis_xact_exec1(sc, xact, reqlen, &hn_nvs_sendctx_none, in hn_rndis_xact_execute()
270 if (comp == NULL) in hn_rndis_xact_execute()
277 if (comp_len >= sizeof(*comp)) { in hn_rndis_xact_execute()
279 if_printf(sc->hn_ifp, "invalid RNDIS comp len %zu, " in hn_rndis_xact_execute()
280 "status 0x%08x\n", comp_len, comp->rm_status); in hn_rndis_xact_execute()
282 if_printf(sc->hn_ifp, "invalid RNDIS comp len %zu\n", in hn_rndis_xact_execute()
287 if (comp->rm_len < min_complen) { in hn_rndis_xact_execute()
288 if_printf(sc->hn_ifp, "invalid RNDIS comp msglen %u\n", in hn_rndis_xact_execute()
289 comp->rm_len); in hn_rndis_xact_execute()
292 if (comp->rm_type != comp_type) { in hn_rndis_xact_execute()
293 if_printf(sc->hn_ifp, "unexpected RNDIS comp 0x%08x, " in hn_rndis_xact_execute()
294 "expect 0x%08x\n", comp->rm_type, comp_type); in hn_rndis_xact_execute()
297 if (comp->rm_rid != rid) { in hn_rndis_xact_execute()
298 if_printf(sc->hn_ifp, "RNDIS comp rid mismatch %u, " in hn_rndis_xact_execute()
299 "expect %u\n", comp->rm_rid, rid); in hn_rndis_xact_execute()
304 return (comp); in hn_rndis_xact_execute()
321 const struct rndis_query_comp *comp; in hn_rndis_query2() local
328 xact = vmbus_xact_get(sc->hn_xact, reqlen); in hn_rndis_query2()
330 if_printf(sc->hn_ifp, "no xact for RNDIS query 0x%08x\n", oid); in hn_rndis_query2()
335 req->rm_type = REMOTE_NDIS_QUERY_MSG; in hn_rndis_query2()
336 req->rm_len = reqlen; in hn_rndis_query2()
337 req->rm_rid = rid; in hn_rndis_query2()
338 req->rm_oid = oid; in hn_rndis_query2()
346 * Hyper-V would set non-SUCCESS status in the query in hn_rndis_query2()
349 req->rm_infobufoffset = RNDIS_QUERY_REQ_INFOBUFOFFSET; in hn_rndis_query2()
352 req->rm_infobuflen = idlen; in hn_rndis_query2()
357 comp_len = sizeof(*comp) + min_odlen; in hn_rndis_query2()
358 comp = hn_rndis_xact_execute(sc, xact, rid, reqlen, &comp_len, in hn_rndis_query2()
360 if (comp == NULL) { in hn_rndis_query2()
361 if_printf(sc->hn_ifp, "exec RNDIS query 0x%08x failed\n", oid); in hn_rndis_query2()
366 if (comp->rm_status != RNDIS_STATUS_SUCCESS) { in hn_rndis_query2()
367 if_printf(sc->hn_ifp, "RNDIS query 0x%08x failed: " in hn_rndis_query2()
368 "status 0x%08x\n", oid, comp->rm_status); in hn_rndis_query2()
372 if (comp->rm_infobuflen == 0 || comp->rm_infobufoffset == 0) { in hn_rndis_query2()
374 if_printf(sc->hn_ifp, "RNDIS query 0x%08x, no data\n", oid); in hn_rndis_query2()
383 /* ofs is the offset from the beginning of comp. */ in hn_rndis_query2()
384 ofs = RNDIS_QUERY_COMP_INFOBUFOFFSET_ABS(comp->rm_infobufoffset); in hn_rndis_query2()
385 if (ofs < sizeof(*comp) || ofs + comp->rm_infobuflen > comp_len) { in hn_rndis_query2()
386 if_printf(sc->hn_ifp, "RNDIS query invalid comp ib off/len, " in hn_rndis_query2()
387 "%u/%u\n", comp->rm_infobufoffset, comp->rm_infobuflen); in hn_rndis_query2()
395 if (comp->rm_infobuflen < odlen) in hn_rndis_query2()
396 odlen = comp->rm_infobuflen; in hn_rndis_query2()
397 memcpy(odata, ((const uint8_t *)comp) + ofs, odlen); in hn_rndis_query2()
416 if (sc->hn_ndis_ver < HN_NDIS_VERSION_6_20) in hn_rndis_query_rsscaps()
434 if_printf(sc->hn_ifp, "invalid NDIS objtype 0x%02x\n", in hn_rndis_query_rsscaps()
439 if_printf(sc->hn_ifp, "invalid NDIS objrev 0x%02x\n", in hn_rndis_query_rsscaps()
444 if_printf(sc->hn_ifp, "invalid NDIS objsize %u, " in hn_rndis_query_rsscaps()
448 if_printf(sc->hn_ifp, "invalid NDIS objsize %u\n", in hn_rndis_query_rsscaps()
457 if_printf(sc->hn_ifp, "0 RX rings!?\n"); in hn_rndis_query_rsscaps()
461 if_printf(sc->hn_ifp, "%u RX rings\n", caps.ndis_nrxr); in hn_rndis_query_rsscaps()
467 if_printf(sc->hn_ifp, in hn_rndis_query_rsscaps()
473 if_printf(sc->hn_ifp, "RSS indirect table size is not " in hn_rndis_query_rsscaps()
474 "power-of-2 %u\n", caps.ndis_nind); in hn_rndis_query_rsscaps()
478 if_printf(sc->hn_ifp, "RSS indirect table size %u\n", in hn_rndis_query_rsscaps()
486 if_printf(sc->hn_ifp, "# of RX rings (%d) > " in hn_rndis_query_rsscaps()
498 if_printf(sc->hn_ifp, "no hash functions, caps 0x%08x\n", in hn_rndis_query_rsscaps()
502 hash_func = 1 << (hash_fnidx - 1); /* ffs is 1-based */ in hn_rndis_query_rsscaps()
511 if_printf(sc->hn_ifp, "no hash types, caps 0x%08x\n", in hn_rndis_query_rsscaps()
516 if_printf(sc->hn_ifp, "RSS caps %#x\n", caps.ndis_caps); in hn_rndis_query_rsscaps()
519 sc->hn_rss_ind_size = indsz; in hn_rndis_query_rsscaps()
520 sc->hn_rss_hcap = hash_func | hash_types; in hn_rndis_query_rsscaps()
521 if (sc->hn_caps & HN_CAP_UDPHASH) { in hn_rndis_query_rsscaps()
522 /* UDP 4-tuple hash is unconditionally enabled. */ in hn_rndis_query_rsscaps()
523 sc->hn_rss_hcap |= NDIS_HASH_UDP_IPV4_X; in hn_rndis_query_rsscaps()
533 const struct rndis_set_comp *comp; in hn_rndis_set() local
542 xact = vmbus_xact_get(sc->hn_xact, reqlen); in hn_rndis_set()
544 if_printf(sc->hn_ifp, "no xact for RNDIS set 0x%08x\n", oid); in hn_rndis_set()
549 req->rm_type = REMOTE_NDIS_SET_MSG; in hn_rndis_set()
550 req->rm_len = reqlen; in hn_rndis_set()
551 req->rm_rid = rid; in hn_rndis_set()
552 req->rm_oid = oid; in hn_rndis_set()
553 req->rm_infobuflen = dlen; in hn_rndis_set()
554 req->rm_infobufoffset = RNDIS_SET_REQ_INFOBUFOFFSET; in hn_rndis_set()
558 comp_len = sizeof(*comp); in hn_rndis_set()
559 comp = hn_rndis_xact_execute(sc, xact, rid, reqlen, &comp_len, in hn_rndis_set()
561 if (comp == NULL) { in hn_rndis_set()
562 if_printf(sc->hn_ifp, "exec RNDIS set 0x%08x failed\n", oid); in hn_rndis_set()
567 if (comp->rm_status != RNDIS_STATUS_SUCCESS) { in hn_rndis_set()
568 if_printf(sc->hn_ifp, "RNDIS set 0x%08x failed: " in hn_rndis_set()
569 "status 0x%08x\n", oid, comp->rm_status); in hn_rndis_set()
596 if_printf(sc->hn_ifp, "hwcaps query failed: %d\n", error); in hn_rndis_conf_offload()
604 if (sc->hn_ndis_ver < HN_NDIS_VERSION_6_30) { in hn_rndis_conf_offload()
638 sc->hn_ndis_tso_szmax = 0; in hn_rndis_conf_offload()
639 sc->hn_ndis_tso_sgmin = 0; in hn_rndis_conf_offload()
646 if_printf(sc->hn_ifp, "invalid NDIS TSO config: " in hn_rndis_conf_offload()
654 sc->hn_ndis_tso_szmax = tso_maxsz; in hn_rndis_conf_offload()
655 sc->hn_ndis_tso_sgmin = tso_minsg; in hn_rndis_conf_offload()
657 if_printf(sc->hn_ifp, "NDIS TSO " in hn_rndis_conf_offload()
659 sc->hn_ndis_tso_szmax, in hn_rndis_conf_offload()
660 sc->hn_ndis_tso_sgmin); in hn_rndis_conf_offload()
732 sc->hn_rsc_ctrl) { in hn_rndis_conf_offload()
742 if_printf(sc->hn_ifp, "offload csum: " in hn_rndis_conf_offload()
749 if_printf(sc->hn_ifp, "offload lsov2: ip4 %u, ip6 %u\n", in hn_rndis_conf_offload()
753 if_printf(sc->hn_ifp, "offload rsc: ip4 %u, ip6 %u\n", in hn_rndis_conf_offload()
760 if_printf(sc->hn_ifp, "offload config failed: %d\n", error); in hn_rndis_conf_offload()
765 if_printf(sc->hn_ifp, "offload config done\n"); in hn_rndis_conf_offload()
766 sc->hn_caps |= caps; in hn_rndis_conf_offload()
773 struct ndis_rssprm_toeplitz *rss = &sc->hn_rss; in hn_rndis_conf_rss()
774 struct ndis_rss_params *prm = &rss->rss_params; in hn_rndis_conf_rss()
782 KASSERT(sc->hn_ndis_ver >= HN_NDIS_VERSION_6_20, in hn_rndis_conf_rss()
783 ("NDIS 6.20+ is required, NDIS version 0x%08x", sc->hn_ndis_ver)); in hn_rndis_conf_rss()
786 KASSERT((sc->hn_rss_hash & NDIS_HASH_FUNCTION_MASK), in hn_rndis_conf_rss()
787 ("no hash func %08x", sc->hn_rss_hash)); in hn_rndis_conf_rss()
788 KASSERT((sc->hn_rss_hash & NDIS_HASH_STD), in hn_rndis_conf_rss()
789 ("no standard hash types %08x", sc->hn_rss_hash)); in hn_rndis_conf_rss()
790 KASSERT(sc->hn_rss_ind_size > 0, ("no indirect table size")); in hn_rndis_conf_rss()
793 if_printf(sc->hn_ifp, "RSS indirect table size %d, " in hn_rndis_conf_rss()
794 "hash 0x%08x\n", sc->hn_rss_ind_size, sc->hn_rss_hash); in hn_rndis_conf_rss()
802 rss_size = NDIS_RSSPRM_TOEPLITZ_SIZE(sc->hn_rss_ind_size); in hn_rndis_conf_rss()
804 prm->ndis_hdr.ndis_type = NDIS_OBJTYPE_RSS_PARAMS; in hn_rndis_conf_rss()
805 prm->ndis_hdr.ndis_rev = NDIS_RSS_PARAMS_REV_2; in hn_rndis_conf_rss()
806 prm->ndis_hdr.ndis_size = rss_size; in hn_rndis_conf_rss()
807 prm->ndis_flags = flags; in hn_rndis_conf_rss()
808 prm->ndis_hash = sc->hn_rss_hash & in hn_rndis_conf_rss()
810 prm->ndis_indsize = sizeof(rss->rss_ind[0]) * sc->hn_rss_ind_size; in hn_rndis_conf_rss()
811 prm->ndis_indoffset = in hn_rndis_conf_rss()
813 prm->ndis_keysize = sizeof(rss->rss_key); in hn_rndis_conf_rss()
814 prm->ndis_keyoffset = in hn_rndis_conf_rss()
820 if_printf(sc->hn_ifp, "RSS config failed: %d\n", error); in hn_rndis_conf_rss()
823 if_printf(sc->hn_ifp, "RSS config done\n"); in hn_rndis_conf_rss()
836 if_printf(sc->hn_ifp, "set RX filter 0x%08x failed: %d\n", in hn_rndis_set_rxfilter()
840 if_printf(sc->hn_ifp, "set RX filter 0x%08x done\n", in hn_rndis_set_rxfilter()
851 const struct rndis_init_comp *comp; in hn_rndis_init() local
857 xact = vmbus_xact_get(sc->hn_xact, sizeof(*req)); in hn_rndis_init()
859 if_printf(sc->hn_ifp, "no xact for RNDIS init\n"); in hn_rndis_init()
864 req->rm_type = REMOTE_NDIS_INITIALIZE_MSG; in hn_rndis_init()
865 req->rm_len = sizeof(*req); in hn_rndis_init()
866 req->rm_rid = rid; in hn_rndis_init()
867 req->rm_ver_major = RNDIS_VERSION_MAJOR; in hn_rndis_init()
868 req->rm_ver_minor = RNDIS_VERSION_MINOR; in hn_rndis_init()
869 req->rm_max_xfersz = HN_RNDIS_XFER_SIZE; in hn_rndis_init()
872 comp = hn_rndis_xact_execute(sc, xact, rid, sizeof(*req), &comp_len, in hn_rndis_init()
874 if (comp == NULL) { in hn_rndis_init()
875 if_printf(sc->hn_ifp, "exec RNDIS init failed\n"); in hn_rndis_init()
880 if (comp->rm_status != RNDIS_STATUS_SUCCESS) { in hn_rndis_init()
881 if_printf(sc->hn_ifp, "RNDIS init failed: status 0x%08x\n", in hn_rndis_init()
882 comp->rm_status); in hn_rndis_init()
886 sc->hn_rndis_agg_size = comp->rm_pktmaxsz; in hn_rndis_init()
887 sc->hn_rndis_agg_pkts = comp->rm_pktmaxcnt; in hn_rndis_init()
888 sc->hn_rndis_agg_align = 1U << comp->rm_align; in hn_rndis_init()
890 if (sc->hn_rndis_agg_align < sizeof(uint32_t)) { in hn_rndis_init()
897 if_printf(sc->hn_ifp, "fixup RNDIS aggpkt align: %u -> %zu\n", in hn_rndis_init()
898 sc->hn_rndis_agg_align, sizeof(uint32_t)); in hn_rndis_init()
899 sc->hn_rndis_agg_align = sizeof(uint32_t); in hn_rndis_init()
903 if_printf(sc->hn_ifp, "RNDIS ver %u.%u, " in hn_rndis_init()
905 comp->rm_ver_major, comp->rm_ver_minor, in hn_rndis_init()
906 sc->hn_rndis_agg_size, sc->hn_rndis_agg_pkts, in hn_rndis_init()
907 sc->hn_rndis_agg_align); in hn_rndis_init()
923 xact = vmbus_xact_get(sc->hn_xact, sizeof(*halt)); in hn_rndis_halt()
925 if_printf(sc->hn_ifp, "no xact for RNDIS halt\n"); in hn_rndis_halt()
929 halt->rm_type = REMOTE_NDIS_HALT_MSG; in hn_rndis_halt()
930 halt->rm_len = sizeof(*halt); in hn_rndis_halt()
931 halt->rm_rid = hn_rndis_rid(sc); in hn_rndis_halt()
939 if_printf(sc->hn_ifp, "RNDIS halt done\n"); in hn_rndis_halt()
952 if (sc->hn_ndis_ver >= HN_NDIS_VERSION_6_30) { in hn_rndis_query_hwcaps()
955 } else if (sc->hn_ndis_ver >= HN_NDIS_VERSION_6_1) { in hn_rndis_query_hwcaps()
973 if (caps->ndis_hdr.ndis_type != NDIS_OBJTYPE_OFFLOAD) { in hn_rndis_query_hwcaps()
974 if_printf(sc->hn_ifp, "invalid NDIS objtype 0x%02x\n", in hn_rndis_query_hwcaps()
975 caps->ndis_hdr.ndis_type); in hn_rndis_query_hwcaps()
978 if (caps->ndis_hdr.ndis_rev < NDIS_OFFLOAD_REV_1) { in hn_rndis_query_hwcaps()
979 if_printf(sc->hn_ifp, "invalid NDIS objrev 0x%02x\n", in hn_rndis_query_hwcaps()
980 caps->ndis_hdr.ndis_rev); in hn_rndis_query_hwcaps()
983 if (caps->ndis_hdr.ndis_size > caps_len) { in hn_rndis_query_hwcaps()
984 if_printf(sc->hn_ifp, "invalid NDIS objsize %u, " in hn_rndis_query_hwcaps()
985 "data size %zu\n", caps->ndis_hdr.ndis_size, caps_len); in hn_rndis_query_hwcaps()
987 } else if (caps->ndis_hdr.ndis_size < NDIS_OFFLOAD_SIZE_6_0) { in hn_rndis_query_hwcaps()
988 if_printf(sc->hn_ifp, "invalid NDIS objsize %u\n", in hn_rndis_query_hwcaps()
989 caps->ndis_hdr.ndis_size); in hn_rndis_query_hwcaps()
991 } else if (caps->ndis_hdr.ndis_rev >= NDIS_OFFLOAD_REV_3 && in hn_rndis_query_hwcaps()
992 caps->ndis_hdr.ndis_size < NDIS_OFFLOAD_SIZE) { in hn_rndis_query_hwcaps()
993 if_printf(sc->hn_ifp, "invalid NDIS rev3 objsize %u\n", in hn_rndis_query_hwcaps()
994 caps->ndis_hdr.ndis_size); in hn_rndis_query_hwcaps()
1001 * caps->ndis_hdr.ndis_size MUST be checked before accessing in hn_rndis_query_hwcaps()
1004 if_printf(sc->hn_ifp, "hwcaps rev %u\n", in hn_rndis_query_hwcaps()
1005 caps->ndis_hdr.ndis_rev); in hn_rndis_query_hwcaps()
1007 if_printf(sc->hn_ifp, "hwcaps csum: " in hn_rndis_query_hwcaps()
1010 caps->ndis_csum.ndis_ip4_txcsum, in hn_rndis_query_hwcaps()
1011 caps->ndis_csum.ndis_ip4_txenc, in hn_rndis_query_hwcaps()
1012 caps->ndis_csum.ndis_ip4_rxcsum, in hn_rndis_query_hwcaps()
1013 caps->ndis_csum.ndis_ip4_rxenc, in hn_rndis_query_hwcaps()
1014 caps->ndis_csum.ndis_ip6_txcsum, in hn_rndis_query_hwcaps()
1015 caps->ndis_csum.ndis_ip6_txenc, in hn_rndis_query_hwcaps()
1016 caps->ndis_csum.ndis_ip6_rxcsum, in hn_rndis_query_hwcaps()
1017 caps->ndis_csum.ndis_ip6_rxenc); in hn_rndis_query_hwcaps()
1018 if_printf(sc->hn_ifp, "hwcaps lsov2: " in hn_rndis_query_hwcaps()
1021 caps->ndis_lsov2.ndis_ip4_maxsz, in hn_rndis_query_hwcaps()
1022 caps->ndis_lsov2.ndis_ip4_minsg, in hn_rndis_query_hwcaps()
1023 caps->ndis_lsov2.ndis_ip4_encap, in hn_rndis_query_hwcaps()
1024 caps->ndis_lsov2.ndis_ip6_maxsz, in hn_rndis_query_hwcaps()
1025 caps->ndis_lsov2.ndis_ip6_minsg, in hn_rndis_query_hwcaps()
1026 caps->ndis_lsov2.ndis_ip6_encap, in hn_rndis_query_hwcaps()
1027 caps->ndis_lsov2.ndis_ip6_opts); in hn_rndis_query_hwcaps()
1028 if (caps->ndis_hdr.ndis_rev >= NDIS_OFFLOAD_REV_3) in hn_rndis_query_hwcaps()
1029 if_printf(sc->hn_ifp, "hwcaps rsc: " in hn_rndis_query_hwcaps()
1031 caps->ndis_rsc.ndis_ip4, in hn_rndis_query_hwcaps()
1032 caps->ndis_rsc.ndis_ip6); in hn_rndis_query_hwcaps()