@@ -77,28 +77,31 @@ static int mana_ib_netdev_event(struct notifier_block *this,
77
77
struct gdma_context * gc = dev -> gdma_dev -> gdma_context ;
78
78
struct mana_context * mc = gc -> mana .driver_data ;
79
79
struct net_device * ndev ;
80
+ int i ;
80
81
81
82
/* 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 ;
102
105
}
103
106
104
107
static int mana_ib_probe (struct auxiliary_device * adev ,
@@ -111,7 +114,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
111
114
struct net_device * ndev ;
112
115
struct mana_ib_dev * dev ;
113
116
u8 mac_addr [ETH_ALEN ];
114
- int ret ;
117
+ int ret , i ;
115
118
116
119
dev = ib_alloc_device (mana_ib_dev , ib_dev );
117
120
if (!dev )
@@ -126,34 +129,11 @@ static int mana_ib_probe(struct auxiliary_device *adev,
126
129
127
130
if (mana_ib_is_rnic (dev )) {
128
131
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 );
153
133
ret = mana_ib_gd_query_adapter_caps (dev );
154
134
if (ret ) {
155
135
ibdev_err (& dev -> ib_dev , "Failed to query device caps, ret %d" , ret );
156
- goto deregister_net_notifier ;
136
+ goto free_ib_device ;
157
137
}
158
138
159
139
ib_set_device_ops (& dev -> ib_dev , & mana_ib_stats_ops );
@@ -163,16 +143,42 @@ static int mana_ib_probe(struct auxiliary_device *adev,
163
143
ret = mana_ib_create_eqs (dev );
164
144
if (ret ) {
165
145
ibdev_err (& dev -> ib_dev , "Failed to create EQs, ret %d" , ret );
166
- goto deregister_net_notifier ;
146
+ goto free_ib_device ;
167
147
}
168
148
169
149
ret = mana_ib_gd_create_rnic_adapter (dev );
170
150
if (ret )
171
151
goto destroy_eqs ;
172
152
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 );
174
180
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 );
176
182
goto destroy_rnic ;
177
183
}
178
184
} else {
@@ -188,7 +194,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
188
194
MANA_AV_BUFFER_SIZE , 0 );
189
195
if (!dev -> av_pool ) {
190
196
ret = - ENOMEM ;
191
- goto destroy_rnic ;
197
+ goto deregister_net_notifier ;
192
198
}
193
199
194
200
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,
205
211
206
212
deallocate_pool :
207
213
dma_pool_destroy (dev -> av_pool );
214
+ deregister_net_notifier :
215
+ if (mana_ib_is_rnic (dev ))
216
+ unregister_netdevice_notifier (& dev -> nb );
208
217
destroy_rnic :
209
218
if (mana_ib_is_rnic (dev ))
210
219
mana_ib_gd_destroy_rnic_adapter (dev );
211
220
destroy_eqs :
212
221
if (mana_ib_is_rnic (dev ))
213
222
mana_ib_destroy_eqs (dev );
214
- deregister_net_notifier :
215
- if (mana_ib_is_rnic (dev ))
216
- unregister_netdevice_notifier (& dev -> nb );
217
223
free_ib_device :
218
224
xa_destroy (& dev -> qp_table_wq );
219
225
ib_dealloc_device (& dev -> ib_dev );
@@ -227,9 +233,9 @@ static void mana_ib_remove(struct auxiliary_device *adev)
227
233
ib_unregister_device (& dev -> ib_dev );
228
234
dma_pool_destroy (dev -> av_pool );
229
235
if (mana_ib_is_rnic (dev )) {
236
+ unregister_netdevice_notifier (& dev -> nb );
230
237
mana_ib_gd_destroy_rnic_adapter (dev );
231
238
mana_ib_destroy_eqs (dev );
232
- unregister_netdevice_notifier (& dev -> nb );
233
239
}
234
240
xa_destroy (& dev -> qp_table_wq );
235
241
ib_dealloc_device (& dev -> ib_dev );
0 commit comments