From patchwork Mon Apr 29 08:20:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Russkikh X-Patchwork-Id: 53134 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9CC471B276; Mon, 29 Apr 2019 10:20:24 +0200 (CEST) Received: from NAM04-BN3-obe.outbound.protection.outlook.com (mail-eopbgr680081.outbound.protection.outlook.com [40.107.68.81]) by dpdk.org (Postfix) with ESMTP id 2986E1B206; Mon, 29 Apr 2019 10:20:17 +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=yTKIb7WX2dRRVZ+duHYMarHFcyErfsWz4VRZsroPoVs=; b=kz1dXyW2DWLjJX1mdIpIWHoRRbNwxzForTObweBwsTx85PWB9hqF1PTKOEIsVejVzG9BGsocyWZFfH+X4YNhtxz3YPCaMUhH+aoAbJ/2qkPkJ8A+jZS+bvl2Ta7Hy/HSwORkJmlsWHikVmE5PTFSIVlUnnx7nzlHXrgfopX5CBw= Received: from DM6PR11MB3625.namprd11.prod.outlook.com (20.178.230.149) by DM6PR11MB2841.namprd11.prod.outlook.com (20.176.100.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1835.13; Mon, 29 Apr 2019 08:20:16 +0000 Received: from DM6PR11MB3625.namprd11.prod.outlook.com ([fe80::f035:2c20:5a61:7653]) by DM6PR11MB3625.namprd11.prod.outlook.com ([fe80::f035:2c20:5a61:7653%3]) with mapi id 15.20.1835.010; Mon, 29 Apr 2019 08:20:15 +0000 From: Igor Russkikh To: "dev@dpdk.org" CC: Pavel Belous , Igor Russkikh , "stable@dpdk.org" Thread-Topic: [PATCH 04/11] net/atlantic: eeprom get/set should consider offset Thread-Index: AQHU/mRfs2t+UBKUo0OqSueAV2G1dw== Date: Mon, 29 Apr 2019 08:20:15 +0000 Message-ID: <8daab002f486a50a0ad1aa02cd39513c732c94b8.1556525874.git.igor.russkikh@aquantia.com> References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: HE1P190CA0016.EURP190.PROD.OUTLOOK.COM (2603:10a6:3:bc::26) To DM6PR11MB3625.namprd11.prod.outlook.com (2603:10b6:5:13a::21) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Igor.Russkikh@aquantia.com; x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 2.17.1 x-originating-ip: [95.79.108.179] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 08567be1-4aa2-4858-aaae-08d6cc7b81f6 x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600141)(711020)(4605104)(2017052603328)(7193020); SRVR:DM6PR11MB2841; x-ms-traffictypediagnostic: DM6PR11MB2841: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:221; x-forefront-prvs: 0022134A87 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(366004)(376002)(396003)(136003)(39840400004)(346002)(199004)(189003)(44832011)(99286004)(186003)(118296001)(478600001)(71200400001)(53936002)(6506007)(71190400001)(446003)(5660300002)(2351001)(14454004)(14444005)(486006)(66556008)(73956011)(66946007)(64756008)(66476007)(66446008)(386003)(52116002)(316002)(11346002)(2616005)(7736002)(476003)(72206003)(54906003)(305945005)(81166006)(1730700003)(2501003)(36756003)(76176011)(81156014)(6486002)(3846002)(66066001)(102836004)(6916009)(97736004)(8936002)(450100002)(86362001)(6116002)(6436002)(26005)(256004)(8676002)(50226002)(2906002)(25786009)(5640700003)(6512007)(68736007)(4326008); DIR:OUT; SFP:1101; SCL:1; SRVR:DM6PR11MB2841; H:DM6PR11MB3625.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: dUcrxUl827IY22xFcgFKtsnPyxpIdXqiziQcDmALFKHmrvRhk6pFrNTGQjstY7DdCVfMwcOVFR5JpG5Jv6sNggDllJIzhTCYbD73bTbDH9t8siQ2E9/H0h+P6Dn9iR5vbYi+XfY5dBhXbduxoo0iJL16bL1i7DS7hCKtZzpl7TRbwzEwx5JcpTL8UgsnIGUhhZ1IYdx2skeIvZS4GO+WsivM3APpDTzwIyVFarHqxg9cMKkmBG/uf0oZcj0tOAQhQfvtXi8cIa9Lf2IHatlOAjrTcxR7X0mD0ocnIbYNDeYcyyLVkbPmMyiBpygt6YpcaNZYrtiWl1OtjE29uUYWZ2pKhWjFF5t0XHKqFjzz2T5LqVB1dd25PY4jvg10rV3EcbX5dYkL8gM7dD+AMTgWL2u5By65iRSwbfq6O4FPDe4= MIME-Version: 1.0 X-OriginatorOrg: aquantia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 08567be1-4aa2-4858-aaae-08d6cc7b81f6 X-MS-Exchange-CrossTenant-originalarrivaltime: 29 Apr 2019 08:20:15.7026 (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-Transport-CrossTenantHeadersStamped: DM6PR11MB2841 Subject: [dpdk-dev] [PATCH 04/11] net/atlantic: eeprom get/set should consider offset 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 EEPROM get/set offset logic should take offset into account. Data transfers to/from FW should also correctly use dword based transfer interface, taking into account the remainder. We also check error code returned from FW. cc: stable@dpdk.org Fixes: ce4e8d418097 ("net/atlantic: implement EEPROM get/set") Signed-off-by: Igor Russkikh Signed-off-by: Pavel Belous --- drivers/net/atlantic/atl_ethdev.c | 7 +- drivers/net/atlantic/atl_types.h | 2 +- drivers/net/atlantic/hw_atl/hw_atl_utils.h | 11 +-- .../net/atlantic/hw_atl/hw_atl_utils_fw2x.c | 95 ++++++++++++------- 4 files changed, 68 insertions(+), 47 deletions(-) diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c index 4e6124aa318e..7be97ab3095e 100644 --- a/drivers/net/atlantic/atl_ethdev.c +++ b/drivers/net/atlantic/atl_ethdev.c @@ -1448,14 +1448,15 @@ int atl_dev_set_eeprom(struct rte_eth_dev *dev, if (hw->aq_fw_ops->set_eeprom == NULL) return -ENOTSUP; - if (eeprom->length != SFP_EEPROM_SIZE || eeprom->data == NULL) + if (eeprom->length + eeprom->offset > SFP_EEPROM_SIZE || + eeprom->data == NULL) return -EINVAL; if (eeprom->magic) dev_addr = eeprom->magic; - return hw->aq_fw_ops->set_eeprom(hw, dev_addr, - eeprom->data, eeprom->length); + return hw->aq_fw_ops->set_eeprom(hw, dev_addr, eeprom->data, + eeprom->length, eeprom->offset); } static int diff --git a/drivers/net/atlantic/atl_types.h b/drivers/net/atlantic/atl_types.h index dbaf2c635f50..84a4776951db 100644 --- a/drivers/net/atlantic/atl_types.h +++ b/drivers/net/atlantic/atl_types.h @@ -177,7 +177,7 @@ struct aq_fw_ops { u32 *data, u32 len, u32 offset); int (*set_eeprom)(struct aq_hw_s *self, int dev_addr, - u32 *data, u32 len); + u32 *data, u32 len, u32 offset); int (*send_macsec_req)(struct aq_hw_s *self, struct macsec_msg_fw_request *req, diff --git a/drivers/net/atlantic/hw_atl/hw_atl_utils.h b/drivers/net/atlantic/hw_atl/hw_atl_utils.h index b7c531573623..81caffaedfd0 100644 --- a/drivers/net/atlantic/hw_atl/hw_atl_utils.h +++ b/drivers/net/atlantic/hw_atl/hw_atl_utils.h @@ -337,15 +337,8 @@ struct offload_info { u8 buf[0]; } __attribute__((__packed__)); -struct smbus_read_request { - u32 offset; /* not used */ - u32 device_id; - u32 address; - u32 length; -} __attribute__((__packed__)); - -struct smbus_write_request { - u32 offset; /* not used */ +struct smbus_request { + u32 msg_id; /* not used */ u32 device_id; u32 address; u32 length; 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 89a3759b89b4..de4189441fad 100644 --- a/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c +++ b/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c @@ -498,14 +498,17 @@ static int aq_fw2x_led_control(struct aq_hw_s *self, u32 mode) static int aq_fw2x_get_eeprom(struct aq_hw_s *self, int dev_addr, u32 *data, u32 len, u32 offset) { - int err = 0; - struct smbus_read_request request; - u32 mpi_opts; + u32 bytes_remains = len % sizeof(u32); + u32 num_dwords = len / sizeof(u32); + struct smbus_request request; u32 result = 0; + u32 mpi_opts; + int err = 0; if (self->fw_ver_actual < HW_ATL_FW_FEATURE_EEPROM) return -EOPNOTSUPP; + request.msg_id = 0; request.device_id = dev_addr; request.address = offset; request.length = len; @@ -540,34 +543,33 @@ static int aq_fw2x_get_eeprom(struct aq_hw_s *self, int dev_addr, if (err < 0) return err; - if (result == 0) { - u32 num_dwords = len / sizeof(u32); - u32 bytes_remains = len % sizeof(u32); + if (result) + return -EIO; - if (num_dwords) { - err = hw_atl_utils_fw_downld_dwords(self, - self->rpc_addr + sizeof(u32) * 2, - data, - num_dwords); + if (num_dwords) { + err = hw_atl_utils_fw_downld_dwords(self, + self->rpc_addr + sizeof(u32) * 2, + data, + num_dwords); - if (err < 0) - return err; - } + if (err < 0) + return err; + } - if (bytes_remains) { - u32 val = 0; + if (bytes_remains) { + u32 val = 0; - err = hw_atl_utils_fw_downld_dwords(self, - self->rpc_addr + sizeof(u32) * 2 + num_dwords, - &val, - sizeof(u32)); + err = hw_atl_utils_fw_downld_dwords(self, + self->rpc_addr + (sizeof(u32) * 2) + + (num_dwords * sizeof(u32)), + &val, + 1); - if (err < 0) - return err; + if (err < 0) + return err; - rte_memcpy((u8 *)data + len - bytes_remains, - &val, bytes_remains); - } + rte_memcpy((u8 *)data + len - bytes_remains, + &val, bytes_remains); } return 0; @@ -575,17 +577,18 @@ static int aq_fw2x_get_eeprom(struct aq_hw_s *self, int dev_addr, static int aq_fw2x_set_eeprom(struct aq_hw_s *self, int dev_addr, - u32 *data, u32 len) + u32 *data, u32 len, u32 offset) { - struct smbus_write_request request; + struct smbus_request request; u32 mpi_opts, result = 0; int err = 0; if (self->fw_ver_actual < HW_ATL_FW_FEATURE_EEPROM) return -EOPNOTSUPP; + request.msg_id = 0; request.device_id = dev_addr; - request.address = 0; + request.address = offset; request.length = len; /* Write SMBUS request to cfg memory */ @@ -597,13 +600,34 @@ static int aq_fw2x_set_eeprom(struct aq_hw_s *self, int dev_addr, return err; /* Write SMBUS data to cfg memory */ - err = hw_atl_utils_fw_upload_dwords(self, - self->rpc_addr + sizeof(request), - (u32 *)(void *)data, - RTE_ALIGN(len, sizeof(u32))); + u32 num_dwords = len / sizeof(u32); + u32 bytes_remains = len % sizeof(u32); - if (err < 0) - return err; + if (num_dwords) { + err = hw_atl_utils_fw_upload_dwords(self, + self->rpc_addr + sizeof(request), + (u32 *)(void *)data, + num_dwords); + + if (err < 0) + return err; + } + + if (bytes_remains) { + u32 val = 0; + + rte_memcpy(&val, (u8 *)data + (sizeof(u32) * num_dwords), + bytes_remains); + + err = hw_atl_utils_fw_upload_dwords(self, + self->rpc_addr + sizeof(request) + + (num_dwords * sizeof(u32)), + &val, + 1); + + if (err < 0) + return err; + } /* Toggle 0x368.CAPS_LO_SMBUS_WRITE bit */ mpi_opts = aq_hw_read_reg(self, HW_ATL_FW2X_MPI_CONTROL_ADDR); @@ -627,6 +651,9 @@ static int aq_fw2x_set_eeprom(struct aq_hw_s *self, int dev_addr, if (err < 0) return err; + if (result) + return -EIO; + return 0; }