1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2/*
3 * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved.
4 * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved.
5 */
6
7#ifndef RXE_H
8#define RXE_H
9
10#ifdef pr_fmt
11#undef pr_fmt
12#endif
13#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14
15#include <linux/module.h>
16#include <linux/skbuff.h>
17#include <linux/crc32.h>
18
19#include <rdma/ib_verbs.h>
20#include <rdma/ib_user_verbs.h>
21#include <rdma/ib_pack.h>
22#include <rdma/ib_smi.h>
23#include <rdma/ib_umem.h>
24#include <rdma/ib_cache.h>
25#include <rdma/ib_addr.h>
26#include <crypto/hash.h>
27
28#include "rxe_net.h"
29#include "rxe_opcode.h"
30#include "rxe_hdr.h"
31#include "rxe_param.h"
32#include "rxe_verbs.h"
33#include "rxe_loc.h"
34
35/*
36 * Version 1 and Version 2 are identical on 64 bit machines, but on 32 bit
37 * machines Version 2 has a different struct layout.
38 */
39#define RXE_UVERBS_ABI_VERSION		2
40
41#define RXE_ROCE_V2_SPORT		(0xc000)
42
43extern bool rxe_initialized;
44
45static inline u32 rxe_crc32(struct rxe_dev *rxe,
46			    u32 crc, void *next, size_t len)
47{
48	u32 retval;
49	int err;
50
51	SHASH_DESC_ON_STACK(shash, rxe->tfm);
52
53	shash->tfm = rxe->tfm;
54	*(u32 *)shash_desc_ctx(shash) = crc;
55	err = crypto_shash_update(shash, next, len);
56	if (unlikely(err)) {
57		pr_warn_ratelimited("failed crc calculation, err: %d\n", err);
58		return crc32_le(crc, next, len);
59	}
60
61	retval = *(u32 *)shash_desc_ctx(shash);
62	barrier_data(shash_desc_ctx(shash));
63	return retval;
64}
65
66void rxe_set_mtu(struct rxe_dev *rxe, unsigned int dev_mtu);
67
68int rxe_add(struct rxe_dev *rxe, unsigned int mtu, const char *ibdev_name);
69
70void rxe_rcv(struct sk_buff *skb);
71
72/* The caller must do a matching ib_device_put(&dev->ib_dev) */
73static inline struct rxe_dev *rxe_get_dev_from_net(struct net_device *ndev)
74{
75	struct ib_device *ibdev =
76		ib_device_get_by_netdev(ndev, RDMA_DRIVER_RXE);
77
78	if (!ibdev)
79		return NULL;
80	return container_of(ibdev, struct rxe_dev, ib_dev);
81}
82
83void rxe_port_up(struct rxe_dev *rxe);
84void rxe_port_down(struct rxe_dev *rxe);
85void rxe_set_port_state(struct rxe_dev *rxe);
86
87#endif /* RXE_H */
88