Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F137097188
D7480.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D7480.diff
View Options
Index: head/sys/dev/hyperv/netvsc/hv_net_vsc.c
===================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.c
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.c
@@ -73,9 +73,6 @@
static void hn_nvs_sent_none(struct hn_send_ctx *sndc,
struct netvsc_dev_ *net_dev, struct vmbus_channel *chan,
const struct nvsp_msg_ *msg, int);
-static void hn_nvs_sent_xact(struct hn_send_ctx *sndc,
- struct netvsc_dev_ *net_dev, struct vmbus_channel *chan,
- const struct nvsp_msg_ *msg, int dlen);
static struct hn_send_ctx hn_send_ctx_none =
HN_SEND_CTX_INITIALIZER(hn_nvs_sent_none, NULL);
@@ -756,16 +753,6 @@
}
void
-hn_nvs_sent_wakeup(struct hn_send_ctx *sndc __unused,
- struct netvsc_dev_ *net_dev, struct vmbus_channel *chan __unused,
- const struct nvsp_msg_ *msg, int dlen __unused)
-{
- /* Copy the response back */
- memcpy(&net_dev->channel_init_packet, msg, sizeof(nvsp_msg));
- sema_post(&net_dev->channel_init_sema);
-}
-
-static void
hn_nvs_sent_xact(struct hn_send_ctx *sndc,
struct netvsc_dev_ *net_dev __unused, struct vmbus_channel *chan __unused,
const struct nvsp_msg_ *msg, int dlen)
Index: head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
===================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
+++ head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
@@ -46,9 +46,11 @@
#include <vm/pmap.h>
#include <dev/hyperv/include/hyperv.h>
-#include "hv_net_vsc.h"
-#include "hv_rndis.h"
-#include "hv_rndis_filter.h"
+#include <dev/hyperv/include/vmbus_xact.h>
+#include <dev/hyperv/netvsc/hv_net_vsc.h>
+#include <dev/hyperv/netvsc/hv_rndis.h>
+#include <dev/hyperv/netvsc/hv_rndis_filter.h>
+#include <dev/hyperv/netvsc/if_hnreg.h>
struct hv_rf_recvinfo {
const ndis_8021q_info *vlan_info;
@@ -1060,12 +1062,16 @@
int ret;
netvsc_dev *net_dev;
rndis_device *rndis_dev;
- nvsp_msg *init_pkt;
rndis_offload_params offloads;
struct rndis_recv_scale_cap rsscaps;
uint32_t rsscaps_size = sizeof(struct rndis_recv_scale_cap);
netvsc_device_info *dev_info = (netvsc_device_info *)additl_info;
device_t dev = sc->hn_dev;
+ struct hn_nvs_subch_req *req;
+ const struct hn_nvs_subch_resp *resp;
+ size_t resp_len;
+ struct vmbus_xact *xact;
+ uint32_t status, nsubch;
rndis_dev = hv_get_rndis_device();
if (rndis_dev == NULL) {
@@ -1153,36 +1159,65 @@
goto out;
}
- /* request host to create sub channels */
- init_pkt = &net_dev->channel_init_packet;
- memset(init_pkt, 0, sizeof(nvsp_msg));
-
- init_pkt->hdr.msg_type = nvsp_msg5_type_subchannel;
- init_pkt->msgs.vers_5_msgs.subchannel_request.op =
- NVSP_SUBCHANNE_ALLOCATE;
- init_pkt->msgs.vers_5_msgs.subchannel_request.num_subchannels =
- net_dev->num_channel - 1;
+ /*
+ * Ask NVS to allocate sub-channels.
+ */
+ xact = vmbus_xact_get(sc->hn_xact, sizeof(*req));
+ if (xact == NULL) {
+ if_printf(sc->hn_ifp, "no xact for nvs subch req\n");
+ ret = ENXIO;
+ goto out;
+ }
+
+ req = vmbus_xact_req_data(xact);
+ req->nvs_type = HN_NVS_TYPE_SUBCH_REQ;
+ req->nvs_op = HN_NVS_SUBCH_OP_ALLOC;
+ req->nvs_nsubch = net_dev->num_channel - 1;
+
+ hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact);
+ vmbus_xact_activate(xact);
- hn_send_ctx_init_simple(&sndc, hn_nvs_sent_wakeup, NULL);
ret = vmbus_chan_send(sc->hn_prichan,
VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC,
- init_pkt, sizeof(nvsp_msg), (uint64_t)(uintptr_t)&sndc);
+ req, sizeof(*req), (uint64_t)(uintptr_t)&sndc);
if (ret != 0) {
- device_printf(dev, "Fail to allocate subchannel\n");
+ if_printf(sc->hn_ifp, "send nvs subch req failed: %d\n", ret);
+ vmbus_xact_deactivate(xact);
+ vmbus_xact_put(xact);
goto out;
}
- sema_wait(&net_dev->channel_init_sema);
-
- if (init_pkt->msgs.vers_5_msgs.subchn_complete.status !=
- nvsp_status_success) {
- ret = ENODEV;
- device_printf(dev, "sub channel complete error\n");
+ resp = vmbus_xact_wait(xact, &resp_len);
+ if (resp_len < sizeof(*resp)) {
+ if_printf(sc->hn_ifp, "invalid subch resp length %zu\n",
+ resp_len);
+ vmbus_xact_put(xact);
+ ret = EINVAL;
+ goto out;
+ }
+ if (resp->nvs_type != HN_NVS_TYPE_SUBCH_RESP) {
+ if_printf(sc->hn_ifp, "not subch resp, type %u\n",
+ resp->nvs_type);
+ vmbus_xact_put(xact);
+ ret = EINVAL;
goto out;
}
- net_dev->num_channel = 1 +
- init_pkt->msgs.vers_5_msgs.subchn_complete.num_subchannels;
+ status = resp->nvs_status;
+ nsubch = resp->nvs_nsubch;
+ vmbus_xact_put(xact);
+
+ if (status != HN_NVS_STATUS_OK) {
+ if_printf(sc->hn_ifp, "subch req failed: %x\n", status);
+ ret = EIO;
+ goto out;
+ }
+ if (nsubch > net_dev->num_channel - 1) {
+ if_printf(sc->hn_ifp, "%u subchans are allocated, requested %u\n",
+ nsubch, net_dev->num_channel - 1);
+ nsubch = net_dev->num_channel - 1;
+ }
+ net_dev->num_channel = nsubch + 1;
ret = hv_rf_set_rss_param(rndis_dev, net_dev->num_channel);
Index: head/sys/dev/hyperv/netvsc/if_hnreg.h
===================================================================
--- head/sys/dev/hyperv/netvsc/if_hnreg.h
+++ head/sys/dev/hyperv/netvsc/if_hnreg.h
@@ -47,6 +47,8 @@
#define HN_NVS_TYPE_CHIM_CONNRESP 105
#define HN_NVS_TYPE_CHIM_DISCONN 106
#define HN_NVS_TYPE_NDIS_CONF 125
+#define HN_NVS_TYPE_SUBCH_REQ 133
+#define HN_NVS_TYPE_SUBCH_RESP 133 /* same as SUBCH_REQ */
/*
* Any size less than this one will _not_ work, e.g. hn_nvs_init
@@ -144,4 +146,20 @@
} __packed;
CTASSERT(sizeof(struct hn_nvs_chim_disconn) >= HN_NVS_REQSIZE_MIN);
+#define HN_NVS_SUBCH_OP_ALLOC 1
+
+struct hn_nvs_subch_req {
+ uint32_t nvs_type; /* HN_NVS_TYPE_SUBCH_REQ */
+ uint32_t nvs_op; /* HN_NVS_SUBCH_OP_ */
+ uint32_t nvs_nsubch;
+ uint8_t nvs_rsvd[20];
+} __packed;
+CTASSERT(sizeof(struct hn_nvs_subch_req) >= HN_NVS_REQSIZE_MIN);
+
+struct hn_nvs_subch_resp {
+ uint32_t nvs_type; /* HN_NVS_TYPE_SUBCH_RESP */
+ uint32_t nvs_status; /* HN_NVS_STATUS_ */
+ uint32_t nvs_nsubch;
+} __packed;
+
#endif /* !_IF_HNREG_H_ */
Index: head/sys/dev/hyperv/netvsc/if_hnvar.h
===================================================================
--- head/sys/dev/hyperv/netvsc/if_hnvar.h
+++ head/sys/dev/hyperv/netvsc/if_hnvar.h
@@ -75,7 +75,7 @@
NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX, 0);
}
-void hn_nvs_sent_wakeup(struct hn_send_ctx *sndc,
+void hn_nvs_sent_xact(struct hn_send_ctx *sndc,
struct netvsc_dev_ *net_dev, struct vmbus_channel *chan,
const struct nvsp_msg_ *msg, int dlen);
void hn_chim_free(struct netvsc_dev_ *net_dev, uint32_t chim_idx);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Nov 22, 3:30 AM (3 h, 23 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25893058
Default Alt Text
D7480.diff (6 KB)
Attached To
Mode
D7480: hyperv/hn: Switch to vmbus xact APIs for sub-channel alloc request.
Attached
Detach File
Event Timeline
Log In to Comment