Skip to content

Commit 98ff4c7

Browse files
jco-xilinxdavem330
authored andcommitted
sfc: Separate netdev probe/remove from PCI probe/remove
The netdev probe will be used when moving from vDPA to EF100 BAR config. The netdev remove will be used when moving from EF100 to vDPA BAR config. In the process, change several log messages to pci_ instead of netif_ to remove the "(unregistered net_device)" text. Signed-off-by: Jonathan Cooper <jonathan.s.cooper@amd.com> Co-developed-by: Martin Habets <habetsm.xilinx@gmail.com> Signed-off-by: Martin Habets <habetsm.xilinx@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 7592d75 commit 98ff4c7

File tree

8 files changed

+183
-148
lines changed

8 files changed

+183
-148
lines changed

drivers/net/ethernet/sfc/ef100.c

Lines changed: 20 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -423,44 +423,32 @@ static int ef100_pci_find_func_ctrl_window(struct efx_nic *efx,
423423
*/
424424
static void ef100_pci_remove(struct pci_dev *pci_dev)
425425
{
426+
struct efx_nic *efx = pci_get_drvdata(pci_dev);
426427
struct efx_probe_data *probe_data;
427-
struct efx_nic *efx;
428428

429-
efx = pci_get_drvdata(pci_dev);
430429
if (!efx)
431430
return;
432431

433-
rtnl_lock();
434-
dev_close(efx->net_dev);
435-
rtnl_unlock();
436-
437-
/* Unregistering our netdev notifier triggers unbinding of TC indirect
438-
* blocks, so we have to do it before PCI removal.
439-
*/
440-
unregister_netdevice_notifier(&efx->netdev_notifier);
441-
#if defined(CONFIG_SFC_SRIOV)
442-
if (!efx->type->is_vf)
443-
efx_ef100_pci_sriov_disable(efx);
444-
#endif
432+
probe_data = container_of(efx, struct efx_probe_data, efx);
433+
ef100_remove_netdev(probe_data);
434+
445435
ef100_remove(efx);
446436
efx_fini_io(efx);
447-
netif_dbg(efx, drv, efx->net_dev, "shutdown successful\n");
437+
438+
pci_dbg(pci_dev, "shutdown successful\n");
439+
440+
pci_disable_pcie_error_reporting(pci_dev);
448441

449442
pci_set_drvdata(pci_dev, NULL);
450443
efx_fini_struct(efx);
451-
free_netdev(efx->net_dev);
452-
probe_data = container_of(efx, struct efx_probe_data, efx);
453444
kfree(probe_data);
454-
455-
pci_disable_pcie_error_reporting(pci_dev);
456445
};
457446

458447
static int ef100_pci_probe(struct pci_dev *pci_dev,
459448
const struct pci_device_id *entry)
460449
{
461-
struct efx_probe_data *probe_data, **probe_ptr;
462450
struct ef100_func_ctl_window fcw = { 0 };
463-
struct net_device *net_dev;
451+
struct efx_probe_data *probe_data;
464452
struct efx_nic *efx;
465453
int rc;
466454

@@ -471,31 +459,22 @@ static int ef100_pci_probe(struct pci_dev *pci_dev,
471459
probe_data->pci_dev = pci_dev;
472460
efx = &probe_data->efx;
473461

474-
/* Allocate and initialise a struct net_device */
475-
net_dev = alloc_etherdev_mq(sizeof(probe_data), EFX_MAX_CORE_TX_QUEUES);
476-
if (!net_dev)
477-
return -ENOMEM;
478-
probe_ptr = netdev_priv(net_dev);
479-
*probe_ptr = probe_data;
480462
efx->type = (const struct efx_nic_type *)entry->driver_data;
481463

464+
efx->pci_dev = pci_dev;
482465
pci_set_drvdata(pci_dev, efx);
483-
SET_NETDEV_DEV(net_dev, &pci_dev->dev);
484-
efx->net_dev = net_dev;
485466
rc = efx_init_struct(efx, pci_dev);
486467
if (rc)
487468
goto fail;
488469

489-
efx->mdio.dev = net_dev;
490470
efx->vi_stride = EF100_DEFAULT_VI_STRIDE;
491-
netif_info(efx, probe, efx->net_dev,
492-
"Solarflare EF100 NIC detected\n");
471+
pci_info(pci_dev, "Solarflare EF100 NIC detected\n");
493472

494473
rc = ef100_pci_find_func_ctrl_window(efx, &fcw);
495474
if (rc) {
496-
netif_err(efx, probe, efx->net_dev,
497-
"Error looking for ef100 function control window, rc=%d\n",
498-
rc);
475+
pci_err(pci_dev,
476+
"Error looking for ef100 function control window, rc=%d\n",
477+
rc);
499478
goto fail;
500479
}
501480

@@ -507,8 +486,7 @@ static int ef100_pci_probe(struct pci_dev *pci_dev,
507486
}
508487

509488
if (fcw.offset > pci_resource_len(efx->pci_dev, fcw.bar) - ESE_GZ_FCW_LEN) {
510-
netif_err(efx, probe, efx->net_dev,
511-
"Func control window overruns BAR\n");
489+
pci_err(pci_dev, "Func control window overruns BAR\n");
512490
rc = -EIO;
513491
goto fail;
514492
}
@@ -522,19 +500,16 @@ static int ef100_pci_probe(struct pci_dev *pci_dev,
522500

523501
efx->reg_base = fcw.offset;
524502

525-
efx->netdev_notifier.notifier_call = ef100_netdev_event;
526-
rc = register_netdevice_notifier(&efx->netdev_notifier);
527-
if (rc) {
528-
netif_err(efx, probe, efx->net_dev,
529-
"Failed to register netdevice notifier, rc=%d\n", rc);
503+
rc = efx->type->probe(efx);
504+
if (rc)
530505
goto fail;
531-
}
532506

533-
rc = efx->type->probe(efx);
507+
efx->state = STATE_PROBED;
508+
rc = ef100_probe_netdev(probe_data);
534509
if (rc)
535510
goto fail;
536511

537-
netif_dbg(efx, probe, efx->net_dev, "initialisation successful\n");
512+
pci_dbg(pci_dev, "initialisation successful\n");
538513

539514
return 0;
540515

drivers/net/ethernet/sfc/ef100_netdev.c

Lines changed: 113 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "ef100_regs.h"
2323
#include "mcdi_filters.h"
2424
#include "rx_common.h"
25+
#include "ef100_sriov.h"
2526

2627
static void ef100_update_name(struct efx_nic *efx)
2728
{
@@ -243,13 +244,14 @@ int ef100_netdev_event(struct notifier_block *this,
243244
struct efx_nic *efx = container_of(this, struct efx_nic, netdev_notifier);
244245
struct net_device *net_dev = netdev_notifier_info_to_dev(ptr);
245246

246-
if (efx->net_dev == net_dev && event == NETDEV_CHANGENAME)
247+
if (efx->net_dev == net_dev &&
248+
(event == NETDEV_CHANGENAME || event == NETDEV_REGISTER))
247249
ef100_update_name(efx);
248250

249251
return NOTIFY_DONE;
250252
}
251253

252-
int ef100_register_netdev(struct efx_nic *efx)
254+
static int ef100_register_netdev(struct efx_nic *efx)
253255
{
254256
struct net_device *net_dev = efx->net_dev;
255257
int rc;
@@ -287,11 +289,119 @@ int ef100_register_netdev(struct efx_nic *efx)
287289
return rc;
288290
}
289291

290-
void ef100_unregister_netdev(struct efx_nic *efx)
292+
static void ef100_unregister_netdev(struct efx_nic *efx)
291293
{
292294
if (efx_dev_registered(efx)) {
293295
efx_fini_mcdi_logging(efx);
294296
efx->state = STATE_PROBED;
295297
unregister_netdev(efx->net_dev);
296298
}
297299
}
300+
301+
void ef100_remove_netdev(struct efx_probe_data *probe_data)
302+
{
303+
struct efx_nic *efx = &probe_data->efx;
304+
305+
if (!efx->net_dev)
306+
return;
307+
308+
rtnl_lock();
309+
dev_close(efx->net_dev);
310+
rtnl_unlock();
311+
312+
unregister_netdevice_notifier(&efx->netdev_notifier);
313+
#if defined(CONFIG_SFC_SRIOV)
314+
if (!efx->type->is_vf)
315+
efx_ef100_pci_sriov_disable(efx);
316+
#endif
317+
318+
ef100_unregister_netdev(efx);
319+
320+
down_write(&efx->filter_sem);
321+
efx_mcdi_filter_table_remove(efx);
322+
up_write(&efx->filter_sem);
323+
efx_fini_channels(efx);
324+
kfree(efx->phy_data);
325+
efx->phy_data = NULL;
326+
327+
free_netdev(efx->net_dev);
328+
efx->net_dev = NULL;
329+
efx->state = STATE_PROBED;
330+
}
331+
332+
int ef100_probe_netdev(struct efx_probe_data *probe_data)
333+
{
334+
struct efx_nic *efx = &probe_data->efx;
335+
struct efx_probe_data **probe_ptr;
336+
struct net_device *net_dev;
337+
int rc;
338+
339+
if (efx->mcdi->fn_flags &
340+
(1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_NO_ACTIVE_PORT)) {
341+
pci_info(efx->pci_dev, "No network port on this PCI function");
342+
return 0;
343+
}
344+
345+
/* Allocate and initialise a struct net_device */
346+
net_dev = alloc_etherdev_mq(sizeof(probe_data), EFX_MAX_CORE_TX_QUEUES);
347+
if (!net_dev)
348+
return -ENOMEM;
349+
probe_ptr = netdev_priv(net_dev);
350+
*probe_ptr = probe_data;
351+
efx->net_dev = net_dev;
352+
SET_NETDEV_DEV(net_dev, &efx->pci_dev->dev);
353+
354+
net_dev->features |= efx->type->offload_features;
355+
net_dev->hw_features |= efx->type->offload_features;
356+
net_dev->hw_enc_features |= efx->type->offload_features;
357+
net_dev->vlan_features |= NETIF_F_HW_CSUM | NETIF_F_SG |
358+
NETIF_F_HIGHDMA | NETIF_F_ALL_TSO;
359+
netif_set_tso_max_segs(net_dev,
360+
ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS_DEFAULT);
361+
efx->mdio.dev = net_dev;
362+
363+
rc = efx_ef100_init_datapath_caps(efx);
364+
if (rc < 0)
365+
goto fail;
366+
367+
rc = ef100_phy_probe(efx);
368+
if (rc)
369+
goto fail;
370+
371+
rc = efx_init_channels(efx);
372+
if (rc)
373+
goto fail;
374+
375+
down_write(&efx->filter_sem);
376+
rc = ef100_filter_table_probe(efx);
377+
up_write(&efx->filter_sem);
378+
if (rc)
379+
goto fail;
380+
381+
netdev_rss_key_fill(efx->rss_context.rx_hash_key,
382+
sizeof(efx->rss_context.rx_hash_key));
383+
384+
/* Don't fail init if RSS setup doesn't work. */
385+
efx_mcdi_push_default_indir_table(efx, efx->n_rx_channels);
386+
387+
rc = ef100_register_netdev(efx);
388+
if (rc)
389+
goto fail;
390+
391+
if (!efx->type->is_vf) {
392+
rc = ef100_probe_netdev_pf(efx);
393+
if (rc)
394+
goto fail;
395+
}
396+
397+
efx->netdev_notifier.notifier_call = ef100_netdev_event;
398+
rc = register_netdevice_notifier(&efx->netdev_notifier);
399+
if (rc) {
400+
netif_err(efx, probe, efx->net_dev,
401+
"Failed to register netdevice notifier, rc=%d\n", rc);
402+
goto fail;
403+
}
404+
405+
fail:
406+
return rc;
407+
}

drivers/net/ethernet/sfc/ef100_netdev.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@
1313

1414
int ef100_netdev_event(struct notifier_block *this,
1515
unsigned long event, void *ptr);
16-
int ef100_register_netdev(struct efx_nic *efx);
17-
void ef100_unregister_netdev(struct efx_nic *efx);
16+
int ef100_probe_netdev(struct efx_probe_data *probe_data);
17+
void ef100_remove_netdev(struct efx_probe_data *probe_data);

0 commit comments

Comments
 (0)