Deleted Added
full compact
mlx4_ib_ah.c (219820) mlx4_ib_ah.c (255932)
1/*
2 * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:

--- 16 unchanged lines hidden (view full) ---

25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 * SOFTWARE.
31 */
32
1/*
2 * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:

--- 16 unchanged lines hidden (view full) ---

25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 * SOFTWARE.
31 */
32
33#include "mlx4_ib.h"
33
34#include <sys/types.h>
35#include <sys/param.h>
36#include <sys/systm.h>
34#include <rdma/ib_addr.h>
37#include <rdma/ib_addr.h>
38#include <rdma/ib_cache.h>
39
40#include <linux/slab.h>
35#include <linux/inet.h>
36#include <linux/string.h>
41#include <linux/inet.h>
42#include <linux/string.h>
37#include <rdma/ib_cache.h>
38
43
44#include "mlx4_ib.h"
45
39int mlx4_ib_resolve_grh(struct mlx4_ib_dev *dev, const struct ib_ah_attr *ah_attr,
40 u8 *mac, int *is_mcast, u8 port)
41{
46int mlx4_ib_resolve_grh(struct mlx4_ib_dev *dev, const struct ib_ah_attr *ah_attr,
47 u8 *mac, int *is_mcast, u8 port)
48{
42 struct mlx4_ib_iboe *iboe = &dev->iboe;
43 struct in6_addr in6;
44
45 *is_mcast = 0;
49 struct in6_addr in6;
50
51 *is_mcast = 0;
46 spin_lock(&iboe->lock);
47 if (!iboe->netdevs[port - 1]) {
48 spin_unlock(&iboe->lock);
49 return -EINVAL;
50 }
51 spin_unlock(&iboe->lock);
52
53 memcpy(&in6, ah_attr->grh.dgid.raw, sizeof in6);
54 if (rdma_link_local_addr(&in6))
55 rdma_get_ll_mac(&in6, mac);
56 else if (rdma_is_multicast_addr(&in6)) {
57 rdma_get_mcast_mac(&in6, mac);
58 *is_mcast = 1;
59 } else

--- 27 unchanged lines hidden (view full) ---

87 --ah->av.ib.stat_rate;
88 }
89 ah->av.ib.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28);
90
91 return &ah->ibah;
92}
93
94static struct ib_ah *create_iboe_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
52
53 memcpy(&in6, ah_attr->grh.dgid.raw, sizeof in6);
54 if (rdma_link_local_addr(&in6))
55 rdma_get_ll_mac(&in6, mac);
56 else if (rdma_is_multicast_addr(&in6)) {
57 rdma_get_mcast_mac(&in6, mac);
58 *is_mcast = 1;
59 } else

--- 27 unchanged lines hidden (view full) ---

