Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/806684/?format=api
{ "id": 806684, "url": "http://patchwork.ozlabs.org/api/patches/806684/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/1503942035-24924-11-git-send-email-michael.chan@broadcom.com/", "project": { "id": 7, "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api", "name": "Linux network development", "link_name": "netdev", "list_id": "netdev.vger.kernel.org", "list_email": "netdev@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<1503942035-24924-11-git-send-email-michael.chan@broadcom.com>", "list_archive_url": null, "date": "2017-08-28T17:40:34", "name": "[net-next,10/11] bnxt_en: add TC flower offload flow_alloc/free FW cmds", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "e1e68a24dccce00677b8656d098d194d77dfe48b", "submitter": { "id": 68365, "url": "http://patchwork.ozlabs.org/api/people/68365/?format=api", "name": "Michael Chan", "email": "michael.chan@broadcom.com" }, "delegate": { "id": 34, "url": "http://patchwork.ozlabs.org/api/users/34/?format=api", "username": "davem", "first_name": "David", "last_name": "Miller", "email": "davem@davemloft.net" }, "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/1503942035-24924-11-git-send-email-michael.chan@broadcom.com/mbox/", "series": [ { "id": 225, "url": "http://patchwork.ozlabs.org/api/series/225/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=225", "date": "2017-08-28T17:40:24", "name": "bnxt_en: Updates.", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/225/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/806684/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/806684/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<netdev-owner@vger.kernel.org>", "X-Original-To": "patchwork-incoming@ozlabs.org", "Delivered-To": "patchwork-incoming@ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=broadcom.com header.i=@broadcom.com\n\theader.b=\"NCxI+ASK\"; dkim-atps=neutral" ], "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xgzbL3cMrz9sMN\n\tfor <patchwork-incoming@ozlabs.org>;\n\tTue, 29 Aug 2017 03:41:34 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751725AbdH1RlO (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tMon, 28 Aug 2017 13:41:14 -0400", "from mail-qk0-f180.google.com ([209.85.220.180]:37258 \"EHLO\n\tmail-qk0-f180.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751550AbdH1RlD (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Mon, 28 Aug 2017 13:41:03 -0400", "by mail-qk0-f180.google.com with SMTP id k126so5365475qkb.4\n\tfor <netdev@vger.kernel.org>; Mon, 28 Aug 2017 10:41:02 -0700 (PDT)", "from localhost.dhcp.broadcom.net ([192.19.255.250])\n\tby smtp.gmail.com with ESMTPSA id\n\t20sm592006qtu.52.2017.08.28.10.41.01\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tMon, 28 Aug 2017 10:41:01 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=broadcom.com; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=REMYWkFESCh4vdrRnB1yu85QTHHa0NbJdFseHxMRyZA=;\n\tb=NCxI+ASKB5TdoqhIFOtqqNyhzxND3Jp98BbIeMHefJYHdpmefntb98eZ32ovgt5pC0\n\to3Gg4NuHvXP/HU9dpWWPx2DKVLo4+Y3lQ+j9lCoOJVZfbczGuDsKciEQvKIMZgFitVkg\n\teTtOCVMf0/A983VDNbfZ9zedeS8ulS45iPgdY=", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=REMYWkFESCh4vdrRnB1yu85QTHHa0NbJdFseHxMRyZA=;\n\tb=SrzbORl8tZ5zFx2DhAwxiaaJMQ9ug4+ANN+t9TtQARpwFcsdA/ZWMjegyFOzdhazuf\n\tocDsB+SyB2WODRGhgRXqM1v/D68cN33kPYS7lFGjSniLV+Wu2dYWca4olI+Eq6nj6fMO\n\tryYx9m4eut2n6DBejDXSPtKGNjjkswc6cODnoD0BkvwPIVmI2mY17Q1OWjbU8VnKcGhB\n\t9K2EKz25wu5VV5m8W1+WnbH3hFCpcndaf9d33hCo7IDknzW9mixvGo4+jv1TB+obaK2+\n\tdtCBo5DLb6IM2AiMIC/4xkzgSNowsngZm/PzOb4cbb6ulipMLYgmh03moKi7SyKMAmAa\n\tGFHg==", "X-Gm-Message-State": "AHYfb5g654LsIIOkdjyZFAskv3vVAOTdfq47YdDj5Db3+s/VlAs/pkMN\n\tx4TbqODeh3zOY3uswhQ=", "X-Received": "by 10.55.78.80 with SMTP id c77mr1877171qkb.192.1503942062225;\n\tMon, 28 Aug 2017 10:41:02 -0700 (PDT)", "From": "Michael Chan <michael.chan@broadcom.com>", "To": "davem@davemloft.net", "Cc": "netdev@vger.kernel.org, Sathya Perla <sathya.perla@broadcom.com>", "Subject": "[PATCH net-next 10/11] bnxt_en: add TC flower offload\n\tflow_alloc/free FW cmds", "Date": "Mon, 28 Aug 2017 13:40:34 -0400", "Message-Id": "<1503942035-24924-11-git-send-email-michael.chan@broadcom.com>", "X-Mailer": "git-send-email 1.8.3.1", "In-Reply-To": "<1503942035-24924-1-git-send-email-michael.chan@broadcom.com>", "References": "<1503942035-24924-1-git-send-email-michael.chan@broadcom.com>", "Sender": "netdev-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<netdev.vger.kernel.org>", "X-Mailing-List": "netdev@vger.kernel.org" }, "content": "From: Sathya Perla <sathya.perla@broadcom.com>\n\nThis patch adds the hwrm_cfa_flow_alloc/free() routines\nthat are needed to issue the FW cmds needed for TC flower offload.\n\nSigned-off-by: Sathya Perla <sathya.perla@broadcom.com>\nSigned-off-by: Michael Chan <michael.chan@broadcom.com>\n---\n drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c | 141 ++++++++++++++++++++++++++-\n 1 file changed, 139 insertions(+), 2 deletions(-)", "diff": "diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c\nindex a10df27..5fa0835 100644\n--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c\n+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c\n@@ -259,13 +259,150 @@ static int bnxt_tc_parse_flow(struct bnxt *bp,\n \n static int bnxt_hwrm_cfa_flow_free(struct bnxt *bp, __le16 flow_handle)\n {\n-\treturn 0;\n+\tstruct hwrm_cfa_flow_free_input req = { 0 };\n+\tint rc;\n+\n+\tbnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_CFA_FLOW_FREE, -1, -1);\n+\treq.flow_handle = flow_handle;\n+\n+\trc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);\n+\tif (rc)\n+\t\tnetdev_info(bp->dev, \"Error: %s: flow_handle=0x%x rc=%d\",\n+\t\t\t __func__, flow_handle, rc);\n+\treturn rc;\n+}\n+\n+static int ipv6_mask_len(struct in6_addr *mask)\n+{\n+\tint mask_len = 0, i;\n+\n+\tfor (i = 0; i < 4; i++)\n+\t\tmask_len += inet_mask_len(mask->s6_addr32[i]);\n+\n+\treturn mask_len;\n+}\n+\n+static bool is_wildcard(void *mask, int len)\n+{\n+\tconst u8 *p = mask;\n+\tint i;\n+\n+\tfor (i = 0; i < len; i++) {\n+\t\tif (p[i] != 0)\n+\t\t\treturn false;\n+\t}\n+\treturn true;\n }\n \n static int bnxt_hwrm_cfa_flow_alloc(struct bnxt *bp, struct bnxt_tc_flow *flow,\n \t\t\t\t __le16 ref_flow_handle, __le16 *flow_handle)\n {\n-\treturn 0;\n+\tstruct hwrm_cfa_flow_alloc_output *resp = bp->hwrm_cmd_resp_addr;\n+\tstruct bnxt_tc_actions *actions = &flow->actions;\n+\tstruct bnxt_tc_l3_key *l3_mask = &flow->l3_mask;\n+\tstruct bnxt_tc_l3_key *l3_key = &flow->l3_key;\n+\tstruct hwrm_cfa_flow_alloc_input req = { 0 };\n+\tu16 flow_flags = 0, action_flags = 0;\n+\tint rc;\n+\n+\tbnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_CFA_FLOW_ALLOC, -1, -1);\n+\n+\treq.src_fid = cpu_to_le16(flow->src_fid);\n+\treq.ref_flow_handle = ref_flow_handle;\n+\treq.ethertype = flow->l2_key.ether_type;\n+\treq.ip_proto = flow->l4_key.ip_proto;\n+\n+\tif (flow->flags & BNXT_TC_FLOW_FLAGS_ETH_ADDRS) {\n+\t\tmemcpy(req.dmac, flow->l2_key.dmac, ETH_ALEN);\n+\t\tmemcpy(req.smac, flow->l2_key.smac, ETH_ALEN);\n+\t}\n+\n+\tif (flow->l2_key.num_vlans > 0) {\n+\t\tflow_flags |= CFA_FLOW_ALLOC_REQ_FLAGS_NUM_VLAN_ONE;\n+\t\t/* FW expects the inner_vlan_tci value to be set\n+\t\t * in outer_vlan_tci when num_vlans is 1 (which is\n+\t\t * always the case in TC.)\n+\t\t */\n+\t\treq.outer_vlan_tci = flow->l2_key.inner_vlan_tci;\n+\t}\n+\n+\t/* If all IP and L4 fields are wildcarded then this is an L2 flow */\n+\tif (is_wildcard(&l3_mask, sizeof(l3_mask)) &&\n+\t is_wildcard(&flow->l4_mask, sizeof(flow->l4_mask))) {\n+\t\tflow_flags |= CFA_FLOW_ALLOC_REQ_FLAGS_FLOWTYPE_L2;\n+\t} else {\n+\t\tflow_flags |= flow->l2_key.ether_type == htons(ETH_P_IP) ?\n+\t\t\t\tCFA_FLOW_ALLOC_REQ_FLAGS_FLOWTYPE_IPV4 :\n+\t\t\t\tCFA_FLOW_ALLOC_REQ_FLAGS_FLOWTYPE_IPV6;\n+\n+\t\tif (flow->flags & BNXT_TC_FLOW_FLAGS_IPV4_ADDRS) {\n+\t\t\treq.ip_dst[0] = l3_key->ipv4.daddr.s_addr;\n+\t\t\treq.ip_dst_mask_len =\n+\t\t\t\tinet_mask_len(l3_mask->ipv4.daddr.s_addr);\n+\t\t\treq.ip_src[0] = l3_key->ipv4.saddr.s_addr;\n+\t\t\treq.ip_src_mask_len =\n+\t\t\t\tinet_mask_len(l3_mask->ipv4.saddr.s_addr);\n+\t\t} else if (flow->flags & BNXT_TC_FLOW_FLAGS_IPV6_ADDRS) {\n+\t\t\tmemcpy(req.ip_dst, l3_key->ipv6.daddr.s6_addr32,\n+\t\t\t sizeof(req.ip_dst));\n+\t\t\treq.ip_dst_mask_len =\n+\t\t\t\t\tipv6_mask_len(&l3_mask->ipv6.daddr);\n+\t\t\tmemcpy(req.ip_src, l3_key->ipv6.saddr.s6_addr32,\n+\t\t\t sizeof(req.ip_src));\n+\t\t\treq.ip_src_mask_len =\n+\t\t\t\t\tipv6_mask_len(&l3_mask->ipv6.saddr);\n+\t\t}\n+\t}\n+\n+\tif (flow->flags & BNXT_TC_FLOW_FLAGS_PORTS) {\n+\t\treq.l4_src_port = flow->l4_key.ports.sport;\n+\t\treq.l4_src_port_mask = flow->l4_mask.ports.sport;\n+\t\treq.l4_dst_port = flow->l4_key.ports.dport;\n+\t\treq.l4_dst_port_mask = flow->l4_mask.ports.dport;\n+\t} else if (flow->flags & BNXT_TC_FLOW_FLAGS_ICMP) {\n+\t\t/* l4 ports serve as type/code when ip_proto is ICMP */\n+\t\treq.l4_src_port = htons(flow->l4_key.icmp.type);\n+\t\treq.l4_src_port_mask = htons(flow->l4_mask.icmp.type);\n+\t\treq.l4_dst_port = htons(flow->l4_key.icmp.code);\n+\t\treq.l4_dst_port_mask = htons(flow->l4_mask.icmp.code);\n+\t}\n+\treq.flags = cpu_to_le16(flow_flags);\n+\n+\tif (actions->flags & BNXT_TC_ACTION_FLAG_DROP) {\n+\t\taction_flags |= CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_DROP;\n+\t} else {\n+\t\tif (actions->flags & BNXT_TC_ACTION_FLAG_FWD) {\n+\t\t\taction_flags |= CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_FWD;\n+\t\t\treq.dst_fid = cpu_to_le16(actions->dst_fid);\n+\t\t}\n+\t\tif (actions->flags & BNXT_TC_ACTION_FLAG_PUSH_VLAN) {\n+\t\t\taction_flags |=\n+\t\t\t CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_L2_HEADER_REWRITE;\n+\t\t\treq.l2_rewrite_vlan_tpid = actions->push_vlan_tpid;\n+\t\t\treq.l2_rewrite_vlan_tci = actions->push_vlan_tci;\n+\t\t\tmemcpy(&req.l2_rewrite_dmac, &req.dmac, ETH_ALEN);\n+\t\t\tmemcpy(&req.l2_rewrite_smac, &req.smac, ETH_ALEN);\n+\t\t}\n+\t\tif (actions->flags & BNXT_TC_ACTION_FLAG_POP_VLAN) {\n+\t\t\taction_flags |=\n+\t\t\t CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_L2_HEADER_REWRITE;\n+\t\t\t/* Rewrite config with tpid = 0 implies vlan pop */\n+\t\t\treq.l2_rewrite_vlan_tpid = 0;\n+\t\t\tmemcpy(&req.l2_rewrite_dmac, &req.dmac, ETH_ALEN);\n+\t\t\tmemcpy(&req.l2_rewrite_smac, &req.smac, ETH_ALEN);\n+\t\t}\n+\t}\n+\treq.action_flags = cpu_to_le16(action_flags);\n+\n+\tmutex_lock(&bp->hwrm_cmd_lock);\n+\n+\trc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);\n+\tif (!rc)\n+\t\t*flow_handle = resp->flow_handle;\n+\n+\tmutex_unlock(&bp->hwrm_cmd_lock);\n+\n+\treturn rc;\n }\n \n static int bnxt_tc_put_l2_node(struct bnxt *bp,\n", "prefixes": [ "net-next", "10/11" ] }