@@ -1548,7 +1548,6 @@ static void clean_debug_files(struct mlx5_core_dev *dev)
1548
1548
if (!mlx5_debugfs_root )
1549
1549
return ;
1550
1550
1551
- mlx5_cmdif_debugfs_cleanup (dev );
1552
1551
debugfs_remove_recursive (dbg -> dbg_root );
1553
1552
}
1554
1553
@@ -1563,8 +1562,6 @@ static void create_debugfs_files(struct mlx5_core_dev *dev)
1563
1562
debugfs_create_file ("out_len" , 0600 , dbg -> dbg_root , dev , & olfops );
1564
1563
debugfs_create_u8 ("status" , 0600 , dbg -> dbg_root , & dbg -> status );
1565
1564
debugfs_create_file ("run" , 0200 , dbg -> dbg_root , dev , & fops );
1566
-
1567
- mlx5_cmdif_debugfs_init (dev );
1568
1565
}
1569
1566
1570
1567
void mlx5_cmd_allowed_opcode (struct mlx5_core_dev * dev , u16 opcode )
@@ -2190,19 +2187,10 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev)
2190
2187
int size = sizeof (struct mlx5_cmd_prot_block );
2191
2188
int align = roundup_pow_of_two (size );
2192
2189
struct mlx5_cmd * cmd = & dev -> cmd ;
2193
- u32 cmd_h , cmd_l ;
2190
+ u32 cmd_l ;
2194
2191
int err ;
2195
2192
int i ;
2196
2193
2197
- memset (cmd , 0 , sizeof (* cmd ));
2198
- cmd -> vars .cmdif_rev = cmdif_rev (dev );
2199
- if (cmd -> vars .cmdif_rev != CMD_IF_REV ) {
2200
- mlx5_core_err (dev ,
2201
- "Driver cmdif rev(%d) differs from firmware's(%d)\n" ,
2202
- CMD_IF_REV , cmd -> vars .cmdif_rev );
2203
- return - EINVAL ;
2204
- }
2205
-
2206
2194
cmd -> pool = dma_pool_create ("mlx5_cmd" , mlx5_core_dma_dev (dev ), size , align , 0 );
2207
2195
if (!cmd -> pool )
2208
2196
return - ENOMEM ;
@@ -2211,43 +2199,93 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev)
2211
2199
if (err )
2212
2200
goto err_free_pool ;
2213
2201
2202
+ cmd_l = (u32 )(cmd -> dma );
2203
+ if (cmd_l & 0xfff ) {
2204
+ mlx5_core_err (dev , "invalid command queue address\n" );
2205
+ err = - ENOMEM ;
2206
+ goto err_cmd_page ;
2207
+ }
2208
+ cmd -> checksum_disabled = 1 ;
2209
+
2210
+ spin_lock_init (& cmd -> alloc_lock );
2211
+ spin_lock_init (& cmd -> token_lock );
2212
+ for (i = 0 ; i < MLX5_CMD_OP_MAX ; i ++ )
2213
+ spin_lock_init (& cmd -> stats [i ].lock );
2214
+
2215
+ create_msg_cache (dev );
2216
+
2217
+ set_wqname (dev );
2218
+ cmd -> wq = create_singlethread_workqueue (cmd -> wq_name );
2219
+ if (!cmd -> wq ) {
2220
+ mlx5_core_err (dev , "failed to create command workqueue\n" );
2221
+ err = - ENOMEM ;
2222
+ goto err_cache ;
2223
+ }
2224
+
2225
+ mlx5_cmdif_debugfs_init (dev );
2226
+
2227
+ return 0 ;
2228
+
2229
+ err_cache :
2230
+ destroy_msg_cache (dev );
2231
+ err_cmd_page :
2232
+ free_cmd_page (dev , cmd );
2233
+ err_free_pool :
2234
+ dma_pool_destroy (cmd -> pool );
2235
+ return err ;
2236
+ }
2237
+
2238
+ void mlx5_cmd_cleanup (struct mlx5_core_dev * dev )
2239
+ {
2240
+ struct mlx5_cmd * cmd = & dev -> cmd ;
2241
+
2242
+ mlx5_cmdif_debugfs_cleanup (dev );
2243
+ destroy_workqueue (cmd -> wq );
2244
+ destroy_msg_cache (dev );
2245
+ free_cmd_page (dev , cmd );
2246
+ dma_pool_destroy (cmd -> pool );
2247
+ }
2248
+
2249
+ int mlx5_cmd_enable (struct mlx5_core_dev * dev )
2250
+ {
2251
+ struct mlx5_cmd * cmd = & dev -> cmd ;
2252
+ u32 cmd_h , cmd_l ;
2253
+
2254
+ memset (& cmd -> vars , 0 , sizeof (cmd -> vars ));
2255
+ cmd -> vars .cmdif_rev = cmdif_rev (dev );
2256
+ if (cmd -> vars .cmdif_rev != CMD_IF_REV ) {
2257
+ mlx5_core_err (dev ,
2258
+ "Driver cmdif rev(%d) differs from firmware's(%d)\n" ,
2259
+ CMD_IF_REV , cmd -> vars .cmdif_rev );
2260
+ return - EINVAL ;
2261
+ }
2262
+
2214
2263
cmd_l = ioread32be (& dev -> iseg -> cmdq_addr_l_sz ) & 0xff ;
2215
2264
cmd -> vars .log_sz = cmd_l >> 4 & 0xf ;
2216
2265
cmd -> vars .log_stride = cmd_l & 0xf ;
2217
2266
if (1 << cmd -> vars .log_sz > MLX5_MAX_COMMANDS ) {
2218
2267
mlx5_core_err (dev , "firmware reports too many outstanding commands %d\n" ,
2219
2268
1 << cmd -> vars .log_sz );
2220
- err = - EINVAL ;
2221
- goto err_free_page ;
2269
+ return - EINVAL ;
2222
2270
}
2223
2271
2224
2272
if (cmd -> vars .log_sz + cmd -> vars .log_stride > MLX5_ADAPTER_PAGE_SHIFT ) {
2225
2273
mlx5_core_err (dev , "command queue size overflow\n" );
2226
- err = - EINVAL ;
2227
- goto err_free_page ;
2274
+ return - EINVAL ;
2228
2275
}
2229
2276
2230
2277
cmd -> state = MLX5_CMDIF_STATE_DOWN ;
2231
- cmd -> checksum_disabled = 1 ;
2232
2278
cmd -> vars .max_reg_cmds = (1 << cmd -> vars .log_sz ) - 1 ;
2233
2279
cmd -> vars .bitmask = (1UL << cmd -> vars .max_reg_cmds ) - 1 ;
2234
2280
2235
- spin_lock_init (& cmd -> alloc_lock );
2236
- spin_lock_init (& cmd -> token_lock );
2237
- for (i = 0 ; i < MLX5_CMD_OP_MAX ; i ++ )
2238
- spin_lock_init (& cmd -> stats [i ].lock );
2239
-
2240
2281
sema_init (& cmd -> vars .sem , cmd -> vars .max_reg_cmds );
2241
2282
sema_init (& cmd -> vars .pages_sem , 1 );
2242
2283
sema_init (& cmd -> vars .throttle_sem , DIV_ROUND_UP (cmd -> vars .max_reg_cmds , 2 ));
2243
2284
2244
2285
cmd_h = (u32 )((u64 )(cmd -> dma ) >> 32 );
2245
2286
cmd_l = (u32 )(cmd -> dma );
2246
- if (cmd_l & 0xfff ) {
2247
- mlx5_core_err (dev , "invalid command queue address\n" );
2248
- err = - ENOMEM ;
2249
- goto err_free_page ;
2250
- }
2287
+ if (WARN_ON (cmd_l & 0xfff ))
2288
+ return - EINVAL ;
2251
2289
2252
2290
iowrite32be (cmd_h , & dev -> iseg -> cmdq_addr_h );
2253
2291
iowrite32be (cmd_l , & dev -> iseg -> cmdq_addr_l_sz );
@@ -2260,40 +2298,17 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev)
2260
2298
cmd -> mode = CMD_MODE_POLLING ;
2261
2299
cmd -> allowed_opcode = CMD_ALLOWED_OPCODE_ALL ;
2262
2300
2263
- create_msg_cache (dev );
2264
-
2265
- set_wqname (dev );
2266
- cmd -> wq = create_singlethread_workqueue (cmd -> wq_name );
2267
- if (!cmd -> wq ) {
2268
- mlx5_core_err (dev , "failed to create command workqueue\n" );
2269
- err = - ENOMEM ;
2270
- goto err_cache ;
2271
- }
2272
-
2273
2301
create_debugfs_files (dev );
2274
2302
2275
2303
return 0 ;
2276
-
2277
- err_cache :
2278
- destroy_msg_cache (dev );
2279
-
2280
- err_free_page :
2281
- free_cmd_page (dev , cmd );
2282
-
2283
- err_free_pool :
2284
- dma_pool_destroy (cmd -> pool );
2285
- return err ;
2286
2304
}
2287
2305
2288
- void mlx5_cmd_cleanup (struct mlx5_core_dev * dev )
2306
+ void mlx5_cmd_disable (struct mlx5_core_dev * dev )
2289
2307
{
2290
2308
struct mlx5_cmd * cmd = & dev -> cmd ;
2291
2309
2292
2310
clean_debug_files (dev );
2293
- destroy_workqueue (cmd -> wq );
2294
- destroy_msg_cache (dev );
2295
- free_cmd_page (dev , cmd );
2296
- dma_pool_destroy (cmd -> pool );
2311
+ flush_workqueue (cmd -> wq );
2297
2312
}
2298
2313
2299
2314
void mlx5_cmd_set_state (struct mlx5_core_dev * dev ,
0 commit comments