Print this page
NEX-5717 import QLogic 16G FC drivers
Reviewed by: Steve Peng <steve.peng@nexenta.com>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/fibre-channel/fca/qlc/ql_hba_fru.c
          +++ new/usr/src/uts/common/io/fibre-channel/fca/qlc/ql_hba_fru.c
↓ open down ↓ 11 lines elided ↑ open up ↑
  12   12   *
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22      -/* Copyright 2010 QLogic Corporation */
       22 +/* Copyright 2015 QLogic Corporation */
  23   23  
  24   24  /*
  25   25   * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  26   26   */
  27   27  
  28      -#pragma ident   "Copyright 2010 QLogic Corporation; ql_hba_fru.c"
       28 +#pragma ident   "Copyright 2015 QLogic Corporation; ql_hba_fru.c"
  29   29  
  30   30  /*
  31   31   * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver source file.
  32   32   *
  33   33   * ***********************************************************************
  34   34   * *                                                                    **
  35   35   * *                            NOTICE                                  **
  36      - * *            COPYRIGHT (C) 1996-2010 QLOGIC CORPORATION              **
       36 + * *            COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION              **
  37   37   * *                    ALL RIGHTS RESERVED                             **
  38   38   * *                                                                    **
  39   39   * ***********************************************************************
  40   40   *
  41   41   */
  42   42  
  43   43  /*
  44   44   * Determine HBA FRU card information for T11 FC-HBA
  45   45   */
  46   46  
