From patchwork Fri Dec 23 19:17:08 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Dupuis, Chad" X-Patchwork-Id: 9487689 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 38E67600CB for ; Fri, 23 Dec 2016 21:48:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1DEEE26212 for ; Fri, 23 Dec 2016 21:48:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id F26172621E; Fri, 23 Dec 2016 21:48:09 +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 F305F26212 for ; Fri, 23 Dec 2016 21:48:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S941085AbcLWVsA (ORCPT ); Fri, 23 Dec 2016 16:48:00 -0500 Received: from mail-bl2nam02on0081.outbound.protection.outlook.com ([104.47.38.81]:57568 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758310AbcLWVr6 (ORCPT ); Fri, 23 Dec 2016 16:47:58 -0500 X-Greylist: delayed 9039 seconds by postgrey-1.27 at vger.kernel.org; Fri, 23 Dec 2016 16:47:57 EST 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; bh=azAWbggUazSKoccrBIJTszTL4woNPrm5o8Tl7hk0ElA=; b=L4hV8ivLTOqeVZqiiHwVY1EPVMLYSrqnJk0DYhCLF2Q1bK8zywfZ0LmukOQRQ7MUUv/SCP/4UvHWrinAEqifnKW3xYPoXlUAqbr1TBmktaa0gzmdR124/vsX/1iA6yP9LIGe1hbjvFDPtmhVTF69jxLqS5MLoFncvpHMpefO5J0= Received: from BN6PR07CA0012.namprd07.prod.outlook.com (10.173.33.150) by SN1PR0701MB2096.namprd07.prod.outlook.com (10.163.133.11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.789.14; Fri, 23 Dec 2016 19:17:38 +0000 Received: from BL2FFO11FD009.protection.gbl (2a01:111:f400:7c09::142) by BN6PR07CA0012.outlook.office365.com (2603:10b6:404:3a::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.803.11 via Frontend Transport; Fri, 23 Dec 2016 19:17:37 +0000 Authentication-Results: spf=none (sender IP is 50.232.66.26) smtp.mailfrom=cavium.com; vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=cavium.com; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) Received: from CAEXCH02.caveonetworks.com (50.232.66.26) by BL2FFO11FD009.mail.protection.outlook.com (10.173.161.15) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.789.10 via Frontend Transport; Fri, 23 Dec 2016 19:17: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.309.2; Fri, 23 Dec 2016 11:17:10 -0800 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 uBNJHADr024256; Fri, 23 Dec 2016 11:17:10 -0800 Received: (from root@localhost) by dut1171.mv.qlogic.com (8.14.7/8.14.7/Submit) id uBNJHAbN024255; Fri, 23 Dec 2016 11:17:10 -0800 From: "Dupuis, Chad" To: CC: , , , , Subject: [PATCH RFC 5/5] qedf: Add FIP request handling Date: Fri, 23 Dec 2016 11:17:08 -0800 Message-ID: <1482520628-24207-6-git-send-email-chad.dupuis@cavium.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1482520628-24207-1-git-send-email-chad.dupuis@cavium.com> References: <1482520628-24207-1-git-send-email-chad.dupuis@cavium.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:50.232.66.26; IPV:CAL; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(39450400003)(2980300002)(428002)(199003)(189002)(47776003)(5660300001)(626004)(2906002)(50466002)(4001430100002)(4326007)(33646002)(38730400001)(92566002)(48376002)(26826002)(8936002)(81166006)(105586002)(101416001)(356003)(50226002)(107886002)(50986999)(81156014)(8676002)(76176999)(5003940100001)(42186005)(86362001)(36756003)(6916009)(189998001)(305945005)(69596002)(2950100002)(106466001)(2351001)(4720700003)(80596001)(110136003)(87636001)(217873001); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR0701MB2096; H:CAEXCH02.caveonetworks.com; FPR:; SPF:None; PTR:50-232-66-26-static.hfc.comcastbusiness.net; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD009; 1:SEkFX4S7E6Eye/D+FS1xlu02bTWSyILaC8Voh05A9vmflX3zE9GKEFO+cXLP6M36x67Pq4z5wE67oXhpLYClweD2qHQ2N3RKxnI1XjSO4ZkQPOw29YYDE1ssj9MJ4d3c76+bVuYaWh6e8aK6IVHmYHcHV8hBEvZDG79nGpcBbfyB4yd24SggktU8NLMpC++r3dQY+VH/K4nI90FGucLpPbtYyLhHN4bUWx5rNMZnZeMkT4HjcIfN384Ll0ZvqMx9bCPjdj7Sp6m62N57P/oHooobcwRUoEGOUUpbKWGenbDhLNGJZscOLqwOa3Dlrj3MaYxJkrpF9WHE/Yj2qc7pmecSNh8R006rWvs9QxvWseicWA+Z6EvuIHDGG6Qce48DjTK0qX5/vuTbvhn63Jjyhvq+aHxiA85XKVeP7+TxpU9UGhppaIY0HPfy2/O69Q48vpAhdvrrS5ZAhPJNAkCqkMve8vxZp4w7FXb+VrHfZTu5ai2g+6P6ILUKI/w4MnCYJY+HRS7AHvcybmgBXaZaxQ== X-MS-Office365-Filtering-Correlation-Id: 3afbf855-d3b9-47e2-fbf7-08d42b685b7d X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:SN1PR0701MB2096; X-Microsoft-Exchange-Diagnostics: 1; SN1PR0701MB2096; 3:BscsWiCrIGVdVQM3S9+A8jZ/BKHXweyl1rL4S38tqIoP9kPGeLJ15rJUSMjtjhGaFMzta/G4UxOvwMavbzeR6aHdJgSrOt6tDXduTWjXLK0t1dBHFj7t977LjtBGNDIACUaPADPMBLGC07aSjUNmQ5lylNFu0WYLOsaSDcwyP7RD4qUg/cNacwFG9J5wlLLVBXWxWulq7XcjjTOwvuzsBB1uOfoomBA5YaOuC9pDARpwdzHkOom1Z6gzQSwYuYewm36u8dt3866yHSVRlnbxKaNobNzbmHBuo1/qUwdtnTxIkJgKoFHx+QVWfoYqGbgc0mMY1jY90ZyvSlqdoBK/qLDmJDAzphF79wSNlS9Isn7qKY6D4pvMEW71jJwwO+2N X-Microsoft-Exchange-Diagnostics: 1; SN1PR0701MB2096; 25:d9GxJBxr73aCQHJ3HLHXvwgumSlWOk6/pM/fJKHUn38yIM/FN2K03eWT5JZJh/SRqLhpBQU2EINneQiLybmvp0RxlTQe/LWCKUXlyxZ9qVyUOeZ8Zx3E+ZJdzXTzS8Evwvxqp0L/2mbElVZLC0is1LjJ6jEROCIJsel5ExofF5DtvvL4+iy95sw+CSvG17PkfvveASsSvWSLLsN/vblhiDCqKzeGB+Wg5w+0iNRg2f0vJLU6c2+jGAmZlQuSFK9hAchRRcqD/l9nZU23nz1yzwJL6wg4EK1wCLZzZcU3ucvTCZsaIEgL3gfBABTGJ5mxXvG6h/4Qgh/YP5XgC6nwr/y0T9J7y7/gIe12pJQpLSOGmxggSC2TSZA8lg/mzQ9G0WQdKEK/DoseJiAndxQX9KFWGsf7ohy+9VPRZtfEiLZAZvTm3HyqpY9yT4IZ2HlTWFi4zCUdtjAqoXb5SwwcTmZK9XZLeo+BSqn+dyVr0pOmlGlEXibGSCYUHnkUkklwoIkxmnldUYCi/+icB1Q1h6wSnt6DrEKOgWzEpniJg+r98em7hYKfUDGzR09coXWcjKkFCJWUR4WRWWuywek3vAumZoyARB+ALrWZkLR3nBPlxyVHkKdPoYWjcrQj1Sxo4WJ9CfsAiCqyoZAtuW/nxFQ34T28HxvgiTFIGgE/1ORTKAWnZYXuEB5Z/0QcXC2hCYEKvW5TjzREHlL+lQdWwSSZYQyx8lPGLQd5jwTTQghdf6Rfa4nDHWbIRvB7C7hb4Wro9HLwNDFRz3sZR6ZmCHqHfYXWpK6BjkRwCAJX6MbYOEWPBP9HjFURvxIrMZHtcF4DAk4YLW5cVadyNVz87A== X-Microsoft-Exchange-Diagnostics: 1; SN1PR0701MB2096; 31:2XO5D9Qy1bLF7MSG++aw3RA2iU1w4QB3POUKCrNuNd17081Wlz5FAMsf7q78daSWnxQyATC8WB1rdJCYU52ns6VnRRclW2FDEsbi9reD+Qbg9+FH/iqOpyqnbWYiRETAlS07OazebugrOWSAl7Lr46v3rH78MfqOfOZ/kSjSZ3MLdHV+yrMdrouZAL1WapXY6EPeG3hxKRfInW44aY16DkUfDxpyENyY/1Vf/aD0gR5eWeYUlHhauTCcKYessH6kMLgAvEwFHmR+dNP8IyAFTg==; 20:k2h7peb+g9/cy7XoMyDPLpKuqrUkYp0PBWwj1W3Gq/bFvgmmcOx3MHTbzEpAsB00rMtCZ3orA20ZB1SpvLu43EBWSSrwCRAs03U+UQ/puKKKEgPhhpZlMlVAxwImcnYxdZgqtwE9ADgyrnCxgeH73w4rM+K4qgVVTLjrrDs+g17sISjFjw9MiZQbrnUMDs96OQ0/NMhZoBxepSXj7gRWg828EchgjacE+KDm6PBpFxAiVCNZDQ3uWeVB76QZFO84Xc/obts1IgRwLb4Vh9e1M3zG1piwChwRLbHB/6Hg4FxseH0cyG4K9KVi3w+TM9DbbMYYYhrjJoCyhrheje0Udgm3XOWTqDxS0vZmuykJN4PGafl2a4Z7jM0OcQMXQmCLnN2izjnao7j9ZP0yg+tJlaBAR0ByQrztAscvkzOc74PSDHSn2GW0TLaBz7qQCv5u1sogIGUCEjSd5FzeKTOPY2Bjmjv1nIM/529Sfa+EEfXM6q0ekdPNTYBnPuebG7en X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(13013025)(13021025)(13023025)(8121501046)(5005006)(3002001)(10201501046)(6041248)(20161123562025)(20161123560025)(20161123564025)(20161123555025)(6072148); SRVR:SN1PR0701MB2096; BCL:0; PCL:0; RULEID:; SRVR:SN1PR0701MB2096; X-Microsoft-Exchange-Diagnostics: 1; SN1PR0701MB2096; 4:ys+Z/GiwA02jv+h/e+k9pvGWuM6X9cSD6WLi+w/gpXT4IdkSwrlocQ0HZ3iMZqbgXWpVY2tq/yad9MvyDKqRtDVwmFcosth2loMxD5m2YsJrnXbVkRddaVI5D7cmYhbM4aJiUs0lwlUMu4MHmJgn4hRJp7xuKEKhst5BzQv0OWZxK/6sTNTLFIjqwI/D+oMzIYN6zthaO0cDz+krpn4+uZDLRXWfyC2mAOpZUkzpKwO4uJ4/SBKP9/80OmQN/17jk4xG0d9jZRZU7y3ly9veX5dWHeXcJVsBX1ZdoahEyhN3B2CBiXu1SUrO+nN6EcO9J0RjpBzJwrObB/rBmjO5N0JznvAcZXfCUx/l0HJWazjrGeaITdP8JsZC1LWNjYpuPWERK12Q38HDSquqKoyDGkMqxQBwFtjpKT4K+RIdiF0W1tetvNydXA18/90pZKcHdJ7OF9QjyNi5gIij5h+o5Ydi9/knFNVphHRBXavA4u39M5oVMnSNGqpVSwYYMC8jW9NHGdvg9pXsKQu0chOpPpGNxgzFhVeS09Ai4CB9EsvJyc9BMg/I7qpxbdLTlrERwsxlcLk8bns0kpJgnFRxAf4H7QBOivTCFztAWV+i3cGOahlp2q5/x81s1abjmy3U X-Forefront-PRVS: 016572D96D X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR0701MB2096; 23:j/QQwFjbnSuWIjYSJNLI2RE5rh0eIkazwWB4eli?= =?us-ascii?Q?gvRydmIdlrYQMAPGpCCooVEJR2eIe236dEalBr7/t94w4lO/WKLDYAC/cAVQ?= =?us-ascii?Q?vLHR8TpC4HG/Uxdl7zQsYM3qnt7nWmUixhRrSLyWZcQBwZbTcuf++DSdzkr6?= =?us-ascii?Q?Cx9/ULDUhmfv2RcD/6zepdp7hT7aLZUwYM616e4VgQA3JZ8k+qCJ+gTigeD1?= =?us-ascii?Q?eXkk3cb7nYuzzBrZ6kReaFWZV/RG6xBBH9UG5WZOxyCI/smlNR+5iSYGw9Ys?= =?us-ascii?Q?XjpkvSTrZ7icebvm8wfZdmd88nqCxXSwv7OEAqAzly3YNkLKbzJN8w8+RIly?= =?us-ascii?Q?G5klWvVlyiFGg4s613l8yyn4Js8gKFI6VhJecnXeYKNL0pyptbhwu8/EO6CE?= =?us-ascii?Q?SkBQCazLpwL9FvhkxHG9zBp4eABYJ2cRVpSbw+OeZdQ0KpFhLhas9i6jMijC?= =?us-ascii?Q?o3gu/6aOH3h/GxvUzAQvNrD60s9DJlXDeyKIfKokejJbtnZO/imXLjy+VCHi?= =?us-ascii?Q?lNLCq290TqU9x1p9vhxYf9zwUaTFQL9JbuTSGmiTN530ihiGkma37Fc8u1+4?= =?us-ascii?Q?ukmRYL1n4Pok49HwbhkECi7TTDcSaJJDBI3sJV91MZwWkny7/voGuhMtEqxB?= =?us-ascii?Q?eAfETeA7IvkgTWOvGoELy7YAhkXqUhVxYXPnt9xVWh/2E1532fz/uwZx7Ygn?= =?us-ascii?Q?kcFfakqLcYqvJ4q9d3cxFxqCUaYx+HYxP2L/XzbD2Z3sQjyN+gaM2L0Zn0FX?= =?us-ascii?Q?cM/uuC3rEzVH55sy0iT/wL60u/+1s83q5QUgH5dseSJ2L5eoTnJe3PGIfWWn?= =?us-ascii?Q?TwHSvG5o1gKZUMYkZwrPypR/Gvpz7KunyYRiCA/loq4wYB5QpfKPusgzkFmg?= =?us-ascii?Q?BRKI+zXE8ASBrYtRAyk6kO9Tdp2z/49S8RoetfIKvkPxU9Xa/rVmbD5lsLBs?= =?us-ascii?Q?1ic0shJbPR91seSWaxayrROcwCojJ6rnBM2894iHaMpMJAZNH9xtgXDKP1Xo?= =?us-ascii?Q?CBLO+QGMlsgBf6GJ7zrWhwxT/yaDEuz95yRbfdmddQlJIBXY1QKys+cCuzPK?= =?us-ascii?Q?v0MgdNhRaOqtQdsRMZ+BBaXUMRMRHkHs7K0iPbmj50/MS4l1IgwfYc/rv4Rf?= =?us-ascii?Q?SI2ZdtRlIvAM=3D?= X-Microsoft-Exchange-Diagnostics: 1; SN1PR0701MB2096; 6:8ec1zzuWekF1Gu2WT2xv9I+fDWaESMD5Djvo6Vr6hyuxKPuLM0wmdGI/FtjqnJ7se01eXXdhhvOYt890wzghEjrE6ZjtZq6dsQo1f0it6Wp0XAUiSA7DWNVev317ucKqaRfjuk7P0Wh3zmps1hKuYJ+ogYWC2l0I0bbxGBAwCZ++ZFdC4ILzYcLBb8yCI7CEm030fgJl2ZoGiW12fScAYnBHcxplpzQnL/r5VinHKnWUYLE94a3g4iN/vWy0DEMbUuBrmRjjfXrRgW+6SMculRPekg0F5WBgwxMsroapu3/CO4y77Obbti8rJCDYyp9Pz0FPi7tnn1Z4a9Oxayh/bHBbD41cUwdn55qtxsfcT6fd2eCAYThWxYl4/928KyqMFj+vjhFMYaLKnMUjvHz7sdfMr9LjpnFfZlawjOqvchA=; 5:WlRMdn/iySza0kQzAKCPwRvU9MOx7vFpXxfOWFt6rCTPNM+0df/l4sX3xEDulynLta15bAEKV2Yo6FyVKzkAi3d15LG7+iGcH2vVwGvu1eQSt55T3VQNnvEtpX8ca7N3Bpp5zF7iG+1eg5oldPBPsg==; 24:vvB9YyJwSaNblcSR1GXkZH5iXV4eZNaeDj0bC2XRaEPaIxZ27S8ErVbrUaNdhnkFrbT6Y89LOjzaxheuOVFtMJ9izH37AODEzcGIKR4lE8o= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; SN1PR0701MB2096; 7:cPhoGm3GCrRf7APiDyfYEp867PGDkZrsV//NKpbM1lxBGMtvjGw0nkJChf/aaTKsY0Oi+c8E47Zd73Uoug6syrRbsV3DcztdzoYkM2pvJN/HyYq8tmGbs56wtaASJoPn+anl2mmLbWp9xAwUa474DMTdfQDeCx+h/rukJZTYfILgrVk4QaRau/oMIjvowb3AYdAuQhpp3Hrf1Yaw+U2kuwY3m15is8GjVo4RCPfIUrgKJ+SrYTxsPpFD6QDIsS6n5LrnDFBaG1RcxEO1n0rxjwurDsdp2EPXdCaiibIkFBB6ytxopBIQlWbGQ7iJdb6boMJ51pcyPIHEYglDqBIujJCxiHu4mECiaevZ92i7mSvwP+t4OcWjlaEEtw7AUOGAf65hixshT0P+Jgr09y+wM6sWHt1BeUfJV0eT69/ZWLk5Baq2b/1zQcwvCRAlyEH4RxxiOC0rPBE6P0+x6H/vJQ== X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Dec 2016 19:17:37.4226 (UTC) 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: SN1PR0701MB2096 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: "Dupuis, Chad" This patch adds handling for FIP requests and responses that are handled by the driver itself and not by libfcoe. Signed-off-by: Nilesh Javali Signed-off-by: Manish Rangankar Signed-off-by: Saurav Kashyap Signed-off-by: Chad Dupuis --- drivers/scsi/qedf/qedf_fip.c | 267 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 drivers/scsi/qedf/qedf_fip.c diff --git a/drivers/scsi/qedf/qedf_fip.c b/drivers/scsi/qedf/qedf_fip.c new file mode 100644 index 0000000..4f185c6 --- /dev/null +++ b/drivers/scsi/qedf/qedf_fip.c @@ -0,0 +1,267 @@ +/* + * QLogic FCoE Offload Driver + * Copyright (c) 2016 Cavium Inc. + * + * This software is available under the terms of the GNU General Public License + * (GPL) Version 2, available from the file COPYING in the main directory of + * this source tree. + */ +#include +#include +#include "qedf.h" + +extern const struct qed_fcoe_ops *qed_ops; +/* + * FIP VLAN functions that will eventually move to libfcoe. + */ + +void qedf_fcoe_send_vlan_req(struct qedf_ctx *qedf) +{ + struct sk_buff *skb; + char *eth_fr; + int fr_len; + struct fip_vlan *vlan; +#define MY_FIP_ALL_FCF_MACS ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 2 }) + static u8 my_fcoe_all_fcfs[ETH_ALEN] = MY_FIP_ALL_FCF_MACS; + + skb = dev_alloc_skb(sizeof(struct fip_vlan)); + if (!skb) + return; + + fr_len = sizeof(*vlan); + eth_fr = (char *)skb->data; + vlan = (struct fip_vlan *)eth_fr; + + memset(vlan, 0, sizeof(*vlan)); + ether_addr_copy(vlan->eth.h_source, qedf->mac); + ether_addr_copy(vlan->eth.h_dest, my_fcoe_all_fcfs); + vlan->eth.h_proto = htons(ETH_P_FIP); + + vlan->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER); + vlan->fip.fip_op = htons(FIP_OP_VLAN); + vlan->fip.fip_subcode = FIP_SC_VL_REQ; + vlan->fip.fip_dl_len = htons(sizeof(vlan->desc) / FIP_BPW); + + vlan->desc.mac.fd_desc.fip_dtype = FIP_DT_MAC; + vlan->desc.mac.fd_desc.fip_dlen = sizeof(vlan->desc.mac) / FIP_BPW; + ether_addr_copy(vlan->desc.mac.fd_mac, qedf->mac); + + vlan->desc.wwnn.fd_desc.fip_dtype = FIP_DT_NAME; + vlan->desc.wwnn.fd_desc.fip_dlen = sizeof(vlan->desc.wwnn) / FIP_BPW; + put_unaligned_be64(qedf->lport->wwnn, &vlan->desc.wwnn.fd_wwn); + + skb_put(skb, sizeof(*vlan)); + skb->protocol = htons(ETH_P_FIP); + skb_reset_mac_header(skb); + skb_reset_network_header(skb); + + QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "Sending FIP VLAN " + "request."); + + if (atomic_read(&qedf->link_state) != QEDF_LINK_UP) { + QEDF_WARN(&(qedf->dbg_ctx), "Cannot send vlan request " + "because link is not up.\n"); + + kfree_skb(skb); + return; + } + qed_ops->ll2->start_xmit(qedf->cdev, skb); +} + +static void qedf_fcoe_process_vlan_resp(struct qedf_ctx *qedf, + struct sk_buff *skb) +{ + struct fip_header *fiph; + struct fip_desc *desc; + u16 vid = 0; + ssize_t rlen; + size_t dlen; + + fiph = (struct fip_header *)(((void *)skb->data) + 2 * ETH_ALEN + 2); + + rlen = ntohs(fiph->fip_dl_len) * 4; + desc = (struct fip_desc *)(fiph + 1); + while (rlen > 0) { + dlen = desc->fip_dlen * FIP_BPW; + switch (desc->fip_dtype) { + case FIP_DT_VLAN: + vid = ntohs(((struct fip_vlan_desc *)desc)->fd_vlan); + break; + } + desc = (struct fip_desc *)((char *)desc + dlen); + rlen -= dlen; + } + + QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "VLAN response, " + "vid=0x%x.\n", vid); + + if (vid > 0 && qedf->vlan_id != vid) { + qedf_set_vlan_id(qedf, vid); + + /* Inform waiter that it's ok to call fcoe_ctlr_link up() */ + complete(&qedf->fipvlan_compl); + } +} + +void qedf_fip_send(struct fcoe_ctlr *fip, struct sk_buff *skb) +{ + struct qedf_ctx *qedf = container_of(fip, struct qedf_ctx, ctlr); + struct ethhdr *eth_hdr; + struct vlan_ethhdr *vlan_hdr; + struct fip_header *fiph; + u16 op, vlan_tci = 0; + u8 sub; + + if (!test_bit(QEDF_LL2_STARTED, &qedf->flags)) { + QEDF_WARN(&(qedf->dbg_ctx), "LL2 not started\n"); + kfree_skb(skb); + return; + } + + fiph = (struct fip_header *) ((void *)skb->data + 2 * ETH_ALEN + 2); + eth_hdr = (struct ethhdr *)skb_mac_header(skb); + op = ntohs(fiph->fip_op); + sub = fiph->fip_subcode; + + if (!qedf->vlan_hw_insert) { + vlan_hdr = (struct vlan_ethhdr *)skb_push(skb, sizeof(*vlan_hdr) + - sizeof(*eth_hdr)); + memcpy(vlan_hdr, eth_hdr, 2 * ETH_ALEN); + vlan_hdr->h_vlan_proto = htons(ETH_P_8021Q); + vlan_hdr->h_vlan_encapsulated_proto = eth_hdr->h_proto; + vlan_hdr->h_vlan_TCI = vlan_tci = htons(qedf->vlan_id); + } + + /* Update eth_hdr since we added a VLAN tag */ + eth_hdr = (struct ethhdr *)skb_mac_header(skb); + + QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, "FIP frame send: " + "dest=%pM op=%x sub=%x vlan=%04x.", eth_hdr->h_dest, op, sub, + ntohs(vlan_tci)); + if (qedf_dump_frames) + print_hex_dump(KERN_WARNING, "fip ", DUMP_PREFIX_OFFSET, 16, 1, + skb->data, skb->len, false); + + qed_ops->ll2->start_xmit(qedf->cdev, skb); +} + +/* Process incoming FIP frames. */ +void qedf_fip_recv(struct qedf_ctx *qedf, struct sk_buff *skb) +{ + struct ethhdr *eth_hdr; + struct fip_header *fiph; + struct fip_desc *desc; + struct fip_mac_desc *mp; + struct fip_wwn_desc *wp; + struct fip_vn_desc *vp; + size_t rlen, dlen; + uint32_t cvl_port_id; + __u8 cvl_mac[ETH_ALEN]; + u16 op; + u8 sub; + + eth_hdr = (struct ethhdr *)skb_mac_header(skb); + fiph = (struct fip_header *) ((void *)skb->data + 2 * ETH_ALEN + 2); + op = ntohs(fiph->fip_op); + sub = fiph->fip_subcode; + + QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, "FIP frame received: " + "skb=%p fiph=%p source=%pM op=%x sub=%x", skb, fiph, + eth_hdr->h_source, op, sub); + if (qedf_dump_frames) + print_hex_dump(KERN_WARNING, "fip ", DUMP_PREFIX_OFFSET, 16, 1, + skb->data, skb->len, false); + + /* Handle FIP VLAN resp in the driver */ + if (op == FIP_OP_VLAN && sub == FIP_SC_VL_NOTE) { + qedf_fcoe_process_vlan_resp(qedf, skb); + qedf->vlan_hw_insert = 0; + } else if (op == FIP_OP_CTRL && sub == FIP_SC_CLR_VLINK) { + QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, "Clear virtual " + "link received.\n"); + + /* Check that an FCF has been selected by fcoe */ + if (qedf->ctlr.sel_fcf == NULL) { + QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, + "Dropping CVL since FCF has not been selected " + "yet."); + return; + } + + cvl_port_id = 0; + memset(cvl_mac, 0, ETH_ALEN); + /* + * We need to loop through the CVL descriptors to determine + * if we want to reset the fcoe link + */ + rlen = ntohs(fiph->fip_dl_len) * FIP_BPW; + desc = (struct fip_desc *)(fiph + 1); + while (rlen >= sizeof(*desc)) { + dlen = desc->fip_dlen * FIP_BPW; + switch (desc->fip_dtype) { + case FIP_DT_MAC: + mp = (struct fip_mac_desc *)desc; + QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, + "fd_mac=%pM.\n", __func__, mp->fd_mac); + ether_addr_copy(cvl_mac, mp->fd_mac); + break; + case FIP_DT_NAME: + wp = (struct fip_wwn_desc *)desc; + QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, + "fc_wwpn=%016llx.\n", + get_unaligned_be64(&wp->fd_wwn)); + break; + case FIP_DT_VN_ID: + vp = (struct fip_vn_desc *)desc; + QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, + "fd_fc_id=%x.\n", ntoh24(vp->fd_fc_id)); + cvl_port_id = ntoh24(vp->fd_fc_id); + break; + default: + /* Ignore anything else */ + break; + } + desc = (struct fip_desc *)((char *)desc + dlen); + rlen -= dlen; + } + + QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_LL2, + "cvl_port_id=%06x cvl_mac=%pM.\n", cvl_port_id, + cvl_mac); + if (cvl_port_id == qedf->lport->port_id && + ether_addr_equal(cvl_mac, + qedf->ctlr.sel_fcf->fcf_mac)) { + fcoe_ctlr_link_down(&qedf->ctlr); + qedf_wait_for_upload(qedf); + fcoe_ctlr_link_up(&qedf->ctlr); + } + } else { + /* Everything else is handled by libfcoe */ + __skb_pull(skb, ETH_HLEN); + fcoe_ctlr_recv(&qedf->ctlr, skb); + } +} + +void qedf_update_src_mac(struct fc_lport *lport, u8 *addr) +{ + struct qedf_ctx *qedf = lport_priv(lport); + + QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_DISC, + "Setting data_src_addr=%pM.\n", addr); + ether_addr_copy(qedf->data_src_addr, addr); +} + +u8 *qedf_get_src_mac(struct fc_lport *lport) +{ + u8 mac[ETH_ALEN]; + u8 port_id[3]; + struct qedf_ctx *qedf = lport_priv(lport); + + /* We need to use the lport port_id to create the data_src_addr */ + if (is_zero_ether_addr(qedf->data_src_addr)) { + hton24(port_id, lport->port_id); + fc_fcoe_set_mac(mac, port_id); + qedf->ctlr.update_mac(lport, mac); + } + return qedf->data_src_addr; +}