@@ -316,6 +316,11 @@ static void igc_get_regs(struct net_device *netdev,
316
316
regs_buff [172 + i ] = rd32 (IGC_RAL (i ));
317
317
for (i = 0 ; i < 16 ; i ++ )
318
318
regs_buff [188 + i ] = rd32 (IGC_RAH (i ));
319
+
320
+ regs_buff [204 ] = rd32 (IGC_VLANPQF );
321
+
322
+ for (i = 0 ; i < 8 ; i ++ )
323
+ regs_buff [205 + i ] = rd32 (IGC_ETQF (i ));
319
324
}
320
325
321
326
static void igc_get_wol (struct net_device * netdev , struct ethtool_wolinfo * wol )
@@ -1181,75 +1186,6 @@ static int igc_set_rss_hash_opt(struct igc_adapter *adapter,
1181
1186
return 0 ;
1182
1187
}
1183
1188
1184
- static int igc_rxnfc_write_etype_filter (struct igc_adapter * adapter ,
1185
- struct igc_nfc_filter * input )
1186
- {
1187
- struct igc_hw * hw = & adapter -> hw ;
1188
- u8 i ;
1189
- u32 etqf ;
1190
- u16 etype ;
1191
-
1192
- /* find an empty etype filter register */
1193
- for (i = 0 ; i < MAX_ETYPE_FILTER ; ++ i ) {
1194
- if (!adapter -> etype_bitmap [i ])
1195
- break ;
1196
- }
1197
- if (i == MAX_ETYPE_FILTER ) {
1198
- netdev_err (adapter -> netdev ,
1199
- "ethtool -N: etype filters are all used\n" );
1200
- return - EINVAL ;
1201
- }
1202
-
1203
- adapter -> etype_bitmap [i ] = true;
1204
-
1205
- etqf = rd32 (IGC_ETQF (i ));
1206
- etype = ntohs (input -> filter .etype & ETHER_TYPE_FULL_MASK );
1207
-
1208
- etqf |= IGC_ETQF_FILTER_ENABLE ;
1209
- etqf &= ~IGC_ETQF_ETYPE_MASK ;
1210
- etqf |= (etype & IGC_ETQF_ETYPE_MASK );
1211
-
1212
- etqf &= ~IGC_ETQF_QUEUE_MASK ;
1213
- etqf |= ((input -> action << IGC_ETQF_QUEUE_SHIFT )
1214
- & IGC_ETQF_QUEUE_MASK );
1215
- etqf |= IGC_ETQF_QUEUE_ENABLE ;
1216
-
1217
- wr32 (IGC_ETQF (i ), etqf );
1218
-
1219
- input -> etype_reg_index = i ;
1220
-
1221
- return 0 ;
1222
- }
1223
-
1224
- static int igc_rxnfc_write_vlan_prio_filter (struct igc_adapter * adapter ,
1225
- struct igc_nfc_filter * input )
1226
- {
1227
- struct igc_hw * hw = & adapter -> hw ;
1228
- u8 vlan_priority ;
1229
- u16 queue_index ;
1230
- u32 vlapqf ;
1231
-
1232
- vlapqf = rd32 (IGC_VLAPQF );
1233
- vlan_priority = (ntohs (input -> filter .vlan_tci ) & VLAN_PRIO_MASK )
1234
- >> VLAN_PRIO_SHIFT ;
1235
- queue_index = (vlapqf >> (vlan_priority * 4 )) & IGC_VLAPQF_QUEUE_MASK ;
1236
-
1237
- /* check whether this vlan prio is already set */
1238
- if (vlapqf & IGC_VLAPQF_P_VALID (vlan_priority ) &&
1239
- queue_index != input -> action ) {
1240
- netdev_err (adapter -> netdev ,
1241
- "ethtool rxnfc set VLAN prio filter failed\n" );
1242
- return - EEXIST ;
1243
- }
1244
-
1245
- vlapqf |= IGC_VLAPQF_P_VALID (vlan_priority );
1246
- vlapqf |= IGC_VLAPQF_QUEUE_SEL (vlan_priority , input -> action );
1247
-
1248
- wr32 (IGC_VLAPQF , vlapqf );
1249
-
1250
- return 0 ;
1251
- }
1252
-
1253
1189
int igc_add_filter (struct igc_adapter * adapter , struct igc_nfc_filter * input )
1254
1190
{
1255
1191
struct igc_hw * hw = & adapter -> hw ;
@@ -1263,7 +1199,9 @@ int igc_add_filter(struct igc_adapter *adapter, struct igc_nfc_filter *input)
1263
1199
}
1264
1200
1265
1201
if (input -> filter .match_flags & IGC_FILTER_FLAG_ETHER_TYPE ) {
1266
- err = igc_rxnfc_write_etype_filter (adapter , input );
1202
+ u16 etype = ntohs (input -> filter .etype );
1203
+
1204
+ err = igc_add_etype_filter (adapter , etype , input -> action );
1267
1205
if (err )
1268
1206
return err ;
1269
1207
}
@@ -1283,53 +1221,30 @@ int igc_add_filter(struct igc_adapter *adapter, struct igc_nfc_filter *input)
1283
1221
return err ;
1284
1222
}
1285
1223
1286
- if (input -> filter .match_flags & IGC_FILTER_FLAG_VLAN_TCI )
1287
- err = igc_rxnfc_write_vlan_prio_filter (adapter , input );
1288
-
1289
- return err ;
1290
- }
1291
-
1292
- static void igc_clear_etype_filter_regs (struct igc_adapter * adapter ,
1293
- u16 reg_index )
1294
- {
1295
- struct igc_hw * hw = & adapter -> hw ;
1296
- u32 etqf = rd32 (IGC_ETQF (reg_index ));
1297
-
1298
- etqf &= ~IGC_ETQF_QUEUE_ENABLE ;
1299
- etqf &= ~IGC_ETQF_QUEUE_MASK ;
1300
- etqf &= ~IGC_ETQF_FILTER_ENABLE ;
1301
-
1302
- wr32 (IGC_ETQF (reg_index ), etqf );
1303
-
1304
- adapter -> etype_bitmap [reg_index ] = false;
1305
- }
1306
-
1307
- static void igc_clear_vlan_prio_filter (struct igc_adapter * adapter ,
1308
- u16 vlan_tci )
1309
- {
1310
- struct igc_hw * hw = & adapter -> hw ;
1311
- u8 vlan_priority ;
1312
- u32 vlapqf ;
1313
-
1314
- vlan_priority = (vlan_tci & VLAN_PRIO_MASK ) >> VLAN_PRIO_SHIFT ;
1315
-
1316
- vlapqf = rd32 (IGC_VLAPQF );
1317
- vlapqf &= ~IGC_VLAPQF_P_VALID (vlan_priority );
1318
- vlapqf &= ~IGC_VLAPQF_QUEUE_SEL (vlan_priority ,
1319
- IGC_VLAPQF_QUEUE_MASK );
1224
+ if (input -> filter .match_flags & IGC_FILTER_FLAG_VLAN_TCI ) {
1225
+ int prio = (ntohs (input -> filter .vlan_tci ) & VLAN_PRIO_MASK ) >>
1226
+ VLAN_PRIO_SHIFT ;
1227
+ err = igc_add_vlan_prio_filter (adapter , prio , input -> action );
1228
+ if (err )
1229
+ return err ;
1230
+ }
1320
1231
1321
- wr32 ( IGC_VLAPQF , vlapqf ) ;
1232
+ return 0 ;
1322
1233
}
1323
1234
1324
1235
int igc_erase_filter (struct igc_adapter * adapter , struct igc_nfc_filter * input )
1325
1236
{
1326
- if (input -> filter .match_flags & IGC_FILTER_FLAG_ETHER_TYPE )
1327
- igc_clear_etype_filter_regs (adapter ,
1328
- input -> etype_reg_index );
1237
+ if (input -> filter .match_flags & IGC_FILTER_FLAG_ETHER_TYPE ) {
1238
+ u16 etype = ntohs (input -> filter .etype );
1329
1239
1330
- if (input -> filter .match_flags & IGC_FILTER_FLAG_VLAN_TCI )
1331
- igc_clear_vlan_prio_filter (adapter ,
1332
- ntohs (input -> filter .vlan_tci ));
1240
+ igc_del_etype_filter (adapter , etype );
1241
+ }
1242
+
1243
+ if (input -> filter .match_flags & IGC_FILTER_FLAG_VLAN_TCI ) {
1244
+ int prio = (ntohs (input -> filter .vlan_tci ) & VLAN_PRIO_MASK ) >>
1245
+ VLAN_PRIO_SHIFT ;
1246
+ igc_del_vlan_prio_filter (adapter , prio );
1247
+ }
1333
1248
1334
1249
if (input -> filter .match_flags & IGC_FILTER_FLAG_SRC_MAC_ADDR )
1335
1250
igc_del_mac_filter (adapter , input -> filter .src_addr ,
@@ -1445,7 +1360,8 @@ static int igc_add_ethtool_nfc_entry(struct igc_adapter *adapter,
1445
1360
1446
1361
if ((fsp -> flow_type & FLOW_EXT ) && fsp -> m_ext .vlan_tci ) {
1447
1362
if (fsp -> m_ext .vlan_tci != htons (VLAN_PRIO_MASK )) {
1448
- err = - EINVAL ;
1363
+ netdev_dbg (netdev , "VLAN mask not supported\n" );
1364
+ err = - EOPNOTSUPP ;
1449
1365
goto err_out ;
1450
1366
}
1451
1367
input -> filter .vlan_tci = fsp -> h_ext .vlan_tci ;
0 commit comments