Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
qib_qsfp.c
Go to the documentation of this file.
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 
47 static 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 
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  */
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 
119 deselect:
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 
144 bail:
145  mutex_unlock(&dd->eep_lock);
146 
147 no_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  */
156 static 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 
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  */
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 
223 deselect:
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 
239 bail:
240  mutex_unlock(&dd->eep_lock);
241 
242 no_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  */
251 static 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;
266 bail:
267  return ret;
268 
269 }
270 
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 
424 bail:
425  cp->id = 0;
426  return ret;
427 }
428 
429 const 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 
439 static const char *pwr_codes = "1.5W2.0W2.5W3.5W";
440 
442 {
443  u32 mask;
444  int ret;
445 
446  mask = QSFP_GPIO_MOD_PRS_N <<
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  */
458 void 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  */
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 
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 
496 int 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;
554 bail:
555  return ret;
556 }