X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fnet%2Ffailsafe%2Ffailsafe_ether.c;h=fb9bbce4bcc74d6330421b45401e865f701ad38a;hb=d84fb5eba1dac6a8d8b5506fa38e555c2c8d7e91;hp=359b8c969e2f065c06a724ba949ba3223e3662a3;hpb=598fb8aec6f6c8618a2425789e12fc352f120858;p=dpdk.git diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c index 359b8c969e..fb9bbce4bc 100644 --- a/drivers/net/failsafe/failsafe_ether.c +++ b/drivers/net/failsafe/failsafe_ether.c @@ -73,6 +73,28 @@ fs_flow_complain(struct rte_flow_error *error) return -err; } +static int +eth_dev_flow_isolate_set(struct rte_eth_dev *dev, + struct sub_device *sdev) +{ + struct rte_flow_error ferror; + int ret; + + if (!PRIV(dev)->flow_isolated) { + DEBUG("Flow isolation already disabled"); + } else { + DEBUG("Enabling flow isolation"); + ret = rte_flow_isolate(PORT_ID(sdev), + PRIV(dev)->flow_isolated, + &ferror); + if (ret) { + fs_flow_complain(&ferror); + return ret; + } + } + return 0; +} + static int fs_eth_dev_conf_apply(struct rte_eth_dev *dev, struct sub_device *sdev) @@ -181,6 +203,7 @@ fs_eth_dev_conf_apply(struct rte_eth_dev *dev, ether_format_addr(ea_fmt, ETHER_ADDR_FMT_SIZE, ea); ERROR("Adding MAC address %s failed", ea_fmt); + return ret; } } /* VLAN filter */ @@ -334,9 +357,17 @@ failsafe_eth_dev_state_sync(struct rte_eth_dev *dev) if (PRIV(dev)->state < DEV_ACTIVE) return 0; inactive = 0; - FOREACH_SUBDEV(sdev, i, dev) - if (sdev->state == DEV_PROBED) + FOREACH_SUBDEV(sdev, i, dev) { + if (sdev->state == DEV_PROBED) { inactive |= UINT32_C(1) << i; + ret = eth_dev_flow_isolate_set(dev, sdev); + if (ret) { + ERROR("Could not apply configuration to sub_device %d", + i); + goto err_remove; + } + } + } ret = dev->dev_ops->dev_configure(dev); if (ret) goto err_remove; @@ -387,3 +418,21 @@ failsafe_eth_rmv_event_callback(uint8_t port_id __rte_unused, sdev->remove = 1; return 0; } + +int +failsafe_eth_lsc_event_callback(uint8_t port_id __rte_unused, + enum rte_eth_event_type event __rte_unused, + void *cb_arg, void *out __rte_unused) +{ + struct rte_eth_dev *dev = cb_arg; + int ret; + + ret = dev->dev_ops->link_update(dev, 0); + /* We must pass on the LSC event */ + if (ret) + return _rte_eth_dev_callback_process(dev, + RTE_ETH_EVENT_INTR_LSC, + NULL, NULL); + else + return 0; +}