From patchwork Mon May 21 10:40:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sudarsana Reddy Kalluru X-Patchwork-Id: 917536 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=cavium.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=CAVIUMNETWORKS.onmicrosoft.com header.i=@CAVIUMNETWORKS.onmicrosoft.com header.b="V6YYzj6b"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40qFg75PPBz9rxs for ; Mon, 21 May 2018 20:40:51 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752737AbeEUKkt (ORCPT ); Mon, 21 May 2018 06:40:49 -0400 Received: from mail-co1nam03on0060.outbound.protection.outlook.com ([104.47.40.60]:33147 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752586AbeEUKkk (ORCPT ); Mon, 21 May 2018 06:40:40 -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:X-MS-Exchange-SenderADCheck; bh=CXKLyfB/jhdrVWh3Ud167N+VhgD4NnIcUhsNwOY5Yf0=; b=V6YYzj6b1pYa4D2QIols3ccaAmUI1wIxdoboTUwcBoBjD3Jkp06D6zP3RWF4fGzvhONfMkQWH9h4e4+XpfjOUyu140SWOiHgEdx8Pq44bt92epL0lsMcHrwD+2iFWiW2PYXhamoO/Zf8KLCrUQMt3u/2DwmDWJ0oOQOuONwniRQ= Received: from DM6PR07CA0028.namprd07.prod.outlook.com (2603:10b6:5:94::41) by DM2PR07MB1514.namprd07.prod.outlook.com (2a01:111:e400:50c5::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.776.16; Mon, 21 May 2018 10:40:38 +0000 Received: from CO1NAM05FT050.eop-nam05.prod.protection.outlook.com (2a01:111:f400:7e50::209) by DM6PR07CA0028.outlook.office365.com (2603:10b6:5:94::41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.776.11 via Frontend Transport; Mon, 21 May 2018 10:40:38 +0000 Received-SPF: Pass (protection.outlook.com: domain of cavium.com designates 50.232.66.26 as permitted sender) receiver=protection.outlook.com; client-ip=50.232.66.26; helo=CAEXCH02.caveonetworks.com; Received: from CAEXCH02.caveonetworks.com (50.232.66.26) by CO1NAM05FT050.mail.protection.outlook.com (10.152.96.165) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.20.797.3 via Frontend Transport; Mon, 21 May 2018 10:40:37 +0000 Received: from dut1171.mv.qlogic.com (172.29.51.171) by CAEXCH02.caveonetworks.com (10.17.4.29) with Microsoft SMTP Server id 14.2.347.0; Mon, 21 May 2018 03:40:21 -0700 Received: from dut1171.mv.qlogic.com (localhost [127.0.0.1]) by dut1171.mv.qlogic.com (8.14.7/8.14.7) with ESMTP id w4LAeMWq005555; Mon, 21 May 2018 03:40:22 -0700 Received: (from root@localhost) by dut1171.mv.qlogic.com (8.14.7/8.14.7/Submit) id w4LAeMG6005554; Mon, 21 May 2018 03:40:22 -0700 From: Sudarsana Reddy Kalluru To: CC: , , , Subject: [PATCH net-next 3/8] qed: Add driver infrastucture for handling mfw requests. Date: Mon, 21 May 2018 03:40:13 -0700 Message-ID: <20180521104018.5506-4-sudarsana.kalluru@cavium.com> X-Mailer: git-send-email 2.12.0 In-Reply-To: <20180521104018.5506-1-sudarsana.kalluru@cavium.com> References: <20180521104018.5506-1-sudarsana.kalluru@cavium.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:50.232.66.26; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(39380400002)(346002)(39850400004)(376002)(396003)(2980300002)(438002)(199004)(189003)(575784001)(42186006)(50466002)(59450400001)(4326008)(486006)(72206003)(87636003)(478600001)(47776003)(336012)(48376002)(26005)(69596002)(54906003)(76176011)(2351001)(86362001)(186003)(106002)(51416003)(6346003)(16586007)(446003)(316002)(80596001)(11346002)(126002)(476003)(2616005)(6916009)(81166006)(6666003)(81156014)(2906002)(50226002)(5660300001)(8676002)(8936002)(107886003)(305945005)(36756003)(356003)(106466001)(1076002); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR07MB1514; H:CAEXCH02.caveonetworks.com; FPR:; SPF:Pass; LANG:en; PTR:50-232-66-26-static.hfc.comcastbusiness.net; A:1; MX:1; X-Microsoft-Exchange-Diagnostics: 1; CO1NAM05FT050; 1:/8d3zyXf6eZtmXjcnTdpcpQ0kQiqrkfAdX5VO/bGXGgnOj2FXHYihullVtLj+gNUAMxVCUAbMWaP87N5I3dKUmKrLOR8MhESnonYfiXcqdxdFbaJn6ysVYwtb7xs7w+D X-MS-PublicTrafficType: Email X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4608076)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060); SRVR:DM2PR07MB1514; X-Microsoft-Exchange-Diagnostics: 1; DM2PR07MB1514; 3:ZP1UoeHAKWsCy0QHlsZMYrSH8pW7YKXTg1Wwz3K9UXSTcMZAb636YDi/gWG77uppT/TJamJPchz4pWpKWvd5cBNpxqoLP7m2gEYo5bO8gypZKJDRstxuktud84g+Hvild1YiADuMIiezmZQUW9k7t9UN56c917ifrYCLfMA6RnZM70J6WA1uFhnU/rIU69jdfHot/NXVV3hpNEoCw3Gh9GP0nwbMmHEIAPTrLt6bb8arqsa4LmzMdN7McuqWApIg6oOvraT1yH5cnG/JgNIj0rtv/UviAtOU8l2g0Olo79FqHAXApqmcuBL0bBw0UnDGpupJnFXBAoIKlIMGH1caNKsoHCqhxkIW/hswUacacKU=; 25:1bf5IdoMlOxBtLBiDrLE4ID34bGsK69l/qM/TC9MUfZL895u2Tp/9QTOFJdy0FUP4vFeH4+7BOr8WNUnRZXbgUGvb62SPbEutVGqHyy8fWK4xVQI1uwPcchDXIBbM9ubbrYGmG1FtTRzq2eccG2JY2CRjUO+6EGgsHTGFN+7RUqeKx0OvlpO6sngnq0biZz5P/9yR0AayAMZaIfh1ZLuQPIFBcI+vuUFg1m508+KmDetUuaWndqS62PWicLfeteaEkmIicrUy7o02EoPDNTNf8LcgWtb9lpnATEBUhIttDxHnwyEuWMri7bPPhWY2hBMc8T84fRf8vTgpAW2kmGe21iqqgIkdfwJjz2sqBZv5+8= X-MS-TrafficTypeDiagnostic: DM2PR07MB1514: X-Microsoft-Exchange-Diagnostics: 1; DM2PR07MB1514; 31:hjPyIolcH6VObjpXPeJR2t4R/zfOebZF9rtc94csagOtXqUIEn275IdlgBiYQ7YcLNj9iN7JzgJhUkiLyk3LxJfNrSnOUjRTfFCncpktrjF5GKAgpV+Q5xlXYMTyrK8V6lXOCwSOjRm62GvOOPirbY+o+PSVMO+PweE59BU+lMgsxo44iZcwYsb2CPzRY8WPkLkBxPnQbt++3qiwITsHSElmrboRf9n90PsEo5Xc2n4=; 20:1A9WZj1oub4D65+NjYvrxaSYfBVazzddlfslPE/kepcpTUPLFJHHYljIDpuGQeJNMj3zOBYoQ6uqb0Jxk6go8KLbHtilp2RCniYx67U0gn9QS1riFcHF6xJSDKSi09XbN06aqWqVRdtuUtB5j5ev96Q4Elx9/GptEbPeezZT0i/+q8EKMnB5YQo1eAwKZ7qJIej+0WJZmQuspbXX/I2xSe7dtg6IrobCUdpQujjcBFcvR3GvA7fDvZDcH7Gtdv2KrJEvN5l256q2Zz+2yUzFhuFXWxSid0ztu0wf/fLk84GMqWxNJIujL5ODqire8aevE9ocKKT1GQd+XinuiVoEP9tY8aXofGB2agyElVRRcUAeFy+bNGBdXcMaKEFNwLw9qpK7htmpX8hdFH7tJQwMLKHQ1GYzccdlXW3uZCHAr2oambeXujpnkOaund1+QOBxg5sJyEIFy1NEd3uP2sUM+8Y/s3t17Mk/2Rv4SM9sJQ8NeRCP3juFztpBadErCcrN X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(17755550239193); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3002001)(10201501046)(93006095)(93004095)(3231254)(944501410)(52105095)(149027)(150027)(6041310)(20161123560045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(6072148)(201708071742011)(7699016); SRVR:DM2PR07MB1514; BCL:0; PCL:0; RULEID:; SRVR:DM2PR07MB1514; X-Microsoft-Exchange-Diagnostics: 1; DM2PR07MB1514; 4:JAYu72EnopHtNOCs01Zuwhr5mmbz7mheeUZlI8reUNIvv1IpkaIPC2TBrzyB2lMrBHhNktQoJUAoSyxekVQbrkkxOEcufXGkBABMd63J7fKytrPXWfvcO2BvE4IXb9obNW7lmVVv1nBrl/hmVFDvZeniQPWkX5BaRQYokKmxX8H07WKKrErW5Er9yxID6xVad7Yjq6iKWCfyKfA+MSFUoTqIlYNo1sxfjl35gD4XF5xd8JtcACTLtzWu/ddx5kbAGvEuKTwB0SrelD/KbqbNUBxME12EOToUlyeSMRVDCzflbjtkW5uo8ImvB82Q+8Vx X-Forefront-PRVS: 06793E740F X-Microsoft-Exchange-Diagnostics: 1; DM2PR07MB1514; 23:Gh4GX8dNDjiIKY/WhuwH1KWqASrLN2U2zeGnZb7Ax3LQFx+QztIznDTFPymo0xiZXlSVAscTudNd8MvcT+QV4zQUAplIy+oxaEzYjaKoomw4ZYt5jK6wguinCa4ZVD2UTocHCO3TjglnZfygrkrb+QEvykPe2bIIqjeUWzb1lLIhGjno22taJvTU79bD+QSkNamXi7FToUsIOznHJEF5IbFTFViK6vPjVUI7Nt210OjHesjVHbvT6xg0PIzqO4LnqbGkiwGWntVcXdM6+H6KFLDG/Cm9Sjtt3ol2Cx7Pj6OZ3oTtGt3LG9cHWJJ+BP3UH/PBj1B/Qj7F5ALC3d4PXX6Ub823Z9gM2p3pUSesyuqsBL0lRzOXE4z3JQAgex/Dv09WaPUXuixFwU+r+wymE86RSJrndTlkfn7cYYyTfUreX6/tyKWjASyRWbZMuFc/GQs/CExyq2M1Y/IORd7qQBgjl7Ewgo63mm+p1RsQjRBfVF7O4YxuiOfAdSJsHNwY/5eUSRRus0xumQysx+kImDCMbmDItQ2/yMZNsJg3hQmIkO3Ler2QfBGUhIC1QtUWzhrf7FXs8o5BWJ0pekpBOjPJm0riUICxrD27bafMPDz5td4fpQmJgayQL/ChZ2QE9g6RHpZyGSFCxqDb/UxhwSavNgX1xhC0bBJX+DgUVbeSfpUWoLVcfxy7v9mHDSO4+QHsACm+5zQhpYt9s+QUyIyBSvS2LTOGShl2oV9+JAc6v6U9wndBLfN4BQWyF3FFg1tLj1iNK3QfTfKlmAI+yCpd9kRWxslxvKRdRVh7etAagnw3U3BQBqmHTMffmN1SPRu5jMPHsT8eydhllSZ9lQhJrxDIyf052ZkjITtelRztSLdm9W2UModOcq0nnR6oMlednI7lLgBWKJsK4A2xCMjE7qw004VFwyae0aHGwSPokqyeYm5VEG4kPrlknIITW7QbQnim0o1oONXgWlEhv0VOUGDaifHQa2hJU7EefOwZV1vrUk6ao/sq9IsMin7ZZbdLbWTUbK0SxjVE/q1xQmuO/f3zCTSrb2JVWtAL+UcY9FvxouwaOTeI2kTzhkQg6KD84UqqNkEgrMGoZ1zHKyiisP7npayfArijg6yX3XsNWn0pg1Lt6NJlNssfGz2fNSR8pbcRRcFaV2zyPLS/rWqmJ+MpcC3+wFn71rjWEUiMvDDZCNMUXzrKrcvAPO7i X-Microsoft-Antispam-Message-Info: xxhHmDd+UErNNDofbyno9rxMRmsWq25JnvoSI+GkocDOYYpxRRCjhXa3p/PPGYOhHntPkp5BGe9Sk84blZLmFnRT2wHlUnDdcHXCNHxZlWzRkJgUx1CLBx46ZAkUDDDfXl/prXwuUWnPhWcnmnB5axiVfCNxQPd/4SN5rCq5EA7tctAADKB/VEU8xASEFVRi X-Microsoft-Exchange-Diagnostics: 1; DM2PR07MB1514; 6:5T9QR6+9YCXaQdUEvkWV4/qgmPLTwekjQvjW+yTHXMXks41VZzpcAPya1GwfqLa1byzKcRZzIATVYx8grNMrkehKHRaCqW4gHfDPJw1TSd6SMr4gcyVGdBmGuDnn2Xz+Ksvim2G8m4VMwHDfs66srWeLtfyYshgtMXGIqunRrQIsZ2At63RCuoBgEsHSTJAytF0tPPP7wphbMBwxF6EVth5N3vCeXasIrs1LUs5XKo4VBO5AP9XO86efIEFoem0kudM8oeOV7LpvUh4DQsKDvGikheaVToTcc747ZocpIess2baav05hzksFz41mLL5y93bz2GpOLJrf6/e0qGNrGH2coidKkUTOzGLraPa1Hp6T1DaumnaEdyPNmJeRWBVeplMh2yCUDNhGOdghQ07QIxEdREUQsf8NX8Ydio9pdOfM6kPhMEA3hcajGPwRjtQ/Juuab0tc9E02AsiUB+uqvQ==; 5:z4MqVujSZFNjZ1Vt+enghF/aOgfiKmGqrSBX8Y3Uivk61478AtJQHZJlOGo2YN34wVxur9kqbDGNn1GpKVWpaQBNQ/1wmZYB0ZgUEeVYXyOJayiCY5PVzvSt+vt2dFelDDj5SnGUeEAYzN+L6jHTTyOjUTE15fS4DROLDJ2wYv8=; 24:jIyQYQct2BIFBP8uY2vAHdXDPuGc6Vob7KYQ4hV+F6fuJTlKDiZ0cdUvPCxpCirVJ45M9G0eq70jUIg6EduLeqMIz8ZGsvkjjmQjJ1BWEfc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM2PR07MB1514; 7:YrESW/eL8JTxfwQ5DovgvJpiaNXGGlSfsioE7Ozi5dvpNU6Szsca4EgJ0kmYDtL+TKS0dYNIo5ktNXQjCUSBYaX9+1tNRG4fgcukYpV60kzJfOf8B3Us6Jo7oOakqoLLbxXjW6PkF4knt4zz1bzwvuRttmnETjMIqZp4KZgeh2/mTfHTys7Pe1AlwPADncVNo6clrJ0lHYMRFEHLJl29S+X6wECxk+T+kA3f/AVslCN0u69H3jtDAPW5X18o1l1H X-MS-Office365-Filtering-Correlation-Id: 35f1100e-9bd7-41db-d622-08d5bf074ad6 X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 May 2018 10:40:37.6719 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 35f1100e-9bd7-41db-d622-08d5bf074ad6 X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=711e4ccf-2e9b-4bcf-a551-4094005b6194; Ip=[50.232.66.26]; Helo=[CAEXCH02.caveonetworks.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR07MB1514 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org MFW requests the TLVs in interrupt context. Extracting of the required data from upper layers and populating of the TLVs require process context. The patch adds work-queues for processing the tlv requests. It also adds the implementation for requesting the tlv values from appropriate protocol driver. Signed-off-by: Sudarsana Reddy Kalluru Signed-off-by: Ariel Elior --- drivers/net/ethernet/qlogic/qed/qed.h | 8 ++ drivers/net/ethernet/qlogic/qed/qed_main.c | 151 ++++++++++++++++++++++++++++- drivers/net/ethernet/qlogic/qed/qed_mcp.c | 2 + include/linux/qed/qed_if.h | 10 ++ 4 files changed, 170 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/qlogic/qed/qed.h b/drivers/net/ethernet/qlogic/qed/qed.h index dfdbe52..00db340 100644 --- a/drivers/net/ethernet/qlogic/qed/qed.h +++ b/drivers/net/ethernet/qlogic/qed/qed.h @@ -515,6 +515,10 @@ struct qed_simd_fp_handler { void (*func)(void *); }; +enum qed_slowpath_wq_flag { + QED_SLOWPATH_MFW_TLV_REQ, +}; + struct qed_hwfn { struct qed_dev *cdev; u8 my_id; /* ID inside the PF */ @@ -644,6 +648,9 @@ struct qed_hwfn { #endif struct z_stream_s *stream; + struct workqueue_struct *slowpath_wq; + struct delayed_work slowpath_task; + unsigned long slowpath_task_flags; }; struct pci_params { @@ -908,6 +915,7 @@ void qed_get_protocol_stats(struct qed_dev *cdev, union qed_mcp_protocol_stats *stats); int qed_slowpath_irq_req(struct qed_hwfn *hwfn); void qed_slowpath_irq_sync(struct qed_hwfn *p_hwfn); +int qed_mfw_tlv_req(struct qed_hwfn *hwfn); int qed_mfw_fill_tlv_data(struct qed_hwfn *hwfn, enum qed_mfw_tlv_type type, diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c index cbf0ea9..68c4399 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_main.c +++ b/drivers/net/ethernet/qlogic/qed/qed_main.c @@ -946,6 +946,68 @@ static void qed_update_pf_params(struct qed_dev *cdev, } } +static void qed_slowpath_wq_stop(struct qed_dev *cdev) +{ + int i; + + if (IS_VF(cdev)) + return; + + for_each_hwfn(cdev, i) { + if (!cdev->hwfns[i].slowpath_wq) + continue; + + flush_workqueue(cdev->hwfns[i].slowpath_wq); + destroy_workqueue(cdev->hwfns[i].slowpath_wq); + } +} + +static void qed_slowpath_task(struct work_struct *work) +{ + struct qed_hwfn *hwfn = container_of(work, struct qed_hwfn, + slowpath_task.work); + struct qed_ptt *ptt = qed_ptt_acquire(hwfn); + + if (!ptt) { + queue_delayed_work(hwfn->slowpath_wq, &hwfn->slowpath_task, 0); + return; + } + + if (test_and_clear_bit(QED_SLOWPATH_MFW_TLV_REQ, + &hwfn->slowpath_task_flags)) + qed_mfw_process_tlv_req(hwfn, ptt); + + qed_ptt_release(hwfn, ptt); +} + +static int qed_slowpath_wq_start(struct qed_dev *cdev) +{ + struct qed_hwfn *hwfn; + char name[NAME_SIZE]; + int i; + + if (IS_VF(cdev)) + return 0; + + for_each_hwfn(cdev, i) { + hwfn = &cdev->hwfns[i]; + + snprintf(name, NAME_SIZE, "slowpath-%02x:%02x.%02x", + cdev->pdev->bus->number, + PCI_SLOT(cdev->pdev->devfn), hwfn->abs_pf_id); + + hwfn->slowpath_wq = alloc_workqueue(name, 0, 0); + if (!hwfn->slowpath_wq) { + DP_NOTICE(hwfn, "Cannot create slowpath workqueue\n"); + return -ENOMEM; + } + + INIT_DELAYED_WORK(&hwfn->slowpath_task, qed_slowpath_task); + } + + return 0; +} + static int qed_slowpath_start(struct qed_dev *cdev, struct qed_slowpath_params *params) { @@ -961,6 +1023,9 @@ static int qed_slowpath_start(struct qed_dev *cdev, if (qed_iov_wq_start(cdev)) goto err; + if (qed_slowpath_wq_start(cdev)) + goto err; + if (IS_PF(cdev)) { rc = request_firmware(&cdev->firmware, QED_FW_FILE_NAME, &cdev->pdev->dev); @@ -1095,6 +1160,8 @@ static int qed_slowpath_start(struct qed_dev *cdev, qed_iov_wq_stop(cdev, false); + qed_slowpath_wq_stop(cdev); + return rc; } @@ -1103,6 +1170,8 @@ static int qed_slowpath_stop(struct qed_dev *cdev) if (!cdev) return -ENODEV; + qed_slowpath_wq_stop(cdev); + qed_ll2_dealloc_if(cdev); if (IS_PF(cdev)) { @@ -2089,8 +2158,88 @@ void qed_get_protocol_stats(struct qed_dev *cdev, } } +int qed_mfw_tlv_req(struct qed_hwfn *hwfn) +{ + DP_VERBOSE(hwfn->cdev, NETIF_MSG_DRV, + "Scheduling slowpath task [Flag: %d]\n", + QED_SLOWPATH_MFW_TLV_REQ); + smp_mb__before_atomic(); + set_bit(QED_SLOWPATH_MFW_TLV_REQ, &hwfn->slowpath_task_flags); + smp_mb__after_atomic(); + queue_delayed_work(hwfn->slowpath_wq, &hwfn->slowpath_task, 0); + + return 0; +} + +static void +qed_fill_generic_tlv_data(struct qed_dev *cdev, struct qed_mfw_tlv_generic *tlv) +{ + struct qed_common_cb_ops *op = cdev->protocol_ops.common; + struct qed_eth_stats_common *p_common; + struct qed_generic_tlvs gen_tlvs; + struct qed_eth_stats stats; + int i; + + memset(&gen_tlvs, 0, sizeof(gen_tlvs)); + op->get_generic_tlv_data(cdev->ops_cookie, &gen_tlvs); + + if (gen_tlvs.feat_flags & QED_TLV_IP_CSUM) + tlv->flags.ipv4_csum_offload = true; + if (gen_tlvs.feat_flags & QED_TLV_LSO) + tlv->flags.lso_supported = true; + tlv->flags.b_set = true; + + for (i = 0; i < QED_TLV_MAC_COUNT; i++) { + if (is_valid_ether_addr(gen_tlvs.mac[i])) { + ether_addr_copy(tlv->mac[i], gen_tlvs.mac[i]); + tlv->mac_set[i] = true; + } + } + + qed_get_vport_stats(cdev, &stats); + p_common = &stats.common; + tlv->rx_frames = p_common->rx_ucast_pkts + p_common->rx_mcast_pkts + + p_common->rx_bcast_pkts; + tlv->rx_frames_set = true; + tlv->rx_bytes = p_common->rx_ucast_bytes + p_common->rx_mcast_bytes + + p_common->rx_bcast_bytes; + tlv->rx_bytes_set = true; + tlv->tx_frames = p_common->tx_ucast_pkts + p_common->tx_mcast_pkts + + p_common->tx_bcast_pkts; + tlv->tx_frames_set = true; + tlv->tx_bytes = p_common->tx_ucast_bytes + p_common->tx_mcast_bytes + + p_common->tx_bcast_bytes; + tlv->rx_bytes_set = true; +} + int qed_mfw_fill_tlv_data(struct qed_hwfn *hwfn, enum qed_mfw_tlv_type type, union qed_mfw_tlv_data *tlv_buf) { - return -EINVAL; + struct qed_dev *cdev = hwfn->cdev; + struct qed_common_cb_ops *ops; + + ops = cdev->protocol_ops.common; + if (!ops || !ops->get_protocol_tlv_data || !ops->get_generic_tlv_data) { + DP_NOTICE(hwfn, "Can't collect TLV management info\n"); + return -EINVAL; + } + + switch (type) { + case QED_MFW_TLV_GENERIC: + qed_fill_generic_tlv_data(hwfn->cdev, &tlv_buf->generic); + break; + case QED_MFW_TLV_ETH: + ops->get_protocol_tlv_data(cdev->ops_cookie, &tlv_buf->eth); + break; + case QED_MFW_TLV_FCOE: + ops->get_protocol_tlv_data(cdev->ops_cookie, &tlv_buf->fcoe); + break; + case QED_MFW_TLV_ISCSI: + ops->get_protocol_tlv_data(cdev->ops_cookie, &tlv_buf->iscsi); + break; + default: + break; + } + + return 0; } diff --git a/drivers/net/ethernet/qlogic/qed/qed_mcp.c b/drivers/net/ethernet/qlogic/qed/qed_mcp.c index e80f5e7..2612e3e 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_mcp.c +++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.c @@ -1622,6 +1622,8 @@ int qed_mcp_handle_events(struct qed_hwfn *p_hwfn, case MFW_DRV_MSG_S_TAG_UPDATE: qed_mcp_update_stag(p_hwfn, p_ptt); break; + case MFW_DRV_MSG_GET_TLV_REQ: + qed_mfw_tlv_req(p_hwfn); break; default: DP_INFO(p_hwfn, "Unimplemented MFW message %d\n", i); diff --git a/include/linux/qed/qed_if.h b/include/linux/qed/qed_if.h index 62455f7..436c84c 100644 --- a/include/linux/qed/qed_if.h +++ b/include/linux/qed/qed_if.h @@ -750,6 +750,14 @@ struct qed_int_info { u8 used_cnt; }; +struct qed_generic_tlvs { +#define QED_TLV_IP_CSUM BIT(0) +#define QED_TLV_LSO BIT(1) + u16 feat_flags; +#define QED_TLV_MAC_COUNT 3 + u8 mac[QED_TLV_MAC_COUNT][ETH_ALEN]; +}; + #define QED_NVM_SIGNATURE 0x12435687 enum qed_nvm_flash_cmd { @@ -764,6 +772,8 @@ struct qed_common_cb_ops { void (*link_update)(void *dev, struct qed_link_output *link); void (*dcbx_aen)(void *dev, struct qed_dcbx_get *get, u32 mib_type); + void (*get_generic_tlv_data)(void *dev, struct qed_generic_tlvs *data); + void (*get_protocol_tlv_data)(void *dev, void *data); }; struct qed_selftest_ops {