Skip to content

Commit 205b95f

Browse files
Ivan Mikhaylovkuba-moo
authored andcommitted
net/ncsi: add get MAC address command to get Intel i210 MAC address
This patch adds OEM Intel GMA command and response handler for it. Signed-off-by: Brad Ho <[email protected]> Signed-off-by: Paul Fertser <[email protected]> Signed-off-by: Ivan Mikhaylov <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 5240118 commit 205b95f

File tree

4 files changed

+75
-1
lines changed

4 files changed

+75
-1
lines changed

net/ncsi/internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ enum {
8080
#define NCSI_OEM_MFR_BCM_ID 0x113d
8181
#define NCSI_OEM_MFR_INTEL_ID 0x157
8282
/* Intel specific OEM command */
83+
#define NCSI_OEM_INTEL_CMD_GMA 0x06 /* CMD ID for Get MAC */
8384
#define NCSI_OEM_INTEL_CMD_KEEP_PHY 0x20 /* CMD ID for Keep PHY up */
8485
/* Broadcom specific OEM Command */
8586
#define NCSI_OEM_BCM_CMD_GMA 0x01 /* CMD ID for Get MAC */
@@ -89,6 +90,7 @@ enum {
8990
#define NCSI_OEM_MLX_CMD_SMAF 0x01 /* CMD ID for Set MC Affinity */
9091
#define NCSI_OEM_MLX_CMD_SMAF_PARAM 0x07 /* Parameter for SMAF */
9192
/* OEM Command payload lengths*/
93+
#define NCSI_OEM_INTEL_CMD_GMA_LEN 5
9294
#define NCSI_OEM_INTEL_CMD_KEEP_PHY_LEN 7
9395
#define NCSI_OEM_BCM_CMD_GMA_LEN 12
9496
#define NCSI_OEM_MLX_CMD_GMA_LEN 8
@@ -99,6 +101,7 @@ enum {
99101
/* Mac address offset in OEM response */
100102
#define BCM_MAC_ADDR_OFFSET 28
101103
#define MLX_MAC_ADDR_OFFSET 8
104+
#define INTEL_MAC_ADDR_OFFSET 1
102105

103106

104107
struct ncsi_channel_version {

net/ncsi/ncsi-manage.c

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -795,13 +795,36 @@ static int ncsi_oem_smaf_mlx(struct ncsi_cmd_arg *nca)
795795
return ret;
796796
}
797797

798+
static int ncsi_oem_gma_handler_intel(struct ncsi_cmd_arg *nca)
799+
{
800+
unsigned char data[NCSI_OEM_INTEL_CMD_GMA_LEN];
801+
int ret = 0;
802+
803+
nca->payload = NCSI_OEM_INTEL_CMD_GMA_LEN;
804+
805+
memset(data, 0, NCSI_OEM_INTEL_CMD_GMA_LEN);
806+
*(unsigned int *)data = ntohl((__force __be32)NCSI_OEM_MFR_INTEL_ID);
807+
data[4] = NCSI_OEM_INTEL_CMD_GMA;
808+
809+
nca->data = data;
810+
811+
ret = ncsi_xmit_cmd(nca);
812+
if (ret)
813+
netdev_err(nca->ndp->ndev.dev,
814+
"NCSI: Failed to transmit cmd 0x%x during configure\n",
815+
nca->type);
816+
817+
return ret;
818+
}
819+
798820
/* OEM Command handlers initialization */
799821
static struct ncsi_oem_gma_handler {
800822
unsigned int mfr_id;
801823
int (*handler)(struct ncsi_cmd_arg *nca);
802824
} ncsi_oem_gma_handlers[] = {
803825
{ NCSI_OEM_MFR_BCM_ID, ncsi_oem_gma_handler_bcm },
804-
{ NCSI_OEM_MFR_MLX_ID, ncsi_oem_gma_handler_mlx }
826+
{ NCSI_OEM_MFR_MLX_ID, ncsi_oem_gma_handler_mlx },
827+
{ NCSI_OEM_MFR_INTEL_ID, ncsi_oem_gma_handler_intel }
805828
};
806829

807830
static int ncsi_gma_handler(struct ncsi_cmd_arg *nca, unsigned int mf_id)

net/ncsi/ncsi-pkt.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,12 @@ struct ncsi_rsp_oem_bcm_pkt {
178178
unsigned char data[]; /* Cmd specific Data */
179179
};
180180

181+
/* Intel Response Data */
182+
struct ncsi_rsp_oem_intel_pkt {
183+
unsigned char cmd; /* OEM Command ID */
184+
unsigned char data[]; /* Cmd specific Data */
185+
};
186+
181187
/* Get Link Status */
182188
struct ncsi_rsp_gls_pkt {
183189
struct ncsi_rsp_pkt_hdr rsp; /* Response header */

net/ncsi/ncsi-rsp.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,9 +699,51 @@ static int ncsi_rsp_handler_oem_bcm(struct ncsi_request *nr)
699699
return 0;
700700
}
701701

702+
/* Response handler for Intel command Get Mac Address */
703+
static int ncsi_rsp_handler_oem_intel_gma(struct ncsi_request *nr)
704+
{
705+
struct ncsi_dev_priv *ndp = nr->ndp;
706+
struct net_device *ndev = ndp->ndev.dev;
707+
const struct net_device_ops *ops = ndev->netdev_ops;
708+
struct ncsi_rsp_oem_pkt *rsp;
709+
struct sockaddr saddr;
710+
int ret = 0;
711+
712+
/* Get the response header */
713+
rsp = (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp);
714+
715+
saddr.sa_family = ndev->type;
716+
ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
717+
memcpy(saddr.sa_data, &rsp->data[INTEL_MAC_ADDR_OFFSET], ETH_ALEN);
718+
/* Increase mac address by 1 for BMC's address */
719+
eth_addr_inc((u8 *)saddr.sa_data);
720+
if (!is_valid_ether_addr((const u8 *)saddr.sa_data))
721+
return -ENXIO;
722+
723+
/* Set the flag for GMA command which should only be called once */
724+
ndp->gma_flag = 1;
725+
726+
ret = ops->ndo_set_mac_address(ndev, &saddr);
727+
if (ret < 0)
728+
netdev_warn(ndev,
729+
"NCSI: 'Writing mac address to device failed\n");
730+
731+
return ret;
732+
}
733+
702734
/* Response handler for Intel card */
703735
static int ncsi_rsp_handler_oem_intel(struct ncsi_request *nr)
704736
{
737+
struct ncsi_rsp_oem_intel_pkt *intel;
738+
struct ncsi_rsp_oem_pkt *rsp;
739+
740+
/* Get the response header */
741+
rsp = (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp);
742+
intel = (struct ncsi_rsp_oem_intel_pkt *)(rsp->data);
743+
744+
if (intel->cmd == NCSI_OEM_INTEL_CMD_GMA)
745+
return ncsi_rsp_handler_oem_intel_gma(nr);
746+
705747
return 0;
706748
}
707749

0 commit comments

Comments
 (0)