net/ncsi: make one oem_gma function for all mfr id
authorIvan Mikhaylov <fr0st61te@gmail.com>
Wed, 7 Jun 2023 15:17:41 +0000 (18:17 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 23 Jul 2023 11:49:50 +0000 (13:49 +0200)
commit 74b449b98dccdf24288d562f9d207fa066da793d upstream.

Make the one Get Mac Address function for all manufacturers and change
this call in handlers accordingly.

Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Ivan Mikhaylov <fr0st61te@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/ncsi/ncsi-rsp.c

index 6447a09..91c4225 100644 (file)
@@ -611,14 +611,15 @@ 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)
+/* Response handler for Get Mac Address command */
+static int ncsi_rsp_handler_oem_gma(struct ncsi_request *nr, int mfr_id)
 {
        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;
+       u32 mac_addr_off = 0;
        int ret = 0;
 
        /* Get the response header */
@@ -626,7 +627,19 @@ static int ncsi_rsp_handler_oem_mlx_gma(struct ncsi_request *nr)
 
        saddr.sa_family = ndev->type;
        ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
-       memcpy(saddr.sa_data, &rsp->data[MLX_MAC_ADDR_OFFSET], ETH_ALEN);
+       if (mfr_id == NCSI_OEM_MFR_BCM_ID)
+               mac_addr_off = BCM_MAC_ADDR_OFFSET;
+       else if (mfr_id == NCSI_OEM_MFR_MLX_ID)
+               mac_addr_off = MLX_MAC_ADDR_OFFSET;
+       else if (mfr_id == NCSI_OEM_MFR_INTEL_ID)
+               mac_addr_off = INTEL_MAC_ADDR_OFFSET;
+
+       memcpy(saddr.sa_data, &rsp->data[mac_addr_off], ETH_ALEN);
+       if (mfr_id == NCSI_OEM_MFR_BCM_ID || mfr_id == NCSI_OEM_MFR_INTEL_ID)
+               eth_addr_inc((u8 *)saddr.sa_data);
+       if (!is_valid_ether_addr((const u8 *)saddr.sa_data))
+               return -ENXIO;
+
        /* Set the flag for GMA command which should only be called once */
        ndp->gma_flag = 1;
 
@@ -649,41 +662,10 @@ static int ncsi_rsp_handler_oem_mlx(struct ncsi_request *nr)
 
        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 ncsi_rsp_handler_oem_gma(nr, NCSI_OEM_MFR_MLX_ID);
        return 0;
 }
 
-/* Response handler for Broadcom command Get Mac Address */
-static int ncsi_rsp_handler_oem_bcm_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[BCM_MAC_ADDR_OFFSET], ETH_ALEN);
-       /* Increase mac address by 1 for BMC's address */
-       eth_addr_inc((u8 *)saddr.sa_data);
-       if (!is_valid_ether_addr((const u8 *)saddr.sa_data))
-               return -ENXIO;
-
-       /* Set the flag for GMA command which should only be called once */
-       ndp->gma_flag = 1;
-
-       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 Broadcom card */
 static int ncsi_rsp_handler_oem_bcm(struct ncsi_request *nr)
 {
@@ -695,42 +677,10 @@ static int ncsi_rsp_handler_oem_bcm(struct ncsi_request *nr)
        bcm = (struct ncsi_rsp_oem_bcm_pkt *)(rsp->data);
 
        if (bcm->type == NCSI_OEM_BCM_CMD_GMA)
-               return ncsi_rsp_handler_oem_bcm_gma(nr);
+               return ncsi_rsp_handler_oem_gma(nr, NCSI_OEM_MFR_BCM_ID);
        return 0;
 }
 
-/* Response handler for Intel command Get Mac Address */
-static int ncsi_rsp_handler_oem_intel_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[INTEL_MAC_ADDR_OFFSET], ETH_ALEN);
-       /* Increase mac address by 1 for BMC's address */
-       eth_addr_inc((u8 *)saddr.sa_data);
-       if (!is_valid_ether_addr((const u8 *)saddr.sa_data))
-               return -ENXIO;
-
-       /* Set the flag for GMA command which should only be called once */
-       ndp->gma_flag = 1;
-
-       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 Intel card */
 static int ncsi_rsp_handler_oem_intel(struct ncsi_request *nr)
 {
@@ -742,7 +692,7 @@ static int ncsi_rsp_handler_oem_intel(struct ncsi_request *nr)
        intel = (struct ncsi_rsp_oem_intel_pkt *)(rsp->data);
 
        if (intel->cmd == NCSI_OEM_INTEL_CMD_GMA)
-               return ncsi_rsp_handler_oem_intel_gma(nr);
+               return ncsi_rsp_handler_oem_gma(nr, NCSI_OEM_MFR_INTEL_ID);
 
        return 0;
 }