qede: Add basic Network driver
[deliverable/linux.git] / drivers / net / ethernet / qlogic / qede / qede_main.c
CommitLineData
e712d52b
YM
1/* QLogic qede NIC Driver
2* Copyright (c) 2015 QLogic Corporation
3*
4* This software is available under the terms of the GNU General Public License
5* (GPL) Version 2, available from the file COPYING in the main directory of
6* this source tree.
7*/
8
9#include <linux/module.h>
10#include <linux/pci.h>
11#include <linux/version.h>
12#include <linux/device.h>
13#include <linux/netdevice.h>
14#include <linux/etherdevice.h>
15#include <linux/skbuff.h>
16#include <linux/errno.h>
17#include <linux/list.h>
18#include <linux/string.h>
19#include <linux/dma-mapping.h>
20#include <linux/interrupt.h>
21#include <asm/byteorder.h>
22#include <asm/param.h>
23#include <linux/io.h>
24#include <linux/netdev_features.h>
25#include <linux/udp.h>
26#include <linux/tcp.h>
27#include <net/vxlan.h>
28#include <linux/ip.h>
29#include <net/ipv6.h>
30#include <net/tcp.h>
31#include <linux/if_ether.h>
32#include <linux/if_vlan.h>
33#include <linux/pkt_sched.h>
34#include <linux/ethtool.h>
35#include <linux/in.h>
36#include <linux/random.h>
37#include <net/ip6_checksum.h>
38#include <linux/bitops.h>
39
40#include "qede.h"
41
42static const char version[] = "QLogic QL4xxx 40G/100G Ethernet Driver qede "
43 DRV_MODULE_VERSION "\n";
44
45MODULE_DESCRIPTION("QLogic 40G/100G Ethernet Driver");
46MODULE_LICENSE("GPL");
47MODULE_VERSION(DRV_MODULE_VERSION);
48
49static uint debug;
50module_param(debug, uint, 0);
51MODULE_PARM_DESC(debug, " Default debug msglevel");
52
53static const struct qed_eth_ops *qed_ops;
54
55#define CHIP_NUM_57980S_40 0x1634
56#define CHIP_NUM_57980S_10 0x1635
57#define CHIP_NUM_57980S_MF 0x1636
58#define CHIP_NUM_57980S_100 0x1644
59#define CHIP_NUM_57980S_50 0x1654
60#define CHIP_NUM_57980S_25 0x1656
61
62#ifndef PCI_DEVICE_ID_NX2_57980E
63#define PCI_DEVICE_ID_57980S_40 CHIP_NUM_57980S_40
64#define PCI_DEVICE_ID_57980S_10 CHIP_NUM_57980S_10
65#define PCI_DEVICE_ID_57980S_MF CHIP_NUM_57980S_MF
66#define PCI_DEVICE_ID_57980S_100 CHIP_NUM_57980S_100
67#define PCI_DEVICE_ID_57980S_50 CHIP_NUM_57980S_50
68#define PCI_DEVICE_ID_57980S_25 CHIP_NUM_57980S_25
69#endif
70
71static const struct pci_device_id qede_pci_tbl[] = {
72 { PCI_VDEVICE(QLOGIC, PCI_DEVICE_ID_57980S_40), 0 },
73 { PCI_VDEVICE(QLOGIC, PCI_DEVICE_ID_57980S_10), 0 },
74 { PCI_VDEVICE(QLOGIC, PCI_DEVICE_ID_57980S_MF), 0 },
75 { PCI_VDEVICE(QLOGIC, PCI_DEVICE_ID_57980S_100), 0 },
76 { PCI_VDEVICE(QLOGIC, PCI_DEVICE_ID_57980S_50), 0 },
77 { PCI_VDEVICE(QLOGIC, PCI_DEVICE_ID_57980S_25), 0 },
78 { 0 }
79};
80
81MODULE_DEVICE_TABLE(pci, qede_pci_tbl);
82
83static int qede_probe(struct pci_dev *pdev, const struct pci_device_id *id);
84
85#define TX_TIMEOUT (5 * HZ)
86
87static void qede_remove(struct pci_dev *pdev);
88
89static struct pci_driver qede_pci_driver = {
90 .name = "qede",
91 .id_table = qede_pci_tbl,
92 .probe = qede_probe,
93 .remove = qede_remove,
94};
95
96static
97int __init qede_init(void)
98{
99 int ret;
100 u32 qed_ver;
101
102 pr_notice("qede_init: %s\n", version);
103
104 qed_ver = qed_get_protocol_version(QED_PROTOCOL_ETH);
105 if (qed_ver != QEDE_ETH_INTERFACE_VERSION) {
106 pr_notice("Version mismatch [%08x != %08x]\n",
107 qed_ver,
108 QEDE_ETH_INTERFACE_VERSION);
109 return -EINVAL;
110 }
111
112 qed_ops = qed_get_eth_ops(QEDE_ETH_INTERFACE_VERSION);
113 if (!qed_ops) {
114 pr_notice("Failed to get qed ethtool operations\n");
115 return -EINVAL;
116 }
117
118 ret = pci_register_driver(&qede_pci_driver);
119 if (ret) {
120 pr_notice("Failed to register driver\n");
121 qed_put_eth_ops();
122 return -EINVAL;
123 }
124
125 return 0;
126}
127
128static void __exit qede_cleanup(void)
129{
130 pr_notice("qede_cleanup called\n");
131
132 pci_unregister_driver(&qede_pci_driver);
133 qed_put_eth_ops();
134}
135
136module_init(qede_init);
137module_exit(qede_cleanup);
138
139/* -------------------------------------------------------------------------
140 * START OF PROBE / REMOVE
141 * -------------------------------------------------------------------------
142 */
143
144static struct qede_dev *qede_alloc_etherdev(struct qed_dev *cdev,
145 struct pci_dev *pdev,
146 struct qed_dev_eth_info *info,
147 u32 dp_module,
148 u8 dp_level)
149{
150 struct net_device *ndev;
151 struct qede_dev *edev;
152
153 ndev = alloc_etherdev_mqs(sizeof(*edev),
154 info->num_queues,
155 info->num_queues);
156 if (!ndev) {
157 pr_err("etherdev allocation failed\n");
158 return NULL;
159 }
160
161 edev = netdev_priv(ndev);
162 edev->ndev = ndev;
163 edev->cdev = cdev;
164 edev->pdev = pdev;
165 edev->dp_module = dp_module;
166 edev->dp_level = dp_level;
167 edev->ops = qed_ops;
168
169 DP_INFO(edev, "Allocated netdev with 64 tx queues and 64 rx queues\n");
170
171 SET_NETDEV_DEV(ndev, &pdev->dev);
172
173 memcpy(&edev->dev_info, info, sizeof(*info));
174
175 edev->num_tc = edev->dev_info.num_tc;
176
177 return edev;
178}
179
180static void qede_init_ndev(struct qede_dev *edev)
181{
182 struct net_device *ndev = edev->ndev;
183 struct pci_dev *pdev = edev->pdev;
184 u32 hw_features;
185
186 pci_set_drvdata(pdev, ndev);
187
188 ndev->mem_start = edev->dev_info.common.pci_mem_start;
189 ndev->base_addr = ndev->mem_start;
190 ndev->mem_end = edev->dev_info.common.pci_mem_end;
191 ndev->irq = edev->dev_info.common.pci_irq;
192
193 ndev->watchdog_timeo = TX_TIMEOUT;
194
195 /* user-changeble features */
196 hw_features = NETIF_F_GRO | NETIF_F_SG |
197 NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
198 NETIF_F_TSO | NETIF_F_TSO6;
199
200 ndev->vlan_features = hw_features | NETIF_F_RXHASH | NETIF_F_RXCSUM |
201 NETIF_F_HIGHDMA;
202 ndev->features = hw_features | NETIF_F_RXHASH | NETIF_F_RXCSUM |
203 NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HIGHDMA |
204 NETIF_F_HW_VLAN_CTAG_TX;
205
206 ndev->hw_features = hw_features;
207
208 /* Set network device HW mac */
209 ether_addr_copy(edev->ndev->dev_addr, edev->dev_info.common.hw_mac);
210}
211
212/* This function converts from 32b param to two params of level and module
213 * Input 32b decoding:
214 * b31 - enable all NOTICE prints. NOTICE prints are for deviation from the
215 * 'happy' flow, e.g. memory allocation failed.
216 * b30 - enable all INFO prints. INFO prints are for major steps in the flow
217 * and provide important parameters.
218 * b29-b0 - per-module bitmap, where each bit enables VERBOSE prints of that
219 * module. VERBOSE prints are for tracking the specific flow in low level.
220 *
221 * Notice that the level should be that of the lowest required logs.
222 */
223static void qede_config_debug(uint debug, u32 *p_dp_module, u8 *p_dp_level)
224{
225 *p_dp_level = QED_LEVEL_NOTICE;
226 *p_dp_module = 0;
227
228 if (debug & QED_LOG_VERBOSE_MASK) {
229 *p_dp_level = QED_LEVEL_VERBOSE;
230 *p_dp_module = (debug & 0x3FFFFFFF);
231 } else if (debug & QED_LOG_INFO_MASK) {
232 *p_dp_level = QED_LEVEL_INFO;
233 } else if (debug & QED_LOG_NOTICE_MASK) {
234 *p_dp_level = QED_LEVEL_NOTICE;
235 }
236}
237
238static void qede_update_pf_params(struct qed_dev *cdev)
239{
240 struct qed_pf_params pf_params;
241
242 /* 16 rx + 16 tx */
243 memset(&pf_params, 0, sizeof(struct qed_pf_params));
244 pf_params.eth_pf_params.num_cons = 32;
245 qed_ops->common->update_pf_params(cdev, &pf_params);
246}
247
248enum qede_probe_mode {
249 QEDE_PROBE_NORMAL,
250};
251
252static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
253 enum qede_probe_mode mode)
254{
255 struct qed_slowpath_params params;
256 struct qed_dev_eth_info dev_info;
257 struct qede_dev *edev;
258 struct qed_dev *cdev;
259 int rc;
260
261 if (unlikely(dp_level & QED_LEVEL_INFO))
262 pr_notice("Starting qede probe\n");
263
264 cdev = qed_ops->common->probe(pdev, QED_PROTOCOL_ETH,
265 dp_module, dp_level);
266 if (!cdev) {
267 rc = -ENODEV;
268 goto err0;
269 }
270
271 qede_update_pf_params(cdev);
272
273 /* Start the Slowpath-process */
274 memset(&params, 0, sizeof(struct qed_slowpath_params));
275 params.int_mode = QED_INT_MODE_MSIX;
276 params.drv_major = QEDE_MAJOR_VERSION;
277 params.drv_minor = QEDE_MINOR_VERSION;
278 params.drv_rev = QEDE_REVISION_VERSION;
279 params.drv_eng = QEDE_ENGINEERING_VERSION;
280 strlcpy(params.name, "qede LAN", QED_DRV_VER_STR_SIZE);
281 rc = qed_ops->common->slowpath_start(cdev, &params);
282 if (rc) {
283 pr_notice("Cannot start slowpath\n");
284 goto err1;
285 }
286
287 /* Learn information crucial for qede to progress */
288 rc = qed_ops->fill_dev_info(cdev, &dev_info);
289 if (rc)
290 goto err2;
291
292 edev = qede_alloc_etherdev(cdev, pdev, &dev_info, dp_module,
293 dp_level);
294 if (!edev) {
295 rc = -ENOMEM;
296 goto err2;
297 }
298
299 qede_init_ndev(edev);
300
301 edev->ops->common->set_id(cdev, edev->ndev->name, DRV_MODULE_VERSION);
302
303 DP_INFO(edev, "Ending successfully qede probe\n");
304
305 return 0;
306
307err2:
308 qed_ops->common->slowpath_stop(cdev);
309err1:
310 qed_ops->common->remove(cdev);
311err0:
312 return rc;
313}
314
315static int qede_probe(struct pci_dev *pdev, const struct pci_device_id *id)
316{
317 u32 dp_module = 0;
318 u8 dp_level = 0;
319
320 qede_config_debug(debug, &dp_module, &dp_level);
321
322 return __qede_probe(pdev, dp_module, dp_level,
323 QEDE_PROBE_NORMAL);
324}
325
326enum qede_remove_mode {
327 QEDE_REMOVE_NORMAL,
328};
329
330static void __qede_remove(struct pci_dev *pdev, enum qede_remove_mode mode)
331{
332 struct net_device *ndev = pci_get_drvdata(pdev);
333 struct qede_dev *edev = netdev_priv(ndev);
334 struct qed_dev *cdev = edev->cdev;
335
336 DP_INFO(edev, "Starting qede_remove\n");
337
338 edev->ops->common->set_power_state(cdev, PCI_D0);
339
340 pci_set_drvdata(pdev, NULL);
341
342 free_netdev(ndev);
343
344 /* Use global ops since we've freed edev */
345 qed_ops->common->slowpath_stop(cdev);
346 qed_ops->common->remove(cdev);
347
348 pr_notice("Ending successfully qede_remove\n");
349}
350
351static void qede_remove(struct pci_dev *pdev)
352{
353 __qede_remove(pdev, QEDE_REMOVE_NORMAL);
354}
This page took 0.037256 seconds and 5 git commands to generate.