summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVijay Khemka <vijaykhemka@fb.com>2018-11-26 16:49:04 -0500
committerDavid S. Miller <davem@davemloft.net>2018-11-27 19:37:20 -0500
commit16e8c4ca21a238cdf0355475bf15bd72e92feb8f (patch)
tree74e7c21f748520d0028dfb76fdd2c7a210e854f9
parentbd7153bd83b806bfcc2e79b7a6f43aa653d06ef3 (diff)
net/ncsi: Add NCSI Mellanox OEM command
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>
-rw-r--r--net/ncsi/internal.h5
-rw-r--r--net/ncsi/ncsi-manage.c28
-rw-r--r--net/ncsi/ncsi-pkt.h9
-rw-r--r--net/ncsi/ncsi-rsp.c41
4 files changed, 81 insertions, 2 deletions
diff --git a/net/ncsi/internal.h b/net/ncsi/internal.h
index 9e3642b802c4..87505600dbb2 100644
--- a/net/ncsi/internal.h
+++ b/net/ncsi/internal.h
@@ -73,10 +73,15 @@ enum {
73#define NCSI_OEM_MFR_BCM_ID 0x113d 73#define NCSI_OEM_MFR_BCM_ID 0x113d
74/* Broadcom specific OEM Command */ 74/* Broadcom specific OEM Command */
75#define NCSI_OEM_BCM_CMD_GMA 0x01 /* CMD ID for Get MAC */ 75#define NCSI_OEM_BCM_CMD_GMA 0x01 /* CMD ID for Get MAC */
76/* Mellanox specific OEM Command */
77#define NCSI_OEM_MLX_CMD_GMA 0x00 /* CMD ID for Get MAC */
78#define NCSI_OEM_MLX_CMD_GMA_PARAM 0x1b /* Parameter for GMA */
76/* OEM Command payload lengths*/ 79/* OEM Command payload lengths*/
77#define NCSI_OEM_BCM_CMD_GMA_LEN 12 80#define NCSI_OEM_BCM_CMD_GMA_LEN 12
81#define NCSI_OEM_MLX_CMD_GMA_LEN 8
78/* Mac address offset in OEM response */ 82/* Mac address offset in OEM response */
79#define BCM_MAC_ADDR_OFFSET 28 83#define BCM_MAC_ADDR_OFFSET 28
84#define MLX_MAC_ADDR_OFFSET 8
80 85
81 86
82struct ncsi_channel_version { 87struct ncsi_channel_version {
diff --git a/net/ncsi/ncsi-manage.c b/net/ncsi/ncsi-manage.c
index 92e59f07f9a7..31359d5e14ad 100644
--- a/net/ncsi/ncsi-manage.c
+++ b/net/ncsi/ncsi-manage.c
@@ -710,12 +710,38 @@ static int ncsi_oem_gma_handler_bcm(struct ncsi_cmd_arg *nca)
710 return ret; 710 return ret;
711} 711}
712 712
713static int ncsi_oem_gma_handler_mlx(struct ncsi_cmd_arg *nca)
714{
715 union {
716 u8 data_u8[NCSI_OEM_MLX_CMD_GMA_LEN];
717 u32 data_u32[NCSI_OEM_MLX_CMD_GMA_LEN / sizeof(u32)];
718 } u;
719 int ret = 0;
720
721 nca->payload = NCSI_OEM_MLX_CMD_GMA_LEN;
722
723 memset(&u, 0, sizeof(u));
724 u.data_u32[0] = ntohl(NCSI_OEM_MFR_MLX_ID);
725 u.data_u8[5] = NCSI_OEM_MLX_CMD_GMA;
726 u.data_u8[6] = NCSI_OEM_MLX_CMD_GMA_PARAM;
727
728 nca->data = u.data_u8;
729
730 ret = ncsi_xmit_cmd(nca);
731 if (ret)
732 netdev_err(nca->ndp->ndev.dev,
733 "NCSI: Failed to transmit cmd 0x%x during configure\n",
734 nca->type);
735 return ret;
736}
737
713/* OEM Command handlers initialization */ 738/* OEM Command handlers initialization */
714static struct ncsi_oem_gma_handler { 739static struct ncsi_oem_gma_handler {
715 unsigned int mfr_id; 740 unsigned int mfr_id;
716 int (*handler)(struct ncsi_cmd_arg *nca); 741 int (*handler)(struct ncsi_cmd_arg *nca);
717} ncsi_oem_gma_handlers[] = { 742} ncsi_oem_gma_handlers[] = {
718 { NCSI_OEM_MFR_BCM_ID, ncsi_oem_gma_handler_bcm } 743 { NCSI_OEM_MFR_BCM_ID, ncsi_oem_gma_handler_bcm },
744 { NCSI_OEM_MFR_MLX_ID, ncsi_oem_gma_handler_mlx }
719}; 745};
720 746
721static int ncsi_gma_handler(struct ncsi_cmd_arg *nca, unsigned int mf_id) 747static int ncsi_gma_handler(struct ncsi_cmd_arg *nca, unsigned int mf_id)
diff --git a/net/ncsi/ncsi-pkt.h b/net/ncsi/ncsi-pkt.h
index 4d3f06be38bd..2a6d83a596c9 100644
--- a/net/ncsi/ncsi-pkt.h
+++ b/net/ncsi/ncsi-pkt.h
@@ -165,6 +165,15 @@ struct ncsi_rsp_oem_pkt {
165 unsigned char data[]; /* Payload data */ 165 unsigned char data[]; /* Payload data */
166}; 166};
167 167
168/* Mellanox Response Data */
169struct ncsi_rsp_oem_mlx_pkt {
170 unsigned char cmd_rev; /* Command Revision */
171 unsigned char cmd; /* Command ID */
172 unsigned char param; /* Parameter */
173 unsigned char optional; /* Optional data */
174 unsigned char data[]; /* Data */
175};
176
168/* Broadcom Response Data */ 177/* Broadcom Response Data */
169struct ncsi_rsp_oem_bcm_pkt { 178struct ncsi_rsp_oem_bcm_pkt {
170 unsigned char ver; /* Payload Version */ 179 unsigned char ver; /* Payload Version */
diff --git a/net/ncsi/ncsi-rsp.c b/net/ncsi/ncsi-rsp.c
index de7737a27889..dc07fcc7938e 100644
--- a/net/ncsi/ncsi-rsp.c
+++ b/net/ncsi/ncsi-rsp.c
@@ -611,6 +611,45 @@ static int ncsi_rsp_handler_snfc(struct ncsi_request *nr)
611 return 0; 611 return 0;
612} 612}
613 613
614/* Response handler for Mellanox command Get Mac Address */
615static int ncsi_rsp_handler_oem_mlx_gma(struct ncsi_request *nr)
616{
617 struct ncsi_dev_priv *ndp = nr->ndp;
618 struct net_device *ndev = ndp->ndev.dev;
619 const struct net_device_ops *ops = ndev->netdev_ops;
620 struct ncsi_rsp_oem_pkt *rsp;
621 struct sockaddr saddr;
622 int ret = 0;
623
624 /* Get the response header */
625 rsp = (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp);
626
627 saddr.sa_family = ndev->type;
628 ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
629 memcpy(saddr.sa_data, &rsp->data[MLX_MAC_ADDR_OFFSET], ETH_ALEN);
630 ret = ops->ndo_set_mac_address(ndev, &saddr);
631 if (ret < 0)
632 netdev_warn(ndev, "NCSI: 'Writing mac address to device failed\n");
633
634 return ret;
635}
636
637/* Response handler for Mellanox card */
638static int ncsi_rsp_handler_oem_mlx(struct ncsi_request *nr)
639{
640 struct ncsi_rsp_oem_mlx_pkt *mlx;
641 struct ncsi_rsp_oem_pkt *rsp;
642
643 /* Get the response header */
644 rsp = (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp);
645 mlx = (struct ncsi_rsp_oem_mlx_pkt *)(rsp->data);
646
647 if (mlx->cmd == NCSI_OEM_MLX_CMD_GMA &&
648 mlx->param == NCSI_OEM_MLX_CMD_GMA_PARAM)
649 return ncsi_rsp_handler_oem_mlx_gma(nr);
650 return 0;
651}
652
614/* Response handler for Broadcom command Get Mac Address */ 653/* Response handler for Broadcom command Get Mac Address */
615static int ncsi_rsp_handler_oem_bcm_gma(struct ncsi_request *nr) 654static int ncsi_rsp_handler_oem_bcm_gma(struct ncsi_request *nr)
616{ 655{
@@ -655,7 +694,7 @@ static struct ncsi_rsp_oem_handler {
655 unsigned int mfr_id; 694 unsigned int mfr_id;
656 int (*handler)(struct ncsi_request *nr); 695 int (*handler)(struct ncsi_request *nr);
657} ncsi_rsp_oem_handlers[] = { 696} ncsi_rsp_oem_handlers[] = {
658 { NCSI_OEM_MFR_MLX_ID, NULL }, 697 { NCSI_OEM_MFR_MLX_ID, ncsi_rsp_handler_oem_mlx },
659 { NCSI_OEM_MFR_BCM_ID, ncsi_rsp_handler_oem_bcm } 698 { NCSI_OEM_MFR_BCM_ID, ncsi_rsp_handler_oem_bcm }
660}; 699};
661 700