From patchwork Thu Jun 11 09:03:00 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Prabhakar Kushwaha X-Patchwork-Id: 483010 X-Patchwork-Delegate: yorksun@freescale.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 08C8014028E for ; Thu, 11 Jun 2015 19:05:06 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 3E1914B632; Thu, 11 Jun 2015 11:04:49 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id yuWbX88cCMHj; Thu, 11 Jun 2015 11:04:49 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 8E5E54B6CB; Thu, 11 Jun 2015 11:04:35 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 6C0E94B660 for ; Thu, 11 Jun 2015 11:04:31 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id qL-xHQl7CpQ9 for ; Thu, 11 Jun 2015 11:04:31 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from na01-by2-obe.outbound.protection.outlook.com (mail-by2on0124.outbound.protection.outlook.com [207.46.100.124]) by theia.denx.de (Postfix) with ESMTPS id CB0BA4B632 for ; Thu, 11 Jun 2015 11:04:20 +0200 (CEST) Received: from DM2PR03CA0035.namprd03.prod.outlook.com (10.141.96.34) by BY2PR03MB458.namprd03.prod.outlook.com (10.141.141.144) with Microsoft SMTP Server (TLS) id 15.1.195.6; Thu, 11 Jun 2015 09:04:17 +0000 Received: from BY2FFO11FD033.protection.gbl (2a01:111:f400:7c0c::130) by DM2PR03CA0035.outlook.office365.com (2a01:111:e400:2428::34) with Microsoft SMTP Server (TLS) id 15.1.190.14 via Frontend Transport; Thu, 11 Jun 2015 09:04:17 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BY2FFO11FD033.mail.protection.outlook.com (10.1.14.218) with Microsoft SMTP Server (TLS) id 15.1.190.9 via Frontend Transport; Thu, 11 Jun 2015 09:04:16 +0000 Received: from b32579-VirtualBox.ap.freescale.net ([10.232.28.97]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id t5B93COi001675; Thu, 11 Jun 2015 02:04:12 -0700 From: Prabhakar Kushwaha To: Date: Thu, 11 Jun 2015 14:33:00 +0530 Message-ID: <1434013388-26605-6-git-send-email-prabhakar@freescale.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1434013388-26605-1-git-send-email-prabhakar@freescale.com> References: <1434013388-26605-1-git-send-email-prabhakar@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD033; 1:ES+RfhjptwXheEGSZxksETPuhi90E6jhp4wVP1PDZht9ahGdRblL1acMz2pp9RBYrzFqFaj5bSsTID89yL7CN+VQK1WjgzwOacHyRR4Ix0/Sains6nxls+vXLgkP3JIo+X/uUclsBpm0DS199xq9i8kGGf8Vxh+aiq2N0GvukeMFTzn00FqY8ultiQoe6lNDF6Yrm7YmcJSRoW8r8wLiN1FBF07VC0cKkCJ47rrmb/Jjvgv582ICylrVJMLFFPyvBQOxUncck7keK0J5//lKtPfH6fLtD60JwI9X0jN9KY2a6TxAJ3cJB5R/K9XzolhsqXYAfrPDS57NqH3Os8ozNrRzZbtGPQI05feWXN93SME= X-Forefront-Antispam-Report: CIP:192.88.168.50; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(339900001)(199003)(189002)(46102003)(48376002)(50466002)(106466001)(2351001)(229853001)(50226001)(105606002)(36756003)(50986999)(76176999)(62966003)(77156002)(6806004)(77096005)(87936001)(450100001)(189998001)(5001960100002)(107886002)(5001920100001)(47776003)(110136002)(2950100001)(104016003)(33646002)(92566002)(19580395003)(19580405001)(86362001)(85426001)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:BY2PR03MB458; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; MLV:sfv; A:1; MX:1; LANG:; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB458; 2:0R/ylAoooyWg6sgrlhgineRR2wkdKtadaY2cf0V1w/TpiVh8FUM1NzBrgFMyfTuO; 3:2mDX3yVjYKfDFsnN9X6NXrF/YH9vwQgmv4bSkcnefpvDcCre24gVdtm2N4qICXzFB7EYNayUkLWsmRUbOX2KgPXdVLg3WD/sBrDkXqfP0VxwLAi6C/ysUSxWdmfXv1jCXZlZHX+66+1sswytZLnSbrLdcxarDxh4MZPJ3cXflUDMg9GabXijy19a2Bq55tGUPQS3/hz//ldSNVwBucFPaxPskRAVEVd/mNqT4t7GiIo=; 20:edZHfSjvTSs1cByCzDFTFxGTKPPVlQUEbOUd6TTaHmNOpOSmha+RfVtV5AiJKyfMwhUo4cAwSFfnA7CfD/KS63qOMSYb/GLybfdNUo4P58bryi1TuYPQ8Dj7guaPQZYEmGuaWswnR93MHsZXHjdkokwxgUch5f3aevn3Ga06nIlWjrNc7cWXfCwUoyovxgSXuToJGSq+YWcY1xeKzLzo2/8lgT3nAQFNEKRIKLZXcOIJhUnBuW6utsFZSuNqV0HjpzB1cYC4GRiRe8PDKirtz5W2fBQw/HA6GJ0az3xa4ebgtpw+u88IhaVyGII9/vH3ch3l+hvufVPMX1x6BtsL3teT1lLrwfwc5wwIzK+kbmY=; 4:48EqKU13wN/2AOqvdaitMSX4yTtDXxZXknZpsB3aem1wbldTXaZc3Zbz4OdvFF7G98Dy2aMWPGpz1VCW8VRZGo/IXsSdVexhVCISHo+ig04mcwW7PeKcZ5GzTWdrdRFFPZ0L8OFNraIlh4Xlui8dLVvkQXWdCpc0Ufjc+DrhsQX1VFoUAc8cTQ9mhFPBqBvoBapLaoBSFIcTozkLIDJIp5hMRH7faDrYIqoRKlYF8r7KPEdhaVXwKlHu1waPHyy3usHSlslKH/+gcsKbepNGYmSu/NYABRFXl35HBCssE84= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR03MB458; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5005006)(3002001); SRVR:BY2PR03MB458; BCL:0; PCL:0; RULEID:; SRVR:BY2PR03MB458; X-Forefront-PRVS: 0604AFA86B X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR03MB458; 23:PNJr4LMJ0/PpMpkE+W4IgLfTkwfkbMm6NyF/sWud9L?= =?us-ascii?Q?Mevxjs9LixJmZHAqfP7vGreyANG2Az4s5agpCnXg/V87cwZAqt4YV61B/gGX?= =?us-ascii?Q?u0oDyxPBBDMFB1+I8WapoaPlLaa3YtFZNNXAP854d2gjt7sSTJ3fROaS8hPb?= =?us-ascii?Q?9UD0nhibqPTrqaAh0rA449KYohxasfuOnmqOJgmZUQLGM4uNf5GqtWe4QReZ?= =?us-ascii?Q?Nqie0mI4gzZ4rS1yDFxl7BBuOzwvQXgljw3d/JIyMVUe/0PsxE/9GRf7Wbiz?= =?us-ascii?Q?QAtUz+mNItK33wv9Q978+5Uouga8E0i0rTSqoRvxk+bESEjzqJa0OfhDJ9o1?= =?us-ascii?Q?USB5GZlUEVYVQeSoNWfYFHQbIMBQIf0dY6jRxK32HsNJ2JbNvNPYtGhF9zjG?= =?us-ascii?Q?4oeXhZLptJMKTubUPs+AHHYsHls4hQAZBjkCM2EkewsSYv8hoD6FlmKYF1Nv?= =?us-ascii?Q?zewDkxbLDNCG+EJX7GwXIMgRsI2RCaJZQQhrLwr+DLNiouJ0ANUhewk7zK9i?= =?us-ascii?Q?AT643pyV0u1jmr2lOu+/QYpgBUCzX9a+wGY+JbzXNO0Q2soIyvgqFW9c8AxO?= =?us-ascii?Q?k5svSo6pMlKmwskshlntXOrSti6UyiayC0ElnHD4VGWJDXyPHbtfUwA1WuEW?= =?us-ascii?Q?OORIL8rJATpJqkdn77ggdzi+KUzN+vbN7g0rga/oL1OyBdD3LtdOFjVY4bXA?= =?us-ascii?Q?IA3laM4hGGXVYqo3/ZfKCbyaBUEp5veyERQh0OThqOJB93K14/+WWJSjpxt+?= =?us-ascii?Q?2Ozg/mmN7SbP36KfIJHNzYo4zOGKcq1zyqlQXfAyUXYgEulciNHNlEAItDeA?= =?us-ascii?Q?1/gqkaDI5zY2NEmi1vKFBjuu4Ea8d8lbxojDvLDAiBL5n7EHXh6xrz1rrT99?= =?us-ascii?Q?Fkd3f4JHBMYheX7wWcKaWfKUJk4rWj6NLpy7U0m62GXcLkEXzDzVIUdWoNWG?= =?us-ascii?Q?yuYCc0HAA+piDfuiHlIc/ohyFGgVnsfVKx6RG2+A=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB458; 5:DgZ79QOBjlj+VEGHqlCvizKPFZMAvPK+u06KxplN4rwdqSD1ehqOYPaMQPpu4NxYljyfY3FiLrIFsu1d2xS7p3fZ33r/AUTvcFv5GbWO6sJj6to7/eNL3LcpsFwEOH0y+vV3rhi18i8rVPEsc6IHRw==; 24:KzbEZOj4hFgJwSWz+GBroikl38+jd99nsOndIrFQFWEjI3JP05wbW1gd5m14JlpJr/xbP/zr4qabtocqgS4CBeXUUo8UuryhAQ1B7veAt7w=; 20:felTXQ5dbBZyv7+gZaHia5toYGyeiSV6a0V+LoXigfbqjuQRK0MB14F41a8KQvY6izTjQYShhovINaQT3hSOww== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jun 2015 09:04:16.5455 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR03MB458 Cc: Geoff Thorpe , Roy Pledge , yorksun@freescale.com Subject: [U-Boot] [PATCH 06/14][v2] drivers: fsl-mc: Update qbman driver X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Update qbman driver - As per latest available qbman driver - Use of atomic APIs Signed-off-by: Prabhakar Kushwaha CC: Geoff Thorpe CC: Haiying Wang CC: Roy Pledge --- Changes for v2: Sending as it is for patchset drivers/net/fsl-mc/dpio/qbman_portal.c | 66 ++++++++++++++++++--------------- drivers/net/fsl-mc/dpio/qbman_portal.h | 22 ++++++++--- drivers/net/fsl-mc/dpio/qbman_private.h | 2 +- 3 files changed, 53 insertions(+), 37 deletions(-) diff --git a/drivers/net/fsl-mc/dpio/qbman_portal.c b/drivers/net/fsl-mc/dpio/qbman_portal.c index dd2a7de..5fa8d95 100644 --- a/drivers/net/fsl-mc/dpio/qbman_portal.c +++ b/drivers/net/fsl-mc/dpio/qbman_portal.c @@ -64,7 +64,7 @@ enum qbman_sdqcr_fc { struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *d) { int ret; - struct qbman_swp *p = kmalloc(sizeof(*p), GFP_KERNEL); + struct qbman_swp *p = malloc(sizeof(struct qbman_swp)); if (!p) return NULL; @@ -77,7 +77,7 @@ struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *d) qb_attr_code_encode(&code_sdqcr_dct, &p->sdq, qbman_sdqcr_dct_prio_ics); qb_attr_code_encode(&code_sdqcr_fc, &p->sdq, qbman_sdqcr_fc_up_to_3); qb_attr_code_encode(&code_sdqcr_tok, &p->sdq, 0xbb); - p->vdq.busy = 0; /* TODO: convert to atomic_t */ + atomic_set(&p->vdq.busy, 1); p->vdq.valid_bit = QB_VALID_BIT; p->dqrr.next_idx = 0; p->dqrr.valid_bit = QB_VALID_BIT; @@ -165,7 +165,6 @@ static struct qb_attr_code code_eq_qd_bin = QB_CODE(4, 0, 16); static struct qb_attr_code code_eq_qd_pri = QB_CODE(4, 16, 4); static struct qb_attr_code code_eq_rsp_stash = QB_CODE(5, 16, 1); static struct qb_attr_code code_eq_rsp_lo = QB_CODE(6, 0, 32); -static struct qb_attr_code code_eq_rsp_hi = QB_CODE(7, 0, 32); enum qbman_eq_cmd_e { /* No enqueue, primarily for plugging ORP gaps for dropped frames */ @@ -197,8 +196,7 @@ void qbman_eq_desc_set_response(struct qbman_eq_desc *d, { uint32_t *cl = qb_cl(d); - qb_attr_code_encode(&code_eq_rsp_lo, cl, lower32(storage_phys)); - qb_attr_code_encode(&code_eq_rsp_hi, cl, upper32(storage_phys)); + qb_attr_code_encode_64(&code_eq_rsp_lo, (uint64_t *)cl, storage_phys); qb_attr_code_encode(&code_eq_rsp_stash, cl, !!stash); } @@ -253,7 +251,6 @@ static struct qb_attr_code code_pull_numframes = QB_CODE(0, 8, 4); static struct qb_attr_code code_pull_token = QB_CODE(0, 16, 8); static struct qb_attr_code code_pull_dqsource = QB_CODE(1, 0, 24); static struct qb_attr_code code_pull_rsp_lo = QB_CODE(2, 0, 32); -static struct qb_attr_code code_pull_rsp_hi = QB_CODE(3, 0, 32); enum qb_pull_dt_e { qb_pull_dt_channel, @@ -282,8 +279,7 @@ void qbman_pull_desc_set_storage(struct qbman_pull_desc *d, } qb_attr_code_encode(&code_pull_rls, cl, 1); qb_attr_code_encode(&code_pull_stash, cl, !!stash); - qb_attr_code_encode(&code_pull_rsp_lo, cl, lower32(storage_phys)); - qb_attr_code_encode(&code_pull_rsp_hi, cl, upper32(storage_phys)); + qb_attr_code_encode_64(&code_pull_rsp_lo, (uint64_t *)cl, storage_phys); } void qbman_pull_desc_set_numframes(struct qbman_pull_desc *d, uint8_t numframes) @@ -316,10 +312,10 @@ int qbman_swp_pull(struct qbman_swp *s, struct qbman_pull_desc *d) uint32_t *p; uint32_t *cl = qb_cl(d); - /* TODO: convert to atomic_t */ - if (s->vdq.busy) + if (!atomic_dec_and_test(&s->vdq.busy)) { + atomic_inc(&s->vdq.busy); return -EBUSY; - s->vdq.busy = 1; + } s->vdq.storage = *(void **)&cl[4]; s->vdq.token = qb_attr_code_decode(&code_pull_token, cl); p = qbman_cena_write_start(&s->sys, QBMAN_CENA_SWP_VDQCR); @@ -359,36 +355,44 @@ const struct ldpaa_dq *qbman_swp_dqrr_next(struct qbman_swp *s) { uint32_t verb; uint32_t response_verb; - const struct ldpaa_dq *dq = qbman_cena_read(&s->sys, - QBMAN_CENA_SWP_DQRR(s->dqrr.next_idx)); - const uint32_t *p = qb_cl(dq); + uint32_t flags; + const struct ldpaa_dq *dq; + const uint32_t *p; + dq = qbman_cena_read(&s->sys, QBMAN_CENA_SWP_DQRR(s->dqrr.next_idx)); + p = qb_cl(dq); verb = qb_attr_code_decode(&code_dqrr_verb, p); - /* If the valid-bit isn't of the expected polarity, nothing there */ + + /* If the valid-bit isn't of the expected polarity, nothing there. Note, + * in the DQRR reset bug workaround, we shouldn't need to skip these + * check, because we've already determined that a new entry is available + * and we've invalidated the cacheline before reading it, so the + * valid-bit behaviour is repaired and should tell us what we already + * knew from reading PI. + */ if ((verb & QB_VALID_BIT) != s->dqrr.valid_bit) { qbman_cena_invalidate_prefetch(&s->sys, - QBMAN_CENA_SWP_DQRR( - s->dqrr.next_idx)); + QBMAN_CENA_SWP_DQRR(s->dqrr.next_idx)); return NULL; } /* There's something there. Move "next_idx" attention to the next ring * entry (and prefetch it) before returning what we found. */ s->dqrr.next_idx++; - s->dqrr.next_idx &= 3; /* Wrap around at 4 */ + s->dqrr.next_idx &= QBMAN_DQRR_SIZE - 1; /* Wrap around at 4 */ /* TODO: it's possible to do all this without conditionals, optimise it * later. */ if (!s->dqrr.next_idx) s->dqrr.valid_bit ^= QB_VALID_BIT; - /* VDQCR "no longer busy" hook - if VDQCR shows "busy" and this is a - * VDQCR result, mark it as non-busy. */ - if (s->vdq.busy) { - uint32_t flags = ldpaa_dq_flags(dq); - - response_verb = qb_attr_code_decode(&code_dqrr_response, &verb); - if ((response_verb == QBMAN_DQRR_RESPONSE_DQ) && - (flags & LDPAA_DQ_STAT_VOLATILE)) - s->vdq.busy = 0; - } + + /* If this is the final response to a volatile dequeue command + indicate that the vdq is no longer busy */ + flags = ldpaa_dq_flags(dq); + response_verb = qb_attr_code_decode(&code_dqrr_response, &verb); + if ((response_verb == QBMAN_DQRR_RESPONSE_DQ) && + (flags & LDPAA_DQ_STAT_VOLATILE) && + (flags & LDPAA_DQ_STAT_EXPIRED)) + atomic_inc(&s->vdq.busy); + qbman_cena_invalidate_prefetch(&s->sys, QBMAN_CENA_SWP_DQRR(s->dqrr.next_idx)); return dq; @@ -448,8 +452,10 @@ int qbman_dq_entry_has_newtoken(struct qbman_swp *s, * reset "busy". We instead base the decision on whether the current * result is sitting at the first 'storage' location of the busy * command. */ - if (s->vdq.busy && (s->vdq.storage == dq)) - s->vdq.busy = 0; + if (s->vdq.storage == dq) { + s->vdq.storage = NULL; + atomic_inc(&s->vdq.busy); + } return 1; } diff --git a/drivers/net/fsl-mc/dpio/qbman_portal.h b/drivers/net/fsl-mc/dpio/qbman_portal.h index bb67c3b..86e2c3a 100644 --- a/drivers/net/fsl-mc/dpio/qbman_portal.h +++ b/drivers/net/fsl-mc/dpio/qbman_portal.h @@ -14,6 +14,10 @@ /* Management command result codes */ #define QBMAN_MC_RSLT_OK 0xf0 +/* TBD: as of QBMan 4.1, DQRR will be 8 rather than 4! */ +#define QBMAN_DQRR_SIZE 4 + + /* --------------------- */ /* portal data structure */ /* --------------------- */ @@ -48,14 +52,13 @@ struct qbman_swp { * to whether or not a command can be submitted, not whether or * not a previously-submitted command is still executing. In * other words, once proof is seen that the previously-submitted - * command is executing, "vdq" is no longer "busy". TODO: - * convert this to "atomic_t" so that it is thread-safe (without - * locking). */ - int busy; + * command is executing, "vdq" is no longer "busy". + */ + atomic_t busy; uint32_t valid_bit; /* 0x00 or 0x80 */ /* We need to determine when vdq is no longer busy. This depends * on whether the "busy" (last-submitted) dequeue command is - * targetting DQRR or main-memory, and detected is based on the + * targeting DQRR or main-memory, and detected is based on the * presence of the dequeue command's "token" showing up in * dequeue entries in DQRR or main-memory (respectively). Debug * builds will, when submitting vdq commands, verify that the @@ -127,6 +130,7 @@ static inline uint32_t qb_attr_code_decode(const struct qb_attr_code *code, return d32_uint32_t(code->lsoffset, code->width, cacheline[code->word]); } + /* encode a field to a cacheline */ static inline void qb_attr_code_encode(const struct qb_attr_code *code, uint32_t *cacheline, uint32_t val) @@ -136,6 +140,12 @@ static inline void qb_attr_code_encode(const struct qb_attr_code *code, | e32_uint32_t(code->lsoffset, code->width, val); } +static inline void qb_attr_code_encode_64(const struct qb_attr_code *code, + uint64_t *cacheline, uint64_t val) +{ + cacheline[code->word / 2] = val; +} + /* ---------------------- */ /* Descriptors/cachelines */ /* ---------------------- */ @@ -144,7 +154,7 @@ static inline void qb_attr_code_encode(const struct qb_attr_code *code, * a "descriptor" type that the caller can instantiate however they like. * Ultimately though, it is just a cacheline of binary storage (or something * smaller when it is known that the descriptor doesn't need all 64 bytes) for - * holding pre-formatted pieces of harware commands. The performance-critical + * holding pre-formatted pieces of hardware commands. The performance-critical * code can then copy these descriptors directly into hardware command * registers more efficiently than trying to construct/format commands * on-the-fly. The API user sees the descriptor as an array of 32-bit words in diff --git a/drivers/net/fsl-mc/dpio/qbman_private.h b/drivers/net/fsl-mc/dpio/qbman_private.h index 2d2556b..f1f16b8 100644 --- a/drivers/net/fsl-mc/dpio/qbman_private.h +++ b/drivers/net/fsl-mc/dpio/qbman_private.h @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include