| .. | .. |
|---|
| 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); |
|---|