From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id BF761A04DB; Thu, 10 Dec 2020 15:23:59 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id DC955C9A0; Thu, 10 Dec 2020 15:22:52 +0100 (CET) Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) by dpdk.org (Postfix) with ESMTP id CE489C9A0 for ; Thu, 10 Dec 2020 15:22:50 +0100 (CET) Received: by mail-pl1-f176.google.com with SMTP id u4so2826366plr.12 for ; Thu, 10 Dec 2020 06:22:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pensando.io; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=CwQGXSTehIsse3YEyWnmTvpdxKSJEqLKv3i0TuxIEvo=; b=GDGQCWezoNRMcKbbetbil0fLHlJxPLT2rJQAE19dbxuzHrCoti2nLR43TPTTWCkRDt XTMHXBM+Wii+r3ZvoFX+gsqs9j0CpJHMwOFwifHu2Re8RwZFC0HoXovShM5uucOSwser CJilQe0zCl0q9VuBLTtMxvoP3YBg2rrxKaO/ArxWdfPHmp6oWvZPNJDuF5+zr7LB5o7J 5EpXzv1NnUqc1adH/b0My1GfdEYC/rkWCpfo6JlwstgF9FElZJxbKzHxAr7eOJGpPk0H k3hen4XGZBKG375cIsBdeIqMvsFAn190/wbSn3m50WbplJXoigXDphn5Qb9MuJ+6W/cs 5i4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=CwQGXSTehIsse3YEyWnmTvpdxKSJEqLKv3i0TuxIEvo=; b=A6KVjOm2rzAqceTdLELlWAd0JChkgc4NZUP+ATxPKmHRK943zQ0sGfGpXHCJBnQZR9 +BVt6oYKhM4IDf3CGdPD7x9AtxT9KPnKbJadiK1oqFzhYts2xQX604h8/ngxfFKgZdvb pV4Y/vr/wUCFhKS09BNWG87bQ9obtWmj0WRShiQ7RMF1vbTxTd4XNTPlJip13EpLGqZu f9H8gYjFiq0eAYtraN6drl5tukZfmWH8Mt4xsA/pKElXWjQV6v3xRjgECl3HQpItKYr9 lXomN7P45Arr5IQlUswafXvrRw8yhj5/0bOFvfqmVB21D/DLI3pJlpM5XFPitWXloAlm I5kg== X-Gm-Message-State: AOAM533V7qjBlGi6gM7hT7vDEajm5Evn7f8RVpexNSJOfIZetNzcaFrw 3rKpAxM7btwq/osNnz5SN2y9ogOtG5VWeQ== X-Google-Smtp-Source: ABdhPJyifVvLpRjeS0Dnyx3ISlkp+UNQ5ugXBxmsEkKvdMtBxCKqyu4NY/ci5Us2UM79Peaovdt25w== X-Received: by 2002:a17:902:b693:b029:da:e92c:fc23 with SMTP id c19-20020a170902b693b02900dae92cfc23mr6489649pls.55.1607610168734; Thu, 10 Dec 2020 06:22:48 -0800 (PST) Received: from driver-dev1.pensando.io ([12.226.153.42]) by smtp.gmail.com with ESMTPSA id n10sm6296983pge.92.2020.12.10.06.22.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Dec 2020 06:22:47 -0800 (PST) From: Andrew Boyer To: dev@dpdk.org Cc: Alfredo Cardigliano , Andrew Boyer Date: Thu, 10 Dec 2020 06:22:29 -0800 Message-Id: <20201210142231.63209-5-aboyer@pensando.io> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201210142231.63209-1-aboyer@pensando.io> References: <20201210142231.63209-1-aboyer@pensando.io> Subject: [dpdk-dev] [PATCH 4/6] net/ionic: improve link state handling X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add UP and FW_RESET state flags. Update the stack info when the link state changes. Convert set_link_up/set_link_down to lif_start/lif_stop. Condition reported link state on UP flag. Change lif_stop to return void. Signed-off-by: Andrew Boyer --- drivers/net/ionic/ionic_ethdev.c | 49 ++++++++++--------------------- drivers/net/ionic/ionic_ethdev.h | 4 +++ drivers/net/ionic/ionic_lif.c | 50 ++++++++++++++++++++++++++------ drivers/net/ionic/ionic_lif.h | 4 ++- 4 files changed, 64 insertions(+), 43 deletions(-) diff --git a/drivers/net/ionic/ionic_ethdev.c b/drivers/net/ionic/ionic_ethdev.c index 629d7068b..973c03a8d 100644 --- a/drivers/net/ionic/ionic_ethdev.c +++ b/drivers/net/ionic/ionic_ethdev.c @@ -28,8 +28,6 @@ static int ionic_dev_stop(struct rte_eth_dev *dev); static int ionic_dev_close(struct rte_eth_dev *dev); static int ionic_dev_set_link_up(struct rte_eth_dev *dev); static int ionic_dev_set_link_down(struct rte_eth_dev *dev); -static int ionic_dev_link_update(struct rte_eth_dev *eth_dev, - int wait_to_complete); static int ionic_flow_ctrl_get(struct rte_eth_dev *eth_dev, struct rte_eth_fc_conf *fc_conf); static int ionic_flow_ctrl_set(struct rte_eth_dev *eth_dev, @@ -236,21 +234,17 @@ static int ionic_dev_set_link_up(struct rte_eth_dev *eth_dev) { struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); - struct ionic_adapter *adapter = lif->adapter; - struct ionic_dev *idev = &adapter->idev; int err; IONIC_PRINT_CALL(); - ionic_dev_cmd_port_state(idev, IONIC_PORT_ADMIN_STATE_UP); + err = ionic_lif_start(lif); + if (err) + IONIC_PRINT(ERR, "Could not start lif to set link up"); - err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT); - if (err) { - IONIC_PRINT(WARNING, "Failed to bring port UP"); - return err; - } + ionic_dev_link_update(lif->eth_dev, 0); - return 0; + return err; } /* @@ -260,24 +254,17 @@ static int ionic_dev_set_link_down(struct rte_eth_dev *eth_dev) { struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); - struct ionic_adapter *adapter = lif->adapter; - struct ionic_dev *idev = &adapter->idev; - int err; IONIC_PRINT_CALL(); - ionic_dev_cmd_port_state(idev, IONIC_PORT_ADMIN_STATE_DOWN); + ionic_lif_stop(lif); - err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT); - if (err) { - IONIC_PRINT(WARNING, "Failed to bring port DOWN"); - return err; - } + ionic_dev_link_update(lif->eth_dev, 0); return 0; } -static int +int ionic_dev_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete __rte_unused) { @@ -291,7 +278,8 @@ ionic_dev_link_update(struct rte_eth_dev *eth_dev, memset(&link, 0, sizeof(link)); link.link_autoneg = ETH_LINK_AUTONEG; - if (!adapter->link_up) { + if (!adapter->link_up || + !(lif->state & IONIC_LIF_F_UP)) { /* Interface is down */ link.link_status = ETH_LINK_DOWN; link.link_duplex = ETH_LINK_HALF_DUPLEX; @@ -947,15 +935,12 @@ static int ionic_dev_stop(struct rte_eth_dev *eth_dev) { struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); - int err; IONIC_PRINT_CALL(); - err = ionic_lif_stop(lif); - if (err) - IONIC_PRINT(ERR, "Cannot stop LIF: %d", err); + ionic_lif_stop(lif); - return err; + return 0; } static void ionic_unconfigure_intr(struct ionic_adapter *adapter); @@ -969,17 +954,12 @@ ionic_dev_close(struct rte_eth_dev *eth_dev) struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); struct ionic_adapter *adapter = lif->adapter; uint32_t i; - int err; IONIC_PRINT_CALL(); if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; - err = ionic_lif_stop(lif); - if (err) { - IONIC_PRINT(ERR, "Cannot stop LIF: %d", err); - return -1; - } + ionic_lif_stop(lif); ionic_lif_free_queues(lif); @@ -1084,6 +1064,9 @@ eth_ionic_dev_uninit(struct rte_eth_dev *eth_dev) ionic_lif_deinit(lif); ionic_lif_free(lif); + if (!(lif->state & IONIC_LIF_F_FW_RESET)) + ionic_lif_reset(lif); + return 0; } diff --git a/drivers/net/ionic/ionic_ethdev.h b/drivers/net/ionic/ionic_ethdev.h index 578e2301f..6cbcd0f82 100644 --- a/drivers/net/ionic/ionic_ethdev.h +++ b/drivers/net/ionic/ionic_ethdev.h @@ -5,6 +5,8 @@ #ifndef _IONIC_ETHDEV_H_ #define _IONIC_ETHDEV_H_ +#include + #define IONIC_ETH_RSS_OFFLOAD_ALL ( \ ETH_RSS_IPV4 | \ ETH_RSS_NONFRAG_IPV4_TCP | \ @@ -18,5 +20,7 @@ #define IONIC_ETH_DEV_TO_ADAPTER(eth_dev) \ (IONIC_ETH_DEV_TO_LIF(eth_dev)->adapter) +int ionic_dev_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete); + #endif /* _IONIC_ETHDEV_H_ */ diff --git a/drivers/net/ionic/ionic_lif.c b/drivers/net/ionic/ionic_lif.c index e213597ee..2452451be 100644 --- a/drivers/net/ionic/ionic_lif.c +++ b/drivers/net/ionic/ionic_lif.c @@ -65,12 +65,12 @@ ionic_qcq_disable(struct ionic_qcq *qcq) return ionic_adminq_post_wait(lif, &ctx); } -int -ionic_lif_stop(struct ionic_lif *lif __rte_unused) +void +ionic_lif_stop(struct ionic_lif *lif) { - /* Carrier OFF here */ + IONIC_PRINT_CALL(); - return 0; + lif->state &= ~IONIC_LIF_F_UP; } void @@ -1105,14 +1105,32 @@ ionic_link_status_check(struct ionic_lif *lif) return; if (link_up) { - IONIC_PRINT(DEBUG, "Link up - %d Gbps", - lif->info->status.link_speed); adapter->link_speed = lif->info->status.link_speed; + IONIC_PRINT(DEBUG, "Link up - %d Gbps", + adapter->link_speed); } else { IONIC_PRINT(DEBUG, "Link down"); } adapter->link_up = link_up; + ionic_dev_link_update(lif->eth_dev, 0); +} + +static void +ionic_lif_handle_fw_down(struct ionic_lif *lif) +{ + if (lif->state & IONIC_LIF_F_FW_RESET) + return; + + lif->state |= IONIC_LIF_F_FW_RESET; + + if (lif->state & IONIC_LIF_F_UP) { + IONIC_PRINT(NOTICE, + "Surprise FW stop, stopping %s\n", lif->name); + ionic_lif_stop(lif); + } + + IONIC_PRINT(NOTICE, "FW down, %s stopped", lif->name); } static bool @@ -1134,14 +1152,27 @@ ionic_notifyq_cb(struct ionic_cq *cq, uint32_t cq_desc_index, void *cb_arg) switch (cq_desc->event.ecode) { case IONIC_EVENT_LINK_CHANGE: IONIC_PRINT(DEBUG, - "Notifyq IONIC_EVENT_LINK_CHANGE eid=%jd link_status=%d link_speed=%d", + "Notifyq IONIC_EVENT_LINK_CHANGE %s " + "eid=%jd link_status=%d link_speed=%d", + lif->name, cq_desc->event.eid, cq_desc->link_change.link_status, cq_desc->link_change.link_speed); lif->state |= IONIC_LIF_F_LINK_CHECK_NEEDED; + break; + case IONIC_EVENT_RESET: + IONIC_PRINT(NOTICE, + "Notifyq IONIC_EVENT_RESET %s " + "eid=%jd, reset_code=%d state=%d", + lif->name, + cq_desc->event.eid, + cq_desc->reset.reset_code, + cq_desc->reset.state); + ionic_lif_handle_fw_down(lif); break; + default: IONIC_PRINT(WARNING, "Notifyq bad event ecode=%d eid=%jd", cq_desc->event.ecode, cq_desc->event.eid); @@ -1631,9 +1662,10 @@ ionic_lif_start(struct ionic_lif *lif) } } - ionic_link_status_check(lif); - /* Carrier ON here */ + lif->state |= IONIC_LIF_F_UP; + + ionic_link_status_check(lif); return 0; } diff --git a/drivers/net/ionic/ionic_lif.h b/drivers/net/ionic/ionic_lif.h index bf010716e..d11909746 100644 --- a/drivers/net/ionic/ionic_lif.h +++ b/drivers/net/ionic/ionic_lif.h @@ -77,6 +77,8 @@ struct ionic_qcq { #define IONIC_LIF_F_INITED BIT(0) #define IONIC_LIF_F_LINK_CHECK_NEEDED BIT(1) +#define IONIC_LIF_F_UP BIT(2) +#define IONIC_LIF_F_FW_RESET BIT(3) #define IONIC_LIF_NAME_MAX_SZ (32) @@ -128,7 +130,7 @@ int ionic_lif_init(struct ionic_lif *lif); void ionic_lif_deinit(struct ionic_lif *lif); int ionic_lif_start(struct ionic_lif *lif); -int ionic_lif_stop(struct ionic_lif *lif); +void ionic_lif_stop(struct ionic_lif *lif); int ionic_lif_configure(struct ionic_lif *lif); void ionic_lif_reset(struct ionic_lif *lif); -- 2.17.1