From patchwork Fri Aug 18 08:56:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Madalin Bucur X-Patchwork-Id: 803106 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xYcYy4bgKz9sQl for ; Fri, 18 Aug 2017 19:03:18 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3xYcYy3d1QzDrWM for ; Fri, 18 Aug 2017 19:03:18 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0041.outbound.protection.outlook.com [104.47.41.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3xYcQH6xmfzDrLg for ; Fri, 18 Aug 2017 18:56:39 +1000 (AEST) Received: from MWHPR03CA0023.namprd03.prod.outlook.com (10.175.133.161) by CY1PR03MB2265.namprd03.prod.outlook.com (10.166.207.17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1341.21; Fri, 18 Aug 2017 08:56:37 +0000 Received: from BN1BFFO11FD005.protection.gbl (2a01:111:f400:7c10::1:182) by MWHPR03CA0023.outlook.office365.com (2603:10b6:300:117::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1341.21 via Frontend Transport; Fri, 18 Aug 2017 08:56:37 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.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 BN1BFFO11FD005.mail.protection.outlook.com (10.58.144.68) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1341.15 via Frontend Transport; Fri, 18 Aug 2017 08:56:37 +0000 Received: from fsr-fed2164-101.ea.freescale.net (fsr-fed2164-101.ea.freescale.net [10.171.73.197]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v7I8uSXX011416; Fri, 18 Aug 2017 01:56:35 -0700 From: Madalin Bucur To: , Subject: [PATCH 4/6] dpaa_eth: add NETIF_F_RXHASH Date: Fri, 18 Aug 2017 11:56:26 +0300 Message-ID: <1503046588-24349-5-git-send-email-madalin.bucur@nxp.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1503046588-24349-1-git-send-email-madalin.bucur@nxp.com> References: <1503046588-24349-1-git-send-email-madalin.bucur@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131475201973877942; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(336005)(39860400002)(39380400002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(77096006)(8936002)(8676002)(33646002)(48376002)(76176999)(50466002)(626005)(6666003)(50986999)(4326008)(104016004)(5003940100001)(106466001)(43066003)(105606002)(50226002)(81166006)(68736007)(81156014)(2906002)(97736004)(47776003)(189998001)(305945005)(86362001)(498600001)(5660300001)(356003)(53936002)(575784001)(36756003)(85426001)(2950100002)(54906002)(3450700001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR03MB2265; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD005; 1:LrvWRRcHL6407UaBBvELwhcYps9zMvsI5/l+0JVSOrYD6mqgQ97NFKAFSUY7iBOdpKvxV9+wYVoLOy1Jtuw8GhuKOGDkCQkGSjGG3chvhJogkeKaoLYVhqGb2QpeL6p4 MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 22c54a6a-df84-46e4-9b55-08d4e61708e1 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(2017052603031)(201703131430075)(201703131517081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:CY1PR03MB2265; X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB2265; 3:xVVK9teSW3Sqt9fVQPEDLIQQHoQrrG4msRLNf4FYt67RSft18l7uPq2mvuOP1qdmmHB5WuErJhpy5vUYMOib8JAPYwuLGOT42/63jA1xhHGF/Umc/iawmka9zAmJH/oRpga0vsVCS/AgNVmbKK8xFfwjSxsMXE2XYaLdLUtY2W9GZiW+GYh3AcXporR4AAyaK4Ufz/YMMCKvapC08MwN8rNu2gJEs3H3gzaRiyv7T/tYXNaLIkTxgGqnpfRM2ElJjoocmc70OIGF9pco2j8Yx1mdqsPrJCaJEuzTvjd7O//TxmUcDgswl+lKndnQ1kBYxWp6j03fwvUp5y7it4W5nu1XJZlOd8WRX4ne265BmgU=; 25:1ltaDWp22iTCdcsu9nCR1ShrUHvAxWbvbk1JiCLTdQkHaxrj6Juj2vTIDYYsTuYXaKLhfU5nc3PtpBlTEAQ0SAWa+aWCu3P0MNjjoTkS+nff79tvHyZyva0e38cveh15Wi+tCe6On4H1uXHQT+GU4NiCjHWbVlQaiRMjWKzS5mQQ4EgYiIzs50KFpA5IvPqgtEGN1cnLD6PAV5a4KG26vLM6jjNsVwfKvRFkvSOMCy8giB7RZ+JS5QiygAUSIs9QPBBVCqkUXBC/9ssoXUOzGCKfYKszQ1HgVTX8fIcefePYPkfKK1N/iiIszNGX3ordXWce4OaM8FYdDJn5oDWauA== X-MS-TrafficTypeDiagnostic: CY1PR03MB2265: X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB2265; 31:aPICqc6dG1Vnhlgi6Tgu5WzjUMD1HhUKaeIUJLcUUqhtrFs6S+JsPFCsadLU2pu9M0X08a86m+DunTO09X7BSVVwy4TJSzBJekYtwM/P5o1qQ17Djd1fpp95UzH3i8hSMSFbuBl4FTzjuSqohGqmTTuHPOy5zLTH9J+22w6CC6YwOvVDo/vPt5T9qJZ0mICEaEIHycjk+OdnK6WwRFywlwXTMHAPsb3RKnI7bF1lFCY=; 4:FgE/c7Gl19MF4WkaMwbqfiL2BWYkOL+WxUGQEhDvpIHbk1va86bW3Rqg7Qx6bpDRlpHDF84B1FxbIOP8MVcoJMTCG43GQN+1PniyOPbJu77kNtE8YL0YKUc+wfvAAjnsokb73/500kqhjNWrOxM97r/PVkxjRZBlkfDPQv0lRevLlpZA41sfPGe6iZgQtbXUksbTsDw6EvysJxCpemVk8hN378OLIZwk2LiFJD9Fj5YRkbtQOtlqVwxq8/8TN3eGjMOzmc1UWsN3Kss8VLP8sVYIWXYdpDcLXembTTKo9iw= X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(601004)(2401047)(5005006)(13016025)(8121501046)(13018025)(3002001)(10201501046)(93006095)(93001095)(100000703101)(100105400095)(6055026)(6096035)(201703131430075)(201703131433075)(201703131441075)(201703131448075)(201703161259150)(20161123561025)(20161123565025)(20161123556025)(20161123563025)(20161123559100)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:CY1PR03MB2265; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:CY1PR03MB2265; X-Forefront-PRVS: 040359335D X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR03MB2265; 23:2WCRzyTUwK1PJIi0kaGhLBPSZvqiUaBxCnAUR5pWv?= =?us-ascii?Q?rj28RMUi1ACk19yqqR4emTePjCnIYiIWDd0QWCH4w1lnyhP4l41DLptk2O7R?= =?us-ascii?Q?7DkmHY9xo3NCGz5hh3fZvNbMwRvaDhNWMX7jcvOOSBA/vrldtulc1Jsy2Ub9?= =?us-ascii?Q?Gpvox/u+ssHcPrHqQBmL0edZiEeibpyH2iNNWqWXSIKAc7DH4/NE4v6cReBg?= =?us-ascii?Q?dt8mfoFIAbz5bbvRoIDS+n39Mtf5QGASyxM7uTGSQlIbMK2Ao/UA1FLcXOmb?= =?us-ascii?Q?RzTbwjou2m6u3RlbpEQjy8VfrgLUbi3gZ88PQpP8TO6WYWFzl5dTGuRuAMS0?= =?us-ascii?Q?reKmLI3X4gcX8NDqYRmq89a66Xmw1JEtrTpZLXib49NJPhDLTIqOwXo/bmol?= =?us-ascii?Q?CWWusttquZpqoss5vsllmK9EDh7BUDWSXhRseVfLyBiW9F48hb06Q5zWRD7D?= =?us-ascii?Q?wI7JnQh+S5yN6QY+6qFh7m88S7+Q0dJp3x0yMbMWp6ojmCYsvm2xVNfWwpGc?= =?us-ascii?Q?jO5M0tXV5Lv7j8rq8Ubt/bJk1+kS6v8io4RR0OXKn+WTtnFkJyy4W/7pNpmN?= =?us-ascii?Q?mk1FEXZfJjQWhBfmz/PRXXZ5MARADSOsX7bl2VO7Wc9+dSf+QNK5P25inxzK?= =?us-ascii?Q?EqOMAc//n855Na3K9pA9KxYi0oDYL9Vq7XLs+/KK4is/83V84MFqivZzFwQN?= =?us-ascii?Q?Zq77VVui8zzu+hpektrzerYpQU5+gqzbXDZNMXNgUI+04g64cJS6U+6mTDk2?= =?us-ascii?Q?XdGcbYW8FMCArNkBLT2Ht7MNsSH4MnUslqUvUtoFOpqnalRTOF8gN6BL4CHG?= =?us-ascii?Q?o4QENosE8z4QJn0lchhdg+xr7tYWFa4knL+EcK/8yHeEwVse49ttrRkYr6pD?= =?us-ascii?Q?L6dVxm6A9ncl6kBHB7bvMaOEufIUFxDJmNHNidwzF8kWYpLjkEgNUHSdJZXp?= =?us-ascii?Q?5f//83Wx12bPYpGNSmIpbgNKAojcwOtxx3Q5dcSasz23nmRRcvmEVUfGZ1gC?= =?us-ascii?Q?Q2VSfFJIu0a12HUr9AISoJ6jutDOk+OzPG63fyh9Wg7tDebuaaIu+cSTVWqF?= =?us-ascii?Q?nZiZlRrNH6BIcjs9Q3ZBaTbIJcZu6Ru6HBEZ1PlhgtR2qOr2Qp5ICdM0jJ1x?= =?us-ascii?Q?e1xQZ23R68=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB2265; 6:jzunl8fRLpZ+s/irwDKMdGXvzDFvCjVmTCKcHLGEffsr/ev0dJcpPsZTNnstMX1eVgG2IOeCOU9UsTQCU75EokDPvof3fTQPA1FFtP68Z91BbrNHF/cccIDb6tLHnMV/fEqmq1HYifqHPqKLFg6waG5drXkuHCiXhcBBCl3nhk9gngxTlheFlkDSKsGuWTPEjnr8sPUvRt2WLkFdl7+V1x7HVSqVmHCKqZBZ4DsbjuCp79dtdnTvo6P2J+gcwWhUZ48FAVb3APhg/PFNfbj2gptNs0CcEPGQUruLTWjY9bbvnQe8QRENRzmjF/BJ++EDR+hjcYmLhCQEz/zJ1uJRmg==; 5:oSgC3MULhaKzfcOnvbBQUVA2TRJvjKjEWJS6OMkFF9eRXKJhn91kFgg1vDmvAETN+c0HR4BCZZMnQmnHfWqCBzaDMbZPp9ma4REnunu6uf11so1P/C7vzPY4Gvd+vskKi6U6d1ElKmduR8Qiek9Rag==; 24:uuZXkaCGTYm6vSSLkPynzN8d6JphwbaRR8FGluwak/yEcn8TnYFKCFxBZQMDOc2RJnKpQDXTYaDgt8lSXuL4gJc/vh7HfhMUTXNbaEH0oP8=; 7:fekNafSccxStUvDMgzwp9w9QV630QuN7TCPP4um7j5SGaXP71k/dowAWD6md6ZQ5QUrOnKjJCGl47+MAMQvT06POkeMM1Ey29Mk+AQziFnaEjt0xQjkePpR4P/M3gkDrpFYqDphlpBktVdBTje5zr4bfDSlhFsSZf5+ivrvYja7vJMLew0S9/SE8Wh9SZB5QzgMZkEUlGcS3bdSU93fSNP75maXhq1tVkdbcn3/jTkY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Aug 2017 08:56:37.2005 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR03MB2265 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: madalin.bucur@nxp.com Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Set the skb hash when then FMan Keygen hash result is available. Signed-off-by: Madalin Bucur --- drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 19 ++++++++++++++++--- drivers/net/ethernet/freescale/dpaa/dpaa_eth.h | 1 + drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c | 9 +++++++-- drivers/net/ethernet/freescale/fman/fman_port.c | 11 +++++++++++ drivers/net/ethernet/freescale/fman/fman_port.h | 2 ++ 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c index 6d89e74..ef30038 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c @@ -236,7 +236,7 @@ static int dpaa_netdev_init(struct net_device *net_dev, net_dev->max_mtu = dpaa_get_max_mtu(); net_dev->hw_features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | - NETIF_F_LLTX); + NETIF_F_LLTX | NETIF_F_RXHASH); net_dev->hw_features |= NETIF_F_SG | NETIF_F_HIGHDMA; /* The kernels enables GSO automatically, if we declare NETIF_F_SG. @@ -2237,12 +2237,13 @@ static enum qman_cb_dqrr_result rx_default_dqrr(struct qman_portal *portal, dma_addr_t addr = qm_fd_addr(fd); enum qm_fd_format fd_format; struct net_device *net_dev; - u32 fd_status; + u32 fd_status, hash_offset; struct dpaa_bp *dpaa_bp; struct dpaa_priv *priv; unsigned int skb_len; struct sk_buff *skb; int *count_ptr; + void *vaddr; fd_status = be32_to_cpu(fd->status); fd_format = qm_fd_get_format(fd); @@ -2288,7 +2289,8 @@ static enum qman_cb_dqrr_result rx_default_dqrr(struct qman_portal *portal, dma_unmap_single(dpaa_bp->dev, addr, dpaa_bp->size, DMA_FROM_DEVICE); /* prefetch the first 64 bytes of the frame or the SGT start */ - prefetch(phys_to_virt(addr) + qm_fd_get_offset(fd)); + vaddr = phys_to_virt(addr); + prefetch(vaddr + qm_fd_get_offset(fd)); fd_format = qm_fd_get_format(fd); /* The only FD types that we may receive are contig and S/G */ @@ -2309,6 +2311,14 @@ static enum qman_cb_dqrr_result rx_default_dqrr(struct qman_portal *portal, skb->protocol = eth_type_trans(skb, net_dev); + if (net_dev->features & NETIF_F_RXHASH && priv->keygen_in_use && + !fman_port_get_hash_result_offset(priv->mac_dev->port[RX], + &hash_offset)) + skb_set_hash(skb, be32_to_cpu(*(u32 *)(vaddr + hash_offset)), + // if L4 exists, it was used in the hash generation + be32_to_cpu(fd->status) & FM_FD_STAT_L4CV ? + PKT_HASH_TYPE_L4 : PKT_HASH_TYPE_L3); + skb_len = skb->len; if (unlikely(netif_receive_skb(skb) == NET_RX_DROP)) @@ -2774,6 +2784,9 @@ static int dpaa_eth_probe(struct platform_device *pdev) if (err) goto init_ports_failed; + /* Rx traffic distribution based on keygen hashing defaults to on */ + priv->keygen_in_use = true; + priv->percpu_priv = devm_alloc_percpu(dev, *priv->percpu_priv); if (!priv->percpu_priv) { dev_err(dev, "devm_alloc_percpu() failed\n"); diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h index 496a12c..bd94220 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h @@ -159,6 +159,7 @@ struct dpaa_priv { struct list_head dpaa_fq_list; u8 num_tc; + bool keygen_in_use; u32 msg_enable; /* net_device message level */ struct { diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c b/drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c index 965f652..faea674 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c @@ -402,6 +402,8 @@ static void dpaa_get_strings(struct net_device *net_dev, u32 stringset, static int dpaa_get_hash_opts(struct net_device *dev, struct ethtool_rxnfc *cmd) { + struct dpaa_priv *priv = netdev_priv(dev); + cmd->data = 0; switch (cmd->flow_type) { @@ -409,7 +411,8 @@ static int dpaa_get_hash_opts(struct net_device *dev, case TCP_V6_FLOW: case UDP_V4_FLOW: case UDP_V6_FLOW: - cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; + if (priv->keygen_in_use) + cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; /* Fall through */ case IPV4_FLOW: case IPV6_FLOW: @@ -421,7 +424,8 @@ static int dpaa_get_hash_opts(struct net_device *dev, case AH_V6_FLOW: case ESP_V4_FLOW: case ESP_V6_FLOW: - cmd->data |= RXH_IP_SRC | RXH_IP_DST; + if (priv->keygen_in_use) + cmd->data |= RXH_IP_SRC | RXH_IP_DST; break; default: cmd->data = 0; @@ -458,6 +462,7 @@ static void dpaa_set_hash(struct net_device *net_dev, bool enable) rxport = mac_dev->port[0]; fman_port_use_kg_hash(rxport, enable); + priv->keygen_in_use = enable; } static int dpaa_set_hash_opts(struct net_device *dev, diff --git a/drivers/net/ethernet/freescale/fman/fman_port.c b/drivers/net/ethernet/freescale/fman/fman_port.c index b0ad9c4..451bae7 100644 --- a/drivers/net/ethernet/freescale/fman/fman_port.c +++ b/drivers/net/ethernet/freescale/fman/fman_port.c @@ -1720,6 +1720,17 @@ u32 fman_port_get_qman_channel_id(struct fman_port *port) } EXPORT_SYMBOL(fman_port_get_qman_channel_id); +int fman_port_get_hash_result_offset(struct fman_port *port, u32 *offset) +{ + if (port->buffer_offsets.hash_result_offset == ILLEGAL_BASE) + return -EINVAL; + + *offset = port->buffer_offsets.hash_result_offset; + + return 0; +} +EXPORT_SYMBOL(fman_port_get_hash_result_offset); + static int fman_port_probe(struct platform_device *of_dev) { struct fman_port *port; diff --git a/drivers/net/ethernet/freescale/fman/fman_port.h b/drivers/net/ethernet/freescale/fman/fman_port.h index 5a99611..e86ca6a 100644 --- a/drivers/net/ethernet/freescale/fman/fman_port.h +++ b/drivers/net/ethernet/freescale/fman/fman_port.h @@ -151,6 +151,8 @@ int fman_port_enable(struct fman_port *port); u32 fman_port_get_qman_channel_id(struct fman_port *port); +int fman_port_get_hash_result_offset(struct fman_port *port, u32 *offset); + struct fman_port *fman_port_bind(struct device *dev); #endif /* __FMAN_PORT_H */