1 /* 2 * 3 * Copyright (c) 2009, Microsoft Corporation. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms and conditions of the GNU General Public License, 7 * version 2, as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 * You should have received a copy of the GNU General Public License along with 15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple 16 * Place - Suite 330, Boston, MA 02111-1307 USA. 17 * 18 * Authors: 19 * Haiyang Zhang <haiyangz@microsoft.com> 20 * Hank Janssen <hjanssen@microsoft.com> 21 * 22 */ 23 24 25 #ifndef _NETVSC_API_H_ 26 #define _NETVSC_API_H_ 27 28 #include "vmbus_api.h" 29 30 /* Fwd declaration */ 31 struct hv_netvsc_packet; 32 33 /* Represent the xfer page packet which contains 1 or more netvsc packet */ 34 struct xferpage_packet { 35 struct list_head list_ent; 36 37 /* # of netvsc packets this xfer packet contains */ 38 u32 count; 39 }; 40 41 /* The number of pages which are enough to cover jumbo frame buffer. */ 42 #define NETVSC_PACKET_MAXPAGE 4 43 44 /* 45 * Represent netvsc packet which contains 1 RNDIS and 1 ethernet frame 46 * within the RNDIS 47 */ 48 struct hv_netvsc_packet { 49 /* Bookkeeping stuff */ 50 struct list_head list_ent; 51 52 struct hv_device *device; 53 bool is_data_pkt; 54 55 /* 56 * Valid only for receives when we break a xfer page packet 57 * into multiple netvsc packets 58 */ 59 struct xferpage_packet *xfer_page_pkt; 60 61 union { 62 struct{ 63 u64 recv_completion_tid; 64 void *recv_completion_ctx; 65 void (*recv_completion)(void *context); 66 } recv; 67 struct{ 68 u64 send_completion_tid; 69 void *send_completion_ctx; 70 void (*send_completion)(void *context); 71 } send; 72 } completion; 73 74 /* This points to the memory after page_buf */ 75 void *extension; 76 77 u32 total_data_buflen; 78 /* Points to the send/receive buffer where the ethernet frame is */ 79 u32 page_buf_cnt; 80 struct hv_page_buffer page_buf[NETVSC_PACKET_MAXPAGE]; 81 }; 82 83 /* Represents the net vsc driver */ 84 struct netvsc_driver { 85 /* Must be the first field */ 86 /* Which is a bug FIXME! */ 87 struct hv_driver base; 88 89 u32 ring_buf_size; 90 u32 req_ext_size; 91 92 /* 93 * This is set by the caller to allow us to callback when we 94 * receive a packet from the "wire" 95 */ 96 int (*recv_cb)(struct hv_device *dev, 97 struct hv_netvsc_packet *packet); 98 void (*link_status_change)(struct hv_device *dev, u32 status); 99 100 /* Specific to this driver */ 101 int (*send)(struct hv_device *dev, struct hv_netvsc_packet *packet); 102 103 void *ctx; 104 }; 105 106 struct netvsc_device_info { 107 unsigned char mac_adr[6]; 108 bool link_state; /* 0 - link up, 1 - link down */ 109 }; 110 111 /* Interface */ 112 int netvsc_initialize(struct hv_driver *drv); 113 int rndis_filter_open(struct hv_device *dev); 114 int rndis_filter_close(struct hv_device *dev); 115 116 #endif /* _NETVSC_API_H_ */ 117