]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
net/ncsi: Add NCSI Mellanox OEM command
authorVijay Khemka <vijaykhemka@fb.com>
Mon, 26 Nov 2018 21:49:04 +0000 (13:49 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 28 Nov 2018 00:37:20 +0000 (16:37 -0800)
This patch adds OEM Mellanox commands and response handling. It also
defines OEM Get MAC Address handler to get and configure the device.

ncsi_oem_gma_handler_mlx: This handler send NCSI mellanox command for
getting mac address.
ncsi_rsp_handler_oem_mlx: This handles response received for all
mellanox OEM commands.
ncsi_rsp_handler_oem_mlx_gma: This handles get mac address response and
set it to device.

Signed-off-by: Vijay Khemka <vijaykhemka@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ncsi/internal.h
net/ncsi/ncsi-manage.c
net/ncsi/ncsi-pkt.h
net/ncsi/ncsi-rsp.c

index 9e3642b802c435a0925ab66c4dbebb9940529b80..87505600dbb2d298a9af6b32c83d9fb24ea019bb 100644 (file)
@@ -73,10 +73,15 @@ enum {
 #define NCSI_OEM_MFR_BCM_ID             0x113d
 /* Broadcom specific OEM Command */
 #define NCSI_OEM_BCM_CMD_GMA            0x01   /* CMD ID for Get MAC */
+/* Mellanox specific OEM Command */
+#define NCSI_OEM_MLX_CMD_GMA            0x00   /* CMD ID for Get MAC */
+#define NCSI_OEM_MLX_CMD_GMA_PARAM      0x1b   /* Parameter for GMA  */
 /* OEM Command payload lengths*/
 #define NCSI_OEM_BCM_CMD_GMA_LEN        12
+#define NCSI_OEM_MLX_CMD_GMA_LEN        8
 /* Mac address offset in OEM response */
 #define BCM_MAC_ADDR_OFFSET             28
+#define MLX_MAC_ADDR_OFFSET             8
 
 
 struct ncsi_channel_version {
index 92e59f07f9a7406400d1624543d813645b00abf2..31359d5e14ad358e0c2c67d6050dcb7d06a3d105 100644 (file)
@@ -710,12 +710,38 @@ static int ncsi_oem_gma_handler_bcm(struct ncsi_cmd_arg *nca)
        return ret;
 }
 
+static int ncsi_oem_gma_handler_mlx(struct ncsi_cmd_arg *nca)
+{
+       union {
+               u8 data_u8[NCSI_OEM_MLX_CMD_GMA_LEN];
+               u32 data_u32[NCSI_OEM_MLX_CMD_GMA_LEN / sizeof(u32)];
+       } u;
+       int ret = 0;
+
+       nca->payload = NCSI_OEM_MLX_CMD_GMA_LEN;
+
+       memset(&u, 0, sizeof(u));
+       u.data_u32[0] = ntohl(NCSI_OEM_MFR_MLX_ID);
+       u.data_u8[5] = NCSI_OEM_MLX_CMD_GMA;
+       u.data_u8[6] = NCSI_OEM_MLX_CMD_GMA_PARAM;
+
+       nca->data = u.data_u8;
+
+       ret = ncsi_xmit_cmd(nca);
+       if (ret)
+               netdev_err(nca->ndp->ndev.dev,
+                          "NCSI: Failed to transmit cmd 0x%x during configure\n",
+                          nca->type);
+       return ret;
+}
+
 /* OEM Command handlers initialization */
 static struct ncsi_oem_gma_handler {
        unsigned int    mfr_id;
        int             (*handler)(struct ncsi_cmd_arg *nca);
 } ncsi_oem_gma_handlers[] = {
-       { NCSI_OEM_MFR_BCM_ID, ncsi_oem_gma_handler_bcm }
+       { NCSI_OEM_MFR_BCM_ID, ncsi_oem_gma_handler_bcm },
+       { NCSI_OEM_MFR_MLX_ID, ncsi_oem_gma_handler_mlx }
 };
 
 static int ncsi_gma_handler(struct ncsi_cmd_arg *nca, unsigned int mf_id)
index 4d3f06be38bd33fd1295a59e3ef329e10b9b7e24..2a6d83a596c9b8e081dde337c44ff19eaeb812ee 100644 (file)
@@ -165,6 +165,15 @@ struct ncsi_rsp_oem_pkt {
        unsigned char           data[];      /* Payload data      */
 };
 
+/* Mellanox Response Data */
+struct ncsi_rsp_oem_mlx_pkt {
+       unsigned char           cmd_rev;     /* Command Revision  */
+       unsigned char           cmd;         /* Command ID        */
+       unsigned char           param;       /* Parameter         */
+       unsigned char           optional;    /* Optional data     */
+       unsigned char           data[];      /* Data              */
+};
+
 /* Broadcom Response Data */
 struct ncsi_rsp_oem_bcm_pkt {
        unsigned char           ver;         /* Payload Version   */
index de7737a2788956ead425a87d9be74c6678ad7d16..dc07fcc7938ec4da2b95e43530fffc0f5aefe82b 100644 (file)
@@ -611,6 +611,45 @@ static int ncsi_rsp_handler_snfc(struct ncsi_request *nr)
        return 0;
 }
 
+/* Response handler for Mellanox command Get Mac Address */
+static int ncsi_rsp_handler_oem_mlx_gma(struct ncsi_request *nr)
+{
+       struct ncsi_dev_priv *ndp = nr->ndp;
+       struct net_device *ndev = ndp->ndev.dev;
+       const struct net_device_ops *ops = ndev->netdev_ops;
+       struct ncsi_rsp_oem_pkt *rsp;
+       struct sockaddr saddr;
+       int ret = 0;
+
+       /* Get the response header */
+       rsp = (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp);
+
+       saddr.sa_family = ndev->type;
+       ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
+       memcpy(saddr.sa_data, &rsp->data[MLX_MAC_ADDR_OFFSET], ETH_ALEN);
+       ret = ops->ndo_set_mac_address(ndev, &saddr);
+       if (ret < 0)
+               netdev_warn(ndev, "NCSI: 'Writing mac address to device failed\n");
+
+       return ret;
+}
+
+/* Response handler for Mellanox card */
+static int ncsi_rsp_handler_oem_mlx(struct ncsi_request *nr)
+{
+       struct ncsi_rsp_oem_mlx_pkt *mlx;
+       struct ncsi_rsp_oem_pkt *rsp;
+
+       /* Get the response header */
+       rsp = (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp);
+       mlx = (struct ncsi_rsp_oem_mlx_pkt *)(rsp->data);
+
+       if (mlx->cmd == NCSI_OEM_MLX_CMD_GMA &&
+           mlx->param == NCSI_OEM_MLX_CMD_GMA_PARAM)
+               return ncsi_rsp_handler_oem_mlx_gma(nr);
+       return 0;
+}
+
 /* Response handler for Broadcom command Get Mac Address */
 static int ncsi_rsp_handler_oem_bcm_gma(struct ncsi_request *nr)
 {
@@ -655,7 +694,7 @@ static struct ncsi_rsp_oem_handler {
        unsigned int    mfr_id;
        int             (*handler)(struct ncsi_request *nr);
 } ncsi_rsp_oem_handlers[] = {
-       { NCSI_OEM_MFR_MLX_ID, NULL },
+       { NCSI_OEM_MFR_MLX_ID, ncsi_rsp_handler_oem_mlx },
        { NCSI_OEM_MFR_BCM_ID, ncsi_rsp_handler_oem_bcm }
 };