@@ -90,6 +90,23 @@ struct mlxsw_core_pcpu_stats {
90
90
u32 port_rx_invalid ;
91
91
};
92
92
93
+ struct mlxsw_core_port {
94
+ struct devlink_port devlink_port ;
95
+ void * port_driver_priv ;
96
+ u8 local_port ;
97
+ };
98
+
99
+ void * mlxsw_core_port_driver_priv (struct mlxsw_core_port * mlxsw_core_port )
100
+ {
101
+ return mlxsw_core_port -> port_driver_priv ;
102
+ }
103
+ EXPORT_SYMBOL (mlxsw_core_port_driver_priv );
104
+
105
+ static bool mlxsw_core_port_check (struct mlxsw_core_port * mlxsw_core_port )
106
+ {
107
+ return mlxsw_core_port -> port_driver_priv != NULL ;
108
+ }
109
+
93
110
struct mlxsw_core {
94
111
struct mlxsw_driver * driver ;
95
112
const struct mlxsw_bus * bus ;
@@ -114,6 +131,7 @@ struct mlxsw_core {
114
131
} lag ;
115
132
struct mlxsw_res res ;
116
133
struct mlxsw_hwmon * hwmon ;
134
+ struct mlxsw_core_port ports [MLXSW_PORT_MAX_PORTS ];
117
135
unsigned long driver_priv [0 ];
118
136
/* driver_priv has to be always the last item */
119
137
};
@@ -920,6 +938,21 @@ static void *__dl_port(struct devlink_port *devlink_port)
920
938
return container_of (devlink_port , struct mlxsw_core_port , devlink_port );
921
939
}
922
940
941
+ static int mlxsw_devlink_port_type_set (struct devlink_port * devlink_port ,
942
+ enum devlink_port_type port_type )
943
+ {
944
+ struct mlxsw_core * mlxsw_core = devlink_priv (devlink_port -> devlink );
945
+ struct mlxsw_driver * mlxsw_driver = mlxsw_core -> driver ;
946
+ struct mlxsw_core_port * mlxsw_core_port = __dl_port (devlink_port );
947
+
948
+ if (!mlxsw_driver -> port_type_set )
949
+ return - EOPNOTSUPP ;
950
+
951
+ return mlxsw_driver -> port_type_set (mlxsw_core ,
952
+ mlxsw_core_port -> local_port ,
953
+ port_type );
954
+ }
955
+
923
956
static int mlxsw_devlink_sb_port_pool_get (struct devlink_port * devlink_port ,
924
957
unsigned int sb_index , u16 pool_index ,
925
958
u32 * p_threshold )
@@ -928,7 +961,8 @@ static int mlxsw_devlink_sb_port_pool_get(struct devlink_port *devlink_port,
928
961
struct mlxsw_driver * mlxsw_driver = mlxsw_core -> driver ;
929
962
struct mlxsw_core_port * mlxsw_core_port = __dl_port (devlink_port );
930
963
931
- if (!mlxsw_driver -> sb_port_pool_get )
964
+ if (!mlxsw_driver -> sb_port_pool_get ||
965
+ !mlxsw_core_port_check (mlxsw_core_port ))
932
966
return - EOPNOTSUPP ;
933
967
return mlxsw_driver -> sb_port_pool_get (mlxsw_core_port , sb_index ,
934
968
pool_index , p_threshold );
@@ -942,7 +976,8 @@ static int mlxsw_devlink_sb_port_pool_set(struct devlink_port *devlink_port,
942
976
struct mlxsw_driver * mlxsw_driver = mlxsw_core -> driver ;
943
977
struct mlxsw_core_port * mlxsw_core_port = __dl_port (devlink_port );
944
978
945
- if (!mlxsw_driver -> sb_port_pool_set )
979
+ if (!mlxsw_driver -> sb_port_pool_set ||
980
+ !mlxsw_core_port_check (mlxsw_core_port ))
946
981
return - EOPNOTSUPP ;
947
982
return mlxsw_driver -> sb_port_pool_set (mlxsw_core_port , sb_index ,
948
983
pool_index , threshold );
@@ -958,7 +993,8 @@ mlxsw_devlink_sb_tc_pool_bind_get(struct devlink_port *devlink_port,
958
993
struct mlxsw_driver * mlxsw_driver = mlxsw_core -> driver ;
959
994
struct mlxsw_core_port * mlxsw_core_port = __dl_port (devlink_port );
960
995
961
- if (!mlxsw_driver -> sb_tc_pool_bind_get )
996
+ if (!mlxsw_driver -> sb_tc_pool_bind_get ||
997
+ !mlxsw_core_port_check (mlxsw_core_port ))
962
998
return - EOPNOTSUPP ;
963
999
return mlxsw_driver -> sb_tc_pool_bind_get (mlxsw_core_port , sb_index ,
964
1000
tc_index , pool_type ,
@@ -975,7 +1011,8 @@ mlxsw_devlink_sb_tc_pool_bind_set(struct devlink_port *devlink_port,
975
1011
struct mlxsw_driver * mlxsw_driver = mlxsw_core -> driver ;
976
1012
struct mlxsw_core_port * mlxsw_core_port = __dl_port (devlink_port );
977
1013
978
- if (!mlxsw_driver -> sb_tc_pool_bind_set )
1014
+ if (!mlxsw_driver -> sb_tc_pool_bind_set ||
1015
+ !mlxsw_core_port_check (mlxsw_core_port ))
979
1016
return - EOPNOTSUPP ;
980
1017
return mlxsw_driver -> sb_tc_pool_bind_set (mlxsw_core_port , sb_index ,
981
1018
tc_index , pool_type ,
@@ -1013,7 +1050,8 @@ mlxsw_devlink_sb_occ_port_pool_get(struct devlink_port *devlink_port,
1013
1050
struct mlxsw_driver * mlxsw_driver = mlxsw_core -> driver ;
1014
1051
struct mlxsw_core_port * mlxsw_core_port = __dl_port (devlink_port );
1015
1052
1016
- if (!mlxsw_driver -> sb_occ_port_pool_get )
1053
+ if (!mlxsw_driver -> sb_occ_port_pool_get ||
1054
+ !mlxsw_core_port_check (mlxsw_core_port ))
1017
1055
return - EOPNOTSUPP ;
1018
1056
return mlxsw_driver -> sb_occ_port_pool_get (mlxsw_core_port , sb_index ,
1019
1057
pool_index , p_cur , p_max );
@@ -1029,14 +1067,16 @@ mlxsw_devlink_sb_occ_tc_port_bind_get(struct devlink_port *devlink_port,
1029
1067
struct mlxsw_driver * mlxsw_driver = mlxsw_core -> driver ;
1030
1068
struct mlxsw_core_port * mlxsw_core_port = __dl_port (devlink_port );
1031
1069
1032
- if (!mlxsw_driver -> sb_occ_tc_port_bind_get )
1070
+ if (!mlxsw_driver -> sb_occ_tc_port_bind_get ||
1071
+ !mlxsw_core_port_check (mlxsw_core_port ))
1033
1072
return - EOPNOTSUPP ;
1034
1073
return mlxsw_driver -> sb_occ_tc_port_bind_get (mlxsw_core_port ,
1035
1074
sb_index , tc_index ,
1036
1075
pool_type , p_cur , p_max );
1037
1076
}
1038
1077
1039
1078
static const struct devlink_ops mlxsw_devlink_ops = {
1079
+ .port_type_set = mlxsw_devlink_port_type_set ,
1040
1080
.port_split = mlxsw_devlink_port_split ,
1041
1081
.port_unsplit = mlxsw_devlink_port_unsplit ,
1042
1082
.sb_pool_get = mlxsw_devlink_sb_pool_get ,
@@ -1656,28 +1696,83 @@ u64 mlxsw_core_res_get(struct mlxsw_core *mlxsw_core,
1656
1696
}
1657
1697
EXPORT_SYMBOL (mlxsw_core_res_get );
1658
1698
1659
- int mlxsw_core_port_init (struct mlxsw_core * mlxsw_core ,
1660
- struct mlxsw_core_port * mlxsw_core_port , u8 local_port ,
1661
- struct net_device * dev , bool split , u32 split_group )
1699
+ int mlxsw_core_port_init (struct mlxsw_core * mlxsw_core , u8 local_port )
1662
1700
{
1663
1701
struct devlink * devlink = priv_to_devlink (mlxsw_core );
1702
+ struct mlxsw_core_port * mlxsw_core_port =
1703
+ & mlxsw_core -> ports [local_port ];
1664
1704
struct devlink_port * devlink_port = & mlxsw_core_port -> devlink_port ;
1705
+ int err ;
1665
1706
1666
- if (split )
1667
- devlink_port_split_set (devlink_port , split_group );
1668
- devlink_port_type_eth_set (devlink_port , dev );
1669
- return devlink_port_register (devlink , devlink_port , local_port );
1707
+ mlxsw_core_port -> local_port = local_port ;
1708
+ err = devlink_port_register (devlink , devlink_port , local_port );
1709
+ if (err )
1710
+ memset (mlxsw_core_port , 0 , sizeof (* mlxsw_core_port ));
1711
+ return err ;
1670
1712
}
1671
1713
EXPORT_SYMBOL (mlxsw_core_port_init );
1672
1714
1673
- void mlxsw_core_port_fini (struct mlxsw_core_port * mlxsw_core_port )
1715
+ void mlxsw_core_port_fini (struct mlxsw_core * mlxsw_core , u8 local_port )
1674
1716
{
1717
+ struct mlxsw_core_port * mlxsw_core_port =
1718
+ & mlxsw_core -> ports [local_port ];
1675
1719
struct devlink_port * devlink_port = & mlxsw_core_port -> devlink_port ;
1676
1720
1677
1721
devlink_port_unregister (devlink_port );
1722
+ memset (mlxsw_core_port , 0 , sizeof (* mlxsw_core_port ));
1678
1723
}
1679
1724
EXPORT_SYMBOL (mlxsw_core_port_fini );
1680
1725
1726
+ void mlxsw_core_port_eth_set (struct mlxsw_core * mlxsw_core , u8 local_port ,
1727
+ void * port_driver_priv , struct net_device * dev ,
1728
+ bool split , u32 split_group )
1729
+ {
1730
+ struct mlxsw_core_port * mlxsw_core_port =
1731
+ & mlxsw_core -> ports [local_port ];
1732
+ struct devlink_port * devlink_port = & mlxsw_core_port -> devlink_port ;
1733
+
1734
+ mlxsw_core_port -> port_driver_priv = port_driver_priv ;
1735
+ if (split )
1736
+ devlink_port_split_set (devlink_port , split_group );
1737
+ devlink_port_type_eth_set (devlink_port , dev );
1738
+ }
1739
+ EXPORT_SYMBOL (mlxsw_core_port_eth_set );
1740
+
1741
+ void mlxsw_core_port_ib_set (struct mlxsw_core * mlxsw_core , u8 local_port ,
1742
+ void * port_driver_priv )
1743
+ {
1744
+ struct mlxsw_core_port * mlxsw_core_port =
1745
+ & mlxsw_core -> ports [local_port ];
1746
+ struct devlink_port * devlink_port = & mlxsw_core_port -> devlink_port ;
1747
+
1748
+ mlxsw_core_port -> port_driver_priv = port_driver_priv ;
1749
+ devlink_port_type_ib_set (devlink_port , NULL );
1750
+ }
1751
+ EXPORT_SYMBOL (mlxsw_core_port_ib_set );
1752
+
1753
+ void mlxsw_core_port_clear (struct mlxsw_core * mlxsw_core , u8 local_port ,
1754
+ void * port_driver_priv )
1755
+ {
1756
+ struct mlxsw_core_port * mlxsw_core_port =
1757
+ & mlxsw_core -> ports [local_port ];
1758
+ struct devlink_port * devlink_port = & mlxsw_core_port -> devlink_port ;
1759
+
1760
+ mlxsw_core_port -> port_driver_priv = port_driver_priv ;
1761
+ devlink_port_type_clear (devlink_port );
1762
+ }
1763
+ EXPORT_SYMBOL (mlxsw_core_port_clear );
1764
+
1765
+ enum devlink_port_type mlxsw_core_port_type_get (struct mlxsw_core * mlxsw_core ,
1766
+ u8 local_port )
1767
+ {
1768
+ struct mlxsw_core_port * mlxsw_core_port =
1769
+ & mlxsw_core -> ports [local_port ];
1770
+ struct devlink_port * devlink_port = & mlxsw_core_port -> devlink_port ;
1771
+
1772
+ return devlink_port -> type ;
1773
+ }
1774
+ EXPORT_SYMBOL (mlxsw_core_port_type_get );
1775
+
1681
1776
static void mlxsw_core_buf_dump_dbg (struct mlxsw_core * mlxsw_core ,
1682
1777
const char * buf , size_t size )
1683
1778
{
0 commit comments