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