From patchwork Wed Oct 18 17:24:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Manlunas, Felix" X-Patchwork-Id: 827772 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=CAVIUMNETWORKS.onmicrosoft.com header.i=@CAVIUMNETWORKS.onmicrosoft.com header.b="RuCtZ+u9"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yHJpb2LVjz9s72 for ; Thu, 19 Oct 2017 04:24:55 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751733AbdJRRYw (ORCPT ); Wed, 18 Oct 2017 13:24:52 -0400 Received: from mail-dm3nam03on0041.outbound.protection.outlook.com ([104.47.41.41]:13216 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751717AbdJRRYu (ORCPT ); Wed, 18 Oct 2017 13:24:50 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=UpUDI/+7egmbfN5SnlNE8kABVGoEMWrAN4mkbiPgvdg=; b=RuCtZ+u9aFc2wEgd8m+5x4TE3PSmLTf76xnWOLrRj3wBdLRRyOz5klZFGPlhGDD34FkK1rnkNvvXcnw6yv4h2L7ErLwgc/gh+RG/nQOO3JJ8GNKKYOw9yVxLG+FtiuhHwITgEBb1M6JYaGslE2CMOg1gii2hSpKEAoP3wRp0wyo= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Felix.Manlunas@cavium.com; Received: from localhost (50.233.148.156) by CY4PR07MB3173.namprd07.prod.outlook.com (10.172.115.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.7; Wed, 18 Oct 2017 17:24:48 +0000 Date: Wed, 18 Oct 2017 10:24:45 -0700 From: Felix Manlunas To: davem@davemloft.net Cc: netdev@vger.kernel.org, raghu.vatsavayi@cavium.com, derek.chickles@cavium.com, satananda.burla@cavium.com, veerasenareddy.burru@cavium.com Subject: [PATCH V2 net-next] liquidio: pass date and time info to NIC firmware Message-ID: <20171018172445.GA14012@felix-thinkpad.cavium.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.6.1 (2016-04-27) X-Originating-IP: [50.233.148.156] X-ClientProxiedBy: MWHPR1701CA0021.namprd17.prod.outlook.com (10.172.58.31) To CY4PR07MB3173.namprd07.prod.outlook.com (10.172.115.139) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 68cec4ee-afcd-4e3f-2233-08d5164d2229 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075); SRVR:CY4PR07MB3173; X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3173; 3:v3fgfW/t5gM3SHaqpPuVscJpTYgr+i1Bsf+SfZYcVGq0623XviejjZCoPoRPEXiNDpHCg7TNM4DccDexRrZEvlrJlgXmV8shISDXza9dvv9gUH0dQZzpaw9DibHFTuvZ54LTNuuFfsoctFRRQw2IH+vrK0Lqo8ADS0l97QkgObtyWKJfnZ0yctjruzUZPOKifgpuXeSVACYRC67r+6ofAl9QiRXaaj1x/ACVh0nLbXrieqnz5G226DAH9niKgv4j; 25:XIswcZlVgYyZhZ3xuVTf6mPQ9pXaBwZHSeu/GX+hjmUxfGCM3bTpeUTWKbn4KDqcTtY9LdKwyZ5qj8zwpUwVVY5uMhKE3G6Ia5bro1+T0JXVaRYa5lJwTMaAaHy7dCNIZoC/JmaYSoKp3pwYoHG7vX2CcQB0DRoSWnXZA1KTAHjFYImkQ4fbKZGLf2Y92tOydgepM6XKvtiscSQkk1oE4BJ83QmYZbxrHncx2guq1qKGyfSB+OMkaPDIeM1bNY1bcwusvhH5MCJQazI1kq/8yJeKBquoqhL+aa+Vz/ESySaKTEbHwL0ubOkwseI6JiN41UlBq2b2phkBfhj67SWVwQ==; 31:lcZuPiaOgVNEmmPWIisB4z6CcuNq6LYTGUF+fIWXIfhItMyN95Kh/B3vLygbSyUML0uEMwraQ0XPeeQ5sq6yTBIaIHqtOILnj66+KWdSmNHh2X6ze+KdCtsadel2g7bhgIC7Y0324W9tRfOfEjdSRi6ElWGh6wZcU5wYSG8d6kr+fGnnjorbC7i1pktQ+C3fzo3Pbip+RWTiB+11jWaCLyu55O2iIkRFt46M+H4oR4Y= X-MS-TrafficTypeDiagnostic: CY4PR07MB3173: X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3173; 20:UsGeS9dZy0ifl4t9mxdSGaUxYShqZSPHsUeZEQXul+irPvsPh7q2Zo8ns6DYhtTyD6UottRadk1e7ryl4NuabxKxvdA7yq8Pk6DDosc+rijtFkgT+Ceq6uKcJBo7TioLMt6ELMUUGXXouUG+w2OcksgN3BIAtNp+WfS3eGX4IoDqkbp6yeNGRV55Ta7MRARREJXj/jhQnaoLhX6yUHkX9gfjoItVaGYMQSsltsEFb7EMYxBAhpsz0551MXmyjmDlhI3fZHx8J+/GY3WcgPTRUpp75GKxt9qCHYtQ67dlIhL4pUXayL81CchStgQq4w3eCxkgqL3slQR2Kny+MPoIjWDyE19oQ3ajY2EFjqq9DskfEy+J23WD+CpBEYwvRs0+RJJLzs2sowWqWd7cTm6Pso5g4HnAaKoHwCqEdBnH1OgqovmCmhm7O2R/0PqOy7uaWLU01Evjrrkvl0VuTB1JE6hLu+BaocpVLt+laCKyV7SheAP+KK2lpu40Xc4YwAqI; 4:AvbgAKzM9HP/awRQcUZU8umJQROHGiPoWxUCNUQ/7IXYD1NLNd29hB1QN1+iCCN5NyQ2q4IlPupL6TR2WNOpwbJS6v7uKk5MY961TCmfZ+l+XGMR+u/5sfE0zSK0hPUab52kd2Z3MQfxCQLwzcDVfbS8bgmpTLF9mEaOAaQejWNBdXivrviuKt1aoZx5RgQl1O310pievmLJiPUsp6ldor8575cSMhLilxCVk5TnJlR6WPVVBfFwMdoYF9xnCzhE X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(3002001)(10201501046)(100000703101)(100105400095)(93006095)(93001095)(6041248)(20161123555025)(20161123562025)(20161123564025)(20161123560025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:CY4PR07MB3173; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:CY4PR07MB3173; X-Forefront-PRVS: 0464DBBBC4 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(6069001)(376002)(346002)(54534003)(199003)(189002)(2351001)(3846002)(47776003)(6486002)(189998001)(66066001)(2906002)(105586002)(101416001)(97736004)(54356999)(6916009)(7736002)(76506005)(50466002)(106356001)(33656002)(305945005)(478600001)(316002)(16586007)(107886003)(83506001)(68736007)(6116002)(4326008)(1076002)(25786009)(50986999)(5660300001)(53936002)(2361001)(16526018)(8936002)(81166006)(58126008)(23726003)(6496005)(6666003)(86362001)(8676002)(81156014)(72206003)(575784001)(18370500001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB3173; H:localhost; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3173; 23:0WJlC4/j2lE0+/Y7yeuLnGcJurrSGGmXbDRvpnUcEH16kAcrtwOByi8G3FzKFct9nTml05mWBXxo+j9JekglpNh6Cdqq2IATyNPcUAr91YV+EO9KXux52mFJ6B5gAru2hMcBFtfeaN941LaFJ4gLxIBZ8iDgab909nDQxzJMHGi4JTRXnyFFGr1AxkC+JiDY8+oRkgAnZ1hQrVh1fRvvPojPexHLwAW99Z51WHGmD/U6u/+DqekhXpDrlkOWVKekkAvDOQiXdTb2gH3I8czfo3VYlMeeviE+qtOB8oE6l2Xtr/UgaQw11W48TZI09d6H+G/kDsYDC2vMWyH1Oe7ADDmN8L4iLxS3svnNNljDFAYW6tkgpiVhalHAlzbgONc8T7u7KZiMhTjFzFoBhDkjQDHUU/B8pamgEe+5l5802eBOC6c4macitdGnhny2PYnW0TXtHM8CEeJkxRJEGYNlQJb5xZd31bCZ/X30V/JrqcmLcyITFj4bs54aorKFhGkKSURoShdn9UreKTpNpnFPJr8ed7GR3dMwbxAUH2x7NTA6SubMoWWgfHtN0JpuH9E90riCoNW//K+4KokatJMvILj/EJKNusLoV8ugAxQaYeLs7i9dup+96rvFg5iymMuIp/Ck3uYoK4Yru26Mcqnr/InRxvwsPF+WQB6oycyzot8xmTWhOBRYXwg7Esqr4CGksm8wJY0o5qmbvVzhJFMf20RV58dUNAL8AS2b3L1PzS9LH8OUny7d52B85AWHeM6sOw1SrWWlPZ7KAYVqxeXUePEfnTzw/D0os/l1ef9D+DXCvx2HVDPRErC72yQuGIjkSx5mSM5zImDHAaevpHPG5DlTofEHVIbGWZm6CiN0CU9plGQbnEcN1tFrkmIH3bH7wYW8G2JpaTl8XMFvzqNE2xbQRsypSE2JHyjIlcLCtndfLqPzQRJ6zhcVzHUQ+ZB8iCAGy199ZQYfBVDmY/7m22G2oBnViVX/0pDcqj1v4zRtvlNvKCYL1K6MiZhfxoP1c7E2hlVLci8zBxozoj1YbGIQ64Bq0qCEmthjnr3SHAOCf1uvMIIdcZiDTjw9VPJgqr7hDhTTGSv3hNxq8WBWDPvP/z8uhQX5uBNaX3BnplBSOYj+jPg1BSx7ZrysNCI9TSQZb+juVBCwjtbMmSuugRkCV0FJ23en6Z+oSC08G6C05fNc+GkTymdHTY6BbacD X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3173; 6:gkSLHco7oqZ1Z9QbvbZw6odIPeWoMX6tc/tGiMAL07FRu9BUIlLM718sLcHeng7f1nusTQBXJZf9f5qb1qzTYS4aNMpX5+zOx3TgW0mbn9HUZqEeGkKCbz609YzB3RftENQJBP289x7lSekyjoGF85OCSTVu5eikA3lXhsat4RyySLZ5MaKkp2vccOnQRRL4w2qRW6ot6fl2rjXmmBXbAq5+FRlmE/mS67wQyx8g3JLnznS+O3B8SlwR/4dLCNWBxR9NUi0S8Cm1yuoXF37H4o6vEfdV5Y5eGc7ER94XYJwezxtPvqRnejdJPsfyR0X0rSTFWvD6VFCnKn0clI5hWQ==; 5:so4nUdHaH7OLRal5lQgGLXUlNaa6ZsupFiaAxDZDV5c74nYFGs0nlaUWpfPITPZcn1eTpLyOkSYa7/Nt0O6OpwRQmKfr7d5vL5Z1MUW57aqZwfmzNhvNb7BYYyFuBP7BqL8NrZX5ONx1zwW5NYAQHDl5tvdmK5JnZpoHdDSK48o=; 24:14hDE/AnW2Ew1nt1PW9JS+dLczaBWXpAu9rmoAtCLDymTFWb2rN6kSFYqz85GUVxQnZADy3mJ/JRAdgB3B2hxXhZGSkmjgcC7K+e5FoYX5w=; 7:lW8qgyKw5OJcgkY/udyJHeI2PvPxkPNm8VTKE4UX3VjMKpv/bjYvg1foUtmXWj+FmajfW/nn1hPA8atQypxIYyp48xnCjd3oc48EVbGlPHpyRHGolf3yXSFnoQB9dj3Jq4y1p31l6CFT3k9caXXWY7SEQ/WLJoxUtCHAXWL8bC+QE3XcPpsMK0In09VTEXejobxzAvWRN2HRWsS1Qvqa2cgiedS45j8egp1+zvAOpjA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Oct 2017 17:24:48.2644 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR07MB3173 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Veerasenareddy Burru Pass date and time information to NIC firmware at the time of loading firmware and periodically update the host time to NIC firmware. This is to make NIC firmware use the same time reference as Host, so that it is easy to correlate logs from firmware and host for debugging. Signed-off-by: Veerasenareddy Burru Signed-off-by: Satanand Burla Signed-off-by: Derek Chickles Signed-off-by: Felix Manlunas --- Patch Change Log: V1 -> V2: Follow reviewer's suggestion of periodically updating firmware with date and time info. drivers/net/ethernet/cavium/liquidio/lio_main.c | 126 +++++++++++++++++++++ .../net/ethernet/cavium/liquidio/liquidio_common.h | 8 ++ .../net/ethernet/cavium/liquidio/octeon_console.c | 28 ++++- .../net/ethernet/cavium/liquidio/octeon_network.h | 3 + 4 files changed, 162 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/ethernet/cavium/liquidio/lio_main.c index 963803b..8ab5ed5 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c @@ -83,6 +83,11 @@ static int octeon_console_debug_enabled(u32 console) /* runtime link query interval */ #define LIQUIDIO_LINK_QUERY_INTERVAL_MS 1000 +/* update localtime to octeon firmware every 60 seconds. + * make firmware to use same time reference, so that it will be easy to + * correlate firmware logged events/errors with host events, for debugging. + */ +#define LIO_SYNC_OCTEON_TIME_INTERVAL_MS 60000 struct liquidio_if_cfg_context { int octeon_id; @@ -901,6 +906,121 @@ static inline void update_link_status(struct net_device *netdev, } } +/** + * lio_sync_octeon_time_cb - callback that is invoked when soft command + * sent by lio_sync_octeon_time() has completed successfully or failed + * + * @oct - octeon device structure + * @status - indicates success or failure + * @buf - pointer to the command that was sent to firmware + **/ +static void lio_sync_octeon_time_cb(struct octeon_device *oct, + u32 status, void *buf) +{ + struct octeon_soft_command *sc = (struct octeon_soft_command *)buf; + + if (status) + dev_err(&oct->pci_dev->dev, + "Failed to sync time to octeon; error=%d\n", status); + + octeon_free_soft_command(oct, sc); +} + +/** + * lio_sync_octeon_time - send latest localtime to octeon firmware so that + * firmware will correct it's time, in case there is a time skew + * + * @work: work scheduled to send time update to octeon firmware + **/ +static void lio_sync_octeon_time(struct work_struct *work) +{ + struct cavium_wk *wk = (struct cavium_wk *)work; + struct lio *lio = (struct lio *)wk->ctxptr; + struct octeon_device *oct = lio->oct_dev; + struct octeon_soft_command *sc; + struct timespec64 ts; + struct lio_time *lt; + int ret; + + sc = octeon_alloc_soft_command(oct, sizeof(struct lio_time), 0, 0); + if (!sc) { + dev_err(&oct->pci_dev->dev, + "Failed to sync time to octeon: soft command allocation failed\n"); + return; + } + + lt = (struct lio_time *)sc->virtdptr; + + /* Get time of the day */ + getnstimeofday64(&ts); + lt->sec = ts.tv_sec; + lt->nsec = ts.tv_nsec; + octeon_swap_8B_data((u64 *)lt, (sizeof(struct lio_time)) / 8); + + sc->iq_no = lio->linfo.txpciq[0].s.q_no; + octeon_prepare_soft_command(oct, sc, OPCODE_NIC, + OPCODE_NIC_SYNC_OCTEON_TIME, 0, 0, 0); + + sc->callback = lio_sync_octeon_time_cb; + sc->callback_arg = sc; + sc->wait_time = 1000; + + ret = octeon_send_soft_command(oct, sc); + if (ret == IQ_SEND_FAILED) { + dev_err(&oct->pci_dev->dev, + "Failed to sync time to octeon: failed to send soft command\n"); + octeon_free_soft_command(oct, sc); + } + + queue_delayed_work(lio->sync_octeon_time_wq.wq, + &lio->sync_octeon_time_wq.wk.work, + msecs_to_jiffies(LIO_SYNC_OCTEON_TIME_INTERVAL_MS)); +} + +/** + * setup_sync_octeon_time_wq - Sets up the work to periodically update + * local time to octeon firmware + * + * @netdev - network device which should send time update to firmware + **/ +static inline int setup_sync_octeon_time_wq(struct net_device *netdev) +{ + struct lio *lio = GET_LIO(netdev); + struct octeon_device *oct = lio->oct_dev; + + lio->sync_octeon_time_wq.wq = + alloc_workqueue("update-octeon-time", WQ_MEM_RECLAIM, 0); + if (!lio->sync_octeon_time_wq.wq) { + dev_err(&oct->pci_dev->dev, "Unable to create wq to update octeon time\n"); + return -1; + } + INIT_DELAYED_WORK(&lio->sync_octeon_time_wq.wk.work, + lio_sync_octeon_time); + lio->sync_octeon_time_wq.wk.ctxptr = lio; + queue_delayed_work(lio->sync_octeon_time_wq.wq, + &lio->sync_octeon_time_wq.wk.work, + msecs_to_jiffies(LIO_SYNC_OCTEON_TIME_INTERVAL_MS)); + + return 0; +} + +/** + * cleanup_sync_octeon_time_wq - stop scheduling and destroy the work created + * to periodically update local time to octeon firmware + * + * @netdev - network device which should send time update to firmware + **/ +static inline void cleanup_sync_octeon_time_wq(struct net_device *netdev) +{ + struct lio *lio = GET_LIO(netdev); + struct cavium_wq *time_wq = &lio->sync_octeon_time_wq; + + if (time_wq->wq) { + cancel_delayed_work_sync(&time_wq->wk.work); + destroy_workqueue(time_wq->wq); + } +} + static struct octeon_device *get_other_octeon_device(struct octeon_device *oct) { struct octeon_device *other_oct; @@ -1455,6 +1575,7 @@ static void liquidio_destroy_nic_device(struct octeon_device *oct, int ifidx) if (atomic_read(&lio->ifstate) & LIO_IFSTATE_REGISTERED) unregister_netdev(netdev); + cleanup_sync_octeon_time_wq(netdev); cleanup_link_status_change_wq(netdev); cleanup_rx_oom_poll_fn(netdev); @@ -3611,6 +3732,11 @@ static int setup_nic_devices(struct octeon_device *octeon_dev) if (setup_link_status_change_wq(netdev)) goto setup_nic_dev_fail; + if ((octeon_dev->fw_info.app_cap_flags & + LIQUIDIO_TIME_SYNC_CAP) && + setup_sync_octeon_time_wq(netdev)) + goto setup_nic_dev_fail; + if (setup_rx_oom_poll_fn(netdev)) goto setup_nic_dev_fail; diff --git a/drivers/net/ethernet/cavium/liquidio/liquidio_common.h b/drivers/net/ethernet/cavium/liquidio/liquidio_common.h index 3788c8c..0f21d57 100644 --- a/drivers/net/ethernet/cavium/liquidio/liquidio_common.h +++ b/drivers/net/ethernet/cavium/liquidio/liquidio_common.h @@ -84,6 +84,7 @@ enum octeon_tag_type { #define OPCODE_NIC_IF_CFG 0x09 #define OPCODE_NIC_VF_DRV_NOTICE 0x0A #define OPCODE_NIC_INTRMOD_PARAMS 0x0B +#define OPCODE_NIC_SYNC_OCTEON_TIME 0x14 #define VF_DRV_LOADED 1 #define VF_DRV_REMOVED -1 #define VF_DRV_MACADDR_CHANGED 2 @@ -108,6 +109,9 @@ enum octeon_tag_type { #define SCR2_BIT_FW_LOADED 63 +/* App specific capabilities from firmware to pf driver */ +#define LIQUIDIO_TIME_SYNC_CAP 0x1 + static inline u32 incr_index(u32 index, u32 count, u32 max) { if ((index + count) >= max) @@ -901,4 +905,8 @@ union oct_nic_if_cfg { } s; }; +struct lio_time { + s64 sec; /* seconds */ + s64 nsec; /* nanoseconds */ +}; #endif diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_console.c b/drivers/net/ethernet/cavium/liquidio/octeon_console.c index ec3dd69..eda799b 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_console.c +++ b/drivers/net/ethernet/cavium/liquidio/octeon_console.c @@ -803,15 +803,19 @@ static int octeon_console_read(struct octeon_device *oct, u32 console_num, } #define FBUF_SIZE (4 * 1024 * 1024) +#define MAX_DATE_SIZE 30 int octeon_download_firmware(struct octeon_device *oct, const u8 *data, size_t size) { - int ret = 0; + struct octeon_firmware_file_header *h; + char date[MAX_DATE_SIZE]; + struct timeval time; u32 crc32_result; + struct tm tm_val; u64 load_addr; u32 image_len; - struct octeon_firmware_file_header *h; + int ret = 0; u32 i, rem; if (size < sizeof(struct octeon_firmware_file_header)) { @@ -890,11 +894,29 @@ int octeon_download_firmware(struct octeon_device *oct, const u8 *data, load_addr += size; } } + + /* Get time of the day */ + do_gettimeofday(&time); + time_to_tm(time.tv_sec, (-sys_tz.tz_minuteswest) * 60, &tm_val); + ret = snprintf(date, MAX_DATE_SIZE, + " date=%04ld.%02d.%02d-%02d:%02d:%02d", + tm_val.tm_year + 1900, tm_val.tm_mon + 1, tm_val.tm_mday, + tm_val.tm_hour, tm_val.tm_min, tm_val.tm_sec); + if ((sizeof(h->bootcmd) - strnlen(h->bootcmd, sizeof(h->bootcmd))) < + ret) { + dev_err(&oct->pci_dev->dev, "Boot command buffer too small\n"); + return -EINVAL; + } + strncat(h->bootcmd, date, + sizeof(h->bootcmd) - strnlen(h->bootcmd, sizeof(h->bootcmd))); + dev_info(&oct->pci_dev->dev, "Writing boot command: %s\n", h->bootcmd); /* Invoke the bootcmd */ ret = octeon_console_send_cmd(oct, h->bootcmd, 50); + if (ret) + dev_info(&oct->pci_dev->dev, "Boot command send failed\n"); - return 0; + return ret; } diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_network.h b/drivers/net/ethernet/cavium/liquidio/octeon_network.h index 9e36319..433f361 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_network.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_network.h @@ -136,6 +136,9 @@ struct lio { /* work queue for link status */ struct cavium_wq link_status_wq; + /* work queue to regularly send local time to octeon firmware */ + struct cavium_wq sync_octeon_time_wq; + int netdev_uc_count; };