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 04094A2EDB for ; Thu, 5 Sep 2019 19:42:15 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A39FC1F0A3; Thu, 5 Sep 2019 19:41:54 +0200 (CEST) Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-eopbgr760082.outbound.protection.outlook.com [40.107.76.82]) by dpdk.org (Postfix) with ESMTP id 31AEF1F075 for ; Thu, 5 Sep 2019 19:41:51 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PhxLpPt1Nlzc+y87vhjlAlbw1juMIDBOCUbk66AqY7BeiqGemyW7toXwGHvOyHsEJQTkLSXbOYN7vtmBLF4CPvgZd/UhVUiFMM70U7bOo04zKNV5mv4s1FLf1skKDS8sj3Ezk2mZIkITFCXwur89KTKvgGEp/YXwPQGW0Y7DGEt3LEhntI0qU5Pdmjw2czv91hd3CAZWCxzeGcQUIxhFDY6h4e23uf9NoHAkMFBIRNQWww6CNSPMRdkPElh8a0kt/lam/MBZsfch1cV/m1+mz9nmQqeyu7M9+yqcz058gYDWyUXnO01lk+AG0pTWvSwkumeqKlO1+uNy4etTkaHiEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=S5RM5jgrJBbkmvNNTh98Kku36eefsUB3HHVOWWY/GGA=; b=ikp+2yg/m9qqfTOqmD22tqnfN7l8pcgZc8/oueKSg8HRbHuXgvIGYyfZIIFVgX/gS1jmIILRqFwfVu8oVP6seIYonWni1crwL6doCommqkAbRI4MTs5DDkl1Cn8FW4Wwg53r1mCnKe7uL1hup7EIlaUzcuS5aPNv5O839X2ZEnd2QiK1HcCqUqgHFdQHu/GZQYvLJ4cNnKsu4hsdy6ECVsQ8SHOcfVivxTmpKWr5zMx77HDWi0iewEtwtZjeWyW70sWNK3ZTUGdOoZ76M6TgsdbYbesGXnkWfptwDsExLPsSgEFpBsuORti/o1nCYQI2J8vkoebTUstsPedL0pc8EA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aquantia.com; dmarc=pass action=none header.from=aquantia.com; dkim=pass header.d=aquantia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=AQUANTIA1COM.onmicrosoft.com; s=selector2-AQUANTIA1COM-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=S5RM5jgrJBbkmvNNTh98Kku36eefsUB3HHVOWWY/GGA=; b=KBNrxiQ35OdS0iRPKiCYM5ikIaKEz61IOJ3Ue/rJQOs7F7l5CXcT8FmoUtJCrO9+9cf1WRjPpS5GLdZstbVXripeak7CqKBdpMfKasGwupWZT6EeE2vqduLhAKA7XL05trD7VbmaznUBod/jvAMBRA+jG/3lF+hIDSM3SAuAZhU= Received: from CY4PR1101MB2183.namprd11.prod.outlook.com (10.172.76.20) by CY4SPR00MB057.namprd11.prod.outlook.com (10.173.60.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2241.14; Thu, 5 Sep 2019 17:41:50 +0000 Received: from CY4PR1101MB2183.namprd11.prod.outlook.com ([fe80::4dee:fb50:cc75:fbde]) by CY4PR1101MB2183.namprd11.prod.outlook.com ([fe80::4dee:fb50:cc75:fbde%6]) with mapi id 15.20.2199.027; Thu, 5 Sep 2019 17:41:49 +0000 From: Pavel Belous To: Ferruh Yigit CC: "dev@dpdk.org" , Igor Russkikh , Corey Melton , Pavel Belous Thread-Topic: [PATCH 3/3] net/atlantic: add FW mailbox guard mutex Thread-Index: AQHVZBEypEvKlZQ+5EGjIiVo1/bcvg== Date: Thu, 5 Sep 2019 17:41:49 +0000 Message-ID: <1567705278-10558-4-git-send-email-Pavel.Belous@aquantia.com> References: <1567705278-10558-1-git-send-email-Pavel.Belous@aquantia.com> In-Reply-To: <1567705278-10558-1-git-send-email-Pavel.Belous@aquantia.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: HE1PR05CA0314.eurprd05.prod.outlook.com (2603:10a6:7:93::45) To CY4PR1101MB2183.namprd11.prod.outlook.com (2603:10b6:910:18::20) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Pavel.Belous@aquantia.com; x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 2.7.4 x-originating-ip: [95.79.108.179] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 1892c580-65bd-4526-9f10-08d73228547a x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600166)(711020)(4605104)(1401327)(2017052603328)(7193020); SRVR:CY4SPR00MB057; x-ms-traffictypediagnostic: CY4SPR00MB057: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:238; x-forefront-prvs: 015114592F x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(376002)(136003)(346002)(366004)(396003)(39850400004)(199004)(189003)(4326008)(3846002)(66446008)(86362001)(64756008)(66556008)(66476007)(8676002)(305945005)(6916009)(6116002)(2906002)(7736002)(66946007)(6512007)(6436002)(14454004)(6486002)(66066001)(81166006)(8936002)(81156014)(478600001)(50226002)(25786009)(6506007)(256004)(14444005)(486006)(2616005)(476003)(71200400001)(316002)(54906003)(11346002)(71190400001)(36756003)(26005)(76176011)(15650500001)(446003)(386003)(44832011)(102836004)(186003)(52116002)(107886003)(53936002)(99286004)(5660300002); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4SPR00MB057; H:CY4PR1101MB2183.namprd11.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: aquantia.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: ZZgfHwANFtFQqUuVGqW2ie8zz/POecHSvl0+fvN5bbjVkIwcEjN7pqhpJGrEz/tc1FusahRMORhT5Zvts+SktkjK8s5cr3tMEH7xRVLZjHP+8JEGgef9pv3b9dXoJsf1TEEPwZ8pMueK6E+KDFTdOoHa0yyQlk+9n3f3BbFMqxnxdxShZ5KfJwJsdv6zMS9tBSF6abYwhfm+4NjXVxBj5U8Ie9TgvlhJ4haY9Wgr07GDZTluNedktz+K2p/I12mkQM7mGrtZJB3HL6C//WvEOg7IoJJ4Q1wHkZPIvTQNOdlKtP5avrLAmvY/N3dBmCxWlTj19mRgV3W6Dlf7Y/9aRVLorE85YtbmYkbu/uMdGNgiuks/mCJTTGFicFJFRstocNvr+TEX8b5vEiMCYD+JdONJi3IYQRN41cRrPpIR/TU= Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: aquantia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1892c580-65bd-4526-9f10-08d73228547a X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Sep 2019 17:41:49.6936 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 83e2e134-991c-4ede-8ced-34d47e38e6b1 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: O5QhZaFrOU3w3ueS7srHOuQc2wd8JJuZjiH8pN8wRiWS8vwmyun1gzT/CTC0rwo/Wci+t5vkTlQumJUO39KIDQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4SPR00MB057 Subject: [dpdk-dev] [PATCH 3/3] net/atlantic: add FW mailbox guard mutex 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" From: Pavel Belous Driver uses the Firmware mailbox to read statistics and configure some features. This patch introduces a mutex to provide consistent access to the FW mailbox to prevent potential data corruption. Fixes: 86d36773bd42 ("net/atlantic: implement firmware operations") Signed-off-by: Pavel Belous --- drivers/net/atlantic/atl_ethdev.c | 4 ++ drivers/net/atlantic/atl_types.h | 2 + drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c | 82 ++++++++++++++++++---= ---- 3 files changed, 67 insertions(+), 21 deletions(-) diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_e= thdev.c index 1b9d514..1331b5f 100644 --- a/drivers/net/atlantic/atl_ethdev.c +++ b/drivers/net/atlantic/atl_ethdev.c @@ -410,6 +410,8 @@ eth_atl_dev_init(struct rte_eth_dev *eth_dev) =20 hw->aq_nic_cfg =3D &adapter->hw_cfg; =20 + pthread_mutex_init(&hw->mbox_mutex, NULL); + /* disable interrupt */ atl_disable_intr(hw); =20 @@ -474,6 +476,8 @@ eth_atl_dev_uninit(struct rte_eth_dev *eth_dev) rte_free(eth_dev->data->mac_addrs); eth_dev->data->mac_addrs =3D NULL; =20 + pthread_mutex_destroy(&hw->mbox_mutex); + return 0; } =20 diff --git a/drivers/net/atlantic/atl_types.h b/drivers/net/atlantic/atl_ty= pes.h index 19aaf37..7d5b603 100644 --- a/drivers/net/atlantic/atl_types.h +++ b/drivers/net/atlantic/atl_types.h @@ -137,6 +137,8 @@ struct aq_hw_s { u32 rpc_addr; u32 rpc_tid; struct hw_aq_atl_utils_fw_rpc rpc; + + pthread_mutex_t mbox_mutex; }; =20 struct aq_fw_ops { diff --git a/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c b/drivers/net/= atlantic/hw_atl/hw_atl_utils_fw2x.c index 70d6e14..55dc728 100644 --- a/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c +++ b/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c @@ -6,6 +6,7 @@ */ =20 #include +#include #include "../atl_hw_regs.h" =20 #include "../atl_types.h" @@ -217,13 +218,15 @@ int aq_fw2x_get_mac_permanent(struct aq_hw_s *self, u= 8 *mac) u32 mac_addr[2] =3D { 0 }; u32 efuse_addr =3D aq_hw_read_reg(self, HW_ATL_FW2X_MPI_EFUSE_ADDR); =20 + pthread_mutex_lock(&self->mbox_mutex); + if (efuse_addr !=3D 0) { err =3D hw_atl_utils_fw_downld_dwords(self, efuse_addr + (40U * 4U), mac_addr, ARRAY_SIZE(mac_addr)); if (err) - return err; + goto exit; mac_addr[0] =3D rte_constant_bswap32(mac_addr[0]); mac_addr[1] =3D rte_constant_bswap32(mac_addr[1]); } @@ -252,6 +255,10 @@ int aq_fw2x_get_mac_permanent(struct aq_hw_s *self, u8= *mac) h >>=3D 8; mac[0] =3D (u8)(0xFFU & h); } + +exit: + pthread_mutex_unlock(&self->mbox_mutex); + return err; } =20 @@ -261,6 +268,9 @@ static int aq_fw2x_update_stats(struct aq_hw_s *self) u32 mpi_opts =3D aq_hw_read_reg(self, HW_ATL_FW2X_MPI_CONTROL2_ADDR); u32 orig_stats_val =3D mpi_opts & BIT(CAPS_HI_STATISTICS); =20 + + pthread_mutex_lock(&self->mbox_mutex); + /* Toggle statistics bit for FW to update */ mpi_opts =3D mpi_opts ^ BIT(CAPS_HI_STATISTICS); aq_hw_write_reg(self, HW_ATL_FW2X_MPI_CONTROL2_ADDR, mpi_opts); @@ -271,9 +281,15 @@ static int aq_fw2x_update_stats(struct aq_hw_s *self) BIT(CAPS_HI_STATISTICS)), 1U, 10000U); if (err) - return err; + goto exit; + + err =3D hw_atl_utils_update_stats(self); + +exit: + pthread_mutex_unlock(&self->mbox_mutex); + + return err; =20 - return hw_atl_utils_update_stats(self); } =20 static int aq_fw2x_get_temp(struct aq_hw_s *self, int *temp) @@ -283,6 +299,8 @@ static int aq_fw2x_get_temp(struct aq_hw_s *self, int *= temp) u32 temp_val =3D mpi_opts & BIT(CAPS_HI_TEMPERATURE); u32 temp_res; =20 + pthread_mutex_lock(&self->mbox_mutex); + /* Toggle statistics bit for FW to 0x36C.18 (CAPS_HI_TEMPERATURE) */ mpi_opts =3D mpi_opts ^ BIT(CAPS_HI_TEMPERATURE); aq_hw_write_reg(self, HW_ATL_FW2X_MPI_CONTROL2_ADDR, mpi_opts); @@ -298,6 +316,9 @@ static int aq_fw2x_get_temp(struct aq_hw_s *self, int *= temp) &temp_res, sizeof(temp_res) / sizeof(u32)); =20 + + pthread_mutex_unlock(&self->mbox_mutex); + if (err) return err; =20 @@ -515,6 +536,8 @@ static int aq_fw2x_get_eeprom(struct aq_hw_s *self, int= dev_addr, if ((self->caps_lo & BIT(CAPS_LO_SMBUS_READ)) =3D=3D 0) return -EOPNOTSUPP; =20 + pthread_mutex_lock(&self->mbox_mutex); + request.msg_id =3D 0; request.device_id =3D dev_addr; request.address =3D offset; @@ -526,7 +549,7 @@ static int aq_fw2x_get_eeprom(struct aq_hw_s *self, int= dev_addr, sizeof(request) / sizeof(u32)); =20 if (err < 0) - return err; + goto exit; =20 /* Toggle 0x368.CAPS_LO_SMBUS_READ bit */ mpi_opts =3D aq_hw_read_reg(self, HW_ATL_FW2X_MPI_CONTROL_ADDR); @@ -541,17 +564,19 @@ static int aq_fw2x_get_eeprom(struct aq_hw_s *self, i= nt dev_addr, 10U, 10000U); =20 if (err < 0) - return err; + goto exit; =20 err =3D hw_atl_utils_fw_downld_dwords(self, self->rpc_addr + sizeof(u32), &result, sizeof(result) / sizeof(u32)); =20 if (err < 0) - return err; + goto exit; =20 - if (result) - return -EIO; + if (result) { + err =3D -EIO; + goto exit; + } =20 if (num_dwords) { err =3D hw_atl_utils_fw_downld_dwords(self, @@ -560,7 +585,7 @@ static int aq_fw2x_get_eeprom(struct aq_hw_s *self, int= dev_addr, num_dwords); =20 if (err < 0) - return err; + goto exit; } =20 if (bytes_remains) { @@ -573,13 +598,16 @@ static int aq_fw2x_get_eeprom(struct aq_hw_s *self, i= nt dev_addr, 1); =20 if (err < 0) - return err; + goto exit; =20 rte_memcpy((u8 *)data + len - bytes_remains, &val, bytes_remains); } =20 - return 0; +exit: + pthread_mutex_unlock(&self->mbox_mutex); + + return err; } =20 =20 @@ -598,13 +626,15 @@ static int aq_fw2x_set_eeprom(struct aq_hw_s *self, i= nt dev_addr, request.address =3D offset; request.length =3D len; =20 + pthread_mutex_lock(&self->mbox_mutex); + /* Write SMBUS request to cfg memory */ err =3D hw_atl_utils_fw_upload_dwords(self, self->rpc_addr, (u32 *)(void *)&request, sizeof(request) / sizeof(u32)); =20 if (err < 0) - return err; + goto exit; =20 /* Write SMBUS data to cfg memory */ u32 num_dwords =3D len / sizeof(u32); @@ -617,7 +647,7 @@ static int aq_fw2x_set_eeprom(struct aq_hw_s *self, int= dev_addr, num_dwords); =20 if (err < 0) - return err; + goto exit; } =20 if (bytes_remains) { @@ -633,7 +663,7 @@ static int aq_fw2x_set_eeprom(struct aq_hw_s *self, int= dev_addr, 1); =20 if (err < 0) - return err; + goto exit; } =20 /* Toggle 0x368.CAPS_LO_SMBUS_WRITE bit */ @@ -648,7 +678,7 @@ static int aq_fw2x_set_eeprom(struct aq_hw_s *self, int= dev_addr, 10U, 10000U); =20 if (err < 0) - return err; + goto exit; =20 /* Read status of write operation */ err =3D hw_atl_utils_fw_downld_dwords(self, self->rpc_addr + sizeof(u32), @@ -656,12 +686,17 @@ static int aq_fw2x_set_eeprom(struct aq_hw_s *self, i= nt dev_addr, sizeof(result) / sizeof(u32)); =20 if (err < 0) - return err; + goto exit; =20 - if (result) - return -EIO; + if (result) { + err =3D -EIO; + goto exit; + } =20 - return 0; +exit: + pthread_mutex_unlock(&self->mbox_mutex); + + return err; } =20 static int aq_fw2x_send_macsec_request(struct aq_hw_s *self, @@ -677,13 +712,15 @@ static int aq_fw2x_send_macsec_request(struct aq_hw_s= *self, if ((self->caps_lo & BIT(CAPS_LO_MACSEC)) =3D=3D 0) return -EOPNOTSUPP; =20 + pthread_mutex_lock(&self->mbox_mutex); + /* Write macsec request to cfg memory */ err =3D hw_atl_utils_fw_upload_dwords(self, self->rpc_addr, (u32 *)(void *)req, RTE_ALIGN(sizeof(*req) / sizeof(u32), sizeof(u32))); =20 if (err < 0) - return err; + goto exit; =20 /* Toggle 0x368.CAPS_LO_MACSEC bit */ mpi_opts =3D aq_hw_read_reg(self, HW_ATL_FW2X_MPI_CONTROL_ADDR); @@ -697,13 +734,16 @@ static int aq_fw2x_send_macsec_request(struct aq_hw_s= *self, 1000U, 10000U); =20 if (err < 0) - return err; + goto exit; =20 /* Read status of write operation */ err =3D hw_atl_utils_fw_downld_dwords(self, self->rpc_addr + sizeof(u32), (u32 *)(void *)response, RTE_ALIGN(sizeof(*response) / sizeof(u32), sizeof(u32))); =20 +exit: + pthread_mutex_unlock(&self->mbox_mutex); + return err; } =20 --=20 2.7.4