@@ -77,28 +77,31 @@ static int mana_ib_netdev_event(struct notifier_block *this,
7777 struct gdma_context * gc = dev -> gdma_dev -> gdma_context ;
7878 struct mana_context * mc = gc -> mana .driver_data ;
7979 struct net_device * ndev ;
80+ int i ;
8081
8182 /* Only process events from our parent device */
82- if (event_dev != mc -> ports [0 ])
83- return NOTIFY_DONE ;
84-
85- switch (event ) {
86- case NETDEV_CHANGEUPPER :
87- ndev = mana_get_primary_netdev (mc , 0 , & 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 , 1 );
94-
95- /* mana_get_primary_netdev() returns ndev with refcount held */
96- netdev_put (ndev , & dev -> dev_tracker );
97-
98- return NOTIFY_OK ;
99- default :
100- return NOTIFY_DONE ;
101- }
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 ;
102105}
103106
104107static int mana_ib_probe (struct auxiliary_device * adev ,
@@ -111,7 +114,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
111114 struct net_device * ndev ;
112115 struct mana_ib_dev * dev ;
113116 u8 mac_addr [ETH_ALEN ];
114- int ret ;
117+ int ret , i ;
115118
116119 dev = ib_alloc_device (mana_ib_dev , ib_dev );
117120 if (!dev )
@@ -126,34 +129,11 @@ static int mana_ib_probe(struct auxiliary_device *adev,
126129
127130 if (mana_ib_is_rnic (dev )) {
128131 dev -> ib_dev .phys_port_cnt = 1 ;
129- ndev = mana_get_primary_netdev (mc , 0 , & dev -> dev_tracker );
130- if (!ndev ) {
131- ret = - ENODEV ;
132- ibdev_err (& dev -> ib_dev , "Failed to get netdev for IB port 1" );
133- goto free_ib_device ;
134- }
135- ether_addr_copy (mac_addr , ndev -> dev_addr );
136- addrconf_addr_eui48 ((u8 * )& dev -> ib_dev .node_guid , ndev -> dev_addr );
137- ret = ib_device_set_netdev (& dev -> ib_dev , ndev , 1 );
138- /* mana_get_primary_netdev() returns ndev with refcount held */
139- netdev_put (ndev , & dev -> dev_tracker );
140- if (ret ) {
141- ibdev_err (& dev -> ib_dev , "Failed to set ib netdev, ret %d" , ret );
142- goto free_ib_device ;
143- }
144-
145- dev -> nb .notifier_call = mana_ib_netdev_event ;
146- ret = register_netdevice_notifier (& dev -> nb );
147- if (ret ) {
148- ibdev_err (& dev -> ib_dev , "Failed to register net notifier, %d" ,
149- ret );
150- goto free_ib_device ;
151- }
152-
132+ addrconf_addr_eui48 ((u8 * )& dev -> ib_dev .node_guid , mc -> ports [0 ]-> dev_addr );
153133 ret = mana_ib_gd_query_adapter_caps (dev );
154134 if (ret ) {
155135 ibdev_err (& dev -> ib_dev , "Failed to query device caps, ret %d" , ret );
156- goto deregister_net_notifier ;
136+ goto free_ib_device ;
157137 }
158138
159139 ib_set_device_ops (& dev -> ib_dev , & mana_ib_stats_ops );
@@ -163,16 +143,42 @@ static int mana_ib_probe(struct auxiliary_device *adev,
163143 ret = mana_ib_create_eqs (dev );
164144 if (ret ) {
165145 ibdev_err (& dev -> ib_dev , "Failed to create EQs, ret %d" , ret );
166- goto deregister_net_notifier ;
146+ goto free_ib_device ;
167147 }
168148
169149 ret = mana_ib_gd_create_rnic_adapter (dev );
170150 if (ret )
171151 goto destroy_eqs ;
172152
173- 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 );
174180 if (ret ) {
175- 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 );
176182 goto destroy_rnic ;
177183 }
178184 } else {
@@ -188,7 +194,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
188194 MANA_AV_BUFFER_SIZE , 0 );
189195 if (!dev -> av_pool ) {
190196 ret = - ENOMEM ;
191- goto destroy_rnic ;
197+ goto deregister_net_notifier ;
192198 }
193199
194200 ibdev_dbg (& dev -> ib_dev , "mdev=%p id=%d num_ports=%d\n" , mdev ,
@@ -205,15 +211,15 @@ static int mana_ib_probe(struct auxiliary_device *adev,
205211
206212deallocate_pool :
207213 dma_pool_destroy (dev -> av_pool );
214+ deregister_net_notifier :
215+ if (mana_ib_is_rnic (dev ))
216+ unregister_netdevice_notifier (& dev -> nb );
208217destroy_rnic :
209218 if (mana_ib_is_rnic (dev ))
210219 mana_ib_gd_destroy_rnic_adapter (dev );
211220destroy_eqs :
212221 if (mana_ib_is_rnic (dev ))
213222 mana_ib_destroy_eqs (dev );
214- deregister_net_notifier :
215- if (mana_ib_is_rnic (dev ))
216- unregister_netdevice_notifier (& dev -> nb );
217223free_ib_device :
218224 xa_destroy (& dev -> qp_table_wq );
219225 ib_dealloc_device (& dev -> ib_dev );
@@ -227,9 +233,9 @@ static void mana_ib_remove(struct auxiliary_device *adev)
227233 ib_unregister_device (& dev -> ib_dev );
228234 dma_pool_destroy (dev -> av_pool );
229235 if (mana_ib_is_rnic (dev )) {
236+ unregister_netdevice_notifier (& dev -> nb );
230237 mana_ib_gd_destroy_rnic_adapter (dev );
231238 mana_ib_destroy_eqs (dev );
232- unregister_netdevice_notifier (& dev -> nb );
233239 }
234240 xa_destroy (& dev -> qp_table_wq );
235241 ib_dealloc_device (& dev -> ib_dev );
0 commit comments