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 | |