Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mlx4_core: Allow protocol drivers to find corresponding interfaces

Add a mechanism for mlx4 protocol drivers to get a pointer to other
drivers's device objects. For this, an exported function,
mlx4_get_protocol_dev() is added, which allows a driver to get some
other driver's device based on the protocol that the driver
implements. Two protocols are added: MLX4_PROTOCOL_IB and
MLX4_PROTOCOL_EN.

This will be used in mlx4 IBoE support so that mlx4_ib can find the
corresponding mlx4_en netdev.

Signed-off-by: Eli Cohen <eli@mellanox.co.il>

[ Clean up and rename a few things. - Roland ]

Signed-off-by: Roland Dreier <rolandd@cisco.com>

authored by

Eli Cohen and committed by
Roland Dreier
33c87f0a 2420b60b

+42 -3
+12 -3
drivers/net/mlx4/en_main.c
··· 124 124 return 0; 125 125 } 126 126 127 + static void *mlx4_en_get_netdev(struct mlx4_dev *dev, void *ctx, u8 port) 128 + { 129 + struct mlx4_en_dev *endev = ctx; 130 + 131 + return endev->pndev[port]; 132 + } 133 + 127 134 static void mlx4_en_event(struct mlx4_dev *dev, void *endev_ptr, 128 135 enum mlx4_dev_event event, int port) 129 136 { ··· 289 282 } 290 283 291 284 static struct mlx4_interface mlx4_en_interface = { 292 - .add = mlx4_en_add, 293 - .remove = mlx4_en_remove, 294 - .event = mlx4_en_event, 285 + .add = mlx4_en_add, 286 + .remove = mlx4_en_remove, 287 + .event = mlx4_en_event, 288 + .get_dev = mlx4_en_get_netdev, 289 + .protocol = MLX4_PROTOCOL_EN, 295 290 }; 296 291 297 292 static int __init mlx4_en_init(void)
+21
drivers/net/mlx4/intf.c
··· 161 161 162 162 mutex_unlock(&intf_mutex); 163 163 } 164 + 165 + void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto, int port) 166 + { 167 + struct mlx4_priv *priv = mlx4_priv(dev); 168 + struct mlx4_device_context *dev_ctx; 169 + unsigned long flags; 170 + void *result = NULL; 171 + 172 + spin_lock_irqsave(&priv->ctx_lock, flags); 173 + 174 + list_for_each_entry(dev_ctx, &priv->ctx_list, list) 175 + if (dev_ctx->intf->protocol == proto && dev_ctx->intf->get_dev) { 176 + result = dev_ctx->intf->get_dev(dev, dev_ctx->context, port); 177 + break; 178 + } 179 + 180 + spin_unlock_irqrestore(&priv->ctx_lock, flags); 181 + 182 + return result; 183 + } 184 + EXPORT_SYMBOL_GPL(mlx4_get_protocol_dev);
+9
include/linux/mlx4/driver.h
··· 44 44 MLX4_DEV_EVENT_PORT_REINIT, 45 45 }; 46 46 47 + enum mlx4_protocol { 48 + MLX4_PROTOCOL_IB, 49 + MLX4_PROTOCOL_EN, 50 + }; 51 + 47 52 struct mlx4_interface { 48 53 void * (*add) (struct mlx4_dev *dev); 49 54 void (*remove)(struct mlx4_dev *dev, void *context); 50 55 void (*event) (struct mlx4_dev *dev, void *context, 51 56 enum mlx4_dev_event event, int port); 57 + void * (*get_dev)(struct mlx4_dev *dev, void *context, u8 port); 52 58 struct list_head list; 59 + enum mlx4_protocol protocol; 53 60 }; 54 61 55 62 int mlx4_register_interface(struct mlx4_interface *intf); 56 63 void mlx4_unregister_interface(struct mlx4_interface *intf); 64 + 65 + void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto, int port); 57 66 58 67 #endif /* MLX4_DRIVER_H */