87 --ah->av.ib.stat_rate;
88 }
89 ah->av.ib.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28);
90
91 return &ah->ibah;
92}
93
94static struct ib_ah *create_iboe_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
95 struct mlx4_ib_ah *ah)
95 struct mlx4_ib_ah *ah)
96{
97 struct mlx4_ib_dev *ibdev = to_mdev(pd->device);
98 struct mlx4_dev *dev = ibdev->dev;
96{
97 struct mlx4_ib_dev *ibdev = to_mdev(pd->device);
98 struct mlx4_dev *dev = ibdev->dev;
99 union ib_gid sgid;
99 u8 mac[6];
100 int err;
101 int is_mcast;
102 u16 vlan_tag;
100 u8 mac[6];
101 int err;
102 int is_mcast;
103 u16 vlan_tag;
103 union ib_gid sgid;
104
105 err = mlx4_ib_resolve_grh(ibdev, ah_attr, mac, &is_mcast, ah_attr->port_num);
106 if (err)
107 return ERR_PTR(err);
108
109 memcpy(ah->av.eth.mac, mac, 6);
110 err = ib_get_cached_gid(pd->device, ah_attr->port_num, ah_attr->grh.sgid_index, &sgid);
111 if (err)

--- 13 unchanged lines hidden (view full) ---

125
126 /*
127 * HW requires multicast LID so we just choose one.
128 */
129 if (is_mcast)
130 ah->av.ib.dlid = cpu_to_be16(0xc000);
131
132 memcpy(ah->av.eth.dgid, ah_attr->grh.dgid.raw, 16);
104
105 err = mlx4_ib_resolve_grh(ibdev, ah_attr, mac, &is_mcast, ah_attr->port_num);
106 if (err)
107 return ERR_PTR(err);
108
109 memcpy(ah->av.eth.mac, mac, 6);
110 err = ib_get_cached_gid(pd->device, ah_attr->port_num, ah_attr->grh.sgid_index, &sgid);
111 if (err)

--- 13 unchanged lines hidden (view full) ---

125
126 /*
127 * HW requires multicast LID so we just choose one.
128 */
129 if (is_mcast)
130 ah->av.ib.dlid = cpu_to_be16(0xc000);
131
132 memcpy(ah->av.eth.dgid, ah_attr->grh.dgid.raw, 16);
133 ah->av.eth.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28);
133 ah->av.eth.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 29);
134
135 return &ah->ibah;
136}
137
138struct ib_ah *mlx4_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr)
139{
140 struct mlx4_ib_ah *ah;
141 struct ib_ah *ret;
142
143 ah = kzalloc(sizeof *ah, GFP_ATOMIC);
144 if (!ah)
145 return ERR_PTR(-ENOMEM);
146
147 if (rdma_port_get_link_layer(pd->device, ah_attr->port_num) == IB_LINK_LAYER_ETHERNET) {
148 if (!(ah_attr->ah_flags & IB_AH_GRH)) {
149 ret = ERR_PTR(-EINVAL);
134
135 return &ah->ibah;
136}
137
138struct ib_ah *mlx4_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr)
139{
140 struct mlx4_ib_ah *ah;
141 struct ib_ah *ret;
142
143 ah = kzalloc(sizeof *ah, GFP_ATOMIC);
144 if (!ah)
145 return ERR_PTR(-ENOMEM);
146
147 if (rdma_port_get_link_layer(pd->device, ah_attr->port_num) == IB_LINK_LAYER_ETHERNET) {
148 if (!(ah_attr->ah_flags & IB_AH_GRH)) {
149 ret = ERR_PTR(-EINVAL);
150 goto out;
151 } else {
150 } else {
152 /* TBD: need to handle the case when we get called
153 in an atomic context and there we might sleep. We
154 don't expect this currently since we're working with
155 link local addresses which we can translate without
156 going to sleep */
151 /*
152 * TBD: need to handle the case when we get
153 * called in an atomic context and there we
154 * might sleep. We don't expect this
155 * currently since we're working with link
156 * local addresses which we can translate
157 * without going to sleep.
158 */
157 ret = create_iboe_ah(pd, ah_attr, ah);
159 ret = create_iboe_ah(pd, ah_attr, ah);
158 if (IS_ERR(ret))
159 goto out;
160 else
161 return ret;
162 }
160 }
161
162 if (IS_ERR(ret))
163 kfree(ah);
164
165 return ret;
163 } else
164 return create_ib_ah(pd, ah_attr, ah); /* never fails */
166 } else
167 return create_ib_ah(pd, ah_attr, ah); /* never fails */
165
166out:
167 kfree(ah);
168 return ret;
169}
170
171int mlx4_ib_query_ah(struct ib_ah *ibah, struct ib_ah_attr *ah_attr)
172{
173 struct mlx4_ib_ah *ah = to_mah(ibah);
174 enum rdma_link_layer ll;
175
176 memset(ah_attr, 0, sizeof *ah_attr);

--- 20 unchanged lines hidden (view full) ---

197 return 0;
198}
199
200int mlx4_ib_destroy_ah(struct ib_ah *ah)
201{
202 kfree(to_mah(ah));
203 return 0;
204}
168}
169
170int mlx4_ib_query_ah(struct ib_ah *ibah, struct ib_ah_attr *ah_attr)
171{
172 struct mlx4_ib_ah *ah = to_mah(ibah);
173 enum rdma_link_layer ll;
174
175 memset(ah_attr, 0, sizeof *ah_attr);

--- 20 unchanged lines hidden (view full) ---

196 return 0;
197}
198
199int mlx4_ib_destroy_ah(struct ib_ah *ah)
200{
201 kfree(to_mah(ah));
202 return 0;
203}
205