@@ -65,6 +65,10 @@ static const struct ib_device_ops mana_ib_stats_ops = {
6565 .get_hw_stats = mana_ib_get_hw_stats ,
6666};
6767
68+ static const struct ib_device_ops mana_ib_device_stats_ops = {
69+ .alloc_hw_device_stats = mana_ib_alloc_hw_device_stats ,
70+ };
71+
6872static int mana_ib_netdev_event (struct notifier_block * this ,
6973 unsigned long event , void * ptr )
7074{
@@ -73,28 +77,31 @@ static int mana_ib_netdev_event(struct notifier_block *this,
7377 struct gdma_context * gc = dev -> gdma_dev -> gdma_context ;
7478 struct mana_context * mc = gc -> mana .driver_data ;
7579 struct net_device * ndev ;
80+ int i ;
7681
7782 /* Only process events from our parent device */
78- if (event_dev != mc -> ports [0 ])
79- return NOTIFY_DONE ;
80-
81- switch (event ) {
82- case NETDEV_CHANGEUPPER :
83- ndev = mana_get_primary_netdev (mc , 0 , & dev -> dev_tracker );
84- /*
85- * RDMA core will setup GID based on updated netdev.
86- * It's not possible to race with the core as rtnl lock is being
87- * held.
88- */
89- ib_device_set_netdev (& dev -> ib_dev , ndev , 1 );
90-
91- /* mana_get_primary_netdev() returns ndev with refcount held */
92- netdev_put (ndev , & dev -> dev_tracker );
93-
94- return NOTIFY_OK ;
95- default :
96- return NOTIFY_DONE ;
97- }
83+ for (i = 0 ; i < dev -> ib_dev .phys_port_cnt ; i ++ )
84+ if (event_dev == mc -> ports [i ]) {
85+ switch (event ) {
86+ case NETDEV_CHANGEUPPER :
87+ ndev = mana_get_primary_netdev (mc , i , & dev -> dev_tracker );
88+ /*
89+ * RDMA core will setup GID based on updated netdev.
90+ * It's not possible to race with the core as rtnl lock is being
91+ * held.
92+ */
93+ ib_device_set_netdev (& dev -> ib_dev , ndev , i + 1 );
94+
95+ /* mana_get_primary_netdev() returns ndev with refcount held */
96+ if (ndev )
97+ netdev_put (ndev , & dev -> dev_tracker );
98+
99+ return NOTIFY_OK ;
100+ default :
101+ return NOTIFY_DONE ;
102+ }
103+ }
104+ return NOTIFY_DONE ;
98105}
99106
100107static int mana_ib_probe (struct auxiliary_device * adev ,
@@ -107,7 +114,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
107114 struct net_device * ndev ;
108115 struct mana_ib_dev * dev ;
109116 u8 mac_addr [ETH_ALEN ];
110- int ret ;
117+ int ret , i ;
111118
112119 dev = ib_alloc_device (mana_ib_dev , ib_dev );
113120 if (!dev )
@@ -122,51 +129,56 @@ static int mana_ib_probe(struct auxiliary_device *adev,
122129
123130 if (mana_ib_is_rnic (dev )) {
124131 dev -> ib_dev .phys_port_cnt = 1 ;
125- ndev = mana_get_primary_netdev (mc , 0 , & dev -> dev_tracker );
126- if (!ndev ) {
127- ret = - ENODEV ;
128- ibdev_err (& dev -> ib_dev , "Failed to get netdev for IB port 1" );
129- goto free_ib_device ;
130- }
131- ether_addr_copy (mac_addr , ndev -> dev_addr );
132- addrconf_addr_eui48 ((u8 * )& dev -> ib_dev .node_guid , ndev -> dev_addr );
133- ret = ib_device_set_netdev (& dev -> ib_dev , ndev , 1 );
134- /* mana_get_primary_netdev() returns ndev with refcount held */
135- netdev_put (ndev , & dev -> dev_tracker );
136- if (ret ) {
137- ibdev_err (& dev -> ib_dev , "Failed to set ib netdev, ret %d" , ret );
138- goto free_ib_device ;
139- }
140-
141- dev -> nb .notifier_call = mana_ib_netdev_event ;
142- ret = register_netdevice_notifier (& dev -> nb );
143- if (ret ) {
144- ibdev_err (& dev -> ib_dev , "Failed to register net notifier, %d" ,
145- ret );
146- goto free_ib_device ;
147- }
148-
132+ addrconf_addr_eui48 ((u8 * )& dev -> ib_dev .node_guid , mc -> ports [0 ]-> dev_addr );
149133 ret = mana_ib_gd_query_adapter_caps (dev );
150134 if (ret ) {
151135 ibdev_err (& dev -> ib_dev , "Failed to query device caps, ret %d" , ret );
152- goto deregister_net_notifier ;
136+ goto free_ib_device ;
153137 }
154138
155139 ib_set_device_ops (& dev -> ib_dev , & mana_ib_stats_ops );
140+ if (dev -> adapter_caps .feature_flags & MANA_IB_FEATURE_DEV_COUNTERS_SUPPORT )
141+ ib_set_device_ops (& dev -> ib_dev , & mana_ib_device_stats_ops );
156142
157143 ret = mana_ib_create_eqs (dev );
158144 if (ret ) {
159145 ibdev_err (& dev -> ib_dev , "Failed to create EQs, ret %d" , ret );
160- goto deregister_net_notifier ;
146+ goto free_ib_device ;
161147 }
162148
163149 ret = mana_ib_gd_create_rnic_adapter (dev );
164150 if (ret )
165151 goto destroy_eqs ;
166152
167- ret = mana_ib_gd_config_mac (dev , ADDR_OP_ADD , mac_addr );
153+ if (dev -> adapter_caps .feature_flags & MANA_IB_FEATURE_MULTI_PORTS_SUPPORT )
154+ dev -> ib_dev .phys_port_cnt = mc -> num_ports ;
155+
156+ for (i = 0 ; i < dev -> ib_dev .phys_port_cnt ; i ++ ) {
157+ ndev = mana_get_primary_netdev (mc , i , & dev -> dev_tracker );
158+ if (!ndev ) {
159+ ret = - ENODEV ;
160+ ibdev_err (& dev -> ib_dev ,
161+ "Failed to get netdev for IB port %d" , i + 1 );
162+ goto destroy_rnic ;
163+ }
164+ ether_addr_copy (mac_addr , ndev -> dev_addr );
165+ ret = ib_device_set_netdev (& dev -> ib_dev , ndev , i + 1 );
166+ /* mana_get_primary_netdev() returns ndev with refcount held */
167+ netdev_put (ndev , & dev -> dev_tracker );
168+ if (ret ) {
169+ ibdev_err (& dev -> ib_dev , "Failed to set ib netdev, ret %d" , ret );
170+ goto destroy_rnic ;
171+ }
172+ ret = mana_ib_gd_config_mac (dev , ADDR_OP_ADD , mac_addr );
173+ if (ret ) {
174+ ibdev_err (& dev -> ib_dev , "Failed to add Mac address, ret %d" , ret );
175+ goto destroy_rnic ;
176+ }
177+ }
178+ dev -> nb .notifier_call = mana_ib_netdev_event ;
179+ ret = register_netdevice_notifier (& dev -> nb );
168180 if (ret ) {
169- ibdev_err (& dev -> ib_dev , "Failed to add Mac address, ret %d" , ret );
181+ ibdev_err (& dev -> ib_dev , "Failed to register net notifier, %d" , ret );
170182 goto destroy_rnic ;
171183 }
172184 } else {
@@ -182,7 +194,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
182194 MANA_AV_BUFFER_SIZE , 0 );
183195 if (!dev -> av_pool ) {
184196 ret = - ENOMEM ;
185- goto destroy_rnic ;
197+ goto deregister_net_notifier ;
186198 }
187199
188200 ibdev_dbg (& dev -> ib_dev , "mdev=%p id=%d num_ports=%d\n" , mdev ,
@@ -199,15 +211,15 @@ static int mana_ib_probe(struct auxiliary_device *adev,
199211
200212deallocate_pool :
201213 dma_pool_destroy (dev -> av_pool );
214+ deregister_net_notifier :
215+ if (mana_ib_is_rnic (dev ))
216+ unregister_netdevice_notifier (& dev -> nb );
202217destroy_rnic :
203218 if (mana_ib_is_rnic (dev ))
204219 mana_ib_gd_destroy_rnic_adapter (dev );
205220destroy_eqs :
206221 if (mana_ib_is_rnic (dev ))
207222 mana_ib_destroy_eqs (dev );
208- deregister_net_notifier :
209- if (mana_ib_is_rnic (dev ))
210- unregister_netdevice_notifier (& dev -> nb );
211223free_ib_device :
212224 xa_destroy (& dev -> qp_table_wq );
213225 ib_dealloc_device (& dev -> ib_dev );
@@ -221,9 +233,9 @@ static void mana_ib_remove(struct auxiliary_device *adev)
221233 ib_unregister_device (& dev -> ib_dev );
222234 dma_pool_destroy (dev -> av_pool );
223235 if (mana_ib_is_rnic (dev )) {
236+ unregister_netdevice_notifier (& dev -> nb );
224237 mana_ib_gd_destroy_rnic_adapter (dev );
225238 mana_ib_destroy_eqs (dev );
226- unregister_netdevice_notifier (& dev -> nb );
227239 }
228240 xa_destroy (& dev -> qp_table_wq );
229241 ib_dealloc_device (& dev -> ib_dev );
0 commit comments