| 1298 | } |
| 1299 | |
| 1300 | static int cxgbe_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *e) |
| 1301 | { |
| 1302 | struct adapter *adap = ethdev2adap(dev); |
| 1303 | unsigned int i; |
| 1304 | int ret = 0; |
| 1305 | |
| 1306 | t4_os_lock(&adap->flow_lock); |
| 1307 | if (adap->tids.ftid_tab) { |
| 1308 | struct filter_entry *f = &adap->tids.ftid_tab[0]; |
| 1309 | |
| 1310 | for (i = 0; i < adap->tids.nftids; i++, f++) { |
| 1311 | ret = cxgbe_check_n_destroy(f, dev); |
| 1312 | if (ret < 0) { |
| 1313 | rte_flow_error_set(e, ret, |
| 1314 | RTE_FLOW_ERROR_TYPE_HANDLE, |
| 1315 | f->private, |
| 1316 | "error destroying TCAM " |
| 1317 | "filter."); |
| 1318 | goto out; |
| 1319 | } |
| 1320 | } |
| 1321 | } |
| 1322 | |
| 1323 | if (is_hashfilter(adap) && adap->tids.tid_tab) { |
| 1324 | struct filter_entry *f; |
| 1325 | |
| 1326 | for (i = adap->tids.hash_base; i <= adap->tids.ntids; i++) { |
| 1327 | f = (struct filter_entry *)adap->tids.tid_tab[i]; |
| 1328 | |
| 1329 | ret = cxgbe_check_n_destroy(f, dev); |
| 1330 | if (ret < 0) { |
| 1331 | rte_flow_error_set(e, ret, |
| 1332 | RTE_FLOW_ERROR_TYPE_HANDLE, |
| 1333 | f->private, |
| 1334 | "error destroying HASH " |
| 1335 | "filter."); |
| 1336 | goto out; |
| 1337 | } |
| 1338 | } |
| 1339 | } |
| 1340 | |
| 1341 | out: |
| 1342 | t4_os_unlock(&adap->flow_lock); |
| 1343 | return ret >= 0 ? 0 : ret; |
| 1344 | } |
| 1345 | |
| 1346 | static const struct rte_flow_ops cxgbe_flow_ops = { |
| 1347 | .validate = cxgbe_flow_validate, |
nothing calls this directly
no test coverage detected