Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/hyperv/netvsc/hv_net_vsc.c
Show First 20 Lines • Show All 200 Lines • ▼ Show 20 Lines | hv_nv_init_rx_buffer_with_net_vsp(struct hn_softc *sc) | ||||
conn = vmbus_xact_req_data(xact); | conn = vmbus_xact_req_data(xact); | ||||
conn->nvs_type = HN_NVS_TYPE_RXBUF_CONN; | conn->nvs_type = HN_NVS_TYPE_RXBUF_CONN; | ||||
conn->nvs_gpadl = net_dev->rx_buf_gpadl_handle; | conn->nvs_gpadl = net_dev->rx_buf_gpadl_handle; | ||||
conn->nvs_sig = HN_NVS_RXBUF_SIG; | conn->nvs_sig = HN_NVS_RXBUF_SIG; | ||||
hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact); | hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact); | ||||
vmbus_xact_activate(xact); | vmbus_xact_activate(xact); | ||||
error = vmbus_chan_send(sc->hn_prichan, | error = hn_nvs_send(sc->hn_prichan, VMBUS_CHANPKT_FLAG_RC, | ||||
VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC, | conn, sizeof(*conn), &sndc); | ||||
conn, sizeof(*conn), (uint64_t)(uintptr_t)&sndc); | |||||
if (error != 0) { | if (error != 0) { | ||||
if_printf(sc->hn_ifp, "send nvs rxbuf conn failed: %d\n", | if_printf(sc->hn_ifp, "send nvs rxbuf conn failed: %d\n", | ||||
error); | error); | ||||
vmbus_xact_deactivate(xact); | vmbus_xact_deactivate(xact); | ||||
vmbus_xact_put(xact); | vmbus_xact_put(xact); | ||||
goto cleanup; | goto cleanup; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 88 Lines • ▼ Show 20 Lines | hv_nv_init_send_buffer_with_net_vsp(struct hn_softc *sc) | ||||
chim = vmbus_xact_req_data(xact); | chim = vmbus_xact_req_data(xact); | ||||
chim->nvs_type = HN_NVS_TYPE_CHIM_CONN; | chim->nvs_type = HN_NVS_TYPE_CHIM_CONN; | ||||
chim->nvs_gpadl = net_dev->send_buf_gpadl_handle; | chim->nvs_gpadl = net_dev->send_buf_gpadl_handle; | ||||
chim->nvs_sig = HN_NVS_CHIM_SIG; | chim->nvs_sig = HN_NVS_CHIM_SIG; | ||||
hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact); | hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact); | ||||
vmbus_xact_activate(xact); | vmbus_xact_activate(xact); | ||||
error = vmbus_chan_send(sc->hn_prichan, | error = hn_nvs_send(sc->hn_prichan, VMBUS_CHANPKT_FLAG_RC, | ||||
VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC, | chim, sizeof(*chim), &sndc); | ||||
chim, sizeof(*chim), (uint64_t)(uintptr_t)&sndc); | |||||
if (error) { | if (error) { | ||||
if_printf(sc->hn_ifp, "send nvs chim conn failed: %d\n", | if_printf(sc->hn_ifp, "send nvs chim conn failed: %d\n", | ||||
error); | error); | ||||
vmbus_xact_deactivate(xact); | vmbus_xact_deactivate(xact); | ||||
vmbus_xact_put(xact); | vmbus_xact_put(xact); | ||||
goto cleanup; | goto cleanup; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 61 Lines • ▼ Show 20 Lines | if (net_dev->rx_section_count) { | ||||
/* | /* | ||||
* Disconnect RXBUF from NVS. | * Disconnect RXBUF from NVS. | ||||
*/ | */ | ||||
memset(&disconn, 0, sizeof(disconn)); | memset(&disconn, 0, sizeof(disconn)); | ||||
disconn.nvs_type = HN_NVS_TYPE_RXBUF_DISCONN; | disconn.nvs_type = HN_NVS_TYPE_RXBUF_DISCONN; | ||||
disconn.nvs_sig = HN_NVS_RXBUF_SIG; | disconn.nvs_sig = HN_NVS_RXBUF_SIG; | ||||
ret = vmbus_chan_send(net_dev->sc->hn_prichan, | /* NOTE: No response. */ | ||||
VMBUS_CHANPKT_TYPE_INBAND, 0, &disconn, sizeof(disconn), | ret = hn_nvs_send(net_dev->sc->hn_prichan, | ||||
(uint64_t)(uintptr_t)&hn_send_ctx_none); | VMBUS_CHANPKT_FLAG_NONE, &disconn, sizeof(disconn), | ||||
&hn_send_ctx_none); | |||||
if (ret != 0) { | if (ret != 0) { | ||||
if_printf(net_dev->sc->hn_ifp, | if_printf(net_dev->sc->hn_ifp, | ||||
"send rxbuf disconn failed: %d\n", ret); | "send rxbuf disconn failed: %d\n", ret); | ||||
return (ret); | return (ret); | ||||
} | } | ||||
net_dev->rx_section_count = 0; | net_dev->rx_section_count = 0; | ||||
} | } | ||||
Show All 33 Lines | if (net_dev->send_section_size) { | ||||
/* | /* | ||||
* Disconnect chimney sending buffer from NVS. | * Disconnect chimney sending buffer from NVS. | ||||
*/ | */ | ||||
memset(&disconn, 0, sizeof(disconn)); | memset(&disconn, 0, sizeof(disconn)); | ||||
disconn.nvs_type = HN_NVS_TYPE_CHIM_DISCONN; | disconn.nvs_type = HN_NVS_TYPE_CHIM_DISCONN; | ||||
disconn.nvs_sig = HN_NVS_CHIM_SIG; | disconn.nvs_sig = HN_NVS_CHIM_SIG; | ||||
ret = vmbus_chan_send(net_dev->sc->hn_prichan, | /* NOTE: No response. */ | ||||
VMBUS_CHANPKT_TYPE_INBAND, 0, &disconn, sizeof(disconn), | ret = hn_nvs_send(net_dev->sc->hn_prichan, | ||||
(uint64_t)(uintptr_t)&hn_send_ctx_none); | VMBUS_CHANPKT_FLAG_NONE, &disconn, sizeof(disconn), | ||||
&hn_send_ctx_none); | |||||
if (ret != 0) { | if (ret != 0) { | ||||
if_printf(net_dev->sc->hn_ifp, | if_printf(net_dev->sc->hn_ifp, | ||||
"send chim disconn failed: %d\n", ret); | "send chim disconn failed: %d\n", ret); | ||||
return (ret); | return (ret); | ||||
} | } | ||||
} | } | ||||
/* Tear down the gpadl on the vsp end */ | /* Tear down the gpadl on the vsp end */ | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | hv_nv_negotiate_nvsp_protocol(struct hn_softc *sc, netvsc_dev *net_dev, | ||||
init = vmbus_xact_req_data(xact); | init = vmbus_xact_req_data(xact); | ||||
init->nvs_type = HN_NVS_TYPE_INIT; | init->nvs_type = HN_NVS_TYPE_INIT; | ||||
init->nvs_ver_min = nvs_ver; | init->nvs_ver_min = nvs_ver; | ||||
init->nvs_ver_max = nvs_ver; | init->nvs_ver_max = nvs_ver; | ||||
vmbus_xact_activate(xact); | vmbus_xact_activate(xact); | ||||
hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact); | hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact); | ||||
error = vmbus_chan_send(sc->hn_prichan, | error = hn_nvs_send(sc->hn_prichan, VMBUS_CHANPKT_FLAG_RC, | ||||
VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC, | init, sizeof(*init), &sndc); | ||||
init, sizeof(*init), (uint64_t)(uintptr_t)&sndc); | |||||
if (error) { | if (error) { | ||||
if_printf(sc->hn_ifp, "send nvs init failed: %d\n", error); | if_printf(sc->hn_ifp, "send nvs init failed: %d\n", error); | ||||
vmbus_xact_deactivate(xact); | vmbus_xact_deactivate(xact); | ||||
vmbus_xact_put(xact); | vmbus_xact_put(xact); | ||||
return (error); | return (error); | ||||
} | } | ||||
resp = vmbus_xact_wait(xact, &resp_len); | resp = vmbus_xact_wait(xact, &resp_len); | ||||
Show All 32 Lines | hv_nv_send_ndis_config(struct hn_softc *sc, uint32_t mtu) | ||||
struct hn_nvs_ndis_conf conf; | struct hn_nvs_ndis_conf conf; | ||||
int error; | int error; | ||||
memset(&conf, 0, sizeof(conf)); | memset(&conf, 0, sizeof(conf)); | ||||
conf.nvs_type = HN_NVS_TYPE_NDIS_CONF; | conf.nvs_type = HN_NVS_TYPE_NDIS_CONF; | ||||
conf.nvs_mtu = mtu; | conf.nvs_mtu = mtu; | ||||
conf.nvs_caps = HN_NVS_NDIS_CONF_VLAN; | conf.nvs_caps = HN_NVS_NDIS_CONF_VLAN; | ||||
error = vmbus_chan_send(sc->hn_prichan, VMBUS_CHANPKT_TYPE_INBAND, 0, | /* NOTE: No response. */ | ||||
&conf, sizeof(conf), (uint64_t)(uintptr_t)&hn_send_ctx_none); | error = hn_nvs_send(sc->hn_prichan, VMBUS_CHANPKT_FLAG_NONE, | ||||
&conf, sizeof(conf), &hn_send_ctx_none); | |||||
if (error) | if (error) | ||||
if_printf(sc->hn_ifp, "send nvs ndis conf failed: %d\n", error); | if_printf(sc->hn_ifp, "send nvs ndis conf failed: %d\n", error); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Net VSC connect to VSP | * Net VSC connect to VSP | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | hv_nv_connect_to_vsp(struct hn_softc *sc) | ||||
memset(&ndis, 0, sizeof(ndis)); | memset(&ndis, 0, sizeof(ndis)); | ||||
ndis.nvs_type = HN_NVS_TYPE_NDIS_INIT; | ndis.nvs_type = HN_NVS_TYPE_NDIS_INIT; | ||||
ndis.nvs_ndis_major = NDIS_VERSION_MAJOR_6; | ndis.nvs_ndis_major = NDIS_VERSION_MAJOR_6; | ||||
if (net_dev->nvsp_version <= NVSP_PROTOCOL_VERSION_4) | if (net_dev->nvsp_version <= NVSP_PROTOCOL_VERSION_4) | ||||
ndis.nvs_ndis_minor = NDIS_VERSION_MINOR_1; | ndis.nvs_ndis_minor = NDIS_VERSION_MINOR_1; | ||||
else | else | ||||
ndis.nvs_ndis_minor = NDIS_VERSION_MINOR_30; | ndis.nvs_ndis_minor = NDIS_VERSION_MINOR_30; | ||||
ret = vmbus_chan_send(sc->hn_prichan, VMBUS_CHANPKT_TYPE_INBAND, 0, | /* NOTE: No response. */ | ||||
&ndis, sizeof(ndis), (uint64_t)(uintptr_t)&hn_send_ctx_none); | ret = hn_nvs_send(sc->hn_prichan, VMBUS_CHANPKT_FLAG_NONE, | ||||
&ndis, sizeof(ndis), &hn_send_ctx_none); | |||||
if (ret != 0) { | if (ret != 0) { | ||||
if_printf(sc->hn_ifp, "send nvs ndis init failed: %d\n", ret); | if_printf(sc->hn_ifp, "send nvs ndis init failed: %d\n", ret); | ||||
goto cleanup; | goto cleanup; | ||||
} | } | ||||
/* Post the big receive buffer to NetVSP */ | /* Post the big receive buffer to NetVSP */ | ||||
if (net_dev->nvsp_version <= NVSP_PROTOCOL_VERSION_2) | if (net_dev->nvsp_version <= NVSP_PROTOCOL_VERSION_2) | ||||
net_dev->rx_buf_size = NETVSC_RECEIVE_BUFFER_SIZE_LEGACY; | net_dev->rx_buf_size = NETVSC_RECEIVE_BUFFER_SIZE_LEGACY; | ||||
▲ Show 20 Lines • Show All 189 Lines • ▼ Show 20 Lines | hv_nv_on_send(struct vmbus_channel *chan, bool is_data_pkt, | ||||
} | } | ||||
send_msg.msgs.vers_1_msgs.send_rndis_pkt.send_buf_section_idx = | send_msg.msgs.vers_1_msgs.send_rndis_pkt.send_buf_section_idx = | ||||
sndc->hn_chim_idx; | sndc->hn_chim_idx; | ||||
send_msg.msgs.vers_1_msgs.send_rndis_pkt.send_buf_section_size = | send_msg.msgs.vers_1_msgs.send_rndis_pkt.send_buf_section_size = | ||||
sndc->hn_chim_sz; | sndc->hn_chim_sz; | ||||
if (gpa_cnt) { | if (gpa_cnt) { | ||||
ret = vmbus_chan_send_sglist(chan, gpa, gpa_cnt, | ret = hn_nvs_send_sglist(chan, gpa, gpa_cnt, | ||||
&send_msg, sizeof(nvsp_msg), (uint64_t)(uintptr_t)sndc); | &send_msg, sizeof(nvsp_msg), sndc); | ||||
} else { | } else { | ||||
ret = vmbus_chan_send(chan, | ret = hn_nvs_send(chan, VMBUS_CHANPKT_FLAG_RC, | ||||
VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC, | &send_msg, sizeof(nvsp_msg), sndc); | ||||
&send_msg, sizeof(nvsp_msg), (uint64_t)(uintptr_t)sndc); | |||||
} | } | ||||
return (ret); | return (ret); | ||||
} | } | ||||
/* | /* | ||||
* Net VSC on receive | * Net VSC on receive | ||||
* | * | ||||
▲ Show 20 Lines • Show All 204 Lines • Show Last 20 Lines |