Print this page
3500 Support LSI SAS2008 (Falcon) Skinny FW for mr_sas(7D)

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/mr_sas/mr_sas_tbolt.c
          +++ new/usr/src/uts/common/io/mr_sas/mr_sas_tbolt.c
↓ open down ↓ 7 lines elided ↑ open up ↑
   8    8   *
   9    9   * Version:
  10   10   * Author:
  11   11   *              Swaminathan K S
  12   12   *              Arun Chandrashekhar
  13   13   *              Manju R
  14   14   *              Rasheed
  15   15   *              Shakeel Bukhari
  16   16   */
  17   17  
       18 +/*
       19 + * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
       20 + */
  18   21  
       22 +
  19   23  #include <sys/types.h>
  20   24  #include <sys/file.h>
  21   25  #include <sys/atomic.h>
  22   26  #include <sys/scsi/scsi.h>
  23   27  #include <sys/byteorder.h>
  24   28  #include "ld_pd_map.h"
  25   29  #include "mr_sas.h"
  26   30  #include "fusion.h"
  27   31  
  28   32  /*
↓ open down ↓ 10 lines elided ↑ open up ↑
  39   43  MR_LD_RAID *MR_LdRaidGet(U32 ld, MR_FW_RAID_MAP_ALL *map);
  40   44  U16 MR_TargetIdToLdGet(U32 ldTgtId, MR_FW_RAID_MAP_ALL *map);
  41   45  U16 MR_GetLDTgtId(U32 ld, MR_FW_RAID_MAP_ALL *map);
  42   46  U16 get_updated_dev_handle(PLD_LOAD_BALANCE_INFO, struct IO_REQUEST_INFO *);
  43   47  extern ddi_dma_attr_t mrsas_generic_dma_attr;
  44   48  extern uint32_t mrsas_tbolt_max_cap_maxxfer;
  45   49  extern struct ddi_device_acc_attr endian_attr;
  46   50  extern int      debug_level_g;
  47   51  extern unsigned int     enable_fp;
  48   52  volatile int dump_io_wait_time = 90;
  49      -extern void
  50      -io_timeout_checker(void *arg);
  51   53  extern volatile int  debug_timeout_g;
  52   54  extern int      mrsas_issue_pending_cmds(struct mrsas_instance *);
  53   55  extern int mrsas_complete_pending_cmds(struct mrsas_instance *instance);
  54   56  extern void     push_pending_mfi_pkt(struct mrsas_instance *,
  55   57                          struct mrsas_cmd *);
  56   58  extern U8 MR_BuildRaidContext(struct mrsas_instance *, struct IO_REQUEST_INFO *,
  57   59              MPI2_SCSI_IO_VENDOR_UNIQUE *, MR_FW_RAID_MAP_ALL *);
  58   60  
  59   61  /* Local static prototypes. */
  60   62  static struct mrsas_cmd *mrsas_tbolt_build_cmd(struct mrsas_instance *,
↓ open down ↓ 1814 lines elided ↑ open up ↑
1875 1877                              acmd->cmd_cdblen));
1876 1878                  }
1877 1879                          break;
1878 1880                  }
1879 1881  
1880 1882          }
1881 1883  
1882 1884          return (cmd);
1883 1885  }
1884 1886  
1885      -/*
1886      - * mrsas_tbolt_tran_init_pkt - allocate & initialize a scsi_pkt structure
1887      - * @ap:
1888      - * @pkt:
1889      - * @bp:
1890      - * @cmdlen:
1891      - * @statuslen:
1892      - * @tgtlen:
1893      - * @flags:
1894      - * @callback:
1895      - *
1896      - * The tran_init_pkt() entry point allocates and initializes a scsi_pkt
1897      - * structure and DMA resources for a target driver request. The
1898      - * tran_init_pkt() entry point is called when the target driver calls the
1899      - * SCSA function scsi_init_pkt(). Each call of the tran_init_pkt() entry point
1900      - * is a request to perform one or more of three possible services:
1901      - *  - allocation and initialization of a scsi_pkt structure
1902      - *  - allocation of DMA resources for data transfer
1903      - *  - reallocation of DMA resources for the next portion of the data transfer
1904      - */
1905      -struct scsi_pkt *
1906      -mrsas_tbolt_tran_init_pkt(struct scsi_address *ap,
1907      -        register struct scsi_pkt *pkt,
1908      -        struct buf *bp, int cmdlen, int statuslen, int tgtlen,
1909      -        int flags, int (*callback)(), caddr_t arg)
1910      -{
1911      -        struct scsa_cmd *acmd;
1912      -        struct mrsas_instance   *instance;
1913      -        struct scsi_pkt *new_pkt;
1914      -
1915      -        instance = ADDR2MR(ap);
1916      -
1917      -        /* step #1 : pkt allocation */
1918      -        if (pkt == NULL) {
1919      -                pkt = scsi_hba_pkt_alloc(instance->dip, ap, cmdlen, statuslen,
1920      -                    tgtlen, sizeof (struct scsa_cmd), callback, arg);
1921      -                if (pkt == NULL) {
1922      -                        return (NULL);
1923      -                }
1924      -
1925      -                acmd = PKT2CMD(pkt);
1926      -
1927      -                /*
1928      -                 * Initialize the new pkt - we redundantly initialize
1929      -                 * all the fields for illustrative purposes.
1930      -                 */
1931      -                acmd->cmd_pkt           = pkt;
1932      -                acmd->cmd_flags         = 0;
1933      -                acmd->cmd_scblen        = statuslen;
1934      -                acmd->cmd_cdblen        = cmdlen;
1935      -                acmd->cmd_dmahandle     = NULL;
1936      -                acmd->cmd_ncookies      = 0;
1937      -                acmd->cmd_cookie        = 0;
1938      -                acmd->cmd_cookiecnt     = 0;
1939      -                acmd->cmd_nwin          = 0;
1940      -
1941      -                pkt->pkt_address        = *ap;
1942      -                pkt->pkt_comp           = (void (*)())NULL;
1943      -                pkt->pkt_flags          = 0;
1944      -                pkt->pkt_time           = 0;
1945      -                pkt->pkt_resid          = 0;
1946      -                pkt->pkt_state          = 0;
1947      -                pkt->pkt_statistics     = 0;
1948      -                pkt->pkt_reason         = 0;
1949      -                new_pkt                 = pkt;
1950      -        } else {
1951      -                acmd = PKT2CMD(pkt);
1952      -                new_pkt = NULL;
1953      -        }
1954      -
1955      -        /* step #2 : dma allocation/move */
1956      -        if (bp && bp->b_bcount != 0) {
1957      -                if (acmd->cmd_dmahandle == NULL) {
1958      -                        if (mrsas_dma_alloc(instance, pkt, bp, flags,
1959      -                            callback) == DDI_FAILURE) {
1960      -                                if (new_pkt) {
1961      -                                        scsi_hba_pkt_free(ap, new_pkt);
1962      -                                }
1963      -                                return ((struct scsi_pkt *)NULL);
1964      -                        }
1965      -                } else {
1966      -                        if (mrsas_dma_move(instance, pkt, bp) == DDI_FAILURE) {
1967      -                                return ((struct scsi_pkt *)NULL);
1968      -                        }
1969      -                }
1970      -        }
1971      -        return (pkt);
1972      -}
1973      -
1974      -
1975 1887  uint32_t
1976 1888  tbolt_read_fw_status_reg(struct mrsas_instance *instance)
1977 1889  {
1978 1890          return ((uint32_t)RD_OB_SCRATCH_PAD_0(instance));
1979 1891  }
1980 1892  
1981 1893  void
1982 1894  tbolt_issue_cmd(struct mrsas_cmd *cmd, struct mrsas_instance *instance)
1983 1895  {
1984 1896          MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc = cmd->request_desc;
↓ open down ↓ 1640 lines elided ↑ open up ↑
3625 3537  
3626 3538          return_raid_msg_mfi_pkt(instance, cmd);
3627 3539  
3628 3540          atomic_add_16(&instance->fw_outstanding, (-1));
3629 3541  
3630 3542          return (ret);
3631 3543  }
3632 3544  
3633 3545  
3634 3546  #ifdef PDSUPPORT
     3547 +/*
     3548 + * Even though these functions were originally intended for 2208 only, it
     3549 + * turns out they're useful for "Skinny" support as well.  In a perfect world,
     3550 + * these two functions would be either in mr_sas.c, or in their own new source
     3551 + * file.  Since this driver needs some cleanup anyway, keep this portion in
     3552 + * mind as well.
     3553 + */
     3554 +
