From patchwork Wed Feb 17 17:49:28 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Lendacky X-Patchwork-Id: 584254 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id B0FF51400CB for ; Thu, 18 Feb 2016 04:50:07 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161546AbcBQRuA (ORCPT ); Wed, 17 Feb 2016 12:50:00 -0500 Received: from mail-bn1on0070.outbound.protection.outlook.com ([157.56.110.70]:2896 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1161540AbcBQRtj (ORCPT ); Wed, 17 Feb 2016 12:49:39 -0500 Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=amd.com; Received: from tlendack-t1.amdoffice.net (165.204.77.1) by BY2PR12MB0196.namprd12.prod.outlook.com (10.162.83.14) with Microsoft SMTP Server (TLS) id 15.1.409.15; Wed, 17 Feb 2016 17:49:34 +0000 Subject: [PATCH net-next v2 9/9] amd-xgbe: Mask auto-negotiation interrupts in ISR From: Tom Lendacky To: CC: David Miller Date: Wed, 17 Feb 2016 11:49:28 -0600 Message-ID: <20160217174928.26246.61123.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20160217174758.26246.15641.stgit@tlendack-t1.amdoffice.net> References: <20160217174758.26246.15641.stgit@tlendack-t1.amdoffice.net> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: BLUPR13CA0043.namprd13.prod.outlook.com (25.160.82.14) To BY2PR12MB0196.namprd12.prod.outlook.com (25.162.83.14) X-MS-Office365-Filtering-Correlation-Id: 57126b0f-8073-403d-a0b3-08d337c2b28a X-Microsoft-Exchange-Diagnostics: 1; BY2PR12MB0196; 2:mT9CbumcTMbHuf2YekuAed4JJUUX7hrQsjwxqIvhHBnsQ2tmZqJQ8oW0dtEeoyremJRFaiRefKP9LxdFlKqT0mLsa92nzyfSTk410UhzoPSOV1RhKAPnuOhIZc8+efZ383Xwwx7kt7a8d47eccN5jsgNMh2ps8DFB/GL8R0FxsfL+xeND7H68jRcfsLvKagZ; 3:5/dXw3/W5q1HFv84gIGywt4Lb0goOLHuimFd3zVriG3LPurbmzB2zw0Cj1DWqNNUt8Jc994B5kr1DaDWyKcru5psLJRx8r/C3sRdVRB6ldltSbbIRrqye2vw3+vAjPmB; 25:zP4HDSrwKXzfQlNCf4QfL1FBLGu5nZINw86NTa3N01D9rt4PJQrGDInxjT5jy2r5SNBPKerlqciJrpx3uGem40X1jexDNTQC1Xt4QolPYCRueeWqOnuuMIq/Rb8DA0bbmbGPyHoWktZaLXC8VlrWB4VP8Zb2HI576htBORdQGrwaJ7YhmkGZX98Ijh/5bYzmVsPTSuv6rpbxL5k3SCmEs+fQkmIL+1pfFNuxzgapBTvceHeL4C0nj7C2dWz6x9INrhMWLiRsd2KZ5wwZ3riXWdcP5SACyJfynqjYiYf19erIlPniK5jwXTTsikjLNR9t X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR12MB0196; X-Microsoft-Exchange-Diagnostics: 1; BY2PR12MB0196; 20:KbuQZYvcSEiE7j3/EITs9D6gJ5FYBqQXquMm0FwxButSyjufHvF2Mqe/5JngOl9P+zPhfAOzwAemtM64yJjgMxW1lxdR5lMeCRtFQzQJpQycHhNgK873/Crl60H60PkTN2Pa3she0d3s3sIp7u6MK279MVn4KrrEyZvytPn6qZOtQJgoIahPonJe8Hu+chPAGtRlQlmxKqpjUGcrQdV5t/sWzXzUJsW+scieB2y//kXTkHhg60RUQwkoKBwOoSjZp6c7U/w9jop9nnKclo2xgMpX3r9bRlmmmTCWCZ4f76keJjayI4rZYA2ZDiaObCV6irTPpwU9isSgmsSXsk0+VZqTJ01YDzqTrcjSIQLDC0wedUEb4j/lGuaR7dcsviaKUCM7aHZzkdH1VqeR//ARKkUHgwUI0IVJaW1ZJqJNWgS5sKqRCDxup7T7KZ1wwo3qmTsmxe+oz5boGrVO8kljBWMXq6kH670eIX1pMLIXx2eNz6z0G4O59/FjGx5b9KHk; 4:ur0FXsyiQEL2Rz9rCxmCxR940YCGBIo7PLCLinno11GLKa9AWW9Y4PFH4a+TUpV4TsSwygMh+1z/0obIuMymuaC+J1JWay6OubgoRk1D8Yt5Hnr4TuvaG21x/zlLtjIPqk5MMVdk8rkVfyMIJ+DyeVBmkSwcIOBg7Z1aKo7z7mpCM1zq71LodCCe7q2zpnLrDsMmY6B4vBZajpqBrKTt6tYJGgbjq/siaz+tz85uW49rmT1Kf5gxp7T1I2xQ994RjrK52sY1+G04ZVCRouXUdr0WaDg6HtN/2ZWhXwMH8yGVKTi8lR+BEUcDe4mfqa5ikJSJpJXe167qAy3ZGKwHr350Es8rczRRYmciEq3X6ysUBSEyc87cWdDHNcqGHBds1X4up8avCQS/bkmRSbbWHzuoWuZNc1MQQChzU6rPH38= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046); SRVR:BY2PR12MB0196; BCL:0; PCL:0; RULEID:; SRVR:BY2PR12MB0196; X-Forefront-PRVS: 085551F5A8 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(83506001)(87976001)(50986999)(66066001)(54356999)(76176999)(47776003)(23676002)(229853001)(2351001)(103116003)(86362001)(33646002)(230700001)(2950100001)(6116002)(40100003)(92566002)(5008740100001)(4326007)(53416004)(42186005)(2906002)(4001350100001)(586003)(122386002)(19580395003)(1076002)(1096002)(5004730100002)(110136002)(19580405001)(5001960100002)(77096005)(189998001)(3846002)(71626007); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR12MB0196; H:tlendack-t1.amdoffice.net; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCWTJQUjEyTUIwMTk2OzIzOlFmNnlsb2U2YVRqNDl2b0pob3VDcDVzT1o2?= =?utf-8?B?dGNPZXcyNTJQU3M5WVB5Y3RQcXVWZkg4RWZQZ1RCbmxlUCtBMWtXV09LcENj?= =?utf-8?B?MDdxK0w5d1dpYW5UcFFRYVNrTUlLYUhJZlV6cDVYYjdNK2hHbk9DVmR0Qmc1?= =?utf-8?B?UkxhN0NkRUQ0WXVmVFQxaU1xVmYvY1RFUG9oeTV5Nm9sV2M3bkR4cGhEWTVs?= =?utf-8?B?RE5xcjVXS0Zwd2FjR3RrNUkrY2V0cGUzNGo5N2hBUFdVOHordFd5bTNPTDJB?= =?utf-8?B?OVZvL1UrVWcvNVE2cDdJSWhVcFQ1QnpIZU4ycFpFTklrUzhydWVXVlJsL2Qw?= =?utf-8?B?enhOQURmc003R2V6OHh6WThnTW1LVlBySWVKb3pSaklPd3hIUkxXcjZNQXJq?= =?utf-8?B?QVRWN1NwL1JWSzFxalA3andER3l6NXhsdVhjSFYvUkRmOUNhN25Fd2hvM2N6?= =?utf-8?B?dlozaTlLYjZ4cDNDaDdrUmZGL1llcFF3UEdpTzdONC9CaGwvb1Z3MlNpQTBZ?= =?utf-8?B?emJQU0Q2bHlEV0JmdkZ2dFBXWlR2am80M1ZZK3IrOTcyZk9mY2JGcVdqbnN5?= =?utf-8?B?RHh5amszWXBIN0NWUTNtVE51bmtpai9LNE1ScnZRakg5ekZNRU9MWlNyWnJO?= =?utf-8?B?WXQ5V05XTFBzNG9mWEk4cHhCZ1NTQ2pndHMyZk5uUHFsbVVGTFhkeDI4ZUUv?= =?utf-8?B?TWdDK2lDcDlaK0pUYzVXV1Q2a2RDclIxK0I2aWNjbmZTQzVCbXRJNTJZUGFN?= =?utf-8?B?bHk2Z3Z1N2xLV1FYdWdjTVBSOFk2VmNMOWJ1WGdrWE0vaHpQTFlpYk1JT3VZ?= =?utf-8?B?WUVRM2NwL1VuTUFUdGdoMW5HZS9Ia3F4ZzB3Y0V5eWZIY1F4K3Y1WEV4UTNE?= =?utf-8?B?WnM1ckFBU1FuVTRxdGVZZ2Z2dkdMeVAvWEc1OGxLS0JhZmFERHpFd2R1bmdn?= =?utf-8?B?Smt3YmFQNWhUS0RlZXJCckppZUsrWlU5Z2ZZMUdqTXNweTVKa2FFbEpFTkNq?= =?utf-8?B?dVFrQ3VYUGxvMVJjRjdaV0gwREZyL0IrT0hNMS9mY2lMWXRwNmo3YTdLZVdB?= =?utf-8?B?bm83MXVieVRBM2FZcjc5QVFFNjlRUG5JNkxwUWM4OVlpYXJHVk1jOW9FNUgw?= =?utf-8?B?RUJ2K1laRC9HMHhmMm5hY0lPTFhPcXF4elJqRjliWHJ0MlFzSUpaMUNOKzUv?= =?utf-8?B?U3ErL2pXelAwdUZpMHdXUWl2M0pvdG1BQVpQeE1SQ0kvY1dJUjdqYnY1WXNy?= =?utf-8?B?WnhjcnRMT0hud0wzMHdHN2x2bndFT0JJSG5lV0YxSkxnRG54Z0Z1MVFWZVBZ?= =?utf-8?B?QlIrZENyN04rL0FNSVQ1K3B2MDF6UmpndjBRT2FlZlB6cFdnS2MwWnZBTlRG?= =?utf-8?B?SVJEemVnU3o3dzZJSG1HS1ZFaGtmQ0JWYXlvdXd6T2NINk5Ob1MzQW5aby9W?= =?utf-8?Q?Fqk4xI=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR12MB0196; 5:uYOSK01Z2piH/r2ZCBWz3D1FUfuAuTGZxIGwZgCyT8J5oHMD9vkpeg7nuvNiQ6HwwrqIETiQ+E6/FJfyK2BhmYsfvTpMckB4mCNIDiD/Is70cyrw8drrf7JSB2kffDvrVTMpta4WVUK4VIbORYMw+Q==; 24:OZGZDGlS0r/DMPTclE+m8aloaMmoGRAQjrzSt07/1Rw/Ei0acu3LVm9izndRGD2oKFLqRmZP4cveh58wZIX+ae/N9hpXKBDBGI8hsIpeuZg=; 20:KTdyCzBZjzRYb0QASkWR8UP+1APf6sA2OnYvQV5u5QwJLKPIQHMCb/bqGtKZuVScHqtfcDTceCQipEswwRCdGBvP6/J6d+iozonvuHoB8O2lHKFsL5IxLZek+6NC78Ev6HNGF3oxUgroPVwENBDUKAWCx64w1BuDDg8qAy6Cxq8YEExzoEPHknpwdrkO9my4uFUy6+VJjPhphgw7ulVwUnS+Ph+82gESyQV0UxQsDSjxylFy16jyp/9mGw4kwlMi X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Feb 2016 17:49:34.2515 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR12MB0196 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Currently the auto-negotiation interrupt handling disables the irq instead of masking off the interrupts. This was done because the phy library was originally used to read and write the PCS registers, which could not be performed in interrupt context. Now that the phy library is no longer used to read and write the PCS registers the interrupts can be masked off in the interrupt service routine eliminating the need to call disable_irq/enable_irq. This also requires changing the protection mutex to a spinlock. Signed-off-by: Tom Lendacky --- drivers/net/ethernet/amd/xgbe/xgbe-dev.c | 10 +++-- drivers/net/ethernet/amd/xgbe/xgbe-main.c | 6 ++- drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 53 ++++++++++++++++------------- drivers/net/ethernet/amd/xgbe/xgbe.h | 5 ++- 4 files changed, 41 insertions(+), 33 deletions(-) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c index b48c6ec..1babcc1 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c @@ -1022,6 +1022,7 @@ static int xgbe_config_rx_mode(struct xgbe_prv_data *pdata) static int xgbe_read_mmd_regs(struct xgbe_prv_data *pdata, int prtad, int mmd_reg) { + unsigned long flags; unsigned int mmd_address; int mmd_data; @@ -1039,10 +1040,10 @@ static int xgbe_read_mmd_regs(struct xgbe_prv_data *pdata, int prtad, * register offsets must therefore be adjusted by left shifting the * offset 2 bits and reading 32 bits of data. */ - mutex_lock(&pdata->xpcs_mutex); + spin_lock_irqsave(&pdata->xpcs_lock, flags); XPCS_IOWRITE(pdata, PCS_MMD_SELECT << 2, mmd_address >> 8); mmd_data = XPCS_IOREAD(pdata, (mmd_address & 0xff) << 2); - mutex_unlock(&pdata->xpcs_mutex); + spin_unlock_irqrestore(&pdata->xpcs_lock, flags); return mmd_data; } @@ -1051,6 +1052,7 @@ static void xgbe_write_mmd_regs(struct xgbe_prv_data *pdata, int prtad, int mmd_reg, int mmd_data) { unsigned int mmd_address; + unsigned long flags; if (mmd_reg & MII_ADDR_C45) mmd_address = mmd_reg & ~MII_ADDR_C45; @@ -1066,10 +1068,10 @@ static void xgbe_write_mmd_regs(struct xgbe_prv_data *pdata, int prtad, * register offsets must therefore be adjusted by left shifting the * offset 2 bits and reading 32 bits of data. */ - mutex_lock(&pdata->xpcs_mutex); + spin_lock_irqsave(&pdata->xpcs_lock, flags); XPCS_IOWRITE(pdata, PCS_MMD_SELECT << 2, mmd_address >> 8); XPCS_IOWRITE(pdata, (mmd_address & 0xff) << 2, mmd_data); - mutex_unlock(&pdata->xpcs_mutex); + spin_unlock_irqrestore(&pdata->xpcs_lock, flags); } static int xgbe_tx_complete(struct xgbe_ring_desc *rdesc) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-main.c b/drivers/net/ethernet/amd/xgbe/xgbe-main.c index 618d952..3eee320 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-main.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-main.c @@ -6,7 +6,7 @@ * * License 1: GPLv2 * - * Copyright (c) 2014 Advanced Micro Devices, Inc. + * Copyright (c) 2014-2016 Advanced Micro Devices, Inc. * * This file is free software; you may copy, redistribute and/or modify * it under the terms of the GNU General Public License as published by @@ -56,7 +56,7 @@ * * License 2: Modified BSD * - * Copyright (c) 2014 Advanced Micro Devices, Inc. + * Copyright (c) 2014-2016 Advanced Micro Devices, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -363,7 +363,7 @@ static int xgbe_probe(struct platform_device *pdev) platform_set_drvdata(pdev, netdev); spin_lock_init(&pdata->lock); - mutex_init(&pdata->xpcs_mutex); + spin_lock_init(&pdata->xpcs_lock); mutex_init(&pdata->rss_mutex); spin_lock_init(&pdata->tstamp_lock); diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c index 4460580..84c5d29 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c @@ -6,7 +6,7 @@ * * License 1: GPLv2 * - * Copyright (c) 2014 Advanced Micro Devices, Inc. + * Copyright (c) 2014-2016 Advanced Micro Devices, Inc. * * This file is free software; you may copy, redistribute and/or modify * it under the terms of the GNU General Public License as published by @@ -56,7 +56,7 @@ * * License 2: Modified BSD * - * Copyright (c) 2014 Advanced Micro Devices, Inc. + * Copyright (c) 2014-2016 Advanced Micro Devices, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -626,10 +626,22 @@ static irqreturn_t xgbe_an_isr(int irq, void *data) netif_dbg(pdata, intr, pdata->netdev, "AN interrupt received\n"); - /* Interrupt reason must be read and cleared outside of IRQ context */ - disable_irq_nosync(pdata->an_irq); + /* Disable AN interrupts */ + XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INTMASK, 0); + + /* Save the interrupt(s) that fired */ + pdata->an_int = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_INT); - queue_work(pdata->an_workqueue, &pdata->an_irq_work); + if (pdata->an_int) { + /* Clear the interrupt(s) that fired and process them */ + XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, ~pdata->an_int); + + queue_work(pdata->an_workqueue, &pdata->an_irq_work); + } else { + /* Enable AN interrupts */ + XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INTMASK, + XGBE_AN_INT_MASK); + } return IRQ_HANDLED; } @@ -673,34 +685,26 @@ static void xgbe_an_state_machine(struct work_struct *work) struct xgbe_prv_data, an_work); enum xgbe_an cur_state = pdata->an_state; - unsigned int int_reg, int_mask; mutex_lock(&pdata->an_mutex); - /* Read the interrupt */ - int_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_INT); - if (!int_reg) + if (!pdata->an_int) goto out; next_int: - if (int_reg & XGBE_AN_PG_RCV) { + if (pdata->an_int & XGBE_AN_PG_RCV) { pdata->an_state = XGBE_AN_PAGE_RECEIVED; - int_mask = XGBE_AN_PG_RCV; - } else if (int_reg & XGBE_AN_INC_LINK) { + pdata->an_int &= ~XGBE_AN_PG_RCV; + } else if (pdata->an_int & XGBE_AN_INC_LINK) { pdata->an_state = XGBE_AN_INCOMPAT_LINK; - int_mask = XGBE_AN_INC_LINK; - } else if (int_reg & XGBE_AN_INT_CMPLT) { + pdata->an_int &= ~XGBE_AN_INC_LINK; + } else if (pdata->an_int & XGBE_AN_INT_CMPLT) { pdata->an_state = XGBE_AN_COMPLETE; - int_mask = XGBE_AN_INT_CMPLT; + pdata->an_int &= ~XGBE_AN_INT_CMPLT; } else { pdata->an_state = XGBE_AN_ERROR; - int_mask = 0; } - /* Clear the interrupt to be processed */ - int_reg &= ~int_mask; - XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, int_reg); - pdata->an_result = pdata->an_state; again: @@ -740,14 +744,14 @@ again: } if (pdata->an_state == XGBE_AN_NO_LINK) { - int_reg = 0; + pdata->an_int = 0; XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, 0); } else if (pdata->an_state == XGBE_AN_ERROR) { netdev_err(pdata->netdev, "error during auto-negotiation, state=%u\n", cur_state); - int_reg = 0; + pdata->an_int = 0; XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, 0); } @@ -765,11 +769,12 @@ again: if (cur_state != pdata->an_state) goto again; - if (int_reg) + if (pdata->an_int) goto next_int; out: - enable_irq(pdata->an_irq); + /* Enable AN interrupts on the way out */ + XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INTMASK, XGBE_AN_INT_MASK); mutex_unlock(&pdata->an_mutex); } diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h index ca28354..98d9d63 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h @@ -774,8 +774,8 @@ struct xgbe_prv_data { /* Overall device lock */ spinlock_t lock; - /* XPCS indirect addressing mutex */ - struct mutex xpcs_mutex; + /* XPCS indirect addressing lock */ + spinlock_t xpcs_lock; /* RSS addressing mutex */ struct mutex rss_mutex; @@ -927,6 +927,7 @@ struct xgbe_prv_data { u32 serdes_dfe_tap_ena[XGBE_SPEEDS]; /* Auto-negotiation state machine support */ + unsigned int an_int; struct mutex an_mutex; enum xgbe_an an_result; enum xgbe_an an_state;