Update the OFED Linux compatibility layer and
Mellanox hardware driver(s): - Properly name an inclusion guard - Fix compile warnings regarding unsigned enums - Add two new sysctl nodes - Remove all empty linux header files - Make an error printout more verbose - Use "mod_delayed_work()" instead of cancelling and starting a timeout. - Implement more Linux scatterlist functions. MFC after: 3 days Sponsored by: Mellanox Technologies
This commit is contained in:
parent
4032517985
commit
11046e8048
@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <linux/slab.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/inet.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/device.h>
|
||||
|
@ -41,7 +41,6 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/inet.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/timer.h>
|
||||
|
@ -35,10 +35,15 @@
|
||||
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/inetdevice.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <net/route.h>
|
||||
#include <net/netevent.h>
|
||||
#include <rdma/ib_addr.h>
|
||||
#include <netinet/if_ether.h>
|
||||
|
||||
|
||||
MODULE_AUTHOR("Sean Hefty");
|
||||
MODULE_DESCRIPTION("IB Address Translation");
|
||||
@ -189,13 +194,11 @@ static void set_timeout(unsigned long time)
|
||||
{
|
||||
unsigned long delay;
|
||||
|
||||
cancel_delayed_work(&work);
|
||||
|
||||
delay = time - jiffies;
|
||||
if ((long)delay <= 0)
|
||||
delay = 1;
|
||||
|
||||
queue_delayed_work(addr_wq, &work, delay);
|
||||
mod_delayed_work(addr_wq, &work, delay);
|
||||
}
|
||||
|
||||
static void queue_req(struct addr_req *req)
|
||||
@ -620,7 +623,7 @@ static struct notifier_block nb = {
|
||||
.notifier_call = netevent_callback
|
||||
};
|
||||
|
||||
static int addr_init(void)
|
||||
static int __init addr_init(void)
|
||||
{
|
||||
INIT_DELAYED_WORK(&work, process_req);
|
||||
addr_wq = create_singlethread_workqueue("ib_addr");
|
||||
@ -631,7 +634,7 @@ static int addr_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void addr_cleanup(void)
|
||||
static void __exit addr_cleanup(void)
|
||||
{
|
||||
unregister_netevent_notifier(&nb);
|
||||
destroy_workqueue(addr_wq);
|
||||
|
@ -101,7 +101,8 @@ void agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
|
||||
agent = port_priv->agent[qpn];
|
||||
ah = ib_create_ah_from_wc(agent->qp->pd, wc, grh, port_num);
|
||||
if (IS_ERR(ah)) {
|
||||
printk(KERN_ERR SPFX "ib_create_ah_from_wc error\n");
|
||||
printk(KERN_ERR SPFX "ib_create_ah_from_wc error %ld\n",
|
||||
PTR_ERR(ah));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,6 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/mutex.h>
|
||||
|
@ -40,7 +40,6 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/cdev.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
|
@ -38,7 +38,6 @@
|
||||
#include <rdma/ib_cache.h>
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/inet.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include "mlx4_ib.h"
|
||||
|
@ -34,7 +34,7 @@
|
||||
#ifndef MTHCA_CONFIG_REG_H
|
||||
#define MTHCA_CONFIG_REG_H
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <linux/page.h>
|
||||
|
||||
#define MTHCA_HCR_BASE 0x80680
|
||||
#define MTHCA_HCR_SIZE 0x0001c
|
||||
|
@ -36,7 +36,7 @@
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <linux/page.h>
|
||||
|
||||
#include "mthca_memfree.h"
|
||||
#include "mthca_dev.h"
|
||||
|
@ -30,7 +30,7 @@
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <asm/page.h> /* PAGE_SHIFT */
|
||||
#include <linux/page.h>
|
||||
|
||||
#include "mthca_dev.h"
|
||||
#include "mthca_memfree.h"
|
||||
|
@ -31,7 +31,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#include "ipoib.h"
|
||||
|
@ -32,7 +32,6 @@
|
||||
*/
|
||||
|
||||
#include "ipoib.h"
|
||||
#include <linux/ethtool.h>
|
||||
|
||||
int ipoib_mcast_attach(struct ipoib_dev_priv *priv, u16 mlid, union ib_gid *mgid, int set_qkey)
|
||||
{
|
||||
|
@ -31,4 +31,3 @@ opt_inet6.h:
|
||||
.include <bsd.kmod.mk>
|
||||
|
||||
CFLAGS+= -Wno-cast-qual -Wno-pointer-arith ${GCC_MS_EXTENSIONS}
|
||||
|
||||
|
@ -32,7 +32,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/mlx4/driver.h>
|
||||
#include <linux/in.h>
|
||||
|
@ -1,192 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2007 Mellanox Technologies. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "opt_inet.h"
|
||||
#include "mlx4_en.h"
|
||||
|
||||
#ifdef INET
|
||||
|
||||
#include <net/ethernet.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <machine/in_cksum.h>
|
||||
|
||||
static struct mlx4_en_ipfrag *find_session(struct mlx4_en_rx_ring *ring,
|
||||
struct ip *iph)
|
||||
{
|
||||
struct mlx4_en_ipfrag *session;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MLX4_EN_NUM_IPFRAG_SESSIONS; i++) {
|
||||
session = &ring->ipfrag[i];
|
||||
if (session->fragments == NULL)
|
||||
continue;
|
||||
if (session->daddr == iph->ip_dst.s_addr &&
|
||||
session->saddr == iph->ip_src.s_addr &&
|
||||
session->id == iph->ip_id &&
|
||||
session->protocol == iph->ip_p) {
|
||||
return session;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct mlx4_en_ipfrag *start_session(struct mlx4_en_rx_ring *ring,
|
||||
struct ip *iph)
|
||||
{
|
||||
struct mlx4_en_ipfrag *session;
|
||||
int index = -1;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MLX4_EN_NUM_IPFRAG_SESSIONS; i++) {
|
||||
if (ring->ipfrag[i].fragments == NULL) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (index < 0)
|
||||
return NULL;
|
||||
|
||||
session = &ring->ipfrag[index];
|
||||
|
||||
return session;
|
||||
}
|
||||
|
||||
|
||||
static void flush_session(struct mlx4_en_priv *priv,
|
||||
struct mlx4_en_ipfrag *session,
|
||||
u16 more)
|
||||
{
|
||||
struct mbuf *mb = session->fragments;
|
||||
struct ip *iph = mb->m_pkthdr.PH_loc.ptr;
|
||||
struct net_device *dev = mb->m_pkthdr.rcvif;
|
||||
|
||||
/* Update IP length and checksum */
|
||||
iph->ip_len = htons(session->total_len);
|
||||
iph->ip_off = htons(more | (session->offset >> 3));
|
||||
iph->ip_sum = 0;
|
||||
iph->ip_sum = in_cksum_skip(mb, iph->ip_hl * 4,
|
||||
(char *)iph - mb->m_data);
|
||||
|
||||
dev->if_input(dev, mb);
|
||||
session->fragments = NULL;
|
||||
session->last = NULL;
|
||||
}
|
||||
|
||||
|
||||
static inline void frag_append(struct mlx4_en_priv *priv,
|
||||
struct mlx4_en_ipfrag *session,
|
||||
struct mbuf *mb,
|
||||
unsigned int data_len)
|
||||
{
|
||||
struct mbuf *parent = session->fragments;
|
||||
|
||||
/* Update mb bookkeeping */
|
||||
parent->m_pkthdr.len += data_len;
|
||||
session->total_len += data_len;
|
||||
|
||||
m_adj(mb, mb->m_pkthdr.len - data_len);
|
||||
|
||||
session->last->m_next = mb;
|
||||
for (; mb->m_next != NULL; mb = mb->m_next);
|
||||
session->last = mb;
|
||||
}
|
||||
|
||||
int mlx4_en_rx_frags(struct mlx4_en_priv *priv, struct mlx4_en_rx_ring *ring,
|
||||
struct mbuf *mb, struct mlx4_cqe *cqe)
|
||||
{
|
||||
struct mlx4_en_ipfrag *session;
|
||||
struct ip *iph;
|
||||
u16 ip_len;
|
||||
u16 ip_hlen;
|
||||
int data_len;
|
||||
u16 offset;
|
||||
|
||||
iph = (struct ip *)(mtod(mb, char *) + ETHER_HDR_LEN);
|
||||
mb->m_pkthdr.PH_loc.ptr = iph;
|
||||
ip_len = ntohs(iph->ip_len);
|
||||
ip_hlen = iph->ip_hl * 4;
|
||||
data_len = ip_len - ip_hlen;
|
||||
offset = ntohs(iph->ip_off);
|
||||
offset &= IP_OFFMASK;
|
||||
offset <<= 3;
|
||||
|
||||
session = find_session(ring, iph);
|
||||
if (unlikely(in_cksum_skip(mb, ip_hlen, (char *)iph - mb->m_data))) {
|
||||
if (session)
|
||||
flush_session(priv, session, IP_MF);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (session) {
|
||||
if (unlikely(session->offset + session->total_len !=
|
||||
offset + ip_hlen ||
|
||||
session->total_len + mb->m_pkthdr.len > 65536)) {
|
||||
flush_session(priv, session, IP_MF);
|
||||
goto new_session;
|
||||
}
|
||||
frag_append(priv, session, mb, data_len);
|
||||
} else {
|
||||
new_session:
|
||||
session = start_session(ring, iph);
|
||||
if (unlikely(!session))
|
||||
return -ENOSPC;
|
||||
|
||||
session->fragments = mb;
|
||||
session->daddr = iph->ip_dst.s_addr;
|
||||
session->saddr = iph->ip_src.s_addr;
|
||||
session->id = iph->ip_id;
|
||||
session->protocol = iph->ip_p;
|
||||
session->total_len = ip_len;
|
||||
session->offset = offset;
|
||||
for (; mb->m_next != NULL; mb = mb->m_next);
|
||||
session->last = mb;
|
||||
}
|
||||
if (!(ntohs(iph->ip_off) & IP_MF))
|
||||
flush_session(priv, session, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void mlx4_en_flush_frags(struct mlx4_en_priv *priv,
|
||||
struct mlx4_en_rx_ring *ring)
|
||||
{
|
||||
struct mlx4_en_ipfrag *session;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MLX4_EN_NUM_IPFRAG_SESSIONS; i++) {
|
||||
session = &ring->ipfrag[i];
|
||||
if (session->fragments)
|
||||
flush_session(priv, session, IP_MF);
|
||||
}
|
||||
}
|
||||
#endif
|
@ -2335,9 +2335,11 @@ static void mlx4_en_sysctl_conf(struct mlx4_en_priv *priv)
|
||||
struct sysctl_oid_list *node_list;
|
||||
struct sysctl_oid *coal;
|
||||
struct sysctl_oid_list *coal_list;
|
||||
const char *pnameunit;
|
||||
|
||||
dev = priv->dev;
|
||||
ctx = &priv->conf_ctx;
|
||||
pnameunit = device_get_nameunit(priv->mdev->pdev->dev.bsddev);
|
||||
|
||||
sysctl_ctx_init(ctx);
|
||||
priv->sysctl = SYSCTL_ADD_NODE(ctx, SYSCTL_STATIC_CHILDREN(_hw),
|
||||
@ -2350,10 +2352,10 @@ static void mlx4_en_sysctl_conf(struct mlx4_en_priv *priv)
|
||||
CTLFLAG_RW, &priv->msg_enable, 0,
|
||||
"Driver message enable bitfield");
|
||||
SYSCTL_ADD_UINT(ctx, node_list, OID_AUTO, "rx_rings",
|
||||
CTLTYPE_INT | CTLFLAG_RD, &priv->rx_ring_num, 0,
|
||||
CTLFLAG_RD, &priv->rx_ring_num, 0,
|
||||
"Number of receive rings");
|
||||
SYSCTL_ADD_UINT(ctx, node_list, OID_AUTO, "tx_rings",
|
||||
CTLTYPE_INT | CTLFLAG_RD, &priv->tx_ring_num, 0,
|
||||
CTLFLAG_RD, &priv->tx_ring_num, 0,
|
||||
"Number of transmit rings");
|
||||
SYSCTL_ADD_PROC(ctx, node_list, OID_AUTO, "rx_size",
|
||||
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, priv, 0,
|
||||
@ -2367,6 +2369,12 @@ static void mlx4_en_sysctl_conf(struct mlx4_en_priv *priv)
|
||||
SYSCTL_ADD_PROC(ctx, node_list, OID_AUTO, "rx_ppp",
|
||||
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, priv, 0,
|
||||
mlx4_en_set_rx_ppp, "I", "RX Per-priority pause");
|
||||
SYSCTL_ADD_UINT(ctx, node_list, OID_AUTO, "port_num",
|
||||
CTLFLAG_RD, &priv->port, 0,
|
||||
"Port Number");
|
||||
SYSCTL_ADD_STRING(ctx, node_list, OID_AUTO, "device_name",
|
||||
CTLFLAG_RD, __DECONST(void *, pnameunit), 0,
|
||||
"PCI device name");
|
||||
|
||||
/* Add coalescer configuration. */
|
||||
coal = SYSCTL_ADD_NODE(ctx, node_list, OID_AUTO,
|
||||
|
@ -32,7 +32,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mlx4/driver.h>
|
||||
|
@ -31,7 +31,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <linux/page.h>
|
||||
#include <linux/mlx4/cq.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mlx4/qp.h>
|
||||
|
@ -35,7 +35,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/io-mapping.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <linux/page.h>
|
||||
|
||||
#include "mlx4.h"
|
||||
#include "icm.h"
|
||||
|
@ -1,69 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2007 Mellanox Technologies. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/errno.h>
|
||||
|
||||
#include "mlx4.h"
|
||||
|
||||
int mlx4_xrcd_alloc(struct mlx4_dev *dev, u32 *xrcdn)
|
||||
{
|
||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||
|
||||
*xrcdn = mlx4_bitmap_alloc(&priv->xrcd_bitmap);
|
||||
if (*xrcdn == -1)
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mlx4_xrcd_alloc);
|
||||
|
||||
void mlx4_xrcd_free(struct mlx4_dev *dev, u32 xrcdn)
|
||||
{
|
||||
mlx4_bitmap_free(&mlx4_priv(dev)->xrcd_bitmap, xrcdn);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mlx4_xrcd_free);
|
||||
|
||||
int __devinit mlx4_init_xrcd_table(struct mlx4_dev *dev)
|
||||
{
|
||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||
|
||||
return mlx4_bitmap_init(&priv->xrcd_bitmap, (1 << 16),
|
||||
(1 << 16) - 1, dev->caps.reserved_xrcds + 1, 0);
|
||||
}
|
||||
|
||||
void mlx4_cleanup_xrcd_table(struct mlx4_dev *dev)
|
||||
{
|
||||
mlx4_bitmap_cleanup(&mlx4_priv(dev)->xrcd_bitmap);
|
||||
}
|
||||
|
||||
|
@ -1,35 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2010 Isilon Systems, Inc.
|
||||
* Copyright (c) 2010 iX Systems, Inc.
|
||||
* Copyright (c) 2010 Panasas, Inc.
|
||||
* Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice unmodified, this list of conditions, and the following
|
||||
* disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_PAGE_H_
|
||||
#define _ASM_PAGE_H_
|
||||
|
||||
#include <linux/page.h>
|
||||
|
||||
#endif /*_ASM_PAGE_H_*/
|
@ -27,8 +27,8 @@
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _FBSD_COMPLETION_H_
|
||||
#define _FBSD_COMPLETION_H_
|
||||
#ifndef _LINUX_COMPLETION_H_
|
||||
#define _LINUX_COMPLETION_H_
|
||||
|
||||
#include <linux/errno.h>
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*-
|
||||
* Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2014 Mellanox Technologies, Ltd. All rights reserved.
|
||||
*
|
||||
|
@ -1,32 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2010 Isilon Systems, Inc.
|
||||
* Copyright (c) 2010 iX Systems, Inc.
|
||||
* Copyright (c) 2010 Panasas, Inc.
|
||||
* Copyright (c) 2013 Mellanox Technologies, Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice unmodified, this list of conditions, and the following
|
||||
* disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef _LINUX_ETHTOOL_H_
|
||||
#define _LINUX_ETHTOOL_H_
|
||||
|
||||
#endif /* _LINUX_ETHTOOL_H_ */
|
@ -1,32 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2010 Isilon Systems, Inc.
|
||||
* Copyright (c) 2010 iX Systems, Inc.
|
||||
* Copyright (c) 2010 Panasas, Inc.
|
||||
* Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice unmodified, this list of conditions, and the following
|
||||
* disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_INET_H_
|
||||
#define _LINUX_INET_H_
|
||||
#endif /* _LINUX_INET_H_ */
|
@ -588,15 +588,15 @@ struct fileops linuxfileops = {
|
||||
.fo_read = linux_file_read,
|
||||
.fo_write = invfo_rdwr,
|
||||
.fo_truncate = invfo_truncate,
|
||||
.fo_ioctl = linux_file_ioctl,
|
||||
.fo_poll = linux_file_poll,
|
||||
.fo_kqfilter = invfo_kqfilter,
|
||||
.fo_stat = linux_file_stat,
|
||||
.fo_fill_kinfo = linux_file_fill_kinfo,
|
||||
.fo_poll = linux_file_poll,
|
||||
.fo_close = linux_file_close,
|
||||
.fo_ioctl = linux_file_ioctl,
|
||||
.fo_chmod = invfo_chmod,
|
||||
.fo_chown = invfo_chown,
|
||||
.fo_sendfile = invfo_sendfile,
|
||||
.fo_fill_kinfo = linux_file_fill_kinfo,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -1036,6 +1036,7 @@ enum mlx4_net_trans_rule_id {
|
||||
MLX4_NET_TRANS_RULE_ID_TCP,
|
||||
MLX4_NET_TRANS_RULE_ID_UDP,
|
||||
MLX4_NET_TRANS_RULE_NUM, /* should be last */
|
||||
MLX4_NET_TRANS_RULE_DUMMY = -1, /* force enum to be signed */
|
||||
};
|
||||
|
||||
extern const u16 __sw_id_hw[];
|
||||
@ -1058,6 +1059,7 @@ enum mlx4_net_trans_promisc_mode {
|
||||
MLX4_FS_UC_SNIFFER,
|
||||
MLX4_FS_MC_SNIFFER,
|
||||
MLX4_FS_MODE_NUM, /* should be last */
|
||||
MLX4_FS_MODE_DUMMY = -1, /* force enum to be signed */
|
||||
};
|
||||
|
||||
struct mlx4_spec_eth {
|
||||
|
@ -121,7 +121,7 @@ void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto,
|
||||
#ifndef ETH_ALEN
|
||||
#define ETH_ALEN 6
|
||||
#endif
|
||||
static inline u64 mlx4_mac_to_u64(u8 *addr)
|
||||
static inline u64 mlx4_mac_to_u64(const u8 *addr)
|
||||
{
|
||||
u64 mac = 0;
|
||||
int i;
|
||||
|
@ -1,34 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2010 Isilon Systems, Inc.
|
||||
* Copyright (c) 2010 iX Systems, Inc.
|
||||
* Copyright (c) 2010 Panasas, Inc.
|
||||
* Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice unmodified, this list of conditions, and the following
|
||||
* disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_MOUNT_H_
|
||||
#define _LINUX_MOUNT_H_
|
||||
|
||||
|
||||
#endif /* _LINUX_MOUNT_H_ */
|
@ -40,7 +40,6 @@
|
||||
|
||||
#include <linux/completion.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/net.h>
|
||||
#include <linux/notifier.h>
|
||||
|
@ -31,6 +31,21 @@
|
||||
#define _LINUX_SCATTERLIST_H_
|
||||
|
||||
#include <linux/page.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
/*
|
||||
* SG table design.
|
||||
*
|
||||
* If flags bit 0 is set, then the sg field contains a pointer to the next sg
|
||||
* table list. Otherwise the next entry is at sg + 1, can be determined using
|
||||
* the sg_is_chain() function.
|
||||
*
|
||||
* If flags bit 1 is set, then this sg entry is the last element in a list,
|
||||
* can be determined using the sg_is_last() function.
|
||||
*
|
||||
* See sg_next().
|
||||
*
|
||||
*/
|
||||
|
||||
struct scatterlist {
|
||||
union {
|
||||
@ -49,6 +64,12 @@ struct sg_table {
|
||||
unsigned int orig_nents; /* original size of list */
|
||||
};
|
||||
|
||||
/*
|
||||
* Maximum number of entries that will be allocated in one piece, if
|
||||
* a list larger than this is required then chaining will be utilized.
|
||||
*/
|
||||
#define SG_MAX_SINGLE_ALLOC (PAGE_SIZE / sizeof(struct scatterlist))
|
||||
|
||||
#define sg_dma_address(sg) (sg)->address
|
||||
#define sg_dma_len(sg) (sg)->length
|
||||
#define sg_page(sg) (sg)->sl_un.page
|
||||
@ -99,6 +120,212 @@ sg_phys(struct scatterlist *sg)
|
||||
return sg_page(sg)->phys_addr + sg->offset;
|
||||
}
|
||||
|
||||
/**
|
||||
* sg_chain - Chain two sglists together
|
||||
* @prv: First scatterlist
|
||||
* @prv_nents: Number of entries in prv
|
||||
* @sgl: Second scatterlist
|
||||
*
|
||||
* Description:
|
||||
* Links @prv@ and @sgl@ together, to form a longer scatterlist.
|
||||
*
|
||||
**/
|
||||
static inline void
|
||||
sg_chain(struct scatterlist *prv, unsigned int prv_nents,
|
||||
struct scatterlist *sgl)
|
||||
{
|
||||
/*
|
||||
* offset and length are unused for chain entry. Clear them.
|
||||
*/
|
||||
struct scatterlist *sg = &prv[prv_nents - 1];
|
||||
|
||||
sg->offset = 0;
|
||||
sg->length = 0;
|
||||
|
||||
/*
|
||||
* Indicate a link pointer, and set the link to the second list.
|
||||
*/
|
||||
sg->flags = SG_CHAIN;
|
||||
sg->sl_un.sg = sgl;
|
||||
}
|
||||
|
||||
/**
|
||||
* sg_mark_end - Mark the end of the scatterlist
|
||||
* @sg: SG entryScatterlist
|
||||
*
|
||||
* Description:
|
||||
* Marks the passed in sg entry as the termination point for the sg
|
||||
* table. A call to sg_next() on this entry will return NULL.
|
||||
*
|
||||
**/
|
||||
static inline void sg_mark_end(struct scatterlist *sg)
|
||||
{
|
||||
sg->flags = SG_END;
|
||||
}
|
||||
|
||||
/**
|
||||
* __sg_free_table - Free a previously mapped sg table
|
||||
* @table: The sg table header to use
|
||||
* @max_ents: The maximum number of entries per single scatterlist
|
||||
*
|
||||
* Description:
|
||||
* Free an sg table previously allocated and setup with
|
||||
* __sg_alloc_table(). The @max_ents value must be identical to
|
||||
* that previously used with __sg_alloc_table().
|
||||
*
|
||||
**/
|
||||
static inline void
|
||||
__sg_free_table(struct sg_table *table, unsigned int max_ents)
|
||||
{
|
||||
struct scatterlist *sgl, *next;
|
||||
|
||||
if (unlikely(!table->sgl))
|
||||
return;
|
||||
|
||||
sgl = table->sgl;
|
||||
while (table->orig_nents) {
|
||||
unsigned int alloc_size = table->orig_nents;
|
||||
unsigned int sg_size;
|
||||
|
||||
/*
|
||||
* If we have more than max_ents segments left,
|
||||
* then assign 'next' to the sg table after the current one.
|
||||
* sg_size is then one less than alloc size, since the last
|
||||
* element is the chain pointer.
|
||||
*/
|
||||
if (alloc_size > max_ents) {
|
||||
next = sgl[max_ents - 1].sl_un.sg;
|
||||
alloc_size = max_ents;
|
||||
sg_size = alloc_size - 1;
|
||||
} else {
|
||||
sg_size = alloc_size;
|
||||
next = NULL;
|
||||
}
|
||||
|
||||
table->orig_nents -= sg_size;
|
||||
kfree(sgl);
|
||||
sgl = next;
|
||||
}
|
||||
|
||||
table->sgl = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* sg_free_table - Free a previously allocated sg table
|
||||
* @table: The mapped sg table header
|
||||
*
|
||||
**/
|
||||
static inline void
|
||||
sg_free_table(struct sg_table *table)
|
||||
{
|
||||
__sg_free_table(table, SG_MAX_SINGLE_ALLOC);
|
||||
}
|
||||
|
||||
/**
|
||||
* __sg_alloc_table - Allocate and initialize an sg table with given allocator
|
||||
* @table: The sg table header to use
|
||||
* @nents: Number of entries in sg list
|
||||
* @max_ents: The maximum number of entries the allocator returns per call
|
||||
* @gfp_mask: GFP allocation mask
|
||||
*
|
||||
* Description:
|
||||
* This function returns a @table @nents long. The allocator is
|
||||
* defined to return scatterlist chunks of maximum size @max_ents.
|
||||
* Thus if @nents is bigger than @max_ents, the scatterlists will be
|
||||
* chained in units of @max_ents.
|
||||
*
|
||||
* Notes:
|
||||
* If this function returns non-0 (eg failure), the caller must call
|
||||
* __sg_free_table() to cleanup any leftover allocations.
|
||||
*
|
||||
**/
|
||||
static inline int
|
||||
__sg_alloc_table(struct sg_table *table, unsigned int nents,
|
||||
unsigned int max_ents, gfp_t gfp_mask)
|
||||
{
|
||||
struct scatterlist *sg, *prv;
|
||||
unsigned int left;
|
||||
|
||||
memset(table, 0, sizeof(*table));
|
||||
|
||||
if (nents == 0)
|
||||
return -EINVAL;
|
||||
left = nents;
|
||||
prv = NULL;
|
||||
do {
|
||||
unsigned int sg_size, alloc_size = left;
|
||||
|
||||
if (alloc_size > max_ents) {
|
||||
alloc_size = max_ents;
|
||||
sg_size = alloc_size - 1;
|
||||
} else
|
||||
sg_size = alloc_size;
|
||||
|
||||
left -= sg_size;
|
||||
|
||||
sg = kmalloc(alloc_size * sizeof(struct scatterlist), gfp_mask);
|
||||
if (unlikely(!sg)) {
|
||||
/*
|
||||
* Adjust entry count to reflect that the last
|
||||
* entry of the previous table won't be used for
|
||||
* linkage. Without this, sg_kfree() may get
|
||||
* confused.
|
||||
*/
|
||||
if (prv)
|
||||
table->nents = ++table->orig_nents;
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
sg_init_table(sg, alloc_size);
|
||||
table->nents = table->orig_nents += sg_size;
|
||||
|
||||
/*
|
||||
* If this is the first mapping, assign the sg table header.
|
||||
* If this is not the first mapping, chain previous part.
|
||||
*/
|
||||
if (prv)
|
||||
sg_chain(prv, max_ents, sg);
|
||||
else
|
||||
table->sgl = sg;
|
||||
|
||||
/*
|
||||
* If no more entries after this one, mark the end
|
||||
*/
|
||||
if (!left)
|
||||
sg_mark_end(&sg[sg_size - 1]);
|
||||
|
||||
prv = sg;
|
||||
} while (left);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* sg_alloc_table - Allocate and initialize an sg table
|
||||
* @table: The sg table header to use
|
||||
* @nents: Number of entries in sg list
|
||||
* @gfp_mask: GFP allocation mask
|
||||
*
|
||||
* Description:
|
||||
* Allocate and initialize an sg table. If @nents@ is larger than
|
||||
* SG_MAX_SINGLE_ALLOC a chained sg table will be setup.
|
||||
*
|
||||
**/
|
||||
|
||||
static inline int
|
||||
sg_alloc_table(struct sg_table *table, unsigned int nents, gfp_t gfp_mask)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = __sg_alloc_table(table, nents, SG_MAX_SINGLE_ALLOC,
|
||||
gfp_mask);
|
||||
if (unlikely(ret))
|
||||
__sg_free_table(table, SG_MAX_SINGLE_ALLOC);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define for_each_sg(sglist, sg, sgmax, _itr) \
|
||||
for (_itr = 0, sg = (sglist); _itr < (sgmax); _itr++, sg = sg_next(sg))
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
||||
#ifndef _LINUX_VMALLOC_H_
|
||||
#define _LINUX_VMALLOC_H_
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <linux/page.h>
|
||||
|
||||
#define VM_MAP 0x0000
|
||||
#define PAGE_KERNEL 0x0000
|
||||
|
@ -41,7 +41,6 @@
|
||||
#include <linux/socket.h>
|
||||
#include <rdma/ib_verbs.h>
|
||||
#include <rdma/ib_pack.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/if_vlan.h>
|
||||
|
||||
struct rdma_addr_client {
|
||||
|
@ -38,6 +38,7 @@
|
||||
#define IB_SMI_H
|
||||
|
||||
#include <rdma/ib_mad.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#define IB_SMP_DATA_SIZE 64
|
||||
#define IB_SMP_MAX_PATH_HOPS 64
|
||||
|
@ -34,6 +34,7 @@
|
||||
#ifndef IB_USER_CM_H
|
||||
#define IB_USER_CM_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <rdma/ib_user_sa.h>
|
||||
|
||||
#define IB_USER_CM_ABI_VERSION 5
|
||||
|
Loading…
Reference in New Issue
Block a user