@@ -491,11 +491,79 @@ int mana_ib_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attr,
491491 return - EINVAL ;
492492}
493493
494+ static int mana_ib_gd_modify_qp (struct ib_qp * ibqp , struct ib_qp_attr * attr ,
495+ int attr_mask , struct ib_udata * udata )
496+ {
497+ struct mana_ib_dev * mdev = container_of (ibqp -> device , struct mana_ib_dev , ib_dev );
498+ struct mana_ib_qp * qp = container_of (ibqp , struct mana_ib_qp , ibqp );
499+ struct mana_rnic_set_qp_state_resp resp = {};
500+ struct mana_rnic_set_qp_state_req req = {};
501+ struct gdma_context * gc = mdev_to_gc (mdev );
502+ struct mana_port_context * mpc ;
503+ struct net_device * ndev ;
504+ int err ;
505+
506+ mana_gd_init_req_hdr (& req .hdr , MANA_IB_SET_QP_STATE , sizeof (req ), sizeof (resp ));
507+ req .hdr .dev_id = gc -> mana_ib .dev_id ;
508+ req .adapter = mdev -> adapter_handle ;
509+ req .qp_handle = qp -> qp_handle ;
510+ req .qp_state = attr -> qp_state ;
511+ req .attr_mask = attr_mask ;
512+ req .path_mtu = attr -> path_mtu ;
513+ req .rq_psn = attr -> rq_psn ;
514+ req .sq_psn = attr -> sq_psn ;
515+ req .dest_qpn = attr -> dest_qp_num ;
516+ req .max_dest_rd_atomic = attr -> max_dest_rd_atomic ;
517+ req .retry_cnt = attr -> retry_cnt ;
518+ req .rnr_retry = attr -> rnr_retry ;
519+ req .min_rnr_timer = attr -> min_rnr_timer ;
520+ if (attr_mask & IB_QP_AV ) {
521+ ndev = mana_ib_get_netdev (& mdev -> ib_dev , ibqp -> port );
522+ if (!ndev ) {
523+ ibdev_dbg (& mdev -> ib_dev , "Invalid port %u in QP %u\n" ,
524+ ibqp -> port , ibqp -> qp_num );
525+ return - EINVAL ;
526+ }
527+ mpc = netdev_priv (ndev );
528+ copy_in_reverse (req .ah_attr .src_mac , mpc -> mac_addr , ETH_ALEN );
529+ copy_in_reverse (req .ah_attr .dest_mac , attr -> ah_attr .roce .dmac , ETH_ALEN );
530+ copy_in_reverse (req .ah_attr .src_addr , attr -> ah_attr .grh .sgid_attr -> gid .raw ,
531+ sizeof (union ib_gid ));
532+ copy_in_reverse (req .ah_attr .dest_addr , attr -> ah_attr .grh .dgid .raw ,
533+ sizeof (union ib_gid ));
534+ if (rdma_gid_attr_network_type (attr -> ah_attr .grh .sgid_attr ) == RDMA_NETWORK_IPV4 ) {
535+ req .ah_attr .src_addr_type = SGID_TYPE_IPV4 ;
536+ req .ah_attr .dest_addr_type = SGID_TYPE_IPV4 ;
537+ } else {
538+ req .ah_attr .src_addr_type = SGID_TYPE_IPV6 ;
539+ req .ah_attr .dest_addr_type = SGID_TYPE_IPV6 ;
540+ }
541+ req .ah_attr .dest_port = ROCE_V2_UDP_DPORT ;
542+ req .ah_attr .src_port = rdma_get_udp_sport (attr -> ah_attr .grh .flow_label ,
543+ ibqp -> qp_num , attr -> dest_qp_num );
544+ req .ah_attr .traffic_class = attr -> ah_attr .grh .traffic_class ;
545+ req .ah_attr .hop_limit = attr -> ah_attr .grh .hop_limit ;
546+ }
547+
548+ err = mana_gd_send_request (gc , sizeof (req ), & req , sizeof (resp ), & resp );
549+ if (err ) {
550+ ibdev_err (& mdev -> ib_dev , "Failed modify qp err %d" , err );
551+ return err ;
552+ }
553+
554+ return 0 ;
555+ }
556+
494557int mana_ib_modify_qp (struct ib_qp * ibqp , struct ib_qp_attr * attr ,
495558 int attr_mask , struct ib_udata * udata )
496559{
497- /* modify_qp is not supported by this version of the driver */
498- return - EOPNOTSUPP ;
560+ switch (ibqp -> qp_type ) {
561+ case IB_QPT_RC :
562+ return mana_ib_gd_modify_qp (ibqp , attr , attr_mask , udata );
563+ default :
564+ ibdev_dbg (ibqp -> device , "Modify QP type %u not supported" , ibqp -> qp_type );
565+ return - EOPNOTSUPP ;
566+ }
499567}
500568
501569static int mana_ib_destroy_qp_rss (struct mana_ib_qp * qp ,
0 commit comments