1 /* 2 * Copyright (c) 2006 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: 9 * 10 * Redistribution and use in source and binary forms, with or 11 * without modification, are permitted provided that the following 12 * conditions are met: 13 * 14 * - Redistributions of source code must retain the above 15 * copyright notice, this list of conditions and the following 16 * disclaimer. 17 * 18 * - Redistributions in binary form must reproduce the above 19 * copyright notice, this list of conditions and the following 20 * disclaimer in the documentation and/or other materials 21 * provided with the distribution. 22 * 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 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 #ifndef MLX4_DRIVER_H 34 #define MLX4_DRIVER_H 35 36 #include <dev/mlx4/device.h> 37 38 struct mlx4_dev; 39 40 #define MLX4_MAC_MASK 0xffffffffffffULL 41 #define MLX4_BE_SHORT_MASK cpu_to_be16(0xffff) 42 #define MLX4_BE_WORD_MASK cpu_to_be32(0xffffffff) 43 44 enum mlx4_dev_event { 45 MLX4_DEV_EVENT_CATASTROPHIC_ERROR, 46 MLX4_DEV_EVENT_PORT_UP, 47 MLX4_DEV_EVENT_PORT_DOWN, 48 MLX4_DEV_EVENT_PORT_REINIT, 49 MLX4_DEV_EVENT_PORT_MGMT_CHANGE, 50 MLX4_DEV_EVENT_SLAVE_INIT, 51 MLX4_DEV_EVENT_SLAVE_SHUTDOWN, 52 }; 53 54 struct mlx4_interface { 55 void * (*add) (struct mlx4_dev *dev); 56 void (*remove)(struct mlx4_dev *dev, void *context); 57 void (*event) (struct mlx4_dev *dev, void *context, 58 enum mlx4_dev_event event, unsigned long param); 59 void * (*get_dev)(struct mlx4_dev *dev, void *context, u8 port); 60 struct list_head list; 61 enum mlx4_protocol protocol; 62 }; 63 64 enum { 65 MLX4_MAX_DEVICES = 32, 66 MLX4_DEVS_TBL_SIZE = MLX4_MAX_DEVICES + 1, 67 MLX4_DBDF2VAL_STR_SIZE = 512, 68 MLX4_STR_NAME_SIZE = 64, 69 MLX4_MAX_BDF_VALS = 2, 70 MLX4_ENDOF_TBL = -1LL 71 }; 72 73 struct mlx4_dbdf2val { 74 u64 dbdf; 75 int val[MLX4_MAX_BDF_VALS]; 76 }; 77 78 struct mlx4_range { 79 int min; 80 int max; 81 }; 82 83 /* 84 * mlx4_dbdf2val_lst struct holds all the data needed to convert 85 * dbdf-to-value-list string into dbdf-to-value table. 86 * dbdf-to-value-list string is a comma separated list of dbdf-to-value strings. 87 * the format of dbdf-to-value string is: "[mmmm:]bb:dd.f-v1[;v2]" 88 * mmmm - Domain number (optional) 89 * bb - Bus number 90 * dd - device number 91 * f - Function number 92 * v1 - First value related to the domain-bus-device-function. 93 * v2 - Second value related to the domain-bus-device-function (optional). 94 * bb, dd - Two hexadecimal digits without preceding 0x. 95 * mmmm - Four hexadecimal digits without preceding 0x. 96 * f - One hexadecimal without preceding 0x. 97 * v1,v2 - Number with normal convention (e.g 100, 0xd3). 98 * dbdf-to-value-list string format: 99 * "[mmmm:]bb:dd.f-v1[;v2],[mmmm:]bb:dd.f-v1[;v2],..." 100 * 101 */ 102 struct mlx4_dbdf2val_lst { 103 char name[MLX4_STR_NAME_SIZE]; /* String name */ 104 char str[MLX4_DBDF2VAL_STR_SIZE]; /* dbdf2val list str */ 105 struct mlx4_dbdf2val tbl[MLX4_DEVS_TBL_SIZE];/* dbdf to value table */ 106 int num_vals; /* # of vals per dbdf */ 107 int def_val[MLX4_MAX_BDF_VALS]; /* Default values */ 108 struct mlx4_range range; /* Valid values range */ 109 }; 110 111 int mlx4_fill_dbdf2val_tbl(struct mlx4_dbdf2val_lst *dbdf2val_lst); 112 int mlx4_get_val(struct mlx4_dbdf2val *tbl, struct pci_dev *pdev, int idx, 113 int *val); 114 115 int mlx4_register_interface(struct mlx4_interface *intf); 116 void mlx4_unregister_interface(struct mlx4_interface *intf); 117 118 void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto, 119 int port); 120 121 #ifndef ETH_ALEN 122 #define ETH_ALEN 6 123 #endif 124 static inline u64 mlx4_mac_to_u64(const u8 *addr) 125 { 126 u64 mac = 0; 127 int i; 128 129 for (i = 0; i < ETH_ALEN; i++) { 130 mac <<= 8; 131 mac |= addr[i]; 132 } 133 return mac; 134 } 135 136 #endif /* MLX4_DRIVER_H */ 137