@@ -66,6 +66,10 @@ static const struct ib_device_ops mana_ib_stats_ops = {
6666 .get_hw_stats = mana_ib_get_hw_stats ,
6767};
6868
69+ static const struct ib_device_ops mana_ib_device_stats_ops = {
70+ .alloc_hw_device_stats = mana_ib_alloc_hw_device_stats ,
71+ };
72+
6973static int mana_ib_netdev_event (struct notifier_block * this ,
7074 unsigned long event , void * ptr )
7175{
@@ -74,28 +78,31 @@ static int mana_ib_netdev_event(struct notifier_block *this,
7478 struct gdma_context * gc = dev -> gdma_dev -> gdma_context ;
7579 struct mana_context * mc = gc -> mana .driver_data ;
7680 struct net_device * ndev ;
81+ int i ;
7782
7883 /* Only process events from our parent device */
79- if (event_dev != mc -> ports [0 ])
80- return NOTIFY_DONE ;
81-
82- switch (event ) {
83- case NETDEV_CHANGEUPPER :
84- ndev = mana_get_primary_netdev (mc , 0 , & dev -> dev_tracker );
85- /*
86- * RDMA core will setup GID based on updated netdev.
87- * It's not possible to race with the core as rtnl lock is being
88- * held.
89- */
90- ib_device_set_netdev (& dev -> ib_dev , ndev , 1 );
91-
92- /* mana_get_primary_netdev() returns ndev with refcount held */
93- netdev_put (ndev , & dev -> dev_tracker );
94-
95- return NOTIFY_OK ;
96- default :
97- return NOTIFY_DONE ;
98- }
84+ for (i = 0 ; i < dev -> ib_dev .phys_port_cnt ; i ++ )
85+ if (event_dev == mc -> ports [i ]) {
86+ switch (event ) {
87+ case NETDEV_CHANGEUPPER :
88+ ndev = mana_get_primary_netdev (mc , i , & dev -> dev_tracker );
89+ /*
90+ * RDMA core will setup GID based on updated netdev.
91+ * It's not possible to race with the core as rtnl lock is being
92+ * held.
93+ */
94+ ib_device_set_netdev (& dev -> ib_dev , ndev , i + 1 );
95+
96+ /* mana_get_primary_netdev() returns ndev with refcount held */
97+ if (ndev )
98+ netdev_put (ndev , & dev -> dev_tracker );
99+
100+ return NOTIFY_OK ;
101+ default :
102+ return NOTIFY_DONE ;
103+ }
104+ }
105+ return NOTIFY_DONE ;
99106}
100107
101108static int mana_ib_probe (struct auxiliary_device * adev ,
@@ -108,7 +115,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
108115 struct net_device * ndev ;
109116 struct mana_ib_dev * dev ;
110117 u8 mac_addr [ETH_ALEN ];
111- int ret ;
118+ int ret , i ;
112119
113120 dev = ib_alloc_device (mana_ib_dev , ib_dev );
114121 if (!dev )
@@ -123,51 +130,56 @@ static int mana_ib_probe(struct auxiliary_device *adev,
123130
124131 if (mana_ib_is_rnic (dev )) {
125132 dev -> ib_dev .phys_port_cnt = 1 ;
126- ndev = mana_get_primary_netdev (mc , 0 , & dev -> dev_tracker );
127- if (!ndev ) {
128- ret = - ENODEV ;
129- ibdev_err (& dev -> ib_dev , "Failed to get netdev for IB port 1" );
130- goto free_ib_device ;
131- }
132- ether_addr_copy (mac_addr , ndev -> dev_addr );
133- addrconf_addr_eui48 ((u8 * )& dev -> ib_dev .node_guid , ndev -> dev_addr );
134- ret = ib_device_set_netdev (& dev -> ib_dev , ndev , 1 );
135- /* mana_get_primary_netdev() returns ndev with refcount held */
136- netdev_put (ndev , & dev -> dev_tracker );
137- if (ret ) {
138- ibdev_err (& dev -> ib_dev , "Failed to set ib netdev, ret %d" , ret );
139- goto free_ib_device ;
140- }
141-
142- dev -> nb .notifier_call = mana_ib_netdev_event ;
143- ret = register_netdevice_notifier (& dev -> nb );
144- if (ret ) {
145- ibdev_err (& dev -> ib_dev , "Failed to register net notifier, %d" ,
146- ret );
147- goto free_ib_device ;
148- }
149-
133+ addrconf_addr_eui48 ((u8 * )& dev -> ib_dev .node_guid , mc -> ports [0 ]-> dev_addr );
150134 ret = mana_ib_gd_query_adapter_caps (dev );
151135 if (ret ) {
152136 ibdev_err (& dev -> ib_dev , "Failed to query device caps, ret %d" , ret );
153- goto deregister_net_notifier ;
137+ goto free_ib_device ;
154138 }
155139
156140 ib_set_device_ops (& dev -> ib_dev , & mana_ib_stats_ops );
141+ if (dev -> adapter_caps .feature_flags & MANA_IB_FEATURE_DEV_COUNTERS_SUPPORT )
142+ ib_set_device_ops (& dev -> ib_dev , & mana_ib_device_stats_ops );
157143
158144 ret = mana_ib_create_eqs (dev );
159145 if (ret ) {
160146 ibdev_err (& dev -> ib_dev , "Failed to create EQs, ret %d" , ret );
161- goto deregister_net_notifier ;
147+ goto free_ib_device ;
162148 }
163149
164150 ret = mana_ib_gd_create_rnic_adapter (dev );
165151 if (ret )
166152 goto destroy_eqs ;
167153
168- ret = mana_ib_gd_config_mac (dev , ADDR_OP_ADD , mac_addr );
154+ if (dev -> adapter_caps .feature_flags & MANA_IB_FEATURE_MULTI_PORTS_SUPPORT )
155+ dev -> ib_dev .phys_port_cnt = mc -> num_ports ;
156+
157+ for (i = 0 ; i < dev -> ib_dev .phys_port_cnt ; i ++ ) {
158+ ndev = mana_get_primary_netdev (mc , i , & dev -> dev_tracker );
159+ if (!ndev ) {
160+ ret = - ENODEV ;
161+ ibdev_err (& dev -> ib_dev ,
162+ "Failed to get netdev for IB port %d" , i + 1 );
163+ goto destroy_rnic ;
164+ }
165+ ether_addr_copy (mac_addr , ndev -> dev_addr );
166+ ret = ib_device_set_netdev (& dev -> ib_dev , ndev , i + 1 );
167+ /* mana_get_primary_netdev() returns ndev with refcount held */
168+ netdev_put (ndev , & dev -> dev_tracker );
169+ if (ret ) {
170+ ibdev_err (& dev -> ib_dev , "Failed to set ib netdev, ret %d" , ret );
171+ goto destroy_rnic ;
172+ }
173+ ret = mana_ib_gd_config_mac (dev , ADDR_OP_ADD , mac_addr );
174+ if (ret ) {
175+ ibdev_err (& dev -> ib_dev , "Failed to add Mac address, ret %d" , ret );
176+ goto destroy_rnic ;
177+ }
178+ }
179+ dev -> nb .notifier_call = mana_ib_netdev_event ;
180+ ret = register_netdevice_notifier (& dev -> nb );
169181 if (ret ) {
170- ibdev_err (& dev -> ib_dev , "Failed to add Mac address, ret %d" , ret );
182+ ibdev_err (& dev -> ib_dev , "Failed to register net notifier, %d" , ret );
171183 goto destroy_rnic ;
172184 }
173185 } else {
@@ -183,7 +195,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
183195 MANA_AV_BUFFER_SIZE , 0 );
184196 if (!dev -> av_pool ) {
185197 ret = - ENOMEM ;
186- goto destroy_rnic ;
198+ goto deregister_net_notifier ;
187199 }
188200
189201 ibdev_dbg (& dev -> ib_dev , "mdev=%p id=%d num_ports=%d\n" , mdev ,
@@ -200,15 +212,15 @@ static int mana_ib_probe(struct auxiliary_device *adev,
200212
201213deallocate_pool :
202214 dma_pool_destroy (dev -> av_pool );
215+ deregister_net_notifier :
216+ if (mana_ib_is_rnic (dev ))
217+ unregister_netdevice_notifier (& dev -> nb );
203218destroy_rnic :
204219 if (mana_ib_is_rnic (dev ))
205220 mana_ib_gd_destroy_rnic_adapter (dev );
206221destroy_eqs :
207222 if (mana_ib_is_rnic (dev ))
208223 mana_ib_destroy_eqs (dev );
209- deregister_net_notifier :
210- if (mana_ib_is_rnic (dev ))
211- unregister_netdevice_notifier (& dev -> nb );
212224free_ib_device :
213225 xa_destroy (& dev -> qp_table_wq );
214226 ib_dealloc_device (& dev -> ib_dev );
@@ -222,9 +234,9 @@ static void mana_ib_remove(struct auxiliary_device *adev)
222234 ib_unregister_device (& dev -> ib_dev );
223235 dma_pool_destroy (dev -> av_pool );
224236 if (mana_ib_is_rnic (dev )) {
237+ unregister_netdevice_notifier (& dev -> nb );
225238 mana_ib_gd_destroy_rnic_adapter (dev );
226239 mana_ib_destroy_eqs (dev );
227- unregister_netdevice_notifier (& dev -> nb );
228240 }
229241 xa_destroy (& dev -> qp_table_wq );
230242 ib_dealloc_device (& dev -> ib_dev );
0 commit comments