1/*
2 * Copyright (c) 2006, 2007, 2008, 2009 QLogic Corporation. All rights reserved.
3 * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved.
4 *
5 * This software is available to you under a choice of one of two
6 * licenses.  You may choose to be licensed under the terms of the GNU
7 * General Public License (GPL) Version 2, available from the file
8 * COPYING in the main directory of this source tree, or the
9 * OpenIB.org BSD license below:
10 *
11 *     Redistribution and use in source and binary forms, with or
12 *     without modification, are permitted provided that the following
13 *     conditions are met:
14 *
15 *      - Redistributions of source code must retain the above
16 *        copyright notice, this list of conditions and the following
17 *        disclaimer.
18 *
19 *      - Redistributions in binary form must reproduce the above
20 *        copyright notice, this list of conditions and the following
21 *        disclaimer in the documentation and/or other materials
22 *        provided with the distribution.
23 *
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31 * SOFTWARE.
32 */
33
34#include <linux/delay.h>
35#include <linux/pci.h>
36#include <linux/vmalloc.h>
37
38#include "qib.h"
39#include "qib_qsfp.h"
40
41/*
42 * QSFP support for ib_qib driver, using "Two Wire Serial Interface" driver
43 * in qib_twsi.c
44 */
45#define QSFP_MAX_RETRY 4
46
47static int qsfp_read(struct qib_pportdata *ppd, int addr, void *bp, int len)
48{
49	struct qib_devdata *dd = ppd->dd;
50	u32 out, mask;
51	int ret, cnt, pass = 0;
52	int stuck = 0;
53	u8 *buff = bp;
54
55	ret = mutex_lock_interruptible(&dd->eep_lock);
56	if (ret)
57		goto no_unlock;
58
59	if (dd->twsi_eeprom_dev == QIB_TWSI_NO_DEV) {
60		ret = -ENXIO;
61		goto bail;
62	}
63
64	/*
65	 * We presume, if we are called at all, that this board has
66	 * QSFP. This is on the same i2c chain as the legacy parts,
67	 * but only responds if the module is selected via GPIO pins.
68	 * Further, there are very long setup and hold requirements
69	 * on MODSEL.
70	 */
71	mask = QSFP_GPIO_MOD_SEL_N | QSFP_GPIO_MOD_RST_N | QSFP_GPIO_LP_MODE;
72	out = QSFP_GPIO_MOD_RST_N | QSFP_GPIO_LP_MODE;
73	if (ppd->hw_pidx) {
74		mask <<= QSFP_GPIO_PORT2_SHIFT;
75		out <<= QSFP_GPIO_PORT2_SHIFT;
76	}
77
78	dd->f_gpio_mod(dd, out, mask, mask);
79
80	/*
81	 * Module could take up to 2 Msec to respond to MOD_SEL, and there
82	 * is no way to tell if it is ready, so we must wait.
83	 */
84	msleep(20);
85
86	/* Make sure TWSI bus is in sane state. */
87	ret = qib_twsi_reset(dd);
88	if (ret) {
89		qib_dev_porterr(dd, ppd->port,
90				"QSFP interface Reset for read failed\n");
91		ret = -EIO;
92		stuck = 1;
93		goto deselect;
94	}
95
96	/* All QSFP modules are at A0 */
97
98	cnt = 0;
99	while (cnt < len) {
100		unsigned in_page;
101		int wlen = len - cnt;
102
103		in_page = addr % QSFP_PAGESIZE;
104		if ((in_page + wlen) > QSFP_PAGESIZE)
105			wlen = QSFP_PAGESIZE - in_page;
106		ret = qib_twsi_blk_rd(dd, QSFP_DEV, addr, buff + cnt, wlen);
107		/* Some QSFP's fail first try. Retry as experiment */
108		if (ret && cnt == 0 && ++pass < QSFP_MAX_RETRY)
109			continue;
110		if (ret) {
111			/* qib_twsi_blk_rd() 1 for error, else 0 */
112			ret = -EIO;
113			goto deselect;
114		}
115		addr += wlen;
116		cnt += wlen;
117	}
118	ret = cnt;
119
120deselect:
121	/*
122	 * Module could take up to 10 uSec after transfer before
123	 * ready to respond to MOD_SEL negation, and there is no way
124	 * to tell if it is ready, so we must wait.
125	 */
126	udelay(10);
127	/* set QSFP MODSEL, RST. LP all high */
128	dd->f_gpio_mod(dd, mask, mask, mask);
129
130	/*
131	 * Module could take up to 2 Msec to respond to MOD_SEL
132	 * going away, and there is no way to tell if it is ready.
133	 * so we must wait.
134	 */
135	if (stuck)
136		qib_dev_err(dd, "QSFP interface bus stuck non-idle\n");
137
138	if (pass >= QSFP_MAX_RETRY && ret)
139		qib_dev_porterr(dd, ppd->port, "QSFP failed even retrying\n");
140	else if (pass)
141		qib_dev_porterr(dd, ppd->port, "QSFP retries: %d\n", pass);
142
143	msleep(20);
144
145bail:
146	mutex_unlock(&dd->eep_lock);
147
148no_unlock:
149	return ret;
150}
151
152/*
153 * qsfp_write
154 * We do not ordinarily write the QSFP, but this is needed to select
155 * the page on non-flat QSFPs, and possibly later unusual cases
156 */
157static int qib_qsfp_write(struct qib_pportdata *ppd, int addr, void *bp,
158			  int len)
159{
160	struct qib_devdata *dd = ppd->dd;
161	u32 out, mask;
162	int ret, cnt;
163	u8 *buff = bp;
164
165	ret = mutex_lock_interruptible(&dd->eep_lock);
166	if (ret)
167		goto no_unlock;
168
169	if (dd->twsi_eeprom_dev == QIB_TWSI_NO_DEV) {
170		ret = -ENXIO;
171		goto bail;
172	}
173
174	/*
175	 * We presume, if we are called at all, that this board has
176	 * QSFP. This is on the same i2c chain as the legacy parts,
177	 * but only responds if the module is selected via GPIO pins.
178	 * Further, there are very long setup and hold requirements
179	 * on MODSEL.
180	 */
181	mask = QSFP_GPIO_MOD_SEL_N | QSFP_GPIO_MOD_RST_N | QSFP_GPIO_LP_MODE;
182	out = QSFP_GPIO_MOD_RST_N | QSFP_GPIO_LP_MODE;
183	if (ppd->hw_pidx) {
184		mask <<= QSFP_GPIO_PORT2_SHIFT;
185		out <<= QSFP_GPIO_PORT2_SHIFT;
186	}
187	dd->f_gpio_mod(dd, out, mask, mask);
188
189	/*
190	 * Module could take up to 2 Msec to respond to MOD_SEL,
191	 * and there is no way to tell if it is ready, so we must wait.
192	 */
193	msleep(20);
194
195	/* Make sure TWSI bus is in sane state. */
196	ret = qib_twsi_reset(dd);
197	if (ret) {
198		qib_dev_porterr(dd, ppd->port,
199				"QSFP interface Reset for write failed\n");
200		ret = -EIO;
201		goto deselect;
202	}
203
204	/* All QSFP modules are at A0 */
205
206	cnt = 0;
207	while (cnt < len) {
208		unsigned in_page;
209		int wlen = len - cnt;
210
211		in_page = addr % QSFP_PAGESIZE;
212		if ((in_page + wlen) > QSFP_PAGESIZE)
213			wlen = QSFP_PAGESIZE - in_page;
214		ret = qib_twsi_blk_wr(dd, QSFP_DEV, addr, buff + cnt, wlen);
215		if (ret) {
216			/* qib_twsi_blk_wr() 1 for error, else 0 */
217			ret = -EIO;
218			goto deselect;
219		}
220		addr += wlen;
221		cnt += wlen;
222	}
223	ret = cnt;
224
225deselect:
226	/*
227	 * Module could take up to 10 uSec after transfer before
228	 * ready to respond to MOD_SEL negation, and there is no way
229	 * to tell if it is ready, so we must wait.
230	 */
231	udelay(10);
232	/* set QSFP MODSEL, RST, LP high */
233	dd->f_gpio_mod(dd, mask, mask, mask);
234	/*
235	 * Module could take up to 2 Msec to respond to MOD_SEL
236	 * going away, and there is no way to tell if it is ready.
237	 * so we must wait.
238	 */
239	msleep(20);
240
241bail:
242	mutex_unlock(&dd->eep_lock);
243
244no_unlock:
245	return ret;
246}
247
248/*
249 * For validation, we want to check the checksums, even of the
250 * fields we do not otherwise use. This function reads the bytes from
251 * <first> to <next-1> and returns the 8lsbs of the sum, or <0 for errors
252 */
253static int qsfp_cks(struct qib_pportdata *ppd, int first, int next)
254{
255	int ret;
256	u16 cks;
257	u8 bval;
258
259	cks = 0;
260	while (first < next) {
261		ret = qsfp_read(ppd, first, &bval, 1);
262		if (ret < 0)
263			goto bail;
264		cks += bval;
265		++first;
266	}
267	ret = cks & 0xFF;
268bail:
269	return ret;
270
271}
272
273int qib_refresh_qsfp_cache(struct qib_pportdata *ppd, struct qib_qsfp_cache *cp)
274{
275	int ret;
276	int idx;
277	u16 cks;
278	u8 peek[4];
279
280	/* ensure sane contents on invalid reads, for cable swaps */
281	memset(cp, 0, sizeof(*cp));
282
283	if (!qib_qsfp_mod_present(ppd)) {
284		ret = -ENODEV;
285		goto bail;
286	}
287
288	ret = qsfp_read(ppd, 0, peek, 3);
289	if (ret < 0)
290		goto bail;
291	if ((peek[0] & 0xFE) != 0x0C)
292		qib_dev_porterr(ppd->dd, ppd->port,
293				"QSFP byte0 is 0x%02X, S/B 0x0C/D\n", peek[0]);
294
295	if ((peek[2] & 4) == 0) {
296		/*
297		 * If cable is paged, rather than "flat memory", we need to
298		 * set the page to zero, Even if it already appears to be zero.
299		 */
300		u8 poke = 0;
301
302		ret = qib_qsfp_write(ppd, 127, &poke, 1);
303		udelay(50);
304		if (ret != 1) {
305			qib_dev_porterr(ppd->dd, ppd->port,
306					"Failed QSFP Page set\n");
307			goto bail;
308		}
309	}
310
311	ret = qsfp_read(ppd, QSFP_MOD_ID_OFFS, &cp->id, 1);
312	if (ret < 0)
313		goto bail;
314	if ((cp->id & 0xFE) != 0x0C)
315		qib_dev_porterr(ppd->dd, ppd->port,
316				"QSFP ID byte is 0x%02X, S/B 0x0C/D\n", cp->id);
317	cks = cp->id;
318
319	ret = qsfp_read(ppd, QSFP_MOD_PWR_OFFS, &cp->pwr, 1);
320	if (ret < 0)
321		goto bail;
322	cks += cp->pwr;
323
324	ret = qsfp_cks(ppd, QSFP_MOD_PWR_OFFS + 1, QSFP_MOD_LEN_OFFS);
325	if (ret < 0)
326		goto bail;
327	cks += ret;
328
329	ret = qsfp_read(ppd, QSFP_MOD_LEN_OFFS, &cp->len, 1);
330	if (ret < 0)
331		goto bail;
332	cks += cp->len;
333
334	ret = qsfp_read(ppd, QSFP_MOD_TECH_OFFS, &cp->tech, 1);
335	if (ret < 0)
336		goto bail;
337	cks += cp->tech;
338
339	ret = qsfp_read(ppd, QSFP_VEND_OFFS, &cp->vendor, QSFP_VEND_LEN);
340	if (ret < 0)
341		goto bail;
342	for (idx = 0; idx < QSFP_VEND_LEN; ++idx)
343		cks += cp->vendor[idx];
344
345	ret = qsfp_read(ppd, QSFP_IBXCV_OFFS, &cp->xt_xcv, 1);
346	if (ret < 0)
347		goto bail;
348	cks += cp->xt_xcv;
349
350	ret = qsfp_read(ppd, QSFP_VOUI_OFFS, &cp->oui, QSFP_VOUI_LEN);
351	if (ret < 0)
352		goto bail;
353	for (idx = 0; idx < QSFP_VOUI_LEN; ++idx)
354		cks += cp->oui[idx];
355
356	ret = qsfp_read(ppd, QSFP_PN_OFFS, &cp->partnum, QSFP_PN_LEN);
357	if (ret < 0)
358		goto bail;
359	for (idx = 0; idx < QSFP_PN_LEN; ++idx)
360		cks += cp->partnum[idx];
361
362	ret = qsfp_read(ppd, QSFP_REV_OFFS, &cp->rev, QSFP_REV_LEN);
363	if (ret < 0)
364		goto bail;
365	for (idx = 0; idx < QSFP_REV_LEN; ++idx)
366		cks += cp->rev[idx];
367
368	ret = qsfp_read(ppd, QSFP_ATTEN_OFFS, &cp->atten, QSFP_ATTEN_LEN);
369	if (ret < 0)
370		goto bail;
371	for (idx = 0; idx < QSFP_ATTEN_LEN; ++idx)
372		cks += cp->atten[idx];
373
374	ret = qsfp_cks(ppd, QSFP_ATTEN_OFFS + QSFP_ATTEN_LEN, QSFP_CC_OFFS);
375	if (ret < 0)
376		goto bail;
377	cks += ret;
378
379	cks &= 0xFF;
380	ret = qsfp_read(ppd, QSFP_CC_OFFS, &cp->cks1, 1);
381	if (ret < 0)
382		goto bail;
383	if (cks != cp->cks1)
384		qib_dev_porterr(ppd->dd, ppd->port,
385				"QSFP cks1 is %02X, computed %02X\n", cp->cks1,
386				cks);
387
388	/* Second checksum covers 192 to (serial, date, lot) */
389	ret = qsfp_cks(ppd, QSFP_CC_OFFS + 1, QSFP_SN_OFFS);
390	if (ret < 0)
391		goto bail;
392	cks = ret;
393
394	ret = qsfp_read(ppd, QSFP_SN_OFFS, &cp->serial, QSFP_SN_LEN);
395	if (ret < 0)
396		goto bail;
397	for (idx = 0; idx < QSFP_SN_LEN; ++idx)
398		cks += cp->serial[idx];
399
400	ret = qsfp_read(ppd, QSFP_DATE_OFFS, &cp->date, QSFP_DATE_LEN);
401	if (ret < 0)
402		goto bail;
403	for (idx = 0; idx < QSFP_DATE_LEN; ++idx)
404		cks += cp->date[idx];
405
406	ret = qsfp_read(ppd, QSFP_LOT_OFFS, &cp->lot, QSFP_LOT_LEN);
407	if (ret < 0)
408		goto bail;
409	for (idx = 0; idx < QSFP_LOT_LEN; ++idx)
410		cks += cp->lot[idx];
411
412	ret = qsfp_cks(ppd, QSFP_LOT_OFFS + QSFP_LOT_LEN, QSFP_CC_EXT_OFFS);
413	if (ret < 0)
414		goto bail;
415	cks += ret;
416
417	ret = qsfp_read(ppd, QSFP_CC_EXT_OFFS, &cp->cks2, 1);
418	if (ret < 0)
419		goto bail;
420	cks &= 0xFF;
421	if (cks != cp->cks2)
422		qib_dev_porterr(ppd->dd, ppd->port,
423				"QSFP cks2 is %02X, computed %02X\n", cp->cks2,
424				cks);
425	return 0;
426
427bail:
428	cp->id = 0;
429	return ret;
430}
431
432const char * const qib_qsfp_devtech[16] = {
433	"850nm VCSEL", "1310nm VCSEL", "1550nm VCSEL", "1310nm FP",
434	"1310nm DFB", "1550nm DFB", "1310nm EML", "1550nm EML",
435	"Cu Misc", "1490nm DFB", "Cu NoEq", "Cu Eq",
436	"Undef", "Cu Active BothEq", "Cu FarEq", "Cu NearEq"
437};
438
439#define QSFP_DUMP_CHUNK 16 /* Holds longest string */
440#define QSFP_DEFAULT_HDR_CNT 224
441
442static const char *pwr_codes = "1.5W2.0W2.5W3.5W";
443
444int qib_qsfp_mod_present(struct qib_pportdata *ppd)
445{
446	u32 mask;
447	int ret;
448
449	mask = QSFP_GPIO_MOD_PRS_N <<
450		(ppd->hw_pidx * QSFP_GPIO_PORT2_SHIFT);
451	ret = ppd->dd->f_gpio_mod(ppd->dd, 0, 0, 0);
452
453	return !((ret & mask) >>
454		 ((ppd->hw_pidx * QSFP_GPIO_PORT2_SHIFT) + 3));
455}
456
457/*
458 * Initialize structures that control access to QSFP. Called once per port
459 * on cards that support QSFP.
460 */
461void qib_qsfp_init(struct qib_qsfp_data *qd,
462		   void (*fevent)(struct work_struct *))
463{
464	u32 mask, highs;
465
466	struct qib_devdata *dd = qd->ppd->dd;
467
468	/* Initialize work struct for later QSFP events */
469	INIT_WORK(&qd->work, fevent);
470
471	/*
472	 * Later, we may want more validation. For now, just set up pins and
473	 * blip reset. If module is present, call qib_refresh_qsfp_cache(),
474	 * to do further init.
475	 */
476	mask = QSFP_GPIO_MOD_SEL_N | QSFP_GPIO_MOD_RST_N | QSFP_GPIO_LP_MODE;
477	highs = mask - QSFP_GPIO_MOD_RST_N;
478	if (qd->ppd->hw_pidx) {
479		mask <<= QSFP_GPIO_PORT2_SHIFT;
480		highs <<= QSFP_GPIO_PORT2_SHIFT;
481	}
482	dd->f_gpio_mod(dd, highs, mask, mask);
483	udelay(20); /* Generous RST dwell */
484
485	dd->f_gpio_mod(dd, mask, mask, mask);
486}
487
488int qib_qsfp_dump(struct qib_pportdata *ppd, char *buf, int len)
489{
490	struct qib_qsfp_cache cd;
491	u8 bin_buff[QSFP_DUMP_CHUNK];
492	char lenstr[6];
493	int sofar, ret;
494	int bidx = 0;
495
496	sofar = 0;
497	ret = qib_refresh_qsfp_cache(ppd, &cd);
498	if (ret < 0)
499		goto bail;
500
501	lenstr[0] = ' ';
502	lenstr[1] = '\0';
503	if (QSFP_IS_CU(cd.tech))
504		sprintf(lenstr, "%dM ", cd.len);
505
506	sofar += scnprintf(buf + sofar, len - sofar, "PWR:%.3sW\n", pwr_codes +
507			   (QSFP_PWR(cd.pwr) * 4));
508
509	sofar += scnprintf(buf + sofar, len - sofar, "TECH:%s%s\n", lenstr,
510			   qib_qsfp_devtech[cd.tech >> 4]);
511
512	sofar += scnprintf(buf + sofar, len - sofar, "Vendor:%.*s\n",
513			   QSFP_VEND_LEN, cd.vendor);
514
515	sofar += scnprintf(buf + sofar, len - sofar, "OUI:%06X\n",
516			   QSFP_OUI(cd.oui));
517
518	sofar += scnprintf(buf + sofar, len - sofar, "Part#:%.*s\n",
519			   QSFP_PN_LEN, cd.partnum);
520	sofar += scnprintf(buf + sofar, len - sofar, "Rev:%.*s\n",
521			   QSFP_REV_LEN, cd.rev);
522	if (QSFP_IS_CU(cd.tech))
523		sofar += scnprintf(buf + sofar, len - sofar, "Atten:%d, %d\n",
524				   QSFP_ATTEN_SDR(cd.atten),
525				   QSFP_ATTEN_DDR(cd.atten));
526	sofar += scnprintf(buf + sofar, len - sofar, "Serial:%.*s\n",
527			   QSFP_SN_LEN, cd.serial);
528	sofar += scnprintf(buf + sofar, len - sofar, "Date:%.*s\n",
529			   QSFP_DATE_LEN, cd.date);
530	sofar += scnprintf(buf + sofar, len - sofar, "Lot:%.*s\n",
531			   QSFP_LOT_LEN, cd.lot);
532
533	while (bidx < QSFP_DEFAULT_HDR_CNT) {
534		int iidx;
535
536		ret = qsfp_read(ppd, bidx, bin_buff, QSFP_DUMP_CHUNK);
537		if (ret < 0)
538			goto bail;
539		for (iidx = 0; iidx < ret; ++iidx) {
540			sofar += scnprintf(buf + sofar, len-sofar, " %02X",
541				bin_buff[iidx]);
542		}
543		sofar += scnprintf(buf + sofar, len - sofar, "\n");
544		bidx += QSFP_DUMP_CHUNK;
545	}
546	ret = sofar;
547bail:
548	return ret;
549}
550