3635 3555  int
3636 3556  mrsas_tbolt_config_pd(struct mrsas_instance *instance, uint16_t tgt,
3637 3557      uint8_t lun, dev_info_t **ldip)
3638 3558  {
3639 3559          struct scsi_device *sd;
3640 3560          dev_info_t *child;
3641 3561          int rval, dtype;
3642 3562          struct mrsas_tbolt_pd_info *pds = NULL;
3643 3563  
3644 3564          con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_config_pd: t = %d l = %d",
↓ open down ↓ 42 lines elided ↑ open up ↑
3687 3607                              "scsi_hba_probe Failed: tgt %d dtype %d: %s",
3688 3608                              tgt, dtype, sd->sd_inq->inq_vid));
3689 3609                  }
3690 3610  
3691 3611                  /* sd_unprobe is blank now. Free buffer manually */
3692 3612                  if (sd->sd_inq) {
3693 3613                          kmem_free(sd->sd_inq, SUN_INQSIZE);
3694 3614                          sd->sd_inq = (struct scsi_inquiry *)NULL;
3695 3615                  }
3696 3616                  kmem_free(sd, sizeof (struct scsi_device));
3697      -                rval = NDI_SUCCESS;
3698 3617          } else {
3699 3618                  con_log(CL_ANN1, (CE_NOTE,
3700 3619                      "Device not supported: tgt %d lun %d dtype %d",
3701 3620                      tgt, lun, dtype));
3702 3621                  rval = NDI_FAILURE;
3703 3622          }
3704 3623  
3705 3624          kmem_free(pds, sizeof (struct mrsas_tbolt_pd_info));
3706 3625          con_log(CL_ANN1, (CE_NOTE, "mrsas_config_pd: return rval = %d",
3707 3626              rval));
↓ open down ↓ 1 lines elided ↑ open up ↑
3709 3628  }
3710 3629  
3711 3630  static void
3712 3631  mrsas_tbolt_get_pd_info(struct mrsas_instance *instance,
3713 3632      struct mrsas_tbolt_pd_info *pds, int tgt)
3714 3633  {
3715 3634          struct mrsas_cmd        *cmd;
3716 3635          struct mrsas_dcmd_frame *dcmd;
3717 3636          dma_obj_t               dcmd_dma_obj;
3718 3637  
3719      -        cmd = get_raid_msg_pkt(instance);
     3638 +        ASSERT(instance->tbolt || instance->skinny);
3720 3639  
     3640 +        if (instance->tbolt)
     3641 +                cmd = get_raid_msg_pkt(instance);
     3642 +        else
     3643 +                cmd = mrsas_get_mfi_pkt(instance);
     3644 +
3721 3645          if (!cmd) {
3722 3646                  con_log(CL_ANN1,
3723 3647                      (CE_WARN, "Failed to get a cmd for get pd info"));
3724 3648                  return;
3725 3649          }
3726 3650  
3727 3651          /* Clear the frame buffer and assign back the context id */
3728 3652          bzero((char *)&cmd->frame[0], sizeof (union mrsas_frame));
3729 3653          ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
3730 3654              cmd->index);
↓ open down ↓ 23 lines elided ↑ open up ↑
3754 3678              MR_DCMD_PD_GET_INFO);
3755 3679          ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->mbox.w[0], tgt);
3756 3680          ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].length,
3757 3681              sizeof (struct mrsas_tbolt_pd_info));
3758 3682          ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].phys_addr,
3759 3683              dcmd_dma_obj.dma_cookie[0].dmac_address);
3760 3684  
3761 3685          cmd->sync_cmd = MRSAS_TRUE;
3762 3686          cmd->frame_count = 1;
3763 3687  
3764      -        if (instance->tbolt) {
     3688 +        if (instance->tbolt)
3765 3689                  mr_sas_tbolt_build_mfi_cmd(instance, cmd);
3766      -        }
3767 3690  
3768 3691          instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd);
3769 3692  
3770 3693          ddi_rep_get8(cmd->frame_dma_obj.acc_handle, (uint8_t *)pds,
3771 3694              (uint8_t *)dcmd_dma_obj.buffer, sizeof (struct mrsas_tbolt_pd_info),
3772 3695              DDI_DEV_AUTOINCR);
3773 3696          (void) mrsas_free_dma_obj(instance, dcmd_dma_obj);
3774      -        return_raid_msg_pkt(instance, cmd);
     3697 +
     3698 +        if (instance->tbolt)
     3699 +                return_raid_msg_pkt(instance, cmd);
     3700 +        else
     3701 +                mrsas_return_mfi_pkt(instance, cmd);
3775 3702  }
3776 3703  #endif
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX