.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-or-later */ |
---|
1 | 2 | /* |
---|
2 | 3 | * Copyright Gavin Shan, IBM Corporation 2016. |
---|
3 | | - * |
---|
4 | | - * This program is free software; you can redistribute it and/or modify |
---|
5 | | - * it under the terms of the GNU General Public License as published by |
---|
6 | | - * the Free Software Foundation; either version 2 of the License, or |
---|
7 | | - * (at your option) any later version. |
---|
8 | 4 | */ |
---|
9 | 5 | |
---|
10 | 6 | #ifndef __NCSI_INTERNAL_H__ |
---|
.. | .. |
---|
67 | 63 | NCSI_MODE_FC, |
---|
68 | 64 | NCSI_MODE_MAX |
---|
69 | 65 | }; |
---|
| 66 | + |
---|
| 67 | +/* Supported media status bits for Mellanox Mac affinity command. |
---|
| 68 | + * Bit (0-2) for different protocol support; Bit 1 for RBT support, |
---|
| 69 | + * bit 1 for SMBUS support and bit 2 for PCIE support. Bit (3-5) |
---|
| 70 | + * for different protocol availability. Bit 4 for RBT, bit 4 for |
---|
| 71 | + * SMBUS and bit 5 for PCIE. |
---|
| 72 | + */ |
---|
| 73 | +enum { |
---|
| 74 | + MLX_MC_RBT_SUPPORT = 0x01, /* MC supports RBT */ |
---|
| 75 | + MLX_MC_RBT_AVL = 0x08, /* RBT medium is available */ |
---|
| 76 | +}; |
---|
| 77 | + |
---|
| 78 | +/* OEM Vendor Manufacture ID */ |
---|
| 79 | +#define NCSI_OEM_MFR_MLX_ID 0x8119 |
---|
| 80 | +#define NCSI_OEM_MFR_BCM_ID 0x113d |
---|
| 81 | +/* Broadcom specific OEM Command */ |
---|
| 82 | +#define NCSI_OEM_BCM_CMD_GMA 0x01 /* CMD ID for Get MAC */ |
---|
| 83 | +/* Mellanox specific OEM Command */ |
---|
| 84 | +#define NCSI_OEM_MLX_CMD_GMA 0x00 /* CMD ID for Get MAC */ |
---|
| 85 | +#define NCSI_OEM_MLX_CMD_GMA_PARAM 0x1b /* Parameter for GMA */ |
---|
| 86 | +#define NCSI_OEM_MLX_CMD_SMAF 0x01 /* CMD ID for Set MC Affinity */ |
---|
| 87 | +#define NCSI_OEM_MLX_CMD_SMAF_PARAM 0x07 /* Parameter for SMAF */ |
---|
| 88 | +/* OEM Command payload lengths*/ |
---|
| 89 | +#define NCSI_OEM_BCM_CMD_GMA_LEN 12 |
---|
| 90 | +#define NCSI_OEM_MLX_CMD_GMA_LEN 8 |
---|
| 91 | +#define NCSI_OEM_MLX_CMD_SMAF_LEN 60 |
---|
| 92 | +/* Offset in OEM request */ |
---|
| 93 | +#define MLX_SMAF_MAC_ADDR_OFFSET 8 /* Offset for MAC in SMAF */ |
---|
| 94 | +#define MLX_SMAF_MED_SUPPORT_OFFSET 14 /* Offset for medium in SMAF */ |
---|
| 95 | +/* Mac address offset in OEM response */ |
---|
| 96 | +#define BCM_MAC_ADDR_OFFSET 28 |
---|
| 97 | +#define MLX_MAC_ADDR_OFFSET 8 |
---|
| 98 | + |
---|
70 | 99 | |
---|
71 | 100 | struct ncsi_channel_version { |
---|
72 | 101 | u32 version; /* Supported BCD encoded NCSI version */ |
---|
.. | .. |
---|
171 | 200 | #define NCSI_RESERVED_CHANNEL 0x1f |
---|
172 | 201 | #define NCSI_CHANNEL_INDEX(c) ((c) & ((1 << NCSI_PACKAGE_SHIFT) - 1)) |
---|
173 | 202 | #define NCSI_TO_CHANNEL(p, c) (((p) << NCSI_PACKAGE_SHIFT) | (c)) |
---|
| 203 | +#define NCSI_MAX_PACKAGE 8 |
---|
| 204 | +#define NCSI_MAX_CHANNEL 32 |
---|
174 | 205 | |
---|
175 | 206 | struct ncsi_channel { |
---|
176 | 207 | unsigned char id; |
---|
.. | .. |
---|
209 | 240 | unsigned int channel_num; /* Number of channels */ |
---|
210 | 241 | struct list_head channels; /* List of chanels */ |
---|
211 | 242 | struct list_head node; /* Form list of packages */ |
---|
| 243 | + |
---|
| 244 | + bool multi_channel; /* Enable multiple channels */ |
---|
| 245 | + u32 channel_whitelist; /* Channels to configure */ |
---|
| 246 | + struct ncsi_channel *preferred_channel; /* Primary channel */ |
---|
212 | 247 | }; |
---|
213 | 248 | |
---|
214 | 249 | struct ncsi_request { |
---|
.. | .. |
---|
216 | 251 | bool used; /* Request that has been assigned */ |
---|
217 | 252 | unsigned int flags; /* NCSI request property */ |
---|
218 | 253 | #define NCSI_REQ_FLAG_EVENT_DRIVEN 1 |
---|
| 254 | +#define NCSI_REQ_FLAG_NETLINK_DRIVEN 2 |
---|
219 | 255 | struct ncsi_dev_priv *ndp; /* Associated NCSI device */ |
---|
220 | 256 | struct sk_buff *cmd; /* Associated NCSI command packet */ |
---|
221 | 257 | struct sk_buff *rsp; /* Associated NCSI response packet */ |
---|
222 | 258 | struct timer_list timer; /* Timer on waiting for response */ |
---|
223 | 259 | bool enabled; /* Time has been enabled or not */ |
---|
| 260 | + u32 snd_seq; /* netlink sending sequence number */ |
---|
| 261 | + u32 snd_portid; /* netlink portid of sender */ |
---|
| 262 | + struct nlmsghdr nlhdr; /* netlink message header */ |
---|
224 | 263 | }; |
---|
225 | 264 | |
---|
226 | 265 | enum { |
---|
.. | .. |
---|
229 | 268 | ncsi_dev_state_probe_deselect = 0x0201, |
---|
230 | 269 | ncsi_dev_state_probe_package, |
---|
231 | 270 | ncsi_dev_state_probe_channel, |
---|
| 271 | + ncsi_dev_state_probe_mlx_gma, |
---|
| 272 | + ncsi_dev_state_probe_mlx_smaf, |
---|
232 | 273 | ncsi_dev_state_probe_cis, |
---|
233 | 274 | ncsi_dev_state_probe_gvi, |
---|
234 | 275 | ncsi_dev_state_probe_gc, |
---|
.. | .. |
---|
236 | 277 | ncsi_dev_state_probe_dp, |
---|
237 | 278 | ncsi_dev_state_config_sp = 0x0301, |
---|
238 | 279 | ncsi_dev_state_config_cis, |
---|
| 280 | + ncsi_dev_state_config_oem_gma, |
---|
239 | 281 | ncsi_dev_state_config_clear_vids, |
---|
240 | 282 | ncsi_dev_state_config_svf, |
---|
241 | 283 | ncsi_dev_state_config_ev, |
---|
242 | 284 | ncsi_dev_state_config_sma, |
---|
243 | 285 | ncsi_dev_state_config_ebf, |
---|
244 | | -#if IS_ENABLED(CONFIG_IPV6) |
---|
245 | | - ncsi_dev_state_config_egmf, |
---|
246 | | -#endif |
---|
| 286 | + ncsi_dev_state_config_dgmf, |
---|
247 | 287 | ncsi_dev_state_config_ecnt, |
---|
248 | 288 | ncsi_dev_state_config_ec, |
---|
249 | 289 | ncsi_dev_state_config_ae, |
---|
.. | .. |
---|
269 | 309 | #define NCSI_DEV_PROBED 1 /* Finalized NCSI topology */ |
---|
270 | 310 | #define NCSI_DEV_HWA 2 /* Enabled HW arbitration */ |
---|
271 | 311 | #define NCSI_DEV_RESHUFFLE 4 |
---|
| 312 | +#define NCSI_DEV_RESET 8 /* Reset state of NC */ |
---|
| 313 | + unsigned int gma_flag; /* OEM GMA flag */ |
---|
272 | 314 | spinlock_t lock; /* Protect the NCSI device */ |
---|
273 | | -#if IS_ENABLED(CONFIG_IPV6) |
---|
274 | | - unsigned int inet6_addr_num; /* Number of IPv6 addresses */ |
---|
275 | | -#endif |
---|
| 315 | + unsigned int package_probe_id;/* Current ID during probe */ |
---|
276 | 316 | unsigned int package_num; /* Number of packages */ |
---|
277 | 317 | struct list_head packages; /* List of packages */ |
---|
278 | 318 | struct ncsi_channel *hot_channel; /* Channel was ever active */ |
---|
279 | | - struct ncsi_package *force_package; /* Force a specific package */ |
---|
280 | | - struct ncsi_channel *force_channel; /* Force a specific channel */ |
---|
281 | 319 | struct ncsi_request requests[256]; /* Request table */ |
---|
282 | 320 | unsigned int request_id; /* Last used request ID */ |
---|
283 | 321 | #define NCSI_REQ_START_IDX 1 |
---|
.. | .. |
---|
290 | 328 | struct list_head node; /* Form NCSI device list */ |
---|
291 | 329 | #define NCSI_MAX_VLAN_VIDS 15 |
---|
292 | 330 | struct list_head vlan_vids; /* List of active VLAN IDs */ |
---|
| 331 | + |
---|
| 332 | + bool multi_package; /* Enable multiple packages */ |
---|
| 333 | + bool mlx_multi_host; /* Enable multi host Mellanox */ |
---|
| 334 | + u32 package_whitelist; /* Packages to configure */ |
---|
293 | 335 | }; |
---|
294 | 336 | |
---|
295 | 337 | struct ncsi_cmd_arg { |
---|
.. | .. |
---|
305 | 347 | unsigned short words[8]; |
---|
306 | 348 | unsigned int dwords[4]; |
---|
307 | 349 | }; |
---|
| 350 | + unsigned char *data; /* NCSI OEM data */ |
---|
| 351 | + struct genl_info *info; /* Netlink information */ |
---|
308 | 352 | }; |
---|
309 | 353 | |
---|
310 | 354 | extern struct list_head ncsi_dev_list; |
---|
.. | .. |
---|
320 | 364 | list_for_each_entry_rcu(nc, &np->channels, node) |
---|
321 | 365 | |
---|
322 | 366 | /* Resources */ |
---|
| 367 | +int ncsi_reset_dev(struct ncsi_dev *nd); |
---|
323 | 368 | void ncsi_start_channel_monitor(struct ncsi_channel *nc); |
---|
324 | 369 | void ncsi_stop_channel_monitor(struct ncsi_channel *nc); |
---|
325 | 370 | struct ncsi_channel *ncsi_find_channel(struct ncsi_package *np, |
---|
.. | .. |
---|
340 | 385 | void ncsi_free_request(struct ncsi_request *nr); |
---|
341 | 386 | struct ncsi_dev *ncsi_find_dev(struct net_device *dev); |
---|
342 | 387 | int ncsi_process_next_channel(struct ncsi_dev_priv *ndp); |
---|
| 388 | +bool ncsi_channel_has_link(struct ncsi_channel *channel); |
---|
| 389 | +bool ncsi_channel_is_last(struct ncsi_dev_priv *ndp, |
---|
| 390 | + struct ncsi_channel *channel); |
---|
| 391 | +int ncsi_update_tx_channel(struct ncsi_dev_priv *ndp, |
---|
| 392 | + struct ncsi_package *np, |
---|
| 393 | + struct ncsi_channel *disable, |
---|
| 394 | + struct ncsi_channel *enable); |
---|
343 | 395 | |
---|
344 | 396 | /* Packet handlers */ |
---|
345 | 397 | u32 ncsi_calculate_checksum(unsigned char *data, int len); |
---|