@@ -29,7 +29,7 @@ static const u8 ionic_qtype_versions[IONIC_QTYPE_MAX] = {
29
29
*/
30
30
};
31
31
32
- static void ionic_lif_rx_mode (struct ionic_lif * lif , unsigned int rx_mode );
32
+ static void ionic_lif_rx_mode (struct ionic_lif * lif );
33
33
static int ionic_lif_addr_add (struct ionic_lif * lif , const u8 * addr );
34
34
static int ionic_lif_addr_del (struct ionic_lif * lif , const u8 * addr );
35
35
static void ionic_link_status_check (struct ionic_lif * lif );
@@ -53,7 +53,19 @@ static void ionic_dim_work(struct work_struct *work)
53
53
cur_moder = net_dim_get_rx_moderation (dim -> mode , dim -> profile_ix );
54
54
qcq = container_of (dim , struct ionic_qcq , dim );
55
55
new_coal = ionic_coal_usec_to_hw (qcq -> q .lif -> ionic , cur_moder .usec );
56
- qcq -> intr .dim_coal_hw = new_coal ? new_coal : 1 ;
56
+ new_coal = new_coal ? new_coal : 1 ;
57
+
58
+ if (qcq -> intr .dim_coal_hw != new_coal ) {
59
+ unsigned int qi = qcq -> cq .bound_q -> index ;
60
+ struct ionic_lif * lif = qcq -> q .lif ;
61
+
62
+ qcq -> intr .dim_coal_hw = new_coal ;
63
+
64
+ ionic_intr_coal_init (lif -> ionic -> idev .intr_ctrl ,
65
+ lif -> rxqcqs [qi ]-> intr .index ,
66
+ qcq -> intr .dim_coal_hw );
67
+ }
68
+
57
69
dim -> state = DIM_START_MEASURE ;
58
70
}
59
71
@@ -77,7 +89,7 @@ static void ionic_lif_deferred_work(struct work_struct *work)
77
89
78
90
switch (w -> type ) {
79
91
case IONIC_DW_TYPE_RX_MODE :
80
- ionic_lif_rx_mode (lif , w -> rx_mode );
92
+ ionic_lif_rx_mode (lif );
81
93
break ;
82
94
case IONIC_DW_TYPE_RX_ADDR_ADD :
83
95
ionic_lif_addr_add (lif , w -> addr );
@@ -1301,10 +1313,8 @@ static int ionic_lif_addr_del(struct ionic_lif *lif, const u8 *addr)
1301
1313
return 0 ;
1302
1314
}
1303
1315
1304
- static int ionic_lif_addr (struct ionic_lif * lif , const u8 * addr , bool add ,
1305
- bool can_sleep )
1316
+ static int ionic_lif_addr (struct ionic_lif * lif , const u8 * addr , bool add )
1306
1317
{
1307
- struct ionic_deferred_work * work ;
1308
1318
unsigned int nmfilters ;
1309
1319
unsigned int nufilters ;
1310
1320
@@ -1330,97 +1340,46 @@ static int ionic_lif_addr(struct ionic_lif *lif, const u8 *addr, bool add,
1330
1340
lif -> nucast -- ;
1331
1341
}
1332
1342
1333
- if (!can_sleep ) {
1334
- work = kzalloc (sizeof (* work ), GFP_ATOMIC );
1335
- if (!work )
1336
- return - ENOMEM ;
1337
- work -> type = add ? IONIC_DW_TYPE_RX_ADDR_ADD :
1338
- IONIC_DW_TYPE_RX_ADDR_DEL ;
1339
- memcpy (work -> addr , addr , ETH_ALEN );
1340
- netdev_dbg (lif -> netdev , "deferred: rx_filter %s %pM\n" ,
1341
- add ? "add" : "del" , addr );
1342
- ionic_lif_deferred_enqueue (& lif -> deferred , work );
1343
- } else {
1344
- netdev_dbg (lif -> netdev , "rx_filter %s %pM\n" ,
1345
- add ? "add" : "del" , addr );
1346
- if (add )
1347
- return ionic_lif_addr_add (lif , addr );
1348
- else
1349
- return ionic_lif_addr_del (lif , addr );
1350
- }
1343
+ netdev_dbg (lif -> netdev , "rx_filter %s %pM\n" ,
1344
+ add ? "add" : "del" , addr );
1345
+ if (add )
1346
+ return ionic_lif_addr_add (lif , addr );
1347
+ else
1348
+ return ionic_lif_addr_del (lif , addr );
1351
1349
1352
1350
return 0 ;
1353
1351
}
1354
1352
1355
1353
static int ionic_addr_add (struct net_device * netdev , const u8 * addr )
1356
1354
{
1357
- return ionic_lif_addr (netdev_priv (netdev ), addr , ADD_ADDR , CAN_SLEEP );
1358
- }
1359
-
1360
- static int ionic_ndo_addr_add (struct net_device * netdev , const u8 * addr )
1361
- {
1362
- return ionic_lif_addr (netdev_priv (netdev ), addr , ADD_ADDR , CAN_NOT_SLEEP );
1355
+ return ionic_lif_addr (netdev_priv (netdev ), addr , ADD_ADDR );
1363
1356
}
1364
1357
1365
1358
static int ionic_addr_del (struct net_device * netdev , const u8 * addr )
1366
1359
{
1367
- return ionic_lif_addr (netdev_priv (netdev ), addr , DEL_ADDR , CAN_SLEEP );
1360
+ return ionic_lif_addr (netdev_priv (netdev ), addr , DEL_ADDR );
1368
1361
}
1369
1362
1370
- static int ionic_ndo_addr_del (struct net_device * netdev , const u8 * addr )
1363
+ static void ionic_lif_rx_mode (struct ionic_lif * lif )
1371
1364
{
1372
- return ionic_lif_addr (netdev_priv (netdev ), addr , DEL_ADDR , CAN_NOT_SLEEP );
1373
- }
1374
-
1375
- static void ionic_lif_rx_mode (struct ionic_lif * lif , unsigned int rx_mode )
1376
- {
1377
- struct ionic_admin_ctx ctx = {
1378
- .work = COMPLETION_INITIALIZER_ONSTACK (ctx .work ),
1379
- .cmd .rx_mode_set = {
1380
- .opcode = IONIC_CMD_RX_MODE_SET ,
1381
- .lif_index = cpu_to_le16 (lif -> index ),
1382
- .rx_mode = cpu_to_le16 (rx_mode ),
1383
- },
1384
- };
1365
+ struct net_device * netdev = lif -> netdev ;
1366
+ unsigned int nfilters ;
1367
+ unsigned int nd_flags ;
1385
1368
char buf [128 ];
1386
- int err ;
1369
+ u16 rx_mode ;
1387
1370
int i ;
1388
1371
#define REMAIN (__x ) (sizeof(buf) - (__x))
1389
1372
1390
- i = scnprintf (buf , sizeof (buf ), "rx_mode 0x%04x -> 0x%04x:" ,
1391
- lif -> rx_mode , rx_mode );
1392
- if (rx_mode & IONIC_RX_MODE_F_UNICAST )
1393
- i += scnprintf (& buf [i ], REMAIN (i ), " RX_MODE_F_UNICAST" );
1394
- if (rx_mode & IONIC_RX_MODE_F_MULTICAST )
1395
- i += scnprintf (& buf [i ], REMAIN (i ), " RX_MODE_F_MULTICAST" );
1396
- if (rx_mode & IONIC_RX_MODE_F_BROADCAST )
1397
- i += scnprintf (& buf [i ], REMAIN (i ), " RX_MODE_F_BROADCAST" );
1398
- if (rx_mode & IONIC_RX_MODE_F_PROMISC )
1399
- i += scnprintf (& buf [i ], REMAIN (i ), " RX_MODE_F_PROMISC" );
1400
- if (rx_mode & IONIC_RX_MODE_F_ALLMULTI )
1401
- i += scnprintf (& buf [i ], REMAIN (i ), " RX_MODE_F_ALLMULTI" );
1402
- netdev_dbg (lif -> netdev , "lif%d %s\n" , lif -> index , buf );
1403
-
1404
- err = ionic_adminq_post_wait (lif , & ctx );
1405
- if (err )
1406
- netdev_warn (lif -> netdev , "set rx_mode 0x%04x failed: %d\n" ,
1407
- rx_mode , err );
1408
- else
1409
- lif -> rx_mode = rx_mode ;
1410
- }
1373
+ mutex_lock (& lif -> config_lock );
1411
1374
1412
- static void ionic_set_rx_mode (struct net_device * netdev , bool can_sleep )
1413
- {
1414
- struct ionic_lif * lif = netdev_priv (netdev );
1415
- struct ionic_deferred_work * work ;
1416
- unsigned int nfilters ;
1417
- unsigned int rx_mode ;
1375
+ /* grab the flags once for local use */
1376
+ nd_flags = netdev -> flags ;
1418
1377
1419
1378
rx_mode = IONIC_RX_MODE_F_UNICAST ;
1420
- rx_mode |= (netdev -> flags & IFF_MULTICAST ) ? IONIC_RX_MODE_F_MULTICAST : 0 ;
1421
- rx_mode |= (netdev -> flags & IFF_BROADCAST ) ? IONIC_RX_MODE_F_BROADCAST : 0 ;
1422
- rx_mode |= (netdev -> flags & IFF_PROMISC ) ? IONIC_RX_MODE_F_PROMISC : 0 ;
1423
- rx_mode |= (netdev -> flags & IFF_ALLMULTI ) ? IONIC_RX_MODE_F_ALLMULTI : 0 ;
1379
+ rx_mode |= (nd_flags & IFF_MULTICAST ) ? IONIC_RX_MODE_F_MULTICAST : 0 ;
1380
+ rx_mode |= (nd_flags & IFF_BROADCAST ) ? IONIC_RX_MODE_F_BROADCAST : 0 ;
1381
+ rx_mode |= (nd_flags & IFF_PROMISC ) ? IONIC_RX_MODE_F_PROMISC : 0 ;
1382
+ rx_mode |= (nd_flags & IFF_ALLMULTI ) ? IONIC_RX_MODE_F_ALLMULTI : 0 ;
1424
1383
1425
1384
/* sync unicast addresses
1426
1385
* next check to see if we're in an overflow state
@@ -1429,49 +1388,83 @@ static void ionic_set_rx_mode(struct net_device *netdev, bool can_sleep)
1429
1388
* we remove our overflow flag and check the netdev flags
1430
1389
* to see if we can disable NIC PROMISC
1431
1390
*/
1432
- if (can_sleep )
1433
- __dev_uc_sync (netdev , ionic_addr_add , ionic_addr_del );
1434
- else
1435
- __dev_uc_sync (netdev , ionic_ndo_addr_add , ionic_ndo_addr_del );
1391
+ __dev_uc_sync (netdev , ionic_addr_add , ionic_addr_del );
1436
1392
nfilters = le32_to_cpu (lif -> identity -> eth .max_ucast_filters );
1437
1393
if (netdev_uc_count (netdev ) + 1 > nfilters ) {
1438
1394
rx_mode |= IONIC_RX_MODE_F_PROMISC ;
1439
1395
lif -> uc_overflow = true;
1440
1396
} else if (lif -> uc_overflow ) {
1441
1397
lif -> uc_overflow = false;
1442
- if (!(netdev -> flags & IFF_PROMISC ))
1398
+ if (!(nd_flags & IFF_PROMISC ))
1443
1399
rx_mode &= ~IONIC_RX_MODE_F_PROMISC ;
1444
1400
}
1445
1401
1446
1402
/* same for multicast */
1447
- if (can_sleep )
1448
- __dev_mc_sync (netdev , ionic_addr_add , ionic_addr_del );
1449
- else
1450
- __dev_mc_sync (netdev , ionic_ndo_addr_add , ionic_ndo_addr_del );
1403
+ __dev_mc_sync (netdev , ionic_addr_add , ionic_addr_del );
1451
1404
nfilters = le32_to_cpu (lif -> identity -> eth .max_mcast_filters );
1452
1405
if (netdev_mc_count (netdev ) > nfilters ) {
1453
1406
rx_mode |= IONIC_RX_MODE_F_ALLMULTI ;
1454
1407
lif -> mc_overflow = true;
1455
1408
} else if (lif -> mc_overflow ) {
1456
1409
lif -> mc_overflow = false;
1457
- if (!(netdev -> flags & IFF_ALLMULTI ))
1410
+ if (!(nd_flags & IFF_ALLMULTI ))
1458
1411
rx_mode &= ~IONIC_RX_MODE_F_ALLMULTI ;
1459
1412
}
1460
1413
1414
+ i = scnprintf (buf , sizeof (buf ), "rx_mode 0x%04x -> 0x%04x:" ,
1415
+ lif -> rx_mode , rx_mode );
1416
+ if (rx_mode & IONIC_RX_MODE_F_UNICAST )
1417
+ i += scnprintf (& buf [i ], REMAIN (i ), " RX_MODE_F_UNICAST" );
1418
+ if (rx_mode & IONIC_RX_MODE_F_MULTICAST )
1419
+ i += scnprintf (& buf [i ], REMAIN (i ), " RX_MODE_F_MULTICAST" );
1420
+ if (rx_mode & IONIC_RX_MODE_F_BROADCAST )
1421
+ i += scnprintf (& buf [i ], REMAIN (i ), " RX_MODE_F_BROADCAST" );
1422
+ if (rx_mode & IONIC_RX_MODE_F_PROMISC )
1423
+ i += scnprintf (& buf [i ], REMAIN (i ), " RX_MODE_F_PROMISC" );
1424
+ if (rx_mode & IONIC_RX_MODE_F_ALLMULTI )
1425
+ i += scnprintf (& buf [i ], REMAIN (i ), " RX_MODE_F_ALLMULTI" );
1426
+ if (rx_mode & IONIC_RX_MODE_F_RDMA_SNIFFER )
1427
+ i += scnprintf (& buf [i ], REMAIN (i ), " RX_MODE_F_RDMA_SNIFFER" );
1428
+ netdev_dbg (netdev , "lif%d %s\n" , lif -> index , buf );
1429
+
1461
1430
if (lif -> rx_mode != rx_mode ) {
1462
- if (!can_sleep ) {
1463
- work = kzalloc (sizeof (* work ), GFP_ATOMIC );
1464
- if (!work ) {
1465
- netdev_err (lif -> netdev , "rxmode change dropped\n" );
1466
- return ;
1467
- }
1468
- work -> type = IONIC_DW_TYPE_RX_MODE ;
1469
- work -> rx_mode = rx_mode ;
1470
- netdev_dbg (lif -> netdev , "deferred: rx_mode\n" );
1471
- ionic_lif_deferred_enqueue (& lif -> deferred , work );
1472
- } else {
1473
- ionic_lif_rx_mode (lif , rx_mode );
1431
+ struct ionic_admin_ctx ctx = {
1432
+ .work = COMPLETION_INITIALIZER_ONSTACK (ctx .work ),
1433
+ .cmd .rx_mode_set = {
1434
+ .opcode = IONIC_CMD_RX_MODE_SET ,
1435
+ .lif_index = cpu_to_le16 (lif -> index ),
1436
+ },
1437
+ };
1438
+ int err ;
1439
+
1440
+ ctx .cmd .rx_mode_set .rx_mode = cpu_to_le16 (rx_mode );
1441
+ err = ionic_adminq_post_wait (lif , & ctx );
1442
+ if (err )
1443
+ netdev_warn (netdev , "set rx_mode 0x%04x failed: %d\n" ,
1444
+ rx_mode , err );
1445
+ else
1446
+ lif -> rx_mode = rx_mode ;
1447
+ }
1448
+
1449
+ mutex_unlock (& lif -> config_lock );
1450
+ }
1451
+
1452
+ static void ionic_set_rx_mode (struct net_device * netdev , bool can_sleep )
1453
+ {
1454
+ struct ionic_lif * lif = netdev_priv (netdev );
1455
+ struct ionic_deferred_work * work ;
1456
+
1457
+ if (!can_sleep ) {
1458
+ work = kzalloc (sizeof (* work ), GFP_ATOMIC );
1459
+ if (!work ) {
1460
+ netdev_err (lif -> netdev , "rxmode change dropped\n" );
1461
+ return ;
1474
1462
}
1463
+ work -> type = IONIC_DW_TYPE_RX_MODE ;
1464
+ netdev_dbg (lif -> netdev , "deferred: rx_mode\n" );
1465
+ ionic_lif_deferred_enqueue (& lif -> deferred , work );
1466
+ } else {
1467
+ ionic_lif_rx_mode (lif );
1475
1468
}
1476
1469
}
1477
1470
@@ -3058,6 +3051,7 @@ void ionic_lif_deinit(struct ionic_lif *lif)
3058
3051
ionic_lif_qcq_deinit (lif , lif -> notifyqcq );
3059
3052
ionic_lif_qcq_deinit (lif , lif -> adminqcq );
3060
3053
3054
+ mutex_destroy (& lif -> config_lock );
3061
3055
mutex_destroy (& lif -> queue_lock );
3062
3056
ionic_lif_reset (lif );
3063
3057
}
@@ -3185,7 +3179,7 @@ static int ionic_station_set(struct ionic_lif *lif)
3185
3179
*/
3186
3180
if (!ether_addr_equal (ctx .comp .lif_getattr .mac ,
3187
3181
netdev -> dev_addr ))
3188
- ionic_lif_addr (lif , netdev -> dev_addr , ADD_ADDR , CAN_SLEEP );
3182
+ ionic_lif_addr (lif , netdev -> dev_addr , ADD_ADDR );
3189
3183
} else {
3190
3184
/* Update the netdev mac with the device's mac */
3191
3185
memcpy (addr .sa_data , ctx .comp .lif_getattr .mac , netdev -> addr_len );
@@ -3202,7 +3196,7 @@ static int ionic_station_set(struct ionic_lif *lif)
3202
3196
3203
3197
netdev_dbg (lif -> netdev , "adding station MAC addr %pM\n" ,
3204
3198
netdev -> dev_addr );
3205
- ionic_lif_addr (lif , netdev -> dev_addr , ADD_ADDR , CAN_SLEEP );
3199
+ ionic_lif_addr (lif , netdev -> dev_addr , ADD_ADDR );
3206
3200
3207
3201
return 0 ;
3208
3202
}
@@ -3225,6 +3219,7 @@ int ionic_lif_init(struct ionic_lif *lif)
3225
3219
3226
3220
lif -> hw_index = le16_to_cpu (comp .hw_index );
3227
3221
mutex_init (& lif -> queue_lock );
3222
+ mutex_init (& lif -> config_lock );
3228
3223
3229
3224
/* now that we have the hw_index we can figure out our doorbell page */
3230
3225
lif -> dbid_count = le32_to_cpu (lif -> ionic -> ident .dev .ndbpgs_per_lif );
0 commit comments