#include <rte_pci.h>
#include <rte_bus_pci.h>
-#include <rte_ethdev_pci.h>
+#include <ethdev_pci.h>
#include <rte_mbuf.h>
#include <rte_malloc.h>
#include <rte_memcpy.h>
#define HINIC_PKTLEN_TO_MTU(pktlen) \
((pktlen) - (ETH_HLEN + ETH_CRC_LEN))
+/* The max frame size with default MTU */
+#define HINIC_ETH_MAX_LEN (RTE_ETHER_MTU + ETH_HLEN + ETH_CRC_LEN)
+
/* lro numer limit for one packet */
#define HINIC_LRO_WQE_NUM_DEFAULT 8
struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
int ret;
- ret = hinic_set_xsfp_tx_status(nic_dev->hwdev, true);
- if (ret) {
- PMD_DRV_LOG(ERR, "Enable port tx xsfp failed, dev_name: %s, port_id: %d",
- nic_dev->proc_dev_name, dev->data->port_id);
- return ret;
- }
-
/* link status follow phy port status, up will open pma */
ret = hinic_set_port_enable(nic_dev->hwdev, true);
if (ret)
struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
int ret;
- ret = hinic_set_xsfp_tx_status(nic_dev->hwdev, false);
- if (ret) {
- PMD_DRV_LOG(ERR, "Disable port tx xsfp failed, dev_name: %s, port_id: %d",
- nic_dev->proc_dev_name, dev->data->port_id);
- return ret;
- }
-
/* link status follow phy port status, up will close pma */
ret = hinic_set_port_enable(nic_dev->hwdev, false);
if (ret)
* @param dev
* Pointer to Ethernet device structure.
*/
-static void hinic_dev_stop(struct rte_eth_dev *dev)
+static int hinic_dev_stop(struct rte_eth_dev *dev)
{
int rc;
char *name;
name = dev->data->name;
port_id = dev->data->port_id;
+ dev->data->dev_started = 0;
+
if (!rte_bit_relaxed_test_and_clear32(HINIC_DEV_START,
&nic_dev->dev_status)) {
PMD_DRV_LOG(INFO, "Device %s already stopped", name);
- return;
+ return 0;
}
/* just stop phy port and vport */
/* free mbuf */
hinic_free_all_rx_mbuf(dev);
hinic_free_all_tx_mbuf(dev);
+
+ return 0;
}
static void hinic_disable_interrupt(struct rte_eth_dev *dev)
if (retries == HINIC_INTR_CB_UNREG_MAX_RETRIES)
PMD_DRV_LOG(ERR, "Unregister intr callback failed after %d retries",
retries);
+
+ rte_bit_relaxed_clear32(HINIC_DEV_INIT, &nic_dev->dev_status);
}
static int hinic_set_dev_promiscuous(struct hinic_nic_dev *nic_dev, bool enable)
/* delete multicast mac addrs */
hinic_delete_mc_addr_list(nic_dev);
+
+ rte_free(nic_dev->mc_list);
+
}
static int hinic_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
/* update max frame size */
frame_size = HINIC_MTU_TO_PKTLEN(mtu);
- if (frame_size > RTE_ETHER_MAX_LEN)
+ if (frame_size > HINIC_ETH_MAX_LEN)
dev->data->dev_conf.rxmode.offloads |=
DEV_RX_OFFLOAD_JUMBO_FRAME;
else
* @param dev
* Pointer to Ethernet device structure.
*/
-static void hinic_dev_close(struct rte_eth_dev *dev)
+static int hinic_dev_close(struct rte_eth_dev *dev)
{
struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
+ int ret;
+
+ if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+ return 0;
if (rte_bit_relaxed_test_and_set32(HINIC_DEV_CLOSE,
&nic_dev->dev_status)) {
PMD_DRV_LOG(WARNING, "Device %s already closed",
dev->data->name);
- return;
+ return 0;
}
/* stop device first */
- hinic_dev_stop(dev);
+ ret = hinic_dev_stop(dev);
/* rx_cqe, rx_info */
hinic_free_all_rx_resources(dev);
/* disable hardware and uio interrupt */
hinic_disable_interrupt(dev);
+ /* destroy rx mode mutex */
+ hinic_mutex_destroy(&nic_dev->rx_mode_mutex);
+
/* deinit nic hardware device */
hinic_nic_dev_destroy(dev);
+
+ return ret;
}
static const struct eth_dev_ops hinic_pmd_ops = {
return 0;
}
+ eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
+
nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(eth_dev);
memset(nic_dev, 0, sizeof(*nic_dev));
goto mc_addr_fail;
}
- /*
- * Pass the information to the rte_eth_dev_close() that it should also
- * release the private port resources.
- */
- eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
-
/* create hardware nic_device */
rc = hinic_nic_dev_create(eth_dev);
if (rc) {
static int hinic_dev_uninit(struct rte_eth_dev *dev)
{
- struct hinic_nic_dev *nic_dev;
-
- nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
- rte_bit_relaxed_clear32(HINIC_DEV_INIT, &nic_dev->dev_status);
-
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return 0;
- hinic_mutex_destroy(&nic_dev->rx_mode_mutex);
-
hinic_dev_close(dev);
- dev->dev_ops = NULL;
- dev->rx_pkt_burst = NULL;
- dev->tx_pkt_burst = NULL;
-
- rte_free(nic_dev->mc_list);
-
- rte_free(dev->data->mac_addrs);
- dev->data->mac_addrs = NULL;
-
return HINIC_OK;
}