11// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
22/* Copyright (c) 2015 - 2021 Intel Corporation */
33#include "main.h"
4+ #include <linux/net/intel/iidc_rdma_idpf.h>
45
56MODULE_ALIAS ("i40iw" );
67MODULE_DESCRIPTION ("Intel(R) Ethernet Protocol Driver for RDMA" );
@@ -46,6 +47,113 @@ void irdma_log_invalid_mtu(u16 mtu, struct irdma_sc_dev *dev)
4647 ibdev_warn (to_ibdev (dev ), "MTU setting [%d] too low for RDMA traffic. Minimum MTU is 1280 for IPv6\\n" , mtu );
4748}
4849
50+ static void ig3rdma_idc_vport_event_handler (struct iidc_rdma_vport_dev_info * cdev_info ,
51+ struct iidc_rdma_event * event )
52+ {
53+ struct irdma_device * iwdev = auxiliary_get_drvdata (cdev_info -> adev );
54+ struct irdma_l2params l2params = {};
55+
56+ if (* event -> type & BIT (IIDC_RDMA_EVENT_AFTER_MTU_CHANGE )) {
57+ ibdev_dbg (& iwdev -> ibdev , "CLNT: new MTU = %d\n" , iwdev -> netdev -> mtu );
58+ if (iwdev -> vsi .mtu != iwdev -> netdev -> mtu ) {
59+ l2params .mtu = iwdev -> netdev -> mtu ;
60+ l2params .mtu_changed = true;
61+ irdma_log_invalid_mtu (l2params .mtu , & iwdev -> rf -> sc_dev );
62+ irdma_change_l2params (& iwdev -> vsi , & l2params );
63+ }
64+ }
65+ }
66+
67+ static int ig3rdma_vport_probe (struct auxiliary_device * aux_dev ,
68+ const struct auxiliary_device_id * id )
69+ {
70+ struct iidc_rdma_vport_auxiliary_dev * idc_adev =
71+ container_of (aux_dev , struct iidc_rdma_vport_auxiliary_dev , adev );
72+ struct auxiliary_device * aux_core_dev = idc_adev -> vdev_info -> core_adev ;
73+ struct irdma_pci_f * rf = auxiliary_get_drvdata (aux_core_dev );
74+ struct irdma_l2params l2params = {};
75+ struct irdma_device * iwdev ;
76+ int err ;
77+
78+ if (!rf ) {
79+ WARN_ON_ONCE (1 );
80+ return - ENOMEM ;
81+ }
82+ iwdev = ib_alloc_device (irdma_device , ibdev );
83+ /* Fill iwdev info */
84+ iwdev -> is_vport = true;
85+ iwdev -> rf = rf ;
86+ iwdev -> vport_id = idc_adev -> vdev_info -> vport_id ;
87+ iwdev -> netdev = idc_adev -> vdev_info -> netdev ;
88+ iwdev -> init_state = INITIAL_STATE ;
89+ iwdev -> roce_cwnd = IRDMA_ROCE_CWND_DEFAULT ;
90+ iwdev -> roce_ackcreds = IRDMA_ROCE_ACKCREDS_DEFAULT ;
91+ iwdev -> rcv_wnd = IRDMA_CM_DEFAULT_RCV_WND_SCALED ;
92+ iwdev -> rcv_wscale = IRDMA_CM_DEFAULT_RCV_WND_SCALE ;
93+ iwdev -> roce_mode = true;
94+ iwdev -> push_mode = false;
95+
96+ l2params .mtu = iwdev -> netdev -> mtu ;
97+
98+ err = irdma_rt_init_hw (iwdev , & l2params );
99+ if (err )
100+ goto err_rt_init ;
101+
102+ err = irdma_ib_register_device (iwdev );
103+ if (err )
104+ goto err_ibreg ;
105+
106+ auxiliary_set_drvdata (aux_dev , iwdev );
107+
108+ ibdev_dbg (& iwdev -> ibdev ,
109+ "INIT: Gen[%d] vport[%d] probe success. dev_name = %s, core_dev_name = %s, netdev=%s\n" ,
110+ rf -> rdma_ver , idc_adev -> vdev_info -> vport_id ,
111+ dev_name (& aux_dev -> dev ),
112+ dev_name (& idc_adev -> vdev_info -> core_adev -> dev ),
113+ netdev_name (idc_adev -> vdev_info -> netdev ));
114+
115+ return 0 ;
116+ err_ibreg :
117+ irdma_rt_deinit_hw (iwdev );
118+ err_rt_init :
119+ ib_dealloc_device (& iwdev -> ibdev );
120+
121+ return err ;
122+ }
123+
124+ static void ig3rdma_vport_remove (struct auxiliary_device * aux_dev )
125+ {
126+ struct iidc_rdma_vport_auxiliary_dev * idc_adev =
127+ container_of (aux_dev , struct iidc_rdma_vport_auxiliary_dev , adev );
128+ struct irdma_device * iwdev = auxiliary_get_drvdata (aux_dev );
129+
130+ ibdev_dbg (& iwdev -> ibdev ,
131+ "INIT: Gen[%d] dev_name = %s, core_dev_name = %s, netdev=%s\n" ,
132+ iwdev -> rf -> rdma_ver , dev_name (& aux_dev -> dev ),
133+ dev_name (& idc_adev -> vdev_info -> core_adev -> dev ),
134+ netdev_name (idc_adev -> vdev_info -> netdev ));
135+
136+ irdma_ib_unregister_device (iwdev );
137+ }
138+
139+ static const struct auxiliary_device_id ig3rdma_vport_auxiliary_id_table [] = {
140+ {.name = "idpf.8086.rdma.vdev" , },
141+ {},
142+ };
143+
144+ MODULE_DEVICE_TABLE (auxiliary , ig3rdma_vport_auxiliary_id_table );
145+
146+ static struct iidc_rdma_vport_auxiliary_drv ig3rdma_vport_auxiliary_drv = {
147+ .adrv = {
148+ .name = "vdev" ,
149+ .id_table = ig3rdma_vport_auxiliary_id_table ,
150+ .probe = ig3rdma_vport_probe ,
151+ .remove = ig3rdma_vport_remove ,
152+ },
153+ .event_handler = ig3rdma_idc_vport_event_handler ,
154+ };
155+
156+
49157static int __init irdma_init_module (void )
50158{
51159 int ret ;
@@ -74,6 +182,17 @@ static int __init irdma_init_module(void)
74182
75183 return ret ;
76184 }
185+
186+ ret = auxiliary_driver_register (& ig3rdma_vport_auxiliary_drv .adrv );
187+ if (ret ) {
188+ auxiliary_driver_unregister (& ig3rdma_core_auxiliary_drv .adrv );
189+ auxiliary_driver_unregister (& icrdma_core_auxiliary_drv .adrv );
190+ auxiliary_driver_unregister (& i40iw_auxiliary_drv );
191+ pr_err ("Failed ig3rdma vport auxiliary_driver_register() ret=%d\n" ,
192+ ret );
193+
194+ return ret ;
195+ }
77196 irdma_register_notifiers ();
78197
79198 return 0 ;
@@ -85,6 +204,7 @@ static void __exit irdma_exit_module(void)
85204 auxiliary_driver_unregister (& icrdma_core_auxiliary_drv .adrv );
86205 auxiliary_driver_unregister (& i40iw_auxiliary_drv );
87206 auxiliary_driver_unregister (& ig3rdma_core_auxiliary_drv .adrv );
207+ auxiliary_driver_unregister (& ig3rdma_vport_auxiliary_drv .adrv );
88208}
89209
90210module_init (irdma_init_module );
0 commit comments