From patchwork Tue Nov 28 12:53:15 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Hennerich, Michael" X-Patchwork-Id: 10080227 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E9CDD60353 for ; Tue, 28 Nov 2017 12:50:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 20D5A29201 for ; Tue, 28 Nov 2017 12:50:52 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 15A9329262; Tue, 28 Nov 2017 12:50:52 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 594EA29261 for ; Tue, 28 Nov 2017 12:50:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751239AbdK1Muu (ORCPT ); Tue, 28 Nov 2017 07:50:50 -0500 Received: from mail-by2nam03on0076.outbound.protection.outlook.com ([104.47.42.76]:39484 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750829AbdK1Mut (ORCPT ); Tue, 28 Nov 2017 07:50:49 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.onmicrosoft.com; s=selector1-analog-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=gLyefD0YPXHEJmdb4ffd481XFZzp0N6iGNwm2S2JA7o=; b=CEgLT4+Gx4w7d6mwiUvnrTznIsx2ZieHZC5Pl2pQHeiyRhiDZeuXmYitpePVGc2L6M/lzBMB7hq85/xfXe65tVkuehU717GdEilVMRQN9fI86wEVVRSLgR2nCEUT2P/U+AAKPpeiwLcIQfwYPG4kkrbqMIExRj3+31/M3oCFfzA= Received: from BN6PR03CA0003.namprd03.prod.outlook.com (10.168.230.141) by BY2PR0301MB2056.namprd03.prod.outlook.com (10.163.196.158) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.260.4; Tue, 28 Nov 2017 12:50:47 +0000 Received: from BY2FFO11OLC004.protection.gbl (2a01:111:f400:7c0c::118) by BN6PR03CA0003.outlook.office365.com (2603:10b6:404:23::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.282.5 via Frontend Transport; Tue, 28 Nov 2017 12:50:46 +0000 Authentication-Results: spf=pass (sender IP is 137.71.25.55) smtp.mailfrom=analog.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=bestguesspass action=none header.from=analog.com; Received-SPF: Pass (protection.outlook.com: domain of analog.com designates 137.71.25.55 as permitted sender) receiver=protection.outlook.com; client-ip=137.71.25.55; helo=nwd2mta1.analog.com; Received: from nwd2mta1.analog.com (137.71.25.55) by BY2FFO11OLC004.mail.protection.outlook.com (10.1.15.184) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.218.12 via Frontend Transport; Tue, 28 Nov 2017 12:50:39 +0000 Received: from NWD2HUBCAS9.ad.analog.com (nwd2hubcas9.ad.analog.com [10.64.69.109]) by nwd2mta1.analog.com (8.13.8/8.13.8) with ESMTP id vASCoc9Q013494 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=FAIL); Tue, 28 Nov 2017 04:50:38 -0800 Received: from zeus.spd.analog.com (10.64.82.11) by NWD2HUBCAS9.ad.analog.com (10.64.69.109) with Microsoft SMTP Server id 14.3.210.2; Tue, 28 Nov 2017 07:50:38 -0500 Received: from mhenneri-D04.ad.analog.com ([10.44.3.40]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id vASCoXvB011793; Tue, 28 Nov 2017 07:50:37 -0500 From: To: , CC: , Michael Hennerich Subject: [PATCH 5/5] net: ieee802154: adf7242: Rework IRQ and packet handling Date: Tue, 28 Nov 2017 13:53:15 +0100 Message-ID: <1511873595-29238-5-git-send-email-michael.hennerich@analog.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1511873595-29238-1-git-send-email-michael.hennerich@analog.com> References: <1511873595-29238-1-git-send-email-michael.hennerich@analog.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:137.71.25.55; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(39860400002)(346002)(376002)(2980300002)(438002)(189002)(199003)(76176999)(51416003)(86152003)(50986999)(50466002)(189998001)(47776003)(2906002)(106466001)(77096006)(33646002)(6666003)(48376002)(5660300001)(2950100002)(110136005)(50226002)(39060400002)(316002)(72206003)(478600001)(8936002)(305945005)(54906003)(106002)(246002)(356003)(2876002)(7636002)(107886003)(8676002)(4326008)(86362001)(36756003)(16586007)(7696005); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR0301MB2056; H:nwd2mta1.analog.com; FPR:; SPF:Pass; PTR:nwd2mail10.analog.com; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11OLC004; 1:V0QGYc3cd9oz9A6pJJXc/L8SQf/arT9dAOfeaMGSQX8TLU5Z8dozn9OP3L8WKmPC/6MTGxZ2vZw6oqwn3JbDZz1pEKGupEMRD01pCOv5smcwSKNoXvKCMuEC8hK25lzX X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d90b7173-5dc5-4881-b98e-08d5365ea0f4 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(4608076)(2017052603199); SRVR:BY2PR0301MB2056; X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB2056; 3:JB/XfKeVH1evT5UY5PQCyEYXvz5iuQMO2+ajI8ZBd3HGYSvv/YB7qEwRZihR+YGie8V6ov0om/yqsx/cg545dqfPjT45I7e9z+K7dmsgFoZYYIKysZ69WO1I91wBgfSkm3GwE36MF5mC2dLMwqbSNakJ1GVDpyF73MK3ldY0+fQ1DjrXJ006I3bbB2QZBPwNFTOK1l7uDwrNuZcCRmhIHWwsrNHvC5cyVZ4MY4jTIBrho4rZt+OmO8ToeMy8Lsj4TZlT96SPMewpk3cvzJ5KVMaKbBwEeEiRbItBq46hnSIre5poCr9b4L5hw4P8rTu67eM5HnMddM5slpoY4c6Mgg==; 25:MOmfYRhpHItTe/W6tAEHYkqAybFSWaPsKJ8wXZF2f5JtTmTgyNbNArapQWBTMJSOLsxymSEkKvHhfKfKaTk2WOd/5LBxyMcD/UBAaWORpYggCvOJRTaOcR+jwEDKAb82j17QC5htLiB2ctXYlZ2GYoFmABfX5Ryf18sIXTCo5M36bcIkS7I7+IJ766boYgcoVct3XcnBwTO5M52wx1PFfveE0/FTcvx5BflGGU3rqbL7ws8lNl2kyxaqG6UftV8u4742zZP+jvc27Vki69Pa0tD49kSlWqf0AFNCPi8Y7CwmDMVzPV4Vr6i+y1trt/2e504xdPuRjBjBOp1+7Xu1Z3NzxFSH7MutF7+hkV1GlYU= X-MS-TrafficTypeDiagnostic: BY2PR0301MB2056: X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB2056; 31:IgblBZKAj0NhYf7lVFGy2R1nGBwVl2+OzQaJDpSRwPmxBqqsWQckREw28D5C6bvN+I1iX85boA+Dv4vBaHLo/VDGfOJmGGhykR7xp4jG2ypbLofvGwk/DrIChM4BqL3FKqdGicKqGp0K5E6UmsVAn9RuSK0Z3++GZ2GgPHIve3YP852GoV4/TqZJwweKmPi4g8u/adE0yGUa8qpWvrfLYXbkVgfGBznKYjwTOA/vBfg=; 20:0o1Nz4jzG5RQ8qRGdrDu0ezU5ziu9sNcY5W4oy3BkJeJkDvLwpksE8fYOHy/P7HXdvoEnGU3kTNh/9+nuxmifO85cdBsW65u9dxIUkJdJQeLVT6LdDHyhU9jYXFzaCEI/A/znSbmU0imdRiyr6eTtFGhgQbDatlfxjS4uQ5Gbz400SSb1B9lbgXicBZDuyGtIoN6YpLR4rn72dV22ogcqOwiXGMNvgNsPawR6R8eJtNB9XxQJ5eC8b/vGArevKqFXUyNfC1/9UTTy8wT/dQoBz7D8o/Dv3wL0gUaLFyU4NF5E0OksN8ajdZgFlQVcLYde8o2KrsREGW/4Va8aFjFIQt1839nbn4BIG4UY/Ag+jrNDHXx0tMYCe3gNjMeTvRs5uLaCSJKFQ96YWEhvn2V98/UZZnlcBl3it74KURtH/+cuX2SXEdk+xhq/MNKyQSqqDBBngfu0apy2X/XPthEOpUM+AVh0leB9nipBZusR7/afYTHsQ+7cEVmNK5ZLpAX X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(232431446821674); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(2401047)(8121501046)(5005006)(10201501046)(3231022)(3002001)(93006095)(93004095)(6055026)(6041248)(20161123558100)(20161123562025)(20161123560025)(20161123555025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:BY2PR0301MB2056; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:BY2PR0301MB2056; X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB2056; 4:L70f5LFzLGloGOnFCnta4WuR+nY67Cywa9PGsfmLsMcnj5gi5ZqhzBuOkKMJTmCOkks7ubqAJ4KtRZAljmkPgfPcwLc9fX82w+NhjcG5dtzy+GKVFmNEIEtGsgVH3cAAHC86tqBBYbEi4b6L2215PYW3ohhj228heFuBRthoC3Xx5AQ6IIdHeVNDcbJJGF8Mjb3YKHACNjsxa7Z5I0f8i7PKVSkkh1Bjrgju8wu5kFVvAhPnPsIEn7SxwWmhh16U/vqn7WL4BnaT9+E4fZRKyk9Lvs1InUmejuwU4z4NwKNBFN0bDJXNMrKoOQci/nyq X-Forefront-PRVS: 0505147DDB X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR0301MB2056; 23:W2wJ9qE2Y+ZG6VLv5s9DZU/G3yI3l9F5U2scMHV?= =?us-ascii?Q?mgifL2uHc5V9Blkx4849TS+JZUgdd6gi1IBKj47v6hI+9mvwMyJV/IDzDwWY?= =?us-ascii?Q?XBQIWPVx62RhVBMwvOXeak5S4L0+sqC7y6ZNoD1M5s+TuF9T9Sw2g9ULk7E1?= =?us-ascii?Q?57oFE6lAX6hJw/anxdhzCIYYPSLXIOgfembyAke/ZL6qi36w1FzQPxoxX7Zn?= =?us-ascii?Q?n8vHorWbLz0Oz5JtsIjJiaqKD0B2T7NOlju3dEq+sYWtc0093k0cQQepuSai?= =?us-ascii?Q?zr3EHvwjfagX/EDeXrKE5hlRePwNZZyUoD8/tcXG9o/yCDxA/s2M80pWX9JZ?= =?us-ascii?Q?M9r5H3gGYFfd40WImhXZ+1k3V3f6nYnsXloHjxNeDuDgZ56n738HBYOx93uj?= =?us-ascii?Q?cd08AGpMjV+sj6HstPH1MExIlMXP8H5srVwb0KqrqMPZ/N5fhpFzctFSVmgu?= =?us-ascii?Q?Na1oRz/OpcA+tWXv9Pseb2peh8vDMtk2I0uabu5bJY8A3h74cOp1NShchOWi?= =?us-ascii?Q?+wJSyH1IfUGaHjsnZtSViecRwFOiA3WcdJGM1Iuw2leCnJ1kiV9CUEvsrc+a?= =?us-ascii?Q?5CddliWx+kVhkE995+39oMtbmmz0UU3SYistmz0cJdUa52EDMKhWzCsxiIhU?= =?us-ascii?Q?2TjVbpvIkc/LSX+wYjP7vFlpSyOIDyNk3IYhIPK/916tkE4+GCj1Uq8KCc+d?= =?us-ascii?Q?NRfR+t8R8M8C7s9mK/ondIGijM4pprxbwbA41NwWXOIklWos51R/fQkI9bCl?= =?us-ascii?Q?sZoslr14+MIoG8vhAiyF6W1V7y9OYQe43Ylb4kqT78VlO6RzIaZl/FDpKoWp?= =?us-ascii?Q?jgpArXiOXxAwGqGvpPCcOjfjmjogSys5v9pCVWvHgAfQZeGrgmT8y8KF8f6l?= =?us-ascii?Q?BC5vOF2uD3WTynalbJ57pgafdIbIp8wTdPRwcFjwAM+cMLYh0iozl9qzSslx?= =?us-ascii?Q?EDoakCz/nUqNjkjFawGEnNboBMjDeR+e1fkTsQ9TJxyk/TgvC/rHzW/LPPWD?= =?us-ascii?Q?mLehThj2s17YsjEy2Gzc/8Va2SPQ9dLtpMZ1/MDMlj/Z8ww=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB2056; 6:uV0zQHamwK5VaAclr6GFTpTp2rgrL5QkBbldwgWYldGoenhqB0CJxS2bcL9mBn83PpHlaYpG99n3rcMOqjxH7W61xUNAhwVzvZIBg4aHBeARLoXHYdjp8o95F1FjAiGt4UR0CCRw97VZSb4p1rWPAHG4ryVugDPLmV3Xn8CBOUUnzjMVf3HP0Tla7AfPAxJ+GPvgV30juwOhcaRdk41IcYrXdLP+bQBzq+fUtUTzoPMOKaevMiL+FuNd0b1z73req2MmrqG7TC/0RdAo6ngIAAnGKwkKKfhsAuGeq1FhA7S8XO4C1+eHGX5424nV7CMrWrEuBcb2c5bRL5uEhM7T6lXKvpeOuVvo06PqxUFqv4Q=; 5:NdS8nyI/uW5SeIDEsskOdjM9BJ0Zp6WHKJ94xkv/bPUAm5j6baK12AhWdkmIx55pmz+rFIDKRotCxNuWEh1NWAosccjI25MGZErcmkhTmyzMfSfIkbJuctHyKF0DkCffeiaC/DGDsB3YJpOefWGyv9tavS+KGAKNmnh8cn9HHVE=; 24:MfwE9+QPl0iMU24aLCjtPz5o1d9AzQF8Z11IMWIHWVJl+mrgqpr9wDXRDnr3htTQVNZf1RVdHQo0ljCEX7O0YJqC/E4S883NQTVMHp+wqEU=; 7:GF19G45nx2kunlmZ+NWL0VRUmeFqT40lcbPk37oDGOIAoBxDQNNVELB7N1TPrX6QEAhmZBXjRmAG26BwsVWTyNQqHtXtNLaKhJEB/A2aZU3lxoeYxLiisN0iMAwYagu0mbf1bMnoHA9MfE+BrLyYpVsgGbZkK2wGlmXa+JnswtCUzqVFSJiBBArOveriwtipM4Xa47+3WolMbLkgCbVK8uhB3NDbIuVvWCvXzZ9GO/JPXzygLa6U3GSopTv4h4QO SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: analog.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Nov 2017 12:50:39.4423 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d90b7173-5dc5-4881-b98e-08d5365ea0f4 X-MS-Exchange-CrossTenant-Id: eaa689b4-8f87-40e0-9c6f-7228de4d754a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=eaa689b4-8f87-40e0-9c6f-7228de4d754a; Ip=[137.71.25.55]; Helo=[nwd2mta1.analog.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR0301MB2056 Sender: linux-wpan-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wpan@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Michael Hennerich * Stop unconditionally polling for RC_STATUS_PHY_RDY at the entry of the threaded IRQ handler. Once IRQ_RX_PKT_RCVD is received we can read immediately the packet from the buffer. However we still need to wait afterwards for RC_STATUS_PHY_RDY, to make sure that the ACK (in case requested) was processed and send out by the Radio Controller, before we issue the next CMD_RC_RX. This significantly reduces the overall time spend in the threaded IRQ handler. * Avoid raise condition between xmit and coincident packet reception, by disabling the IRQ and clearing the IRQ status upon xmit entry. * Introduce helper functions adf7242_clear_irqstat() and adf7242_cmd_rx() Signed-off-by: Michael Hennerich --- drivers/net/ieee802154/adf7242.c | 54 +++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/drivers/net/ieee802154/adf7242.c b/drivers/net/ieee802154/adf7242.c index 548bec1..64f1b1e 100644 --- a/drivers/net/ieee802154/adf7242.c +++ b/drivers/net/ieee802154/adf7242.c @@ -563,6 +563,22 @@ static int adf7242_verify_firmware(struct adf7242_local *lp, return 0; } +static void adf7242_clear_irqstat(struct adf7242_local *lp) +{ + adf7242_write_reg(lp, REG_IRQ1_SRC1, IRQ_CCA_COMPLETE | IRQ_SFD_RX | + IRQ_SFD_TX | IRQ_RX_PKT_RCVD | IRQ_TX_PKT_SENT | + IRQ_FRAME_VALID | IRQ_ADDRESS_VALID | IRQ_CSMA_CA); +} + +static int adf7242_cmd_rx(struct adf7242_local *lp) +{ + /* Wait until the ACK is sent */ + adf7242_wait_status(lp, RC_STATUS_PHY_RDY, RC_STATUS_MASK, __LINE__); + adf7242_clear_irqstat(lp); + + return adf7242_cmd(lp, CMD_RC_RX); +} + static int adf7242_set_txpower(struct ieee802154_hw *hw, int mbm) { struct adf7242_local *lp = hw->priv; @@ -666,7 +682,7 @@ static int adf7242_start(struct ieee802154_hw *hw) struct adf7242_local *lp = hw->priv; adf7242_cmd(lp, CMD_RC_PHY_RDY); - adf7242_write_reg(lp, REG_IRQ1_SRC1, 0xFF); + adf7242_clear_irqstat(lp); enable_irq(lp->spi->irq); set_bit(FLAG_START, &lp->flags); @@ -677,10 +693,10 @@ static void adf7242_stop(struct ieee802154_hw *hw) { struct adf7242_local *lp = hw->priv; + disable_irq(lp->spi->irq); adf7242_cmd(lp, CMD_RC_IDLE); clear_bit(FLAG_START, &lp->flags); - disable_irq(lp->spi->irq); - adf7242_write_reg(lp, REG_IRQ1_SRC1, 0xFF); + adf7242_clear_irqstat(lp); } static int adf7242_channel(struct ieee802154_hw *hw, u8 page, u8 channel) @@ -795,9 +811,12 @@ static int adf7242_xmit(struct ieee802154_hw *hw, struct sk_buff *skb) struct adf7242_local *lp = hw->priv; int ret; + /* ensure existing instances of the IRQ handler have completed */ + disable_irq(lp->spi->irq); set_bit(FLAG_XMIT, &lp->flags); reinit_completion(&lp->tx_complete); adf7242_cmd(lp, CMD_RC_PHY_RDY); + adf7242_clear_irqstat(lp); ret = adf7242_write_fbuf(lp, skb->data, skb->len); if (ret) @@ -806,6 +825,7 @@ static int adf7242_xmit(struct ieee802154_hw *hw, struct sk_buff *skb) ret = adf7242_cmd(lp, CMD_RC_CSMACA); if (ret) goto err; + enable_irq(lp->spi->irq); ret = wait_for_completion_interruptible_timeout(&lp->tx_complete, HZ / 10); @@ -828,7 +848,7 @@ static int adf7242_xmit(struct ieee802154_hw *hw, struct sk_buff *skb) err: clear_bit(FLAG_XMIT, &lp->flags); - adf7242_cmd(lp, CMD_RC_RX); + adf7242_cmd_rx(lp); return ret; } @@ -852,7 +872,7 @@ static int adf7242_rx(struct adf7242_local *lp) skb = dev_alloc_skb(len); if (!skb) { - adf7242_cmd(lp, CMD_RC_RX); + adf7242_cmd_rx(lp); return -ENOMEM; } @@ -860,14 +880,14 @@ static int adf7242_rx(struct adf7242_local *lp) ret = adf7242_read_fbuf(lp, data, len, true); if (ret < 0) { kfree_skb(skb); - adf7242_cmd(lp, CMD_RC_RX); + adf7242_cmd_rx(lp); return ret; } lqi = data[len - 2]; lp->rssi = data[len - 1]; - adf7242_cmd(lp, CMD_RC_RX); + ret = adf7242_cmd_rx(lp); skb_trim(skb, len - 2); /* Don't put RSSI/LQI or CRC into the frame */ @@ -876,7 +896,7 @@ static int adf7242_rx(struct adf7242_local *lp) dev_dbg(&lp->spi->dev, "%s: ret=%d len=%d lqi=%d rssi=%d\n", __func__, ret, (int)len, (int)lqi, lp->rssi); - return 0; + return ret; } static const struct ieee802154_ops adf7242_ops = { @@ -932,10 +952,7 @@ static irqreturn_t adf7242_isr(int irq, void *data) unsigned int xmit; u8 irq1; - adf7242_wait_status(lp, RC_STATUS_PHY_RDY, RC_STATUS_MASK, __LINE__); - adf7242_read_reg(lp, REG_IRQ1_SRC1, &irq1); - adf7242_write_reg(lp, REG_IRQ1_SRC1, irq1); if (!(irq1 & (IRQ_RX_PKT_RCVD | IRQ_CSMA_CA))) dev_err(&lp->spi->dev, "%s :ERROR IRQ1 = 0x%X\n", @@ -946,6 +963,9 @@ static irqreturn_t adf7242_isr(int irq, void *data) xmit = test_bit(FLAG_XMIT, &lp->flags); if (xmit && (irq1 & IRQ_CSMA_CA)) { + adf7242_wait_status(lp, RC_STATUS_PHY_RDY, + RC_STATUS_MASK, __LINE__); + if (ADF7242_REPORT_CSMA_CA_STAT) { u8 astat; @@ -966,6 +986,7 @@ static irqreturn_t adf7242_isr(int irq, void *data) lp->tx_stat = SUCCESS; } complete(&lp->tx_complete); + adf7242_clear_irqstat(lp); } else if (!xmit && (irq1 & IRQ_RX_PKT_RCVD) && (irq1 & IRQ_FRAME_VALID)) { adf7242_rx(lp); @@ -974,16 +995,19 @@ static irqreturn_t adf7242_isr(int irq, void *data) dev_dbg(&lp->spi->dev, "%s:%d : ERROR IRQ1 = 0x%X\n", __func__, __LINE__, irq1); adf7242_cmd(lp, CMD_RC_PHY_RDY); - adf7242_write_reg(lp, REG_IRQ1_SRC1, 0xFF); - adf7242_cmd(lp, CMD_RC_RX); + adf7242_cmd_rx(lp); } else { /* This can only be xmit without IRQ, likely a RX packet. * we get an TX IRQ shortly - do nothing or let the xmit * timeout handle this */ + dev_dbg(&lp->spi->dev, "%s:%d : ERROR IRQ1 = 0x%X, xmit %d\n", __func__, __LINE__, irq1, xmit); + adf7242_wait_status(lp, RC_STATUS_PHY_RDY, + RC_STATUS_MASK, __LINE__); complete(&lp->tx_complete); + adf7242_clear_irqstat(lp); } return IRQ_HANDLED; @@ -1003,7 +1027,7 @@ static int adf7242_soft_reset(struct adf7242_local *lp, int line) adf7242_set_promiscuous_mode(lp->hw, lp->promiscuous); adf7242_set_csma_params(lp->hw, lp->min_be, lp->max_be, lp->max_cca_retries); - adf7242_write_reg(lp, REG_IRQ1_SRC1, 0xFF); + adf7242_clear_irqstat(lp); if (test_bit(FLAG_START, &lp->flags)) { enable_irq(lp->spi->irq); @@ -1069,7 +1093,7 @@ static int adf7242_hw_init(struct adf7242_local *lp) adf7242_write_reg(lp, REG_IRQ1_EN0, 0); adf7242_write_reg(lp, REG_IRQ1_EN1, IRQ_RX_PKT_RCVD | IRQ_CSMA_CA); - adf7242_write_reg(lp, REG_IRQ1_SRC1, 0xFF); + adf7242_clear_irqstat(lp); adf7242_write_reg(lp, REG_IRQ1_SRC0, 0xFF); adf7242_cmd(lp, CMD_RC_IDLE);