1// SPDX-License-Identifier: GPL-2.0
2/* Copyright(c) 2017 - 2019 Pensando Systems, Inc */
3
4#include <linux/printk.h>
5#include <linux/dynamic_debug.h>
6#include <linux/module.h>
7#include <linux/netdevice.h>
8#include <linux/utsname.h>
9#include <generated/utsrelease.h>
10
11#include "ionic.h"
12#include "ionic_bus.h"
13#include "ionic_lif.h"
14#include "ionic_debugfs.h"
15
16MODULE_DESCRIPTION(IONIC_DRV_DESCRIPTION);
17MODULE_AUTHOR("Pensando Systems, Inc");
18MODULE_LICENSE("GPL");
19
20static const char *ionic_error_to_str(enum ionic_status_code code)
21{
22	switch (code) {
23	case IONIC_RC_SUCCESS:
24		return "IONIC_RC_SUCCESS";
25	case IONIC_RC_EVERSION:
26		return "IONIC_RC_EVERSION";
27	case IONIC_RC_EOPCODE:
28		return "IONIC_RC_EOPCODE";
29	case IONIC_RC_EIO:
30		return "IONIC_RC_EIO";
31	case IONIC_RC_EPERM:
32		return "IONIC_RC_EPERM";
33	case IONIC_RC_EQID:
34		return "IONIC_RC_EQID";
35	case IONIC_RC_EQTYPE:
36		return "IONIC_RC_EQTYPE";
37	case IONIC_RC_ENOENT:
38		return "IONIC_RC_ENOENT";
39	case IONIC_RC_EINTR:
40		return "IONIC_RC_EINTR";
41	case IONIC_RC_EAGAIN:
42		return "IONIC_RC_EAGAIN";
43	case IONIC_RC_ENOMEM:
44		return "IONIC_RC_ENOMEM";
45	case IONIC_RC_EFAULT:
46		return "IONIC_RC_EFAULT";
47	case IONIC_RC_EBUSY:
48		return "IONIC_RC_EBUSY";
49	case IONIC_RC_EEXIST:
50		return "IONIC_RC_EEXIST";
51	case IONIC_RC_EINVAL:
52		return "IONIC_RC_EINVAL";
53	case IONIC_RC_ENOSPC:
54		return "IONIC_RC_ENOSPC";
55	case IONIC_RC_ERANGE:
56		return "IONIC_RC_ERANGE";
57	case IONIC_RC_BAD_ADDR:
58		return "IONIC_RC_BAD_ADDR";
59	case IONIC_RC_DEV_CMD:
60		return "IONIC_RC_DEV_CMD";
61	case IONIC_RC_ENOSUPP:
62		return "IONIC_RC_ENOSUPP";
63	case IONIC_RC_ERROR:
64		return "IONIC_RC_ERROR";
65	case IONIC_RC_ERDMA:
66		return "IONIC_RC_ERDMA";
67	case IONIC_RC_EBAD_FW:
68		return "IONIC_RC_EBAD_FW";
69	default:
70		return "IONIC_RC_UNKNOWN";
71	}
72}
73
74static int ionic_error_to_errno(enum ionic_status_code code)
75{
76	switch (code) {
77	case IONIC_RC_SUCCESS:
78		return 0;
79	case IONIC_RC_EVERSION:
80	case IONIC_RC_EQTYPE:
81	case IONIC_RC_EQID:
82	case IONIC_RC_EINVAL:
83	case IONIC_RC_ENOSUPP:
84		return -EINVAL;
85	case IONIC_RC_EPERM:
86		return -EPERM;
87	case IONIC_RC_ENOENT:
88		return -ENOENT;
89	case IONIC_RC_EAGAIN:
90		return -EAGAIN;
91	case IONIC_RC_ENOMEM:
92		return -ENOMEM;
93	case IONIC_RC_EFAULT:
94		return -EFAULT;
95	case IONIC_RC_EBUSY:
96		return -EBUSY;
97	case IONIC_RC_EEXIST:
98		return -EEXIST;
99	case IONIC_RC_ENOSPC:
100		return -ENOSPC;
101	case IONIC_RC_ERANGE:
102		return -ERANGE;
103	case IONIC_RC_BAD_ADDR:
104		return -EFAULT;
105	case IONIC_RC_EOPCODE:
106	case IONIC_RC_EINTR:
107	case IONIC_RC_DEV_CMD:
108	case IONIC_RC_ERROR:
109	case IONIC_RC_ERDMA:
110	case IONIC_RC_EIO:
111	default:
112		return -EIO;
113	}
114}
115
116static const char *ionic_opcode_to_str(enum ionic_cmd_opcode opcode)
117{
118	switch (opcode) {
119	case IONIC_CMD_NOP:
120		return "IONIC_CMD_NOP";
121	case IONIC_CMD_INIT:
122		return "IONIC_CMD_INIT";
123	case IONIC_CMD_RESET:
124		return "IONIC_CMD_RESET";
125	case IONIC_CMD_IDENTIFY:
126		return "IONIC_CMD_IDENTIFY";
127	case IONIC_CMD_GETATTR:
128		return "IONIC_CMD_GETATTR";
129	case IONIC_CMD_SETATTR:
130		return "IONIC_CMD_SETATTR";
131	case IONIC_CMD_PORT_IDENTIFY:
132		return "IONIC_CMD_PORT_IDENTIFY";
133	case IONIC_CMD_PORT_INIT:
134		return "IONIC_CMD_PORT_INIT";
135	case IONIC_CMD_PORT_RESET:
136		return "IONIC_CMD_PORT_RESET";
137	case IONIC_CMD_PORT_GETATTR:
138		return "IONIC_CMD_PORT_GETATTR";
139	case IONIC_CMD_PORT_SETATTR:
140		return "IONIC_CMD_PORT_SETATTR";
141	case IONIC_CMD_LIF_INIT:
142		return "IONIC_CMD_LIF_INIT";
143	case IONIC_CMD_LIF_RESET:
144		return "IONIC_CMD_LIF_RESET";
145	case IONIC_CMD_LIF_IDENTIFY:
146		return "IONIC_CMD_LIF_IDENTIFY";
147	case IONIC_CMD_LIF_SETATTR:
148		return "IONIC_CMD_LIF_SETATTR";
149	case IONIC_CMD_LIF_GETATTR:
150		return "IONIC_CMD_LIF_GETATTR";
151	case IONIC_CMD_RX_MODE_SET:
152		return "IONIC_CMD_RX_MODE_SET";
153	case IONIC_CMD_RX_FILTER_ADD:
154		return "IONIC_CMD_RX_FILTER_ADD";
155	case IONIC_CMD_RX_FILTER_DEL:
156		return "IONIC_CMD_RX_FILTER_DEL";
157	case IONIC_CMD_Q_IDENTIFY:
158		return "IONIC_CMD_Q_IDENTIFY";
159	case IONIC_CMD_Q_INIT:
160		return "IONIC_CMD_Q_INIT";
161	case IONIC_CMD_Q_CONTROL:
162		return "IONIC_CMD_Q_CONTROL";
163	case IONIC_CMD_RDMA_RESET_LIF:
164		return "IONIC_CMD_RDMA_RESET_LIF";
165	case IONIC_CMD_RDMA_CREATE_EQ:
166		return "IONIC_CMD_RDMA_CREATE_EQ";
167	case IONIC_CMD_RDMA_CREATE_CQ:
168		return "IONIC_CMD_RDMA_CREATE_CQ";
169	case IONIC_CMD_RDMA_CREATE_ADMINQ:
170		return "IONIC_CMD_RDMA_CREATE_ADMINQ";
171	case IONIC_CMD_FW_DOWNLOAD:
172		return "IONIC_CMD_FW_DOWNLOAD";
173	case IONIC_CMD_FW_CONTROL:
174		return "IONIC_CMD_FW_CONTROL";
175	case IONIC_CMD_FW_DOWNLOAD_V1:
176		return "IONIC_CMD_FW_DOWNLOAD_V1";
177	case IONIC_CMD_FW_CONTROL_V1:
178		return "IONIC_CMD_FW_CONTROL_V1";
179	case IONIC_CMD_VF_GETATTR:
180		return "IONIC_CMD_VF_GETATTR";
181	case IONIC_CMD_VF_SETATTR:
182		return "IONIC_CMD_VF_SETATTR";
183	default:
184		return "DEVCMD_UNKNOWN";
185	}
186}
187
188static void ionic_adminq_flush(struct ionic_lif *lif)
189{
190	struct ionic_queue *q = &lif->adminqcq->q;
191	struct ionic_desc_info *desc_info;
192
193	spin_lock(&lif->adminq_lock);
194
195	while (q->tail_idx != q->head_idx) {
196		desc_info = &q->info[q->tail_idx];
197		memset(desc_info->desc, 0, sizeof(union ionic_adminq_cmd));
198		desc_info->cb = NULL;
199		desc_info->cb_arg = NULL;
200		q->tail_idx = (q->tail_idx + 1) & (q->num_descs - 1);
201	}
202	spin_unlock(&lif->adminq_lock);
203}
204
205static int ionic_adminq_check_err(struct ionic_lif *lif,
206				  struct ionic_admin_ctx *ctx,
207				  bool timeout)
208{
209	struct net_device *netdev = lif->netdev;
210	const char *opcode_str;
211	const char *status_str;
212	int err = 0;
213
214	if (ctx->comp.comp.status || timeout) {
215		opcode_str = ionic_opcode_to_str(ctx->cmd.cmd.opcode);
216		status_str = ionic_error_to_str(ctx->comp.comp.status);
217		err = timeout ? -ETIMEDOUT :
218				ionic_error_to_errno(ctx->comp.comp.status);
219
220		netdev_err(netdev, "%s (%d) failed: %s (%d)\n",
221			   opcode_str, ctx->cmd.cmd.opcode,
222			   timeout ? "TIMEOUT" : status_str, err);
223
224		if (timeout)
225			ionic_adminq_flush(lif);
226	}
227
228	return err;
229}
230
231static void ionic_adminq_cb(struct ionic_queue *q,
232			    struct ionic_desc_info *desc_info,
233			    struct ionic_cq_info *cq_info, void *cb_arg)
234{
235	struct ionic_admin_ctx *ctx = cb_arg;
236	struct ionic_admin_comp *comp;
237	struct device *dev;
238
239	if (!ctx)
240		return;
241
242	comp = cq_info->cq_desc;
243	dev = &q->lif->netdev->dev;
244
245	memcpy(&ctx->comp, comp, sizeof(*comp));
246
247	dev_dbg(dev, "comp admin queue command:\n");
248	dynamic_hex_dump("comp ", DUMP_PREFIX_OFFSET, 16, 1,
249			 &ctx->comp, sizeof(ctx->comp), true);
250
251	complete_all(&ctx->work);
252}
253
254static int ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
255{
256	struct ionic_desc_info *desc_info;
257	struct ionic_queue *q;
258	int err = 0;
259
260	if (!lif->adminqcq)
261		return -EIO;
262
263	q = &lif->adminqcq->q;
264
265	spin_lock(&lif->adminq_lock);
266	if (!ionic_q_has_space(q, 1)) {
267		err = -ENOSPC;
268		goto err_out;
269	}
270
271	err = ionic_heartbeat_check(lif->ionic);
272	if (err)
273		goto err_out;
274
275	desc_info = &q->info[q->head_idx];
276	memcpy(desc_info->desc, &ctx->cmd, sizeof(ctx->cmd));
277
278	dev_dbg(&lif->netdev->dev, "post admin queue command:\n");
279	dynamic_hex_dump("cmd ", DUMP_PREFIX_OFFSET, 16, 1,
280			 &ctx->cmd, sizeof(ctx->cmd), true);
281
282	ionic_q_post(q, true, ionic_adminq_cb, ctx);
283
284err_out:
285	spin_unlock(&lif->adminq_lock);
286
287	return err;
288}
289
290int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
291{
292	struct net_device *netdev = lif->netdev;
293	unsigned long remaining;
294	const char *name;
295	int err;
296
297	err = ionic_adminq_post(lif, ctx);
298	if (err) {
299		if (!test_bit(IONIC_LIF_F_FW_RESET, lif->state)) {
300			name = ionic_opcode_to_str(ctx->cmd.cmd.opcode);
301			netdev_err(netdev, "Posting of %s (%d) failed: %d\n",
302				   name, ctx->cmd.cmd.opcode, err);
303		}
304		return err;
305	}
306
307	remaining = wait_for_completion_timeout(&ctx->work,
308						HZ * (ulong)DEVCMD_TIMEOUT);
309	return ionic_adminq_check_err(lif, ctx, (remaining == 0));
310}
311
312static void ionic_dev_cmd_clean(struct ionic *ionic)
313{
314	struct ionic_dev *idev = &ionic->idev;
315
316	iowrite32(0, &idev->dev_cmd_regs->doorbell);
317	memset_io(&idev->dev_cmd_regs->cmd, 0, sizeof(idev->dev_cmd_regs->cmd));
318}
319
320int ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_seconds)
321{
322	struct ionic_dev *idev = &ionic->idev;
323	unsigned long start_time;
324	unsigned long max_wait;
325	unsigned long duration;
326	int opcode;
327	int hb = 0;
328	int done;
329	int err;
330
331	/* Wait for dev cmd to complete, retrying if we get EAGAIN,
332	 * but don't wait any longer than max_seconds.
333	 */
334	max_wait = jiffies + (max_seconds * HZ);
335try_again:
336	opcode = idev->opcode;
337	start_time = jiffies;
338	do {
339		done = ionic_dev_cmd_done(idev);
340		if (done)
341			break;
342		usleep_range(100, 200);
343
344		/* Don't check the heartbeat on FW_CONTROL commands as they are
345		 * notorious for interrupting the firmware's heartbeat update.
346		 */
347		if (opcode != IONIC_CMD_FW_CONTROL)
348			hb = ionic_heartbeat_check(ionic);
349	} while (!done && !hb && time_before(jiffies, max_wait));
350	duration = jiffies - start_time;
351
352	dev_dbg(ionic->dev, "DEVCMD %s (%d) done=%d took %ld secs (%ld jiffies)\n",
353		ionic_opcode_to_str(opcode), opcode,
354		done, duration / HZ, duration);
355
356	if (!done && hb) {
357		/* It is possible (but unlikely) that FW was busy and missed a
358		 * heartbeat check but is still alive and will process this
359		 * request, so don't clean the dev_cmd in this case.
360		 */
361		dev_warn(ionic->dev, "DEVCMD %s (%d) failed - FW halted\n",
362			 ionic_opcode_to_str(opcode), opcode);
363		return -ENXIO;
364	}
365
366	if (!done && !time_before(jiffies, max_wait)) {
367		ionic_dev_cmd_clean(ionic);
368		dev_warn(ionic->dev, "DEVCMD %s (%d) timeout after %ld secs\n",
369			 ionic_opcode_to_str(opcode), opcode, max_seconds);
370		return -ETIMEDOUT;
371	}
372
373	err = ionic_dev_cmd_status(&ionic->idev);
374	if (err) {
375		if (err == IONIC_RC_EAGAIN &&
376		    time_before(jiffies, (max_wait - HZ))) {
377			dev_dbg(ionic->dev, "DEV_CMD %s (%d), %s (%d) retrying...\n",
378				ionic_opcode_to_str(opcode), opcode,
379				ionic_error_to_str(err), err);
380
381			iowrite32(0, &idev->dev_cmd_regs->done);
382			msleep(1000);
383			iowrite32(1, &idev->dev_cmd_regs->doorbell);
384			goto try_again;
385		}
386
387		if (!(opcode == IONIC_CMD_FW_CONTROL && err == IONIC_RC_EAGAIN))
388			dev_err(ionic->dev, "DEV_CMD %s (%d) error, %s (%d) failed\n",
389				ionic_opcode_to_str(opcode), opcode,
390				ionic_error_to_str(err), err);
391
392		return ionic_error_to_errno(err);
393	}
394
395	ionic_dev_cmd_clean(ionic);
396
397	return 0;
398}
399
400int ionic_setup(struct ionic *ionic)
401{
402	int err;
403
404	err = ionic_dev_setup(ionic);
405	if (err)
406		return err;
407	ionic_reset(ionic);
408
409	return 0;
410}
411
412int ionic_identify(struct ionic *ionic)
413{
414	struct ionic_identity *ident = &ionic->ident;
415	struct ionic_dev *idev = &ionic->idev;
416	size_t sz;
417	int err;
418
419	memset(ident, 0, sizeof(*ident));
420
421	ident->drv.os_type = cpu_to_le32(IONIC_OS_TYPE_LINUX);
422	strncpy(ident->drv.driver_ver_str, UTS_RELEASE,
423		sizeof(ident->drv.driver_ver_str) - 1);
424
425	mutex_lock(&ionic->dev_cmd_lock);
426
427	sz = min(sizeof(ident->drv), sizeof(idev->dev_cmd_regs->data));
428	memcpy_toio(&idev->dev_cmd_regs->data, &ident->drv, sz);
429
430	ionic_dev_cmd_identify(idev, IONIC_IDENTITY_VERSION_1);
431	err = ionic_dev_cmd_wait(ionic, DEVCMD_TIMEOUT);
432	if (!err) {
433		sz = min(sizeof(ident->dev), sizeof(idev->dev_cmd_regs->data));
434		memcpy_fromio(&ident->dev, &idev->dev_cmd_regs->data, sz);
435	}
436	mutex_unlock(&ionic->dev_cmd_lock);
437
438	if (err) {
439		dev_err(ionic->dev, "Cannot identify ionic: %dn", err);
440		goto err_out;
441	}
442
443	err = ionic_lif_identify(ionic, IONIC_LIF_TYPE_CLASSIC,
444				 &ionic->ident.lif);
445	if (err) {
446		dev_err(ionic->dev, "Cannot identify LIFs: %d\n", err);
447		goto err_out;
448	}
449
450	return 0;
451
452err_out:
453	return err;
454}
455
456int ionic_init(struct ionic *ionic)
457{
458	struct ionic_dev *idev = &ionic->idev;
459	int err;
460
461	mutex_lock(&ionic->dev_cmd_lock);
462	ionic_dev_cmd_init(idev);
463	err = ionic_dev_cmd_wait(ionic, DEVCMD_TIMEOUT);
464	mutex_unlock(&ionic->dev_cmd_lock);
465
466	return err;
467}
468
469int ionic_reset(struct ionic *ionic)
470{
471	struct ionic_dev *idev = &ionic->idev;
472	int err;
473
474	mutex_lock(&ionic->dev_cmd_lock);
475	ionic_dev_cmd_reset(idev);
476	err = ionic_dev_cmd_wait(ionic, DEVCMD_TIMEOUT);
477	mutex_unlock(&ionic->dev_cmd_lock);
478
479	return err;
480}
481
482int ionic_port_identify(struct ionic *ionic)
483{
484	struct ionic_identity *ident = &ionic->ident;
485	struct ionic_dev *idev = &ionic->idev;
486	size_t sz;
487	int err;
488
489	mutex_lock(&ionic->dev_cmd_lock);
490
491	ionic_dev_cmd_port_identify(idev);
492	err = ionic_dev_cmd_wait(ionic, DEVCMD_TIMEOUT);
493	if (!err) {
494		sz = min(sizeof(ident->port), sizeof(idev->dev_cmd_regs->data));
495		memcpy_fromio(&ident->port, &idev->dev_cmd_regs->data, sz);
496	}
497
498	mutex_unlock(&ionic->dev_cmd_lock);
499
500	return err;
501}
502
503int ionic_port_init(struct ionic *ionic)
504{
505	struct ionic_identity *ident = &ionic->ident;
506	struct ionic_dev *idev = &ionic->idev;
507	size_t sz;
508	int err;
509
510	if (!idev->port_info) {
511		idev->port_info_sz = ALIGN(sizeof(*idev->port_info), PAGE_SIZE);
512		idev->port_info = dma_alloc_coherent(ionic->dev,
513						     idev->port_info_sz,
514						     &idev->port_info_pa,
515						     GFP_KERNEL);
516		if (!idev->port_info) {
517			dev_err(ionic->dev, "Failed to allocate port info\n");
518			return -ENOMEM;
519		}
520	}
521
522	sz = min(sizeof(ident->port.config), sizeof(idev->dev_cmd_regs->data));
523
524	mutex_lock(&ionic->dev_cmd_lock);
525
526	memcpy_toio(&idev->dev_cmd_regs->data, &ident->port.config, sz);
527	ionic_dev_cmd_port_init(idev);
528	err = ionic_dev_cmd_wait(ionic, DEVCMD_TIMEOUT);
529
530	ionic_dev_cmd_port_state(&ionic->idev, IONIC_PORT_ADMIN_STATE_UP);
531	(void)ionic_dev_cmd_wait(ionic, DEVCMD_TIMEOUT);
532
533	mutex_unlock(&ionic->dev_cmd_lock);
534	if (err) {
535		dev_err(ionic->dev, "Failed to init port\n");
536		dma_free_coherent(ionic->dev, idev->port_info_sz,
537				  idev->port_info, idev->port_info_pa);
538		idev->port_info = NULL;
539		idev->port_info_pa = 0;
540	}
541
542	return err;
543}
544
545int ionic_port_reset(struct ionic *ionic)
546{
547	struct ionic_dev *idev = &ionic->idev;
548	int err;
549
550	if (!idev->port_info)
551		return 0;
552
553	mutex_lock(&ionic->dev_cmd_lock);
554	ionic_dev_cmd_port_reset(idev);
555	err = ionic_dev_cmd_wait(ionic, DEVCMD_TIMEOUT);
556	mutex_unlock(&ionic->dev_cmd_lock);
557
558	dma_free_coherent(ionic->dev, idev->port_info_sz,
559			  idev->port_info, idev->port_info_pa);
560
561	idev->port_info = NULL;
562	idev->port_info_pa = 0;
563
564	if (err)
565		dev_err(ionic->dev, "Failed to reset port\n");
566
567	return err;
568}
569
570static int __init ionic_init_module(void)
571{
572	int ret;
573
574	ionic_debugfs_create();
575	ret = ionic_bus_register_driver();
576	if (ret)
577		ionic_debugfs_destroy();
578
579	return ret;
580}
581
582static void __exit ionic_cleanup_module(void)
583{
584	ionic_bus_unregister_driver();
585	ionic_debugfs_destroy();
586
587	pr_info("%s removed\n", IONIC_DRV_NAME);
588}
589
590module_init(ionic_init_module);
591module_exit(ionic_cleanup_module);
592