brintos

brintos / linux-shallow public Read only

0
0
Text · 12.9 KiB · 7f7d560 Raw
534 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/****************************************************************************3 * Driver for Solarflare network controllers and boards4 * Copyright 2018 Solarflare Communications Inc.5 * Copyright 2019-2020 Xilinx Inc.6 *7 * This program is free software; you can redistribute it and/or modify it8 * under the terms of the GNU General Public License version 2 as published9 * by the Free Software Foundation, incorporated herein by reference.10 */11#include "net_driver.h"12#include "mcdi_port_common.h"13#include "mcdi_functions.h"14#include "efx_common.h"15#include "efx_channels.h"16#include "tx_common.h"17#include "ef100_netdev.h"18#include "ef100_ethtool.h"19#include "nic_common.h"20#include "ef100_nic.h"21#include "ef100_tx.h"22#include "ef100_regs.h"23#include "mcdi_filters.h"24#include "rx_common.h"25#include "ef100_sriov.h"26#include "tc_bindings.h"27#include "tc_encap_actions.h"28#include "efx_devlink.h"29 30static void ef100_update_name(struct efx_nic *efx)31{32	strcpy(efx->name, efx->net_dev->name);33}34 35static int ef100_alloc_vis(struct efx_nic *efx, unsigned int *allocated_vis)36{37	/* EF100 uses a single TXQ per channel, as all checksum offloading38	 * is configured in the TX descriptor, and there is no TX Pacer for39	 * HIGHPRI queues.40	 */41	unsigned int tx_vis = efx->n_tx_channels + efx->n_extra_tx_channels;42	unsigned int rx_vis = efx->n_rx_channels;43	unsigned int min_vis, max_vis;44	int rc;45 46	EFX_WARN_ON_PARANOID(efx->tx_queues_per_channel != 1);47 48	tx_vis += efx->n_xdp_channels * efx->xdp_tx_per_channel;49 50	max_vis = max(rx_vis, tx_vis);51	/* We require at least a single complete TX channel worth of queues. */52	min_vis = efx->tx_queues_per_channel;53 54	rc = efx_mcdi_alloc_vis(efx, min_vis, max_vis,55				NULL, allocated_vis);56 57	/* We retry allocating VIs by reallocating channels when we have not58	 * been able to allocate the maximum VIs.59	 */60	if (!rc && *allocated_vis < max_vis)61		rc = -EAGAIN;62 63	return rc;64}65 66static int ef100_remap_bar(struct efx_nic *efx, int max_vis)67{68	unsigned int uc_mem_map_size;69	void __iomem *membase;70 71	efx->max_vis = max_vis;72	uc_mem_map_size = PAGE_ALIGN(max_vis * efx->vi_stride);73 74	/* Extend the original UC mapping of the memory BAR */75	membase = ioremap(efx->membase_phys, uc_mem_map_size);76	if (!membase) {77		netif_err(efx, probe, efx->net_dev,78			  "could not extend memory BAR to %x\n",79			  uc_mem_map_size);80		return -ENOMEM;81	}82	iounmap(efx->membase);83	efx->membase = membase;84	return 0;85}86 87/* Context: process, rtnl_lock() held.88 * Note that the kernel will ignore our return code; this method89 * should really be a void.90 */91static int ef100_net_stop(struct net_device *net_dev)92{93	struct efx_nic *efx = efx_netdev_priv(net_dev);94 95	netif_dbg(efx, ifdown, efx->net_dev, "closing on CPU %d\n",96		  raw_smp_processor_id());97 98	efx_detach_reps(efx);99	netif_stop_queue(net_dev);100	efx_stop_all(efx);101	efx_mcdi_mac_fini_stats(efx);102	efx_disable_interrupts(efx);103	efx_clear_interrupt_affinity(efx);104	efx_nic_fini_interrupt(efx);105	efx_remove_filters(efx);106	efx_fini_napi(efx);107	efx_remove_channels(efx);108	efx_mcdi_free_vis(efx);109	efx_remove_interrupts(efx);110 111	efx->state = STATE_NET_DOWN;112 113	return 0;114}115 116/* Context: process, rtnl_lock() held. */117static int ef100_net_open(struct net_device *net_dev)118{119	struct efx_nic *efx = efx_netdev_priv(net_dev);120	unsigned int allocated_vis;121	int rc;122 123	ef100_update_name(efx);124	netif_dbg(efx, ifup, net_dev, "opening device on CPU %d\n",125		  raw_smp_processor_id());126 127	rc = efx_check_disabled(efx);128	if (rc)129		goto fail;130 131	rc = efx_probe_interrupts(efx);132	if (rc)133		goto fail;134 135	rc = efx_set_channels(efx);136	if (rc)137		goto fail;138 139	rc = efx_mcdi_free_vis(efx);140	if (rc)141		goto fail;142 143	rc = ef100_alloc_vis(efx, &allocated_vis);144	if (rc && rc != -EAGAIN)145		goto fail;146 147	/* Try one more time but with the maximum number of channels148	 * equal to the allocated VIs, which would more likely succeed.149	 */150	if (rc == -EAGAIN) {151		rc = efx_mcdi_free_vis(efx);152		if (rc)153			goto fail;154 155		efx_remove_interrupts(efx);156		efx->max_channels = allocated_vis;157 158		rc = efx_probe_interrupts(efx);159		if (rc)160			goto fail;161 162		rc = efx_set_channels(efx);163		if (rc)164			goto fail;165 166		rc = ef100_alloc_vis(efx, &allocated_vis);167		if (rc && rc != -EAGAIN)168			goto fail;169 170		/* It should be very unlikely that we failed here again, but in171		 * such a case we return ENOSPC.172		 */173		if (rc == -EAGAIN) {174			rc = -ENOSPC;175			goto fail;176		}177	}178 179	rc = efx_probe_channels(efx);180	if (rc)181		return rc;182 183	rc = ef100_remap_bar(efx, allocated_vis);184	if (rc)185		goto fail;186 187	efx_init_napi(efx);188 189	rc = efx_probe_filters(efx);190	if (rc)191		goto fail;192 193	rc = efx_nic_init_interrupt(efx);194	if (rc)195		goto fail;196	efx_set_interrupt_affinity(efx);197 198	rc = efx_enable_interrupts(efx);199	if (rc)200		goto fail;201 202	/* in case the MC rebooted while we were stopped, consume the change203	 * to the warm reboot count204	 */205	(void) efx_mcdi_poll_reboot(efx);206 207	rc = efx_mcdi_mac_init_stats(efx);208	if (rc)209		goto fail;210 211	efx_start_all(efx);212 213	/* Link state detection is normally event-driven; we have214	 * to poll now because we could have missed a change215	 */216	mutex_lock(&efx->mac_lock);217	if (efx_mcdi_phy_poll(efx))218		efx_link_status_changed(efx);219	mutex_unlock(&efx->mac_lock);220 221	efx->state = STATE_NET_UP;222	if (netif_running(efx->net_dev))223		efx_attach_reps(efx);224 225	return 0;226 227fail:228	ef100_net_stop(net_dev);229	return rc;230}231 232/* Initiate a packet transmission.  We use one channel per CPU233 * (sharing when we have more CPUs than channels).234 *235 * Context: non-blocking.236 * Note that returning anything other than NETDEV_TX_OK will cause the237 * OS to free the skb.238 */239static netdev_tx_t ef100_hard_start_xmit(struct sk_buff *skb,240					 struct net_device *net_dev)241{242	struct efx_nic *efx = efx_netdev_priv(net_dev);243 244	return __ef100_hard_start_xmit(skb, efx, net_dev, NULL);245}246 247netdev_tx_t __ef100_hard_start_xmit(struct sk_buff *skb,248				    struct efx_nic *efx,249				    struct net_device *net_dev,250				    struct efx_rep *efv)251{252	struct efx_tx_queue *tx_queue;253	struct efx_channel *channel;254	int rc;255 256	channel = efx_get_tx_channel(efx, skb_get_queue_mapping(skb));257	netif_vdbg(efx, tx_queued, efx->net_dev,258		   "%s len %d data %d channel %d\n", __func__,259		   skb->len, skb->data_len, channel->channel);260	if (!efx->n_channels || !efx->n_tx_channels || !channel) {261		netif_stop_queue(net_dev);262		dev_kfree_skb_any(skb);263		goto err;264	}265 266	tx_queue = &channel->tx_queue[0];267	rc = __ef100_enqueue_skb(tx_queue, skb, efv);268	if (rc == 0)269		return NETDEV_TX_OK;270 271err:272	net_dev->stats.tx_dropped++;273	return NETDEV_TX_OK;274}275 276static const struct net_device_ops ef100_netdev_ops = {277	.ndo_open               = ef100_net_open,278	.ndo_stop               = ef100_net_stop,279	.ndo_start_xmit         = ef100_hard_start_xmit,280	.ndo_tx_timeout         = efx_watchdog,281	.ndo_get_stats64        = efx_net_stats,282	.ndo_change_mtu         = efx_change_mtu,283	.ndo_validate_addr      = eth_validate_addr,284	.ndo_set_mac_address    = efx_set_mac_address,285	.ndo_set_rx_mode        = efx_set_rx_mode, /* Lookout */286	.ndo_set_features       = efx_set_features,287	.ndo_get_phys_port_id   = efx_get_phys_port_id,288	.ndo_get_phys_port_name = efx_get_phys_port_name,289#ifdef CONFIG_RFS_ACCEL290	.ndo_rx_flow_steer      = efx_filter_rfs,291#endif292#ifdef CONFIG_SFC_SRIOV293	.ndo_setup_tc		= efx_tc_setup,294#endif295};296 297/*	Netdev registration298 */299int ef100_netdev_event(struct notifier_block *this,300		       unsigned long event, void *ptr)301{302	struct efx_nic *efx = container_of(this, struct efx_nic, netdev_notifier);303	struct net_device *net_dev = netdev_notifier_info_to_dev(ptr);304	struct ef100_nic_data *nic_data = efx->nic_data;305	int err;306 307	if (efx->net_dev == net_dev &&308	    (event == NETDEV_CHANGENAME || event == NETDEV_REGISTER))309		ef100_update_name(efx);310 311	if (!nic_data->grp_mae)312		return NOTIFY_DONE;313	err = efx_tc_netdev_event(efx, event, net_dev);314	if (err & NOTIFY_STOP_MASK)315		return err;316 317	return NOTIFY_DONE;318}319 320static int ef100_netevent_event(struct notifier_block *this,321				unsigned long event, void *ptr)322{323	struct efx_nic *efx = container_of(this, struct efx_nic, netevent_notifier);324	struct ef100_nic_data *nic_data = efx->nic_data;325	int err;326 327	if (!nic_data->grp_mae)328		return NOTIFY_DONE;329	err = efx_tc_netevent_event(efx, event, ptr);330	if (err & NOTIFY_STOP_MASK)331		return err;332 333	return NOTIFY_DONE;334};335 336static int ef100_register_netdev(struct efx_nic *efx)337{338	struct net_device *net_dev = efx->net_dev;339	int rc;340 341	net_dev->watchdog_timeo = 5 * HZ;342	net_dev->irq = efx->pci_dev->irq;343	net_dev->netdev_ops = &ef100_netdev_ops;344	net_dev->min_mtu = EFX_MIN_MTU;345	net_dev->max_mtu = EFX_MAX_MTU;346	net_dev->ethtool_ops = &ef100_ethtool_ops;347 348	rtnl_lock();349 350	rc = dev_alloc_name(net_dev, net_dev->name);351	if (rc < 0)352		goto fail_locked;353	ef100_update_name(efx);354 355	rc = register_netdevice(net_dev);356	if (rc)357		goto fail_locked;358 359	/* Always start with carrier off; PHY events will detect the link */360	netif_carrier_off(net_dev);361 362	efx->state = STATE_NET_DOWN;363	rtnl_unlock();364	efx_init_mcdi_logging(efx);365 366	return 0;367 368fail_locked:369	rtnl_unlock();370	netif_err(efx, drv, efx->net_dev, "could not register net dev\n");371	return rc;372}373 374static void ef100_unregister_netdev(struct efx_nic *efx)375{376	if (efx_dev_registered(efx)) {377		efx_fini_mcdi_logging(efx);378		efx->state = STATE_PROBED;379		unregister_netdev(efx->net_dev);380	}381}382 383void ef100_remove_netdev(struct efx_probe_data *probe_data)384{385	struct efx_nic *efx = &probe_data->efx;386 387	if (!efx->net_dev)388		return;389 390	rtnl_lock();391	dev_close(efx->net_dev);392	rtnl_unlock();393 394	unregister_netdevice_notifier(&efx->netdev_notifier);395	unregister_netevent_notifier(&efx->netevent_notifier);396#if defined(CONFIG_SFC_SRIOV)397	if (!efx->type->is_vf)398		efx_ef100_pci_sriov_disable(efx, true);399#endif400 401	efx_fini_devlink_lock(efx);402	ef100_unregister_netdev(efx);403 404#ifdef CONFIG_SFC_SRIOV405	ef100_pf_unset_devlink_port(efx);406	efx_fini_tc(efx);407#endif408 409	down_write(&efx->filter_sem);410	efx_mcdi_filter_table_remove(efx);411	up_write(&efx->filter_sem);412	efx_fini_channels(efx);413	kfree(efx->phy_data);414	efx->phy_data = NULL;415 416	efx_fini_devlink_and_unlock(efx);417 418	free_netdev(efx->net_dev);419	efx->net_dev = NULL;420	efx->state = STATE_PROBED;421}422 423int ef100_probe_netdev(struct efx_probe_data *probe_data)424{425	struct efx_nic *efx = &probe_data->efx;426	struct efx_probe_data **probe_ptr;427	struct ef100_nic_data *nic_data;428	struct net_device *net_dev;429	int rc;430 431	if (efx->mcdi->fn_flags &432			(1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_NO_ACTIVE_PORT)) {433		pci_info(efx->pci_dev, "No network port on this PCI function");434		return 0;435	}436 437	/* Allocate and initialise a struct net_device */438	net_dev = alloc_etherdev_mq(sizeof(probe_data), EFX_MAX_CORE_TX_QUEUES);439	if (!net_dev)440		return -ENOMEM;441	probe_ptr = netdev_priv(net_dev);442	*probe_ptr = probe_data;443	efx->net_dev = net_dev;444	SET_NETDEV_DEV(net_dev, &efx->pci_dev->dev);445 446	/* enable all supported features except rx-fcs and rx-all */447	net_dev->features |= efx->type->offload_features &448			     ~(NETIF_F_RXFCS | NETIF_F_RXALL);449	net_dev->hw_features |= efx->type->offload_features;450	net_dev->hw_enc_features |= efx->type->offload_features;451	net_dev->vlan_features |= NETIF_F_HW_CSUM | NETIF_F_SG |452				  NETIF_F_HIGHDMA | NETIF_F_ALL_TSO;453	netif_set_tso_max_segs(net_dev,454			       ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS_DEFAULT);455	efx->mdio.dev = net_dev;456 457	rc = efx_ef100_init_datapath_caps(efx);458	if (rc < 0)459		goto fail;460 461	rc = ef100_phy_probe(efx);462	if (rc)463		goto fail;464 465	rc = efx_init_channels(efx);466	if (rc)467		goto fail;468 469	down_write(&efx->filter_sem);470	rc = ef100_filter_table_probe(efx);471	up_write(&efx->filter_sem);472	if (rc)473		goto fail;474 475	netdev_rss_key_fill(efx->rss_context.rx_hash_key,476			    sizeof(efx->rss_context.rx_hash_key));477 478	/* Don't fail init if RSS setup doesn't work. */479	efx_mcdi_push_default_indir_table(efx, efx->n_rx_channels);480 481	nic_data = efx->nic_data;482	rc = ef100_get_mac_address(efx, net_dev->perm_addr, CLIENT_HANDLE_SELF,483				   efx->type->is_vf);484	if (rc)485		return rc;486	/* Assign MAC address */487	eth_hw_addr_set(net_dev, net_dev->perm_addr);488	ether_addr_copy(nic_data->port_id, net_dev->perm_addr);489 490	/* devlink creation, registration and lock */491	rc = efx_probe_devlink_and_lock(efx);492	if (rc)493		pci_info(efx->pci_dev, "devlink registration failed");494 495	rc = ef100_register_netdev(efx);496	if (rc)497		goto fail;498 499	if (!efx->type->is_vf) {500		rc = ef100_probe_netdev_pf(efx);501		if (rc)502			goto fail;503#ifdef CONFIG_SFC_SRIOV504		ef100_pf_set_devlink_port(efx);505#endif506	}507 508	efx->netdev_notifier.notifier_call = ef100_netdev_event;509	rc = register_netdevice_notifier(&efx->netdev_notifier);510	if (rc) {511		netif_err(efx, probe, efx->net_dev,512			  "Failed to register netdevice notifier, rc=%d\n", rc);513		goto fail;514	}515 516	efx->netevent_notifier.notifier_call = ef100_netevent_event;517	rc = register_netevent_notifier(&efx->netevent_notifier);518	if (rc) {519		netif_err(efx, probe, efx->net_dev,520			  "Failed to register netevent notifier, rc=%d\n", rc);521		goto fail;522	}523 524	efx_probe_devlink_unlock(efx);525	return rc;526fail:527#ifdef CONFIG_SFC_SRIOV528	/* remove devlink port if does exist */529	ef100_pf_unset_devlink_port(efx);530#endif531	efx_probe_devlink_unlock(efx);532	return rc;533}534