[go: nahoru, domu]

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(2);
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		in_page = addr % QSFP_PAGESIZE;
103		if ((in_page + wlen) > QSFP_PAGESIZE)
104			wlen = QSFP_PAGESIZE - in_page;
105		ret = qib_twsi_blk_rd(dd, QSFP_DEV, addr, buff + cnt, wlen);
106		/* Some QSFP's fail first try. Retry as experiment */
107		if (ret && cnt == 0 && ++pass < QSFP_MAX_RETRY)
108			continue;
109		if (ret) {
110			/* qib_twsi_blk_rd() 1 for error, else 0 */
111			ret = -EIO;
112			goto deselect;
113		}
114		addr += wlen;
115		cnt += wlen;
116	}
117	ret = cnt;
118
119deselect:
120	/*
121	 * Module could take up to 10 uSec after transfer before
122	 * ready to respond to MOD_SEL negation, and there is no way
123	 * to tell if it is ready, so we must wait.
124	 */
125	udelay(10);
126	/* set QSFP MODSEL, RST. LP all high */
127	dd->f_gpio_mod(dd, mask, mask, mask);
128
129	/*
130	 * Module could take up to 2 Msec to respond to MOD_SEL
131	 * going away, and there is no way to tell if it is ready.
132	 * so we must wait.
133	 */
134	if (stuck)
135		qib_dev_err(dd, "QSFP interface bus stuck non-idle\n");
136
137	if (pass >= QSFP_MAX_RETRY && ret)
138		qib_dev_porterr(dd, ppd->port, "QSFP failed even retrying\n");
139	else if (pass)
140		qib_dev_porterr(dd, ppd->port, "QSFP retries: %d\n", pass);
141
142	msleep(2);
143
144bail:
145	mutex_unlock(&dd->eep_lock);
146
147no_unlock:
148	return ret;
149}
150
151/*
152 * qsfp_write
153 * We do not ordinarily write the QSFP, but this is needed to select
154 * the page on non-flat QSFPs, and possibly later unusual cases
155 */
156static int qib_qsfp_write(struct qib_pportdata *ppd, int addr, void *bp,
157			  int len)
158{
159	struct qib_devdata *dd = ppd->dd;
160	u32 out, mask;
161	int ret, cnt;
162	u8 *buff = bp;
163
164	ret = mutex_lock_interruptible(&dd->eep_lock);
165	if (ret)
166		goto no_unlock;
167
168	if (dd->twsi_eeprom_dev == QIB_TWSI_NO_DEV) {
169		ret = -ENXIO;
170		goto bail;
171	}
172
173	/*
174	 * We presume, if we are called at all, that this board has
175	 * QSFP. This is on the same i2c chain as the legacy parts,
176	 * but only responds if the module is selected via GPIO pins.
177	 * Further, there are very long setup and hold requirements
178	 * on MODSEL.
179	 */
180	mask = QSFP_GPIO_MOD_SEL_N | QSFP_GPIO_MOD_RST_N | QSFP_GPIO_LP_MODE;
181	out = QSFP_GPIO_MOD_RST_N | QSFP_GPIO_LP_MODE;
182	if (ppd->hw_pidx) {
183		mask <<= QSFP_GPIO_PORT2_SHIFT;
184		out <<= QSFP_GPIO_PORT2_SHIFT;
185	}
186	dd->f_gpio_mod(dd, out, mask, mask);
187
188	/*
189	 * Module could take up to 2 Msec to respond to MOD_SEL,
190	 * and there is no way to tell if it is ready, so we must wait.
191	 */
192	msleep(2);
193
194	/* Make sure TWSI bus is in sane state. */
195	ret = qib_twsi_reset(dd);
196	if (ret) {
197		qib_dev_porterr(dd, ppd->port,
198				"QSFP interface Reset for write failed\n");
199		ret = -EIO;
200		goto deselect;
201	}
202
203	/* All QSFP modules are at A0 */
204
205	cnt = 0;
206	while (cnt < len) {
207		unsigned in_page;
208		int wlen = len - cnt;
209		in_page = addr % QSFP_PAGESIZE;
210		if ((in_page + wlen) > QSFP_PAGESIZE)
211			wlen = QSFP_PAGESIZE - in_page;
212		ret = qib_twsi_blk_wr(dd, QSFP_DEV, addr, buff + cnt, wlen);
213		if (ret) {
214			/* qib_twsi_blk_wr() 1 for error, else 0 */
215			ret = -EIO;
216			goto deselect;
217		}
218		addr += wlen;
219		cnt += wlen;
220	}
221	ret = cnt;
222
223deselect:
224	/*
225	 * Module could take up to 10 uSec after transfer before
226	 * ready to respond to MOD_SEL negation, and there is no way
227	 * to tell if it is ready, so we must wait.
228	 */
229	udelay(10);
230	/* set QSFP MODSEL, RST, LP high */
231	dd->f_gpio_mod(dd, mask, mask, mask);
232	/*
233	 * Module could take up to 2 Msec to respond to MOD_SEL
234	 * going away, and there is no way to tell if it is ready.
235	 * so we must wait.
236	 */
237	msleep(2);
238
239bail:
240	mutex_unlock(&dd->eep_lock);
241
242no_unlock:
243	return ret;
244}
245
246/*
247 * For validation, we want to check the checksums, even of the
248 * fields we do not otherwise use. This function reads the bytes from
249 * <first> to <next-1> and returns the 8lsbs of the sum, or <0 for errors
250 */
251static int qsfp_cks(struct qib_pportdata *ppd, int first, int next)
252{
253	int ret;
254	u16 cks;
255	u8 bval;
256
257	cks = 0;
258	while (first < next) {
259		ret = qsfp_read(ppd, first, &bval, 1);
260		if (ret < 0)
261			goto bail;
262		cks += bval;
263		++first;
264	}
265	ret = cks & 0xFF;
266bail:
267	return ret;
268
269}
270
271int qib_refresh_qsfp_cache(struct qib_pportdata *ppd, struct qib_qsfp_cache *cp)
272{
273	int ret;
274	int idx;
275	u16 cks;
276	u8 peek[4];
277
278	/* ensure sane contents on invalid reads, for cable swaps */
279	memset(cp, 0, sizeof(*cp));
280
281	if (!qib_qsfp_mod_present(ppd)) {
282		ret = -ENODEV;
283		goto bail;
284	}
285
286	ret = qsfp_read(ppd, 0, peek, 3);
287	if (ret < 0)
288		goto bail;
289	if ((peek[0] & 0xFE) != 0x0C)
290		qib_dev_porterr(ppd->dd, ppd->port,
291				"QSFP byte0 is 0x%02X, S/B 0x0C/D\n", peek[0]);
292
293	if ((peek[2] & 2) == 0) {
294		/*
295		 * If cable is paged, rather than "flat memory", we need to
296		 * set the page to zero, Even if it already appears to be zero.
297		 */
298		u8 poke = 0;
299		ret = qib_qsfp_write(ppd, 127, &poke, 1);
300		udelay(50);
301		if (ret != 1) {
302			qib_dev_porterr(ppd->dd, ppd->port,
303					"Failed QSFP Page set\n");
304			goto bail;
305		}
306	}
307
308	ret = qsfp_read(ppd, QSFP_MOD_ID_OFFS, &cp->id, 1);
309	if (ret < 0)
310		goto bail;
311	if ((cp->id & 0xFE) != 0x0C)
312		qib_dev_porterr(ppd->dd, ppd->port,
313				"QSFP ID byte is 0x%02X, S/B 0x0C/D\n", cp->id);
314	cks = cp->id;
315
316	ret = qsfp_read(ppd, QSFP_MOD_PWR_OFFS, &cp->pwr, 1);
317	if (ret < 0)
318		goto bail;
319	cks += cp->pwr;
320
321	ret = qsfp_cks(ppd, QSFP_MOD_PWR_OFFS + 1, QSFP_MOD_LEN_OFFS);
322	if (ret < 0)
323		goto bail;
324	cks += ret;
325
326	ret = qsfp_read(ppd, QSFP_MOD_LEN_OFFS, &cp->len, 1);
327	if (ret < 0)
328		goto bail;
329	cks += cp->len;
330
331	ret = qsfp_read(ppd, QSFP_MOD_TECH_OFFS, &cp->tech, 1);
332	if (ret < 0)
333		goto bail;
334	cks += cp->tech;
335
336	ret = qsfp_read(ppd, QSFP_VEND_OFFS, &cp->vendor, QSFP_VEND_LEN);
337	if (ret < 0)
338		goto bail;
339	for (idx = 0; idx < QSFP_VEND_LEN; ++idx)
340		cks += cp->vendor[idx];
341
342	ret = qsfp_read(ppd, QSFP_IBXCV_OFFS, &cp->xt_xcv, 1);
343	if (ret < 0)
344		goto bail;
345	cks += cp->xt_xcv;
346
347	ret = qsfp_read(ppd, QSFP_VOUI_OFFS, &cp->oui, QSFP_VOUI_LEN);
348	if (ret < 0)
349		goto bail;
350	for (idx = 0; idx < QSFP_VOUI_LEN; ++idx)
351		cks += cp->oui[idx];
352
353	ret = qsfp_read(ppd, QSFP_PN_OFFS, &cp->partnum, QSFP_PN_LEN);
354	if (ret < 0)
355		goto bail;
356	for (idx = 0; idx < QSFP_PN_LEN; ++idx)
357		cks += cp->partnum[idx];
358
359	ret = qsfp_read(ppd, QSFP_REV_OFFS, &cp->rev, QSFP_REV_LEN);
360	if (ret < 0)
361		goto bail;
362	for (idx = 0; idx < QSFP_REV_LEN; ++idx)
363		cks += cp->rev[idx];
364
365	ret = qsfp_read(ppd, QSFP_ATTEN_OFFS, &cp->atten, QSFP_ATTEN_LEN);
366	if (ret < 0)
367		goto bail;
368	for (idx = 0; idx < QSFP_ATTEN_LEN; ++idx)
369		cks += cp->atten[idx];
370
371	ret = qsfp_cks(ppd, QSFP_ATTEN_OFFS + QSFP_ATTEN_LEN, QSFP_CC_OFFS);
372	if (ret < 0)
373		goto bail;
374	cks += ret;
375
376	cks &= 0xFF;
377	ret = qsfp_read(ppd, QSFP_CC_OFFS, &cp->cks1, 1);
378	if (ret < 0)
379		goto bail;
380	if (cks != cp->cks1)
381		qib_dev_porterr(ppd->dd, ppd->port,
382				"QSFP cks1 is %02X, computed %02X\n", cp->cks1,
383				cks);
384
385	/* Second checksum covers 192 to (serial, date, lot) */
386	ret = qsfp_cks(ppd, QSFP_CC_OFFS + 1, QSFP_SN_OFFS);
387	if (ret < 0)
388		goto bail;
389	cks = ret;
390
391	ret = qsfp_read(ppd, QSFP_SN_OFFS, &cp->serial, QSFP_SN_LEN);
392	if (ret < 0)
393		goto bail;
394	for (idx = 0; idx < QSFP_SN_LEN; ++idx)
395		cks += cp->serial[idx];
396
397	ret = qsfp_read(ppd, QSFP_DATE_OFFS, &cp->date, QSFP_DATE_LEN);
398	if (ret < 0)
399		goto bail;
400	for (idx = 0; idx < QSFP_DATE_LEN; ++idx)
401		cks += cp->date[idx];
402
403	ret = qsfp_read(ppd, QSFP_LOT_OFFS, &cp->lot, QSFP_LOT_LEN);
404	if (ret < 0)
405		goto bail;
406	for (idx = 0; idx < QSFP_LOT_LEN; ++idx)
407		cks += cp->lot[idx];
408
409	ret = qsfp_cks(ppd, QSFP_LOT_OFFS + QSFP_LOT_LEN, QSFP_CC_EXT_OFFS);
410	if (ret < 0)
411		goto bail;
412	cks += ret;
413
414	ret = qsfp_read(ppd, QSFP_CC_EXT_OFFS, &cp->cks2, 1);
415	if (ret < 0)
416		goto bail;
417	cks &= 0xFF;
418	if (cks != cp->cks2)
419		qib_dev_porterr(ppd->dd, ppd->port,
420				"QSFP cks2 is %02X, computed %02X\n", cp->cks2,
421				cks);
422	return 0;
423
424bail:
425	cp->id = 0;
426	return ret;
427}
428
429const char * const qib_qsfp_devtech[16] = {
430	"850nm VCSEL", "1310nm VCSEL", "1550nm VCSEL", "1310nm FP",
431	"1310nm DFB", "1550nm DFB", "1310nm EML", "1550nm EML",
432	"Cu Misc", "1490nm DFB", "Cu NoEq", "Cu Eq",
433	"Undef", "Cu Active BothEq", "Cu FarEq", "Cu NearEq"
434};
435
436#define QSFP_DUMP_CHUNK 16 /* Holds longest string */
437#define QSFP_DEFAULT_HDR_CNT 224
438
439static const char *pwr_codes = "1.5W2.0W2.5W3.5W";
440
441int qib_qsfp_mod_present(struct qib_pportdata *ppd)
442{
443	u32 mask;
444	int ret;
445
446	mask = QSFP_GPIO_MOD_PRS_N <<
447		(ppd->hw_pidx * QSFP_GPIO_PORT2_SHIFT);
448	ret = ppd->dd->f_gpio_mod(ppd->dd, 0, 0, 0);
449
450	return !((ret & mask) >>
451		 ((ppd->hw_pidx * QSFP_GPIO_PORT2_SHIFT) + 3));
452}
453
454/*
455 * Initialize structures that control access to QSFP. Called once per port
456 * on cards that support QSFP.
457 */
458void qib_qsfp_init(struct qib_qsfp_data *qd,
459		   void (*fevent)(struct work_struct *))
460{
461	u32 mask, highs;
462
463	struct qib_devdata *dd = qd->ppd->dd;
464
465	/* Initialize work struct for later QSFP events */
466	INIT_WORK(&qd->work, fevent);
467
468	/*
469	 * Later, we may want more validation. For now, just set up pins and
470	 * blip reset. If module is present, call qib_refresh_qsfp_cache(),
471	 * to do further init.
472	 */
473	mask = QSFP_GPIO_MOD_SEL_N | QSFP_GPIO_MOD_RST_N | QSFP_GPIO_LP_MODE;
474	highs = mask - QSFP_GPIO_MOD_RST_N;
475	if (qd->ppd->hw_pidx) {
476		mask <<= QSFP_GPIO_PORT2_SHIFT;
477		highs <<= QSFP_GPIO_PORT2_SHIFT;
478	}
479	dd->f_gpio_mod(dd, highs, mask, mask);
480	udelay(20); /* Generous RST dwell */
481
482	dd->f_gpio_mod(dd, mask, mask, mask);
483	return;
484}
485
486void qib_qsfp_deinit(struct qib_qsfp_data *qd)
487{
488	/*
489	 * There is nothing to do here for now.  our work is scheduled
490	 * with queue_work(), and flush_workqueue() from remove_one
491	 * will block until all work setup with queue_work()
492	 * completes.
493	 */
494}
495
496int qib_qsfp_dump(struct qib_pportdata *ppd, char *buf, int len)
497{
498	struct qib_qsfp_cache cd;
499	u8 bin_buff[QSFP_DUMP_CHUNK];
500	char lenstr[6];
501	int sofar, ret;
502	int bidx = 0;
503
504	sofar = 0;
505	ret = qib_refresh_qsfp_cache(ppd, &cd);
506	if (ret < 0)
507		goto bail;
508
509	lenstr[0] = ' ';
510	lenstr[1] = '\0';
511	if (QSFP_IS_CU(cd.tech))
512		sprintf(lenstr, "%dM ", cd.len);
513
514	sofar += scnprintf(buf + sofar, len - sofar, "PWR:%.3sW\n", pwr_codes +
515			   (QSFP_PWR(cd.pwr) * 4));
516
517	sofar += scnprintf(buf + sofar, len - sofar, "TECH:%s%s\n", lenstr,
518			   qib_qsfp_devtech[cd.tech >> 4]);
519
520	sofar += scnprintf(buf + sofar, len - sofar, "Vendor:%.*s\n",
521			   QSFP_VEND_LEN, cd.vendor);
522
523	sofar += scnprintf(buf + sofar, len - sofar, "OUI:%06X\n",
524			   QSFP_OUI(cd.oui));
525
526	sofar += scnprintf(buf + sofar, len - sofar, "Part#:%.*s\n",
527			   QSFP_PN_LEN, cd.partnum);
528	sofar += scnprintf(buf + sofar, len - sofar, "Rev:%.*s\n",
529			   QSFP_REV_LEN, cd.rev);
530	if (QSFP_IS_CU(cd.tech))
531		sofar += scnprintf(buf + sofar, len - sofar, "Atten:%d, %d\n",
532				   QSFP_ATTEN_SDR(cd.atten),
533				   QSFP_ATTEN_DDR(cd.atten));
534	sofar += scnprintf(buf + sofar, len - sofar, "Serial:%.*s\n",
535			   QSFP_SN_LEN, cd.serial);
536	sofar += scnprintf(buf + sofar, len - sofar, "Date:%.*s\n",
537			   QSFP_DATE_LEN, cd.date);
538	sofar += scnprintf(buf + sofar, len - sofar, "Lot:%.*s\n",
539			   QSFP_LOT_LEN, cd.date);
540
541	while (bidx < QSFP_DEFAULT_HDR_CNT) {
542		int iidx;
543		ret = qsfp_read(ppd, bidx, bin_buff, QSFP_DUMP_CHUNK);
544		if (ret < 0)
545			goto bail;
546		for (iidx = 0; iidx < ret; ++iidx) {
547			sofar += scnprintf(buf + sofar, len-sofar, " %02X",
548				bin_buff[iidx]);
549		}
550		sofar += scnprintf(buf + sofar, len - sofar, "\n");
551		bidx += QSFP_DUMP_CHUNK;
552	}
553	ret = sofar;
554bail:
555	return ret;
556}
557