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