@@ -28,6 +28,89 @@ MODULE_DESCRIPTION(DRV_STRING);
28
28
MODULE_LICENSE ("GPL" );
29
29
MODULE_DEVICE_TABLE (pci , rvu_rep_id_table );
30
30
31
+ static int rvu_rep_notify_pfvf (struct otx2_nic * priv , u16 event ,
32
+ struct rep_event * data );
33
+
34
+ static int rvu_rep_dl_port_fn_hw_addr_get (struct devlink_port * port ,
35
+ u8 * hw_addr , int * hw_addr_len ,
36
+ struct netlink_ext_ack * extack )
37
+ {
38
+ struct rep_dev * rep = container_of (port , struct rep_dev , dl_port );
39
+
40
+ ether_addr_copy (hw_addr , rep -> mac );
41
+ * hw_addr_len = ETH_ALEN ;
42
+ return 0 ;
43
+ }
44
+
45
+ static int rvu_rep_dl_port_fn_hw_addr_set (struct devlink_port * port ,
46
+ const u8 * hw_addr , int hw_addr_len ,
47
+ struct netlink_ext_ack * extack )
48
+ {
49
+ struct rep_dev * rep = container_of (port , struct rep_dev , dl_port );
50
+ struct otx2_nic * priv = rep -> mdev ;
51
+ struct rep_event evt = {0 };
52
+
53
+ eth_hw_addr_set (rep -> netdev , hw_addr );
54
+ ether_addr_copy (rep -> mac , hw_addr );
55
+
56
+ ether_addr_copy (evt .evt_data .mac , hw_addr );
57
+ evt .pcifunc = rep -> pcifunc ;
58
+ rvu_rep_notify_pfvf (priv , RVU_EVENT_MAC_ADDR_CHANGE , & evt );
59
+ return 0 ;
60
+ }
61
+
62
+ static const struct devlink_port_ops rvu_rep_dl_port_ops = {
63
+ .port_fn_hw_addr_get = rvu_rep_dl_port_fn_hw_addr_get ,
64
+ .port_fn_hw_addr_set = rvu_rep_dl_port_fn_hw_addr_set ,
65
+ };
66
+
67
+ static void
68
+ rvu_rep_devlink_set_switch_id (struct otx2_nic * priv ,
69
+ struct netdev_phys_item_id * ppid )
70
+ {
71
+ struct pci_dev * pdev = priv -> pdev ;
72
+ u64 id ;
73
+
74
+ id = pci_get_dsn (pdev );
75
+
76
+ ppid -> id_len = sizeof (id );
77
+ put_unaligned_be64 (id , & ppid -> id );
78
+ }
79
+
80
+ static void rvu_rep_devlink_port_unregister (struct rep_dev * rep )
81
+ {
82
+ devlink_port_unregister (& rep -> dl_port );
83
+ }
84
+
85
+ static int rvu_rep_devlink_port_register (struct rep_dev * rep )
86
+ {
87
+ struct devlink_port_attrs attrs = {};
88
+ struct otx2_nic * priv = rep -> mdev ;
89
+ struct devlink * dl = priv -> dl -> dl ;
90
+ int err ;
91
+
92
+ if (!(rep -> pcifunc & RVU_PFVF_FUNC_MASK )) {
93
+ attrs .flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL ;
94
+ attrs .phys .port_number = rvu_get_pf (rep -> pcifunc );
95
+ } else {
96
+ attrs .flavour = DEVLINK_PORT_FLAVOUR_PCI_VF ;
97
+ attrs .pci_vf .pf = rvu_get_pf (rep -> pcifunc );
98
+ attrs .pci_vf .vf = rep -> pcifunc & RVU_PFVF_FUNC_MASK ;
99
+ }
100
+
101
+ rvu_rep_devlink_set_switch_id (priv , & attrs .switch_id );
102
+ devlink_port_attrs_set (& rep -> dl_port , & attrs );
103
+
104
+ err = devl_port_register_with_ops (dl , & rep -> dl_port , rep -> rep_id ,
105
+ & rvu_rep_dl_port_ops );
106
+ if (err ) {
107
+ dev_err (rep -> mdev -> dev , "devlink_port_register failed: %d\n" ,
108
+ err );
109
+ return err ;
110
+ }
111
+ return 0 ;
112
+ }
113
+
31
114
static int rvu_rep_get_repid (struct otx2_nic * priv , u16 pcifunc )
32
115
{
33
116
int rep_id ;
@@ -386,6 +469,7 @@ void rvu_rep_destroy(struct otx2_nic *priv)
386
469
for (rep_id = 0 ; rep_id < priv -> rep_cnt ; rep_id ++ ) {
387
470
rep = priv -> reps [rep_id ];
388
471
unregister_netdev (rep -> netdev );
472
+ rvu_rep_devlink_port_unregister (rep );
389
473
free_netdev (rep -> netdev );
390
474
}
391
475
kfree (priv -> reps );
@@ -439,6 +523,11 @@ int rvu_rep_create(struct otx2_nic *priv, struct netlink_ext_ack *extack)
439
523
440
524
ndev -> features |= ndev -> hw_features ;
441
525
eth_hw_addr_random (ndev );
526
+ err = rvu_rep_devlink_port_register (rep );
527
+ if (err )
528
+ goto exit ;
529
+
530
+ SET_NETDEV_DEVLINK_PORT (ndev , & rep -> dl_port );
442
531
err = register_netdev (ndev );
443
532
if (err ) {
444
533
NL_SET_ERR_MSG_MOD (extack ,
@@ -459,6 +548,7 @@ int rvu_rep_create(struct otx2_nic *priv, struct netlink_ext_ack *extack)
459
548
while (-- rep_id >= 0 ) {
460
549
rep = priv -> reps [rep_id ];
461
550
unregister_netdev (rep -> netdev );
551
+ rvu_rep_devlink_port_unregister (rep );
462
552
free_netdev (rep -> netdev );
463
553
}
464
554
kfree (priv -> reps );
0 commit comments