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