diff options
-rw-r--r-- | net/ncsi/internal.h | 5 | ||||
-rw-r--r-- | net/ncsi/ncsi-manage.c | 28 | ||||
-rw-r--r-- | net/ncsi/ncsi-pkt.h | 9 | ||||
-rw-r--r-- | net/ncsi/ncsi-rsp.c | 41 |
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 | ||
82 | struct ncsi_channel_version { | 87 | struct 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 | ||
713 | static 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 */ |
714 | static struct ncsi_oem_gma_handler { | 739 | static 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 | ||
721 | static int ncsi_gma_handler(struct ncsi_cmd_arg *nca, unsigned int mf_id) | 747 | static 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 */ | ||
169 | struct 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 */ |
169 | struct ncsi_rsp_oem_bcm_pkt { | 178 | struct 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 */ | ||
615 | static 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 */ | ||
638 | static 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 */ |
615 | static int ncsi_rsp_handler_oem_bcm_gma(struct ncsi_request *nr) | 654 | static 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 | ||