From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-BY2-obe.outbound.protection.outlook.com (mail-by2nam03on0069.outbound.protection.outlook.com [104.47.42.69]) by dpdk.org (Postfix) with ESMTP id 5B6FF5B26 for ; Fri, 7 Sep 2018 17:23:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=AQUANTIA1COM.onmicrosoft.com; s=selector1-aquantia-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EbAkemlKWPyfCMfaqWC/wMXlPeueTgIXIVRkDs1C/oY=; b=sYl4Kd8EtAkYmM9mRrSn7Gmoct9Hm0EbUFugSbMhU0S3vpKyHdJ5L0odyRHTGPmzdskhq7dTAD1RZlo4EunksFzYxBPwVwSdx7ojcb0aqsRYCbMiXSrH+8tvQrLSfMox5n3o/pwZU0UJoa/YI+EgCqBnPHpRD+3uwHx/lLTs/VE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Igor.Russkikh@aquantia.com; Received: from ubuntubox.rdc.aquantia.com (95.79.108.179) by BLUPR0701MB1652.namprd07.prod.outlook.com (2a01:111:e400:58c6::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1122.16; Fri, 7 Sep 2018 15:23:29 +0000 From: Igor Russkikh To: dev@dpdk.org Cc: pavel.belous@aquantia.com, Nadezhda.Krupnina@aquantia.com, igor.russkikh@aquantia.com, Simon.Edelhaus@aquantia.com, Corey Melton , Ashish Kumar Date: Fri, 7 Sep 2018 18:21:53 +0300 Message-Id: <1536333719-32155-16-git-send-email-igor.russkikh@aquantia.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1536333719-32155-1-git-send-email-igor.russkikh@aquantia.com> References: <1536333719-32155-1-git-send-email-igor.russkikh@aquantia.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [95.79.108.179] X-ClientProxiedBy: BN6PR20CA0060.namprd20.prod.outlook.com (2603:10b6:404:151::22) To BLUPR0701MB1652.namprd07.prod.outlook.com (2a01:111:e400:58c6::22) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 09c7b5e9-eb7a-4749-5d66-08d614d5de1f X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989137)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(2017052603328)(7153060)(7193020); SRVR:BLUPR0701MB1652; X-Microsoft-Exchange-Diagnostics: 1; BLUPR0701MB1652; 3:i4nNWFGpGvUnIUvt0Dy63qhHFUgvnhLASFTWXlHDf5asCJI9BXSjuHzTuLhxnemGAkuEW2P7ykTWQHsmebRTbb3FYPCiSyZ4i67LBK/Q7+4NeGI0/70TdDAGzg+HLi239ikn6JQd6bmkHxcZQpF5WlM6qEE4mfQZGz7/SJWAu+YDpkkVQ5YLPAhYxGBrW6z86XC11IjQLKofD2D6BRHtRSQeUXKKy7/3zrkuSkiYO5UbgfQFkHjzk0VSGNc5dMO9; 25:pt6n9Mgm+OakFFChFdD8PC1VDtCTxVAyLAlFvxqV+VQ/Y4CFpnjOGb5i0Xxu8b07j/tqOvdcFx95SFvEg/jC38sU907FiHK55qKeYIEnATpKj4f6Bjeeoj8GN+WjjDsAH+zll5jtLVFOZjO6o5MEScsYiFw/Tqr3s9MW6LsUUPlnwbHVoNNH6DUd+88EWsTO5Ecz1204FlocGSvSoC21X8LMHlxul2GWObxXCyUDgUl7glwF+Cv68bfxIAj7Dh8yJ2ftySoDvfr4dDu/tdLnXji4Nep9sI+CSmQjFAtiARid8m1UiQkxtiCTdUjE+9YnhACRBA2wJHhjdWimaVWVQg==; 31:13YelsAf7hTkpog0kfWCAHR6LGTIW4ZOkwrMlsUPz7SJAT40pwKll2O3XtkS6lH3xZH7UCDe9iu61GNPXIq/GHKmqU9uHLVRl2/nfpgi0n7QtFFLt4qWb2j2fzMl0K3d/twmyLp80lw+IDMW619piHydxUXQPGOpaRuaUhWdbMHGEa2juBXmjhe3nWwlj6cl34T48rI8W5pY8Nhi3FGDioWr5GdBE6PD8oSzzy1mNZY= X-MS-TrafficTypeDiagnostic: BLUPR0701MB1652: X-Microsoft-Exchange-Diagnostics: 1; BLUPR0701MB1652; 20:0QOC6RUwUcq8CWcG3fA84gkoDtARhmp6hwHja8k3WWy0NsZaGUQ2ptmJN+VcCLHc3cyWd7A04v7dEzO+yL+UEer1URWugGARVdAz5+Ve+HGuXz/ymUBkmojJ/Ky9KlkRWTd4DeyGo4y5vsTCYrcXFh6ickoMNwYWimoFWSHCXnRaYXRfHAvS7SB69LD1T6OoCaWwp0h2h9LRrE+Oo2StrpHj0A5qVDisa98D5D/E5b8N9zyJv1sEJN2YL/Eg6Z73AnyaeEDY8MoNONxp0nHtOcnHj0Prbp7YOpWLlJx+Ktrd+B1rUUC9LU99y3TiJ2IZP+/NOD54s1oky9egG2ww7ywmaVAjhpo7F6z4vYZFyfgJJTJ4TjsAX9sJ20yybDHlCxFafJeb7RecaaDFeuU4AVyM5TsgeElOaNVMtlXupbNz/B8oQblp9SLxCDUw/3wzioRI31MR0HaBCaV3VgS8pqOHaLWURcQ9ETXjbyGYMK4fkGIYi3ntFDl0iTgyV15l; 4:46NM7C96AjuU2Zi4M27VevE27r+/bv34q1R6QrEtdPf5dEVXd4v43q84qWoE9FJM7VYe6QMcGi40lKYMH8mY5Hk5Ossr2A2lF8VhOrzH924keF9j+aSDZ0kHSGwfh9MGaZ8Jn32XMUaNbMKCuzzeM0s6m9MHKB9gpRIhQdrlDrOFh17PAhzd/oeNjEXVn7m+CNgS40oC5GSzSjdIWN8WW5gjv65Y8VAfzFIHnUk23fSsEr8Rz8z6kORMemnn40TKIySFPqDuRcpOHveiOLPq0w== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040522)(2401047)(5005006)(8121501046)(93006095)(93001095)(3231311)(944501410)(52105095)(10201501046)(3002001)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201708071742011)(7699050); SRVR:BLUPR0701MB1652; BCL:0; PCL:0; RULEID:; SRVR:BLUPR0701MB1652; X-Forefront-PRVS: 07880C4932 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(39850400004)(396003)(376002)(366004)(346002)(136003)(189003)(199004)(81156014)(81166006)(44832011)(8936002)(2351001)(486006)(106356001)(2361001)(105586002)(446003)(2906002)(50226002)(476003)(11346002)(956004)(2616005)(305945005)(7736002)(16586007)(316002)(54906003)(16526019)(66066001)(26005)(7696005)(52116002)(8676002)(51416003)(76176011)(186003)(386003)(68736007)(478600001)(6666003)(6916009)(6486002)(5660300001)(53936002)(47776003)(4326008)(25786009)(86362001)(48376002)(50466002)(575784001)(72206003)(6116002)(97736004)(36756003)(3846002); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR0701MB1652; H:ubuntubox.rdc.aquantia.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: aquantia.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR0701MB1652; 23:I73ZwonxM0XzSWOLXlYBMVoVqFN82MSikRekfxm?= =?us-ascii?Q?rqrzn7YHBvoXjMxSM6v6oJGms4Sa28P4EzoITlyABoevSt1nfg+Oeb7LtQhR?= =?us-ascii?Q?8RBo5rAWiHSgzNRn4/3dCAOVzx7qE8sJK2RPr7GoAq1zvZKJ8/zB1D0dG8nN?= =?us-ascii?Q?KcV2sdOqjQy+heXMq6vvsLiHi5IZDMmLOJvx84EWlwEfqBl/DPjUmf9WiAHt?= =?us-ascii?Q?Z9xAVOLJAJpyn6us2TY7uIwKdptkk9OgGkxcJXHXtatLYRxLXPN2MF/jvEAz?= =?us-ascii?Q?qgisSwbyA6LIdZ5ApaDE82zWcnAdpfhQcwwCFmBFwqbLF+tu9qxa3i1iiwrW?= =?us-ascii?Q?Phn7wZm/X4hLiaYrpSA/I0aq/+pTLWciVmva6DjtulQTt1ZnZcCbjfXY215s?= =?us-ascii?Q?DrpiM+xot0pnlXQ49Qjyn+57tBgtmqiSyOK2IHAG27OHi/5qkQqS7ZQSs2b0?= =?us-ascii?Q?Ht/RAHHIdUykZvKgAFu79w4qid4kWjXzl7g3YtvWXPVT8vRT+S0qPb21ym/O?= =?us-ascii?Q?JnhjjI6f7dERKw6ouVAwo+qMG+3Xan0MZG+HNTfZ2tTPkZ15hsFS9Rscj7f/?= =?us-ascii?Q?chtZh32Pvr1IU/72Hci1N3RwjfU6HH9MNYbDyX5fmORanTIOR71VdaO5B0xP?= =?us-ascii?Q?tYnYRQZn22edml27LcmEK0EKPJY9hY+P3lb6sUCgUcB+jC94JPYL8ZXJc8bi?= =?us-ascii?Q?hWNA1HaIFkZHLnMMj9VbI+qq5YxAXVfUtxvOh1HgeZdi/Xgzg11y4cihoS4s?= =?us-ascii?Q?vjwiEXivi2OZcllwkkkvmO8ddoWYQbSB0kQd7wYwGK6k0J2jiV2twJo6tQSI?= =?us-ascii?Q?wRa5HYtSIbnTq0yZOFYQAWoSdMWYltpMCqrSgGskXwcuvLkEBVtqlOopc/4I?= =?us-ascii?Q?lpgp6sq+Rpto5JxubWmU4corGcl6BpIPY7aTUtmSzhoCRmhzDCQmDkZ+7+Fp?= =?us-ascii?Q?xxpamTlnNH5B9lWDSbowZ/GHWKxNGx/zXfUCfddmqlIpG1QBlIZU43GGFa74?= =?us-ascii?Q?N4SjNmUGDKRej8EtLTMNru8wXAQs0EjfroB/dEnfTOcqk/L2d0bykzGoEVf2?= =?us-ascii?Q?THO69+MiwkbjHt7Rdl85Dc2aK2+IsPPXgJ7JwteoFxxdp4srtq+d3w3YAxmZ?= =?us-ascii?Q?q4VKGaTUdn0uYN8Z39TA7kB2PTJk2qP0vWGOdPK7D5J9THEU0FdyKnKzWxs6?= =?us-ascii?Q?812rltzOp8eUXprKndHIYQWPP/dUNZX7ZdnLvtcPE4lfkhT6+G1TiLoWqDoQ?= =?us-ascii?Q?S6t217XN90ApXba9hq5SEW5vozku3+CdlU0sNA2LP?= X-Microsoft-Antispam-Message-Info: tSSbdcI02tR06Gmh0lXAKsy/tJmaimvjzKUnpgzaNQgG2VSCkEMZt1/jykJiF38fKjSubnwQ8MEnccLnia9CQyXxZrNoZ1uBWbIL0TbzaewEsWUsCHGtDCmef5t5OY+dF4YVxdnBbV720V1CaVkbcz922ArAjHf0aLAvmPMDEB/E6k/vzXgAvBmgESG1Yhy0gd97OUUTG+JFlGJPkLDcaEHz5mUw30fpA08CZycAoUFwCPK08ciUCMxPpdvyGohWQ56swPprUVAiFRbFkHZ23cR+gA4f8qJ+oCzh8ZmNlJ+fOEjWGCjqY/yaDnbAPQvRwTzu72DBPRjiGnZykn3FXf5h7bZXCbHVLBbzMnfu08w= X-Microsoft-Exchange-Diagnostics: 1; BLUPR0701MB1652; 6:cNkZ4wu/38rKsCzP2VgdnyYId+sIz9/LtuM5Q674FueyhzeIcrKeSuPb3HQOLv7nz34BX8SPIvDwW4WaNNcMBA99FtiLMUX0PSmN03hi6zkkPLgw23/mXJwxcy4iNTe4qqp/3dkg3DlKFh8a/kkX3qaN7Z1R0CEy3JPqg6JTlC6F3IjiS5nl3OZY5akwvHX6z3HFh276szkiEIJ91KZVEYl8W5iblZF5kaBb1qthBq+JzdZoPPH/xVHIjOt8NpwGU0S2DNj0L1VwWJx4lwMx4XnUcZZDbFTZOObkVc4chjnyAhJC8rNcFP+dLXgC+LcuN5S1n37Lug202dzv/SEThMDdRxEO+Bloq86korxEWW+bijCgSoZrV/OetHJ2cJ8Fr1iumkkPIXwYlEmIdMc7ewXpW4Peh7I1uD80CAo8EJcFW/1qEFzpOrCyK5VIYBawxMOr6uyJEKVVZpTjWnSGqg==; 5:Yi3fXcMNbWmrKrGMCXNEQd1Sqx9yJ3exOhphSl9PIUdrl5vzGesYPEPIxnEdQIU3wnRqByw/gTg+3AP/wOIV6YzvF2necr4Fy8pFAMcKt+ekDN7Xbn+d2aUH0Sfa9D03jvcT/m3VSkAEM+Af7YW9yDSf4L5S+6FLlKYVCTzoa5I=; 7:8K661LmrQ47ivHHMtXBU3bV9ztZyDg1z1s7wx1V9t0TnNhutZCF1kV63u5gyx7aEzTdky2q5kk4qx469RGhwZllVTgWjA8rbMqDJTIsyS0NAp93anfNrkTEKHx0s7fiBNQzOgZPIqDsktH5kpy8c/KNd86gUzWjPzMOw2Vykbp+b7xlUP55UdcaZAWDRLckIVTrvSZYQrmfbXtnGkonfR6toO1W6+23bw6xSlV48nNmDYQIjWcBKi4QaXHWKqpdV SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: aquantia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Sep 2018 15:23:29.3269 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 09c7b5e9-eb7a-4749-5d66-08d614d5de1f X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 83e2e134-991c-4ede-8ced-34d47e38e6b1 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR0701MB1652 Subject: [dpdk-dev] [PATCH 15/21] net/atlantic: LED control DPDK and private APIs 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: , X-List-Received-Date: Fri, 07 Sep 2018 15:23:33 -0000 Signed-off-by: Igor Russkikh --- drivers/net/atlantic/Makefile | 4 +++ drivers/net/atlantic/atl_ethdev.c | 52 +++++++++++++++++++++++++++++++++ drivers/net/atlantic/atl_ethdev.h | 2 ++ drivers/net/atlantic/meson.build | 3 ++ drivers/net/atlantic/rte_pmd_atlantic.c | 19 ++++++++++++ drivers/net/atlantic/rte_pmd_atlantic.h | 44 ++++++++++++++++++++++++++++ 6 files changed, 124 insertions(+) create mode 100644 drivers/net/atlantic/rte_pmd_atlantic.c create mode 100644 drivers/net/atlantic/rte_pmd_atlantic.h diff --git a/drivers/net/atlantic/Makefile b/drivers/net/atlantic/Makefile index d70ee4380..4b0e6f06c 100644 --- a/drivers/net/atlantic/Makefile +++ b/drivers/net/atlantic/Makefile @@ -55,5 +55,9 @@ VPATH += $(SRCDIR)/hw_atl # all source are stored in SRCS-y # SRCS-$(CONFIG_RTE_LIBRTE_ATLANTIC_PMD) += atl_ethdev.c +SRCS-$(CONFIG_RTE_LIBRTE_ATLANTIC_PMD) += rte_pmd_atlantic.c + +# install this header file +SYMLINK-$(CONFIG_RTE_LIBRTE_ATLANTIC_PMD)-include := rte_pmd_atlantic.h include $(RTE_SDK)/mk/rte.lib.mk diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c index fe1560923..00e686639 100644 --- a/drivers/net/atlantic/atl_ethdev.c +++ b/drivers/net/atlantic/atl_ethdev.c @@ -66,6 +66,11 @@ static void atl_dev_info_get(struct rte_eth_dev *dev, static const uint32_t *atl_dev_supported_ptypes_get(struct rte_eth_dev *dev); + +/* LEDs */ +static int atl_dev_led_on(struct rte_eth_dev *dev); +static int atl_dev_led_off(struct rte_eth_dev *dev); + /* EEPROM */ static int atl_dev_get_eeprom_length(struct rte_eth_dev *dev); static int atl_dev_get_eeprom(struct rte_eth_dev *dev, struct rte_dev_eeprom_info *eeprom); @@ -184,6 +189,11 @@ static const struct eth_dev_ops atl_eth_dev_ops = { .get_reg = atl_dev_get_regs, + + /* LEDs */ + .dev_led_on = atl_dev_led_on, + .dev_led_off = atl_dev_led_off, + /* EEPROM */ .get_eeprom_length = atl_dev_get_eeprom_length, .get_eeprom = atl_dev_get_eeprom, @@ -856,6 +866,48 @@ atl_dev_interrupt_handler(void *param) atl_dev_interrupt_action(dev, dev->intr_handle); } +/** + * LED ON Enables software controllable LED blinking. + * LED status then is independent of link status or traffic + */ +static int +atl_dev_led_on(struct rte_eth_dev *dev) +{ + struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private); + + if (hw->aq_fw_ops->led_control == NULL) + return -ENOTSUP; + + return hw->aq_fw_ops->led_control(hw, AQ_HW_LED_BLINK | (AQ_HW_LED_BLINK << 2) | (AQ_HW_LED_BLINK << 4)); +} + +/** + * LED OFF disables software controllable LED blinking + * LED is controlled by default logic and depends on link status and + * traffic activity + */ +static int +atl_dev_led_off(struct rte_eth_dev *dev) +{ + struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private); + + if (hw->aq_fw_ops->led_control == NULL) + return -ENOTSUP; + + return hw->aq_fw_ops->led_control(hw, AQ_HW_LED_DEFAULT); +} + +int +atl_dev_led_control(struct rte_eth_dev *dev, int control) +{ + struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private); + + if (hw->aq_fw_ops->led_control == NULL) + return -ENOTSUP; + + return hw->aq_fw_ops->led_control(hw, control); +} + #define SFP_EEPROM_SIZE 0xff static int diff --git a/drivers/net/atlantic/atl_ethdev.h b/drivers/net/atlantic/atl_ethdev.h index ce4bc9544..3ebef1f43 100644 --- a/drivers/net/atlantic/atl_ethdev.h +++ b/drivers/net/atlantic/atl_ethdev.h @@ -46,4 +46,6 @@ struct atl_adapter { #define ATL_DEV_PRIVATE_TO_CFG(adapter) \ (&((struct atl_adapter *)adapter)->hw_cfg) +int +atl_dev_led_control(struct rte_eth_dev *dev, int control); #endif /* _ATLANTIC_ETHDEV_H_ */ diff --git a/drivers/net/atlantic/meson.build b/drivers/net/atlantic/meson.build index 187ca9808..19fa41cd3 100644 --- a/drivers/net/atlantic/meson.build +++ b/drivers/net/atlantic/meson.build @@ -5,6 +5,7 @@ sources = files( 'atl_ethdev.c', + 'rte_pmd_atlantic.c', ) deps += ['hash', 'eal'] @@ -17,3 +18,5 @@ if get_option('buildtype') == 'debug' endif allow_experimental_apis = true + +install_headers('rte_pmd_atlantic.h') diff --git a/drivers/net/atlantic/rte_pmd_atlantic.c b/drivers/net/atlantic/rte_pmd_atlantic.c new file mode 100644 index 000000000..34f063ea4 --- /dev/null +++ b/drivers/net/atlantic/rte_pmd_atlantic.c @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2018 Aquantia Corporation + */ + +#include + +#include "rte_pmd_atlantic.h" +#include "atl_ethdev.h" + +int rte_pmd_atl_dev_led_control(int port, int control) +{ + struct rte_eth_dev *dev; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV); + + dev = &rte_eth_devices[port]; + + return atl_dev_led_control(dev, control); +} diff --git a/drivers/net/atlantic/rte_pmd_atlantic.h b/drivers/net/atlantic/rte_pmd_atlantic.h new file mode 100644 index 000000000..7c0a6a214 --- /dev/null +++ b/drivers/net/atlantic/rte_pmd_atlantic.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2018 Aquantia Corporation + */ + +/** + * @file rte_pmd_atlantic.h + * atlantic PMD specific functions. + * + **/ + +#ifndef _PMD_ATLANTIC_H_ +#define _PMD_ATLANTIC_H_ + +#include + +#define RTE_PMD_AQ_HW_LED_OFF 0x3U +#define RTE_PMD_AQ_HW_LED_BLINK 0x2U +#define RTE_PMD_AQ_HW_LED_ON 0x1U +#define RTE_PMD_AQ_HW_LED_DEFAULT 0x0U + +/** + * This is a custom API for adapter's LED controls. + * + * @param dev + * Ethernet device to apply control to + * @param control + * 6 bit value (3 leds each 2bit): + * - bits 0-1: LED0 control + * - bits 2-3: LED1 control + * - bits 4-5: LED2 control + * Each two bit control value is: + * - 0: Firmware manages this LED activity + * - 1: Permanent ON + * - 2: Blinking + * - 3: Permanent OFF + * + * @return + * - (0) if successful. + * - (-ENOTSUP) if hardware doesn't support. + */ +int rte_pmd_atl_dev_led_control(int port, int control); + + +#endif /* _PMD_ATLANTIC_H_ */ -- 2.13.3.windows.1