Lines Matching +full:core +full:- +full:module
1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /* Copyright (c) 2016-2019 Mellanox Technologies. All rights reserved */
9 #include <linux/module.h>
13 #include "core.h"
32 struct mlxsw_core *core; member
42 u8 module; member
50 err = mlxsw_reg_query(mlxsw_m->core, MLXSW_REG(spad), spad_pl); in mlxsw_m_base_mac_get()
53 mlxsw_reg_spad_base_mac_memcpy_from(spad_pl, mlxsw_m->base_mac); in mlxsw_m_base_mac_get()
66 struct mlxsw_m *mlxsw_m = mlxsw_m_port->mlxsw_m; in mlxsw_m_port_get_devlink_port()
68 return mlxsw_core_port_devlink_port_get(mlxsw_m->core, in mlxsw_m_port_get_devlink_port()
69 mlxsw_m_port->local_port); in mlxsw_m_port_get_devlink_port()
82 struct mlxsw_m *mlxsw_m = mlxsw_m_port->mlxsw_m; in mlxsw_m_module_get_drvinfo()
84 strlcpy(drvinfo->driver, mlxsw_m->bus_info->device_kind, in mlxsw_m_module_get_drvinfo()
85 sizeof(drvinfo->driver)); in mlxsw_m_module_get_drvinfo()
86 snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), in mlxsw_m_module_get_drvinfo()
88 mlxsw_m->bus_info->fw_rev.major, in mlxsw_m_module_get_drvinfo()
89 mlxsw_m->bus_info->fw_rev.minor, in mlxsw_m_module_get_drvinfo()
90 mlxsw_m->bus_info->fw_rev.subminor); in mlxsw_m_module_get_drvinfo()
91 strlcpy(drvinfo->bus_info, mlxsw_m->bus_info->device_name, in mlxsw_m_module_get_drvinfo()
92 sizeof(drvinfo->bus_info)); in mlxsw_m_module_get_drvinfo()
99 struct mlxsw_core *core = mlxsw_m_port->mlxsw_m->core; in mlxsw_m_get_module_info() local
101 return mlxsw_env_get_module_info(core, mlxsw_m_port->module, modinfo); in mlxsw_m_get_module_info()
109 struct mlxsw_core *core = mlxsw_m_port->mlxsw_m->core; in mlxsw_m_get_module_eeprom() local
111 return mlxsw_env_get_module_eeprom(netdev, core, mlxsw_m_port->module, in mlxsw_m_get_module_eeprom()
129 err = mlxsw_reg_query(mlxsw_m->core, MLXSW_REG(pmlp), pmlp_pl); in mlxsw_m_port_module_info_get()
141 struct mlxsw_m *mlxsw_m = mlxsw_m_port->mlxsw_m; in mlxsw_m_port_dev_addr_get()
142 struct net_device *dev = mlxsw_m_port->dev; in mlxsw_m_port_dev_addr_get()
147 err = mlxsw_reg_query(mlxsw_m->core, MLXSW_REG(ppad), ppad_pl); in mlxsw_m_port_dev_addr_get()
150 mlxsw_reg_ppad_mac_memcpy_from(ppad_pl, dev->dev_addr); in mlxsw_m_port_dev_addr_get()
155 dev->dev_addr[ETH_ALEN - 1] += mlxsw_m_port->module + 1; in mlxsw_m_port_dev_addr_get()
160 mlxsw_m_port_create(struct mlxsw_m *mlxsw_m, u8 local_port, u8 module) in mlxsw_m_port_create() argument
166 err = mlxsw_core_port_init(mlxsw_m->core, local_port, in mlxsw_m_port_create()
167 module + 1, false, 0, false, in mlxsw_m_port_create()
168 0, mlxsw_m->base_mac, in mlxsw_m_port_create()
169 sizeof(mlxsw_m->base_mac)); in mlxsw_m_port_create()
171 dev_err(mlxsw_m->bus_info->dev, "Port %d: Failed to init core port\n", in mlxsw_m_port_create()
178 err = -ENOMEM; in mlxsw_m_port_create()
182 SET_NETDEV_DEV(dev, mlxsw_m->bus_info->dev); in mlxsw_m_port_create()
183 dev_net_set(dev, mlxsw_core_net(mlxsw_m->core)); in mlxsw_m_port_create()
185 mlxsw_m_port->dev = dev; in mlxsw_m_port_create()
186 mlxsw_m_port->mlxsw_m = mlxsw_m; in mlxsw_m_port_create()
187 mlxsw_m_port->local_port = local_port; in mlxsw_m_port_create()
188 mlxsw_m_port->module = module; in mlxsw_m_port_create()
190 dev->netdev_ops = &mlxsw_m_port_netdev_ops; in mlxsw_m_port_create()
191 dev->ethtool_ops = &mlxsw_m_port_ethtool_ops; in mlxsw_m_port_create()
195 dev_err(mlxsw_m->bus_info->dev, "Port %d: Unable to get port mac address\n", in mlxsw_m_port_create()
196 mlxsw_m_port->local_port); in mlxsw_m_port_create()
201 mlxsw_m->ports[local_port] = mlxsw_m_port; in mlxsw_m_port_create()
204 dev_err(mlxsw_m->bus_info->dev, "Port %d: Failed to register netdev\n", in mlxsw_m_port_create()
205 mlxsw_m_port->local_port); in mlxsw_m_port_create()
209 mlxsw_core_port_eth_set(mlxsw_m->core, mlxsw_m_port->local_port, in mlxsw_m_port_create()
215 mlxsw_m->ports[local_port] = NULL; in mlxsw_m_port_create()
219 mlxsw_core_port_fini(mlxsw_m->core, local_port); in mlxsw_m_port_create()
225 struct mlxsw_m_port *mlxsw_m_port = mlxsw_m->ports[local_port]; in mlxsw_m_port_remove()
227 mlxsw_core_port_clear(mlxsw_m->core, local_port, mlxsw_m); in mlxsw_m_port_remove()
228 unregister_netdev(mlxsw_m_port->dev); /* This calls ndo_stop */ in mlxsw_m_port_remove()
229 mlxsw_m->ports[local_port] = NULL; in mlxsw_m_port_remove()
230 free_netdev(mlxsw_m_port->dev); in mlxsw_m_port_remove()
231 mlxsw_core_port_fini(mlxsw_m->core, local_port); in mlxsw_m_port_remove()
237 u8 module, width; in mlxsw_m_port_module_map() local
241 err = mlxsw_m_port_module_info_get(mlxsw_m, local_port, &module, in mlxsw_m_port_module_map()
249 if (module == *last_module) in mlxsw_m_port_module_map()
251 *last_module = module; in mlxsw_m_port_module_map()
252 mlxsw_m->module_to_port[module] = ++mlxsw_m->max_ports; in mlxsw_m_port_module_map()
257 static void mlxsw_m_port_module_unmap(struct mlxsw_m *mlxsw_m, u8 module) in mlxsw_m_port_module_unmap() argument
259 mlxsw_m->module_to_port[module] = -1; in mlxsw_m_port_module_unmap()
264 unsigned int max_ports = mlxsw_core_max_ports(mlxsw_m->core); in mlxsw_m_ports_create()
269 mlxsw_m->ports = kcalloc(max_ports, sizeof(*mlxsw_m->ports), in mlxsw_m_ports_create()
271 if (!mlxsw_m->ports) in mlxsw_m_ports_create()
272 return -ENOMEM; in mlxsw_m_ports_create()
274 mlxsw_m->module_to_port = kmalloc_array(max_ports, sizeof(int), in mlxsw_m_ports_create()
276 if (!mlxsw_m->module_to_port) { in mlxsw_m_ports_create()
277 err = -ENOMEM; in mlxsw_m_ports_create()
281 /* Invalidate the entries of module to local port mapping array */ in mlxsw_m_ports_create()
283 mlxsw_m->module_to_port[i] = -1; in mlxsw_m_ports_create()
285 /* Fill out module to local port mapping array */ in mlxsw_m_ports_create()
293 for (i = 0; i < mlxsw_m->max_ports; i++) { in mlxsw_m_ports_create()
294 if (mlxsw_m->module_to_port[i] > 0) { in mlxsw_m_ports_create()
296 mlxsw_m->module_to_port[i], in mlxsw_m_ports_create()
306 for (i--; i >= 0; i--) { in mlxsw_m_ports_create()
307 if (mlxsw_m->module_to_port[i] > 0) in mlxsw_m_ports_create()
309 mlxsw_m->module_to_port[i]); in mlxsw_m_ports_create()
313 for (i--; i > 0; i--) in mlxsw_m_ports_create()
315 kfree(mlxsw_m->module_to_port); in mlxsw_m_ports_create()
317 kfree(mlxsw_m->ports); in mlxsw_m_ports_create()
325 for (i = 0; i < mlxsw_m->max_ports; i++) { in mlxsw_m_ports_remove()
326 if (mlxsw_m->module_to_port[i] > 0) { in mlxsw_m_ports_remove()
328 mlxsw_m->module_to_port[i]); in mlxsw_m_ports_remove()
333 kfree(mlxsw_m->module_to_port); in mlxsw_m_ports_remove()
334 kfree(mlxsw_m->ports); in mlxsw_m_ports_remove()
339 const struct mlxsw_fw_rev *rev = &mlxsw_m->bus_info->fw_rev; in mlxsw_m_fw_rev_validate()
348 …dev_err(mlxsw_m->bus_info->dev, "The firmware version %d.%d.%d is incompatible with the driver (re… in mlxsw_m_fw_rev_validate()
349 rev->major, rev->minor, rev->subminor, rev->major, in mlxsw_m_fw_rev_validate()
352 return -EINVAL; in mlxsw_m_fw_rev_validate()
362 mlxsw_m->core = mlxsw_core; in mlxsw_m_init()
363 mlxsw_m->bus_info = mlxsw_bus_info; in mlxsw_m_init()
371 dev_err(mlxsw_m->bus_info->dev, "Failed to get base mac\n"); in mlxsw_m_init()
377 dev_err(mlxsw_m->bus_info->dev, "Failed to create ports\n"); in mlxsw_m_init()