linux/drivers/infiniband/hw/qib/qib_qsfp.c
<<
>>
Prefs
   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