RDMA/mana_ib: Configure mac address in RNIC

Set local mac address in RNIC, which is required by the HW.

Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com>
Link: https://lore.kernel.org/r/1712738551-22075-7-git-send-email-kotaranov@linux.microsoft.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
Konstantin Taranov 2024-04-10 01:42:31 -07:00 committed by Leon Romanovsky
parent faafb8b126
commit 8859f009ac
3 changed files with 46 additions and 0 deletions

View File

@ -58,6 +58,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
struct net_device *upper_ndev; struct net_device *upper_ndev;
struct mana_context *mc; struct mana_context *mc;
struct mana_ib_dev *dev; struct mana_ib_dev *dev;
u8 mac_addr[ETH_ALEN];
int ret; int ret;
mc = mdev->driver_data; mc = mdev->driver_data;
@ -89,6 +90,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
ibdev_err(&dev->ib_dev, "Failed to get master netdev"); ibdev_err(&dev->ib_dev, "Failed to get master netdev");
goto free_ib_device; goto free_ib_device;
} }
ether_addr_copy(mac_addr, upper_ndev->dev_addr);
ret = ib_device_set_netdev(&dev->ib_dev, upper_ndev, 1); ret = ib_device_set_netdev(&dev->ib_dev, upper_ndev, 1);
rcu_read_unlock(); rcu_read_unlock();
if (ret) { if (ret) {
@ -121,6 +123,13 @@ static int mana_ib_probe(struct auxiliary_device *adev,
if (ret) if (ret)
goto destroy_eqs; goto destroy_eqs;
ret = mana_ib_gd_config_mac(dev, ADDR_OP_ADD, mac_addr);
if (ret) {
ibdev_err(&dev->ib_dev, "Failed to add Mac address, ret %d",
ret);
goto destroy_rnic;
}
ret = ib_register_device(&dev->ib_dev, "mana_%d", ret = ib_register_device(&dev->ib_dev, "mana_%d",
mdev->gdma_context->dev); mdev->gdma_context->dev);
if (ret) if (ret)

View File

@ -782,3 +782,25 @@ int mana_ib_gd_del_gid(const struct ib_gid_attr *attr, void **context)
return 0; return 0;
} }
int mana_ib_gd_config_mac(struct mana_ib_dev *mdev, enum mana_ib_addr_op op, u8 *mac)
{
struct mana_rnic_config_mac_addr_resp resp = {};
struct mana_rnic_config_mac_addr_req req = {};
struct gdma_context *gc = mdev_to_gc(mdev);
int err;
mana_gd_init_req_hdr(&req.hdr, MANA_IB_CONFIG_MAC_ADDR, sizeof(req), sizeof(resp));
req.hdr.dev_id = gc->mana_ib.dev_id;
req.adapter = mdev->adapter_handle;
req.op = op;
copy_in_reverse(req.mac_addr, mac, ETH_ALEN);
err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
if (err) {
ibdev_err(&mdev->ib_dev, "Failed to config Mac addr err %d", err);
return err;
}
return 0;
}

View File

@ -117,6 +117,7 @@ enum mana_ib_command_code {
MANA_IB_CREATE_ADAPTER = 0x30002, MANA_IB_CREATE_ADAPTER = 0x30002,
MANA_IB_DESTROY_ADAPTER = 0x30003, MANA_IB_DESTROY_ADAPTER = 0x30003,
MANA_IB_CONFIG_IP_ADDR = 0x30004, MANA_IB_CONFIG_IP_ADDR = 0x30004,
MANA_IB_CONFIG_MAC_ADDR = 0x30005,
}; };
struct mana_ib_query_adapter_caps_req { struct mana_ib_query_adapter_caps_req {
@ -188,6 +189,18 @@ struct mana_rnic_config_addr_resp {
struct gdma_resp_hdr hdr; struct gdma_resp_hdr hdr;
}; /* HW Data */ }; /* HW Data */
struct mana_rnic_config_mac_addr_req {
struct gdma_req_hdr hdr;
mana_handle_t adapter;
enum mana_ib_addr_op op;
u8 mac_addr[ETH_ALEN];
u8 reserved[6];
}; /* HW Data */
struct mana_rnic_config_mac_addr_resp {
struct gdma_resp_hdr hdr;
}; /* HW Data */
static inline struct gdma_context *mdev_to_gc(struct mana_ib_dev *mdev) static inline struct gdma_context *mdev_to_gc(struct mana_ib_dev *mdev)
{ {
return mdev->gdma_dev->gdma_context; return mdev->gdma_dev->gdma_context;
@ -305,4 +318,6 @@ enum rdma_link_layer mana_ib_get_link_layer(struct ib_device *device, u32 port_n
int mana_ib_gd_add_gid(const struct ib_gid_attr *attr, void **context); int mana_ib_gd_add_gid(const struct ib_gid_attr *attr, void **context);
int mana_ib_gd_del_gid(const struct ib_gid_attr *attr, void **context); int mana_ib_gd_del_gid(const struct ib_gid_attr *attr, void **context);
int mana_ib_gd_config_mac(struct mana_ib_dev *mdev, enum mana_ib_addr_op op, u8 *mac);
#endif #endif