1
/*********************************************************
2
* Copyright (C) 2009 VMware, Inc. All rights reserved.
4
* This program is free software; you can redistribute it and/or modify it
5
* under the terms of the GNU General Public License as published by the
6
* Free Software Foundation version 2 and no later version.
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
10
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13
* You should have received a copy of the GNU General Public License along
14
* with this program; if not, write to the Free Software Foundation, Inc.,
15
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
*********************************************************/
22
* Definitions for shared memory infrastructure for VMXNET3 linux driver.
25
#ifndef _VMXNET3_SHM_H_
26
#define _VMXNET3_SHM_H_
28
#include "vmxnet3_shm_shared.h"
29
#include <linux/miscdevice.h>
32
* Bumping up the max tx descriptor per packet.
33
* We need one more than VMXNET3_SHM_MAX_FRAGS because of partial header copy.
35
#define VMXNET3_MAX_TXD_PER_PKT_SHM (VMXNET3_SHM_MAX_FRAGS + 1)
37
struct vmxnet3_shm_mapped_page
43
struct vmxnet3_shm_pool
45
struct list_head list;
46
char name[IFNAMSIZ + 16];
51
/* pages backing the map in virtual address order */
52
struct vmxnet3_shm_mapped_page *pages;
53
unsigned int num_pages;
58
/* pages backing the map in virtual address order */
59
struct page *pages[SHM_CTL_SIZE];
60
struct vmxnet3_shm_ctl *ptr;
66
* This is a stack of free pages. count is the number of free pages, so
67
* count - 1 is the topmost free page.
75
struct vmxnet3_shm_ringentry res[VMXNET3_SHM_MAX_FRAGS];
79
struct miscdevice misc_dev;
81
wait_queue_head_t rxq;
82
spinlock_t alloc_lock, tx_lock, rx_lock;
83
struct vmxnet3_adapter *adapter;
86
/* Convert ring index to the struct page* or virt address. */
87
#define VMXNET3_SHM_IDX2PAGE(shm, idx) (shm->data.pages[(idx)].page)
88
#define VMXNET3_SHM_SET_IDX2PAGE(shm, idx, x) (shm->data.pages[(idx)].page = (x))
90
#define VMXNET3_SHM_SKB_GETIDX(skb) (compat_skb_transport_offset(skb))
91
#define VMXNET3_SHM_SKB_SETIDX(skb, idx) (compat_skb_set_transport_header(skb, idx))
92
#define VMXNET3_SHM_SKB_SETLEN(skb, len) (compat_skb_set_network_header(skb, len))
93
#define VMXNET3_SHM_SKB_GETLEN(skb) (compat_skb_network_offset(skb))
96
vmxnet3_shm_close(struct vmxnet3_adapter *adapter);
98
vmxnet3_shm_open(struct vmxnet3_adapter *adapter, char *name, int pool_size);
100
vmxnet3_shm_user_rx(struct vmxnet3_shm_pool *shm,
104
vmxnet3_free_skbpages(struct vmxnet3_adapter *adapter, struct sk_buff *skb);
107
vmxnet3_shm_alloc_page(struct vmxnet3_shm_pool *shm);
109
vmxnet3_shm_free_page(struct vmxnet3_shm_pool *shm, u16 idx);
112
vmxnet3_shm_start_tx(struct sk_buff *skb, struct net_device *dev);
114
vmxnet3_shm_rx_skb(struct vmxnet3_adapter *adapter, struct sk_buff *skb);
117
*-----------------------------------------------------------------------------
119
* vmxnet3_dev_kfree_skb_* --
121
* Covers for dev_kfree_skb*. Deal with the shared memory version of skbs.
129
*-----------------------------------------------------------------------------
132
vmxnet3_dev_kfree_skb(struct vmxnet3_adapter *adapter, struct sk_buff *skb)
135
vmxnet3_free_skbpages(adapter, skb);
137
compat_dev_kfree_skb(skb, FREE_WRITE);
141
vmxnet3_dev_kfree_skb_any(struct vmxnet3_adapter *adapter, struct sk_buff *skb)
144
vmxnet3_free_skbpages(adapter, skb);
146
compat_dev_kfree_skb_any(skb, FREE_WRITE);
150
vmxnet3_dev_kfree_skb_irq(struct vmxnet3_adapter *adapter, struct sk_buff *skb)
153
vmxnet3_free_skbpages(adapter, skb);
155
compat_dev_kfree_skb_irq(skb, FREE_WRITE);
159
*-----------------------------------------------------------------------------
163
* Covers for (compat_)skb_*. Deal with the shared memory version of skbs.
171
*-----------------------------------------------------------------------------
173
static inline unsigned int
174
vmxnet3_skb_headlen(struct vmxnet3_adapter *adapter, struct sk_buff *skb)
177
return VMXNET3_SHM_SKB_GETLEN(skb);
179
return compat_skb_headlen(skb);
184
vmxnet3_skb_put(struct vmxnet3_adapter *adapter, struct sk_buff *skb, unsigned int len)
186
if (!adapter->is_shm) {
189
unsigned int oldlen = VMXNET3_SHM_SKB_GETLEN(skb);
190
VMXNET3_SHM_SKB_SETLEN(skb, len + oldlen);
194
static inline struct sk_buff*
195
vmxnet3_dev_alloc_skb(struct vmxnet3_adapter *adapter, unsigned long length)
197
if (adapter->is_shm) {
200
idx = vmxnet3_shm_alloc_page(adapter->shm);
201
if (idx == SHM_INVALID_IDX)
205
/* The length is arbitrary because that memory shouldn't be used */
206
skb = dev_alloc_skb(100);
208
vmxnet3_shm_free_page(adapter->shm, idx);
212
VMXNET3_SHM_SKB_SETIDX(skb, idx);
213
VMXNET3_SHM_SKB_SETLEN(skb, 0);
217
return dev_alloc_skb(length);
222
*-----------------------------------------------------------------------------
226
* Covers for pci_map_*. Deal with the shared memory version of skbs.
234
*-----------------------------------------------------------------------------
236
static inline dma_addr_t
237
vmxnet3_map_single(struct vmxnet3_adapter *adapter,
238
struct sk_buff * skb,
243
if (adapter->is_shm) {
244
unsigned long shm_idx = VMXNET3_SHM_SKB_GETIDX(skb);
245
struct page *real_page = VMXNET3_SHM_IDX2PAGE(adapter->shm, shm_idx);
246
return pci_map_page(adapter->pdev,
252
return pci_map_single(adapter->pdev,
260
static inline dma_addr_t
261
vmxnet3_map_page(struct vmxnet3_adapter *adapter,
267
if (adapter->is_shm) {
268
unsigned long shm_idx = (unsigned long)page;
269
page = VMXNET3_SHM_IDX2PAGE(adapter->shm, shm_idx);
272
return pci_map_page(adapter->pdev,
280
*-----------------------------------------------------------------------------
282
* vmxnet3_(put|alloc)_page --
284
* Allocation and release of pages. Either use regular or shared memory
293
*-----------------------------------------------------------------------------
296
vmxnet3_put_page(struct vmxnet3_adapter *adapter,
299
if (!adapter->is_shm)
302
vmxnet3_shm_free_page(adapter->shm, (unsigned long)page);
306
vmxnet3_alloc_page(struct vmxnet3_adapter *adapter)
309
return (void*) (unsigned long) vmxnet3_shm_alloc_page(adapter->shm);
311
return alloc_page(GFP_ATOMIC);