From patchwork Sat Aug 12 01:29:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Manlunas, Felix" X-Patchwork-Id: 800793 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=CAVIUMNETWORKS.onmicrosoft.com header.i=@CAVIUMNETWORKS.onmicrosoft.com header.b="LVnjlHgA"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xTkn1229Jz9t2Z for ; Sat, 12 Aug 2017 11:29:25 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752024AbdHLB3X (ORCPT ); Fri, 11 Aug 2017 21:29:23 -0400 Received: from mail-sn1nam01on0071.outbound.protection.outlook.com ([104.47.32.71]:56919 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751770AbdHLB3T (ORCPT ); Fri, 11 Aug 2017 21:29:19 -0400 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=wJO3GQpeEazn+jpjLzRYt1QTmxJBf6omrSLnFkl0cuk=; b=LVnjlHgA1Bcb/yZ5nDX1NloP2NYiTUMdV5RQFTG0RPowxNMcZTdRfJA6zGg07VWFoYPseHyDKqC/NBOkYwU3yUW+dQrnunmy6p0WgvxQFZ76CYsviLPP1G5EUb0WqXNeKcEEweNS3BMQ0DP34la4XPvL+4jFKpGBNKE0EKP4KvU= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Felix.Manlunas@cavium.com; Received: from localhost (50.233.148.156) by CY4PR07MB3176.namprd07.prod.outlook.com (10.172.115.142) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.1.1341.17; Sat, 12 Aug 2017 01:29:17 +0000 Date: Fri, 11 Aug 2017 18:29:14 -0700 From: Felix Manlunas To: davem@davemloft.net Cc: netdev@vger.kernel.org, raghu.vatsavayi@cavium.com, derek.chickles@cavium.com, satananda.burla@cavium.com, intiyaz.basha@cavium.com Subject: [PATCH net-next 4/8] liquidio: moved liquidio_push_packet to lio_core.c Message-ID: <20170812012914.GA2562@felix-thinkpad.cavium.com> References: <20170812012818.GA2505@felix-thinkpad.cavium.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20170812012818.GA2505@felix-thinkpad.cavium.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-Originating-IP: [50.233.148.156] X-ClientProxiedBy: MWHPR1201CA0014.namprd12.prod.outlook.com (10.174.253.24) To CY4PR07MB3176.namprd07.prod.outlook.com (10.172.115.142) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ef2bc446-df4f-4aad-ae6c-08d4e1218c93 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(300000502095)(300135100095)(22001)(2017030254152)(300000503095)(300135400095)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:CY4PR07MB3176; X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3176; 3:1hFP2T7ul8VPPsdm9/tDkCemQduSyBsTCRfqBVtLcqmT6EuG27H6ILu4xHdR01AZImQYIjj/RonAtTE39KgrYkF66kgusJNrOt/g9djbVt0zToQvtT8rFRM9AWvsP0PTFnD1Mc55Lb5K6shwVgHfzVLh4p5opSBEbZHJUIyX7wpop39ZeEhLSV11zpK6al/DSJe/rDJSYLxhSR94oPHCBetqO77P2my+a5rpyFWaL4DaOJul1e/ZsKIepTJvyBKm; 25:idZWyZ81N6UX9Om+wGZ4b6MTiP4fdIFOIMpBsvRzhHmuhG8Q1DDx+EP57ydGjwWpc+yhuDSL6UQYQjhNmXL2bg4McWa3JLKBzUe+Q4/QK9prnI2xSXYUaiPvOrPdRkih0GDIsl0AjiWfe6uvjsrI06hYOXcyXhIWIWxyt1/YBx+Bbj0HZ3OIloVY8Qj3hGnk/FSrmiEQ43fwe1fwa2Wu60BXKO9cTZPRKleGGxxzTfdPAzC/vgiptlVC2IIIt9nsmFPpo7bwq/3qxZYbbhcA+4DtxVzaYmwYhBbUHDfAnBjJXW3UiVf4Dmf0FaTlmEuQcIP0XpJiSQgd0URjbf0mow==; 31:mbn5kblY4o4qOWU5Fd1mPY+zCl/5M0L/ATkWU2s2zdZMOpHRGdurP5ZV3/fZO4IAkKyhLEbnzNNTeWtobYodr87AQya3OzbHy7bN/xYyPWwPw5li6IlXAlxE6ZujGG0H0Cd2xkUXjO1tKou/oaflA0iYLbsn4uoLwizNSOLyCjJ7fbTJjLSasUiDityVLm/+rJtYm1HWnajoigI8IwtpFsDferzZ31AAnQe2FxgsGSs= X-MS-TrafficTypeDiagnostic: CY4PR07MB3176: X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3176; 20:1nVLn3AJv6SIWDzQG6XYxwdqI961nNiHh+CiEke95MIfPyhph9JbXFPyllSHyAbh5LtDkY8qykzgYpYO1StGjI2YQZ4AoBa0Bs0u2qhd8z1+kmDbydwP79HscJRUINwuBcg04QeK9E+/EAY7lH003ysBGrN5Fwqv7yQe2XDm89IY5YbrF3vGyb68Oi7xCnZ/Ke7d5VzsIQ5Q2h85/JQs48BlQOWJt/pmvMSCxiyp8n8/wBNrndsj4k1m/e2cBnZ2YbSB63oDCws/svFTnotr7pdokaDcHvEEObt8wuaKYrKCv1bkYCfJQ8WlM0s7OIS01R2rJBiNhOzo7NGMWk2xJ6JInpezvvPXMZftUOIjqXwd7zGUq7Gro2z0NG6jqwWZp15/UBu95ErSuaoTU1b7cm3SuMBeUk76jEKmJi6QbRwfTlgMayyHkXBTi7wyLGCfJjNWVG5A8dOwMNq4p48eaz5idYvOdv0ysRRsGC5l3S7SjLipGjG9zCSLkIXKF5q+; 4:p38UGo4WsloJDORMojM+slafgln5GzagDHYdWxcAwASHxbRTh5icFiZdOIMoz7zxnorkMLnk5DhMBjUMd8Tb1DqcdP1yBU+c75L+5UZowsvonv/irQkCIo8xX7uhZ/gaPC3i3OiKdWV1z8xvKPSsC/Q723mdZ1lXS5LJaQWuCH8HF+ZTU/auHAh3zqknrJWanp7rfZ4zCt+c/BZSI6G7sU9eTucvOVPSnXWjyUBT/cyrLEPozduvwYdcVjp1UuQ+ X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(93001095)(100000703101)(100105400095)(10201501046)(3002001)(6041248)(20161123560025)(20161123562025)(20161123564025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:CY4PR07MB3176; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:CY4PR07MB3176; X-Forefront-PRVS: 039735BC4E X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(7370300001)(6069001)(6009001)(199003)(189002)(33656002)(1076002)(2950100002)(6116002)(23726003)(3846002)(97736004)(6916009)(6666003)(6496005)(189998001)(53936002)(105586002)(47776003)(478600001)(81166006)(81156014)(68736007)(4001350100001)(66066001)(76506005)(86362001)(106356001)(8676002)(72206003)(5660300001)(7736002)(2906002)(575784001)(305945005)(50986999)(2351001)(110136004)(107886003)(2361001)(6486002)(101416001)(83506001)(25786009)(54356999)(42186005)(50466002)(76176999)(7350300001)(4326008)(18370500001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB3176; H:localhost; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR07MB3176; 23:ltIcX53NbN7nLwA4iTELtgLO29F7R7/3DYXWxtIPg?= =?us-ascii?Q?EH/dmOP4MtFPwL2Fjt6WdVCATeVnaQlYZbLeXC+LdqoGzchFJEz2H55qRwR1?= =?us-ascii?Q?jL5wm9nw05zS3JY0R6zwJRqILyO8yxFaZZPBlFApQMsOOxDczXnz7P8l1CrK?= =?us-ascii?Q?7u5BZioQrTWu2JVQ3yvCqJpb+cfb75kESLpFdieMIBTFGQqNHIloLS23L3zK?= =?us-ascii?Q?4CooQAqrkcMMEp9gCTUQxrR8QNsQSfoJyjxNNopnEqRHnXMGeDz5FpGkQEpU?= =?us-ascii?Q?mEvKR7bHNGV12cy1s/ZM6XMpzKY68NM2wWtOUhFBM22FX27jqqOiYlyrecK+?= =?us-ascii?Q?o1JkIh3rWjncdoTO8YenPZyo4OVKUBwVigUn1QozwY4BUn6kRF49br8cxaYz?= =?us-ascii?Q?3liPJLDRrmZTcwlUbZZzyjPdkcvMXzYlTsf79mPuk8l4rHOdx5ZPlHCkppD0?= =?us-ascii?Q?bls0lW/79/TLlXsHI7xSvXObGd1wpXVty9J/AKSKUSDxQOlaaN1YU9S9/5x6?= =?us-ascii?Q?WVY2rBrv68RVU27XbVEKcXqYa7CXNKP4N3QA+w/4NGGtjovLTN6vzoHnaMyZ?= =?us-ascii?Q?pUQLxldUZSNkevPY5IM3iJ7LlqU39URlTBJDI2YqyEuwtYX6kt2tHL1S61X+?= =?us-ascii?Q?fKfPVGTTNDnxcwEEV6myOSnq01favchrX01by6KcIwn5fi27SKtkYLL/w7na?= =?us-ascii?Q?dn6MIvFdaoAdF16LoknE+Oz7zOFF/WB7tRESUDCznfrGo86e7iNyCalElfp/?= =?us-ascii?Q?yV1RZg+31am1qtA2VxcSjrrKbrgixJ0zRXWK+VhpNd2mGZFW4xJvFcy/nPYq?= =?us-ascii?Q?W8eiIVotBiPSK7hxv/5HQEZcXukOpmKWFfpCh7Xtcz+CPBkWP0zx6VqdJglF?= =?us-ascii?Q?KWIywcwmz8VCJvhCJepfvLP4Cpj18zs7Ke1D89I6M08SV1xkiWuNK2jirEzP?= =?us-ascii?Q?JL2BW8XM8QiQ5I81ACQUDRvGBePxmir6FI9KK7MVgAGO9ZDvqQupa2O0dbQI?= =?us-ascii?Q?/K2wub9xKzRZqcPtFloyk2GHgAjMJsjgltNrOsbYyFnqox0Ki31cje9RI4vU?= =?us-ascii?Q?03zBwRmFAzDTmegthgHUHNZGiALUoqar5Ykd3qcuUL5EXcRwTcvcLPpZ88K9?= =?us-ascii?Q?l2sevZ+fe0zxrd64u5C60dBSnyjRWsuBJJy52ZS9pw3CVLitcRNH3EctMMB3?= =?us-ascii?Q?SHup+BOno4M4SMP8fHY5hwdABunIQjxKx7bI+1dw94gMaCl+S0ZWcVTKyaxj?= =?us-ascii?Q?xdi85fjsu9Bs821qxk=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3176; 6:hMZ4bdB1IDhsrV48zI26aed1Q2+h/9FP50VNTAsknwlKqISJKt+NSRln/sTmd654sflwZxk4FHb/caTzAAgpMmSHpIHgZvyIe6xgZtweuwVr7X4wEyiqk/5mGua/y8WfTdou9RhNU4QKJVOAcrNVxwmhBU1bg4OSjxYHKhnXblll5xvNs72yk0w+q1iSJLbY9veP6yaKnZZIMbDSr7NetLpHZGVyx6LrqLk/BaTVcweAj+mRNQFhyAQ3jL/AIAQ/YMI2pLQ9ePAXrp/Sc9O/YC66QdpwowMmPY9q3FEEHlCBefdQPkmlCbbKsHGlA/090UHoGjn3JXjyxKDXcxItyQ==; 5:wBas94lx0B+0OslT6Brw3aPiI6C7OBJ9Xp3Djiu6itVJtgULYTUJaLD4X3ehotV/VT0906Rakjy08224Lc2+buqQcYWvQhsF/uGh+JsL5IVMbCAzLSPUkpRsmmSwm+CCJ2gpCdg98haDFroPG5h0Ww==; 24:szOcEAhsFRzaFiuazR4dFrQwjPwMOVgOOBwzx4wXst9y6CEc8PR+P+LznpGWyoYEb6tjhuDhA5HjRlNNVUBoT0nNYmKVwJstxJ6epUvTjk4=; 7:ktSeu/3mnyqj3goHTql+Ywri+9ZPym0XpcO+H7+Ea0YCyxcuMPmpknmnhfUsS2yKh2c0ou+0b950OTxJBTYPcTLzrhm7GsghYmtljTSsHv1WvwLPpKQX0t0zMs/bD59SMKVTqC9552C1lAMsmIZtUSvysV0KOQ/QtQCLvYhR+EmLJL7eXeXj986RZAJ80ZdppXpOgaQC+r9izTPfM9mnNPWP5OChlklw1iZ/YFD7kn0= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Aug 2017 01:29:17.3804 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR07MB3176 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Intiyaz Basha Moving common liquidio_push_packet to lio_core.c Signed-off-by: Intiyaz Basha Signed-off-by: Felix Manlunas --- drivers/net/ethernet/cavium/liquidio/lio_core.c | 149 +++++++++++++++++++++ drivers/net/ethernet/cavium/liquidio/lio_main.c | 147 -------------------- drivers/net/ethernet/cavium/liquidio/lio_vf_main.c | 128 ------------------ .../net/ethernet/cavium/liquidio/octeon_network.h | 7 + 4 files changed, 156 insertions(+), 275 deletions(-) diff --git a/drivers/net/ethernet/cavium/liquidio/lio_core.c b/drivers/net/ethernet/cavium/liquidio/lio_core.c index 90583ce..b0b246e 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_core.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_core.c @@ -432,3 +432,152 @@ int octeon_setup_droq(struct octeon_device *oct, int q_no, int num_descs, return ret_val; } + +/** Routine to push packets arriving on Octeon interface upto network layer. + * @param oct_id - octeon device id. + * @param skbuff - skbuff struct to be passed to network layer. + * @param len - size of total data received. + * @param rh - Control header associated with the packet + * @param param - additional control data with the packet + * @param arg - farg registered in droq_ops + */ +void +liquidio_push_packet(u32 octeon_id __attribute__((unused)), + void *skbuff, + u32 len, + union octeon_rh *rh, + void *param, + void *arg) +{ + struct net_device *netdev = (struct net_device *)arg; + struct octeon_droq *droq = + container_of(param, struct octeon_droq, napi); + struct sk_buff *skb = (struct sk_buff *)skbuff; + struct skb_shared_hwtstamps *shhwtstamps; + struct napi_struct *napi = param; + u16 vtag = 0; + u32 r_dh_off; + u64 ns; + + if (netdev) { + struct lio *lio = GET_LIO(netdev); + struct octeon_device *oct = lio->oct_dev; + int packet_was_received; + + /* Do not proceed if the interface is not in RUNNING state. */ + if (!ifstate_check(lio, LIO_IFSTATE_RUNNING)) { + recv_buffer_free(skb); + droq->stats.rx_dropped++; + return; + } + + skb->dev = netdev; + + skb_record_rx_queue(skb, droq->q_no); + if (likely(len > MIN_SKB_SIZE)) { + struct octeon_skb_page_info *pg_info; + unsigned char *va; + + pg_info = ((struct octeon_skb_page_info *)(skb->cb)); + if (pg_info->page) { + /* For Paged allocation use the frags */ + va = page_address(pg_info->page) + + pg_info->page_offset; + memcpy(skb->data, va, MIN_SKB_SIZE); + skb_put(skb, MIN_SKB_SIZE); + skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, + pg_info->page, + pg_info->page_offset + + MIN_SKB_SIZE, + len - MIN_SKB_SIZE, + LIO_RXBUFFER_SZ); + } + } else { + struct octeon_skb_page_info *pg_info = + ((struct octeon_skb_page_info *)(skb->cb)); + skb_copy_to_linear_data(skb, page_address(pg_info->page) + + pg_info->page_offset, len); + skb_put(skb, len); + put_page(pg_info->page); + } + + r_dh_off = (rh->r_dh.len - 1) * BYTES_PER_DHLEN_UNIT; + + if (oct->ptp_enable) { + if (rh->r_dh.has_hwtstamp) { + /* timestamp is included from the hardware at + * the beginning of the packet. + */ + if (ifstate_check + (lio, + LIO_IFSTATE_RX_TIMESTAMP_ENABLED)) { + /* Nanoseconds are in the first 64-bits + * of the packet. + */ + memcpy(&ns, (skb->data + r_dh_off), + sizeof(ns)); + r_dh_off -= BYTES_PER_DHLEN_UNIT; + shhwtstamps = skb_hwtstamps(skb); + shhwtstamps->hwtstamp = + ns_to_ktime(ns + + lio->ptp_adjust); + } + } + } + + if (rh->r_dh.has_hash) { + __be32 *hash_be = (__be32 *)(skb->data + r_dh_off); + u32 hash = be32_to_cpu(*hash_be); + + skb_set_hash(skb, hash, PKT_HASH_TYPE_L4); + r_dh_off -= BYTES_PER_DHLEN_UNIT; + } + + skb_pull(skb, rh->r_dh.len * BYTES_PER_DHLEN_UNIT); + skb->protocol = eth_type_trans(skb, skb->dev); + + if ((netdev->features & NETIF_F_RXCSUM) && + (((rh->r_dh.encap_on) && + (rh->r_dh.csum_verified & CNNIC_TUN_CSUM_VERIFIED)) || + (!(rh->r_dh.encap_on) && + (rh->r_dh.csum_verified & CNNIC_CSUM_VERIFIED)))) + /* checksum has already been verified */ + skb->ip_summed = CHECKSUM_UNNECESSARY; + else + skb->ip_summed = CHECKSUM_NONE; + + /* Setting Encapsulation field on basis of status received + * from the firmware + */ + if (rh->r_dh.encap_on) { + skb->encapsulation = 1; + skb->csum_level = 1; + droq->stats.rx_vxlan++; + } + + /* inbound VLAN tag */ + if ((netdev->features & NETIF_F_HW_VLAN_CTAG_RX) && + rh->r_dh.vlan) { + u16 priority = rh->r_dh.priority; + u16 vid = rh->r_dh.vlan; + + vtag = (priority << VLAN_PRIO_SHIFT) | vid; + __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vtag); + } + + packet_was_received = (napi_gro_receive(napi, skb) != GRO_DROP); + + if (packet_was_received) { + droq->stats.rx_bytes_received += len; + droq->stats.rx_pkts_received++; + } else { + droq->stats.rx_dropped++; + netif_info(lio, rx_err, lio->netdev, + "droq:%d error rx_dropped:%llu\n", + droq->q_no, droq->stats.rx_dropped); + } + + } else { + recv_buffer_free(skb); + } +} diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/ethernet/cavium/liquidio/lio_main.c index a814d58..68a94c4 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c @@ -2228,153 +2228,6 @@ static void if_cfg_callback(struct octeon_device *oct, wake_up_interruptible(&ctx->wc); } -/** Routine to push packets arriving on Octeon interface upto network layer. - * @param oct_id - octeon device id. - * @param skbuff - skbuff struct to be passed to network layer. - * @param len - size of total data received. - * @param rh - Control header associated with the packet - * @param param - additional control data with the packet - * @param arg - farg registered in droq_ops - */ -static void -liquidio_push_packet(u32 octeon_id __attribute__((unused)), - void *skbuff, - u32 len, - union octeon_rh *rh, - void *param, - void *arg) -{ - struct napi_struct *napi = param; - struct sk_buff *skb = (struct sk_buff *)skbuff; - struct skb_shared_hwtstamps *shhwtstamps; - u64 ns; - u16 vtag = 0; - u32 r_dh_off; - struct net_device *netdev = (struct net_device *)arg; - struct octeon_droq *droq = container_of(param, struct octeon_droq, - napi); - if (netdev) { - int packet_was_received; - struct lio *lio = GET_LIO(netdev); - struct octeon_device *oct = lio->oct_dev; - - /* Do not proceed if the interface is not in RUNNING state. */ - if (!ifstate_check(lio, LIO_IFSTATE_RUNNING)) { - recv_buffer_free(skb); - droq->stats.rx_dropped++; - return; - } - - skb->dev = netdev; - - skb_record_rx_queue(skb, droq->q_no); - if (likely(len > MIN_SKB_SIZE)) { - struct octeon_skb_page_info *pg_info; - unsigned char *va; - - pg_info = ((struct octeon_skb_page_info *)(skb->cb)); - if (pg_info->page) { - /* For Paged allocation use the frags */ - va = page_address(pg_info->page) + - pg_info->page_offset; - memcpy(skb->data, va, MIN_SKB_SIZE); - skb_put(skb, MIN_SKB_SIZE); - skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, - pg_info->page, - pg_info->page_offset + - MIN_SKB_SIZE, - len - MIN_SKB_SIZE, - LIO_RXBUFFER_SZ); - } - } else { - struct octeon_skb_page_info *pg_info = - ((struct octeon_skb_page_info *)(skb->cb)); - skb_copy_to_linear_data(skb, page_address(pg_info->page) - + pg_info->page_offset, len); - skb_put(skb, len); - put_page(pg_info->page); - } - - r_dh_off = (rh->r_dh.len - 1) * BYTES_PER_DHLEN_UNIT; - - if (oct->ptp_enable) { - if (rh->r_dh.has_hwtstamp) { - /* timestamp is included from the hardware at - * the beginning of the packet. - */ - if (ifstate_check - (lio, LIO_IFSTATE_RX_TIMESTAMP_ENABLED)) { - /* Nanoseconds are in the first 64-bits - * of the packet. - */ - memcpy(&ns, (skb->data + r_dh_off), - sizeof(ns)); - r_dh_off -= BYTES_PER_DHLEN_UNIT; - shhwtstamps = skb_hwtstamps(skb); - shhwtstamps->hwtstamp = - ns_to_ktime(ns + - lio->ptp_adjust); - } - } - } - - if (rh->r_dh.has_hash) { - __be32 *hash_be = (__be32 *)(skb->data + r_dh_off); - u32 hash = be32_to_cpu(*hash_be); - - skb_set_hash(skb, hash, PKT_HASH_TYPE_L4); - r_dh_off -= BYTES_PER_DHLEN_UNIT; - } - - skb_pull(skb, rh->r_dh.len * BYTES_PER_DHLEN_UNIT); - - skb->protocol = eth_type_trans(skb, skb->dev); - if ((netdev->features & NETIF_F_RXCSUM) && - (((rh->r_dh.encap_on) && - (rh->r_dh.csum_verified & CNNIC_TUN_CSUM_VERIFIED)) || - (!(rh->r_dh.encap_on) && - (rh->r_dh.csum_verified & CNNIC_CSUM_VERIFIED)))) - /* checksum has already been verified */ - skb->ip_summed = CHECKSUM_UNNECESSARY; - else - skb->ip_summed = CHECKSUM_NONE; - - /* Setting Encapsulation field on basis of status received - * from the firmware - */ - if (rh->r_dh.encap_on) { - skb->encapsulation = 1; - skb->csum_level = 1; - droq->stats.rx_vxlan++; - } - - /* inbound VLAN tag */ - if ((netdev->features & NETIF_F_HW_VLAN_CTAG_RX) && - (rh->r_dh.vlan != 0)) { - u16 vid = rh->r_dh.vlan; - u16 priority = rh->r_dh.priority; - - vtag = priority << 13 | vid; - __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vtag); - } - - packet_was_received = napi_gro_receive(napi, skb) != GRO_DROP; - - if (packet_was_received) { - droq->stats.rx_bytes_received += len; - droq->stats.rx_pkts_received++; - } else { - droq->stats.rx_dropped++; - netif_info(lio, rx_err, lio->netdev, - "droq:%d error rx_dropped:%llu\n", - droq->q_no, droq->stats.rx_dropped); - } - - } else { - recv_buffer_free(skb); - } -} - /** * \brief wrapper for calling napi_schedule * @param param parameters to pass to napi_schedule diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c index a6efd75..013a861 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c @@ -1376,134 +1376,6 @@ static void if_cfg_callback(struct octeon_device *oct, wake_up_interruptible(&ctx->wc); } -/** Routine to push packets arriving on Octeon interface upto network layer. - * @param oct_id - octeon device id. - * @param skbuff - skbuff struct to be passed to network layer. - * @param len - size of total data received. - * @param rh - Control header associated with the packet - * @param param - additional control data with the packet - * @param arg - farg registered in droq_ops - */ -static void -liquidio_push_packet(u32 octeon_id __attribute__((unused)), - void *skbuff, - u32 len, - union octeon_rh *rh, - void *param, - void *arg) -{ - struct napi_struct *napi = param; - struct octeon_droq *droq = - container_of(param, struct octeon_droq, napi); - struct net_device *netdev = (struct net_device *)arg; - struct sk_buff *skb = (struct sk_buff *)skbuff; - u16 vtag = 0; - u32 r_dh_off; - - if (netdev) { - struct lio *lio = GET_LIO(netdev); - int packet_was_received; - - /* Do not proceed if the interface is not in RUNNING state. */ - if (!ifstate_check(lio, LIO_IFSTATE_RUNNING)) { - recv_buffer_free(skb); - droq->stats.rx_dropped++; - return; - } - - skb->dev = netdev; - - skb_record_rx_queue(skb, droq->q_no); - if (likely(len > MIN_SKB_SIZE)) { - struct octeon_skb_page_info *pg_info; - unsigned char *va; - - pg_info = ((struct octeon_skb_page_info *)(skb->cb)); - if (pg_info->page) { - /* For Paged allocation use the frags */ - va = page_address(pg_info->page) + - pg_info->page_offset; - memcpy(skb->data, va, MIN_SKB_SIZE); - skb_put(skb, MIN_SKB_SIZE); - skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, - pg_info->page, - pg_info->page_offset + - MIN_SKB_SIZE, - len - MIN_SKB_SIZE, - LIO_RXBUFFER_SZ); - } - } else { - struct octeon_skb_page_info *pg_info = - ((struct octeon_skb_page_info *)(skb->cb)); - skb_copy_to_linear_data(skb, - page_address(pg_info->page) + - pg_info->page_offset, len); - skb_put(skb, len); - put_page(pg_info->page); - } - - r_dh_off = (rh->r_dh.len - 1) * BYTES_PER_DHLEN_UNIT; - - if (rh->r_dh.has_hwtstamp) - r_dh_off -= BYTES_PER_DHLEN_UNIT; - - if (rh->r_dh.has_hash) { - __be32 *hash_be = (__be32 *)(skb->data + r_dh_off); - u32 hash = be32_to_cpu(*hash_be); - - skb_set_hash(skb, hash, PKT_HASH_TYPE_L4); - r_dh_off -= BYTES_PER_DHLEN_UNIT; - } - - skb_pull(skb, rh->r_dh.len * BYTES_PER_DHLEN_UNIT); - skb->protocol = eth_type_trans(skb, skb->dev); - - if ((netdev->features & NETIF_F_RXCSUM) && - (((rh->r_dh.encap_on) && - (rh->r_dh.csum_verified & CNNIC_TUN_CSUM_VERIFIED)) || - (!(rh->r_dh.encap_on) && - (rh->r_dh.csum_verified & CNNIC_CSUM_VERIFIED)))) - /* checksum has already been verified */ - skb->ip_summed = CHECKSUM_UNNECESSARY; - else - skb->ip_summed = CHECKSUM_NONE; - - /* Setting Encapsulation field on basis of status received - * from the firmware - */ - if (rh->r_dh.encap_on) { - skb->encapsulation = 1; - skb->csum_level = 1; - droq->stats.rx_vxlan++; - } - - /* inbound VLAN tag */ - if ((netdev->features & NETIF_F_HW_VLAN_CTAG_RX) && - rh->r_dh.vlan) { - u16 priority = rh->r_dh.priority; - u16 vid = rh->r_dh.vlan; - - vtag = (priority << VLAN_PRIO_SHIFT) | vid; - __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vtag); - } - - packet_was_received = (napi_gro_receive(napi, skb) != GRO_DROP); - - if (packet_was_received) { - droq->stats.rx_bytes_received += len; - droq->stats.rx_pkts_received++; - } else { - droq->stats.rx_dropped++; - netif_info(lio, rx_err, lio->netdev, - "droq:%d error rx_dropped:%llu\n", - droq->q_no, droq->stats.rx_dropped); - } - - } else { - recv_buffer_free(skb); - } -} - /** * \brief callback when receive interrupt occurs and we are in NAPI mode * @param arg pointer to octeon output queue diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_network.h b/drivers/net/ethernet/cavium/liquidio/octeon_network.h index b2bb34d..5d78fd6 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_network.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_network.h @@ -477,4 +477,11 @@ static inline int wait_for_pending_requests(struct octeon_device *oct) void lio_update_txq_status(struct octeon_device *oct, int iq_num); int octeon_setup_droq(struct octeon_device *oct, int q_no, int num_descs, int desc_size, void *app_ctx); +void +liquidio_push_packet(u32 octeon_id __attribute__((unused)), + void *skbuff, + u32 len, + union octeon_rh *rh, + void *param, + void *arg); #endif