xref: /NextBSD/sys/dev/ifmlx4/if_mlx4.c (revision 6c042d91cd0d3e48a1580e4b238708d2c6dc57c2)
1 
2 
3 #include "ifdi_if.h"
4 #include "mlx4_pciids.h"
5 #include "mlx4_bsd.h"
6 
7 
8 static char mlx4_version[] __devinitdata =
9 	DRV_NAME ": Mellanox ConnectX core driver v"
10 	DRV_VERSION " (" DRV_RELDATE ")\n";
11 
12 
13 /*********************************************************************
14  *  Function prototypes
15  *********************************************************************/
16 static int		mlx4_register(device_t);
17 
18 static int      mlx4_if_attach_pre(if_shared_ctx_t);
19 static int      mlx4_if_attach_post(if_shared_ctx_t);
20 static void     mlx4_if_attach_cleanup(if_shared_ctx_t);
21 static int		mlx4_if_msix_intr_assign(if_shared_ctx_t, int);
22 
23 static int      mlx4_if_detach(if_shared_ctx_t);
24 
25 static void		mlx4_if_init(if_shared_ctx_t sctx);
26 static void		mlx4_if_stop(if_shared_ctx_t sctx);
27 
28 static void		mlx4_if_intr_enable(if_shared_ctx_t sctx);
29 static void		mlx4_if_intr_disable(if_shared_ctx_t sctx);
30 static void		mlx4_if_rx_intr_enable(if_shared_ctx_t sctx, uint16_t rxqid);
31 
32 static void		mlx4_if_multi_set(if_shared_ctx_t);
33 static int		mlx4_if_queues_alloc(if_shared_ctx_t, caddr_t *, uint64_t *, int);
34 static void		mlx4_if_queues_free(if_shared_ctx_t sctx);
35 static void		mlx4_if_update_admin_status(if_shared_ctx_t);
36 static int		mlx4_if_mtu_set(if_shared_ctx_t, uint32_t);
37 
38 static void		mlx4_if_media_status(if_shared_ctx_t, struct ifmediareq *);
39 static int		mlx4_if_media_change(if_shared_ctx_t);
40 
41 static void		mlx4_if_timer(if_shared_ctx_t, uint16_t);
42 static int		mlx4_if_promisc_set(if_shared_ctx_t sctx, int flags);
43 static void		mlx4_if_vlan_register(if_shared_ctx_t sctx, u16 vtag);
44 static void		mlx4_if_vlan_unregister(if_shared_ctx_t sctx, u16 vtag);
45 
46 static device_method_t mlx4_methods[] = {
47 	/* Device interface */
48 	DEVMETHOD(device_register, mlx4_register),
49 	DEVMETHOD(device_probe, iflib_device_probe),
50 	DEVMETHOD(device_attach, iflib_device_attach),
51 	DEVMETHOD(device_detach, iflib_device_detach),
52 	DEVMETHOD(device_shutdown, iflib_device_suspend),
53 	DEVMETHOD_END
54 };
55 
56 static driver_t mlx4_driver = {
57 	"mlx", mlx4_methods, sizeof(struct mlx4_softc),
58 };
59 
60 devclass_t mlx4_devclass;
61 DRIVER_MODULE(mlx4, pci, mlx4_driver, mlx4_devclass, 0, 0);
62 
63 MODULE_DEPEND(mlx4, pci, 1, 1, 1);
64 MODULE_DEPEND(mlx4, ether, 1, 1, 1);
65 MODULE_DEPEND(mlx4, iflib, 1, 1, 1);
66 
67 
68 static device_method_t mlx4_if_methods[] = {
69 	DEVMETHOD(ifdi_attach_pre, mlx4_if_attach_pre),
70 	DEVMETHOD(ifdi_attach_post, mlx4_if_attach_post),
71 	DEVMETHOD(ifdi_attach_cleanup, mlx4_if_attach_cleanup),
72 	DEVMETHOD(ifdi_detach, mlx4_if_detach),
73 	DEVMETHOD(ifdi_init, mlx4_if_init),
74 	DEVMETHOD(ifdi_stop, mlx4_if_stop),
75 	DEVMETHOD(ifdi_msix_intr_assign, mlx4_if_msix_intr_assign),
76 	DEVMETHOD(ifdi_intr_disable, mlx4_if_intr_disable),
77 	DEVMETHOD(ifdi_intr_enable, mlx4_if_intr_enable),
78 	DEVMETHOD(ifdi_rx_intr_enable, mlx4_if_rx_intr_enable),
79 	DEVMETHOD(ifdi_multi_set, mlx4_if_multi_set),
80 	DEVMETHOD(ifdi_queues_alloc, mlx4_if_queues_alloc),
81 	DEVMETHOD(ifdi_update_admin_status, mlx4_if_update_admin_status),
82 	DEVMETHOD(ifdi_mtu_set, mlx4_if_mtu_set),
83 	DEVMETHOD(ifdi_media_status, mlx4_if_media_status),
84 	DEVMETHOD(ifdi_media_change, mlx4_if_media_change),
85 	DEVMETHOD(ifdi_timer, mlx4_if_timer),
86 	DEVMETHOD(ifdi_promisc_set, mlx4_if_promisc_set),
87 	DEVMETHOD(ifdi_vlan_register, mlx4_if_vlan_register),
88 	DEVMETHOD(ifdi_vlan_unregister, mlx4_if_vlan_unregister),
89 	DEVMETHOD(ifdi_queues_free, mlx4_if_queues_free),
90 	DEVMETHOD_END
91 };
92 
93 static driver_t mlx4_if_driver = {
94 	"mlx4", mlx4_if_methods, sizeof(struct if_shared_ctx),
95 };
96 
97 static int
mlx4_register(device_t dev)98 mlx4_register(device_t dev)
99 {
100 	struct ixl_pf	*pf;
101 	int             error = 0;
102 	if_shared_ctx_t sctx;
103 
104 	/* Allocate, clear, and link in our primary soft structure */
105 	pf = device_get_softc(dev);
106 	sctx = UPCAST(pf);
107 	sctx->isc_dev = dev;
108 
109 	sctx->isc_q_align = PAGE_SIZE;/* max(DBA_ALIGN, PAGE_SIZE) */
110 
111 	sctx->isc_tx_maxsize = IXL_TSO_SIZE;
112 	sctx->isc_tx_nsegments = IXL_MAX_TX_SEGS;
113 	sctx->isc_tx_maxsegsize = PAGE_SIZE*4;
114 
115 	sctx->isc_rx_maxsize = PAGE_SIZE*4;
116 	sctx->isc_rx_nsegments = 1;
117 	sctx->isc_rx_maxsegsize = PAGE_SIZE*4;
118 	sctx->isc_ntxd = ixl_ringsz;
119 	sctx->isc_nrxd = ixl_ringsz;
120 	sctx->isc_nfl = 1;
121 	sctx->isc_qsizes = malloc(2*sizeof(uint32_t), M_DEVBUF, M_WAITOK);
122 
123 	sctx->isc_qsizes[0] = roundup2((ixl_ringsz * sizeof(struct i40e_tx_desc)) +
124 					 sizeof(u32), DBA_ALIGN);
125 	sctx->isc_qsizes[1] = roundup2(ixl_ringsz *
126 					 sizeof(union i40e_rx_desc), DBA_ALIGN);
127 
128 	sctx->isc_nqs = 2;
129 	mlx4_txrx_init(sctx);
130 
131 	sctx->isc_msix_bar = PCIR_BAR(IXL_BAR);;
132 	sctx->isc_admin_intrcnt = 1;
133 	sctx->isc_legacy_intr = mlx4_intr;
134 	sctx->isc_driver = &mlx4_if_driver;
135 
136 	sctx->isc_vendor_id = PCI_VENDOR_ID_MELLANOX;
137 	sctx->isc_vendor_info = mlx4_pci_table;
138 	sctx->isc_driver_version = mlx4_driver_version;
139 	sctx->isc_vendor_strings = mlx4_strings;
140 	return (0);
141 }
142 
143 static int
mlx4_if_attach_pre(if_shared_ctx_t sctx)144 mlx4_if_attach_pre(if_shared_ctx_t sctx)
145 {
146 	return (EINVAL);
147 }
148 
149 static int
mlx4_if_attach_post(if_shared_ctx_t sctx)150 mlx4_if_attach_post(if_shared_ctx_t sctx)
151 {
152 	return (EINVAL);
153 }
154 
155 static void
mlx4_if_attach_cleanup(if_shared_ctx_t sctx)156 mlx4_if_attach_cleanup(if_shared_ctx_t sctx)
157 {
158 
159 }
160 
161 static int
mlx4_if_msix_intr_assign(if_shared_ctx_t sctx,int msixcnt)162 mlx4_if_msix_intr_assign(if_shared_ctx_t sctx, int msixcnt)
163 {
164 	return (EINVAL);
165 }
166 
167 static int
mlx4_if_detach(if_shared_ctx_t sctx)168 mlx4_if_detach(if_shared_ctx_t sctx)
169 {
170 	return (EINVAL);
171 }
172 
173 static void
mlx4_if_init(if_shared_ctx_t sctx)174 mlx4_if_init(if_shared_ctx_t sctx)
175 {
176 
177 }
178 
179 static void
mlx4_if_stop(if_shared_ctx_t sctx)180 mlx4_if_stop(if_shared_ctx_t sctx)
181 {
182 
183 }
184 
185 static void
mlx4_if_intr_enable(if_shared_ctx_t sctx)186 mlx4_if_intr_enable(if_shared_ctx_t sctx)
187 {
188 
189 }
190 
191 static void
mlx4_if_intr_disable(if_shared_ctx_t sctx)192 mlx4_if_intr_disable(if_shared_ctx_t sctx)
193 {
194 
195 }
196 
197 static void
mlx4_if_rx_intr_enable(if_shared_ctx_t sctx,uint16_t rxqid)198 mlx4_if_rx_intr_enable(if_shared_ctx_t sctx, uint16_t rxqid)
199 {
200 
201 }
202 
203 static void
mlx4_if_multi_set(if_shared_ctx_t sctx)204 mlx4_if_multi_set(if_shared_ctx_t sctx)
205 {
206 
207 }
208 
209 static int
mlx4_if_queues_alloc(if_shared_ctx_t,caddr_t * vaddrs,uint64_t * paddrs,int nqs)210 mlx4_if_queues_alloc(if_shared_ctx_t, caddr_t *vaddrs, uint64_t *paddrs, int nqs)
211 {
212 
213 }
214 
215 static void
mlx4_if_queues_free(if_shared_ctx_t sctx)216 mlx4_if_queues_free(if_shared_ctx_t sctx)
217 {
218 
219 }
220 
221 static void
mlx4_if_update_admin_status(if_shared_ctx_t sctx)222 mlx4_if_update_admin_status(if_shared_ctx_t sctx)
223 {
224 
225 }
226 
227 static int
mlx4_if_mtu_set(if_shared_ctx_t sctx,uint32_t mtu)228 mlx4_if_mtu_set(if_shared_ctx_t sctx, uint32_t mtu)
229 {
230 	return (EINVAL);
231 }
232 
233 static void
mlx4_if_media_status(if_shared_ctx_t sctx,struct ifmediareq * ifmr)234 mlx4_if_media_status(if_shared_ctx_t sctx, struct ifmediareq *ifmr)
235 {
236 
237 }
238 
239 static int
mlx4_if_media_change(if_shared_ctx_t sctx)240 mlx4_if_media_change(if_shared_ctx_t sctx)
241 {
242 	return (ENODEV);
243 }
244 
245 static void
mlx4_if_timer(if_shared_ctx_t sctx,uint16_t qid)246 mlx4_if_timer(if_shared_ctx_t sctx, uint16_t qid)
247 {
248 
249 }
250 
251 static int
mlx4_if_promisc_set(if_shared_ctx_t sctx,int flags)252 mlx4_if_promisc_set(if_shared_ctx_t sctx, int flags)
253 {
254 	return (EINVAL);
255 }
256 
257 static void
mlx4_if_vlan_register(if_shared_ctx_t sctx,u16 vtag)258 mlx4_if_vlan_register(if_shared_ctx_t sctx, u16 vtag)
259 {
260 
261 }
262 
263 static void
mlx4_if_vlan_unregister(if_shared_ctx_t sctx,u16 vtag)264 mlx4_if_vlan_unregister(if_shared_ctx_t sctx, u16 vtag)
265 {
266 
267 }
268 
269 
270