↓ open down ↓ 185 lines elided ↑ open up ↑
 232  232  ql_populate_hba_fru_details(ql_adapter_state_t *ha,
 233  233      fc_fca_port_info_t *port_info)
 234  234  {
 235  235          fca_port_attrs_t        *attrs = &port_info->pi_attrs;
 236  236          uint16_t                chip = ha->device_id;
 237  237          uint16_t                model = ha->subsys_id;
 238  238          uint16_t                ssdevid = ha->subven_id;
 239  239          size_t                  vlen;
 240  240          int32_t                 i;
 241  241  
 242      -        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
      242 +        QL_PRINT_3(ha, "started\n");
 243  243  
 244  244          attrs = &port_info->pi_attrs;
 245  245  
 246  246          /* Constants */
 247  247          (void) snprintf(attrs->manufacturer, FCHBA_MANUFACTURER_LEN,
 248  248              "QLogic Corp.");
 249  249          (void) snprintf(attrs->driver_name, FCHBA_DRIVER_NAME_LEN,
 250  250              "%s", QL_NAME);
 251  251          (void) snprintf(attrs->driver_version, FCHBA_DRIVER_VERSION_LEN,
 252  252              "%s", ha->adapter_stats->revlvl.qlddv);
↓ open down ↓ 2 lines elided ↑ open up ↑
 255  255              attrs->serial_number, FCHBA_SERIAL_NUMBER_LEN)) == -1) {
 256  256                  attrs->serial_number[0] = '\0';
 257  257          }
 258  258          attrs->hardware_version[0] = '\0';
 259  259  
 260  260          /* Dynamic data */
 261  261          (void) snprintf(attrs->firmware_version, FCHBA_FIRMWARE_VERSION_LEN,
 262  262              "%02d.%02d.%02d", ha->fw_major_version, ha->fw_minor_version,
 263  263              ha->fw_subminor_version);
 264  264  
 265      -        CACHE_LOCK(ha);
 266      -
 267  265          /* Report FCode / BIOS / EFI version(s). */
 268  266          if (ha->fcache != NULL) {
 269  267                  uint32_t        types = FTYPE_BIOS|FTYPE_FCODE|FTYPE_EFI;
 270  268                  ql_fcache_t     *fptr = ha->fcache;
 271  269                  int8_t          *orv = &*attrs->option_rom_version;
 272  270  
 273  271                  while ((fptr != NULL) && (types != 0)) {
 274  272                          /* Get the next image */
 275  273                          if ((fptr = ql_get_fbuf(ha->fcache, types)) != NULL) {
 276  274  
↓ open down ↓ 16 lines elided ↑ open up ↑
 293  291                                  default:
 294  292                                          EL(ha, "ignoring ftype: %xh\n",
 295  293                                              fptr->type);
 296  294                                          break;
 297  295                                  }
 298  296                                  types &= ~(fptr->type);
 299  297                          }
 300  298                  }
 301  299          }
 302  300  
 303      -        CACHE_UNLOCK(ha);
 304      -
 305  301          if (strlen(attrs->option_rom_version) == 0) {
 306  302                  int             rval = -1;
 307  303                  uint32_t        i = 0;
 308  304                  caddr_t         fcode_ver_buf = NULL;
 309  305  
 310      -                if (CFG_IST(ha, CFG_CTRL_2200)) {
      306 +                if (CFG_IST(ha, CFG_CTRL_22XX)) {
 311  307                          /*LINTED [Solaris DDI_DEV_T_ANY Lint warning]*/
 312  308                          rval = ddi_getlongprop(DDI_DEV_T_ANY, ha->dip,
 313  309                              DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP, "version",
 314  310                              (caddr_t)&fcode_ver_buf, (int32_t *)&i);
 315  311                  }
 316  312  
 317  313                  (void) snprintf(attrs->option_rom_version,
 318  314                      FCHBA_OPTION_ROM_VERSION_LEN, "%s",
 319  315                      (rval == DDI_PROP_SUCCESS ? fcode_ver_buf :
 320  316                      "No boot image detected"));
 321  317  
 322  318                  if (fcode_ver_buf != NULL) {
 323  319                          kmem_free(fcode_ver_buf, (size_t)i);
 324  320                  }
 325  321  
 326  322          }
 327  323  
 328  324          attrs->vendor_specific_id = ha->adapter_features;
 329      -        attrs->max_frame_size = CFG_IST(ha, CFG_CTRL_24258081) ?
 330      -            (ha->init_ctrl_blk.cb24.max_frame_length[1] << 8 |
 331      -            ha->init_ctrl_blk.cb24.max_frame_length[0]) :
 332      -            (ha->init_ctrl_blk.cb.max_frame_length[1] << 8 |
 333      -            ha->init_ctrl_blk.cb.max_frame_length[0]);
      325 +        attrs->max_frame_size = ha->loginparams.common_service.rx_bufsize;
 334  326          attrs->supported_cos = 0x10000000; /* Class 3 only */
 335  327  
 336  328          switch (chip & 0xFF00) {
      329 +        case 0x2000:
      330 +                attrs->supported_speed = chip == 0x2071 ?
      331 +                    FC_HBA_PORTSPEED_32GBIT : FC_HBA_PORTSPEED_16GBIT;
      332 +                break;
 337  333          case 0x2200:
 338      -                attrs->supported_speed = FC_HBA_PORTSPEED_1GBIT;
      334 +                attrs->supported_speed = chip == 0x2261 ?
      335 +                    FC_HBA_PORTSPEED_16GBIT : FC_HBA_PORTSPEED_1GBIT;
 339  336                  break;
 340  337          case 0x2300:
 341  338                  attrs->supported_speed = FC_HBA_PORTSPEED_2GBIT |
 342  339                      FC_HBA_PORTSPEED_1GBIT;
 343  340                  break;
 344  341          case 0x2400:
 345  342          case 0x8400:
 346  343                  attrs->supported_speed = FC_HBA_PORTSPEED_4GBIT |
 347  344                      FC_HBA_PORTSPEED_2GBIT | FC_HBA_PORTSPEED_1GBIT;
 348  345                  break;
↓ open down ↓ 132 lines elided ↑ open up ↑
 481  478          vlen = (strlen(utsname.nodename) > FCHBA_SYMB_NAME_LEN ?
 482  479              FCHBA_SYMB_NAME_LEN : strlen(utsname.nodename));
 483  480          (void) snprintf((int8_t *)attrs->sym_node_name, vlen, "%s",
 484  481              utsname.nodename);
 485  482  
 486  483          vlen = (strlen(QL_NAME) + 9 > FCHBA_SYMB_NAME_LEN ?
 487  484              FCHBA_SYMB_NAME_LEN : strlen(QL_NAME) + 9);
 488  485          (void) snprintf((int8_t *)attrs->sym_port_name, vlen,
 489  486              "%s(%d,%d)", QL_NAME, ha->instance, ha->vp_index);
 490  487  
 491      -        QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
      488 +        QL_PRINT_3(ha, "done\n");
 492  489  }
 493  490  
 494  491  /*
 495  492   * ql_setup_fruinfo
 496  493   *      Generates common id's for instances on the same
 497  494   *      physical HBA.
 498  495   *
 499  496   * Input:
 500  497   *      ha =  adapter state structure
 501  498   *
 502  499   * Returns:
 503  500   *
 504  501   * Context:
 505  502   *      Kernel context.
 506  503   */
 507  504  void
 508  505  ql_setup_fruinfo(ql_adapter_state_t *ha)
 509  506  {
 510      -        uint32_t                mybasedev_len;
      507 +        uint32_t                mybasedev_len;
 511  508          ql_adapter_state_t      *base_ha = NULL;
 512  509  
 513      -        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
      510 +        QL_PRINT_3(ha, "started\n");
 514  511  
 515  512          /*
 516  513           * To generate common id for instances residing on the
 517  514           * the same HBA, the devpath for each instance is parsed
 518  515           * and those instances which have matching base devpaths are
 519  516           * given same hba_index, and each port on the same hba are
 520  517           * then assigned unique port_indexs based on the devpath.
 521  518           */
 522  519  
 523  520          /*
 524  521           * Get this ha's basedev path and its port index
 525  522           */
 526  523          if (ql_get_basedev_len(ha, &mybasedev_len, &ha->fru_port_index) == 0) {
 527  524  
 528      -                GLOBAL_STATE_LOCK();
 529      -
 530  525                  /*
 531  526                   * Search for this basedev against all of the
 532  527                   * ha in the ql_hba global list. If found one
 533  528                   * then we are part of other adapter in the
 534  529                   * ql_hba list and hence use that ha's hba_index.
 535  530                   * If not create a new one from the global hba index.
 536  531                   */
 537  532                  base_ha = ql_search_basedev(ha, mybasedev_len);
 538  533                  if (base_ha != NULL && base_ha->fru_hba_index != 0) {
 539  534                          ha->fru_hba_index = base_ha->fru_hba_index;
      535 +                        ha->fru_port_index = base_ha->fru_port_index + 1;
 540  536                  } else {
 541  537                          ha->fru_hba_index = ql_gfru_hba_index++;
      538 +                        ha->fru_port_index = 0;
 542  539                  }
 543      -
 544      -                if (CFG_IST(ha, CFG_CTRL_8081)) {
 545      -                        /*
 546      -                         * The FC functions on 81xx hbas are functions 2 and 3
 547      -                         * while the Nic functions occupy 0 and 1.  Adjust
 548      -                         * fru port index to be like previous FCAs.
 549      -                         */
 550      -                        ha->fru_port_index = ha->flags & FUNCTION_1 ? 1 : 0;
 551      -                }
 552      -
 553      -                GLOBAL_STATE_UNLOCK();
 554      -
 555  540          } else {
 556  541                  ha->fru_hba_index = 0;
 557  542                  ha->fru_port_index = 0;
 558  543          }
 559  544  
 560      -        QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
      545 +        QL_PRINT_3(ha, "done\n");
 561  546  }
 562  547  
 563  548  /*
 564  549   *  ql_get_basedev_len
 565  550   *
 566  551   *      Gets the length of the base device name in the
 567  552   *      devpath of the current instance.
 568  553   *
 569  554   * Input:
 570  555   *      ha              - adapter state pointer.
↓ open down ↓ 9 lines elided ↑ open up ↑
 580  565   *      Kernel context.
 581  566   */
 582  567  static uint32_t
 583  568  ql_get_basedev_len(ql_adapter_state_t *ha, uint32_t *basedev_len,
 584  569      uint32_t *port_index)
 585  570  {
 586  571          int32_t         dev_off;
 587  572          int32_t         port_off;
 588  573          int8_t          *devstr;
 589  574  
 590      -        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
      575 +        QL_PRINT_3(ha, "started\n");
 591  576  
 592  577          if (ha->devpath == NULL) {
 593  578                  return ((uint32_t)-1);
 594  579          }
 595  580  
 596  581          dev_off = (int32_t)(strlen(ha->devpath) - 1);
 597  582          port_off = -1;
 598  583  
 599  584          /* Until we reach the first char or a '@' char in the path */
 600  585          while ((dev_off >= 0) && (ha->devpath[dev_off] != '@')) {
↓ open down ↓ 20 lines elided ↑ open up ↑
 621  606                  *port_index = stoi(&devstr);
 622  607                  if (*port_index == 0) {
 623  608                          EL(ha, "Invalid device path '%s'. Cannot get "
 624  609                              "port_index\n", ha->devpath);
 625  610                          return ((uint32_t)-1);
 626  611                  }
 627  612  
 628  613                  *basedev_len = (uint32_t)(port_off - 1);
 629  614          }
 630  615  
 631      -        QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
      616 +        QL_PRINT_3(ha, "done\n");
 632  617  
 633  618          return (0);
 634  619  }
 635  620  
 636  621  /*
 637  622   * ql_search_basedev
 638  623   *      Searches the list of ha instances to find which
 639  624   *      ha instance has same base device path as input's.
 640  625   *
 641  626   * Input:
↓ open down ↓ 8 lines elided ↑ open up ↑
 650  635   * Context:
 651  636   *      Kernel context.
 652  637   */
 653  638  static ql_adapter_state_t *
 654  639  ql_search_basedev(ql_adapter_state_t *myha, uint32_t mybasedev_len)
 655  640  {
 656  641          ql_link_t               *link;
 657  642          ql_adapter_state_t      *ha;
 658  643          uint32_t                basedev_len, port_index;
 659  644  
 660      -        QL_PRINT_3(CE_CONT, "(%d): started\n", myha->instance);
      645 +        QL_PRINT_3(myha, "started\n", myha->instance);
 661  646  
 662  647          for (link = ql_hba.first; link != NULL; link = link->next) {
 663  648  
 664  649                  ha = link->base_address;
 665  650  
 666  651                  if (ha == NULL) {
 667  652                          EL(myha, "null ha link detected!\n");
 668  653                          return (NULL);
 669  654                  }
 670  655  
↓ open down ↓ 15 lines elided ↑ open up ↑
 686  671  
 687  672                  /*
 688  673                   * If both the basedev len do not match, then it
 689  674                   * is obvious that both are not pointing to the
 690  675                   * same base device.
 691  676                   */
 692  677                  if ((basedev_len == mybasedev_len) && (strncmp(myha->devpath,
 693  678                      ha->devpath, basedev_len) == 0)) {
 694  679  
 695  680                          /* We found the ha with same basedev */
 696      -                        QL_PRINT_3(CE_CONT, "(%d): found, done\n",
      681 +                        QL_PRINT_3(myha, "found, done\n",
 697  682                              myha->instance);
 698  683                          return (ha);
 699  684                  }
 700  685          }
 701  686  
 702      -        QL_PRINT_3(CE_CONT, "(%d): not found, done\n", myha->instance);
      687 +        QL_PRINT_3(myha, "not found, done\n", myha->instance);
 703  688  
 704  689          return (NULL);
 705  690  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX