]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - sys/dev/hyperv/netvsc/hv_rndis_filter.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / sys / dev / hyperv / netvsc / hv_rndis_filter.h
1 /*-
2  * Copyright (c) 2009-2012 Microsoft Corp.
3  * Copyright (c) 2010-2012 Citrix Inc.
4  * Copyright (c) 2012 NetApp Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice unmodified, this list of conditions, and the following
12  *    disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30
31 #ifndef __HV_RNDIS_FILTER_H__
32 #define __HV_RNDIS_FILTER_H__
33
34
35 /*
36  * Defines
37  */
38
39 /* Destroy or preserve channel on filter/netvsc teardown */
40 #define HV_RF_NV_DESTROY_CHANNEL        TRUE
41 #define HV_RF_NV_RETAIN_CHANNEL         FALSE
42
43 /*
44  * Number of page buffers to reserve for the RNDIS filter packet in the
45  * transmitted message.
46  */
47 #define HV_RF_NUM_TX_RESERVED_PAGE_BUFS 1
48
49
50 /*
51  * Data types
52  */
53
54 typedef enum {
55         RNDIS_DEV_UNINITIALIZED = 0,
56         RNDIS_DEV_INITIALIZING,
57         RNDIS_DEV_INITIALIZED,
58         RNDIS_DEV_DATAINITIALIZED,
59 } rndis_device_state;
60
61 typedef struct rndis_request_ {
62         STAILQ_ENTRY(rndis_request_)    mylist_entry;
63         struct sema                     wait_sema;      
64
65         /*
66          * Fixme:  We assumed a fixed size response here.  If we do ever
67          * need to handle a bigger response, we can either define a max
68          * response message or add a response buffer variable above this field
69          */
70         rndis_msg                       response_msg;
71
72         /* Simplify allocation by having a netvsc packet inline */
73         netvsc_packet                   pkt;
74         hv_vmbus_page_buffer            buffer;
75         /* Fixme:  We assumed a fixed size request here. */
76         rndis_msg                       request_msg;
77         /* Fixme:  Poor man's semaphore. */
78         uint32_t                        halt_complete_flag;
79 } rndis_request;
80
81 typedef struct rndis_device_ {
82         netvsc_dev                      *net_dev;
83
84         rndis_device_state              state;
85         uint32_t                        link_status;
86         uint32_t                        new_request_id;
87
88         struct mtx                      req_lock;
89
90         STAILQ_HEAD(RQ, rndis_request_) myrequest_list;
91
92         uint8_t                         hw_mac_addr[HW_MACADDR_LEN];
93 } rndis_device;
94
95 /*
96  * Externs
97  */
98
99 int hv_rf_on_receive(netvsc_dev *net_dev,
100     struct hv_device *device, netvsc_packet *pkt);
101 int hv_rf_on_device_add(struct hv_device *device, void *additl_info);
102 int hv_rf_on_device_remove(struct hv_device *device, boolean_t destroy_channel);
103 int hv_rf_on_open(struct hv_device *device);
104 int hv_rf_on_close(struct hv_device *device);
105
106 #endif  /* __HV_RNDIS_FILTER_H__ */
107