RDMA/erdma: Support dynamic mtu
Hardware now support jumbo frame for RDMA. So we introduce a new CMDQ message to support mtu change notification. Signed-off-by: Cheng Xu <chengyou@linux.alibaba.com> Link: https://lore.kernel.org/r/20220909093822.33868-5-chengyou@linux.alibaba.com Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
parent
a3c278807a
commit
9bdb9350f3
@ -197,6 +197,7 @@ struct erdma_dev {
|
||||
struct erdma_devattr attrs;
|
||||
/* physical port state (only one port per device) */
|
||||
enum ib_port_state state;
|
||||
u32 mtu;
|
||||
|
||||
/* cmdq and aeq use the same msix vector */
|
||||
struct erdma_irq comm_irq;
|
||||
|
@ -153,6 +153,7 @@ enum CMDQ_COMMON_OPCODE {
|
||||
CMDQ_OPCODE_CREATE_EQ = 0,
|
||||
CMDQ_OPCODE_DESTROY_EQ = 1,
|
||||
CMDQ_OPCODE_QUERY_FW_INFO = 2,
|
||||
CMDQ_OPCODE_CONF_MTU = 3,
|
||||
};
|
||||
|
||||
/* cmdq-SQE HDR */
|
||||
@ -190,6 +191,11 @@ struct erdma_cmdq_destroy_eq_req {
|
||||
u8 qtype;
|
||||
};
|
||||
|
||||
struct erdma_cmdq_config_mtu_req {
|
||||
u64 hdr;
|
||||
u32 mtu;
|
||||
};
|
||||
|
||||
/* create_cq cfg0 */
|
||||
#define ERDMA_CMD_CREATE_CQ_DEPTH_MASK GENMASK(31, 24)
|
||||
#define ERDMA_CMD_CREATE_CQ_PAGESIZE_MASK GENMASK(23, 20)
|
||||
|
@ -34,10 +34,15 @@ static int erdma_netdev_event(struct notifier_block *nb, unsigned long event,
|
||||
dev->state = IB_PORT_DOWN;
|
||||
erdma_port_event(dev, IB_EVENT_PORT_ERR);
|
||||
break;
|
||||
case NETDEV_CHANGEMTU:
|
||||
if (dev->mtu != netdev->mtu) {
|
||||
erdma_set_mtu(dev, netdev->mtu);
|
||||
dev->mtu = netdev->mtu;
|
||||
}
|
||||
break;
|
||||
case NETDEV_REGISTER:
|
||||
case NETDEV_UNREGISTER:
|
||||
case NETDEV_CHANGEADDR:
|
||||
case NETDEV_CHANGEMTU:
|
||||
case NETDEV_GOING_DOWN:
|
||||
case NETDEV_CHANGE:
|
||||
default:
|
||||
@ -95,6 +100,7 @@ static int erdma_device_register(struct erdma_dev *dev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
dev->mtu = dev->netdev->mtu;
|
||||
addrconf_addr_eui48((u8 *)&ibdev->node_guid, dev->netdev->dev_addr);
|
||||
|
||||
ret = ib_register_device(ibdev, "erdma_%d", &dev->pdev->dev);
|
||||
|
@ -1436,6 +1436,17 @@ err_out_xa:
|
||||
return ret;
|
||||
}
|
||||
|
||||
void erdma_set_mtu(struct erdma_dev *dev, u32 mtu)
|
||||
{
|
||||
struct erdma_cmdq_config_mtu_req req;
|
||||
|
||||
erdma_cmdq_build_reqhdr(&req.hdr, CMDQ_SUBMOD_COMMON,
|
||||
CMDQ_OPCODE_CONF_MTU);
|
||||
req.mtu = mtu;
|
||||
|
||||
erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL);
|
||||
}
|
||||
|
||||
void erdma_port_event(struct erdma_dev *dev, enum ib_event_type reason)
|
||||
{
|
||||
struct ib_event event;
|
||||
|
@ -330,5 +330,6 @@ struct ib_mr *erdma_ib_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
|
||||
int erdma_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
|
||||
unsigned int *sg_offset);
|
||||
void erdma_port_event(struct erdma_dev *dev, enum ib_event_type reason);
|
||||
void erdma_set_mtu(struct erdma_dev *dev, u32 mtu);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user