34
34
* SOFTWARE.
35
35
*/
36
36
37
+ #include <linux/init.h>
37
38
#include <linux/hardirq.h>
38
39
#include <linux/export.h>
39
- #include <linux/gfp.h>
40
40
41
41
#include <linux/mlx4/cmd.h>
42
42
#include <linux/mlx4/cq.h>
@@ -81,7 +81,7 @@ void mlx4_cq_completion(struct mlx4_dev *dev, u32 cqn)
81
81
cq = radix_tree_lookup (& mlx4_priv (dev )-> cq_table .tree ,
82
82
cqn & (dev -> caps .num_cqs - 1 ));
83
83
if (!cq ) {
84
- mlx4_warn (dev , "Completion event for bogus CQ %08x\n" , cqn );
84
+ mlx4_dbg (dev , "Completion event for bogus CQ %08x\n" , cqn );
85
85
return ;
86
86
}
87
87
@@ -117,8 +117,9 @@ void mlx4_cq_event(struct mlx4_dev *dev, u32 cqn, int event_type)
117
117
static int mlx4_SW2HW_CQ (struct mlx4_dev * dev , struct mlx4_cmd_mailbox * mailbox ,
118
118
int cq_num )
119
119
{
120
- return mlx4_cmd (dev , mailbox -> dma , cq_num , 0 , MLX4_CMD_SW2HW_CQ ,
121
- MLX4_CMD_TIME_CLASS_A , MLX4_CMD_WRAPPED );
120
+ return mlx4_cmd (dev , mailbox -> dma | dev -> caps .function , cq_num , 0 ,
121
+ MLX4_CMD_SW2HW_CQ , MLX4_CMD_TIME_CLASS_A ,
122
+ MLX4_CMD_WRAPPED );
122
123
}
123
124
124
125
static int mlx4_MODIFY_CQ (struct mlx4_dev * dev , struct mlx4_cmd_mailbox * mailbox ,
@@ -131,8 +132,8 @@ static int mlx4_MODIFY_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox
131
132
static int mlx4_HW2SW_CQ (struct mlx4_dev * dev , struct mlx4_cmd_mailbox * mailbox ,
132
133
int cq_num )
133
134
{
134
- return mlx4_cmd_box (dev , 0 , mailbox ? mailbox -> dma : 0 , cq_num ,
135
- mailbox ? 0 : 1 , MLX4_CMD_HW2SW_CQ ,
135
+ return mlx4_cmd_box (dev , dev -> caps . function , mailbox ? mailbox -> dma : 0 ,
136
+ cq_num , mailbox ? 0 : 1 , MLX4_CMD_HW2SW_CQ ,
136
137
MLX4_CMD_TIME_CLASS_A , MLX4_CMD_WRAPPED );
137
138
}
138
139
@@ -188,6 +189,78 @@ int mlx4_cq_resize(struct mlx4_dev *dev, struct mlx4_cq *cq,
188
189
}
189
190
EXPORT_SYMBOL_GPL (mlx4_cq_resize );
190
191
192
+ static int __mlx4_cq_alloc_icm (struct mlx4_dev * dev , int * cqn )
193
+ {
194
+ struct mlx4_priv * priv = mlx4_priv (dev );
195
+ struct mlx4_cq_table * cq_table = & priv -> cq_table ;
196
+ int err ;
197
+
198
+ * cqn = mlx4_bitmap_alloc (& cq_table -> bitmap );
199
+ if (* cqn == -1 )
200
+ return - ENOMEM ;
201
+
202
+ err = mlx4_table_get (dev , & cq_table -> table , * cqn );
203
+ if (err )
204
+ goto err_out ;
205
+
206
+ err = mlx4_table_get (dev , & cq_table -> cmpt_table , * cqn );
207
+ if (err )
208
+ goto err_put ;
209
+ return 0 ;
210
+
211
+ err_put :
212
+ mlx4_table_put (dev , & cq_table -> table , * cqn );
213
+
214
+ err_out :
215
+ mlx4_bitmap_free (& cq_table -> bitmap , * cqn );
216
+ return err ;
217
+ }
218
+
219
+ static int mlx4_cq_alloc_icm (struct mlx4_dev * dev , int * cqn )
220
+ {
221
+ u64 out_param ;
222
+ int err ;
223
+
224
+ if (mlx4_is_mfunc (dev )) {
225
+ err = mlx4_cmd_imm (dev , 0 , & out_param , RES_CQ ,
226
+ RES_OP_RESERVE_AND_MAP , MLX4_CMD_ALLOC_RES ,
227
+ MLX4_CMD_TIME_CLASS_A , MLX4_CMD_WRAPPED );
228
+ if (err )
229
+ return err ;
230
+ else {
231
+ * cqn = get_param_l (& out_param );
232
+ return 0 ;
233
+ }
234
+ }
235
+ return __mlx4_cq_alloc_icm (dev , cqn );
236
+ }
237
+
238
+ static void __mlx4_cq_free_icm (struct mlx4_dev * dev , int cqn )
239
+ {
240
+ struct mlx4_priv * priv = mlx4_priv (dev );
241
+ struct mlx4_cq_table * cq_table = & priv -> cq_table ;
242
+
243
+ mlx4_table_put (dev , & cq_table -> cmpt_table , cqn );
244
+ mlx4_table_put (dev , & cq_table -> table , cqn );
245
+ mlx4_bitmap_free (& cq_table -> bitmap , cqn );
246
+ }
247
+
248
+ static void mlx4_cq_free_icm (struct mlx4_dev * dev , int cqn )
249
+ {
250
+ u64 in_param ;
251
+ int err ;
252
+
253
+ if (mlx4_is_mfunc (dev )) {
254
+ set_param_l (& in_param , cqn );
255
+ err = mlx4_cmd (dev , in_param , RES_CQ , RES_OP_RESERVE_AND_MAP ,
256
+ MLX4_CMD_FREE_RES ,
257
+ MLX4_CMD_TIME_CLASS_A , MLX4_CMD_WRAPPED );
258
+ if (err )
259
+ mlx4_warn (dev , "Failed freeing cq:%d\n" , cqn );
260
+ } else
261
+ __mlx4_cq_free_icm (dev , cqn );
262
+ }
263
+
191
264
int mlx4_cq_alloc (struct mlx4_dev * dev , int nent , struct mlx4_mtt * mtt ,
192
265
struct mlx4_uar * uar , u64 db_rec , struct mlx4_cq * cq ,
193
266
unsigned vector , int collapsed )
@@ -204,23 +277,15 @@ int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct mlx4_mtt *mtt,
204
277
205
278
cq -> vector = vector ;
206
279
207
- cq -> cqn = mlx4_bitmap_alloc (& cq_table -> bitmap );
208
- if (cq -> cqn == -1 )
209
- return - ENOMEM ;
210
-
211
- err = mlx4_table_get (dev , & cq_table -> table , cq -> cqn );
212
- if (err )
213
- goto err_out ;
214
-
215
- err = mlx4_table_get (dev , & cq_table -> cmpt_table , cq -> cqn );
280
+ err = mlx4_cq_alloc_icm (dev , & cq -> cqn );
216
281
if (err )
217
- goto err_put ;
282
+ return err ;
218
283
219
284
spin_lock_irq (& cq_table -> lock );
220
285
err = radix_tree_insert (& cq_table -> tree , cq -> cqn , cq );
221
286
spin_unlock_irq (& cq_table -> lock );
222
287
if (err )
223
- goto err_cmpt_put ;
288
+ goto err_icm ;
224
289
225
290
mailbox = mlx4_alloc_cmd_mailbox (dev );
226
291
if (IS_ERR (mailbox )) {
@@ -259,14 +324,8 @@ int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct mlx4_mtt *mtt,
259
324
radix_tree_delete (& cq_table -> tree , cq -> cqn );
260
325
spin_unlock_irq (& cq_table -> lock );
261
326
262
- err_cmpt_put :
263
- mlx4_table_put (dev , & cq_table -> cmpt_table , cq -> cqn );
264
-
265
- err_put :
266
- mlx4_table_put (dev , & cq_table -> table , cq -> cqn );
267
-
268
- err_out :
269
- mlx4_bitmap_free (& cq_table -> bitmap , cq -> cqn );
327
+ err_icm :
328
+ mlx4_cq_free_icm (dev , cq -> cqn );
270
329
271
330
return err ;
272
331
}
@@ -292,8 +351,7 @@ void mlx4_cq_free(struct mlx4_dev *dev, struct mlx4_cq *cq)
292
351
complete (& cq -> free );
293
352
wait_for_completion (& cq -> free );
294
353
295
- mlx4_table_put (dev , & cq_table -> table , cq -> cqn );
296
- mlx4_bitmap_free (& cq_table -> bitmap , cq -> cqn );
354
+ mlx4_cq_free_icm (dev , cq -> cqn );
297
355
}
298
356
EXPORT_SYMBOL_GPL (mlx4_cq_free );
299
357
@@ -304,6 +362,8 @@ int mlx4_init_cq_table(struct mlx4_dev *dev)
304
362
305
363
spin_lock_init (& cq_table -> lock );
306
364
INIT_RADIX_TREE (& cq_table -> tree , GFP_ATOMIC );
365
+ if (mlx4_is_slave (dev ))
366
+ return 0 ;
307
367
308
368
err = mlx4_bitmap_init (& cq_table -> bitmap , dev -> caps .num_cqs ,
309
369
dev -> caps .num_cqs - 1 , dev -> caps .reserved_cqs , 0 );
@@ -315,6 +375,8 @@ int mlx4_init_cq_table(struct mlx4_dev *dev)
315
375
316
376
void mlx4_cleanup_cq_table (struct mlx4_dev * dev )
317
377
{
378
+ if (mlx4_is_slave (dev ))
379
+ return ;
318
380
/* Nothing to do to clean up radix_tree */
319
381
mlx4_bitmap_cleanup (& mlx4_priv (dev )-> cq_table .bitmap );
320
382
}
0 commit comments