From mboxrd@z Thu Jan 1 00:00:00 1970 From: Subject: RE: [PATCH v3] net/ncsi: Add NCSI OEM command support Date: Thu, 4 Oct 2018 18:29:22 +0000 Message-ID: <4cd3286620a34e2583bb4804e1465ef3@AUSX13MPS306.AMER.DELL.COM> References: <20181003233222.3909359-1-vijaykhemka@fb.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable To: , , , , , , , Return-path: Received: from esa6.dell-outbound.iphmx.com ([68.232.149.229]:30222 "EHLO esa6.dell-outbound.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727407AbeJEBXz (ORCPT ); Thu, 4 Oct 2018 21:23:55 -0400 Received: from pps.filterd (m0089483.ppops.net [127.0.0.1]) by mx0b-00154901.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w94IIvDv088598 for ; Thu, 4 Oct 2018 14:29:25 -0400 Received: from esa4.dell-outbound2.iphmx.com (esa4.dell-outbound2.iphmx.com [68.232.154.98]) by mx0b-00154901.pphosted.com with ESMTP id 2mwp9x0pef-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 04 Oct 2018 14:29:25 -0400 In-Reply-To: <20181003233222.3909359-1-vijaykhemka@fb.com> Content-Language: en-US Sender: netdev-owner@vger.kernel.org List-ID: > This patch adds OEM commands and response handling. It also defines OEM > command and response structure as per NCSI specification along with its > handlers. >=20 > ncsi_cmd_handler_oem: This is a generic command request handler for OEM > commands > ncsi_rsp_handler_oem: This is a generic response handler for OEM commands >=20 > Signed-off-by: Vijay Khemka > --- > net/ncsi/internal.h | 5 +++++ > net/ncsi/ncsi-cmd.c | 30 +++++++++++++++++++++++++++--- > net/ncsi/ncsi-pkt.h | 14 ++++++++++++++ > net/ncsi/ncsi-rsp.c | 43 ++++++++++++++++++++++++++++++++++++++++++- > 4 files changed, 88 insertions(+), 4 deletions(-) >=20 > diff --git a/net/ncsi/internal.h b/net/ncsi/internal.h > index 8055e3965cef..3d0a33b874f5 100644 > --- a/net/ncsi/internal.h > +++ b/net/ncsi/internal.h > @@ -68,6 +68,10 @@ enum { > NCSI_MODE_MAX > }; > =20 > +/* OEM Vendor Manufacture ID */ > +#define NCSI_OEM_MFR_MLX_ID 0x8119 > +#define NCSI_OEM_MFR_BCM_ID 0x113d > + > struct ncsi_channel_version { > u32 version; /* Supported BCD encoded NCSI version */ > u32 alpha2; /* Supported BCD encoded NCSI version */ > @@ -305,6 +309,7 @@ struct ncsi_cmd_arg { > unsigned short words[8]; > unsigned int dwords[4]; > }; > + unsigned char *data; /* NCSI OEM data */ > }; > =20 > extern struct list_head ncsi_dev_list; > diff --git a/net/ncsi/ncsi-cmd.c b/net/ncsi/ncsi-cmd.c > index 7567ca63aae2..82b7d9201db8 100644 > --- a/net/ncsi/ncsi-cmd.c > +++ b/net/ncsi/ncsi-cmd.c > @@ -211,6 +211,25 @@ static int ncsi_cmd_handler_snfc(struct sk_buff *skb= , > return 0; > } > =20 > +static int ncsi_cmd_handler_oem(struct sk_buff *skb, > + struct ncsi_cmd_arg *nca) > +{ > + struct ncsi_cmd_oem_pkt *cmd; > + unsigned int len; > + > + len =3D sizeof(struct ncsi_cmd_pkt_hdr) + 4; > + if (nca->payload < 26) > + len +=3D 26; > + else > + len +=3D nca->payload; > + > + cmd =3D skb_put_zero(skb, len); > + memcpy(&cmd->mfr_id, nca->data, nca->payload); > + ncsi_cmd_build_header(&cmd->cmd.common, nca); > + > + return 0; > +} > + > static struct ncsi_cmd_handler { > unsigned char type; > int payload; > @@ -244,7 +263,7 @@ static struct ncsi_cmd_handler { > { NCSI_PKT_CMD_GNS, 0, ncsi_cmd_handler_default }, > { NCSI_PKT_CMD_GNPTS, 0, ncsi_cmd_handler_default }, > { NCSI_PKT_CMD_GPS, 0, ncsi_cmd_handler_default }, > - { NCSI_PKT_CMD_OEM, 0, NULL }, > + { NCSI_PKT_CMD_OEM, -1, ncsi_cmd_handler_oem }, > { NCSI_PKT_CMD_PLDM, 0, NULL }, > { NCSI_PKT_CMD_GPUUID, 0, ncsi_cmd_handler_default } > }; > @@ -316,8 +335,13 @@ int ncsi_xmit_cmd(struct ncsi_cmd_arg *nca) > return -ENOENT; > } > =20 > - /* Get packet payload length and allocate the request */ > - nca->payload =3D nch->payload; > + /* Get packet payload length and allocate the request > + * It is expected that if length set as negative in > + * handler structure means caller is initializing it > + * and setting length in nca before calling xmit function > + */ > + if (nch->payload >=3D 0) > + nca->payload =3D nch->payload; > nr =3D ncsi_alloc_command(nca); > if (!nr) > return -ENOMEM; > diff --git a/net/ncsi/ncsi-pkt.h b/net/ncsi/ncsi-pkt.h > index 91b4b66438df..0f2087c8d42a 100644 > --- a/net/ncsi/ncsi-pkt.h > +++ b/net/ncsi/ncsi-pkt.h > @@ -151,6 +151,20 @@ struct ncsi_cmd_snfc_pkt { > unsigned char pad[22]; > }; > =20 > +/* OEM Request Command as per NCSI Specification */ > +struct ncsi_cmd_oem_pkt { > + struct ncsi_cmd_pkt_hdr cmd; /* Command header */ > + __be32 mfr_id; /* Manufacture ID */ > + unsigned char data[]; /* OEM Payload Data */ > +}; > + > +/* OEM Response Packet as per NCSI Specification */ > +struct ncsi_rsp_oem_pkt { > + struct ncsi_rsp_pkt_hdr rsp; /* Command header */ > + __be32 mfr_id; /* Manufacture ID */ > + unsigned char data[]; /* Payload data */ > +}; > + > /* Get Link Status */ > struct ncsi_rsp_gls_pkt { > struct ncsi_rsp_pkt_hdr rsp; /* Response header */ > diff --git a/net/ncsi/ncsi-rsp.c b/net/ncsi/ncsi-rsp.c > index 930c1d3796f0..d66b34749027 100644 > --- a/net/ncsi/ncsi-rsp.c > +++ b/net/ncsi/ncsi-rsp.c > @@ -596,6 +596,47 @@ static int ncsi_rsp_handler_snfc(struct ncsi_request= *nr) > return 0; > } > =20 > +static struct ncsi_rsp_oem_handler { > + unsigned int mfr_id; > + int (*handler)(struct ncsi_request *nr); > +} ncsi_rsp_oem_handlers[] =3D { > + { NCSI_OEM_MFR_MLX_ID, NULL }, > + { NCSI_OEM_MFR_BCM_ID, NULL } > +}; > + > +/* Response handler for OEM command */ > +static int ncsi_rsp_handler_oem(struct ncsi_request *nr) > +{ > + struct ncsi_rsp_oem_pkt *rsp; > + struct ncsi_rsp_oem_handler *nrh =3D NULL; > + unsigned int mfr_id, i; > + > + /* Get the response header */ > + rsp =3D (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp); > + mfr_id =3D ntohl(rsp->mfr_id); > + > + /* Check for manufacturer id and Find the handler */ > + for (i =3D 0; i < ARRAY_SIZE(ncsi_rsp_oem_handlers); i++) { > + if (ncsi_rsp_oem_handlers[i].mfr_id =3D=3D mfr_id) { > + if (ncsi_rsp_oem_handlers[i].handler) > + nrh =3D &ncsi_rsp_oem_handlers[i]; > + else > + nrh =3D NULL; > + > + break; > + } > + } > + > + if (!nrh) { > + netdev_err(nr->ndp->ndev.dev, "Received unrecognized OEM packet with M= FR-ID (0x%x)\n", > + mfr_id); > + return -ENOENT; > + } > + > + /* Process the packet */ > + return nrh->handler(nr); > +} > + > static int ncsi_rsp_handler_gvi(struct ncsi_request *nr) > { > struct ncsi_rsp_gvi_pkt *rsp; > @@ -932,7 +973,7 @@ static struct ncsi_rsp_handler { > { NCSI_PKT_RSP_GNS, 172, ncsi_rsp_handler_gns }, > { NCSI_PKT_RSP_GNPTS, 172, ncsi_rsp_handler_gnpts }, > { NCSI_PKT_RSP_GPS, 8, ncsi_rsp_handler_gps }, > - { NCSI_PKT_RSP_OEM, 0, NULL }, > + { NCSI_PKT_RSP_OEM, -1, ncsi_rsp_handler_oem }, > { NCSI_PKT_RSP_PLDM, 0, NULL }, > { NCSI_PKT_RSP_GPUUID, 20, ncsi_rsp_handler_gpuuid } > }; > --=20 > 2.17.1 Reviewed-by: Justin Lee